diff --git a/readme.md b/readme.md index d944926..c7b81b4 100644 --- a/readme.md +++ b/readme.md @@ -20,7 +20,7 @@ OnoSW is the software framework for [OPSORO](http://www.opsoro.be/), to be used 5. Install Python development files, Avahi daemon, LuaJIT ``` - sudo apt-get install python2.7-dev avahi-daemon libluajit-5.1-dev + sudo apt-get install python2.7-dev avahi-daemon libluajit-5.1-dev git ``` 6. Install PIP @@ -41,7 +41,7 @@ OnoSW is the software framework for [OPSORO](http://www.opsoro.be/), to be used 8. Install Python packages (flask, flask-login, pyyaml, pluginbase, sockjs-tornado, simplejson, lupa, numpy, scipy, spidev) ``` - sudo pip install flask flask-login pyyaml pluginbase sockjs-tornado simplejson lupa numpy spidev + sudo pip install flask flask-login pyyaml pluginbase sockjs-tornado simplejson lupa numpy spidev gitpython flask-babel noise pyserial enum enum34 requests tweepy sudo apt-get install -y python-smbus i2c-tools sudo apt-get install -y python-scipy ``` diff --git a/run b/run old mode 100644 new mode 100755 index e0f8ffb..2591a1c --- a/run +++ b/run @@ -3,70 +3,9 @@ import os import sys -import os.path -import shutil -import stat -import subprocess - -from git import Git, Repo - basedir = os.path.dirname(os.path.realpath(__file__)) - # insert opsoro src system path to enable calling opsoro classes sys.path.insert(0, os.path.join(basedir, "src")) -# ---------------------------------------------------------------------- -# UPDATER -# ---------------------------------------------------------------------- -git_dir = os.path.abspath(basedir) + '/' -backup_dir = '/home/pi/OPSORO/backup/' - -# Check if update is needed -if os.path.isfile(os.path.join(basedir, 'update.var')): - print('Updating...') - if os.path.exists(backup_dir): - # remove previous backup - try: - shutil.rmtree(backup_dir) - except Exception as e: - print('Remove backup failed: ', str(e)) - pass - - try: - shutil.copytree(basedir, backup_dir) - except Exception as e: - print('Backup copy failed: ', str(e)) - pass - - # Link git & update - try: - g = Git(git_dir) - g.fetch('--all') - g.reset('--hard', 'origin/' + g.branch().split()[-1]) - # g.pull() - except Exception as e: - print('Git failed to update: ', str(e)) - pass - - # Set script executable for deamon - try: - st = os.stat(os.path.join(basedir, 'run')) - os.chmod( - os.path.join(basedir, 'run'), st.st_mode | stat.S_IXUSR | - stat.S_IXGRP | stat.S_IXOTH) - except Exception as e: - print('Exec state set failed: ', str(e)) - pass - - # Clear update var file - os.remove(os.path.join(basedir, 'update.var')) - - # restart service - command = ['/usr/sbin/service', 'opsoro', 'restart'] - #shell=FALSE for sudo to work. - subprocess.call(command, shell=False) - -# ---------------------------------------------------------------------- - import opsoro opsoro.main() diff --git a/scripts/opsoro b/scripts/opsoro old mode 100644 new mode 100755 diff --git a/scripts/setup_opsoro b/scripts/setup_opsoro old mode 100644 new mode 100755 diff --git a/src/opsoro/__init__.py b/src/opsoro/__init__.py index 9ebc8b8..32b7be8 100644 --- a/src/opsoro/__init__.py +++ b/src/opsoro/__init__.py @@ -1,15 +1,13 @@ #!/usr/bin/env python -import signal -import sys +import datetime import logging import logging.handlers -import random import os -import tornado.log -import datetime +import signal +import sys -# from opsoro.server import Server +import tornado.log from opsoro.console_msg import * from opsoro.server import Server @@ -17,38 +15,39 @@ # Handle SIGTERM for graceful shutdown of daemon def sigterm_handler(_signo, _stack_frame): - print "SIGTERM received... Goodbye!" - sys.exit(0) + print "SIGTERM received... Goodbye!" + sys.exit(0) try: - LOG_FILE_DIR = '../../../log/' - if not os.path.exists(LOG_FILE_DIR): - os.makedirs(LOG_FILE_DIR) - - # Setup logging - LOG_FILENAME = LOG_FILE_DIR + str(datetime.date.today()) + ".log" - LOG_LEVEL = logging.DEBUG - - tornado.log.enable_pretty_logging() - logger = logging.getLogger() - logger.setLevel(LOG_LEVEL) - handler = logging.handlers.TimedRotatingFileHandler( - LOG_FILENAME, when="midnight", backupCount=3) - formatter = logging.Formatter("%(asctime)s %(levelname)-8s %(message)s") - handler.setFormatter(formatter) - logger.addHandler(handler) + LOG_FILE_DIR = '../../../log/' + if not os.path.exists(LOG_FILE_DIR): + os.makedirs(LOG_FILE_DIR) + + # Setup logging + LOG_FILENAME = LOG_FILE_DIR + str(datetime.date.today()) + ".log" + LOG_LEVEL = logging.DEBUG + + tornado.log.enable_pretty_logging() + logger = logging.getLogger() + logger.setLevel(LOG_LEVEL) + handler = logging.handlers.TimedRotatingFileHandler( + LOG_FILENAME, when="midnight", backupCount=3) + formatter = logging.Formatter("%(asctime)s %(levelname)-8s %(message)s") + handler.setFormatter(formatter) + logger.addHandler(handler) except Exception as e: - print_error('Unable to log') + print_error('Unable to log') def main(): - signal.signal(signal.SIGTERM, sigterm_handler) - print_info("OPSORO OS started...") - app = Server() - app.run() + signal.signal(signal.SIGTERM, sigterm_handler) + print_info("OPSORO OS started...") + app = Server() + app.run() + # Initialization if __name__ == "__main__": - main() + main() diff --git a/src/opsoro/apps/__init__.py b/src/opsoro/apps/__init__.py index e69de29..1bb0449 100644 --- a/src/opsoro/apps/__init__.py +++ b/src/opsoro/apps/__init__.py @@ -0,0 +1,230 @@ +import os +from functools import partial, wraps + +import pluginbase +import yaml +from flask import Blueprint, flash + +from opsoro.console_msg import * +from opsoro.robot import Robot +from opsoro.users import Users + +try: + from yaml import CLoader as Loader +except ImportError: + from yaml import Loader + + +def constrain(n, minn, maxn): return max(min(maxn, n), minn) + + +get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) + + +class _Apps(object): + def __init__(self): + """ + Apps class. + + """ + + # Setup app system + self.plugin_base = pluginbase.PluginBase(package='opsoro.apps') + self.plugin_source = self.plugin_base.make_plugin_source(searchpath=[get_path('.')]) + + self.apps = {} + self.active_apps = [] + self.background_apps = [] + + # Make sure apps are only registered during setup + self.apps_can_register_bp = True + self.current_bp_app = "" # Keep track of current app for blueprint setup + + Users.app_change_handler = self.refresh_active + + # Socket callback dicts + # self.sockjs_connect_cb = {} + # self.sockjs_disconnect_cb = {} + + def start(self, appname): + if appname in self.active_apps: + # already activated + if not self.apps[appname].config['multi_user']: + flash("This app can only be opened once, and is running elsewhere.") + return False + elif appname in self.background_apps: + self.background_apps.remove(appname) + self.active_apps.append(appname) + else: + if appname in self.apps: + # robot activation: + if self.apps[appname].config['activation'] >= Robot.Activation.AUTO: + if self.apps[appname].config['activation'] == Robot.Activation.AUTO_NOT_ALIVE: + Robot.start(False) + else: + Robot.start() + + self.active_apps.append(appname) + + try: + print_appstarted(appname) + self.apps[appname].start(self) + except AttributeError: + print_info("%s has no start function" % appname) + + else: + return False + + running_apps = [] + running_apps.extend(self.active_apps) + running_apps.extend(self.background_apps) + + return True + + def stop(self, appname): + app_count = 0 + for sock in Users.sockets: + if sock.activeapp == appname: + app_count += 1 + + if app_count > 1: + return + + if appname in self.active_apps: + print_appstopped(appname) + try: + self.apps[appname].stop(self) + except AttributeError: + print_info("%s has no stop function" % appname) + self.active_apps.remove(appname) + + if len(self.active_apps) < 1: + Robot.stop() + + def refresh_active(self): + act_apps = [] + locked_apps = [] + for sock in Users.sockets: + if sock.activeapp in self.apps: + act_apps.append(sock.activeapp) + + for app in self.active_apps: + if app not in act_apps: + if not self.apps[app].config['allowed_background']: + self.stop(app) + else: + self.background_apps.append(app) + self.active_apps.remove(app) + else: + if not self.apps[app].config['multi_user']: + locked_apps.append(app) + + running_apps = [] + running_apps.extend(self.active_apps) + running_apps.extend(self.background_apps) + Users.broadcast_data('apps', {'active': running_apps, 'locked': locked_apps}) + + def stop_all(self): + for appname in self.active_apps: + print_appstopped(appname) + try: + self.apps[appname].stop(self) + except AttributeError: + print_info("%s has no stop function" % appname) + + self.active_apps = [] + + if len(self.active_apps) < 1: + Robot.stop() + + def register_app_blueprint(self, bp): + assert self.apps_can_register_bp, "Apps can only register blueprints at setup!" + + prefix = "/apps/" + self.current_bp_app + self.server.flaskapp.register_blueprint(bp, url_prefix=prefix) + + def app_view(self, f): + return self.server.app_view(f) + + def app_api(self, f): + return self.server.app_api(f) + + def render_template(self, template, **kwargs): + return self.server.render_template(template, **kwargs) + + def app_socket_connected(self, f): + # appname = f.__module__.split(".")[-1] + # self.sockjs_connect_cb[appname] = f + return f + + def app_socket_disconnected(self, f): + # appname = f.__module__.split(".")[-1] + # self.sockjs_disconnect_cb[appname] = f + return f + + def app_socket_message(self, action=""): + def inner(f): + appname = f.__module__.split(".")[-1] + # Create new dict for app if necessary + if appname not in Users.sockjs_message_cb: + Users.sockjs_message_cb[appname] = {} + Users.sockjs_message_cb[appname][action] = f + return f + return inner + + def register_apps(self, server): + self.server = server + apps_layout = [] + with open(get_path('../config/apps_layout.yaml')) as f: + apps_layout = yaml.load(f, Loader=Loader) + + for plugin_name in self.plugin_source.list_plugins(): + self.current_bp_app = plugin_name + plugin = self.plugin_source.load_plugin(plugin_name) + print_apploaded(plugin_name) + + default_config = {'full_name': 'No name', + 'formatted_name': 'No_name', + 'author': 'OPSORO', + 'icon': 'fa-warning', + 'color': '#333', + 'difficulty': 0, + 'tags': [''], + 'allowed_background': False, + 'multi_user': False, + 'connection': Robot.Connection.OFFLINE, + 'activation': Robot.Activation.MANUAL} + + if not hasattr(plugin, "config"): + plugin.config = default_config + + for item in default_config: + if item not in plugin.config: + plugin.config[item] = default_config[item] + + # Add categories for apps-layout + plugin.config['categories'] = [] + plugin.config['category_index'] = [] + for cat in apps_layout: + if plugin.config['formatted_name'] in cat['apps']: + plugin.config['categories'].append(cat['title']) + plugin.config['category_index'].append(cat['apps'].index(plugin.config['formatted_name'])) + + self.apps[plugin_name] = plugin + try: + plugin.setup(self) + except AttributeError: + print_info("%s has no setup function" % plugin_name) + + try: + plugin.setup_pages(self) + except AttributeError as e: + print(e) + print_info("%s has no setup_pages function" % plugin_name) + + self.current_bp_app = "" + self.apps_can_register_bp = False + return self.apps + + +Apps = _Apps() diff --git a/src/opsoro/apps/app_template/__init__.py b/src/opsoro/apps/app_template/__init__.py index 474ad5f..9339ae5 100644 --- a/src/opsoro/apps/app_template/__init__.py +++ b/src/opsoro/apps/app_template/__init__.py @@ -1,73 +1,76 @@ from __future__ import with_statement -from flask import Blueprint, render_template, request, redirect, url_for, flash, send_from_directory +import os +from functools import partial + +from flask import (Blueprint, flash, redirect, render_template, request, + send_from_directory, url_for) from opsoro.console_msg import * +from opsoro.expression import Expression from opsoro.hardware import Hardware from opsoro.robot import Robot -from opsoro.expression import Expression # from opsoro.stoppable_thread import StoppableThread from opsoro.sound import Sound -from functools import partial -import os -constrain = lambda n, minn, maxn: max(min(maxn, n), minn) +def constrain(n, minn, maxn): return max(min(maxn, n), minn) + + get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) -config = {'full_name': 'App Template', - 'icon': 'fa-info', - 'color': '#15e678', - 'allowed_background': False, - 'robot_state': 0} +config = { + 'full_name': 'App Template', + 'author': 'OPSORO', + 'icon': 'fa-info', + 'color': 'green', + 'difficulty': 1, + 'tags': ['template', 'developer'], + 'allowed_background': False, + 'multi_user': False, + 'connection': Robot.Connection.OFFLINE, + 'activation': Robot.Activation.AUTO +} config['formatted_name'] = config['full_name'].lower().replace(' ', '_') -# robot_state: -# 0: Manual start/stop -# 1: Start robot automatically (alive feature according to preferences) -# 2: Start robot automatically and enable alive feature -# 3: Start robot automatically and disable alive feature +def setup_pages(apps): + app_bp = Blueprint(config['formatted_name'], __name__, template_folder='templates', static_folder='static') + # Public function declarations + app_bp.add_url_rule('/demo', 'demo', apps.app_api(demo), methods=['GET', 'POST']) -def setup_pages(opsoroapp): - app_bp = Blueprint( - config['formatted_name'], - __name__, - template_folder='templates', - static_folder='static') - - @app_bp.route('/', methods=['GET']) - @opsoroapp.app_view + @app_bp.route('/') + @apps.app_view def index(): data = { 'actions': {}, 'data': [], } - action = request.args.get('action', None) if action != None: data['actions'][action] = request.args.get('param', None) - return opsoroapp.render_template(config['formatted_name'] + '.html', **data) + return apps.render_template(config['formatted_name'] + '.html', **data) + apps.register_app_blueprint(app_bp) + - # @app_bp.route('/demo') - # @opsoroapp.app_view - # def demo(): - # data = { - # } - # - # return opsoroapp.render_template('app.html', **data) +def demo(): + # publicly accessible function + if 1 > 0: + return {'status': 'success'} + else: + return {'status': 'error', 'message': 'This is a demo error!'} - opsoroapp.register_app_blueprint(app_bp) +# Default functions for setting up, starting and stopping an app -def setup(opsoroapp): +def setup(server): pass -def start(opsoroapp): +def start(server): pass -def stop(opsoroapp): +def stop(server): pass diff --git a/src/opsoro/apps/app_template/static/app.js b/src/opsoro/apps/app_template/static/app.js index 3fb2b19..a82e6f5 100644 --- a/src/opsoro/apps/app_template/static/app.js +++ b/src/opsoro/apps/app_template/static/app.js @@ -33,19 +33,18 @@ $(document).ready(function() { // Popup window self.popupTextInput = ko.observable("Hi! This text can be changed. Click on the button to change me!"); self.showPopup = function() { - $("#popup_window").foundation("reveal", "open"); + $("#popup_window").foundation('open'); }; self.closePopup = function() { - $("#popup_window").foundation("reveal", "close"); + $("#popup_window").foundation('close'); }; self.popupButtonHandler = function() { self.closePopup(); }; - self.init = function() { + self.newFileData = function() { // Clear data, new file, ... - self.fileName("Untitled"); self.unlockFile(); self.fileIsModified(false); }; @@ -78,5 +77,5 @@ $(document).ready(function() { model.fileIsModified(false); // Configurate toolbar handlers - //config_file_operations("", model.fileExtension(), model.saveFileData, model.loadFileData, model.init); + //config_file_operations("", model.fileExtension(), model.saveFileData, model.loadFileData, model.newFileData); }); diff --git a/src/opsoro/apps/app_template/templates/app_template.html b/src/opsoro/apps/app_template/templates/app_template.html index 55b8bc6..1821ceb 100644 --- a/src/opsoro/apps/app_template/templates/app_template.html +++ b/src/opsoro/apps/app_template/templates/app_template.html @@ -5,12 +5,11 @@ {% endblock %} {% block app_toolbar %} -

This is the toolbar, you can add/remove options.
To remove the toolbar completely, just remove the blocks: "block app_toolbar" and "endblock".

+

This is the toolbar, you can add/remove options.
To remove the toolbar completely, just remove the blocks: "block app_toolbar" and "endblock".

+ {% include "toolbar/_file_operations.html" %} + {% include "toolbar/_lock_unlock.html" %} + --> {% endblock %} @@ -55,9 +54,9 @@ {% endblock %} {% block app_modals %} - - {% include "_model.html" %} diff --git a/src/opsoro/apps/cockpit/__init__.py b/src/opsoro/apps/cockpit/__init__.py index b2b112f..2066dab 100644 --- a/src/opsoro/apps/cockpit/__init__.py +++ b/src/opsoro/apps/cockpit/__init__.py @@ -1,47 +1,32 @@ from __future__ import with_statement +from flask import Blueprint, flash, redirect, render_template, request, url_for + from opsoro.console_msg import * -from opsoro.robot import Robot from opsoro.hardware import Hardware +from opsoro.robot import Robot -from flask import Blueprint, render_template, request, redirect, url_for, flash - -constrain = lambda n, minn, maxn: max(min(maxn, n), minn) - -config = {'full_name': 'Cockpit', - 'icon': 'fa-rocket', - 'color': '#ff517e', - 'allowed_background': False, - 'robot_state': 1} -config['formatted_name'] = config['full_name'].lower().replace(' ', '_') - -# robot_state: -# 0: Manual start/stop -# 1: Start robot automatically (alive feature according to preferences) -# 2: Start robot automatically and enable alive feature -# 3: Start robot automatically and disable alive feature - -clientconn = None -# dof_positions = {} +def constrain(n, minn, maxn): return max(min(maxn, n), minn) -# import os -# import yaml -# try: -# from yaml import CLoader as Loader -# except ImportError: -# from yaml import Loader +config = { + 'full_name': 'Cockpit', + 'author': 'OPSORO', + 'icon': 'fa-rocket', + 'color': 'red', + 'difficulty': 9, + 'tags': [''], + 'allowed_background': False, + 'multi_user': False, + 'connection': Robot.Connection.OFFLINE, + 'activation': Robot.Activation.AUTO +} +config['formatted_name'] = config['full_name'].lower().replace(' ', '_') def setup_pages(opsoroapp): - app_bp = Blueprint( - config['formatted_name'], - __name__, - template_folder='templates', - static_folder='static') - - global clientconn + app_bp = Blueprint(config['formatted_name'], __name__, template_folder='templates', static_folder='static') @app_bp.route('/') @opsoroapp.app_view @@ -49,36 +34,8 @@ def index(): data = { # 'dofs': [] } - - # global dof_positions - # - # for servo in Expression.servos: - # if servo.pin >= 0 and servo.pin < 16: - # # Pin is valid, add to the page - # data['dofs'].append({ - # 'name': servo.dofname, - # 'pin': servo.pin, - # 'min': servo.min_range, - # 'mid': servo.mid_pos, - # 'max': servo.max_range, - # 'current': dof_positions[servo.dofname] - # }) - - # with open(get_path('../../config/default.conf')) as f: - # data['config'] = yaml.load(f, Loader=Loader) - return opsoroapp.render_template(config['formatted_name'] + '.html', **data) - @opsoroapp.app_socket_connected - def s_connected(conn): - global clientconn - clientconn = conn - - @opsoroapp.app_socket_disconnected - def s_disconnected(conn): - global clientconn - clientconn = None - @opsoroapp.app_socket_message('setServoPos') def s_setservopos(conn, data): pin_number = int(data.pop('pin_number', 0)) @@ -87,7 +44,7 @@ def s_setservopos(conn, data): value = constrain(value, 500, 2500) with Hardware.lock: - Hardware.servo_set(pin_number, value) + Hardware.Servo.set(pin_number, value) opsoroapp.register_app_blueprint(app_bp) diff --git a/src/opsoro/apps/cockpit/templates/cockpit.html b/src/opsoro/apps/cockpit/templates/cockpit.html index bb90e85..54ab9ea 100644 --- a/src/opsoro/apps/cockpit/templates/cockpit.html +++ b/src/opsoro/apps/cockpit/templates/cockpit.html @@ -13,7 +13,4 @@ {% block app_scripts %} - - - {% endblock %} diff --git a/src/opsoro/apps/configurator/__init__.py b/src/opsoro/apps/configurator/__init__.py deleted file mode 100644 index 51b6e53..0000000 --- a/src/opsoro/apps/configurator/__init__.py +++ /dev/null @@ -1,95 +0,0 @@ -from __future__ import with_statement - -from flask import Blueprint, render_template, request, redirect, url_for, flash, send_from_directory -from werkzeug import secure_filename - -from opsoro.console_msg import * -from opsoro.hardware import Hardware -from opsoro.robot import Robot - -from functools import partial -from exceptions import RuntimeError -import os -import glob -import shutil -import time -import yaml - -try: - from yaml import CLoader as Loader -except ImportError: - from yaml import Loader - -from flask import Blueprint, render_template, request, send_from_directory - -constrain = lambda n, minn, maxn: max(min(maxn, n), minn) - -config = {'full_name': 'Configurator', - 'icon': 'fa-pencil', - 'color': '#ff517e', - 'allowed_background': False, - 'robot_state': 0} -config['formatted_name'] = config['full_name'].lower().replace(' ', '_') - -# robot_state: -# 0: Manual start/stop -# 1: Start robot automatically (alive feature according to preferences) -# 2: Start robot automatically and enable alive feature -# 3: Start robot automatically and disable alive feature - -get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) - - -def setup_pages(opsoroapp): - app_bp = Blueprint( - config['formatted_name'], - __name__, - template_folder='templates', - static_folder='static') - - @app_bp.route('/', methods=['GET']) - @opsoroapp.app_view - def index(): - data = { - 'actions': {}, - 'data': [], - 'modules': [], - 'skins': [], - } - - # action = request.args.get('action', None) - # if action != None: - data['actions']['openfile'] = request.args.get('f', None) - - # with open(get_path('../../config/modules_configs/ono.yaml')) as f: - # data['config'] = yaml.load(f, Loader=Loader) - # - filenames = [] - - filenames.extend(glob.glob(get_path('static/images/*.svg'))) - for filename in filenames: - data['modules'].append( - os.path.splitext(os.path.split(filename)[1])[0]) - - filenames = [] - - filenames.extend(glob.glob(get_path('static/images/skins/*.svg'))) - for filename in filenames: - data['skins'].append( - os.path.splitext(os.path.split(filename)[1])[0]) - - return opsoroapp.render_template(config['formatted_name'] + '.html', **data) - - opsoroapp.register_app_blueprint(app_bp) - - -def setup(opsoroapp): - pass - - -def start(opsoroapp): - pass - - -def stop(opsoroapp): - pass diff --git a/src/opsoro/apps/configurator/static/app.css b/src/opsoro/apps/configurator/static/app.css deleted file mode 100644 index 9e4b9e3..0000000 --- a/src/opsoro/apps/configurator/static/app.css +++ /dev/null @@ -1,117 +0,0 @@ -canvas { - position: relative; - display: block; - float: left; - background-color: #555; -} -svg { - position: relative; - display: block; - float: left; - /*background-color: #555;*/ - /*border: 2px solid #555; - background: url('/static/img/grid.png') #fff; - border-radius: 10px;*/ - /*background-color: transparent; - background-image: linear-gradient(0deg, transparent 24%, rgba(50, 50, 50, .5) 25%, transparent 27%, transparent 74%, rgba(50, 50, 50, .5) 75%, transparent 77%, transparent), - linear-gradient(90deg, transparent 24%, rgba(50, 50, 50, .5) 25%, transparent 27%, transparent 74%, rgba(50, 50, 50, .5) 75%, transparent 77%, transparent); - height:100%; - background-size:50px 50px; - - border-style: solid; - border-width: 2px; - border-color: #555;*/ -} -#model_screen { - z-index: 2; - /*width: 50%;*/ -} -#model_screen svg image { - z-index: 2; - /*width: 50%;*/ -} -.config_settings { - /*position: relative; - z-index: 1; - top: 9rem; - left: 55%; - display: block;*/ - width: 50%; - padding: 0; -} -.config_settings input, -select { - position: relative; - display: block; - float: left; - width: 8rem; - margin: 0; -} -.config_settings input { - height: 2.2rem; -} -.config_settings span { - position: relative; - display: block; - float: left; - width: 4.5rem; - margin: 0; - padding-top: 0.5rem; -} -.config_settings input.checkbox { - width: 1rem; - height: 1.2rem; - margin-top: 0; -} -.config_settings .button { - width: 2rem; - height: 2rem; - margin: 0.1rem; - padding: 0; -} -.config_settings .button span { - /*padding-top: 0rem;*/ - width: 2rem; -} -.config_settings .setting { - position: relative; - /*display: block;*/ - float: left; - width: 100%; - /*height: 2.6rem;*/ - margin: 0; -} -.config_settings div { - width: 100%; - padding-left: 5%; -} -#dofs { - font-size: 0.8rem; -} -#dofs input { - font-size: 0.8rem; - height: 2rem; -} -#dofs .setting { - height: 2rem; -} -#dofs div { - font-size: 0.7rem; -} -#dofs div input { - font-size: 0.7rem; - height: 1.8rem; -} -#dofs div .setting { - height: 1.8rem; -} -#poly_screen { - position: relative; - display: block; - float: left; - margin-top: 1rem; - margin-left: -1.5rem; -} -#poly_screen circle { - cursor: ns-resize; -} diff --git a/src/opsoro/apps/configurator/static/app.js b/src/opsoro/apps/configurator/static/app.js deleted file mode 100644 index 60a8bef..0000000 --- a/src/opsoro/apps/configurator/static/app.js +++ /dev/null @@ -1,505 +0,0 @@ -// $(document).ready(function() { -// var angleSnap = 360; -// -// -// var Model = function(){ -// var self = this; -// // -// // // File operations toolbar item -// // self.fileIsLocked = ko.observable(false); -// // self.fileIsModified = ko.observable(false); -// // self.fileName = ko.observable("Untitled"); -// // self.fileStatus = ko.observable(""); -// // self.fileExtension = ko.observable(".conf"); -// // -// // self.config = undefined;//config_data; -// // self.allModules = modules_name; -// // self.allSkins = skins_name; -// // self.skin = ko.observable(self.allSkins[0]); -// // self.name = ko.observable("OPSORO robot"); -// // -// // self.isSelectedModule = ko.observable(false); -// // self.selectedModule = ko.observable(); -// // // self.selectedModule_SelectedDofIndex = ko.observable(0); -// // self.selectedModule_SelectedDof = ko.observable(); -// // -// // self.modules = ko.observableArray(); -// // -// // // create svg drawing -// // self.svg = SVG('config_screen').size('100%', '600'); -// // -// // self.modelwidth = $('#config_screen svg').width(); -// // self.modelheight = self.svg.height(); -// // self.refSize = 0; -// // -// // self.gridSize = ko.observable(20); -// // self.screenGridSize = Math.min(self.modelwidth, self.modelheight) / self.gridSize(); -// // self.snap = ko.observable(1); -// // -// // self.centerX = self.modelwidth/2; -// // self.centerY = self.modelheight/2; -// // -// // self.skin_image = undefined; -// // self.newConfig = true; -// // -// // self.clearDraw = function(){ -// // self.resetSelect(); -// // self.svg.clear(); -// // if (self.config != undefined) { -// // if (self.config.grid != undefined) { -// // self.gridSize(self.config.grid); -// // } -// // } -// // self.screenGridSize = Math.min(self.modelwidth, self.modelheight) / self.gridSize(); -// // var pattern = self.svg.pattern(self.screenGridSize, self.screenGridSize, function(add) { -// // // add.rect(self.screenGridSize, self.screenGridSize).fill('#eee'); -// // // add.rect(10,10); -// // var size = self.screenGridSize * 3 / 16; -// // add.rect(size, size).fill('#444'); -// // add.rect(size, size).move(self.screenGridSize - size, 0).fill('#444'); -// // add.rect(size, size).move(0, self.screenGridSize - size).fill('#444'); -// // add.rect(size, size).move(self.screenGridSize - size, self.screenGridSize - size).fill('#444'); -// // }) -// // self.grid = self.svg.rect(self.modelwidth, self.modelheight).attr({ fill: pattern }); -// // }; -// // self.setSelectedModule = function(module) { -// // self.selectedModule(module); -// // self.selectedModule_SelectedDof(self.selectedModule().dofs()[0]); -// // self.isSelectedModule(true); -// // self.updateMappingGraph(); -// // }; -// // self.selectedModule_RotateLeft = function() { -// // self.selectedModule().rotation((self.selectedModule().rotation() - 90) % 360); -// // self.selectedModule().image.rotate(self.selectedModule().rotation()); -// // }; -// // self.selectedModule_RotateRight = function() { -// // self.selectedModule().rotation((self.selectedModule().rotation() + 90) % 360); -// // self.selectedModule().image.rotate(self.selectedModule().rotation()); -// // }; -// // self.selectedModule_AddDof = function() { -// // var newDof = new Dof("New dof"); -// // self.selectedModule().dofs.push(newDof); -// // self.selectedModule_SelectedDof(newDof); -// // // self.selectedModule_SelectedDofIndex(self.selectedModule().dofs().length-1); -// // }; -// // self.selectedModule_Remove = function() { -// // self.resetSelect(); -// // self.selectedModule().image.remove(); -// // self.modules.remove(self.selectedModule()); -// // }; -// // self.selectedModule_RemoveDof = function() { -// // // self.selectedModule().dofs.splice(self.selectedModule_SelectedDofIndex(), 1); -// // self.selectedModule().dofs.remove(self.selectedModule_SelectedDof()); -// // // self.selectedModule_SelectedDofIndex(0); -// // if (self.selectedModule().dofs().length == 0) { -// // self.selectedModule_AddDof(); -// // } -// // self.selectedModule_SelectedDof(self.selectedModule().dofs()[0]); -// // }; -// // -// // self.saveConfig = function(){ -// // var svg_data = {}; -// // svg_data['name'] = self.name(); -// // svg_data['skin'] = self.skin(); -// // svg_data['grid'] = self.gridSize(); -// // -// // svg_data['modules'] = []; -// // -// // for (var i = 0; i < self.modules().length; i++) { -// // var singleModule = self.modules()[i]; -// // var module_data = {}; -// // module_data['module'] = singleModule.module(); -// // module_data['name'] = singleModule.name(); -// // var matrix = new SVG.Matrix(singleModule.image); -// // module_data['canvas'] = { -// // x: (singleModule.image.cx() - self.centerX) / self.refSize, -// // y: (singleModule.image.cy() - self.centerY) / self.refSize, -// // width: singleModule.image.width() / self.refSize, -// // height: singleModule.image.height() / self.refSize, -// // rotation: matrix.extract().rotation -// // }; -// // if (singleModule.dofs() != undefined) { -// // module_data['dofs'] = []; -// // for (var j = 0; j < singleModule.dofs().length; j++) { -// // var singleDof = singleModule.dofs()[j]; -// // var dof_data = {}; -// // -// // dof_data['name'] = singleDof.name(); -// // if (singleDof.isServo()) { -// // dof_data['servo'] = singleDof.servo(); -// // } -// // if (singleDof.isMap()) { -// // dof_data['mapping'] = singleDof.map(); -// // } -// // module_data['dofs'].push(dof_data); -// // } -// // } -// // svg_data['modules'].push(module_data); -// // } -// // -// // return svg_data; -// // }; -// // -// // self.init = function() { -// // // Clear data, new file, ... -// // self.fileName("Untitled"); -// // self.fileIsModified(false); -// // self.redraw(); -// // }; -// // -// // self.loadFileData = function(filename) { -// // if (filename == "") { -// // //("No filename!"); -// // return; -// // } -// // $.ajax({ -// // dataType: "text", -// // type: "POST", -// // url: "files/get", -// // cache: false, -// // data: {path: filename, extension: self.fileExtension()}, -// // success: function(data) { -// // // Load data -// // var dataobj = JSON.parse(data); -// // // Do something with the data -// // self.newConfig = true; -// // self.config = dataobj; -// // self.redraw(); -// // // Update filename and asterisk -// // var filename_no_ext = filename; -// // if(filename_no_ext.toLowerCase().slice(-4) == self.fileExtension()){ -// // filename_no_ext = filename_no_ext.slice(0, -4); -// // } -// // self.fileName(filename_no_ext); -// // self.fileIsModified(false); -// // }, -// // error: function() { -// // window.location.href = "?"; -// // } -// // }); -// // }; -// // -// // self.saveFileData = function(filename){ -// // if(filename == "") { -// // //("No filename!"); -// // return; -// // } else { -// // // Convert data -// // file_data = self.saveConfig(); -// // -// // var data = ko.toJSON(file_data, null, 2); -// // // var data = file_data; -// // // alert(data); -// // -// // // Send data -// // $.ajax({ -// // dataType: "json", -// // data: { -// // path: filename, -// // filedata: data, -// // overwrite: 1, -// // extension: self.fileExtension() -// // }, -// // type: "POST", -// // url: "files/save", -// // success: function(data){ -// // var filename_no_ext = filename; -// // if(filename_no_ext.toLowerCase().slice(-4) == self.fileExtension()){ -// // filename_no_ext = filename_no_ext.slice(0, -4); -// // } -// // self.fileName(filename_no_ext); -// // self.fileIsModified(false); -// // } -// // }); -// // } -// // }; -// // -// // //------------------------------------------------------------------------------- -// // // SVG stuff -// // //------------------------------------------------------------------------------- -// // -// // // var axisY = self.svg.line(0, centerY, self.modelwidth/2, centerY).stroke({ width: 1 }); -// // // var axisX = self.svg.line(centerX, 0, centerX, self.modelheight).stroke({ width: 1 }); -// // // var Seperator = self.svg.line(self.modelwidth/2, 0, self.modelwidth/2, self.modelheight).stroke({ width: 3 }); -// // -// // // Draw skin & modules -// // self.redraw = function() { -// // if (!self.newConfig) { self.config = self.saveConfig(); } -// // else { self.newConfig = false; } -// // self.clearDraw(); -// // if (self.config != undefined) { -// // self.skin_image = self.svg.image('static/images/skins/' + self.config.skin + '.svg').loaded(self.drawModules); -// // } -// // else { -// // self.skin_image = self.svg.image('static/images/skins/' + self.skin() + '.svg').loaded(self.drawModules); -// // } -// // }; -// // -// // var previousMapIndex = -1; -// // self.updateDofVisualisation = function(mapIndex) { -// // if (previousMapIndex != mapIndex) { -// // $.each(self.modules(), function(idx, mod) { -// // mod.updateDofVisualisation(mapIndex); -// // }); -// // } else { -// // self.selectedModule().updateDofVisualisation(mapIndex); -// // } -// // previousMapIndex = mapIndex; -// // }; -// // -// // self.drawModules = function() { -// // $("image, svg").mousedown(function(){ -// // model.resetSelect(); -// // return false; -// // }); -// // -// // -// // -// // -// // var dx = self.modelwidth / self.skin_image.width(); -// // var dy = self.modelheight / self.skin_image.height(); -// // -// // var modelWidth, modelHeight; -// // -// // if (dx < dy) { -// // modelWidth = self.modelwidth; -// // modelHeight = self.skin_image.height() * dx; -// // } else { -// // modelWidth = self.skin_image.width() * dy; -// // modelHeight = self.modelheight; -// // } -// // -// // self.skin_image.size(modelWidth, modelHeight); -// // self.centerX = modelWidth / 2; -// // self.centerY = modelHeight / 2 -// // -// // // Divide in 2 -// // self.refSize = Math.max(modelWidth, modelHeight) / 2; -// // -// // if (self.config == undefined) { return; } -// // self.skin(self.config.skin); -// // self.name(self.config.name); -// // self.createModules(); -// // // Draw modules on top of the skin -// // $.each(self.modules(), function(idx, mod) { -// // mod.draw(); -// // }); -// // self.resetSelect(); -// // } -// // -// // self.mappingGraph = SVG('poly_screen').size('100%', '121'); -// // -// // self.mappingGraphWidth = $('#poly_screen svg').width(); -// // self.mappingGraphHeight = self.mappingGraph.height(); -// // self.mappingPoints = ko.observableArray(); -// // -// // // var rect = self.mappingGraph.rect(self.mappingGraphWidth, self.mappingGraphHeight); -// // // rect.fill("#AAA"); -// // -// // self.mappingGraphCenterY = self.mappingGraphHeight / 2; -// // self.mappingGraphNodeSize = self.mappingGraphWidth / 30; -// // -// // self.mappingGraph_StepWidth = self.mappingGraphWidth / 21; -// // self.mappingGraph_StartX = self.mappingGraphNodeSize; -// // -// // -// // var startX, text, line; -// // startX = 5; -// // var texts = ['1', '0', '-1']; -// // var Ys = [self.mappingGraphNodeSize, self.mappingGraphCenterY, self.mappingGraphHeight - self.mappingGraphNodeSize]; -// // line = self.mappingGraph.line(startX*2, Ys[0], startX*2, Ys[2]).stroke({ width: 0.5 }); -// // line = self.mappingGraph.line(self.mappingGraphWidth-1, Ys[0], self.mappingGraphWidth-1, Ys[2]).stroke({ width: 0.5 }); -// // -// // for (var i = Ys[0]; i < Ys[2]; i+= self.mappingGraphHeight/40){ -// // self.mappingGraph.line(startX*2, i, self.mappingGraphWidth-1, i).stroke({ width: 0.2 }); -// // } -// // -// // for (var i = 0; i < texts.length; i++){ -// // text = self.mappingGraph.plain(texts[i]); -// // text.center(startX, Ys[i]); -// // line = self.mappingGraph.line(startX*2, Ys[i], self.mappingGraphWidth-1, Ys[i]).stroke({ width: 0.5 }); -// // } -// // -// // var updateInfoTxt = function(circ) { -// // self.mappingGraph_InfoRect.show(); -// // self.mappingGraph_InfoTxt.show(); -// // var num = (self.mappingGraphCenterY - circ.cy()) / (self.mappingGraphCenterY - self.mappingGraphNodeSize); -// // num = Math.round(num * 20) / 20; // Round to 0.05 -// // self.mappingGraph_InfoTxt.plain(num); -// // if (circ.cx() > self.mappingGraph_InfoRect.width() * 2) { -// // self.mappingGraph_Info.move(circ.cx() - self.mappingGraph_InfoRect.width() - self.mappingGraphNodeSize*3/2, circ.cy() + self.mappingGraph_InfoRect.height()/2 - 1) -// // } else { -// // self.mappingGraph_Info.move(circ.cx() + self.mappingGraphNodeSize*3/2, circ.cy() + self.mappingGraph_InfoRect.height()/2 - 1) -// // } -// // return num; -// // }; -// // var hideInfoTxt = function() { -// // self.mappingGraph_InfoRect.hide(); -// // self.mappingGraph_InfoTxt.hide(); -// // }; -// // -// // for (var i = 0; i < 20; i++) { -// // line = self.mappingGraph.line(self.mappingGraph_StartX*2 + self.mappingGraph_StepWidth * i, Ys[0], self.mappingGraph_StartX*2 + self.mappingGraph_StepWidth * i, Ys[2]).stroke({ width: 0.2 }); -// // var circle = self.mappingGraph.circle(self.mappingGraphNodeSize); -// // circle.fill('#286') -// // circle.center(self.mappingGraph_StartX*2 + self.mappingGraph_StepWidth * i, self.mappingGraphCenterY); -// // circle.draggable(function(x, y) { -// // return { x: x == self.mappingGraph_StartX*2 + self.mappingGraph_StepWidth * i, y: y > self.mappingGraphNodeSize/2 - 1 && y < (self.mappingGraphHeight - self.mappingGraphNodeSize*3/2) } -// // }); -// // circle.attr({ index: i }); -// // circle.on('mouseover', function() { -// // updateInfoTxt(this); -// // }); -// // circle.on('mouseleave', function() { -// // hideInfoTxt(); -// // }); -// // circle.on('dragmove', function() { -// // var num = updateInfoTxt(this); -// // self.selectedModule_SelectedDof().map().poly()[this.attr('index')] = num; -// // model.updateDofVisualisation(this.attr('index')); -// // }); -// // circle.on('dragend', function(e){ -// // var num = updateInfoTxt(this); -// // this.cy(self.mappingGraphCenterY - num * (self.mappingGraphCenterY - self.mappingGraphNodeSize)); -// // self.selectedModule_SelectedDof().map().poly()[this.attr('index')] = num; -// // model.updateDofVisualisation(this.attr('index')); -// // }); -// // self.mappingPoints.push(circle); -// // } -// // self.mappingGraph_Info = self.mappingGraph.nested(); -// // self.mappingGraph_InfoRect = self.mappingGraph_Info.rect(30, 12); -// // self.mappingGraph_InfoRect.move(-2, -10); -// // self.mappingGraph_InfoRect.fill('#fff'); -// // self.mappingGraph_InfoRect.stroke({ color: '#222', opacity: 0.8, width: 1 }); -// // self.mappingGraph_InfoTxt = self.mappingGraph_Info.plain(''); -// // self.mappingGraph_InfoTxt.move(0, 0); -// // self.mappingGraph_InfoTxt.fill('#000'); -// // hideInfoTxt(); -// // -// // self.updateMappingGraph = function() { -// // for (var i = 0; i < self.mappingPoints().length; i++) { -// // self.mappingPoints()[i].cy(self.mappingGraphCenterY - self.selectedModule_SelectedDof().map().poly()[i] * (self.mappingGraphCenterY - self.mappingGraphNodeSize)); -// // } -// // }; -// // -// // self.resetSelect = function(){ -// // for (var i = 0; i < self.modules().length; i++) { -// // // self.modules()[i].image.selectize(false); -// // self.modules()[i].image.opacity(0.8); -// // } -// // self.isSelectedModule(false); -// // }; -// // -// // // Create modules -// // self.createModules = function() { -// // self.modules.removeAll(); -// // if (self.config != undefined) { -// // $.each(self.config.modules, function(idx, mod) { -// // var newModule = new Module(mod.module, mod.name, mod.canvas.x, mod.canvas.y, mod.canvas.width, mod.canvas.height, mod.canvas.rotation); -// // -// // $.each(mod.dofs, function(idx, dof) { -// // var newDof = new Dof(dof.name); -// // if (dof.servo != undefined) { -// // newDof.setServo(dof.servo.pin, dof.servo.mid, dof.servo.min, dof.servo.max); -// // } -// // if (dof.mapping != undefined) { -// // newDof.setMap(dof.mapping.neutral); -// // newDof.map().poly(dof.mapping.poly); -// // } -// // newModule.dofs.push(newDof); -// // }); -// // self.modules.push(newModule); -// // if (self.selectedModule() == undefined) { -// // self.setSelectedModule(newModule); -// // self.isSelectedModule(false); -// // } -// // }); -// // } else { -// // var newModule = new Module('', '', 0, 0, 0, 0, 0); -// // var newDof = new Dof(''); -// // newModule.dofs.push(newDof); -// // self.setSelectedModule(newModule); -// // self.isSelectedModule(false); -// // } -// // }; -// // -// // var newModule = new Module('', '', 0, 0, 0, 0, 0); -// // var newDof = new Dof(''); -// // newModule.dofs.push(newDof); -// // self.setSelectedModule(newModule); -// // self.isSelectedModule(false); -// // -// // var index = 0; -// // self.svg_modules = SVG('modules_screen').size('100%', '60'); -// // // Draw available modules -// // $.each(self.allModules, function(idx, mod){ -// // // alert(mod); -// // // var moduleImage = self.svg.image('static/images/' + mod + '.svg').loaded(function() { -// // -// // var moduleImage = self.svg_modules.image('static/images/' + mod + '.svg').loaded(function() { -// // this.attr({ preserveAspectRatio: "none", type: mod }); -// // var h = 50; -// // var w = 50; -// // var increase = 5; -// // this.size(w, h); -// // -// // this.move(index * (w+2*increase), increase); -// // index += 1; -// // -// // this.style('cursor', 'pointer'); -// // // this.selectize(); -// // // this.resize({snapToAngle:5}); -// // // allModules.push(this); -// // this.on('mouseover', function(e){ -// // this.size(w+increase, h+increase); -// // }); -// // this.on('mouseleave', function(e){ -// // this.size(w, h); -// // }); -// // this.on('click', function(e){ -// // var newModule = new Module(mod, mod, 0, 0, 0.2, 0.2, 0); -// // var tempModule = new module_function[mod](undefined, 0, 0, 0, 0); -// // for (var i = 0; i < tempModule.dofs.length; i++) { -// // var newDof = new Dof(tempModule.dofs[i]); -// // newModule.dofs.push(newDof); -// // } -// // self.setSelectedModule(newModule); -// // self.isSelectedModule(true); -// // newModule.draw(); -// // self.modules.push(newModule); -// // }); -// // }); -// // }); -// -// if (action_data.openfile) { -// virtualModel.loadFileData(action_data.openfile || ""); -// } else { -// virtualModel.init(); -// } -// }; -// // This makes Knockout get to work -// // var model = new Model(); -// -// virtualModel = new VirtualModel(); -// ko.applyBindings(virtualModel); -// virtualModel.fileIsModified(false); -// -// // Configurate toolbar handlers -// config_file_operations("/", virtualModel.fileExtension(), virtualModel.saveFileData, virtualModel.loadFileData, virtualModel.init); -// -// -// -// -// }); -// - - -$(document).ready(function() { - virtualModel = new VirtualModel(); - ko.applyBindings(virtualModel); - virtualModel.fileIsModified(false); - - // Configurate toolbar handlers - config_file_operations("/", virtualModel.fileExtension(), virtualModel.saveFileData, virtualModel.loadFileData, virtualModel.init); - $(window).resize(virtualModel.redraw); -}); diff --git a/src/opsoro/apps/configurator/static/canvas.js b/src/opsoro/apps/configurator/static/canvas.js deleted file mode 100644 index ca67dca..0000000 --- a/src/opsoro/apps/configurator/static/canvas.js +++ /dev/null @@ -1,89 +0,0 @@ -var values = { - paths: 50, - minPoints: 5, - maxPoints: 15, - minRadius: 30, - maxRadius: 90 -}; - -var hitOptions = { - segments: true, - stroke: true, - fill: true, - tolerance: 5 -}; - -createPaths(); - -function createPaths() { - var radiusDelta = values.maxRadius - values.minRadius; - var pointsDelta = values.maxPoints - values.minPoints; - for (var i = 0; i < values.paths; i++) { - var radius = values.minRadius + Math.random() * radiusDelta; - var points = values.minPoints + Math.floor(Math.random() * pointsDelta); - var path = createBlob(view.size * Point.random(), radius, points); - var lightness = (Math.random() - 0.5) * 0.4 + 0.4; - var hue = Math.random() * 360; - path.fillColor = { hue: hue, saturation: 1, lightness: lightness }; - path.strokeColor = 'black'; - }; -} - -function createBlob(center, maxRadius, points) { - var path = new Path(); - path.closed = true; - for (var i = 0; i < points; i++) { - var delta = new Point({ - length: (maxRadius * 0.5) + (Math.random() * maxRadius * 0.5), - angle: (360 / points) * i - }); - path.add(center + delta); - } - path.smooth(); - return path; -} - -var segment, path; -var movePath = false; -function onMouseDown(event) { - segment = path = null; - var hitResult = project.hitTest(event.point, hitOptions); - if (!hitResult) - return; - - if (event.modifiers.shift) { - if (hitResult.type == 'segment') { - hitResult.segment.remove(); - }; - return; - } - - if (hitResult) { - path = hitResult.item; - if (hitResult.type == 'segment') { - segment = hitResult.segment; - } else if (hitResult.type == 'stroke') { - var location = hitResult.location; - segment = path.insert(location.index + 1, event.point); - path.smooth(); - } - } - movePath = hitResult.type == 'fill'; - if (movePath) - project.activeLayer.addChild(hitResult.item); -} - -function onMouseMove(event) { - project.activeLayer.selected = false; - if (event.item) - event.item.selected = true; -} - -function onMouseDrag(event) { - if (segment) { - segment.point += event.delta; - path.smooth(); - } else if (path) { - path.position += event.delta; - } -} diff --git a/src/opsoro/apps/configurator/static/images/eye.svg b/src/opsoro/apps/configurator/static/images/eye.svg deleted file mode 100644 index c523b1d..0000000 --- a/src/opsoro/apps/configurator/static/images/eye.svg +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/src/opsoro/apps/configurator/static/images/eyebrow.svg b/src/opsoro/apps/configurator/static/images/eyebrow.svg deleted file mode 100644 index 4851f34..0000000 --- a/src/opsoro/apps/configurator/static/images/eyebrow.svg +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/src/opsoro/apps/configurator/static/images/mouth.svg b/src/opsoro/apps/configurator/static/images/mouth.svg deleted file mode 100644 index 61b8cf3..0000000 --- a/src/opsoro/apps/configurator/static/images/mouth.svg +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/src/opsoro/apps/configurator/static/modules.js b/src/opsoro/apps/configurator/static/modules.js deleted file mode 100644 index c9c3ac4..0000000 --- a/src/opsoro/apps/configurator/static/modules.js +++ /dev/null @@ -1,1116 +0,0 @@ -var virtualModel; -var modules_name; -var skins_name; -var action_data; -var config_data; -var dof_values; - -// $(document).ready(function() { -var module_function = { - 'eye': DrawEye, - 'eyebrow': DrawEyebrow, - 'mouth': DrawMouth -}; - -function constrain(val, min, max) { - return Math.min(max, Math.max(val, min)); -} - -var Mapping = function(neutral) { - var self = this; - self.neutral = ko.observable(neutral); - self.poly = ko.observableArray(); - - // Populate Poly - for (var i = 0; i < 20; i++) { - self.poly.push(0.0); - } - - self.setPolyPos = function(index, position) { - self.poly()[index] = position; - }; -}; -var MappingGraph = function() { - var self = this; - - if ($('#poly_screen').length == 0) { - return; - } - - self.svg = SVG('poly_screen').size('100%', '121'); - - self.width = $('#poly_screen svg').width(); - self.height = self.svg.height(); - self.points = ko.observableArray(); - - // var rect = self.svg.rect(self.width, self.height); - // rect.fill("#AAA"); - - self.centerY = self.height / 2; - self.nodeSize = self.width / 30; - - self.stepWidth = self.width / 21; - self.startX = self.nodeSize; - - self.updateGraph = function() { - if (virtualModel == undefined) { - return; - } - for (var i = 0; i < self.points().length; i++) { - self.points()[i].cy(self.centerY - virtualModel.selectedModule_SelectedDof().map().poly()[i] * (self.centerY - self.nodeSize)); - } - }; - - var startX, - text, - line; - startX = 5; - var texts = ['1', '0', '-1']; - var Ys = [ - self.nodeSize, self.centerY, self.height - self.nodeSize - ]; - line = self.svg.line(startX * 2, Ys[0], startX * 2, Ys[2]).stroke({ - width: 0.5 - }); - line = self.svg.line(self.width - 1, Ys[0], self.width - 1, Ys[2]).stroke({ - width: 0.5 - }); - - for (var i = Ys[0]; i < Ys[2]; i += self.height / 40) { - self.svg.line(startX * 2, i, self.width - 1, i).stroke({ - width: 0.2 - }); - } - - for (var i = 0; i < texts.length; i++) { - text = self.svg.plain(texts[i]); - text.center(startX, Ys[i]); - line = self.svg.line(startX * 2, Ys[i], self.width - 1, Ys[i]).stroke({ - width: 0.5 - }); - } - - var updateInfoTxt = function(circ) { - self.infoRect.show(); - self.infoTxt.show(); - var num = (self.centerY - circ.cy()) / (self.centerY - self.nodeSize); - num = Math.round(num * 20) / 20; // Round to 0.05 - self.infoTxt.plain(num); - if (circ.cx() > self.infoRect.width() * 2) { - self.info.move(circ.cx() - self.infoRect.width() - self.nodeSize * 3 / 2, circ.cy() + self.infoRect.height() / 2 - 1) - } else { - self.info.move(circ.cx() + self.nodeSize * 3 / 2, circ.cy() + self.infoRect.height() / 2 - 1) - } - return num; - }; - var hideInfoTxt = function() { - self.infoRect.hide(); - self.infoTxt.hide(); - }; - - for (var i = 0; i < 20; i++) { - line = self.svg.line(self.startX * 2 + self.stepWidth * i, Ys[0], self.startX * 2 + self.stepWidth * i, Ys[2]).stroke({ - width: 0.2 - }); - var circle = self.svg.circle(self.nodeSize); - circle.fill('#286') - circle.center(self.startX * 2 + self.stepWidth * i, self.centerY); - circle.draggable(function(x, y) { - return { - x: x == self.startX * 2 + self.stepWidth * i, - y: y > self.nodeSize / 2 - 1 && y < (self.height - self.nodeSize * 3 / 2) - } - }); - circle.attr({ - index: i - }); - circle.on('mouseover', function() { - updateInfoTxt(this); - }); - circle.on('mouseleave', function() { - hideInfoTxt(); - }); - circle.on('dragmove', function() { - var num = updateInfoTxt(this); - virtualModel.selectedModule_SelectedDof().map().poly()[this.attr('index')] = num; - virtualModel.updateDofVisualisation(this.attr('index'), false); - }); - circle.on('dragend', function(e) { - var num = updateInfoTxt(this); - this.cy(self.centerY - num * (self.centerY - self.nodeSize)); - virtualModel.selectedModule_SelectedDof().map().poly()[this.attr('index')] = num; - virtualModel.updateDofVisualisation(this.attr('index'), true); - }); - self.points.push(circle); - } - self.info = self.svg.nested(); - self.infoRect = self.info.rect(30, 12); - self.infoRect.move(-2, -10); - self.infoRect.fill('#fff'); - self.infoRect.stroke({ - color: '#222', - opacity: 0.8, - width: 1 - }); - self.infoTxt = self.info.plain(''); - self.infoTxt.move(0, 0); - self.infoTxt.fill('#000'); - hideInfoTxt(); - -}; -var Servo = function(pin, mid, min, max) { - var self = this; - self.pin = ko.observable(pin); - self.mid = ko.observable(mid); - self.min = ko.observable(min); - self.max = ko.observable(max); -}; -var Dof = function(name) { - var self = this; - self.name = ko.observable(name); - self.isServo = ko.observable(false); - self.servo = ko.observable(new Servo(0, 1500, 0, 0)); - self.isMap = ko.observable(false); - self.map = ko.observable(new Mapping(0)); - self.value = ko.observable(0.0); - - self.setServo = function(pin, mid, min, max) { - self.servo(new Servo(pin, mid, min, max)); - self.isServo(true); - }; - self.setMap = function(neutral) { - self.map(new Mapping(neutral)); - self.isMap(true); - }; -}; -var Module = function(type, name, x, y, width, height, rotation) { - var self = this; - self.module = ko.observable(type); - self.name = ko.observable(name); - self.x = ko.observable(x); - self.y = ko.observable(y); - self.width = ko.observable(width); - self.height = ko.observable(height); - self.rotation = ko.observable(Math.round(rotation / 90) * 90); // 90° angles only - self.dofs = ko.observableArray(); - self.image = undefined; - self.drawObject = undefined; - - self.snapToGrid = function() { - var newX, - newY; - newX = Math.round(self.image.cx() / (virtualModel.snap() * virtualModel.screenGridSize)) * (virtualModel.snap() * virtualModel.screenGridSize); - newY = Math.round(self.image.cy() / (virtualModel.snap() * virtualModel.screenGridSize)) * (virtualModel.snap() * virtualModel.screenGridSize); - self.image.center(newX, newY); - }; - - self.draw = function() { - self.update(self.x(), self.y(), self.width(), self.height(), self.rotation()); - self.drawObject = new module_function[self.module()](virtualModel.svg, self.x(), self.y(), self.width(), self.height()); - self.image = self.drawObject.image; - - self.updateImage(); - }; - - self.updateDofVisualisation = function(mapIndex, updateRobot) { - if (self.drawObject == undefined) { - return; - } - if (updateRobot == undefined) { - updateRobot = false; - } - var values = []; - - $.each(self.dofs(), function(idx, dof) { - dof.value(0); - if (dof_values != undefined) { - if (dof.isServo()) { - dof.value(dof_values[dof.servo().pin()]); - } - } else { - if (dof.isMap() && dof.isServo()) { - if (mapIndex < 0) { - dof.value(dof.map().neutral()); - } else { - dof.value(dof.map().poly()[mapIndex]); - } - } - } - if (updateRobot) { - virtualModel.updateDof(dof); - } - values.push(parseFloat(dof.value())); - }); - if (values.length == self.drawObject.dofs.length) { - self.drawObject.x = self.x(); - self.drawObject.y = self.y(); - self.drawObject.width = self.width(); - self.drawObject.height = self.height(); - self.drawObject.Set(values) - self.drawObject.Update(); - } - if (mapIndex < 0) { - self.snapToGrid(); - } - }; - - self.update = function(x, y, w, h, r) { - r = Math.round(r / 90) * 90; - self.rotation(r); - self.x(Math.ceil(virtualModel.centerX + x * virtualModel.refSize)); - self.y(Math.ceil(virtualModel.centerY + y * virtualModel.refSize)); - self.width(Math.ceil(w * virtualModel.refSize)); - self.height(Math.ceil(h * virtualModel.refSize)); - }; - self.updateImage = function() { - if (!virtualModel.editable) { - return; - } - if (self.image == undefined) { - return; - } - self.image.attr({ - preserveAspectRatio: "none" - }); - - self.image.style('cursor', 'grab'); - self.image.draggable(); - self.snapToGrid(); - self.image.on('mousedown', function() { - virtualModel.resetSelect(); - // this.selectize(); - this.opacity(1); - virtualModel.setSelectedModule(self); - }); - self.image.on('dragend', function(e) { - self.snapToGrid(); - self.x(this.cx()); - self.y(this.cy()); - self.drawObject.x = self.x(); - self.drawObject.y = self.y(); - self.drawObject.width = self.width(); - self.drawObject.height = self.height(); - }); - }; -}; - -function DrawModule(svg, x, y, width, height) { - var self = this; - self.svg = svg || undefined; - self.x = x || 0; - self.y = y || 0 - self.width = width || 0; - self.height = height || 0; - self.dofs = []; -} - -// ---------------------------------------------------------------------------------------------------- -// Mouth -// ---------------------------------------------------------------------------------------------------- -function DrawMouth(svg, x, y, width, height) { - var self = this; - self.base = DrawModule; - self.base(svg, x, y, width, height); - - self.dofs = ['left_vertical', 'middle_vertical', 'right_vertical', 'left_rotation', 'right_rotation']; - - self.increase = self.height / 2; - - self.Set = function(values) { - self.right_Y = constrain(values[0] || 0, -1, 1); // -1.0 -> 1.0 - self.middle_Y = constrain(values[1] || 0, -1, 1); // -1.0 -> 1.0 - self.left_Y = constrain(values[2] || 0, -1, 1); // -1.0 -> 1.0 - self.right_R = constrain(values[3] || 0, -1, 1); // -1.0 -> 1.0 - self.left_R = constrain(values[4] || 0, -1, 1); // -1.0 -> 1.0 - } - self.Set([-0.5, 0.5, -0.5, 0, 0]); - - if (self.svg == undefined) { - return; - } - - self.curve = new SVG.PathArray([ - ['M', 0, 0] - ]); - self.image = self.svg.nested(); - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - self.image_mouth = self.image.path(self.curve); - - self.Update = function() { - var leftX, - rightX, - topY, - middleY1, - middleY2, - centerY; - - leftX = 0; - rightX = self.width; - middleY1 = self.left_R * 90; - middleY2 = self.right_R * 90; - - centerY = self.height / 2; - - self.increase = self.height / 2; - - self.curve = new SVG.PathArray([ - [ - 'M', leftX, centerY + (self.left_Y * self.increase) - ], - [ - 'C', leftX + self.width / 4, - centerY + middleY1, - rightX - self.width / 4, - centerY + middleY2, - rightX, - centerY + (self.right_Y * self.increase) - ], - [ - 'C', rightX - self.width / 4, - centerY + (self.middle_Y * self.increase / 2) + middleY2 + self.increase / 2, - leftX + self.width / 4, - centerY + (self.middle_Y * self.increase / 2) + middleY1 + self.increase / 2, - leftX, - centerY + (self.left_Y * self.increase) - ], - ['z'] - ]); - - self.image_mouth.plot(self.curve); - // // Round bezier corners - var endsize = 1; - var marker = self.svg.marker(endsize, endsize, function(add) { - add.circle(endsize).fill('#C00'); - }) - self.image_mouth.marker('start', marker); - self.image_mouth.marker('mid', marker); - self.image_mouth.fill('#222').stroke({ - width: Math.min(self.width, self.height) / 8, - color: '#C00' - }); - - - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - }; - self.Update(); -} -DrawMouth.prototype = new DrawModule; - -// ---------------------------------------------------------------------------------------------------- -// Eyebrow -// ---------------------------------------------------------------------------------------------------- -function DrawEyebrow(svg, x, y, width, height) { - var self = this; - self.base = DrawModule; - self.base(svg, x, y, width, height); - - self.dofs = ['Left Vertical', 'Right Vertical', 'Rotation']; - self.increase = self.height / 2; - - self.Set = function(values) { - self.right_Y = constrain(values[0] || 0, -1, 1); // -1.0 -> 1.0 - self.left_Y = constrain(values[1] || 0, -1, 1); // -1.0 -> 1.0 - self.rotation = constrain(values[2] || 0, -1, 1); // -1.0 -> 1.0 - } - self.Set([0, 0, 0]); - - if (self.svg == undefined) { - return; - } - - self.curve = new SVG.PathArray([ - ['M', 0, 0] - ]); - self.image = self.svg.nested(); - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - self.image_eyebrow = self.image.path(self.curve); - - self.Update = function() { - var leftX, - rightX, - centerY; - leftX = 0; - rightX = self.width; - self.increase = self.height / 2; - centerY = self.height / 2; - self.curve = new SVG.PathArray([ - [ - 'M', leftX, centerY + (self.left_Y * self.increase) - ], - [ - 'C', leftX + self.width / 4, - centerY + (self.left_Y * self.increase) - self.increase / 2, - rightX - self.width / 4, - centerY + (self.right_Y * self.increase) - self.increase / 2, - rightX, - centerY + (self.right_Y * self.increase) - ] - ]); - - self.image_eyebrow.plot(self.curve); - // Round bezier corners - var endsize = 1; - var marker = self.svg.marker(endsize, endsize, function(add) { - add.circle(endsize).fill('#222'); - }) - self.image_eyebrow.marker('start', marker); - self.image_eyebrow.marker('end', marker); - self.image_eyebrow.fill('none').stroke({ - width: Math.min(self.width, self.height) / 6, - color: '#222' - }); - - self.image_eyebrow.rotate(self.rotation * 45); - - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - }; - self.Update(); -} -DrawEyebrow.prototype = new DrawModule; - -// ---------------------------------------------------------------------------------------------------- -// Eye -// ---------------------------------------------------------------------------------------------------- -function DrawEye(svg, x, y, width, height) { - var self = this; - self.base = DrawModule; - self.base(svg, x, y, width, height); - - self.dofs = ['Pupil Horizontal', 'Pupil Vertical', 'Eyelid Closure']; - - self.Set = function(values) { - self.pupil_X = constrain(values[0] || 0, -1, 1); // -1.0 -> 1.0 - self.pupil_Y = constrain(values[1] || 0, -1, 1); // -1.0 -> 1.0 - self.lid = constrain(-values[2] || 0, -1, 1); // -1.0 -> 1.0 - } - self.Set([0, 0, 0.5]); - - if (self.svg == undefined) { - return; - } - - self.curve = new SVG.PathArray([ - ['M', 0, 0] - ]); - self.image = self.svg.nested(); - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - - self.image_eye = self.image.ellipse(self.width, self.height); - self.image_eye.fill('#DDD'); - - self.image_pupil = self.image.ellipse(self.width / 5, self.height / 5); //((parseInt(self.width) + parseInt(self.height)) / 5); - self.image_pupil.center(self.width / 2, self.height / 2); - self.image_pupil.fill('#000'); - - self.image_lid = self.image.path(self.curve); - - self.Update = function() { - var leftX, - rightX, - topY, - pupil_factor; - leftX = 0; - rightX = self.width; - topY = 0; - pupil_factor = 2.5; - - self.image_eye.size(self.width, self.height); - self.image_eye.center(self.width / 2, self.height / 2); - self.image_pupil.size(self.width / pupil_factor, self.height / pupil_factor); - self.image_pupil.center(self.width / 2 - self.pupil_X * (self.width / 2 - self.image_pupil.width() / 1.4), self.height / 2 - self.pupil_Y * (self.height / 2 - self.image_pupil.height() / 1.4)); - - self.curve = new SVG.PathArray([ - [ - 'M', leftX, self.height / 2 - ], - [ - 'C', leftX, -self.height / 4, - rightX, -self.height / 4, - rightX, - self.height / 2 - ], - [ - 'C', rightX, self.height / 2 + self.lid * self.height * 5 / 8, - leftX, - self.height / 2 + self.lid * self.height * 5 / 8, - leftX, - self.height / 2 - ], - ['z'] - ]); - - self.image_lid.plot(self.curve); - - // Round bezier corners - // var endsize = 1; - // var marker = self.svg.marker(endsize, endsize, function(add) { - // add.circle(endsize).fill('#999'); - // }) - // self.image_lid.marker('start', marker); - // self.image_lid.marker('mid', marker); - self.image_lid.fill('#444'); //.stroke({ width: 1, color: '#999' }); - - - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - // self.image.size(self.width, self.height); - // self.image.move(self.x, self.y); - }; - self.Update(); -} -DrawEyebrow.prototype = new DrawModule; - -var VirtualModel = function() { - var self = this; - - // File operations toolbar item - self.fileIsLocked = ko.observable(false); - self.fileIsModified = ko.observable(false); - self.fileName = ko.observable("Untitled"); - self.fileStatus = ko.observable(""); - self.fileExtension = ko.observable(".conf"); - - self.config = (config_data == undefined ? - undefined : - config_data); //JSON.parse(config_data)); - self.allModules = ['eye', 'eyebrow', 'mouth']; //modules_name; - self.allSkins = ['ono', 'nmct', 'robo']; //skins_name; - self.skin = ko.observable((self.allSkins == undefined ? - 'ono' : - self.allSkins[0])); - self.name = ko.observable("OPSORO robot"); - - self.isSelectedModule = ko.observable(false); - self.selectedModule = ko.observable(); - self.selectedModule_SelectedDof = ko.observable(); - - self.modules = ko.observableArray(); - - // create svg drawing - self.svg = SVG('model_screen').size('100%', '600'); - - self.modelwidth = $('#model_screen svg').width(); - self.modelheight = self.svg.height(); - self.refSize = Math.max(self.modelwidth, self.modelheight) / 2; - - self.gridSize = ko.observable(18); - self.screenGridSize = Math.min(self.modelwidth, self.modelheight) / self.gridSize(); - self.snap = ko.observable(1); - - self.centerX = self.modelwidth / 2; - self.centerY = self.modelheight / 2; - - self.skin_image = undefined; - self.newConfig = true; - - self.editable = ($('#poly_screen').length != 0); - - self.mappingGraph = new MappingGraph(); - - self.updateServoPin = function() { - - } - self.updateServoMid = function() { - if (!self.selectedModule_SelectedDof().isServo()) { - return; - } - console.log(parseInt(self.selectedModule_SelectedDof().servo().mid())); - robotSendServo(self.selectedModule_SelectedDof().servo().pin(), parseInt(self.selectedModule_SelectedDof().servo().mid())); - } - self.updateServoMin = function() { - if (!self.selectedModule_SelectedDof().isServo()) { - return; - } - console.log(parseInt(self.selectedModule_SelectedDof().servo().mid()) + parseInt(self.selectedModule_SelectedDof().servo().min())); - robotSendServo(self.selectedModule_SelectedDof().servo().pin(), parseInt(self.selectedModule_SelectedDof().servo().mid()) + parseInt(self.selectedModule_SelectedDof().servo().min())); - } - self.updateServoMax = function() { - if (!self.selectedModule_SelectedDof().isServo()) { - return; - } - console.log(parseInt(self.selectedModule_SelectedDof().servo().mid()) + parseInt(self.selectedModule_SelectedDof().servo().max())); - robotSendServo(self.selectedModule_SelectedDof().servo().pin(), parseInt(self.selectedModule_SelectedDof().servo().mid()) + parseInt(self.selectedModule_SelectedDof().servo().max())); - } - - // self.updateDof = function(mod_name, dof_name, value) { - // if (!self.selectedModule_SelectedDof().isServo()) { - // return; - // } - // - // robotSendDOF(mod_name, dof_name, value); - // // $.ajax({ - // // dataType: "text", - // // type: "POST", - // // url: "setDof", - // // cache: false, - // // data: { - // // module_name: mod_name, - // // dof_name: dof_name, - // // value: value - // // }, - // // success: function(data) {} - // // }); - // } - self.updateDofs = function() { - if (!self.selectedModule_SelectedDof().isServo()) { - return; - } - - var dof_values = {}; - - for (var i = 0; i < self.modules().length; i++) { - var singleModule = self.modules()[i]; - dof_values[singleModule.name()] = {}; - for (var j = 0; j < singleModule.dofs().length; j++) { - var singleDof = singleModule.dofs()[j]; - dof_values[singleModule.name()][singleDof.name()] = singleDof.value(); - - var value = parseInt(singleDof.servo().mid()); - if (singleDof.value() >= 0) { - value += parseInt(singleDof.value() * singleDof.servo().max()); - } else { - value += parseInt(-singleDof.value() * singleDof.servo().min()); - } - - robotSendServo(singleDof.servo().pin(), value); - } - console.log(dof_values[singleModule.name()]); - // mod_values[singleModule.name()].push(dof_values); - - } - // console.log(dof_values[]); - // robotSendReceiveAllDOF(dof_values); - } - - self.updateDof = function(singleDof) { - if (singleDof == undefined) { - return; - } - if (!singleDof.isServo()) { - return; - } - - if (singleDof.value() > 1.0) { - singleDof.value(1.0); - } - if (singleDof.value() < -1.0) { - singleDof.value(-1.0); - } - - - var value = parseInt(singleDof.servo().mid()); - if (singleDof.value() >= 0) { - value += parseInt(singleDof.value() * singleDof.servo().max()); - } else { - value += parseInt(-singleDof.value() * singleDof.servo().min()); - } - - robotSendServo(singleDof.servo().pin(), value); - } - - self.clearDraw = function() { - console.log('Clear'); - self.svg.clear(); - self.modelwidth = $('#model_screen svg').width(); - self.modelheight = self.svg.height(); - self.refSize = Math.max(self.modelwidth, self.modelheight) / 2; - self.screenGridSize = Math.min(self.modelwidth, self.modelheight) / self.gridSize(); - self.centerX = self.modelwidth / 2; - self.centerY = self.modelheight / 2; - - - self.resetSelect(); - if (self.config != undefined) { - if (self.config.grid != undefined) { - self.gridSize(self.config.grid); - } - } - self.screenGridSize = Math.min(self.modelwidth, self.modelheight) / self.gridSize(); - if (!self.editable) { - return; - } - var pattern = self.svg.pattern(self.screenGridSize, self.screenGridSize, function(add) { - // add.rect(self.screenGridSize, self.screenGridSize).fill('#eee'); - // add.rect(10,10); - var size = self.screenGridSize * 3 / 16; - add.rect(size, size).fill('#444'); - add.rect(size, size).move(self.screenGridSize - size, 0).fill('#444'); - add.rect(size, size).move(0, self.screenGridSize - size).fill('#444'); - add.rect(size, size).move(self.screenGridSize - size, self.screenGridSize - size).fill('#444'); - }) - self.grid = self.svg.rect(self.modelwidth, self.modelheight).attr({ - fill: pattern - }); - }; - self.setSelectedModule = function(module) { - self.selectedModule(module); - self.selectedModule_SelectedDof(self.selectedModule().dofs()[0]); - if (!self.editable) { - return; - } - self.fileIsModified(true); - self.isSelectedModule(true); - self.mappingGraph.updateGraph(); - self.updateServoMid(); - }; - self.selectedModule_RotateLeft = function() { - self.selectedModule().rotation((self.selectedModule().rotation() - 90) % 360); - self.selectedModule().image.rotate(self.selectedModule().rotation()); - }; - self.selectedModule_RotateRight = function() { - self.selectedModule().rotation((self.selectedModule().rotation() + 90) % 360); - self.selectedModule().image.rotate(self.selectedModule().rotation()); - }; - self.selectedModule_AddDof = function() { - var newDof = new Dof("New dof"); - self.selectedModule().dofs.push(newDof); - self.selectedModule_SelectedDof(newDof); - }; - self.selectedModule_Remove = function() { - self.resetSelect(); - self.selectedModule().image.remove(); - self.modules.remove(self.selectedModule()); - }; - self.selectedModule_RemoveDof = function() { - self.selectedModule().dofs.remove(self.selectedModule_SelectedDof()); - if (self.selectedModule().dofs().length == 0) { - self.selectedModule_AddDof(); - } - self.selectedModule_SelectedDof(self.selectedModule().dofs()[0]); - }; - - self.saveConfig = function() { - console.log('Save'); - if (!self.editable) { - return; - } - var svg_data = {}; - svg_data['name'] = self.name(); - svg_data['skin'] = self.skin(); - svg_data['grid'] = self.gridSize(); - - svg_data['modules'] = []; - - for (var i = 0; i < self.modules().length; i++) { - var singleModule = self.modules()[i]; - var module_data = {}; - module_data['module'] = singleModule.module(); - module_data['name'] = singleModule.name(); - var matrix = new SVG.Matrix(singleModule.image); - module_data['canvas'] = { - x: (singleModule.image.cx() - self.centerX) / self.refSize, - y: (singleModule.image.cy() - self.centerY) / self.refSize, - width: singleModule.width() / self.refSize, - height: singleModule.height() / self.refSize, - rotation: matrix.extract().rotation - }; - if (singleModule.dofs() != undefined) { - module_data['dofs'] = []; - for (var j = 0; j < singleModule.dofs().length; j++) { - var singleDof = singleModule.dofs()[j]; - var dof_data = {}; - - dof_data['name'] = singleDof.name(); - if (singleDof.isServo()) { - dof_data['servo'] = singleDof.servo(); - } - if (singleDof.isMap()) { - dof_data['mapping'] = singleDof.map(); - } - module_data['dofs'].push(dof_data); - } - } - svg_data['modules'].push(module_data); - } - return svg_data; - }; - - self.init = function() { - self.config = undefined; - self.newConfig = true; - self.redraw(); - }; - - self.loadFileData = function(data) { - if (data == undefined) { - return; - } - // Load data - var dataobj = JSON.parse(data); - console.log(dataobj); - // Do something with the data - self.newConfig = true; - self.config = dataobj; - self.redraw(); - self.fileIsModified(false); - }; - - self.saveFileData = function() { - if (!self.editable) { - return; - } - return ko.toJSON(self.saveConfig(), null, 2); - }; - - self.setDefault = function() { - if (!self.editable) { - return; - } - // Convert data - // file_data = self.saveConfig(); - // var data = ko.toJSON(file_data, null, 2); - - // Send data - robotSendReceiveConfig(self.saveConfig()); - }; - - // self.setDefault = function() { - // $.ajax({ - // dataType: "json", - // data: { - // filename: self.fileName() + self.fileExtension() - // }, - // type: "POST", - // url: "setDefault", - // success: function(data) { - // if (data.status == "error") { - // // addError(data.message); - // alert('Error setting default configuration.'); - // } - // } - // }); - // }; - - //------------------------------------------------------------------------------- - // SVG stuff - //------------------------------------------------------------------------------- - - // var axisY = self.svg.line(0, centerY, self.modelwidth/2, centerY).stroke({ width: 1 }); - // var axisX = self.svg.line(centerX, 0, centerX, self.modelheight).stroke({ width: 1 }); - // var Seperator = self.svg.line(self.modelwidth/2, 0, self.modelwidth/2, self.modelheight).stroke({ width: 3 }); - - // Draw skin & modules - self.redraw = function() { - console.log('Redraw'); - if (!self.newConfig && self.fileIsModified()) { - // Convert and convert back, bad reading otherwise - self.config = JSON.parse(ko.toJSON(self.saveConfig())); - //alert('not good'); - } else { - self.newConfig = true; - } - self.clearDraw(); - if (self.config != undefined) { - self.skin_image = self.svg.image('/static/images/skins/' + self.config.skin + '.svg').loaded(self.drawModules); - } else { - self.skin_image = self.svg.image('/static/images/skins/' + self.skin() + '.svg').loaded(self.drawModules); - } - - self.fileIsModified(false); - }; - - var previousMapIndex = -1; - self.updateDofVisualisation = function(mapIndex, updateRobot) { - // alert(''); - if (mapIndex < -1 || previousMapIndex != mapIndex) { - // Update all modules (when selecting new emotion for mapping) - $.each(self.modules(), function(idx, mod) { - mod.updateDofVisualisation(mapIndex, updateRobot); - }); - } else { - // Update single module (when changing mapping) - self.selectedModule().updateDofVisualisation(mapIndex, updateRobot); - } - previousMapIndex = mapIndex; - // self.updateDofs(); - }; - - self.drawModules = function() { - $("image, svg").mousedown(function() { - virtualModel.resetSelect(); - // virtualModel.updateDofVisualisation(-1); - return false; - }); - - var dx = self.modelwidth / self.skin_image.width(); - var dy = self.modelheight / self.skin_image.height(); - - var modelWidth, - modelHeight; - - if (dx < dy) { - modelWidth = self.modelwidth; - modelHeight = self.skin_image.height() * dx; - } else { - modelWidth = self.skin_image.width() * dy; - modelHeight = self.modelheight; - } - - self.skin_image.size(modelWidth, modelHeight); - self.centerX = modelWidth / 2; - self.centerY = modelHeight / 2 - - // Divide in 2 - self.refSize = Math.max(modelWidth, modelHeight) / 2; - - if (self.config == undefined) { - return; - } - self.skin(self.config.skin); - self.name(self.config.name); - self.createModules(); - // Draw modules on top of the skin - $.each(self.modules(), function(idx, mod) { - mod.draw(); - }); - self.resetSelect(); - } - - self.resetSelect = function() { - if (!self.editable) { - return; - } - for (var i = 0; i < self.modules().length; i++) { - // self.modules()[i].image.selectize(false); - self.modules()[i].image.opacity(0.8); - // self.modules()[i].image.stroke('#000') - } - // if (self.isSelectedModule()) { - // self.updateDofVisualisation(-2, true); - // } - self.isSelectedModule(false); - }; - - // Create modules - self.createModules = function() { - self.modules.removeAll(); - if (self.config != undefined) { - $.each(self.config.modules, function(idx, mod) { - var newModule = new Module(mod.module, mod.name, mod.canvas.x, mod.canvas.y, mod.canvas.width, mod.canvas.height, mod.canvas.rotation); - if (mod.dofs.length == 0) { - newModule.dofs.push(new Dof('')); - } - $.each(mod.dofs, function(idx, dof) { - var newDof = new Dof(dof.name); - if (dof.servo != undefined) { - newDof.setServo(dof.servo.pin, dof.servo.mid, dof.servo.min, dof.servo.max); - } - if (dof.mapping != undefined) { - newDof.setMap(dof.mapping.neutral); - if (dof.mapping.poly != undefined) { - newDof.map().poly(dof.mapping.poly); - } - } - newModule.dofs.push(newDof); - }); - self.modules.push(newModule); - if (self.selectedModule() == undefined) { - self.setSelectedModule(newModule); - self.isSelectedModule(false); - } - }); - } else { - var newModule = new Module('', '', 0, 0, 0, 0, 0); - var newDof = new Dof(''); - newModule.dofs.push(newDof); - self.setSelectedModule(newModule); - self.isSelectedModule(false); - } - }; - - var newModule = new Module('', '', 0, 0, 0, 0, 0); - var newDof = new Dof(''); - newModule.dofs.push(newDof); - self.setSelectedModule(newModule); - self.isSelectedModule(false); - - if (self.editable) { - var index = 0; - self.svg_modules = SVG('modules_screen').size('100%', '60'); - // Draw available modules - if (self.allModules != undefined) { - $.each(self.allModules, function(idx, mod) { - // alert(mod); - // var moduleImage = self.svg.image('static/images/' + mod + '.svg').loaded(function() { - - var moduleImage = self.svg_modules.image('/static/images/modules/' + mod + '.svg').loaded(function() { - this.attr({ - preserveAspectRatio: "none", - type: mod - }); - var h = 50; - var w = 50; - var increase = 5; - this.size(w, h); - - this.move(index * (w + 2 * increase), increase); - index += 1; - - this.style('cursor', 'pointer'); - // this.selectize(); - // this.resize({snapToAngle:5}); - // allModules.push(this); - this.on('mouseover', function(e) { - this.size(w + increase, h + increase); - }); - this.on('mouseleave', function(e) { - this.size(w, h); - }); - this.on('click', function(e) { - var newModule = new Module(mod, mod, 0, 0, 0.2, 0.2, 0); - var tempModule = new module_function[mod](undefined, 0, 0, 0, 0); - for (var i = 0; i < tempModule.dofs.length; i++) { - var newDof = new Dof(tempModule.dofs[i]); - newModule.dofs.push(newDof); - } - self.setSelectedModule(newModule); - self.isSelectedModule(true); - newModule.draw(); - self.modules.push(newModule); - }); - }); - }); - } - } - // - // if (action_data != undefined && action_data.openfile) { - // self.loadFileData(action_data.openfile || ""); - // } else { - // self.init(); - // } -}; - -// $(document).ready(function() { -// // This makes Knockout get to work -// // virtualModel = new VirtualModel(); -// -// }); diff --git a/src/opsoro/apps/configurator/templates/configurator.html b/src/opsoro/apps/configurator/templates/configurator.html deleted file mode 100644 index 4950d77..0000000 --- a/src/opsoro/apps/configurator/templates/configurator.html +++ /dev/null @@ -1,151 +0,0 @@ -{% extends "app_base.html" %} - -{% block app_toolbar %} - {% include "toolbar/_file_operations.html" %} - {% include "toolbar/_file_set_default.html" %} -{% endblock %} - -{% block head %} - - - - -{% endblock %} - -{% block app_content %} - - -
-
-
- - Robot: - - - - - Grid size: - - - - - - - - Skin: - - - - - - Modules: - -
-
-
-
-
-
- - Module: - - - - - - - - Name: - - - Width: - - - - Height: - - - - - Dofs: - - - - - -
- - Name: - - - - - - Servo: - -
- - Pin: - - - - - Mid: - - - Min: - - - Max: - -
- - - Mapping: - -
- - Neutral: - - -
-
-
-
-
- - -{% endblock %} - -{% block app_scripts %} - - - - -{% endblock %} - -{% block app_modals %} - - -{% endblock %} diff --git a/src/opsoro/apps/configurator/templates/configurator_new.html b/src/opsoro/apps/configurator/templates/configurator_new.html deleted file mode 100644 index a287230..0000000 --- a/src/opsoro/apps/configurator/templates/configurator_new.html +++ /dev/null @@ -1,145 +0,0 @@ -{% extends "app_base.html" %} - -

HIIIII

-{% block app_head %} - - - - - -{% endblock %} - -{% block app_toolbar %} - -
- Save -
-{% endblock %} - -{% block app_content %} -
-
-
-
- - Robot: - - - - - Grid size: - - - - - - - - Skin: - - - - - - Modules: - -
-
-
-
-
-
- - Module: - - - - - - - - Name: - - - Width: - - - - Height: - - - - - Dofs: - - - - - -
- - Name: - - - - - - Servo: - -
- - Pin: - - - - - Mid: - - - Min: - - - Max: - -
- - - Mapping: - -
- - Neutral: - - -
-
-
-
-
-
- -{% endblock %} - -{% block app_scripts %} - -{% endblock %} - -{% block app_modals %}{% endblock %} diff --git a/src/opsoro/apps/configurator/templates/configurator_old.html b/src/opsoro/apps/configurator/templates/configurator_old.html deleted file mode 100644 index 64d001b..0000000 --- a/src/opsoro/apps/configurator/templates/configurator_old.html +++ /dev/null @@ -1,121 +0,0 @@ -{% extends "app_base.html" %} - - -{% block app_toolbar %} -{% include "toolbar/_file_operations.html" %} -{% endblock %} - -{% block head %} - - - - - - - - - - -{% endblock %} - -{% block app_content %} - - -
-
-
- - Robot: - - - - Grid size: - - - - - Skin: - - - - - Modules: -
-
-
- - - -
-
- - Module: - - - Name: - - Rotate: - - - - - Dofs: - - - - -
- - Name: - - - - Servo: -
- - Pin: - - - Mid: - Min: - Max: -
- - Mapping: -
- Neutral: - -
-
-
-
-
- - -{% endblock %} - -{% block app_scripts %} - - - - - -{% endblock %} - -{% block app_modals %} - - - -{% endblock %} diff --git a/src/opsoro/apps/expression_configurator/__init__.py b/src/opsoro/apps/expression_configurator/__init__.py new file mode 100644 index 0000000..f80b6c1 --- /dev/null +++ b/src/opsoro/apps/expression_configurator/__init__.py @@ -0,0 +1,118 @@ +from __future__ import with_statement + +import glob +import os +from functools import partial + +import yaml +from flask import Blueprint, render_template, request + +from opsoro.console_msg import * +from opsoro.expression import Expression +from opsoro.robot import Robot + +try: + from yaml import CLoader as Loader +except ImportError: + from yaml import Loader + + +def constrain(n, minn, maxn): return max(min(maxn, n), minn) + + +config = { + 'full_name': 'Expression Configurator', + 'author': 'OPSORO', + 'icon': 'fa-smile-o', + 'color': 'red', + 'difficulty': 3, + 'tags': ['design', 'setup', 'expression', 'configuration'], + 'allowed_background': False, + 'multi_user': True, + 'connection': Robot.Connection.OFFLINE, + 'activation': Robot.Activation.AUTO_NOT_ALIVE, +} +config['formatted_name'] = config['full_name'].lower().replace(' ', '_') + +get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) + + +def setup_pages(opsoroapp): + app_bp = Blueprint(config['formatted_name'], __name__, template_folder='templates', static_folder='static') + + @app_bp.route('/', methods=['GET']) + @opsoroapp.app_view + def index(): + data = { + 'actions': {}, + 'data': [], + 'modules': [], + 'svg_codes': {}, + 'configs': {}, + 'specs': {}, + 'skins': [], + 'expressions': {}, + 'icons': [], + } + + # action = request.args.get('action', None) + # if action != None: + data['actions']['openfile'] = request.args.get('f', None) + + modules_folder = '../../modules/' + modules_static_folder = '../../server/static/modules/' + icons_static_folder = '../../server/static/images/emojione/' + + # get modules + filenames = [] + filenames.extend(glob.glob(get_path(modules_folder + '*/'))) + for filename in filenames: + module_name = filename.split('/')[-2] + data['modules'].append(module_name) + with open(get_path(modules_folder + module_name + '/specs.yaml')) as f: + data['specs'][module_name] = yaml.load(f, Loader=Loader) + + with open(get_path(modules_static_folder + module_name + '/front.svg')) as f: + data['svg_codes'][module_name] = f.read() + + data['configs'] = Robot.config + data['expressions'] = Expression.expressions + + filenames = [] + filenames.extend(glob.glob(get_path(icons_static_folder + '*.svg'))) + for filename in filenames: + data['icons'].append(os.path.splitext(os.path.split(filename)[1])[0]) + + # filenames = [] + # filenames.extend(glob.glob(get_path('static/images/skins/*.svg'))) + # for filename in filenames: + # data['skins'].append(os.path.splitext(os.path.split(filename)[1])[0]) + + return opsoroapp.render_template(config['formatted_name'] + '.html', **data) + + @opsoroapp.app_socket_message('setDofs') + def s_setDofs(conn, data): + dof_values = data.pop('dofs', None) + + if dof_values is None: + conn.send_data('error', {'message': 'No valid pin or value given.'}) + return + + if type(dof_values) is dict: + Robot.set_dof_values(dof_values) + elif type(dof_values) is list: + Robot.set_dof_list(dof_values) + + opsoroapp.register_app_blueprint(app_bp) + + +def setup(opsoroapp): + pass + + +def start(opsoroapp): + pass + + +def stop(opsoroapp): + pass diff --git a/src/opsoro/apps/expression_configurator/static/app.css b/src/opsoro/apps/expression_configurator/static/app.css new file mode 100644 index 0000000..61df12f --- /dev/null +++ b/src/opsoro/apps/expression_configurator/static/app.css @@ -0,0 +1,115 @@ +.model { + padding: 0; + margin-top: -30px; +} +.config-settings { + margin-top: 0; + padding: 0; +} +.expressions { + margin-top: 0rem; + padding: 0 0 0 1rem; + /*height: 20rem;*/ + /*border: 1px solid silver;*/ + height: 100%; +} +.expression { + margin: 0 0 .5rem; + padding: 0; + /*border: 1rem solid transparent;*/ + background-color: transparent; + color: #000; + cursor: pointer; + height: 100%; +} +.expression:hover { + color: #000; + background-color: #B0FFCB; +} +.selected, +.selected:hover { + background-color: #00E58B; +} +.expression .emoji { + margin: .3rem .3rem 0; +} +.text { + font-size: .9rem; + display: inline-block; + width: 100%; + padding: .3rem; + margin: 0; +} +.expression .text { + +} +.eicon { + padding: 0.5rem 0; + margin: 0; +} +.eicon .emoji { + margin: 0; +} +.add-button { + margin: .5rem 0 0; + padding: .5rem 1.3rem; + color: #00E58B; + background-color: transparent; +} +.change-button { + border: 1px solid silver; +} +.change-button:hover .text { + background-color: #333; +} +.change-button .text { + background-color: #666; + color: #FFF; +} +.add-button span { + padding: 0; + margin: 0; + width: 3rem; + height: 3rem; + font-size: 3rem; + border: 1px solid silver; + border-radius: 1.5rem; + display: block; + background-color: transparent; +} +.add-button:hover { + background-color: transparent; +} +.add-button:hover span { + color: #FFF; + background-color: #00E58B; +} +.module-settings { + padding: 0 .5rem 0 0; +} +.module-settings select { + padding: 0 1.5rem 0 .1rem; + font-size: .9rem; + height: 1.5rem; + margin: 0; +} +.module-settings input { + padding: 0; + font-size: .9rem; + height: 1.5rem; + margin: 0; +} +.module-settings .slider { + margin: .5rem .5rem 0 0; +} +.dof-settings { + font-size: .85rem; + border-bottom: 1px solid silver; + padding: .5rem 0; +} +.dof-settings:last-child { + border-style: none; +} +.settings-item { + padding: 0; +} diff --git a/src/opsoro/apps/expression_configurator/static/app.js b/src/opsoro/apps/expression_configurator/static/app.js new file mode 100644 index 0000000..222dee9 --- /dev/null +++ b/src/opsoro/apps/expression_configurator/static/app.js @@ -0,0 +1,288 @@ + + + +var select_dof = function(index) { + var self = this; + self.index = index || 0; + self.name = ko.observable(virtualModel.selected_module.dofs[self.index].name); + self.name_formatted = ko.observable(virtualModel.selected_module.dofs[self.index].name_formatted); + + self.pin = virtualModel.selected_module.dofs[self.index].servo.pin; + + self.value_value = ko.observable(virtualModel.selected_module.dofs[self.index].value); + self.value = ko.pureComputed({ + read: function () { + return self.value_value(); + }, + write: function (value) { + if (value == self.value_value()) { return; } + + self.value_value(value); + virtualModel.selected_module.dofs[self.index].value = parseFloat(value); + + virtualModel.selected_module.update_dofs(); + + if (model.selected_expression().selected()) { + if (self.pin >= 0) { + model.selected_expression().dof_values[self.pin] = self.value_value(); + } + if (model.selected_expression().poly_index() >= 0) { + virtualModel.selected_module.dofs[self.index].update_single_poly(model.selected_expression().poly_index()); + } + model.selected_expression().update(); + } + }, + owner: self + }); +}; + +var Expression = function(name, filename, poly_index, dof_values) { + var self = this; + self.name = new ClickToEdit(name, 'Untitled'); + self.default = '2753'; + self.filename = ko.observable(filename || self.default); + self.poly_index = ko.observable(poly_index || -1); + self.default_dofs = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]; + self.dof_values = dof_values || self.default_dofs; + self.selected = ko.observable(false); + + if (self.poly_index() >= 0) { + if (self.dof_values == self.default_dofs) { + // Update dof values with module poly values + for (var i = 0; i < virtualModel.modules.length; i++) { + var mod = virtualModel.modules[i]; + for (var j = 0; j < mod.dofs.length; j++) { + var dof = mod.dofs[j]; + if (dof.servo.pin >= 0) { + self.dof_values[dof.servo.pin] = dof.poly[self.poly_index()]; + } + } + } + } else { + // Update module poly values with dof values + for (var i = 0; i < virtualModel.modules.length; i++) { + var mod = virtualModel.modules[i]; + for (var j = 0; j < mod.dofs.length; j++) { + var dof = mod.dofs[j]; + if (dof.servo.pin >= 0) { + dof.value = self.dof_values[dof.servo.pin]; + dof.update_single_poly(self.poly_index()); + } + } + } + } + + } + + self.update = function() { + if (!self.selected()) { return; } + if(connReady) { + conn.send(JSON.stringify({ + action: "setDofs", + dofs: self.dof_values, + })); + } + }; + + self.get_config = function() { + var config = {}; + config['name'] = self.name.value(); + config['filename'] = self.filename(); + config['dofs'] = self.dof_values; + if (self.poly_index() >= 0) { + config['poly'] = self.poly_index(); + } + return config; + }; + + self.select = function() { + if (self.selected()) { return; } + for (var i = 0; i < model.expressions().length; i++) { + model.expressions()[i].selected(false); + } + model.selected_expression(self); + + if (self.poly_index() < 0) { + // Use dof values + virtualModel.update_dofs(self.dof_values); + } else { + // Use dof poly + virtualModel.apply_poly(self.poly_index()); + } + self.selected(true); + self.update(); + }; + self.update_icon = function(icon) { + self.filename(icon); + $("#PickIconModal").foundation("close"); + }; + self.change_icon = function() { + // Reset icons + for (var i = 0; i < model.used_icons.length; i++) { + if (model.used_icons[i] == self.default) { + continue; + } + model.icons.push(model.used_icons[i]); + } + model.used_icons = [] + for (var i = 0; i < model.expressions().length; i++) { + model.icons.remove(model.expressions()[i].filename()); + model.used_icons.push(model.expressions()[i].filename()); + } + model.icons.sort(); + // View icons + $("#PickIconModal").foundation("open"); + }; + self.remove = function() { + model.expressions.remove(self); + if (model.expressions().length > 0) { + model.expressions()[0].select(); + } + }; + +}; + +var select_module = function() { + var self = this; + self.name = new ClickToEdit(virtualModel.selected_module.name, 'Untitled'); + self.code = ko.observable(virtualModel.selected_module.code); + self.dofs = ko.observableArray(); + + self.rotate = function() { + virtualModel.selected_module.rotate(); + }; + self.remove = function() { + for (var i = 0; i < self.dofs().length; i++) { + model.update_servo_pins(self.dofs()[i].pin_value(), -1); + } + virtualModel.selected_module.remove(); + }; + + self.name_changed = ko.computed(function () { + var value = self.name.value(); + virtualModel.selected_module.name = value; + return value; + }, self); + + self.refresh = function() { + self.dofs.removeAll(); + + if (virtualModel.selected_module == undefined) { return; } + + self.name.value(virtualModel.selected_module.name); + for (var i = 0; i < virtualModel.selected_module.dofs.length; i++) { + self.dofs.push(new select_dof(i)); + } + }; + self.refresh(); +}; + +var AppModel = function() { + var self = this; + // Setup link with virtual model + self.selected_module = ko.observable(); + + self.change_handler = function() { + if (virtualModel.selected_module == undefined) { + self.selected_module(undefined); + return; + } + self.selected_module(new select_module()); + Foundation.reInit($('[data-slider]')); + }; + virtualModel.change_handler = self.change_handler; + + self.icons = ko.observableArray(icon_data); + self.used_icons = []; + + self.expressions = ko.observableArray(); + self.selected_expression = ko.observable(); + self.add_expression = function(name, filename, poly_index, dof_values) { + if (typeof name == 'object') { + name = 'custom'; + filename = ''; + } + name = name || ''; + var exp = new Expression(name, filename, poly_index, dof_values); + self.expressions.push(exp); + if (filename == '') { + exp.change_icon(); + self.expressions()[self.expressions().length-1].select(); + } + }; + self.get_config = function() { + var config = []; + if (self.expressions() == undefined) { return config; } + + for (var i = 0; i < self.expressions().length; i++) { + config.push(self.expressions()[i].get_config()); + } + return config; + }; + self.set_config = function(config) { + self.expressions.removeAll(); + if (config != undefined && config.length > 0) { + for (var i = 0; i < config.length; i++) { + var dat = config[i]; + self.add_expression(dat.name, dat.filename, dat.poly, dat.dofs); + } + } else { + self.add_expression('', '1f610'); + } + self.expressions()[0].selected(true); + self.selected_expression(self.expressions()[0]); + }; + + self.update_icon = function(icon) { + if (self.selected_expression != undefined) { + self.selected_expression().update_icon(icon); + } + }; + + self.fileIsModified = ko.observable(false); + self.fileStatus = ko.observable(''); + self.fileExtension = '.conf'; + + self.newFileData = function() { + self.set_config([]); + self.fileIsModified(false); + }; + self.loadFileData = function(data) { + var dataobj = undefined; + if (data == undefined) { + } else { + dataobj = JSON.parse(data); + } + // Load script + self.set_config(dataobj); + self.fileIsModified(false); + return true; + }; + self.saveFileData = function() { + file_data = self.get_config(); + self.fileIsModified(false); + return ko.toJSON(file_data, null, 2); + }; + self.setDefault = function() { + robotSendReceiveExpressions(self.get_config()); + robotSendReceiveConfig(virtualModel.get_config()); + }; + + self.init = function() { + if (self.expressions() == undefined || self.expressions().length < 2) { + if (self.expressions()[0].name.value() == '') { + self.set_config(expression_data); + } + } + }; +}; + +var model; +$(document).ready(function() { + model = new AppModel(); + ko.applyBindings(model); + setTimeout(model.init, 500); + + config_file_operations("", model.fileExtension, model.saveFileData, model.loadFileData, model.newFileData); + +}); diff --git a/src/opsoro/apps/expression_configurator/templates/expression_configurator.html b/src/opsoro/apps/expression_configurator/templates/expression_configurator.html new file mode 100644 index 0000000..2a12294 --- /dev/null +++ b/src/opsoro/apps/expression_configurator/templates/expression_configurator.html @@ -0,0 +1,125 @@ +{% extends "app_base.html" %} + +{% block app_toolbar %} + {% include "toolbar/_file_operations.html" %} + {% include "toolbar/_file_set_default.html" %} +{% endblock %} + +{% block head %} + +{% endblock %} + +{% block app_content %} +
+
+
+
+
+
+ +
+ + +
+ +
+ +
+
+
+
+ + +   + + + + +
+
+
+ + {{ _('Change') }} +
+ +
+
+
+
+
+
+ + + +
+
+ +
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ +
+
+
+

{{ _('This DOF has no servo pin selected.') }}

+
+
+
+
+
+
+
+
+
+{% endblock %} + +{% block app_scripts %} + + + + + + + {% for module in modules %} + + + {% endfor %} + +{% endblock %} + +{% block app_modals %} + +
+
+
+
+ +
+
+
+
+ +{% endblock %} diff --git a/src/opsoro/apps/lua_scripting/__init__.py b/src/opsoro/apps/lua_scripting/__init__.py index 6706327..018d33d 100644 --- a/src/opsoro/apps/lua_scripting/__init__.py +++ b/src/opsoro/apps/lua_scripting/__init__.py @@ -1,26 +1,30 @@ -from flask import Blueprint, render_template, request, send_from_directory -from werkzeug import secure_filename -from functools import partial -import os import glob +import os import time -import lupa +from functools import partial + +from flask import Blueprint, render_template, request, send_from_directory +from werkzeug import secure_filename + +from opsoro.robot import Robot + +# import lupa from .scripthost import ScriptHost -config = {'full_name': 'Lua Scripting', - 'icon': 'fa-terminal', - 'color': '#36c9ff', - 'allowed_background': True, - 'robot_state': 1} +config = { + 'full_name': 'Lua Scripting', + 'author': 'OPSORO', + 'icon': 'fa-terminal', + 'color': 'orange', + 'difficulty': 7, + 'tags': ['lua', 'code', 'script'], + 'allowed_background': True, + 'multi_user': False, + 'connection': Robot.Connection.OFFLINE, + 'activation': Robot.Activation.AUTO +} config['formatted_name'] = config['full_name'].lower().replace(' ', '_') -# robot_state: -# 0: Manual start/stop -# 1: Start robot automatically (alive feature according to preferences) -# 2: Start robot automatically and enable alive feature -# 3: Start robot automatically and disable alive feature - -clientconn = None sh = None script = '' script_name = None @@ -30,58 +34,37 @@ def add_console(message, color='#888888', icon=None): - global clientconn - if clientconn: - clientconn.send_data('addConsole', {'message': message, - 'color': color, - 'icon': icon}) + Users.send_app_data(config['formatted_name'], 'addConsole', {'message': message, 'color': color, 'icon': icon}) def send_started(): - global clientconn - if clientconn: - clientconn.send_data('scriptStarted', {}) + Users.send_app_data(config['formatted_name'], 'scriptStarted', {}) def send_stopped(): - global clientconn - if clientconn: - clientconn.send_data('scriptStopped', {}) + Users.send_app_data(config['formatted_name'], 'scriptStopped', {}) def init_ui(): - global clientconn - if clientconn: - clientconn.send_data('initUI', {}) + Users.send_app_data(config['formatted_name'], 'initUI', {}) def ui_add_button(name, caption, icon, toggle=False): - global clientconn - if clientconn: - clientconn.send_data('UIAddButton', {'name': name, - 'caption': caption, - 'icon': icon, - 'toggle': toggle}) + Users.send_app_data(config['formatted_name'], 'UIAddButton', {'name': name, 'caption': caption, 'icon': icon, 'toggle': toggle}) def ui_add_key(key): - global clientconn global sh - if clientconn: - valid_keys = ['up', 'down', 'left', 'right', 'space'] - valid_keys += list('abcdefghijklmnopqrstuvwxyz') - if key in valid_keys: - clientconn.send_data('UIAddKey', {'key': key}) - else: - sh.generate_lua_error('Invalid key: %s' % key) + valid_keys = ['up', 'down', 'left', 'right', 'space'] + valid_keys += list('abcdefghijklmnopqrstuvwxyz') + if key in valid_keys: + Users.send_app_data(config['formatted_name'], 'UIAddKey', {'key': key}) + else: + sh.generate_lua_error('Invalid key: %s' % key) def setup_pages(opsoroapp): - luascripting_bp = Blueprint( - config['formatted_name'], - __name__, - template_folder='templates', - static_folder='static') + luascripting_bp = Blueprint(config['formatted_name'], __name__, template_folder='templates', static_folder='static') @luascripting_bp.route('/', methods=['GET']) @opsoroapp.app_view @@ -103,7 +86,7 @@ def index(): data['actions'][action] = request.args.get('param', None) if sh.is_running: - data['script'] = script #sh._script + data['script'] = script # sh._script else: with open(get_path('static/boilerplate.lua'), 'r') as f: data['script'] = f.read() @@ -147,16 +130,6 @@ def stopscript(): return {'status': 'error', 'message': 'There is no active script to stop.'} - @opsoroapp.app_socket_connected - def s_connected(conn): - global clientconn - clientconn = conn - - @opsoroapp.app_socket_disconnected - def s_disconnected(conn): - global clientconn - clientconn = None - @opsoroapp.app_socket_message('keyDown') def s_key_down(conn, data): global sh diff --git a/src/opsoro/apps/lua_scripting/scripthost.py b/src/opsoro/apps/lua_scripting/scripthost.py index 75d4e65..692935d 100644 --- a/src/opsoro/apps/lua_scripting/scripthost.py +++ b/src/opsoro/apps/lua_scripting/scripthost.py @@ -1,25 +1,27 @@ from __future__ import division -import time import sys +import time import traceback + import lupa -from opsoro.hardware import Hardware -from opsoro.expression import Expression from opsoro.animate import Animate, AnimatePeriodic +from opsoro.expression import Expression +from opsoro.hardware import Hardware +from opsoro.robot import Robot from opsoro.sound import Sound from opsoro.stoppable_thread import StoppableThread def callback(fn): """ - Helper function to support callbacks in classes. Returns the first parameter - if it is callable, returns a dummy function otherwise. + Helper function to support callbacks in classes. Returns the first parameter + if it is callable, returns a dummy function otherwise. - Usage: - callback(self.on_my_callback)() - """ + Usage: + callback(self.on_my_callback)() + """ def do_nothing(*args, **kwargs): pass @@ -56,9 +58,9 @@ def __del__(self): def setup_runtime(self): """ - Creates a new lua runtime and initializes all globals. Used by - start_script(), should not be called directly. - """ + Creates a new lua runtime and initializes all globals. Used by + start_script(), should not be called directly. + """ # Create new lua instance self.runtime = lupa.LuaRuntime(unpack_returned_tuples=True) @@ -75,6 +77,7 @@ def setup_runtime(self): g["Sound"] = Sound g["Expression"] = Expression + g["Robot"] = Robot g["Hardware"] = LuaHardware(self.runtime) g["Animate"] = LuaAnimate g["AnimatePeriodic"] = LuaAnimatePeriodic @@ -98,10 +101,10 @@ def setup_runtime(self): def start_script(self, script): """ - Start a new script. This method will create a new runtime, pass the - script to the runtime, and start a thread to continuously call the - script's loop function. Can only be used if no other script is running. - """ + Start a new script. This method will create a new runtime, pass the + script to the runtime, and start a thread to continuously call the + script's loop function. Can only be used if no other script is running. + """ # Check if running if self.is_running: raise RuntimeError("A script is already running!") @@ -119,31 +122,31 @@ def start_script(self, script): def stop_script(self): """ - Attempts to stop the current script. Returns immediately if no script is - running. If a script is running, this method will send a stop signal to - to the script thread, and then block until the thread is stopped. Note - that the thread's stopped condition is only checked during sleep() and - at the end of loop() calls, this function will not stop infinite loops. - """ + Attempts to stop the current script. Returns immediately if no script is + running. If a script is running, this method will send a stop signal to + to the script thread, and then block until the thread is stopped. Note + that the thread's stopped condition is only checked during sleep() and + at the end of loop() calls, this function will not stop infinite loops. + """ if self.is_running and self.runtime_thread is not None: self.runtime_thread.stop() self.runtime_thread.join() def generate_lua_error(self, message): """ - If a script is running, this method will generate an error inside the - script. Useful to signal script errors (e.g. bad parameter) to the user. - """ + If a script is running, this method will generate an error inside the + script. Useful to signal script errors (e.g. bad parameter) to the user. + """ if self.is_running and self.runtime is not None: g = self.runtime.globals() g["error"](message) def _report_error(self, e): """ - Helper function that prefixes the type of error to the exception, and - then sends the error message to the application through the on_error - callback. - """ + Helper function that prefixes the type of error to the exception, and + then sends the error message to the application through the on_error + callback. + """ if type(e) == lupa.LuaSyntaxError: callback(self.on_error)("Syntax error: %s" % str(e)) elif type(e) == lupa.LuaError: @@ -157,28 +160,28 @@ def _report_error(self, e): def _sleep(self, time): """ - Lua API - Sleep function that pauses the thread for a number of seconds. This - sleep function will return immediately if the thread's stop flag is set. - This means that loop function should come to an end instantaneously, - after which the thread is ended. - """ + Lua API + Sleep function that pauses the thread for a number of seconds. This + sleep function will return immediately if the thread's stop flag is set. + This means that loop function should come to an end instantaneously, + after which the thread is ended. + """ if self.runtime_thread is not None: self.runtime_thread.sleep(time) def _rising_edge(self, identifier, status): """ - Lua API - Helper function to detect a rising edge of a signal (e.g. button, key, - capacitive touch pad, etc). Identifier is an arbitrary string that is - used to distinguish between different signals. Internally, it's used as - a key for the dictionary that keeps track of different signals. - - Usage: - if rising_edge("mybutton", UI:is_key_pressed("up")) then - -- Do something - end - """ + Lua API + Helper function to detect a rising edge of a signal (e.g. button, key, + capacitive touch pad, etc). Identifier is an arbitrary string that is + used to distinguish between different signals. Internally, it's used as + a key for the dictionary that keeps track of different signals. + + Usage: + if rising_edge("mybutton", UI:is_key_pressed("up")) then + -- Do something + end + """ last_status = False if identifier in self._rising_dict: last_status = self._rising_dict[identifier] @@ -188,17 +191,17 @@ def _rising_edge(self, identifier, status): def _falling_edge(self, identifier, status): """ - Lua API - Helper function to detect a falling edge of a signal (e.g. button, key, - capacitive touch pad, etc). Identifier is an arbitrary string that is - used to distinguish between different signals. Internally, it's used as - a key for the dictionary that keeps track of different signals. - - Usage: - if falling_edge("mybutton", UI:is_key_pressed("up")) then - -- Do something - end - """ + Lua API + Helper function to detect a falling edge of a signal (e.g. button, key, + capacitive touch pad, etc). Identifier is an arbitrary string that is + used to distinguish between different signals. Internally, it's used as + a key for the dictionary that keeps track of different signals. + + Usage: + if falling_edge("mybutton", UI:is_key_pressed("up")) then + -- Do something + end + """ last_status = False if identifier in self._falling_dict: last_status = self._falling_dict[identifier] @@ -216,13 +219,13 @@ def _remove_lua_overlays(self): def _run(self): """ - Called by the worker thread when the script is run. First attempts to - call the script's setup function, then continuously calls the loop - function. When the thread's stop flag is set, the loop breaks and the - thread attempts to run the quit function. At any time, if the runtime - encounters an error, the script is stopped, and the on_error and on_stop - callbacks are triggered. - """ + Called by the worker thread when the script is run. First attempts to + call the script's setup function, then continuously calls the loop + function. When the thread's stop flag is set, the loop breaks and the + thread attempts to run the quit function. At any time, if the runtime + encounters an error, the script is stopped, and the on_error and on_stop + callbacks are triggered. + """ time.sleep(0.05) # delay @@ -276,60 +279,60 @@ def __init__(self): def init(self): """ - Lua API - Requests the application to initialize the UI through the on_init - callback. The request is typically passed on to the client via websocket. - """ + Lua API + Requests the application to initialize the UI through the on_init + callback. The request is typically passed on to the client via websocket. + """ callback(self.on_init)() def add_button(self, name, caption, icon, toggle=False): """ - Lua API - Adds a button to the client's UI. Request to client is sent through the - on_add_button callback. - """ + Lua API + Adds a button to the client's UI. Request to client is sent through the + on_add_button callback. + """ callback(self.on_add_button)(name, caption, icon, toggle) def add_key(self, key): """ - Lua API - Adds a key listener to the client's UI. - Request to client is sent through the on_add_key callback. - """ + Lua API + Adds a key listener to the client's UI. + Request to client is sent through the on_add_key callback. + """ callback(self.on_add_key)(key) def set_key_status(self, key, status): """ - Used by the app to set the status of a key. Typically, key events are - captured on the clientside using javascript and are transfered to the - application using a websocket. The application is responsible for - updating the key status in the ScriptUI class. - """ + Used by the app to set the status of a key. Typically, key events are + captured on the clientside using javascript and are transfered to the + application using a websocket. The application is responsible for + updating the key status in the ScriptUI class. + """ self._keys[key] = status def set_button_status(self, button, status): """ - Used by the app to set the status of a button. Typically, button events - are captured on the clientside using javascript and are transfered to - the application using a websocket. The application is responsible for - updating the button status in the ScriptUI class. - """ + Used by the app to set the status of a button. Typically, button events + are captured on the clientside using javascript and are transfered to + the application using a websocket. The application is responsible for + updating the button status in the ScriptUI class. + """ self._buttons[button] = status def is_button_pressed(self, name): """ - Lua API - Returns True if a button is pressed, False otherwise. - """ + Lua API + Returns True if a button is pressed, False otherwise. + """ if name in self._buttons: return self._buttons[name] return False def is_key_pressed(self, key): """ - Lua API - Returns True if a key is pressed, False otherwise. - """ + Lua API + Returns True if a key is pressed, False otherwise. + """ if key in self._keys: return self._keys[key] return False @@ -355,23 +358,23 @@ def ignore_one(ign, *args, **kwargs): return attr def cap_get_filtered_data(self): - return self.runtime.table_from(Hardware.cap_get_filtered_data()) + return self.runtime.table_from(Hardware.Capacitive.get_filtered_data()) def cap_get_baseline_data(self): - return self.runtime.table_from(Hardware.cap_get_baseline_data()) + return self.runtime.table_from(Hardware.Capacitive.get_baseline_data()) def ana_read_all_channels(self): - return self.runtime.table_from(Hardware.cap_get_baseline_data()) + return self.runtime.table_from(Hardware.Capacitive.get_baseline_data()) def spi_command(self, cmd, params=None, returned=0, delay=0): if params is not None: params = list(params.values()) return self.runtime.table_from( - Hardware.spi_command(cmd, params, returned, delay)) + Hardware.SPI.command(cmd, params, returned, delay)) def servo_set_all(self, pos_list): pos_list = list(pos_list.values()) - Hardware.servo_set_all(post_list) + Hardware.Servo.set_all(post_list) class LuaAnimate(object): @@ -402,8 +405,8 @@ def new(cls, times, values): def __call__(self): return self._a() -### NEW NEW NEW and untested -### install pyserial +# NEW NEW NEW and untested +# install pyserial # TODO: add to scripthost # import serial # import serial.tools.list_ports diff --git a/src/opsoro/apps/lua_scripting/static/ono-lua-highlighter.js b/src/opsoro/apps/lua_scripting/static/ono-lua-highlighter.js index ce4faf0..c6f7576 100644 --- a/src/opsoro/apps/lua_scripting/static/ono-lua-highlighter.js +++ b/src/opsoro/apps/lua_scripting/static/ono-lua-highlighter.js @@ -13,14 +13,14 @@ var OnoLuaHighlightRules = function() { "init|add_button|add_key|is_button_pressed|is_key_pressed|"+ // Hardware class methods - "ping|reset|led_on|led_off|i2c_detect|i2c_read8|i2c_write8|i2c_read16|"+ - "i2C_write16|servo_init|servo_enable|servo_disable|servo_neutral|"+ - "servo_set|servo_set_all|cap_init|cap_set_threshold|"+ - "cap_get_filtered_data|cap_get_baseline_data|cap_get_touched|"+ - "cap_set_gpio_pinmode|cap_read_gpio|cap_write_gpio|neo_init|neo_enable|"+ - "neo_disable|neo_set_brightness|neo_show|neo_set_pixel|neo_set_range|"+ - "neo_set_all|neo_set_pixel_hsv|neo_set_range_hsv|neo_set_all_hsv|"+ - "ana_read_channel|ana_read_all_channels|"+ + "ping|reset|led_on|led_off|I2C:detect|I2C:read8|I2C:write8|I2C:read16|"+ + "I2C:write16|Servo:init|Servo:enable|Servo:disable|Servo:neutral|"+ + "Servo:set|Servo:set_all|Capacitive:init|Capacitive:set_threshold|"+ + "Capacitive:get_filtered_data|Capacitive:get_baseline_data|Capacitive:get_touched|"+ + "Capacitive:set_gpio_pinmode|Capacitive:read_gpio|Capacitive:write_gpio|Neopixel:init|Neopixel:enable|"+ + "Neopixel:disable|Neopixel:set_brightness|Neopixel:show|Neopixel:set_pixel|Neopixel:set_range|"+ + "Neopixel:set_all|Neopixel:set_pixel_hsv|Neopixel:set_range_hsv|Neopixel:set_all_hsv|"+ + "Analog:read_channel|Analog:read_all_channels|"+ // Sound class methods "say_tts|play_file|"+ diff --git a/src/opsoro/apps/lua_scripting/templates/lua_scripting.html b/src/opsoro/apps/lua_scripting/templates/lua_scripting.html index ddf51de..373fe85 100644 --- a/src/opsoro/apps/lua_scripting/templates/lua_scripting.html +++ b/src/opsoro/apps/lua_scripting/templates/lua_scripting.html @@ -1,50 +1,16 @@ {% extends "app_base.html" %} -{% block head %} +{% block app_head %} {% endblock %} {% block app_toolbar %} - {% include "toolbar/_file_operations.html" %} - {% include "toolbar/_script_operations.html" %} {% include "toolbar/_expand_collapse.html" %} + {% include "toolbar/_script_operations.html" %} + {% include "toolbar/_file_operations.html" %} {% endblock %} {% block app_content %} - - -
{{ script }}
@@ -145,25 +111,10 @@ }); // Setup websocket connection. - var conn = null; - var connReady = false; - conn = new SockJS("http://" + window.location.host + "/sockjs"); - - conn.onopen = function () { - console.log("SockJS connected."); - $.ajax({url: "/sockjstoken", cache: false}).done(function (data) { - conn.send(JSON.stringify({action: "authenticate", token: data})); - connReady = true; - console.log("SockJS authenticated."); - }); - }; - - conn.onmessage = function (e) { - var msg = $.parseJSON(e.data); - - switch (msg.action) { + app_socket_handler = function(data) { + switch (data.action) { case "addConsole": - addConsole(msg.message, msg.color, msg.icon); + addConsole(data.message, data.color, data.icon); break; case "scriptStarted": addConsole("Script started.", "#888888", "fa-play"); @@ -195,9 +146,9 @@ } var li = "
  • "; - li += ""; - li += "
    " - li += msg.caption; + li += "
    "; + li += "
    " + li += data.caption; li += "
    "; li += "
  • "; $("#ScriptUIButtons").append(li); @@ -240,15 +191,15 @@ "z": 90 }; - if (msg.key == "space") { + if (data.key == "space") { // Key is space bar - div = "
     
    "; - } else if (arrows.indexOf(msg.key) > -1) { + div = "
     
    "; + } else if (arrows.indexOf(data.key) > -1) { // Key is an arrow - div = "
    "; - } else if (alphabet.indexOf(msg.key) > -1) { + div = "
    "; + } else if (alphabet.indexOf(data.key) > -1) { // Key is a letter - div = "
    " + msg.key + "
    "; + div = "
    " + data.key + "
    "; } else { return; } @@ -265,12 +216,6 @@ } }; - conn.onclose = function () { - console.log("SockJS disconnected."); - conn = null; - connReady = false; - }; - // Don't submit form on enter $("input,select").keypress(function (evt) { return evt.keyCode != 13; @@ -302,7 +247,7 @@ boilerplate = data; }); - self.init = function () { + self.newFileData = function () { editor.setValue(boilerplate); editor.gotoLine(1, 0, false); @@ -431,22 +376,16 @@ }); self.scriptUI = function () { - $("#ScriptUIModal").foundation("reveal", "open"); + $("#ScriptUIModal").foundation("open"); }; - if (action_data.openfile) { - self.loadFileData(action_data.openfile || ""); - } else { - self.init(); - } - }; // This makes Knockout get to work var model = new Model(); ko.applyBindings(model); model.fileIsModified(false); - config_file_operations("scripts", model.fileExtension(), model.saveFileData, model.loadFileData, model.init); + config_file_operations("", model.fileExtension(), model.saveFileData, model.loadFileData, model.newFileData); }); @@ -455,9 +394,9 @@ {% block app_modals %} -
    +
    - + diff --git a/src/opsoro/apps/opa/README b/src/opsoro/apps/opa/README new file mode 100644 index 0000000..318395c --- /dev/null +++ b/src/opsoro/apps/opa/README @@ -0,0 +1,11 @@ +Folder info: + scripts: + contains files the app can save/edit/use + static: + contains specific app files; javascript/css/yaml-settings/images/... + templates: + contains the apps main html file and also other html files the app uses + + +__init__.py: + Contains the server-side functionality of the app diff --git a/src/opsoro/apps/opa/__init__.py b/src/opsoro/apps/opa/__init__.py new file mode 100644 index 0000000..4990b62 --- /dev/null +++ b/src/opsoro/apps/opa/__init__.py @@ -0,0 +1,227 @@ +from __future__ import with_statement + +import json, datetime +import json,datetime + +import time +from threading import Thread, current_thread + +from flask import Blueprint, render_template, request, redirect, url_for, flash, send_from_directory, jsonify + +from opsoro.console_msg import * +from opsoro.hardware import Hardware +from opsoro.robot import Robot +from opsoro.expression import Expression +from opsoro.stoppable_thread import StoppableThread +from opsoro.sound import Sound +from opsoro.module.eye import Eye +from opsoro.preferences import Preferences +from functools import partial + +import os + +constrain = lambda n, minn, maxn: max(min(maxn, n), minn) +get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) + +clientconn = None + +config = { + 'full_name': 'personal assistant', + 'icon': 'fa-child', + 'color': 'green', + 'difficulty': 1, + 'tags': ['template', 'developer'], + 'allowed_background': False, + 'connection': Robot.Connection.OFFLINE, + 'activation': Robot.Activation.AUTO +} +config['formatted_name'] = 'opa' + +def setup_pages(server): + app_bp = Blueprint(config['formatted_name'], __name__, template_folder='templates', static_folder='static') + # Public function declarations + app_bp.add_url_rule('/demo', 'demo', server.app_api(demo), methods=['GET', 'POST']) + + + @app_bp.route('/') + @server.app_view + def index(): + data = { + 'actions': {}, + 'data': [], + 'activity': [], + } + + action = request.args.get('action', None) + if action != None: + data['actions'][action] = request.args.get('param', None) + Robot.sleep() + Robot.blink(1) + + #json data ophalen uit json-files + json_commands = read_json_file('Commands.json') + activity_data = read_json_file('Activity.json') + + #json data doorsturen naar template + print_info(activity_data['Activity'][-10:]) + data['commands'] = json_commands + data['activity'] = activity_data['Activity'][-10:] + + return server.render_template(config['formatted_name'] + '.html', **data) + + #IFTTT Maker Webhook web request opvangen + @app_bp.route('/action', methods=['POST']) + def action(): + Robot.wake() + json_dict = request.data + data = json.loads(json_dict) + print_info(data) + + #De data die verkregen is via de webhook laten uitspreken + speak(data) + + #Opslaan van de activity + save_activity(data) + Robot.sleep() + return jsonify(data) + + #Naam veranderen van persoon die de robot gebruikt WIP + @app_bp.route('/name', methods=['POST']) + def change_name(): + data = {} + if request.method == 'POST': + Preferences.set('general', 'robot_name', request.form.get('robotName', type=str, default=None)) + return redirect('/apps/opa/') + + #ophalen applets via GET + @app_bp.route('/getapplets',methods=['GET']) + def getapplets(): + json_data = read_json_file('Applets.json') + return jsonify(json_data) + + #ophalen commands via GET + @app_bp.route('/getcommands',methods=['GET']) + def getcommands(): + json_data = read_json_file('Commands.json') + return jsonify(json_data) + + + + @server.app_socket_message('command') + def socket_message(conn, data): + print_info(data) + #global command_queue + print_info("Message received") + #command_queue = data['data'] + #command_queue.remove('placeholder') + #print_info(command_queue) + response = { + 'data': "Message received" + } + conn.send_data("Message",response) + + @server.app_socket_connected + def socket_connected(conn): + global clientconn + clientconn = conn + print_info("Connected") + + @server.app_socket_disconnected + def socket_connected(conn): + global clientconn + clientconn = None + print_info("Disconnected") + + + #Activity opslaan in de json file + def save_activity(data): + data['date'] = str(datetime.date.today()) + data['time'] = str(datetime.datetime.now().strftime("%H:%M:%S")) + print_info(data) + filename = os.path.join(app_bp.static_folder+'/json/', 'Activity.json') + with open(filename, 'r') as blog_file: + json_data = json.load(blog_file) + json_data['Activity'].append(data) + with open(filename, 'w') as write_file: + write_file.write(json.dumps(json_data)) + + #Data lezen van json file + def read_json_file(filename): + try: + filename = os.path.join(app_bp.static_folder+'/json/',filename) + with open(filename) as json_file: + json_read = json.load(json_file) + return json_read + except: + print_error('Failed to read json file') + return null + + + server.register_app_blueprint(app_bp) + +#Uitvoeren van spraak +def speak(data): + if data['service'] != "Alarm": + if data['say'] == "True": + play_data = data['play'] + Sound.play_file("smb_1-up.wav") + Sound.wait_for_sound() + play(play_data) + else: print_info('No need to play') + else: + print_info("Alarm") + alarm() + print_info("Exit speak action..") + return + + +def play(play_data): + Sound.say_tts(play_data['1']) + Sound.wait_for_sound() + Sound.say_tts(play_data['2']) + Sound.wait_for_sound() + Sound.say_tts(play_data['3']) + +#Alarm laten afspelen WIP +def alarm(): + onetoten = range(0,3) + for i in onetoten: + Sound.play_file("1_kamelenrace.wav") + Sound.wait_for_sound(print_info) + print_info("Alarm stopped...") + return + +def CommandLoop(): + print_info('Start Command loop') + global command_queue + time.sleep(1) + while not command_webservice.stopped(): + if len(command_queue) > 0: + print_info(command_queue.pop(0)) + #do something + response = { + 'data': "Remove" + } + clientconn.send_data("Message",response) + command_webservice.sleep(5) + +def demo(): + # publicly accessible function + if 1 > 0: + return {'status': 'success'} + else: + return {'status': 'error', 'message': 'This is a demo error!'} + +# Default functions for setting up, starting and stopping an app +def setup(server): + global command_queue + command_queue = [] + +def start(server): + global command_webservice + command_webservice = StoppableThread(target=CommandLoop) + +def stop(server): + print_info('Stop Command loop') + global command_webservice + command_webservice.stop() diff --git a/src/opsoro/apps/opa/static/app.css b/src/opsoro/apps/opa/static/app.css new file mode 100644 index 0000000..475c6ab --- /dev/null +++ b/src/opsoro/apps/opa/static/app.css @@ -0,0 +1,143 @@ +.flex-container{ + display: flex; + flex-wrap: wrap; + justify-content: center; +} +#cmdqueue{ + display: flex; + flex-wrap: wrap; + position: relative; + min-width: 170px; + min-height: 170px; +} +.applet{ + margin: 10px; + border-radius: 15px; + overflow: hidden; +} +.applet-content{ + color: white; + display: flex; + flex-wrap: wrap; + width: 250px; + margin: 15px; + flex-direction: column; +} +.applet-content .logo{ + width: 36px; + height: 36px; + margin: 0; + position: absolute; +} +.applet-content h3{ + margin-left: 50px; +} +.applet-footer{ + text-align: center; + height: 30px; + line-height: 30px; + font-size: 12px; + color: white; + margin-top: auto; + opacity: 0.4; +} + +.command{ + z-index: 2; + margin: 10px; + width: 230px; + border-radius: 15px; + background-color: blue; + overflow: hidden; +} +.command a{ + display: flex; + flex-wrap: wrap; + flex-direction: column; + height: 100%; +} +.command-content{ + margin: 15px; + max-width: 200px; + color: white; +} +.command-footer{ + text-align: center; + font-size: 12px; + color: white; + height: 30px; + line-height: 30px; + width: 100%; + margin-top: auto; +} + +.flex-container > .highlight{ + background-color: green; + opacity: 0.5; +} + +#cmdqueue-placeholder{ + position: absolute; + border: 4px dashed #f8f8f8; + text-align: center; + display: flex; + justify-content: center; + align-items: center; + border-radius: 15px; + width: calc(100% - 20px); + height: calc(100% - 20px); + margin: 10px; +} +.text-muted{ + opacity: 0.8; +} +.hidden{ + display: none !important; +} +.visible{ + display: block; +} + +.activity { + width:400px; + margin-bottom: 2em +} + +.activities { + display: flex; + flex-direction: column-reverse; + align-items: center; +} + +.activity_content { + background-color:#2e294e; + height: 100px; + border-radius: 15px; + padding: 2em; + color:#ffffff; + display: flex; + flex-direction: row; + justify-content: space-between; +} +.activity_header { + display: flex; + flex-direction: row; +} + +#protocolcontrol>ul>li { + list-style-type: none; + display: inline-block; +} +#protocolcontrol { + display: flex; + justify-content: center; +} +.no-margin { + margin: 0; +} + +@media screen and (max-width: 550px) { + .activity { + width: 280px; + } +} \ No newline at end of file diff --git a/src/opsoro/apps/opa/static/app.js b/src/opsoro/apps/opa/static/app.js new file mode 100644 index 0000000..1600e71 --- /dev/null +++ b/src/opsoro/apps/opa/static/app.js @@ -0,0 +1,279 @@ +$(document).ready(function() { + + + var commandData; + $.ajax({ + url: "/apps/opa/getcommands", + cache: false + }).done(function(data){ + commandData = data.Commands + console.log(commandData); + }); + + //Websockets + conn = null; + connReady = false; + conn = new SockJS('http://' + window.location.host + '/appsockjs'); + + conn.onopen = function() { + console.log("SockJS connected."); + $.ajax({ + url: "/appsockjstoken", + cache: false + }).done(function(data) { + conn.send(JSON.stringify({ + action: "authenticate", + token: data + })); + + connReady = true; + console.log("SockJS authenticated."); + }); + }; + conn.onmessage = function(e) { + var data = JSON.parse(e.data) + if(data['data'] == "Remove"){ + $('#cmdqueue').find('.command:first').remove(); + } + }; + + conn.onclose = function() { + console.log("SockJS disconnected."); + conn = null; + connReady = false; + }; + + //JQuery UI + $('#cmdqueue').sortable({ + revert: true, + placeholder: "highlight command", + cancel: ".disabled", + stop: function ( event, ui){ + var data = $(this).sortable('toArray', { attribute: 'command-id' }); + conn.send(JSON.stringify({ + action: "command", + data: data + })); + } + }); + $('#sortable').disableSelection(); + $('.draggable').draggable({ + connectToSortable: "#cmdqueue", + helper: "clone", + revert: "invalid", + drag: function (event,ui){ + $(this).removeClass('bounceIn') + }, + stop: function (event,ui){ + $(this).addClass('bounceIn') + } + }); + $('#cmdqueue').droppable({ + drop: function( event, ui ) { + $('#cmdqueue-placeholder').find('p').addClass("hidden"); + } + }); + + $('#filters').accordion({ + collapsible: true + }); + $('#cmdqueue').on('click', '.command', function() { + this.parentNode.removeChild(this); + }); + + + //Knockout JS + var Model = function() { + var self = this; + + // File operations toolbar item + self.fileIsLocked = ko.observable(false); + self.fileIsModified = ko.observable(false); + self.fileName = ko.observable(""); + self.fileStatus = ko.observable(""); + self.fileExtension = ko.observable(".ext"); + + // Script operations toolbar item + self.isRunning = ko.observable(false); + self.isUI = ko.observable(false); + + // Lock/Unlock toolbar item + self.toggleLocked = function() { + if (self.fileIsLocked()) { + self.unlockFile(); + } else { + self.lockFile(); + } + }; + self.lockFile = function() { + self.fileIsLocked(true); + self.fileStatus("Locked") + }; + self.unlockFile = function() { + self.fileIsLocked(false); + self.fileStatus("Editing") + }; + + + + // Popup window + /* + self.popupTextInput = ko.observable("Hi! This text can be changed. Click on the button to change me!"); + self.showPopup = function() { + $("#popup_window").foundation('open'); + + }; + self.closePopup = function() { + $("#popup_window").foundation('close'); + }; + self.popupButtonHandler = function() { + self.closePopup(); + }; + + self.init = function() { + // Clear data, new file, ... + self.fileName("Untitled"); + self.unlockFile(); + self.fileIsModified(false); + }; + + self.loadFileData = function(data) { + if (data == undefined) { + return; + } + + // Load data, parse if needed + var dataobj = JSON.parse(data); + + + self.fileIsModified(false); + self.lockFile(); + }; + + self.saveFileData = function() { + // Convert data + file_data = {}; + + var data = ko.toJSON(file_data, null, 2); + self.fileIsModified(false); + return data; + }; + */ + }; + + function Applet(Applet_name, Applet_url, Applet_color, Applet_categorie, Applet_logo) { + this.Applet_name = Applet_name; + this.Applet_url = Applet_url; + this.Applet_color = Applet_color; + this.Applet_categorie = Applet_categorie; + this.Applet_logo = Applet_logo; + } + + + /*var listOfApplets = [ + new Applet("Test", "fkdsjfsdkf", "#000000", "News", "dlkjfskldjfsd"), + new Applet("Test", "fkdsjfsdkf", "#000000", "News", "dlkjfskldjfsd"), + new Applet("Test", "fkdsjfsdkf", "#000000", "News", "dlkjfskldjfsd"), + new Applet("Test", "fkdsjfsdkf", "#000000", "News", "dlkjfskldjfsd"), + ];*/ + + var listOfApplets = [ + + ]; + + $.ajax({ + url: "/apps/opa/getapplets", + cache: false + }).done(function(data){ + + $(data['Applets']).each(function(index, item){ + + listOfApplets.push(new Applet(item.Applet_name, item.Applet_url, item.Applet_color, item.Applet_categorie, item.Applet_logo)); + + }); + + $(".applet").removeClass("hidden"); + + console.log(listOfApplets); + function protocol(id, name) { + this.id = id; + this.name = name; + this.selected = ko.observable(false); + } + + var listOfCategories = [ + new protocol(1, 'Social'), + new protocol(2, 'News'), + new protocol(3, 'Education'), + new protocol(4, 'Location'), + new protocol(5, 'Tools'), + ]; + + + var viewModel = { + protocoldocs: ko.observableArray(listOfApplets), + protocol: ko.observableArray(listOfCategories), + selectedProtocol: ko.observableArray(), + addprotocol: function (protocol, elem) { + var $checkBox = $(elem.srcElement); + var isChecked = $checkBox.is(':checked'); + //If it is checked and not in the array, add it + if (isChecked && viewModel.selectedProtocol.indexOf(protocol) < 0) { + viewModel.selectedProtocol.push(protocol); + } + //If it is in the array and not checked remove it + else if (!isChecked && viewModel.selectedProtocol.indexOf(protocol) >= 0) { + viewModel.selectedProtocol.remove(protocol); + } + //Need to return to to allow the Checkbox to process checked/unchecked + return true; + } + } + + viewModel.filteredProtocols = ko.computed(function () { + var selectedProtocols = ko.utils.arrayFilter(viewModel.protocol(), function (p) { + return p.selected(); + }); + if (selectedProtocols.length == 0) { //if none selected return all + console.log("selected is null"); + console.log(selectedProtocols.length); + console.log(viewModel.protocoldocs()); + return viewModel.protocoldocs(); + } + else { + return ko.utils.arrayFilter(viewModel.protocoldocs(), function (item) { + return ko.utils.arrayFilter(selectedProtocols, function (p) { + if(p.name == 'All'){ + return viewModel.protocoldocs(); + } + return p.name == item.Applet_categorie + }).length > 0; + }); + + } + }) + + ko.applyBindings(viewModel); + }); + + /* + $.get("/apps/opa/getapplets", function(data, status){ + var i =0; + $(data['Applets']).each(function(index, item){ + + listOfApplets.push(new Applet(item.Applet_name, item.Applet_url, item.Applet_color, item.Applet_categorie, item.Applet_logo)); + + }); + }); +*/ + + + //var newDropped = false; + + //ko.applyBindings(viewModel, $("#protocoldocs")[0]); + // This makes Knockout get to work + // ko.applyBindings(model); + + // Configurate toolbar handlers + //config_file_operations("", model.fileExtension(), model.saveFileData, model.loadFileData, model.init); +}); diff --git a/src/opsoro/apps/opa/static/css/animate.min.css b/src/opsoro/apps/opa/static/css/animate.min.css new file mode 100644 index 0000000..e7dd655 --- /dev/null +++ b/src/opsoro/apps/opa/static/css/animate.min.css @@ -0,0 +1,11 @@ +@charset "UTF-8"; + +/*! + * animate.css -http://daneden.me/animate + * Version - 3.5.2 + * Licensed under the MIT license - http://opensource.org/licenses/MIT + * + * Copyright (c) 2017 Daniel Eden + */ + +.animated{animation-duration:1s;animation-fill-mode:both}.animated.infinite{animation-iteration-count:infinite}.animated.hinge{animation-duration:2s}.animated.bounceIn,.animated.bounceOut,.animated.flipOutX,.animated.flipOutY{animation-duration:.75s}@keyframes bounce{0%,20%,53%,80%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1);transform:translateZ(0)}40%,43%{animation-timing-function:cubic-bezier(.755,.05,.855,.06);transform:translate3d(0,-30px,0)}70%{animation-timing-function:cubic-bezier(.755,.05,.855,.06);transform:translate3d(0,-15px,0)}90%{transform:translate3d(0,-4px,0)}}.bounce{animation-name:bounce;transform-origin:center bottom}@keyframes flash{0%,50%,to{opacity:1}25%,75%{opacity:0}}.flash{animation-name:flash}@keyframes pulse{0%{transform:scaleX(1)}50%{transform:scale3d(1.05,1.05,1.05)}to{transform:scaleX(1)}}.pulse{animation-name:pulse}@keyframes rubberBand{0%{transform:scaleX(1)}30%{transform:scale3d(1.25,.75,1)}40%{transform:scale3d(.75,1.25,1)}50%{transform:scale3d(1.15,.85,1)}65%{transform:scale3d(.95,1.05,1)}75%{transform:scale3d(1.05,.95,1)}to{transform:scaleX(1)}}.rubberBand{animation-name:rubberBand}@keyframes shake{0%,to{transform:translateZ(0)}10%,30%,50%,70%,90%{transform:translate3d(-10px,0,0)}20%,40%,60%,80%{transform:translate3d(10px,0,0)}}.shake{animation-name:shake}@keyframes headShake{0%{transform:translateX(0)}6.5%{transform:translateX(-6px) rotateY(-9deg)}18.5%{transform:translateX(5px) rotateY(7deg)}31.5%{transform:translateX(-3px) rotateY(-5deg)}43.5%{transform:translateX(2px) rotateY(3deg)}50%{transform:translateX(0)}}.headShake{animation-timing-function:ease-in-out;animation-name:headShake}@keyframes swing{20%{transform:rotate(15deg)}40%{transform:rotate(-10deg)}60%{transform:rotate(5deg)}80%{transform:rotate(-5deg)}to{transform:rotate(0deg)}}.swing{transform-origin:top center;animation-name:swing}@keyframes tada{0%{transform:scaleX(1)}10%,20%{transform:scale3d(.9,.9,.9) rotate(-3deg)}30%,50%,70%,90%{transform:scale3d(1.1,1.1,1.1) rotate(3deg)}40%,60%,80%{transform:scale3d(1.1,1.1,1.1) rotate(-3deg)}to{transform:scaleX(1)}}.tada{animation-name:tada}@keyframes wobble{0%{transform:none}15%{transform:translate3d(-25%,0,0) rotate(-5deg)}30%{transform:translate3d(20%,0,0) rotate(3deg)}45%{transform:translate3d(-15%,0,0) rotate(-3deg)}60%{transform:translate3d(10%,0,0) rotate(2deg)}75%{transform:translate3d(-5%,0,0) rotate(-1deg)}to{transform:none}}.wobble{animation-name:wobble}@keyframes jello{0%,11.1%,to{transform:none}22.2%{transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{transform:skewX(6.25deg) skewY(6.25deg)}44.4%{transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{transform:skewX(.390625deg) skewY(.390625deg)}88.8%{transform:skewX(-.1953125deg) skewY(-.1953125deg)}}.jello{animation-name:jello;transform-origin:center}@keyframes bounceIn{0%,20%,40%,60%,80%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:scale3d(.3,.3,.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(.9,.9,.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(.97,.97,.97)}to{opacity:1;transform:scaleX(1)}}.bounceIn{animation-name:bounceIn}@keyframes bounceInDown{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}.bounceInDown{animation-name:bounceInDown}@keyframes bounceInLeft{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:none}}.bounceInLeft{animation-name:bounceInLeft}@keyframes bounceInRight{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}.bounceInRight{animation-name:bounceInRight}@keyframes bounceInUp{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translateZ(0)}}.bounceInUp{animation-name:bounceInUp}@keyframes bounceOut{20%{transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;transform:scale3d(1.1,1.1,1.1)}to{opacity:0;transform:scale3d(.3,.3,.3)}}.bounceOut{animation-name:bounceOut}@keyframes bounceOutDown{20%{transform:translate3d(0,10px,0)}40%,45%{opacity:1;transform:translate3d(0,-20px,0)}to{opacity:0;transform:translate3d(0,2000px,0)}}.bounceOutDown{animation-name:bounceOutDown}@keyframes bounceOutLeft{20%{opacity:1;transform:translate3d(20px,0,0)}to{opacity:0;transform:translate3d(-2000px,0,0)}}.bounceOutLeft{animation-name:bounceOutLeft}@keyframes bounceOutRight{20%{opacity:1;transform:translate3d(-20px,0,0)}to{opacity:0;transform:translate3d(2000px,0,0)}}.bounceOutRight{animation-name:bounceOutRight}@keyframes bounceOutUp{20%{transform:translate3d(0,-10px,0)}40%,45%{opacity:1;transform:translate3d(0,20px,0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}.bounceOutUp{animation-name:bounceOutUp}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.fadeIn{animation-name:fadeIn}@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-100%,0)}to{opacity:1;transform:none}}.fadeInDown{animation-name:fadeInDown}@keyframes fadeInDownBig{0%{opacity:0;transform:translate3d(0,-2000px,0)}to{opacity:1;transform:none}}.fadeInDownBig{animation-name:fadeInDownBig}@keyframes fadeInLeft{0%{opacity:0;transform:translate3d(-100%,0,0)}to{opacity:1;transform:none}}.fadeInLeft{animation-name:fadeInLeft}@keyframes fadeInLeftBig{0%{opacity:0;transform:translate3d(-2000px,0,0)}to{opacity:1;transform:none}}.fadeInLeftBig{animation-name:fadeInLeftBig}@keyframes fadeInRight{0%{opacity:0;transform:translate3d(100%,0,0)}to{opacity:1;transform:none}}.fadeInRight{animation-name:fadeInRight}@keyframes fadeInRightBig{0%{opacity:0;transform:translate3d(2000px,0,0)}to{opacity:1;transform:none}}.fadeInRightBig{animation-name:fadeInRightBig}@keyframes fadeInUp{0%{opacity:0;transform:translate3d(0,100%,0)}to{opacity:1;transform:none}}.fadeInUp{animation-name:fadeInUp}@keyframes fadeInUpBig{0%{opacity:0;transform:translate3d(0,2000px,0)}to{opacity:1;transform:none}}.fadeInUpBig{animation-name:fadeInUpBig}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.fadeOut{animation-name:fadeOut}@keyframes fadeOutDown{0%{opacity:1}to{opacity:0;transform:translate3d(0,100%,0)}}.fadeOutDown{animation-name:fadeOutDown}@keyframes fadeOutDownBig{0%{opacity:1}to{opacity:0;transform:translate3d(0,2000px,0)}}.fadeOutDownBig{animation-name:fadeOutDownBig}@keyframes fadeOutLeft{0%{opacity:1}to{opacity:0;transform:translate3d(-100%,0,0)}}.fadeOutLeft{animation-name:fadeOutLeft}@keyframes fadeOutLeftBig{0%{opacity:1}to{opacity:0;transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{animation-name:fadeOutLeftBig}@keyframes fadeOutRight{0%{opacity:1}to{opacity:0;transform:translate3d(100%,0,0)}}.fadeOutRight{animation-name:fadeOutRight}@keyframes fadeOutRightBig{0%{opacity:1}to{opacity:0;transform:translate3d(2000px,0,0)}}.fadeOutRightBig{animation-name:fadeOutRightBig}@keyframes fadeOutUp{0%{opacity:1}to{opacity:0;transform:translate3d(0,-100%,0)}}.fadeOutUp{animation-name:fadeOutUp}@keyframes fadeOutUpBig{0%{opacity:1}to{opacity:0;transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{animation-name:fadeOutUpBig}@keyframes flip{0%{transform:perspective(400px) rotateY(-1turn);animation-timing-function:ease-out}40%{transform:perspective(400px) translateZ(150px) rotateY(-190deg);animation-timing-function:ease-out}50%{transform:perspective(400px) translateZ(150px) rotateY(-170deg);animation-timing-function:ease-in}80%{transform:perspective(400px) scale3d(.95,.95,.95);animation-timing-function:ease-in}to{transform:perspective(400px);animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;animation-name:flip}@keyframes flipInX{0%{transform:perspective(400px) rotateX(90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;animation-name:flipInX}@keyframes flipInY{0%{transform:perspective(400px) rotateY(90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateY(-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotateY(10deg);opacity:1}80%{transform:perspective(400px) rotateY(-5deg)}to{transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;animation-name:flipInY}@keyframes flipOutX{0%{transform:perspective(400px)}30%{transform:perspective(400px) rotateX(-20deg);opacity:1}to{transform:perspective(400px) rotateX(90deg);opacity:0}}.flipOutX{animation-name:flipOutX;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes flipOutY{0%{transform:perspective(400px)}30%{transform:perspective(400px) rotateY(-15deg);opacity:1}to{transform:perspective(400px) rotateY(90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;animation-name:flipOutY}@keyframes lightSpeedIn{0%{transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{transform:skewX(20deg);opacity:1}80%{transform:skewX(-5deg);opacity:1}to{transform:none;opacity:1}}.lightSpeedIn{animation-name:lightSpeedIn;animation-timing-function:ease-out}@keyframes lightSpeedOut{0%{opacity:1}to{transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{animation-name:lightSpeedOut;animation-timing-function:ease-in}@keyframes rotateIn{0%{transform-origin:center;transform:rotate(-200deg);opacity:0}to{transform-origin:center;transform:none;opacity:1}}.rotateIn{animation-name:rotateIn}@keyframes rotateInDownLeft{0%{transform-origin:left bottom;transform:rotate(-45deg);opacity:0}to{transform-origin:left bottom;transform:none;opacity:1}}.rotateInDownLeft{animation-name:rotateInDownLeft}@keyframes rotateInDownRight{0%{transform-origin:right bottom;transform:rotate(45deg);opacity:0}to{transform-origin:right bottom;transform:none;opacity:1}}.rotateInDownRight{animation-name:rotateInDownRight}@keyframes rotateInUpLeft{0%{transform-origin:left bottom;transform:rotate(45deg);opacity:0}to{transform-origin:left bottom;transform:none;opacity:1}}.rotateInUpLeft{animation-name:rotateInUpLeft}@keyframes rotateInUpRight{0%{transform-origin:right bottom;transform:rotate(-90deg);opacity:0}to{transform-origin:right bottom;transform:none;opacity:1}}.rotateInUpRight{animation-name:rotateInUpRight}@keyframes rotateOut{0%{transform-origin:center;opacity:1}to{transform-origin:center;transform:rotate(200deg);opacity:0}}.rotateOut{animation-name:rotateOut}@keyframes rotateOutDownLeft{0%{transform-origin:left bottom;opacity:1}to{transform-origin:left bottom;transform:rotate(45deg);opacity:0}}.rotateOutDownLeft{animation-name:rotateOutDownLeft}@keyframes rotateOutDownRight{0%{transform-origin:right bottom;opacity:1}to{transform-origin:right bottom;transform:rotate(-45deg);opacity:0}}.rotateOutDownRight{animation-name:rotateOutDownRight}@keyframes rotateOutUpLeft{0%{transform-origin:left bottom;opacity:1}to{transform-origin:left bottom;transform:rotate(-45deg);opacity:0}}.rotateOutUpLeft{animation-name:rotateOutUpLeft}@keyframes rotateOutUpRight{0%{transform-origin:right bottom;opacity:1}to{transform-origin:right bottom;transform:rotate(90deg);opacity:0}}.rotateOutUpRight{animation-name:rotateOutUpRight}@keyframes hinge{0%{transform-origin:top left;animation-timing-function:ease-in-out}20%,60%{transform:rotate(80deg);transform-origin:top left;animation-timing-function:ease-in-out}40%,80%{transform:rotate(60deg);transform-origin:top left;animation-timing-function:ease-in-out;opacity:1}to{transform:translate3d(0,700px,0);opacity:0}}.hinge{animation-name:hinge}@keyframes jackInTheBox{0%{opacity:0;transform:scale(.1) rotate(30deg);transform-origin:center bottom}50%{transform:rotate(-10deg)}70%{transform:rotate(3deg)}to{opacity:1;transform:scale(1)}}.jackInTheBox{animation-name:jackInTheBox}@keyframes rollIn{0%{opacity:0;transform:translate3d(-100%,0,0) rotate(-120deg)}to{opacity:1;transform:none}}.rollIn{animation-name:rollIn}@keyframes rollOut{0%{opacity:1}to{opacity:0;transform:translate3d(100%,0,0) rotate(120deg)}}.rollOut{animation-name:rollOut}@keyframes zoomIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{animation-name:zoomIn}@keyframes zoomInDown{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInDown{animation-name:zoomInDown}@keyframes zoomInLeft{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(10px,0,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInLeft{animation-name:zoomInLeft}@keyframes zoomInRight{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInRight{animation-name:zoomInRight}@keyframes zoomInUp{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInUp{animation-name:zoomInUp}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:0}}.zoomOut{animation-name:zoomOut}@keyframes zoomOutDown{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform-origin:center bottom;animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutDown{animation-name:zoomOutDown}@keyframes zoomOutLeft{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{opacity:0;transform:scale(.1) translate3d(-2000px,0,0);transform-origin:left center}}.zoomOutLeft{animation-name:zoomOutLeft}@keyframes zoomOutRight{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{opacity:0;transform:scale(.1) translate3d(2000px,0,0);transform-origin:right center}}.zoomOutRight{animation-name:zoomOutRight}@keyframes zoomOutUp{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform-origin:center bottom;animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutUp{animation-name:zoomOutUp}@keyframes slideInDown{0%{transform:translate3d(0,-100%,0);visibility:visible}to{transform:translateZ(0)}}.slideInDown{animation-name:slideInDown}@keyframes slideInLeft{0%{transform:translate3d(-100%,0,0);visibility:visible}to{transform:translateZ(0)}}.slideInLeft{animation-name:slideInLeft}@keyframes slideInRight{0%{transform:translate3d(100%,0,0);visibility:visible}to{transform:translateZ(0)}}.slideInRight{animation-name:slideInRight}@keyframes slideInUp{0%{transform:translate3d(0,100%,0);visibility:visible}to{transform:translateZ(0)}}.slideInUp{animation-name:slideInUp}@keyframes slideOutDown{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(0,100%,0)}}.slideOutDown{animation-name:slideOutDown}@keyframes slideOutLeft{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(-100%,0,0)}}.slideOutLeft{animation-name:slideOutLeft}@keyframes slideOutRight{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(100%,0,0)}}.slideOutRight{animation-name:slideOutRight}@keyframes slideOutUp{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(0,-100%,0)}}.slideOutUp{animation-name:slideOutUp} \ No newline at end of file diff --git a/src/opsoro/apps/opa/static/data/.fuse_hidden00000e1000000003 b/src/opsoro/apps/opa/static/data/.fuse_hidden00000e1000000003 new file mode 100644 index 0000000..202cdb8 --- /dev/null +++ b/src/opsoro/apps/opa/static/data/.fuse_hidden00000e1000000003 @@ -0,0 +1,47 @@ +{ "Applets":[ + { + "Applet_name":"Weather Applet", + "Applet_url":"https://ifttt.com/applets/DbSc6XqZ/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/" + }, + { + "Applet_name":"Alarm", + "Applet_url":"https://ifttt.com/applets/yxcUavkK/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/" + }, + { + "Applet_name":"Coming home", + "Applet_url":"https://ifttt.com/applets/UcdTPWAV/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/" + }, + { + "Applet_name":"Event", + "Applet_url":"https://ifttt.com/applets/wjLHMbBx/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/" + }, + { + "Applet_name":"ISS", + "Applet_url":"https://ifttt.com/applets/Ld8aRTUD/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/" + }, + { + "Applet_name":"Leaving work", + "Applet_url":"https://ifttt.com/applets/Wcw42HM5/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/" + }, + { + "Applet_name":"Youtube", + "Applet_url":"https://ifttt.com/applets/CTjyYCQV/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/" + }, + { + "Applet_name":"The New York Times", + "Applet_url":"https://ifttt.com/applets/LtNGA4Xm/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/" + }, + { + "Applet_name":"SMS", + "Applet_url":"https://ifttt.com/applets/vsKwNSpG/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/" + }, + { + "Applet_name":"Christmas", + "Applet_url":"https://ifttt.com/applets/VVktLwKe/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/" + }, + { + "Applet_name":"Facebook status", + "Applet_url":"https://ifttt.com/applets/VVktLwKe/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/" + } +] +} \ No newline at end of file diff --git a/src/opsoro/apps/opa/static/images/Thumbs.db b/src/opsoro/apps/opa/static/images/Thumbs.db new file mode 100755 index 0000000..3ae7e02 Binary files /dev/null and b/src/opsoro/apps/opa/static/images/Thumbs.db differ diff --git a/src/opsoro/apps/opa/static/images/screenshot-opsoro-step2.png b/src/opsoro/apps/opa/static/images/screenshot-opsoro-step2.png new file mode 100755 index 0000000..bce7778 Binary files /dev/null and b/src/opsoro/apps/opa/static/images/screenshot-opsoro-step2.png differ diff --git a/src/opsoro/apps/opa/static/images/screenshot-opsoro-step3.png b/src/opsoro/apps/opa/static/images/screenshot-opsoro-step3.png new file mode 100755 index 0000000..12737b8 Binary files /dev/null and b/src/opsoro/apps/opa/static/images/screenshot-opsoro-step3.png differ diff --git a/src/opsoro/apps/opa/static/images/screenshot-opsoro-step4.png b/src/opsoro/apps/opa/static/images/screenshot-opsoro-step4.png new file mode 100755 index 0000000..d73f3a3 Binary files /dev/null and b/src/opsoro/apps/opa/static/images/screenshot-opsoro-step4.png differ diff --git a/src/opsoro/apps/opa/static/images/screenshot-opsoro-step5.png b/src/opsoro/apps/opa/static/images/screenshot-opsoro-step5.png new file mode 100755 index 0000000..ee0747b Binary files /dev/null and b/src/opsoro/apps/opa/static/images/screenshot-opsoro-step5.png differ diff --git a/src/opsoro/apps/opa/static/json/Activity.json b/src/opsoro/apps/opa/static/json/Activity.json new file mode 100644 index 0000000..47a6ebe --- /dev/null +++ b/src/opsoro/apps/opa/static/json/Activity.json @@ -0,0 +1 @@ +{"Activity": [{"play": {"play2": "You are tagged in a photo of {{From}}", "play1": "New facebook notification "}, "service": "Google Calendar", "color": "#2c6efc", "say": "True", "time": "14:15:14", "date": "2017-06-07"}, {"play": {"play2": "You are tagged in a photo of {{From}}", "play1": "New facebook notification "}, "service": "Facebook", "color": "#3b579d", "say": "True", "time": "14:18:49", "date": "2017-06-07"}, {"play": {"play2": "You are tagged in a photo of {{From}}", "play1": "New facebook notification "}, "service": "Alarm", "color": "#000000", "say": "True", "time": "17:50:20", "date": "2017-06-07"}, {"play": {"1": "New facebook notification ", "3": "", "2": "You are tagged in a photo"}, "service": "Facebook", "color": "#3b579d", "say": "True", "time": "18:25:05", "date": "2017-06-07"}, {"play": {"1": "New facebook notification ", "3": "", "2": "You are tagged in a photo"}, "service": "Facebook", "color": "#3b579d", "say": "True", "time": "18:26:56", "date": "2017-06-07"}, {"play": {"1": "New facebook notification ", "3": "", "2": "You are tagged in a photo"}, "service": "Facebook", "color": "#3b579d", "say": "True", "time": "19:22:17", "date": "2017-06-07"}, {"play": {"1": "One of your parents just arrived at home", "3": "", "2": " June 07, 2017 at 10:45PM"}, "service": "Location", "color": "#0099ff", "say": "True", "time": "22:46:02", "date": "2017-06-07"}, {"play": {"1": "New facebook notification ", "3": "", "2": "You are tagged in a photo"}, "service": "Facebook", "color": "#3b579d", "say": "True", "time": "14:46:36", "date": "2017-06-08"}, {"play": {"1": "New facebook notification ", "3": "", "2": "You are tagged in a photo"}, "service": "Facebook", "color": "#3b579d", "say": "True", "time": "14:47:32", "date": "2017-06-08"}, {"play": {"1": "It is June 08, 2017 at 03:00PM", "3": "The wind speed is 23 Kilometers per hour", "2": "The weather of the moment is Partly Cloudy and 23 degrees Celsius"}, "service": "Weather", "color": "#000000", "say": "True", "time": "15:00:30", "date": "2017-06-08"}, {"play": {"1": "New notification from Twitter", "3": " Sander V", "2": "You have a new follower"}, "service": "Twitter", "color": "#00abec", "say": "True", "time": "15:22:53", "date": "2017-06-08"}, {"play": {"1": "New track saved to playlist", "3": " Girls Keep Drinking by Compact Disk Dummies", "2": "New track"}, "service": "Spotify", "color": "#1ED760", "say": "True", "time": "15:29:26", "date": "2017-06-08"}, {"play": {"1": "New track saved to playlist", "3": " Jewels by Warhola", "2": "New track"}, "service": "Spotify", "color": "#1ED760", "say": "True", "time": "15:30:04", "date": "2017-06-08"}, {"play": {"1": "New track saved to playlist", "3": " Slide by Calvin Harris, Frank Ocean, Migos", "2": "New track"}, "service": "Spotify", "color": "#1ED760", "say": "True", "time": "15:37:25", "date": "2017-06-08"}, {"play": {"1": "New track saved to playlist", "3": " Slide by Calvin Harris, Frank Ocean, Migos", "2": "New track"}, "service": "Spotify", "color": "#1ED760", "say": "True", "time": "15:37:29", "date": "2017-06-08"}, {"play": {"1": "New track saved to playlist", "3": " Weak by AJR", "2": "New track"}, "service": "Spotify", "color": "#1ED760", "say": "True", "time": "15:47:47", "date": "2017-06-08"}, {"play": {"1": "New track saved to playlist DAMN! That's old", "3": " Green Light by Lorde", "2": "New track"}, "service": "Spotify", "color": "#1ED760", "say": "True", "time": "15:49:37", "date": "2017-06-08"}, {"play": {"1": "BREAKING NEWS", "3": "Read more on Fox News", "2": " Fox News Breaking News Alert, COMEY COMES OUT SWINGING: Comey rips Trump, blasts 'lies' about performance"}, "service": "Fox News", "color": "#003366", "say": "True", "time": "16:27:46", "date": "2017-06-08"}, {"play": {"1": "BREAKING NEWS", "3": "Read more on Fox News", "2": " Fox News Breaking News Alert, COMEY'S CLOSE CALL: Comey says he considered calling for a special counsel for Clinton server probe."}, "service": "Fox News", "color": "#003366", "say": "True", "time": "18:38:49", "date": "2017-06-08"}, {"play": {"1": "BREAKING NEWS", "3": "Read more on Fox News", "2": " Fox News Breaking News Alert, COMEY SHOW ENDS: James Comey's public appearance before the Senate Intelligence Committee has ended, and the former FBI director will now meet with lawmakers in private."}, "service": "Fox News", "color": "#003366", "say": "True", "time": "18:53:28", "date": "2017-06-08"}, {"play": {"1": "New track saved to playlist DAMN! That's old", "3": " Permission To Love by Hayden James", "2": "New track"}, "service": "Spotify", "color": "#1ED760", "say": "True", "time": "20:15:54", "date": "2017-06-08"}, {"play": {"1": "BREAKING NEWS", "3": "Read more on Fox News", "2": " Fox News Breaking News Alert, CHURCH BUS CRASH: At least 17 hurt in accident outside Atlanta"}, "service": "Fox News", "color": "#003366", "say": "True", "time": "23:08:24", "date": "2017-06-08"}, {"play": {"1": "One of your parents is on their way home", "3": "", "2": "At June 09, 2017 at 10:34AM they left work"}, "service": "Location", "color": "#0099ff", "say": "True", "time": "11:37:33", "date": "2017-06-09"}, {"play": {"1": "New facebook notification ", "3": "", "2": "You are tagged in a photo"}, "service": "Facebook", "color": "#3b579d", "say": "True", "time": "14:05:34", "date": "2017-06-09"}, {"play": {"1": "New facebook notification ", "3": "", "2": "You are tagged in a photo"}, "service": "Facebook", "color": "#3b579d", "say": "True", "time": "13:34:33", "date": "2017-06-09"}, {"play": {"1": "New facebook notification ", "3": "", "2": "You are tagged in a photo"}, "service": "Facebook", "color": "#3b579d", "say": "True", "time": "13:36:49", "date": "2017-06-09"}]} \ No newline at end of file diff --git a/src/opsoro/apps/opa/static/json/Applets.json b/src/opsoro/apps/opa/static/json/Applets.json new file mode 100644 index 0000000..448b0ee --- /dev/null +++ b/src/opsoro/apps/opa/static/json/Applets.json @@ -0,0 +1,108 @@ +{ "Applets":[ + { + "Applet_name":"Weather Applet", + "Applet_url":"https://ifttt.com/applets/DbSc6XqZ/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/", + "Applet_color":"#1d9a59", + "Applet_categorie":"News", + "Applet_logo":"https://applets.imgix.net/https%3A%2F%2Fassets.ifttt.com%2Fimages%2Fchannels%2F7%2Ficons%2Fon_color_large.png%3Fversion%3D0?ixlib=rails-2.1.3&w=100&h=100&auto=compress&s=a779437e46041cd85963c1e169aea000" + }, + { + "Applet_name":"Alarm", + "Applet_url":"https://ifttt.com/applets/yxcUavkK/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/", + "Applet_color":"#333333", + "Applet_categorie":"Tools", + "Applet_logo":"https://applets.imgix.net/https%3A%2F%2Fassets.ifttt.com%2Fimages%2Fchannels%2F3%2Ficons%2Fon_color_large.png%3Fversion%3D0?ixlib=rails-2.1.3&w=100&h=100&auto=compress&s=3e9ab3d7d45a360b93f96f7131ae7169" + }, + { + "Applet_name":"Coming home", + "Applet_url":"https://ifttt.com/applets/UcdTPWAV/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/", + "Applet_color":"#0099ff", + "Applet_categorie":"Location", + "Applet_logo":"https://applets.imgix.net/https%3A%2F%2Fassets.ifttt.com%2Fimages%2Fchannels%2F941030000%2Ficons%2Fon_color_large.png%3Fversion%3D0?ixlib=rails-2.1.3&w=100&h=100&auto=compress&s=c1e46d4cb4a148c6a7fd55ccf2c5a21b" + }, + { + "Applet_name":"Event", + "Applet_url":"https://ifttt.com/applets/wjLHMbBx/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/", + "Applet_color":"#2c6efc", + "Applet_categorie":"Location", + "Applet_logo":"https://applets.imgix.net/https%3A%2F%2Fassets.ifttt.com%2Fimages%2Fchannels%2F36%2Ficons%2Fon_color_large.png%3Fversion%3D0?ixlib=rails-2.1.3&w=100&h=100&auto=compress&s=f21aba281510145b7032da7abaa0ef74" + }, + { + "Applet_name":"ISS", + "Applet_url":"https://ifttt.com/applets/Ld8aRTUD/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/", + "Applet_color":"#2e294e", + "Applet_categorie":"Education", + "Applet_logo":"https://applets.imgix.net/https%3A%2F%2Fassets.ifttt.com%2Fimages%2Fchannels%2F1829340444%2Ficons%2Fon_color_large.png%3Fversion%3D0?ixlib=rails-2.1.3&w=100&h=100&auto=compress&s=e631efb18ee2b3e9c757c0a1f96c27c0" + }, + { + "Applet_name":"Leaving work", + "Applet_url":"https://ifttt.com/applets/Wcw42HM5/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/", + "Applet_color":"#0099ff", + "Applet_categorie":"Location", + "Applet_logo":"https://applets.imgix.net/https%3A%2F%2Fassets.ifttt.com%2Fimages%2Fchannels%2F941030000%2Ficons%2Fon_color_large.png%3Fversion%3D0?ixlib=rails-2.1.3&w=100&h=100&auto=compress&s=c1e46d4cb4a148c6a7fd55ccf2c5a21b" + }, + { + "Applet_name":"Youtube", + "Applet_url":"https://ifttt.com/applets/CTjyYCQV/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/", + "Applet_color":"#e52d27", + "Applet_categorie":"Social", + "Applet_logo":"https://applets.imgix.net/https%3A%2F%2Fassets.ifttt.com%2Fimages%2Fchannels%2F32%2Ficons%2Fon_color_large.png%3Fversion%3D0?ixlib=rails-2.1.3&w=100&h=100&auto=compress&s=25656b78c56a17d5f6056231bcd54a88" + }, + { + "Applet_name":"The New York Times", + "Applet_url":"https://ifttt.com/applets/LtNGA4Xm/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/", + "Applet_color":"#333333", + "Applet_categorie":"News", + "Applet_logo":"https://applets.imgix.net/https%3A%2F%2Fassets.ifttt.com%2Fimages%2Fchannels%2F89%2Ficons%2Fon_color_large.png%3Fversion%3D0?ixlib=rails-2.1.3&w=100&h=100&auto=compress&s=2a64565a7e995c4437385c0fd1cd2449" + }, + { + "Applet_name":"SMS", + "Applet_url":"https://ifttt.com/applets/vsKwNSpG/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/", + "Applet_color":"#1d9a59", + "Applet_categorie":"Tools", + "Applet_logo":"https://applets.imgix.net/https%3A%2F%2Fassets.ifttt.com%2Fimages%2Fchannels%2F1322033008%2Ficons%2Fon_color_large.png%3Fversion%3D0?ixlib=rails-2.1.3&w=100&h=100&auto=compress&s=60ac0ffb1b7842577b10ee4ba99a4d0d" + }, + { + "Applet_name":"Christmas", + "Applet_url":"https://ifttt.com/applets/VVktLwKe/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/", + "Applet_color":"#e52d27", + "Applet_categorie":"Tools", + "Applet_logo":"https://applets.imgix.net/https%3A%2F%2Fassets.ifttt.com%2Fimages%2Fchannels%2F696562578%2Ficons%2Fon_color_large.png%3Fversion%3D0?ixlib=rails-2.1.3&w=100&h=100&auto=compress&s=71cb85615aa8ebb9c9f1096e02b02e33" + }, + { + "Applet_name":"Facebook status", + "Applet_url":"https://ifttt.com/applets/DvEUeRmd/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/", + "Applet_color":"#3b579d", + "Applet_categorie":"Social", + "Applet_logo":"https://applets.imgix.net/https%3A%2F%2Fassets.ifttt.com%2Fimages%2Fchannels%2F10%2Ficons%2Fon_color_large.png%3Fversion%3D0?ixlib=rails-2.1.3&w=100&h=100&auto=compress&s=198287ecad0ec524d2d392508ca7ccd9" + }, + { + "Applet_name":"New follower Twitter", + "Applet_url":"https://ifttt.com/applets/UKvHk432/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/", + "Applet_color":"#00abec", + "Applet_categorie":"Social", + "Applet_logo":"https://applets.imgix.net/https%3A%2F%2Fassets.ifttt.com%2Fimages%2Fchannels%2F2%2Ficons%2Fon_color_large.png%3Fversion%3D0?ixlib=rails-2.1.3&w=100&h=100&auto=compress&s=7053b15a8babcda62c7252482714819a" + }, + { + "Applet_name":"New track in playlist", + "Applet_url":"https://ifttt.com/applets/eZdLvymM/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/", + "Applet_color":"#1ED760", + "Applet_categorie":"Social", + "Applet_logo":"https://applets.imgix.net/https%3A%2F%2Fassets.ifttt.com%2Fimages%2Fchannels%2F51464135%2Ficons%2Fon_color_large.png%3Fversion%3D0?ixlib=rails-2.1.3&w=100&h=100&auto=compress&s=7a11ebf35fb5b43224582137708af9b0" + }, + { + "Applet_name":"Mentioned in Tweet", + "Applet_url":"https://ifttt.com/applets/Fxuk37Cn/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/", + "Applet_color":"#00abec", + "Applet_categorie":"Social", + "Applet_logo":"https://applets.imgix.net/https%3A%2F%2Fassets.ifttt.com%2Fimages%2Fchannels%2F2%2Ficons%2Fon_color_large.png%3Fversion%3D0?ixlib=rails-2.1.3&w=100&h=100&auto=compress&s=7053b15a8babcda62c7252482714819a" + }, + { + "Applet_name":"Breaking News", + "Applet_url":"https://ifttt.com/applets/gyuvVb5p/embed?redirect_uri=http://opa.eu.ngrok.io/apps/opa/", + "Applet_color":"#003366", + "Applet_categorie":"News", + "Applet_logo":"https://applets.imgix.net/https%3A%2F%2Fassets.ifttt.com%2Fimages%2Fchannels%2F789804492%2Ficons%2Fon_color_large.png%3Fversion%3D0?ixlib=rails-2.1.3&w=100&h=100&auto=compress&s=d8980de80e654aa336f8cf3febdbdb58" + } +] +} \ No newline at end of file diff --git a/src/opsoro/apps/opa/static/json/Commands.json b/src/opsoro/apps/opa/static/json/Commands.json new file mode 100644 index 0000000..d66cf98 --- /dev/null +++ b/src/opsoro/apps/opa/static/json/Commands.json @@ -0,0 +1,22 @@ +{ "Commands":[ + { + "Command_id": "1", + "Command_name":"Status", + "Command_color":"#3b579d", + "Command_description": "Status update:", + "Command_uses": "Facebook", + "Command_type": "ifttt", + "Command_eventname": "test", + "Command_customizeable": true + }, + { + "Command_id": "2", + "Command_name":"Robot Command", + "Command_color":"#fff222", + "Command_description": "Robot command: do this", + "Command_uses": "Opsoro", + "Command_type": "robot", + "Command_eventname": "", + "Command_customizeable": false + } +]} \ No newline at end of file diff --git a/src/opsoro/apps/opa/templates/opa.html b/src/opsoro/apps/opa/templates/opa.html new file mode 100644 index 0000000..5398071 --- /dev/null +++ b/src/opsoro/apps/opa/templates/opa.html @@ -0,0 +1,325 @@ +{% extends "app_base.html" %} +{% block app_head %} + + + + + + +{% endblock %} + + +{% block sidebar_left %}{% endblock %} +{% block sidebar_right %}{% endblock %} + +{% block app_content %} +
    +
      +
    • + + My Applets + +
      +
      + + + Filters + + + +
      +
      + +
      +
        +
      • + + +
      • +
      +
      +
      +
      + +
      +
      + + + My Applets + + + + +
      +
      +
    • +
    • + + Commands + +
      +
      + + Command Queue + + +
      +
      +
      +

      Move Commands here

      +
      + +
      +
      +
      +
      + + + Commands + + + + +
      +
      + +
    • + + Activity + +
      +
      + + Activity + + +
      + {% for activity in activity %} +
      +
      + Check

      Applet ran

      +

      {{activity.date}} - {{activity.time}}

      +
      +
      +
      {{ activity.service}}
      +

      by Opsoro

      +
      +
      + {% endfor %} +
      +
      +
      +
    • +
    • + + Personal Assistant + +
      +
      + + + Set your Personal Assistant's name +
      +
      +
      + +
      +
      + + +
      +
      +
      +
      +
      +
    • +
    • + + IFTTT Account + +
      +
      + + + Create an IFTTT account + +
      +
      +

      With a free IFTTT account you can manage your account information, manage your own applets and connect with services like Amazon, Facebook, Instagram, Skype, .... Click on the button below to create an IFTTT account.


      + +
      +
      +
      +
      + + + Connect your phone with the IFTTT app + +
      +
      +

      By using the IFTTT app, you can manage your account information, manage your own applets and connect with services like Amazon, Facebook, Instagram, Skype, .... Click on one of the buttons below to download and install the IFTTT app for Android or iOS


      + + +
      +
      +
      +
      +
    • + +
    • + + Create Applets + +
      +
      + + + STEP 1 + +
      +
      +

      Go to the IFTTT website and sign in with the account that you have created earlier.


      + +
      +
      +
      +
      + + + STEP 2 + +
      +
      +

      When you are signed in, choose in the menu above for My Applets. Now you will see all the applets you have created earlier. Choose for New Applet.

      + +
      +
      +
      +
      + + + STEP 3 + +
      +
      +

      Now you will see a page with IF THIS THEN THAT. Click on THIS and choose a service. You can choose any service you want. Follow the steps on-screen to configure your service.

      + +
      +
      +
      +
      + + + STEP 4 + +
      +
      +

      After you have succesfully created your service, you will return to the IF THIS THEN THAT page. Now click on THAT and choose Maker Webhooks as action service.

      + +
      +
      +
      +
      + + + STEP 5 + +
      +
      +

      Choose to make a web request. Fill in the form as shown in the image below. The BODY may vary depending on your chosen service. You can add options in the BODY field by clicking on Add ingredient.

      + +
      +
      +
      +
      + + + STEP 6 + +
      +
      +

      In the last step you get an overview of the applet you have just created. To create the applet click on Finish.

      +
      +
      +
      +
      +
    • +
    +
    + +{% endblock %} +{% block app_scripts %} + + + + + +{% endblock %} +{% block app_modals %} + + + +{% endblock %} diff --git a/src/opsoro/apps/preferences/__init__.py b/src/opsoro/apps/preferences/__init__.py index 0a7a192..0b01fe8 100644 --- a/src/opsoro/apps/preferences/__init__.py +++ b/src/opsoro/apps/preferences/__init__.py @@ -1,34 +1,34 @@ from __future__ import with_statement +import yaml +from flask import Blueprint, flash, redirect, render_template, request, url_for + from opsoro.console_msg import * -# from opsoro.robot import Robot # from opsoro.hardware import Hardware from opsoro.preferences import Preferences - -from flask import Blueprint, render_template, request, redirect, url_for, flash +from opsoro.robot import Robot +from opsoro.updater import Updater # constrain = lambda n, minn, maxn: max(min(maxn, n), minn) -config = {'full_name': 'Preferences', - 'icon': 'fa-cog', - 'color': '#555', - 'allowed_background': False, - 'robot_state': 0} +config = { + 'full_name': 'Preferences', + 'author': 'OPSORO', + 'icon': 'fa-cog', + 'color': 'gray_dark', + 'difficulty': 3, + 'tags': ['settings', 'setup'], + 'allowed_background': False, + 'multi_user': False, + 'connection': Robot.Connection.OFFLINE, + 'activation': Robot.Activation.MANUAL +} config['formatted_name'] = config['full_name'].lower().replace(' ', '_') - -# robot_state: -# 0: Manual start/stop -# 1: Start robot automatically (alive feature according to preferences) -# 2: Start robot automatically and enable alive feature -# 3: Start robot automatically and disable alive feature - -# clientconn = None # dof_positions = {} # import os # from functools import partial -import yaml try: from yaml import CLoader as Loader except ImportError: @@ -36,13 +36,7 @@ def setup_pages(opsoroapp): - app_bp = Blueprint( - config['formatted_name'], - __name__, - template_folder='templates', - static_folder='static') - - global clientconn + app_bp = Blueprint(config['formatted_name'], __name__, template_folder='templates', static_folder='static') @app_bp.route('/', methods=['GET', 'POST']) @opsoroapp.app_view @@ -51,134 +45,93 @@ def index(): if request.method == 'POST': # Update preferences request.form.get('file_name_ext', type=str, default=None) - Preferences.set('general', - 'robot_name', - request.form.get('robotName', - type=str, - default=None)) + Preferences.set('general', 'robot_name', request.form.get('robotName', type=str, default=None)) + Preferences.set('general', 'startup_app', request.form.get('startupApp', type=str, default=None)) pass1 = request.form.get('robotPassword', type=str, default=None) - pass2 = request.form.get('robotPasswordConfirm', - type=str, - default=None) + pass2 = request.form.get('robotPasswordConfirm', type=str, default=None) if pass1 is not None and pass1 == pass2: if pass1 != '': - Preferences.set('general', 'password', pass1) + Preferences.set('security', 'password', pass1) # Preferences.set('update', 'branch', request.form.get('updateBranch', type=str, default=None)) # Preferences.set('update', 'auto_update', # request.form.get('updateAuto', type=str, default=None)) - Preferences.set('alive', - 'enabled', - request.form.get('aliveEnabled', - type=bool, - default=False)) - # Preferences.set('alive', 'aliveness', request.form.get('aliveness', type=str, default=None)) - Preferences.set('alive', 'aliveness', 0) - Preferences.set('alive', - 'blink', - request.form.get('aliveBlink', - type=bool, - default=False)) - Preferences.set('alive', - 'gaze', - request.form.get('aliveGaze', - type=bool, - default=False)) - - Preferences.set('audio', - 'master_volume', - request.form.get('volume', type=int)) - Preferences.set('audio', - 'tts_engine', - request.form.get('ttsEngine', - type=str, - default=None)) - Preferences.set( - 'audio', - 'tts_language', - request.form.get('ttsLanguage', type=str, default=None)) - Preferences.set('audio', - 'tts_gender', - request.form.get('ttsGender', - type=str, - default=None)) - - Preferences.set('wireless', - 'ssid', - request.form.get('wirelessSsid', - type=str, - default=None)) - Preferences.set('wireless', - 'channel', - request.form.get('wirelessChannel', type=int)) + Preferences.set('behaviour', 'enabled', request.form.get('behaviourEnabled', type=bool, default=False)) + # Preferences.set('behaviour', 'caffeine', request.form.get('caffeine', type=str, default=None)) + Preferences.set('behaviour', 'caffeine', 0) + Preferences.set('behaviour', 'blink', request.form.get('behaviourBlink', type=bool, default=False)) + Preferences.set('behaviour', 'gaze', request.form.get('behaviourGaze', type=bool, default=False)) + + Preferences.set('audio', 'master_volume', request.form.get('volume', type=int)) + Preferences.set('audio', 'tts_engine', request.form.get('ttsEngine', type=str, default=None)) + Preferences.set('audio', 'tts_language', request.form.get('ttsLanguage', type=str, default=None)) + Preferences.set('audio', 'tts_gender', request.form.get('ttsGender', type=str, default=None)) + + Preferences.set('wireless', 'ssid', request.form.get('wirelessSsid', type=str, default=None)) + Preferences.set('wireless', 'channel', request.form.get('wirelessChannel', type=int)) if request.form.get('wirelessSamePass', None) == 'on': # Set to same password - Preferences.set('wireless', 'password', Preferences.get( - 'general', 'password', 'RobotOpsoro')) + Preferences.set('wireless', 'password', Preferences.get('general', 'password', 'RobotOpsoro')) else: - pass1 = request.form.get('wirelessPassword', - type=str, - default=None) - pass2 = request.form.get('wirelessPasswordConfirm', - type=str, - default=None) + pass1 = request.form.get('wirelessPassword', type=str, default=None) + pass2 = request.form.get('wirelessPasswordConfirm', type=str, default=None) if pass1 is not None and pass1 == pass2: if pass1 != '': Preferences.set('wireless', 'password', pass1) flash('Preferences have been saved.', 'success') Preferences.save_prefs() - Preferences.apply_prefs( - update_audio=True, - update_wireless=True, - restart_wireless=False) + Preferences.apply_prefs(update_audio=True, update_wireless=True, restart_wireless=False) # Prepare json string with prefs data data['prefs'] = { 'general': { - 'robotName': - Preferences.get('general', 'robot_name', 'Robot') + 'robotName': Preferences.get('general', 'robot_name', 'Robot'), + 'startupApp': Preferences.get('general', 'startup_app', '') }, 'update': { - 'available': Preferences.check_if_update(), - 'branch': Preferences.get('update', 'branch', - Preferences.get_current_branch()), - # 'branches': Preferences.get_remote_branches(), - 'autoUpdate': Preferences.get('update', 'auto_update', False) + 'available': Updater.is_update_available(), + 'branch': Preferences.get('update', 'branch', Updater.get_current_branch()), + 'revision': Preferences.get('update', 'revision', Updater.get_current_revision()), + # 'branches': Preferences.get_remote_branches(), + 'autoUpdate': Preferences.get('update', 'auto_update', False) }, - 'alive': { - 'enabled': Preferences.get('alive', 'enabled', False), - 'aliveness': Preferences.get('alive', 'aliveness', '0'), - 'blink': Preferences.get('alive', 'blink', True), - 'gaze': Preferences.get('alive', 'gaze', True) + 'behaviour': { + 'enabled': Preferences.get('behaviour', 'enabled', False), + 'caffeine': Preferences.get('behaviour', 'caffeine', '0'), + 'blink': Preferences.get('behaviour', 'blink', True), + 'gaze': Preferences.get('behaviour', 'gaze', True) }, 'audio': { - 'volume': Preferences.get('audio', 'master_volume', 66), - 'ttsEngine': Preferences.get('audio', 'tts_engine', 'pico'), - 'ttsLanguage': Preferences.get('audio', 'tts_language', 'nl'), - 'ttsGender': Preferences.get('audio', 'tts_gender', 'm') + 'volume': Preferences.get('audio', 'master_volume', 66), + 'ttsEngine': Preferences.get('audio', 'tts_engine', 'pico'), + 'ttsLanguage': Preferences.get('audio', 'tts_language', 'nl'), + 'ttsGender': Preferences.get('audio', 'tts_gender', 'm') }, 'wireless': { - 'ssid': - Preferences.get('wireless', 'ssid', 'OPSORO' + '_AP'), - 'samePassword': - Preferences.get('general', 'password', 'RobotOpsoro') == - Preferences.get('wireless', 'password', 'RobotOpsoro'), - 'channel': Preferences.get('wireless', 'channel', '1') + 'ssid': Preferences.get('wireless', 'ssid', 'OPSORO' + '_bot'), + 'samePassword': Preferences.get('general', 'password', 'opsoro123') == + Preferences.get('wireless', 'password', 'opsoro123'), + 'channel': Preferences.get('wireless', 'channel', '1') } } - print_info(data) + print data + + data['apps'] = [] + for appi in opsoroapp.apps: + data['apps'].append(str(appi)) return opsoroapp.render_template(config['formatted_name'] + '.html', **data) @app_bp.route('/update', methods=['GET', 'POST']) @opsoroapp.app_view def update(): - Preferences.update() + Updater.update() + return redirect("/") opsoroapp.register_app_blueprint(app_bp) diff --git a/src/opsoro/apps/preferences/static/app.js b/src/opsoro/apps/preferences/static/app.js index aa7c763..544d5e8 100644 --- a/src/opsoro/apps/preferences/static/app.js +++ b/src/opsoro/apps/preferences/static/app.js @@ -2,25 +2,27 @@ $(document).ready(function () { var GeneralSettings = function () { var self = this; - self.robotName = ko.observable(""); - self.password = ko.observable(""); - self.passwordConfirm = ko.observable(""); + self.robotName = ko.observable(''); + self.startupApp = ko.observable(''); + self.apps = ['--None--']; + self.apps = self.apps.concat(appsJson); }; var UpdateSettings = function () { var self = this; self.available = ko.observable(false); - self.branch = ko.observable(""); + self.revision = ko.observable(''); + self.branch = ko.observable(''); self.branches = ko.observable(); self.autoUpdate = ko.observable(false); }; - var AliveSettings = function () { + var BehaviourSettings = function () { var self = this; self.enabled = ko.observable(false); - self.aliveness = ko.observable(0); + self.caffeine = ko.observable(0); self.blink = ko.observable(false); self.gaze = ko.observable(false); }; @@ -29,20 +31,20 @@ $(document).ready(function () { var self = this; self.volume = ko.observable(0); - self.ttsEngine = ko.observable("pico"); - self.ttsLanguage = ko.observable("nl"); - self.ttsGender = ko.observable("m"); + self.ttsEngine = ko.observable('pico'); + self.ttsLanguage = ko.observable('nl'); + self.ttsGender = ko.observable('m'); }; var WirelessSettings = function () { var self = this; - self.ssid = ko.observable("OPSORO-bot"); + self.ssid = ko.observable('OPSORO-bot'); - self.password = ko.observable(""); - self.passwordConfirm = ko.observable(""); + self.password = ko.observable(''); + self.passwordConfirm = ko.observable(''); self.samePassword = ko.observable(true); - self.channel = ko.observable("0"); + self.channel = ko.observable('0'); self.settingsChanged = ko.observable(false); var changed_fn = function () { @@ -55,37 +57,56 @@ $(document).ready(function () { self.settingsChanged(false); }; + var SecuritySettings = function () { + var self = this; + + self.password = ko.observable(''); + self.passwordConfirm = ko.observable(''); + }; + var SettingsModel = function () { var self = this; self.general = ko.observable(new GeneralSettings()); self.update = ko.observable(new UpdateSettings()); - self.alive = ko.observable(new AliveSettings()); + + self.behaviour = ko.observable(new BehaviourSettings()); + self.audio = ko.observable(new AudioSettings()); + self.wireless = ko.observable(new WirelessSettings()); + + self.security = ko.observable(new SecuritySettings()); }; var viewmodel = new SettingsModel(); ko.applyBindings(viewmodel); - viewmodel.general().robotName(prefsJson.general.robotName || "Ono"); + viewmodel.general().robotName(prefsJson.general.robotName || 'robot'); + viewmodel.general().startupApp(prefsJson.general.startupApp || ''); + // viewmodel.general().apps = appsJson; viewmodel.update().available(prefsJson.update.available || false); viewmodel.update().branches(prefsJson.update.branches || undefined); viewmodel.update().autoUpdate(prefsJson.update.autoUpdate || false); viewmodel.update().branch(prefsJson.update.branch || ''); + viewmodel.update().revision(prefsJson.update.revision || ''); - viewmodel.alive().enabled(prefsJson.alive.enabled || false); - viewmodel.alive().aliveness(prefsJson.alive.aliveness || 0); - viewmodel.alive().blink(prefsJson.alive.blink || false); - viewmodel.alive().gaze(prefsJson.alive.gaze || false); + viewmodel.behaviour().enabled(prefsJson.behaviour.enabled || false); + viewmodel.behaviour().caffeine(prefsJson.behaviour.caffeine || 0); + viewmodel.behaviour().blink(prefsJson.behaviour.blink || false); + viewmodel.behaviour().gaze(prefsJson.behaviour.gaze || false); viewmodel.audio().volume(prefsJson.audio.volume || 50); - viewmodel.audio().ttsEngine(prefsJson.audio.ttsEngine || "pico"); - viewmodel.audio().ttsLanguage(prefsJson.audio.ttsLanguage || "nl"); - viewmodel.audio().ttsGender(prefsJson.audio.ttsGender || "m"); + viewmodel.audio().ttsEngine(prefsJson.audio.ttsEngine || 'pico'); + viewmodel.audio().ttsLanguage(prefsJson.audio.ttsLanguage || 'nl'); + viewmodel.audio().ttsGender(prefsJson.audio.ttsGender || 'm'); - viewmodel.wireless().ssid(prefsJson.wireless.ssid || "OPSORO-bot"); + viewmodel.wireless().ssid(prefsJson.wireless.ssid || 'OPSORO-bot'); viewmodel.wireless().samePassword(prefsJson.wireless.samePassword || true); viewmodel.wireless().channel(prefsJson.wireless.channel || 6); viewmodel.wireless().settingsChanged(false); + + // console.log('loaded'); + // console.log(viewmodel.general().apps); + }); diff --git a/src/opsoro/apps/preferences/templates/preferences.html b/src/opsoro/apps/preferences/templates/preferences.html index 707a970..965d28d 100644 --- a/src/opsoro/apps/preferences/templates/preferences.html +++ b/src/opsoro/apps/preferences/templates/preferences.html @@ -1,289 +1,359 @@ {% extends "app_base.html" %} -{% block head %}{% endblock %} +{% block app_head %}{% endblock %} + +{% block app_toolbar %} + {% include "toolbar/_settings_operations.html" %} +{% endblock %} + {% block app_content %} -
    -
    - - - General - + -
    -
    -
    - Update available! -
    -
    - Up-to-date! -
    -
    -
    - -
    + --> - + +
    +
      +
    • + + General + +
      +
      + + + General + -
      - - - Aliveness - -
      -
      - -
      - - - - +
      +
      + +
      +
      + + A valid name is required +
      -
      -
      -
      -
      -
      - +
      +
      + +
      +
      + +
      -
      --> -
      -
      - - -
      - - - - +
      +
      + Update available! +
      +
      + Up-to-date!
      -
      -
      -
      - -
      - - - - + -
      -
      -
      -
      - - - Audio +
      +
      +
    • +
    • + + Audio + +
      +
      + + + Audio -
      -
      - -
      -
      -
      - - - +
      +
      + +
      +
      +
      + + + +
      +
      +
      + +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      + +
      -
      -
      - -
      -
      -
      -
      - -
      -
      - -
      -
      -
      -
      - -
      -
      - -
      -
      -
      -
      - -
      -
      - -
      -
      -
      + +
      +
    • +
    • + + Interactivity + +
      +
      + + + Behaviour + +
      +
      + +
      + + + + +
      +
      +
      +
      + +
      +
      + -
      - - - Wireless +
      + + + + +
      +
      +
      +
      +
      + +
      + + + + +
      +
      +
      +
      +
      +
      +
    • +
    • + + Connectivity + +
      +
      + + + Wireless -
      - - Wireless settings have been changed. They will take effect the next time the robot is started. -
      -
      -
      - -
      -
      - - A valid ssid is required -
      -
      -
      -
      - -
      -
      - -
      -
      -
      -
      - -
      -
      - - The password did not match -
      -
      -
      -
      - - -
      -
      -
      -
      - -
      -
      - -
      -
      -
      +
      + + Wireless settings have been changed. They will take effect the next time the robot is started. +
      +
      +
      + +
      +
      + + A valid ssid is required +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      + + The password did not match +
      +
      +
      +
      + + +
      +
      +
      +
      + +
      +
      + +
      +
      + +
      +
    • +
    • + + Security + +
      +
      + + + Password + +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      + + The password did not match +
      +
      +
      +
      + + Note: + Passwords are stored in a plain text file and are + not secure! Do not use this password for anything else! + +
      +
      +
      +
      +
    • +
    +
    -
    - - - - Revert -
    - + {% endblock %} {% block app_scripts %} - {% endblock %} {% block app_modals %} -
    +
    - + {{ _('Update') }}
    diff --git a/src/opsoro/apps/robot_configurator/__init__.py b/src/opsoro/apps/robot_configurator/__init__.py new file mode 100644 index 0000000..dc892df --- /dev/null +++ b/src/opsoro/apps/robot_configurator/__init__.py @@ -0,0 +1,105 @@ +from __future__ import with_statement + +import glob +import os +from functools import partial + +import yaml +from flask import Blueprint, render_template, request + +from opsoro.console_msg import * +from opsoro.hardware import Hardware +from opsoro.robot import Robot + +try: + from yaml import CLoader as Loader +except ImportError: + from yaml import Loader + + +def constrain(n, minn, maxn): return max(min(maxn, n), minn) + + +config = { + 'full_name': 'Robot Configurator', + 'author': 'OPSORO', + 'icon': 'fa-pencil', + 'color': 'red', + 'difficulty': 3, + 'tags': ['design', 'setup', 'robot', 'configuration'], + 'allowed_background': False, + 'multi_user': False, + 'connection': Robot.Connection.OFFLINE, + 'activation': Robot.Activation.AUTO_NOT_ALIVE, +} +config['formatted_name'] = config['full_name'].lower().replace(' ', '_') + +get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) + + +def setup_pages(opsoroapp): + app_bp = Blueprint(config['formatted_name'], __name__, template_folder='templates', static_folder='static') + + @app_bp.route('/', methods=['GET']) + @opsoroapp.app_view + def index(): + data = { + 'actions': {}, + 'data': [], + 'modules': [], + 'svg_codes': {}, + 'configs': {}, + 'specs': {}, + 'skins': [], + } + + data['actions']['openfile'] = request.args.get('f', None) + + modules_folder = '../../modules/' + modules_static_folder = '../../server/static/modules/' + + # get modules + filenames = [] + filenames.extend(glob.glob(get_path(modules_folder + '*/'))) + for filename in filenames: + module_name = filename.split('/')[-2] + data['modules'].append(module_name) + with open(get_path(modules_folder + module_name + '/specs.yaml')) as f: + data['specs'][module_name] = yaml.load(f, Loader=Loader) + + with open(get_path(modules_static_folder + module_name + '/front.svg')) as f: + data['svg_codes'][module_name] = f.read() + + data['configs'] = Robot.config + + # filenames = [] + # filenames.extend(glob.glob(get_path('static/images/skins/*.svg'))) + # for filename in filenames: + # data['skins'].append(os.path.splitext(os.path.split(filename)[1])[0]) + + return opsoroapp.render_template(config['formatted_name'] + '.html', **data) + + @opsoroapp.app_socket_message('setServoPos') + def s_setServoPos(conn, data): + pin = constrain(int(data.pop('pin', None)), 0, 15) + value = constrain(int(data.pop('value', None)), 500, 2500) + + if pin is None or value is None: + conn.send_data('error', {'message': 'No valid pin or value given.'}) + return + + Hardware.Servo.set(pin, value) + + opsoroapp.register_app_blueprint(app_bp) + + +def setup(opsoroapp): + pass + + +def start(opsoroapp): + pass + + +def stop(opsoroapp): + pass diff --git a/src/opsoro/apps/robot_configurator/static/app.css b/src/opsoro/apps/robot_configurator/static/app.css new file mode 100644 index 0000000..7b74662 --- /dev/null +++ b/src/opsoro/apps/robot_configurator/static/app.css @@ -0,0 +1,58 @@ +.model { + padding: 0; + margin-top: -30px; +} +.config-settings { + margin: 0; + padding: 0; +} +.modules { + margin-top: 0rem; + padding: 0 1rem 1rem; + /*height: 20rem;*/ + /*border: 1px solid silver;*/ +} +.module { + margin: 0rem; + margin-left: -1px; + padding: 0.5rem; + /*border: 1px solid silver;*/ +} +.module:hover { + background-color: #B0FFCB; +} +.module img { + height: 100%; +} +.module-settings { + padding: 0 .5rem 0 0; +} +.module-settings select { + padding: 0 1.5rem 0 .1rem; + font-size: .9rem; + height: 1.5rem; + margin: 0; +} +.module-settings input { + padding: 0; + font-size: .9rem; + height: 1.5rem; + margin: 0; +} +.module-settings .slider { + margin: .5rem .5rem 0 0; +} +.dof-settings { + font-size: .85rem; + border-bottom: 1px solid silver; + padding: .5rem 0; +} +.dof-settings:last-child { + border-style: none; +} +.settings-item { + padding: 0; +} +.draggable { + cursor: move; +} diff --git a/src/opsoro/apps/robot_configurator/static/app.js b/src/opsoro/apps/robot_configurator/static/app.js new file mode 100644 index 0000000..47c4056 --- /dev/null +++ b/src/opsoro/apps/robot_configurator/static/app.js @@ -0,0 +1,238 @@ + + +var select_dof = function(index) { + var self = this; + self.index = index || 0; + self.name = ko.observable(virtualModel.selected_module.dofs[self.index].name); + self.name_formatted = ko.observable(virtualModel.selected_module.dofs[self.index].name_formatted); + + self.pin_value = ko.observable(virtualModel.selected_module.dofs[self.index].servo.pin); + self.pin = ko.pureComputed({ + read: function () { + return self.pin_value(); + }, + write: function (value) { + if (value == self.pin_value()) { return; } + model.update_servo_pins(self.pin_value(), value); + self.pin_value(value); + virtualModel.selected_module.dofs[self.index].servo.pin = value; + self._update_servo(self.mid_value()); + }, + owner: self + }); + + self.mid_value = ko.observable(virtualModel.selected_module.dofs[self.index].servo.mid); + self.mid = ko.pureComputed({ + read: function () { + return self.mid_value(); + }, + write: function (value) { + if (value == self.mid_value()) { return; } + self.mid_value(value); + virtualModel.selected_module.dofs[self.index].servo.mid = value; + self._update_servo(value); + }, + owner: self + }); + + self.min_value = ko.observable(virtualModel.selected_module.dofs[self.index].servo.min); + self.min = ko.pureComputed({ + read: function () { + return self.min_value(); + }, + write: function (value) { + if (value == self.min_value()) { return; } + self.min_value(value); + virtualModel.selected_module.dofs[self.index].servo.min = value; + self._update_servo(value); + }, + owner: self + }); + + self.max_value = ko.observable(virtualModel.selected_module.dofs[self.index].servo.max); + self.max = ko.pureComputed({ + read: function () { + return self.max_value(); + }, + write: function (value) { + if (value == self.max_value()) { return; } + self.max_value(value); + virtualModel.selected_module.dofs[self.index].servo.max = value; + self._update_servo(value); + }, + owner: self + }); + + self._update_servo = function(value) { + if (self.pin_value() < 0) { return; } + if(connReady) { + conn.send(JSON.stringify({ + action: "setServoPos", + pin: self.pin_value(), + value: value, + })); + } + }; +}; + +var select_module = function() { + var self = this; + self.name = new ClickToEdit(virtualModel.selected_module.name, 'Untitled'); + self.code = ko.observable(virtualModel.selected_module.code); + self.dofs = ko.observableArray(); + + self.rotate = function() { + virtualModel.selected_module.rotate(); + }; + self.remove = function() { + for (var i = 0; i < self.dofs().length; i++) { + model.update_servo_pins(self.dofs()[i].pin_value(), -1); + } + virtualModel.selected_module.remove(); + }; + + self.name_changed = ko.computed(function () { + var value = self.name.value(); + virtualModel.selected_module.name = value; + return value; + }, self); + + self.refresh = function() { + self.dofs.removeAll(); + + if (virtualModel.selected_module == undefined) { return; } + + self.name.value(virtualModel.selected_module.name); + for (var i = 0; i < virtualModel.selected_module.dofs.length; i++) { + self.dofs.push(new select_dof(i)); + } + }; + self.refresh(); + +}; + +var AppModel = function() { + var self = this; + // Setup link with virtual model + self.selected_module = ko.observable(); + + self.change_handler = function() { + if (virtualModel.selected_module == undefined) { + self.selected_module(undefined); + return; + } + self.selected_module(new select_module()); + Foundation.reInit($('[data-slider]')); + }; + virtualModel.change_handler = self.change_handler; + + self.available_servos = ko.observableArray(); + self.available_servos.push({ 'name': 'Not connected', 'pin': -1, 'class': '', 'disabled': false }); + for (var i = 0; i < 16; i++) { + self.available_servos.push({ 'name': 'Pin ' + i, 'pin': i, 'class': 'pin' + i, 'disabled': false }); + } + + self.update_servo_pins = function(old_value, new_value) { + if (new_value >= 0) { + self.available_servos()[new_value + 1]['disabled'] = true; + $('.' + self.available_servos()[new_value + 1]['class']).attr('disabled', ''); + } + if (old_value >= 0) { + self.available_servos()[old_value + 1]['disabled'] = false; + $('.' + self.available_servos()[old_value + 1]['class']).removeAttr('disabled'); + } + }; + + self.fileIsModified = ko.observable(false); + self.fileStatus = ko.observable(''); + self.fileExtension = '.conf'; + + self.newFileData = function() { + virtualModel.set_config({}); + self.fileIsModified(false); + }; + + self.loadFileData = function(data) { + if (data == undefined) { return; } + // Load script + var dataobj = JSON.parse(data); + virtualModel.set_config(dataobj); + self.fileIsModified(false); + return true; + }; + + self.saveFileData = function() { + file_data = virtualModel.get_config(); + self.fileIsModified(false); + return ko.toJSON(file_data, null, 2); + }; + + self.setDefault = function() { + robotSendReceiveConfig(virtualModel.get_config()); + }; + + self.init = function() { + for (var i = 0; i < virtualModel.modules.length; i++) { + var mod = virtualModel.modules[i]; + for (var j = 0; j < mod.dofs.length; j++) { + var dof = mod.dofs[j]; + if (dof.servo.pin >= 0) { + self.available_servos()[dof.servo.pin + 1].disabled = true; + } + } + } + }; +}; + +var model; +$(document).ready(function() { + model = new AppModel(); + ko.applyBindings(model); + + setTimeout(model.init, 500); + + config_file_operations("", model.fileExtension, model.saveFileData, model.loadFileData, model.newFileData); + + init_touch(); +}); + +function allowDrop(ev) { + ev.preventDefault(); +} + +function drag(ev) { + ev.dataTransfer.setData("module_type", ev.target.id); +} + +function drop(ev) { + ev.preventDefault(); + var data = ev.dataTransfer.getData("module_type"); + virtualModel.add_module(data, ''); + virtualModel.modules[virtualModel.modules.length-1].set_pos(ev.pageX - virtualModel.canvasX, ev.pageY - virtualModel.canvasY); + virtualModel.modules[virtualModel.modules.length-1].update_grid_pos(); + virtualModel.modules[virtualModel.modules.length-1].select(); +} + +function touchHandler(event) { + var touch = event.changedTouches[0]; + + var simulatedEvent = document.createEvent("MouseEvent"); + simulatedEvent.initMouseEvent({ + touchstart: "mousedown", + touchmove: "mousemove", + touchend: "mouseup" + }[event.type], true, true, window, 1, + touch.screenX, touch.screenY, + touch.clientX, touch.clientY, false, + false, false, false, 0, null); + + touch.target.dispatchEvent(simulatedEvent); + event.preventDefault(); +} + +function init_touch() { + document.addEventListener("touchstart", touchHandler, true); + document.addEventListener("touchmove", touchHandler, true); + document.addEventListener("touchend", touchHandler, true); + document.addEventListener("touchcancel", touchHandler, true); +} diff --git a/src/opsoro/apps/robot_configurator/templates/robot_configurator.html b/src/opsoro/apps/robot_configurator/templates/robot_configurator.html new file mode 100644 index 0000000..685daf3 --- /dev/null +++ b/src/opsoro/apps/robot_configurator/templates/robot_configurator.html @@ -0,0 +1,108 @@ +{% extends "app_base.html" %} + +{% block app_toolbar %} + {% include "toolbar/_file_operations.html" %} + {% include "toolbar/_file_set_default.html" %} +{% endblock %} + +{% block head %} + +{% endblock %} + +{% block app_content %} +
    +
    +
    +
    +
    +
    + {% for module in modules %} +
    + +
    + {% endfor %} +
    +
    +
    + + +   + + + + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +{% endblock %} + +{% block app_scripts %} + + + + + + + + {% for module in modules %} + + {% endfor %} + +{% endblock %} + +{% block app_modals %} + + +{% endblock %} diff --git a/src/opsoro/apps/sliders/__init__.py b/src/opsoro/apps/sliders/__init__.py index 4e80fcc..5132f95 100644 --- a/src/opsoro/apps/sliders/__init__.py +++ b/src/opsoro/apps/sliders/__init__.py @@ -1,35 +1,38 @@ from __future__ import with_statement +import os +from functools import partial + +import yaml +from flask import Blueprint, flash, redirect, render_template, request, url_for + from opsoro.console_msg import * from opsoro.expression import Expression -from opsoro.robot import Robot from opsoro.hardware import Hardware +from opsoro.robot import Robot -from flask import Blueprint, render_template, request, redirect, url_for, flash -constrain = lambda n, minn, maxn: max(min(maxn, n), minn) +def constrain(n, minn, maxn): return max(min(maxn, n), minn) -config = {'full_name': 'Sliders', - 'icon': 'fa-sliders', - 'color': '#15e678', - 'allowed_background': False, - 'robot_state': 1} -config['formatted_name'] = config['full_name'].lower().replace(' ', '_') -# robot_state: -# 0: Manual start/stop -# 1: Start robot automatically (alive feature according to preferences) -# 2: Start robot automatically and enable alive feature -# 3: Start robot automatically and disable alive feature +config = { + 'full_name': 'Sliders', + 'author': 'OPSORO', + 'icon': 'fa-sliders', + 'color': 'gray_light', + 'difficulty': 2, + 'tags': ['sliders', 'dofs'], + 'allowed_background': False, + 'multi_user': False, + 'connection': Robot.Connection.OFFLINE, + 'activation': Robot.Activation.AUTO +} +config['formatted_name'] = config['full_name'].lower().replace(' ', '_') -clientconn = None # dof_positions = {} -import os -from functools import partial get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) -import yaml try: from yaml import CLoader as Loader except ImportError: @@ -37,13 +40,7 @@ def setup_pages(opsoroapp): - sliders_bp = Blueprint( - config['formatted_name'], - __name__, - template_folder='templates', - static_folder='static') - - global clientconn + sliders_bp = Blueprint(config['formatted_name'], __name__, template_folder='templates', static_folder='static') @sliders_bp.route('/') @opsoroapp.app_view @@ -52,35 +49,10 @@ def index(): # 'dofs': [] } - # global dof_positions - # - # for servo in Expression.servos: - # if servo.pin >= 0 and servo.pin < 16: - # # Pin is valid, add to the page - # data['dofs'].append({ - # 'name': servo.dofname, - # 'pin': servo.pin, - # 'min': servo.min_range, - # 'mid': servo.mid_pos, - # 'max': servo.max_range, - # 'current': dof_positions[servo.dofname] - # }) - - with open(get_path('../../config/default.conf')) as f: - data['config'] = yaml.load(f, Loader=Loader) + data['config'] = Robot.config['modules'] return opsoroapp.render_template(config['formatted_name'] + '.html', **data) - @opsoroapp.app_socket_connected - def s_connected(conn): - global clientconn - clientconn = conn - - @opsoroapp.app_socket_disconnected - def s_disconnected(conn): - global clientconn - clientconn = None - @opsoroapp.app_socket_message('setDofPos') def s_setdofpos(conn, data): modulename = str(data.pop('module_name', None)) @@ -89,29 +61,12 @@ def s_setdofpos(conn, data): if modulename is None or dofname is None: conn.send_data('error', {'message': 'No valid dof name given.'}) + return Robot.set_dof_value(modulename, dofname, pos, 0) - # global dof_positions - # if dofname not in dof_positions: - # conn.send_data('error', {'message': 'Unknown DOF name.'}) - # else: - # pos = constrain(pos, -1.0, 1.0) - # dof_positions[dofname] = pos - - # with Expression.lock: - # Expression.update() opsoroapp.register_app_blueprint(sliders_bp) -# def overlay_fn(dof_pos, dof): -# # Overwrite all DOFs to use the ones from the slider app -# global dof_positions -# -# if dof.name in dof_positions: -# return dof_positions[dof.name] -# else: -# return dof_pos - def setup(opsoroapp): pass diff --git a/src/opsoro/apps/sliders/static/app.css b/src/opsoro/apps/sliders/static/app.css index 4a392c4..efaba8e 100644 --- a/src/opsoro/apps/sliders/static/app.css +++ b/src/opsoro/apps/sliders/static/app.css @@ -1,19 +1,26 @@ .sliderrow { margin-bottom: 1rem !important; + font-size: 0.8rem; +} + +.sliderrow .note { + margin: 0; + padding: 0; + font-size: 0.75rem; } .sliderrow:last-child{ margin-bottom: 0 !important; } -.sliderrow .range-slider{ +.sliderrow .slider{ margin: 0; - /*margin-top: 0.5rem;*/ + margin-top: 0.5rem; } .sliderrow .numberstop { - margin-top: 1.5rem; + margin-top: 0.5rem; font-size: 0.75rem; line-height: 1rem; font-weight: bold; @@ -21,6 +28,7 @@ } .sliderrow .numbersbottom { + margin-top: 0.2rem; font-size: 0.75rem; line-height: 1rem; font-weight: 300; diff --git a/src/opsoro/apps/sliders/templates/sliders.html b/src/opsoro/apps/sliders/templates/sliders.html index c16b1dd..15fa563 100644 --- a/src/opsoro/apps/sliders/templates/sliders.html +++ b/src/opsoro/apps/sliders/templates/sliders.html @@ -1,66 +1,33 @@ {% extends "app_base.html" %} -{% block head %} +{% block app_head %} {% endblock %} {% block app_content %} - - {% if config %} - {% for module in config.modules %} + {% for module in config %} {% for dof in module.dofs %} - {% if dof.servo %} + {% if dof.servo and dof.servo.pin >= 0 %}
    -
    {{ dof.name|upper }}
    -
    + +
    {{ module.name|upper + ': ' + dof.name|upper }}
    - - Pin: {{ dof.servo.pin|int }}
    - DOF: 0
    - Servo: 0 µs
    + +
    Pin: {{ dof.servo.pin|int }}
    +
    DOF: 0
    +
    Servo: 0 µs
    -
    +
    -1.0
    0.0
    +1.0
    -
    - - +
    + +
    @@ -78,86 +45,51 @@ {% endblock %} {% block app_scripts %} - - diff --git a/src/opsoro/apps/social_response/__init__.py b/src/opsoro/apps/social_response/__init__.py new file mode 100644 index 0000000..d066b89 --- /dev/null +++ b/src/opsoro/apps/social_response/__init__.py @@ -0,0 +1,260 @@ +from __future__ import with_statement + +import json +import os +import time +# ------------------------------------------------------------------------------ +# Facebook stuff --------------------------------------------------------------- +# ------------------------------------------------------------------------------ +import urllib2 +from functools import partial +from random import randint + +# ------------------------------------------------------------------------------ +# Twitter stuff ---------------------------------------------------------------- +# ------------------------------------------------------------------------------ +import tweepy +from flask import (Blueprint, flash, redirect, render_template, request, + send_from_directory, url_for) + +from opsoro.console_msg import * +from opsoro.expression import Expression +from opsoro.hardware import Hardware +from opsoro.robot import Robot +from opsoro.sound import Sound +from opsoro.stoppable_thread import StoppableThread + + +def constrain(n, minn, maxn): return max(min(maxn, n), minn) + + +get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) + +config = { + 'full_name': 'Social Response', + 'author': 'OPSORO', + 'icon': 'fa-share-square', + 'color': 'blue', + 'difficulty': 3, + 'tags': ['social', 'facebook', 'twitter'], + 'allowed_background': True, + 'multi_user': False, + 'connection': Robot.Connection.ONLINE, + 'activation': Robot.Activation.AUTO +} +config['formatted_name'] = config['full_name'].lower().replace(' ', '_') + +loop_t = None +loop_button_t = None +# running = False + + +def get_page_data(page_id, fields, access_token): + api_endpoint = "https://graph.facebook.com/v2.4/" + fb_graph_url = api_endpoint + page_id + '?fields=' + fields + '&access_token=' + access_token + try: + api_request = urllib2.Request(fb_graph_url) + api_response = urllib2.urlopen(api_request) + + try: + return json.loads(api_response.read()) + except (ValueError, KeyError, TypeError): + return "JSON error" + + except IOError, e: + if hasattr(e, 'code'): + return e.code + elif hasattr(e, 'reason'): + return e.reason + + +page_id = 'opsoro' # username or id +field = 'fan_count' +token = 'EAAaBZCzjU8H8BAFV7KudJn0K1V12CDBHqTIxYu6pVh7cpZAbt1WbZCyZBeSZC472fpPd0ZAkWC1tMrfAY26XnQJUR2rNrMQncQ9OGJlie3dUeQVvabZCwNmGaLL4FGHjZBVTajid16FL5niGWytlwZCiFDgj6yjIsZAAAZD' # Access Token + +# Variables that contains the user credentials to access Twitter API +access_token = '735437381696905216-BboISY7Qcqd1noMDY61zN75CdGT0OSc' +access_token_secret = 'd3A8D1ttrCxYV76pBOB389YqoLB32LiE0RVyoFwuMKUMb' +consumer_key = 'AcdgqgujzF06JF6zWrfwFeUfF' +consumer_secret = 'ss0wVcBTFAT6nR6hXrqyyOcFOhpa2sNW4cIap9JOoepcch93ky' + +twitterWords = ['#opsoro'] + +auth = tweepy.OAuthHandler(consumer_key, consumer_secret) +auth.set_access_token(access_token, access_token_secret) + +# override tweepy.StreamListener to add logic to on_status + + +class MyStreamListener(tweepy.StreamListener): + def on_status(self, status): + # print(status.text) + # Go_Crazy(text=status.text, twitter=True) + txt = status.text + for tword in twitterWords: + txt = txt.replace(tword, '') + Go_Crazy(text=txt, twitter=True) + + +api = tweepy.API(auth) +myStreamListener = MyStreamListener() +myStream = tweepy.Stream(auth=api.auth, listener=myStreamListener) + +# followers = [] +# likes = 0 +# counter = 0 +sleep_time = 5 + +# ------------------------------------------------------------------------------ +# ------------------------------------------------------------------------------ + +# Laughing Happy Sad Angry Surprised Afraid Disgusted Tired +emotions_phis = [36.0, 18.0, 198.0, 153.0, 90.0, 125.0, 172.0, 270.0] +sounds = ['smb_1-up.wav', 'smb_coin.wav', 'smb_powerup.wav', 'Whistle.wav', 'Woohoo.wav', 'Small_Applause.wav'] +sound_int = -1 +emotion_int = -1 +prev_emotion_int = emotion_int +prev_sound_int = sound_int + + +def Go_Crazy(text='', twitter=False, facebook=False): + print_info('Do something!') + + global prev_emotion_int + global emotion_int + global prev_sound_int + global sound_int + + while sound_int == prev_sound_int: + sound_int = randint(0, len(sounds) - 1) + + while emotion_int == prev_emotion_int: + emotion_int = randint(0, len(emotions_phis) - 1) + + prev_sound_int = sound_int + prev_emotion_int = emotion_int + + if len(text) > 1: + Sound.say_tts(text) + else: + Sound.play_file(sounds[sound_int]) + Expression.set_emotion_r_phi(1.0, emotions_phis[emotion_int], True, 0.5) + + Hardware.Serial.send('anim\n') + + if twitter: + Hardware.Serial.send('set\nset 000000000000000000247e24247e24\n') + + if facebook: + Hardware.Serial.send('set\nset 00000000000000000818185f5f5f5e5e\n') + + loop_t.sleep(2) + + print_info('Done doing something!') + + +def LoopButton(): + time.sleep(0.05) # delay + while not loop_button_t.stopped(): + if Hardware.Analog.read_channel(0) > 1000: + Go_Crazy() + Sound.wait_for_sound() + loop_button_t.sleep(0.02) + + +def Loop(): + time.sleep(0.05) # delay + counter = 0 + # Initialize current Likes + # global likes + likes = 0 + try: + likes = int(get_page_data(page_id, field, token)[field]) + except Exception as e: + pass + + # Initialize current followers + # global followers + followers = [] + new_followers = [] + for user in tweepy.Cursor(api.followers, screen_name=page_id).items(): + followers.append(user.name) + + while not loop_t.stopped(): + # if running: + data = {} + print_info('Checking social...') + try: + # Facebook: + new_likes = int(get_page_data(page_id, field, token)[field]) + if new_likes > likes: + print_info('Facebook: ' + str(new_likes - likes) + ' new likes.') + Go_Crazy(facebook=True) + + likes = new_likes + # print "Likes: "+ str(page_data[field]) + + # Twitter requests: 1/minute + if len(new_followers) > 0: + username = new_followers.pop() + followers.append(username) + Go_Crazy(text='Hello ' + str(username), twitter=True) + + # global counter + counter += 1 + if counter >= (60 / sleep_time): + for user in tweepy.Cursor(api.followers, screen_name=page_id).items(): + if user.name not in followers: + new_followers.append(user.name) + # print 'new follower: ', user.name + if len(new_followers) > 0: + print_info('Twitter: ' + str(len(new_followers)) + ' new followers.') + counter = 0 + + except Exception as e: + print e + print_warning('Social error, internet, limit, ...?') + + loop_t.sleep(sleep_time) + + +def setup_pages(opsoroapp): + app_bp = Blueprint(config['formatted_name'], __name__, template_folder='templates', static_folder='static') + + @app_bp.route('/', methods=['GET']) + @opsoroapp.app_view + def index(): + data = { + 'actions': {}, + 'data': [], + } + + action = request.args.get('action', None) + if action != None: + data['actions'][action] = request.args.get('param', None) + + return opsoroapp.render_template(config['formatted_name'] + '.html', **data) + + opsoroapp.register_app_blueprint(app_bp) + + +def setup(opsoroapp): + pass + + +def start(opsoroapp): + global loop_t + global loop_button_t + global myStream + myStream.filter(track=twitterWords, async=True) + loop_t = StoppableThread(target=Loop) + loop_button_t = StoppableThread(target=LoopButton) + + +def stop(opsoroapp): + global loop_t + global loop_button_t + global myStream + myStream.disconnect() + loop_t.stop() + loop_button_t.stop() diff --git a/src/opsoro/apps/social_response/blockly/social_response.js b/src/opsoro/apps/social_response/blockly/social_response.js new file mode 100644 index 0000000..f0512d2 --- /dev/null +++ b/src/opsoro/apps/social_response/blockly/social_response.js @@ -0,0 +1,55 @@ +Blockly.Lua.addReservedWords("Social_response"); + +Blockly.Blocks['social_response_facebook'] = { + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/smile-o.svg", 16, 18, "")) + .appendField("set emotion to") + .appendField(new Blockly.FieldDropdown([["neutral", "NEUTRAL"], ["happy", "HAPPY"], ["sad", "SAD"], ["angry", "ANGRY"], ["surprise", "SURPRISE"], ["fear", "FEAR"], ["disgust", "DISGUST"]]), "EMOTION"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(105); + this.setTooltip('Set the current facial expression using Ekman\'s basic emotions'); + } +}; +Blockly.Lua['social_response_facebook'] = function(block) { + var dropdown_emotion = block.getFieldValue('EMOTION'); + var va_map = { + HAPPY: {phi: 18 * Math.PI/180.0, r: 1.0}, + SAD: {phi: 200 * Math.PI/180.0, r: 1.0}, + ANGRY: {phi: 153 * Math.PI/180.0, r: 1.0}, + SURPRISE: {phi: 90 * Math.PI/180.0, r: 1.0}, + FEAR: {phi: 125 * Math.PI/180.0, r: 1.0}, + DISGUST: {phi: 172 * Math.PI/180.0, r: 1.0}, + NEUTRAL: {phi: 0, r: 0.0} + }; + var code = 'Expression:set_emotion_r_phi(' + va_map[dropdown_emotion].r.toFixed(1) + ', ' + va_map[dropdown_emotion].phi.toFixed(2) +')\n'; + return code; +}; + +Blockly.Blocks['social_response_twitter'] = { + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/smile-o.svg", 16, 18, "")) + .appendField("Set emotion to"); + this.appendValueInput("VALENCE") + .setCheck("Number") + .setAlign(Blockly.ALIGN_RIGHT) + .appendField("Valence"); + this.appendValueInput("AROUSAL") + .setCheck("Number") + .setAlign(Blockly.ALIGN_RIGHT) + .appendField("Arousal"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(105); + this.setTooltip('Set the current facial expression using Valence and Arousal. Parameters range from -1.0 to +1.0.'); + } +}; +Blockly.Lua['social_response_twitter'] = function(block) { + var value_valence = Blockly.Lua.valueToCode(block, 'VALENCE', Blockly.Lua.ORDER_ATOMIC); + var value_arousal = Blockly.Lua.valueToCode(block, 'AROUSAL', Blockly.Lua.ORDER_ATOMIC); + + var code = 'Expression:set_emotion_val_ar(' + value_valence + ', ' + value_arousal +')\n'; + return code; +}; diff --git a/src/opsoro/apps/social_response/blockly/social_response.xml b/src/opsoro/apps/social_response/blockly/social_response.xml new file mode 100644 index 0000000..4fdad42 --- /dev/null +++ b/src/opsoro/apps/social_response/blockly/social_response.xml @@ -0,0 +1,13 @@ + + + + + 0.75 + + + + + 0.25 + + + diff --git a/src/opsoro/data/visual_programming/scripts/Scenario_2.xml b/src/opsoro/apps/social_response/static/app.css similarity index 100% rename from src/opsoro/data/visual_programming/scripts/Scenario_2.xml rename to src/opsoro/apps/social_response/static/app.css diff --git a/src/opsoro/apps/social_response/static/app.js b/src/opsoro/apps/social_response/static/app.js new file mode 100644 index 0000000..32029a6 --- /dev/null +++ b/src/opsoro/apps/social_response/static/app.js @@ -0,0 +1,3 @@ +$(document).ready(function() { + +}); diff --git a/src/opsoro/apps/social_response/templates/social_response.html b/src/opsoro/apps/social_response/templates/social_response.html new file mode 100644 index 0000000..29061d7 --- /dev/null +++ b/src/opsoro/apps/social_response/templates/social_response.html @@ -0,0 +1,45 @@ +{% extends "app_base.html" %} +{% block app_head %} + + + +{% endblock %} +{% block app_toolbar %}{% endblock %} + + +{% block sidebar_left %}{% endblock %} +{% block sidebar_right %}{% endblock %} + +{% block app_content %} +
    + + Facebook +
    +
    + + Twitter +
    +
    + +
    +
    +
    + {% if not online %} + + {% endif %} + +{% endblock %} +{% block app_scripts %} + + + + + +{% endblock %} +{% block app_modals %} + +{% endblock %} diff --git a/src/opsoro/apps/social_script/__init__.py b/src/opsoro/apps/social_script/__init__.py index b7af96e..9dcb5d7 100644 --- a/src/opsoro/apps/social_script/__init__.py +++ b/src/opsoro/apps/social_script/__init__.py @@ -1,56 +1,59 @@ from __future__ import with_statement -from flask import Blueprint, render_template, request, redirect, url_for, flash, send_from_directory +import glob +import math +import os +import shutil +import time +from exceptions import RuntimeError +from functools import partial + +import yaml +from flask import (Blueprint, flash, redirect, render_template, request, + send_from_directory, url_for) from werkzeug import secure_filename -from opsoro.sound import Sound -import math import cmath - from opsoro.console_msg import * +from opsoro.expression import Expression from opsoro.hardware import Hardware +from opsoro.robot import Robot +from opsoro.sound import Sound from opsoro.stoppable_thread import StoppableThread -from functools import partial -from exceptions import RuntimeError -import os -import glob -import shutil -import time -import yaml try: from yaml import CLoader as Loader except ImportError: from yaml import Loader -constrain = lambda n, minn, maxn: max(min(maxn, n), minn) + +def constrain(n, minn, maxn): return max(min(maxn, n), minn) # from opsoro.expression import Expression -config = {'full_name': 'Social Script', - 'icon': 'fa-commenting-o', - 'color': '#15e678', - 'allowed_background': False, - 'robot_state': 1} + +config = { + 'full_name': 'Social Script', + 'author': 'OPSORO', + 'icon': 'fa-commenting-o', + 'color': 'orange', + 'difficulty': 4, + 'tags': [''], + 'allowed_background': False, + 'multi_user': True, + 'connection': Robot.Connection.OFFLINE, + 'activation': Robot.Activation.AUTO +} config['formatted_name'] = config['full_name'].lower().replace(' ', '_') -# robot_state: -# 0: Manual start/stop -# 1: Start robot automatically (alive feature according to preferences) -# 2: Start robot automatically and enable alive feature -# 3: Start robot automatically and disable alive feature get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) dof_positions = {} -clientconn = None - def send_stopped(): - global clientconn - if clientconn: - clientconn.send_data('soundStopped', {}) + Users.send_app_data(config['formatted_name'], 'soundStopped', {}) def SocialscriptRun(): @@ -62,11 +65,7 @@ def SocialscriptRun(): def setup_pages(opsoroapp): - socialscript_bp = Blueprint( - config['formatted_name'], - __name__, - template_folder='templates', - static_folder='static') + socialscript_bp = Blueprint(config['formatted_name'], __name__, template_folder='templates', static_folder='static') @socialscript_bp.route('/', methods=['GET']) @opsoroapp.app_view @@ -77,8 +76,7 @@ def index(): if action != None: data['actions'][action] = request.args.get('param', None) - with open(get_path('emotions.yaml')) as f: - data['emotions'] = yaml.load(f, Loader=Loader) + data['emotions'] = Expression.expressions filenames = glob.glob(get_path('../../data/sounds/*.wav')) @@ -88,16 +86,6 @@ def index(): return opsoroapp.render_template(config['formatted_name'] + '.html', **data) - @opsoroapp.app_socket_connected - def s_connected(conn): - global clientconn - clientconn = conn - - @opsoroapp.app_socket_disconnected - def s_disconnected(conn): - global clientconn - clientconn = None - opsoroapp.register_app_blueprint(socialscript_bp) diff --git a/src/opsoro/apps/social_script/static/app.css b/src/opsoro/apps/social_script/static/app.css index 1f024ff..5c6b138 100644 --- a/src/opsoro/apps/social_script/static/app.css +++ b/src/opsoro/apps/social_script/static/app.css @@ -46,7 +46,7 @@ margin-top: -1rem; margin-bottom: .5rem; - margin-left: 1.1rem; + margin-left: .7rem; padding: .5rem; padding-right: .75rem; @@ -128,6 +128,12 @@ width: 35rem; min-height: 10rem; } +#PickEmotionModal .column-block +{ + margin-left: auto; + margin-right: auto; + padding: 0; +} .voiceline .avatar, #PickEmotionModal .avatar @@ -139,9 +145,16 @@ width: 5.5rem; height: 5.5rem; padding: .25rem; + margin: 0 auto; - border: 2px solid #ddd; + /*border: 2px solid #ddd;*/ border-radius: 50%; + + cursor: pointer; +} +.voiceline .avatar .emoji, +#PickEmotionModal .avatar .emoji { + font-size: 5rem; } #PickEmotionModal .avatar @@ -153,6 +166,7 @@ font-size: .8rem; font-weight: bold; + margin: 0; margin-top: .25rem; padding: 0 .5rem; @@ -185,10 +199,13 @@ width: 3.5rem; height: 3.5rem; margin: 0; - margin-bottom: .5rem; - margin-left: .5rem; + /*margin-bottom: .5rem; + margin-left: .5rem;*/ padding-top: .15rem; - padding-left: .15rem; + padding-left: .1rem; +} +.voiceline.locked .avatar .emoji { + font-size: 3.3rem; } #voicelines .voiceline.locked { @@ -242,7 +259,8 @@ padding-top: 1rem; border-radius: 50%; - background-color: #43ac6a; + /*background-color: #43ac6a;*/ + background-color: transparent; } .voiceline .playbutton a span @@ -258,22 +276,23 @@ .voiceline .playbutton a:hover { - background-color: #368a55; + /*background-color: #368a55;*/ + /*background-color: transparent;*/ } .voiceline .playbutton.used .bg { - background: #ddd; + background: #aaa; } .voiceline .playbutton.used a { - background: #b2afa1; + /*background: #b2afa1;*/ } .voiceline .playbutton.used a:hover { - background-color: #545454; + /*background-color: #545454;*/ } .voiceline .playbutton.active .bg @@ -288,24 +307,24 @@ border-right: .6rem solid rgba(34, 181, 115, .41); border-bottom: .6rem solid rgba(34, 181, 115, .41); border-left: .6rem solid rgba(34, 181, 115, .7); - background: #fff; + background: #b2afa1; } .voiceline .playbutton.active a { - background: #43ac6a; + /*background: #43ac6a;*/ } .voiceline .playbutton.active a:hover { - background-color: #368a55; + /*background-color: #368a55;*/ } .voiceline .content { margin-right: 3rem; margin-left: 4rem; - padding: 1.25rem 0 0 0; + padding: .85rem 0 0 0; } .voiceline.unlocked .content @@ -384,7 +403,7 @@ { height: 2rem; margin-left: .5rem; - padding: .25rem 1rem; + padding: .4rem 1rem; } #fixedavatars @@ -431,7 +450,7 @@ font-size: .8rem; position: absolute; - top: .2rem; + top: .8rem; left: 4.5rem; width: 60%; diff --git a/src/opsoro/apps/social_script/static/app.js b/src/opsoro/apps/social_script/static/app.js index 6a7b083..050da7b 100644 --- a/src/opsoro/apps/social_script/static/app.js +++ b/src/opsoro/apps/social_script/static/app.js @@ -35,6 +35,7 @@ $(document).ready(function(){ var self = this; self.emotion = ko.observable(emotion || emotions_data[0]); + console.log(self.emotion()); self.output = ko.observable(output || "tts"); self.tts = ko.observable(tts || ""); @@ -55,8 +56,8 @@ $(document).ready(function(){ } }); - self.avatar = ko.pureComputed(function(){ - return self.emotion().image; + self.emoji = ko.pureComputed(function(){ + return self.emotion().filename; }); self.modified = function(){ @@ -75,11 +76,6 @@ $(document).ready(function(){ self.pressPlay = function(){ if(self.isPlaying()){ robotSendStop(); - // $.ajax({ - // dataType: "json", - // type: "GET", - // url: "stopsound" - // }); self.isPlaying(false); self.hasPlayed(true); }else{ @@ -87,64 +83,16 @@ $(document).ready(function(){ model.selectedVoiceLine().isPlaying(false); } model.selectedVoiceLine(self); - if (self.emotion().emotion){ - // $.ajax({ - // dataType: "json", - // data: {"phi": self.emotion().emotion.phi, "r": self.emotion().emotion.r}, - // type: "POST", - // url: "setemotion", - // success: function(data){ - // if(data.status == "error"){ - // addError(data.message); - // } - // } - // }); - robotSendEmotionRPhi(self.emotion().emotion.r, self.emotion().emotion.phi, -1); + if (self.emotion().poly){ + robotSendEmotionRPhi(1.0, self.emotion().poly * 18, -1); } - if (self.emotion().custom){ - dofdata = {}; - $.each(self.emotion().custom, function(idx, customControl){ - dofdata[customControl.dofname] = customControl.pos; - }); - var json_data = ko.toJSON(dofdata, null, 2); - - robotSendAllDOF(json_data); - // $.ajax({ - // dataType: "json", - // data: { dofdata: json_data }, - // type: "POST", - // url: "setDofData", - // success: function(data){ - // if(data.status == "error"){ - // addError(data.message); - // } - // } - // }); + if (self.emotion().dofs){ + robotSendReceiveAllDOF(self.emotion().dofs); } if(this.output() == "tts"){ robotSendTTS(self.tts()); - // $.ajax({ - // dataType: "json", - // type: "GET", - // url: "saytts", - // data: {text: self.tts()}, - // success: function(data){ - // - // } - // }); }else{ robotSendSound(self.wav()); - // $.ajax({ - // dataType: "json", - // type: "GET", - // url: "play/" + self.wav(), - // success: function(data){ - // if(data.status == "error"){ - // addError(data.message); - // } - // - // } - // }); } self.isPlaying(true); } @@ -156,7 +104,7 @@ $(document).ready(function(){ } model.selectedVoiceLine(self); - $("#PickEmotionModal").foundation("reveal", "open"); + $("#PickEmotionModal").foundation("open"); }; }; @@ -183,8 +131,7 @@ $(document).ready(function(){ }); self.fixedVoiceLine = new VoiceLine(self.emotions[0], "tts", "", ""); - self.init = function(){ - // self.fileName("Untitled"); + self.newFileData = function(){ self.voiceLines.removeAll(); self.voiceLines.push(new VoiceLine(self.emotions[0], "tts", "", "")); self.unlockFile(); @@ -231,7 +178,7 @@ $(document).ready(function(){ $.each(dataobj.voice_lines, function(idx, line){ var emo = self.emotions[0]; $.each(self.emotions, function(idx, emot){ - if(emot.name == line.emotion){ + if(emot.name.toLowerCase() == line.emotion.toLowerCase()){ emo = emot; } }); @@ -251,49 +198,6 @@ $(document).ready(function(){ self.lockFile(); return true; }; - // self.loadFileData = function(filename){ - // if (filename == "") { - // return; - // } - // $.ajax({ - // dataType: "text", - // type: "POST", - // url: "files/get", - // cache: false, - // data: {path: filename, extension: self.fileExtension()}, - // success: function(data){ - // // Load script - // self.voiceLines.removeAll(); - // - // var dataobj = JSON.parse(data); - // - // $.each(dataobj.voice_lines, function(idx, line){ - // var emo = self.emotions[0]; - // $.each(self.emotions, function(idx, emot){ - // if(emot.name == line.emotion){ - // emo = emot; - // } - // }); - // if(line.output.type == "tts"){ - // self.voiceLines.push(new VoiceLine(emo, line.output.type, line.output.data, "")); - // }else{ - // self.voiceLines.push(new VoiceLine(emo, line.output.type, "", line.output.data)); - // } - // }); - // // Update filename and asterisk - // var filename_no_ext = filename; - // if(filename_no_ext.toLowerCase().slice(-4) == self.fileExtension()){ - // filename_no_ext = filename_no_ext.slice(0, -4); - // } - // self.fileName(filename_no_ext); - // self.fileIsModified(false); - // self.lockFile(); - // }, - // error: function(){ - // window.location.href = "?"; - // } - // }); - // }; self.saveFileData = function(){ var file_data = {voice_lines: []}; @@ -321,33 +225,16 @@ $(document).ready(function(){ self.changeEmotion = function(emotion){ self.fileIsModified(true); self.selectedVoiceLine().emotion(emotion); - $("#PickEmotionModal").foundation("reveal", "close"); + $("#PickEmotionModal").foundation("close"); }; - self.changeFixedEmotion = function(emotion){ self.fixedVoiceLine.emotion(emotion); }; // Setup websocket connection. - self.conn = null; - self.connReady = false; - self.conn = new SockJS("http://" + window.location.host + "/sockjs"); - - self.conn.onopen = function(){ - $.ajax({ - url: "/sockjstoken", - cache: false - }) - .done(function(data) { - self.conn.send(JSON.stringify({action: "authenticate", token: data})); - self.connReady = true; - }); - }; - - self.conn.onmessage = function(e){ - var msg = $.parseJSON(e.data); - switch(msg.action){ + app_socket_handler = function(data) { + switch (data.action) { case "soundStopped": if (self.selectedVoiceLine() != undefined) { self.selectedVoiceLine().isPlaying(false); @@ -356,24 +243,12 @@ $(document).ready(function(){ break; } }; - - self.conn.onclose = function(){ - self.conn = null; - self.connReady = false; - }; - - - // if (action_data.openfile) { - // self.loadFileData(loadFileHandler(action_data.openfile || "")); - // } else { - // self.init(); - // } }; // This makes Knockout get to work var model = new SocialScriptModel(); ko.applyBindings(model); model.fileIsModified(false); - config_file_operations("scripts", model.fileExtension(), model.saveFileData, model.loadFileData, model.init); + config_file_operations("", model.fileExtension(), model.saveFileData, model.loadFileData, model.newFileData); }); diff --git a/src/opsoro/apps/social_script/templates/social_script.html b/src/opsoro/apps/social_script/templates/social_script.html index 074db44..9df768b 100644 --- a/src/opsoro/apps/social_script/templates/social_script.html +++ b/src/opsoro/apps/social_script/templates/social_script.html @@ -1,123 +1,124 @@ {% extends "app_base.html" %} {% block app_toolbar %} - {% include "toolbar/_file_operations.html" %} {% include "toolbar/_lock_unlock.html" %} + {% include "toolbar/_file_operations.html" %} {% endblock %} {% block app_content %}
    -
      -
    • +
      +
      -
      +
      - +
      -
    • -
    +
    +
    - - + +
    -
    +
    -
    -
    - - - -
    - -
    +
    +
    + + + +
    +
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    - -
    -
    - - - - -
    -
    - -
    -
    -
    - - - +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + +
    -
    - - {% endblock %} +
    + +
    +{% endblock %} {% block app_scripts %} - + - + {% endblock %} {% block app_modals %} -
    +
    -
      -
    • +
      +
      -
      +
      -
      -
    • -
    +
    +
    +
    diff --git a/src/opsoro/apps/sounds/__init__.py b/src/opsoro/apps/sounds/__init__.py index 5864592..bb679bf 100644 --- a/src/opsoro/apps/sounds/__init__.py +++ b/src/opsoro/apps/sounds/__init__.py @@ -1,79 +1,80 @@ from __future__ import with_statement -from functools import partial -import os import glob -from flask import Blueprint, render_template, request, redirect, url_for, flash +import os +from functools import partial + +from flask import Blueprint, flash, redirect, render_template, request, url_for from werkzeug import secure_filename + +from opsoro.robot import Robot from opsoro.sound import Sound -config = {'full_name': 'Sounds', - 'icon': 'fa-volume-up', - 'color': '#15e678', - 'allowed_background': False, - 'robot_state': 0} +config = { + 'full_name': 'Sounds', + 'author': 'OPSORO', + 'icon': 'fa-volume-up', + 'color': 'blue', + 'difficulty': 3, + 'tags': ['sound', 'music', 'speech', 'TTS', 'recording'], + 'allowed_background': False, + 'multi_user': False, + 'connection': Robot.Connection.OFFLINE, + 'activation': Robot.Activation.MANUAL +} config['formatted_name'] = config['full_name'].lower().replace(' ', '_') -# robot_state: -# 0: Manual start/stop -# 1: Start robot automatically (alive feature according to preferences) -# 2: Start robot automatically and enable alive feature -# 3: Start robot automatically and disable alive feature get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) def setup_pages(opsoroapp): - sounds_bp = Blueprint( - config['formatted_name'], - __name__, - template_folder='templates', - static_folder='static') - - @sounds_bp.route('/') - @opsoroapp.app_view - def index(): - data = {'soundfiles': []} - - filenames = [] - - filenames.extend(glob.glob(get_path('../../data/sounds/*.wav'))) - filenames.extend(glob.glob(get_path('../../data/sounds/*.mp3'))) - filenames.extend(glob.glob(get_path('../../data/sounds/*.ogg'))) - - for filename in filenames: - data['soundfiles'].append(os.path.split(filename)[1]) - - return opsoroapp.render_template(config['formatted_name'] + '.html', **data) - - @sounds_bp.route('/upload', methods=['POST']) - @opsoroapp.app_view - def upload(): - file = request.files['soundfile'] - if file: - if file.filename.rsplit('.', 1)[1] in ['wav', 'mp3', 'ogg']: - filename = secure_filename(file.filename) - file.save( - os.path.join(get_path('../../data/sounds/'), filename)) - flash('%s uploaded successfully.' % file.filename, 'success') - return redirect(url_for('.index')) - else: - flash('This type of file is not allowed.', 'error') - return redirect(url_for('.index')) - else: - flash('No file selected.', 'error') - return redirect(url_for('.index')) - - opsoroapp.register_app_blueprint(sounds_bp) + sounds_bp = Blueprint(config['formatted_name'], __name__, template_folder='templates', static_folder='static') + + @sounds_bp.route('/') + @opsoroapp.app_view + def index(): + data = {'soundfiles': []} + + filenames = [] + + filenames.extend(glob.glob(get_path('../../data/sounds/*.wav'))) + filenames.extend(glob.glob(get_path('../../data/sounds/*.mp3'))) + filenames.extend(glob.glob(get_path('../../data/sounds/*.ogg'))) + + for filename in filenames: + data['soundfiles'].append(os.path.split(filename)[1]) + + return opsoroapp.render_template(config['formatted_name'] + '.html', **data) + + @sounds_bp.route('/upload', methods=['POST']) + @opsoroapp.app_view + def upload(): + file = request.files['soundfile'] + if file: + if file.filename.rsplit('.', 1)[1] in ['wav', 'mp3', 'ogg']: + filename = secure_filename(file.filename) + file.save( + os.path.join(get_path('../../data/sounds/'), filename)) + flash('%s uploaded successfully.' % file.filename, 'success') + return redirect(url_for('.index')) + else: + flash('This type of file is not allowed.', 'error') + return redirect(url_for('.index')) + else: + flash('No file selected.', 'error') + return redirect(url_for('.index')) + + opsoroapp.register_app_blueprint(sounds_bp) def setup(opsoroapp): - pass + pass def start(opsoroapp): - pass + pass def stop(opsoroapp): - pass + pass diff --git a/src/opsoro/apps/sounds/static/app.js b/src/opsoro/apps/sounds/static/app.js index d49f367..c2c6126 100644 --- a/src/opsoro/apps/sounds/static/app.js +++ b/src/opsoro/apps/sounds/static/app.js @@ -46,6 +46,7 @@ $(document).ready(function(){ // } // } // }); + return false; }); $("#formTTS").submit(function(e){ diff --git a/src/opsoro/apps/sounds/templates/sounds.html b/src/opsoro/apps/sounds/templates/sounds.html index a4d9b7a..676edbd 100644 --- a/src/opsoro/apps/sounds/templates/sounds.html +++ b/src/opsoro/apps/sounds/templates/sounds.html @@ -1,6 +1,6 @@ {% extends "app_base.html" %} -{% block head %} +{% block app_head %} @@ -8,38 +8,6 @@ {% endblock %} {% block app_content %} -
    Upload file @@ -101,7 +69,7 @@ {% for soundfile in soundfiles %} - + {{ soundfile }}
    {% endfor %} diff --git a/src/opsoro/apps/touch_graph/__init__.py b/src/opsoro/apps/touch_graph/__init__.py index ca61c14..4d5f7e7 100644 --- a/src/opsoro/apps/touch_graph/__init__.py +++ b/src/opsoro/apps/touch_graph/__init__.py @@ -1,28 +1,31 @@ -from __future__ import with_statement -from __future__ import division +from __future__ import division, with_statement -import threading import random +import threading import time -from flask import Blueprint, render_template, request, redirect, url_for, flash -from opsoro.stoppable_thread import StoppableThread + +from flask import Blueprint, flash, redirect, render_template, request, url_for + from opsoro.hardware import Hardware +from opsoro.robot import Robot +from opsoro.stoppable_thread import StoppableThread -config = {'full_name': 'Touch Graph', - 'icon': 'fa-hand-o-down', - 'color': '#ffaf19', - 'allowed_background': False, - 'robot_state': 0} +config = { + 'full_name': 'Touch Graph', + 'author': 'OPSORO', + 'icon': 'fa-hand-o-down', + 'color': 'gray_light', + 'difficulty': 3, + 'tags': ['capacitive', 'touch', 'button'], + 'allowed_background': False, + 'multi_user': False, + 'connection': Robot.Connection.OFFLINE, + 'activation': Robot.Activation.MANUAL +} config['formatted_name'] = config['full_name'].lower().replace(' ', '_') -# robot_state: -# 0: Manual start/stop -# 1: Start robot automatically (alive feature according to preferences) -# 2: Start robot automatically and enable alive feature -# 3: Start robot automatically and disable alive feature touch_t = None -clientconn = None running = False numelectrodes = 0 @@ -31,21 +34,18 @@ def TouchLoop(): time.sleep(0.05) # delay global running - global clientconn while not touch_t.stopped(): if running: data = {} with Hardware.lock: - ret = Hardware.cap_get_filtered_data() + ret = Hardware.Capacitive.get_filtered_data() for i in range(numelectrodes): data[i] = ret[i] - if clientconn: - clientconn.send_data('updateelectrodes', - {'electrodedata': data}) + Users.send_app_data(config['formatted_name'], 'updateelectrodes', {'electrodedata': data}) touch_t.sleep(0.1) @@ -54,7 +54,7 @@ def startcap(electrodes): global running global numelectrodes - Hardware.cap_init(electrodes=electrodes, gpios=0, autoconfig=True) + Hardware.Capacitive.init(electrodes=electrodes, gpios=0, autoconfig=True) numelectrodes = electrodes running = True @@ -66,11 +66,7 @@ def stopcap(): def setup_pages(opsoroapp): - touch_bp = Blueprint( - config['formatted_name'], - __name__, - template_folder='templates', - static_folder='static') + touch_bp = Blueprint(config['formatted_name'], __name__, template_folder='templates', static_folder='static') @touch_bp.route('/') @opsoroapp.app_view @@ -79,16 +75,6 @@ def index(): return opsoroapp.render_template(config['formatted_name'] + '.html', **data) - @opsoroapp.app_socket_connected - def s_connected(conn): - global clientconn - clientconn = conn - - @opsoroapp.app_socket_disconnected - def s_disconnected(conn): - global clientconn - clientconn = None - @opsoroapp.app_socket_message('startcapture') def s_startcapture(conn, data): electrodes = int(data.pop('electrodes', 0)) diff --git a/src/opsoro/apps/touch_graph/templates/touch_graph.html b/src/opsoro/apps/touch_graph/templates/touch_graph.html index 510f83d..69a540d 100644 --- a/src/opsoro/apps/touch_graph/templates/touch_graph.html +++ b/src/opsoro/apps/touch_graph/templates/touch_graph.html @@ -3,76 +3,45 @@ {% block head %} {% endblock %} {% block app_content %} -
    -
    -
    - -
    +
    +
    +
    + +
    +
    + +
    + Start +
    - -
    - Start -
    -
    - -
    + +
    {% endblock %} @@ -122,27 +91,9 @@ var plot; var runningStatus = false; - var conn = null; - var connReady = false; - conn = new SockJS("http://" + window.location.host + "/sockjs"); - - conn.onopen = function(){ - console.log("SockJS connected."); - $.ajax({ - url: "/sockjstoken", - cache: false - }) - .done(function(data) { - conn.send(JSON.stringify({action: "authenticate", token: data})); - connReady = true; - console.log("SockJS authenticated."); - }); - }; - - conn.onmessage = function(e){ - var msg = $.parseJSON(e.data); - - if(msg.action == "updateelectrodes"){ + app_socket_handler = function(data) { + switch (data.action) { + case "updateelectrodes": $.each(msg.electrodedata, function(idx, val){ if(idx >= 0 && idx < 12){ electrodeData[idx].push(val); @@ -154,13 +105,9 @@ updateChart(); + break; } }; - conn.onclose = function(){ - console.log("SockJS disconnected."); - conn = null; - connReady = false; - }; function formatData(){ var result = []; diff --git a/src/opsoro/apps/visual_programming/__init__.py b/src/opsoro/apps/visual_programming/__init__.py deleted file mode 100644 index 856e2bb..0000000 --- a/src/opsoro/apps/visual_programming/__init__.py +++ /dev/null @@ -1,292 +0,0 @@ -from __future__ import with_statement - -from functools import partial -import os -import glob -from flask import Blueprint, render_template, request, redirect, url_for, flash, send_from_directory -from werkzeug import secure_filename -from ..lua_scripting.scripthost import ScriptHost - -config = {'full_name': 'Visual Programming', - 'icon': 'fa-puzzle-piece', - 'color': '#6e00ff', - 'allowed_background': True, - 'robot_state': 1} -config['formatted_name'] = config['full_name'].lower().replace(' ', '_') - -# robot_state: -# 0: Manual start/stop -# 1: Start robot automatically (alive feature according to preferences) -# 2: Start robot automatically and enable alive feature -# 3: Start robot automatically and disable alive feature - -get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) - -clientconn = None -sh = None -script = '' -script_name = None -script_modified = False - - -def add_console(message, color='#888888', icon=None): - global clientconn - if clientconn: - clientconn.send_data('addConsole', {'message': message, - 'color': color, - 'icon': icon}) - - -def send_started(): - global clientconn - if clientconn: - clientconn.send_data('scriptStarted', {}) - - -def send_stopped(): - global clientconn - if clientconn: - clientconn.send_data('scriptStopped', {}) - - -def init_ui(): - global clientconn - if clientconn: - clientconn.send_data('initUI', {}) - - -def ui_add_button(name, caption, icon, toggle=False): - global clientconn - if clientconn: - clientconn.send_data('UIAddButton', {'name': name, - 'caption': caption, - 'icon': icon, - 'toggle': toggle}) - - -def ui_add_key(key): - global clientconn - global sh - if clientconn: - valid_keys = ['up', 'down', 'left', 'right', 'space'] - valid_keys += list('abcdefghijklmnopqrstuvwxyz') - if key in valid_keys: - clientconn.send_data('UIAddKey', {'key': key}) - else: - sh.generate_lua_error('Invalid key: %s' % key) - - -def setup_pages(opsoroapp): - visprog_bp = Blueprint( - config['formatted_name'], - __name__, - template_folder='templates', - static_folder='static') - - @visprog_bp.route('/', methods=['GET']) - @opsoroapp.app_view - def index(): - global sh - global script - global script_name - global script_modified - - data = { - 'actions': {}, - 'script_name': script_name, - 'script_modified': script_modified, - 'script_running': sh.is_running - } - - action = request.args.get('action', None) - if action != None: - data['actions'][action] = request.args.get('param', None) - - if script_name: - if script_name[-4:] == '.xml' or script_name[-4:] == '.XML': - data['script_name_noext'] = script_name[:-4] - else: - data['script_name_noext'] = script_name - - return opsoroapp.render_template(config['formatted_name'] + '.html', **data) - - @visprog_bp.route('/blockly') - @opsoroapp.app_view - def blockly_inner(): - data = {'soundfiles': []} - - filenames = glob.glob(get_path('../../data/sounds/*.wav')) - - for filename in filenames: - data['soundfiles'].append(os.path.split(filename)[1]) - - return opsoroapp.render_template('blockly.html', **data) - - # @visprog_bp.route('/filelist') - # @opsoroapp.app_view - # def filelist(): - # data = { - # 'scriptfiles': [] - # } - # - # filenames = [] - # filenames.extend(glob.glob(get_path('../../data/visprog/scripts/*.xml'))) - # - # for filename in filenames: - # data['scriptfiles'].append(os.path.split(filename)[1]) - # - # return opsoroapp.render_template('filelist.html', **data) - # - # @visprog_bp.route('/save', methods=['POST']) - # @opsoroapp.app_api - # def save(): - # xmlfile = request.form.get('file', type=str, default='') - # filename = request.form.get('filename', type=str, default='') - # overwrite = request.form.get('overwrite', type=int, default=0) - # - # if filename == '': - # return {'status': 'error', 'message': 'No filename given.'} - # - # if filename[-4:] != '.xml': - # filename = filename + '.xml' - # filename = secure_filename(filename) - # - # full_path = os.path.join(get_path('../../data/visprog/scripts/'), filename) - # - # if overwrite == 0: - # if os.path.isfile(full_path): - # return {'status': 'error', 'message': 'File already exists.'} - # - # with open(full_path, 'w') as f: - # f.write(xmlfile) - # - # return {'status': 'success', 'filename': filename} - # - # @visprog_bp.route('/delete/', methods=['POST']) - # @opsoroapp.app_api - # def delete(scriptfile): - # scriptfiles = [] - # filenames = [] - # filenames.extend(glob.glob(get_path('../../data/visprog/scripts/*.xml'))) - # filenames.extend(glob.glob(get_path('../../data/visprog/scripts/*.XML'))) - # - # for filename in filenames: - # scriptfiles.append(os.path.split(filename)[1]) - # - # if scriptfile in scriptfiles: - # os.remove(os.path.join(get_path('../../data/visprog/scripts/'), scriptfile)) - # return {'status': 'success', 'message': 'File %s deleted.' % scriptfile} - # else: - # return {'status': 'error', 'message': 'Unknown file.'} - # - # @visprog_bp.route('/scripts/') - # @opsoroapp.app_view - # def scripts(scriptfile): - # return send_from_directory(get_path('../../data/visprog/scripts/'), scriptfile) - - @visprog_bp.route('/startscript', methods=['POST']) - @opsoroapp.app_api - def startscript(): - global sh - global script - global script_name - global script_modified - - script = request.form.get('luacode', type=str, default='') - script_xml = request.form.get('xmlcode', type=str, default='') - script_name = request.form.get('name', type=str, default=None) - script_modified = request.form.get('modified', type=int, default=0) - - with open( - get_path('../../data/' + config['formatted_name'] + '/scripts/currentscript.xml.tmp'), 'w') as f: - f.write(script_xml) - - if sh.is_running: - sh.stop_script() - - sh.start_script(script) - - return {'status': 'success'} - - @visprog_bp.route('/stopscript', methods=['POST']) - @opsoroapp.app_api - def stopscript(): - global sh - - if sh.is_running: - sh.stop_script() - return {'status': 'success'} - else: - return {'status': 'error', - 'message': 'There is no active script to stop.'} - - @opsoroapp.app_socket_connected - def s_connected(conn): - global clientconn - clientconn = conn - - @opsoroapp.app_socket_disconnected - def s_disconnected(conn): - global clientconn - clientconn = None - - @opsoroapp.app_socket_message('keyDown') - def s_key_down(conn, data): - global sh - - key = str(data.pop('key', '')) - sh.ui.set_key_status(key, True) - - @opsoroapp.app_socket_message('keyUp') - def s_key_up(conn, data): - global sh - - key = str(data.pop('key', '')) - sh.ui.set_key_status(key, False) - - @opsoroapp.app_socket_message('buttonDown') - def s_button_down(conn, data): - global sh - - button = str(data.pop('button', '')) - sh.ui.set_button_status(button, True) - - @opsoroapp.app_socket_message('buttonUp') - def s_button_up(conn, data): - global sh - - button = str(data.pop('button', '')) - sh.ui.set_button_status(button, False) - - opsoroapp.register_app_blueprint(visprog_bp) - - -def setup(opsoroapp): - pass - - -def start(opsoroapp): - global sh - global script - global script_name - global script_modified - - sh = ScriptHost() - - sh.on_print = partial(add_console, color='#888888', icon='fa-info-circle') - sh.on_error = partial(add_console, color='#ab3226', icon='fa-bug') - sh.on_start = send_started - sh.on_stop = send_stopped - - sh.ui.on_init = init_ui - sh.ui.on_add_button = ui_add_button - sh.ui.on_add_key = ui_add_key - - script = '' - script_name = None - script_modified = False - - -def stop(opsoroapp): - global sh - sh.stop_script() diff --git a/src/opsoro/apps/visual_programming/static/app.css b/src/opsoro/apps/visual_programming/static/app.css deleted file mode 100644 index 8a65588..0000000 --- a/src/opsoro/apps/visual_programming/static/app.css +++ /dev/null @@ -1,80 +0,0 @@ - -.contentwrapper { - margin: 0; - height: calc(100vh - 26.15rem); -} - -#blocklyFrame { - width: 100%; - height: 100%; - border: 0; - margin: 0; -} - -#editor { - width: 100%; - height: 100%; - border: 0; - margin: 0; -} - -#console { - color: #888888; - background-color: #0f0f0f; - border-top: 2px solid #232323; - margin: 0; - height: 4.15rem; - padding: 0.5rem 1rem; - border-bottom-left-radius: 0.75rem; - border-bottom-right-radius: 0.75rem; - font-family: "Lucida Console", Monaco, monospace; - font-size: 0.75rem; - overflow: scroll; -} - -div.page { - background-color: #0f0f0f; -} - -#ScriptUIModal .btnScriptUI { - width: 100%; - margin-bottom: 0; -} - -#ScriptUIModal .btnScriptUI.toggled { - background: #22B573; -} - -#ScriptUIModal .btnScriptUI.toggled:hover { - background: #23774E; -} - -#ScriptUIModal .keyboardKey { - padding: 0.25rem 0rem; - width: 3rem; - text-align: center; - margin: 0.5rem 0.5rem 0.5rem 0; - background-color: #ddd; - display: inline-block; - border-radius: 0.5rem; - font-size: 1.5rem; - box-shadow: 0 0.3rem 0 rgba(0, 0, 0, 0.33); - border: 1px solid rgba(0, 0, 0, 0.15); -} -#ScriptUIModal .keyboardKey.down { - box-shadow: 0 0.15rem 0 rgba(0, 0, 0, 0.33); - background: #ccc; - - -webkit-transform: translate(0, 0.15rem); - -moz-transform: translate(0, 0.15rem); - -ms-transform: translate(0, 0.15rem); - -o-transform: translate(0, 0.15rem); - transform: translate(0, 0.15rem); -} -#ScriptUIModal .keyboardKey.space { - width: 15rem; -} -#ScriptUIModal .keyboardKey.letter { - font-weight: bold; - text-transform: uppercase; -} diff --git a/src/opsoro/apps/visual_programming/static/app.js b/src/opsoro/apps/visual_programming/static/app.js deleted file mode 100644 index c0d28ab..0000000 --- a/src/opsoro/apps/visual_programming/static/app.js +++ /dev/null @@ -1,489 +0,0 @@ -var isFullscreen = false; -var codeViewOn = false; -var ignoreNextChangeEvt = true; -var monitorKeypresses = false; -var Blockly = null; -var workspace = null; - -function find_block_values(block_type, field_name) { - var all_xml = $(Blockly.Xml.workspaceToDom(workspace)); - var fields = all_xml.find("block[type='" + block_type + "'] > field[name='" + field_name + "']"); - - var ret = []; - fields.each(function(idx, elem) { - ret.push($(elem).text()); - }); - return ret; -} - -function addError(msg) { - $("#console").append("" + msg + "
    "); - $("#console").scrollTop($("#console").prop("scrollHeight")); -} - -function addMessage(msg) { - $("#console").append(msg + "
    "); - $("#console").scrollTop($("#console").prop("scrollHeight")); -} - -function addConsole(msg, color, icon) { - var line = ""; - if (color) { - line += ""; - } - if (icon) { - line += " "; - } - line += msg; - if (color) { - line += ""; - } - line += "
    "; - - $("#console").append(line); - $("#console").scrollTop($("#console").prop("scrollHeight")); -} - -function blocklyLoaded(blockly, ws) { - // Called once Blockly is fully loaded. - Blockly = blockly; - workspace = ws; - - // if (isScriptRunning) { - // // Load current script into workspace - // $.ajax({ - // url: "scripts/currentscript.xml.tmp", - // dataType: "text", - // cache: false, - // success: function(data) { - // // Load script - // ignoreNextChangeEvt = true; - // Blockly.mainWorkspace.clear(); - // var xml = Blockly.Xml.textToDom(data); - // Blockly.Xml.domToWorkspace(workspace, xml); - // } - // }); - // - // } - - ws.addChangeListener(function() { - // Change listener gets called on load, use bool as workaround - if (!ignoreNextChangeEvt) { - isWorkspaceModified = true; - $(".filebox .fa-asterisk").removeClass("hide"); - } - ignoreNextChangeEvt = false; - }); - - // $(document).ready(function() { - // if (model != null) { - // config_file_operations("scripts", model.fileExtension(), model.saveFileData, model.loadFileData, model.init); - // } - // - // }); -} - -function generateLua() { - var code = Blockly.Lua.workspaceToCode(workspace); - return code; -} - -function generateXml() { - var xml = Blockly.Xml.workspaceToDom(workspace); - var xml_text = Blockly.Xml.domToText(xml); - return xml_text; -} - -$(document).ready(function() { - var Model = function() { - var self = this; - - self.fileIsLocked = ko.observable(false); - self.fileIsModified = ko.observable(isScriptModified); - self.fileName = ko.observable("Untitled"); - self.fileStatus = ko.observable("Editing"); - self.fileExtension = ko.observable(".xml"); - self.isRunning = ko.observable(isScriptRunning); - self.isUI = ko.observable(false); - - // Setup ACE editor. - var editor = ace.edit("editor"); - editor.setTheme("ace/theme/twilight"); - editor.setReadOnly(true); - - var LuaMode = require("ace/mode/lua").Mode; - var mode = new LuaMode(); - var Tokenizer = require("ace/tokenizer").Tokenizer; - var OnoLuaHighlightRules = require("ace/mode/onolua_highlight_rules").OnoLuaHighlightRules; - mode.$tokenizer = new Tokenizer(new OnoLuaHighlightRules().getRules()); - editor.session.setMode(mode); - - editor.getSession().setUseSoftTabs(false); - editor.getSession().setTabSize(4); - editor.$blockScrolling = Infinity; // Disable warning - - // Setup websocket connection. - var conn = null; - var connReady = false; - conn = new SockJS("http://" + window.location.host + "/sockjs"); - - conn.onopen = function() { - console.log("SockJS connected."); - $.ajax({ - url: "/sockjstoken", - cache: false - }).done(function(data) { - conn.send(JSON.stringify({ - action: "authenticate", - token: data - })); - connReady = true; - console.log("SockJS authenticated."); - }); - }; - - conn.onmessage = function(e) { - var msg = $.parseJSON(e.data); - - switch (msg.action) { - case "addConsole": - addConsole(msg.message, msg.color, msg.icon); - break; - case "scriptStarted": - addConsole("Script started.", "#888888", "fa-play"); - self.fileStatus("Running"); - self.isRunning(true); - //SetButtonToStop(); - break; - case "scriptStopped": - addConsole("Script stopped.", "#888888", "fa-stop"); - self.fileStatus("Stopped"); - self.isRunning(false); - self.isUI(false); - $("#btnScriptUI").addClass("hide"); - break; - case "initUI": - self.isUI(true); - $("#btnScriptUI").removeClass("hide"); - $("#ScriptUIWrench").removeClass("hide"); - $("#ScriptUIButtons").addClass("hide"); - $("#ScriptUIButtons").html(""); - $("#ScriptUIKeys").addClass("hide"); - $("#ScriptUIKeys").html(""); - $("#ScriptUIModal hr").addClass("hide"); - break; - case "UIAddButton": - $("#ScriptUIWrench").addClass("hide"); - $("#ScriptUIButtons").removeClass("hide"); - - if (!$("#ScriptUIKeys").hasClass("hide")) { - $("#ScriptUIModal hr").removeClass("hide"); - } - - var li = "
  • "; - li += ""; - li += "
    " - li += msg.caption; - li += "
    "; - li += "
  • "; - $("#ScriptUIButtons").append(li); - break; - case "UIAddKey": - var div = ""; - var arrows = ["up", "down", "left", "right"]; - var alphabet = "abcdefghijklmnopqrstuvwxyz"; - var keymap = { - "up": 38, - "down": 40, - "left": 37, - "right": 39, - "space": 32, - "a": 65, - "b": 66, - "c": 67, - "d": 68, - "e": 69, - "f": 70, - "g": 71, - "h": 72, - "i": 73, - "j": 74, - "k": 75, - "l": 76, - "m": 77, - "n": 78, - "o": 79, - "p": 80, - "q": 81, - "r": 82, - "s": 83, - "t": 84, - "u": 85, - "v": 86, - "w": 87, - "x": 88, - "y": 89, - "z": 90 - }; - - if (msg.key == "space") { - // Key is space bar - div = "
     
    "; - } else if (arrows.indexOf(msg.key) > -1) { - // Key is an arrow - div = "
    "; - } else if (alphabet.indexOf(msg.key) > -1) { - // Key is a letter - div = "
    " + msg.key + "
    "; - } else { - return; - } - - $("#ScriptUIWrench").addClass("hide"); - $("#ScriptUIKeys").removeClass("hide"); - $("#ScriptUIKeys").append(div); - - if (!$("#ScriptUIButtons").hasClass("hide")) { - $("#ScriptUIModal hr").removeClass("hide"); - } - - break; - } - }; - - conn.onclose = function() { - console.log("SockJS disconnected."); - conn = null; - connReady = false; - }; - - // Don't submit form on enter - $("input,select").keypress(function(evt) { - return evt.keyCode != 13; - }); - - self.saveFileData = function() { - var data = generateXml(); - - self.fileIsModified(false); - return data; - }; - - self.loadFileData = function(data) { - if (data == undefined) { - return; - } - if (Blockly == null) { - console.log('LOAD'); - // Wait for blockly to load - setTimeout(function() { - // Load script - console.log("Open file"); - ignoreNextChangeEvt = true; - Blockly.mainWorkspace.clear(); - var xml = Blockly.Xml.textToDom(data); - Blockly.Xml.domToWorkspace(workspace, xml); - - // Update filename and asterisk var filename_no_ext = filename; if (filename_no_ext.slice(-4) == ".lua" || filename_no_ext.slice(-4) == ".LUA") { filename_no_ext = filename_no_ext.slice(0, -4); } self.fileName(filename_no_ext); - self.fileIsModified(false); - }, 500); - return; - } - // Load script - console.log("Open file"); - ignoreNextChangeEvt = true; - Blockly.mainWorkspace.clear(); - var xml = Blockly.Xml.textToDom(data); - Blockly.Xml.domToWorkspace(workspace, xml); - - // Update filename and asterisk var filename_no_ext = filename; if (filename_no_ext.slice(-4) == ".lua" || filename_no_ext.slice(-4) == ".LUA") { filename_no_ext = filename_no_ext.slice(0, -4); } self.fileName(filename_no_ext); - self.fileIsModified(false); - }; - - self.init = function() { - console.log("New file"); - ignoreNextChangeEvt = true; - if (Blockly != null) { - Blockly.mainWorkspace.clear(); - } - - self.fileName("Untitled"); - self.fileIsModified(false); - }; - - self.startStopScript = function() { - if (!self.isRunning()) { - // Start the script - var luacode = generateLua(); - var xmlcode = generateXml(); - - $.ajax({ - dataType: "json", - data: { - luacode: luacode, - xmlcode: xmlcode, - name: scriptname, - modified: isScriptModified ? - 1 : 0 - }, - type: "POST", - url: "startscript", - success: function(data) { - if (data.status == "error") { - addError(data.message); - } - } - }); - } else { - // Stop the script - $.ajax({ - dataType: "json", - data: {}, - type: "POST", - url: "stopscript", - success: function(data) { - if (data.status == "error") { - addError(data.message); - } - } - }); - } - }; - - // Clear log - self.clearLog = function() { - $("#console").html(""); - }; - - // Code view - self.codeView = function() { - if (codeViewOn) { - // Switch to Blockly - $("#pnlCode").addClass("hide"); - $("#pnlBlockly").removeClass("hide"); - //$("#btnCodeView").removeClass("active"); - } else { - // Switch to code - var code = generateLua(); - editor.setValue(code); - editor.gotoLine(1, 0, false); - - $("#pnlCode").removeClass("hide"); - $("#pnlBlockly").addClass("hide"); - //$("#btnCodeView").addClass("active"); - - editor.resize(); - } - codeViewOn = !codeViewOn; - }; - - $(document).on("opened.fndtn.reveal", "#ScriptUIModal[data-reveal]", function() { - monitorKeypresses = true; - }); - $(document).on("closed.fndtn.reveal", "#ScriptUIModal[data-reveal]", function() { - monitorKeypresses = false; - }); - - // Monitor keypresses - var keysDown = {}; - $(document).keydown(function(evt) { - if (!monitorKeypresses) { - return; - } - - var keycode = (event.keyCode ? - event.keyCode : - event.which); - - if (keysDown[keycode] == null) { - // First press - var elem = $("#ScriptUIKeys .keyboardKey[data-keycode=" + keycode + "]"); - elem.addClass("down"); - - if (connReady) { - conn.send(JSON.stringify({ - action: "keyDown", - key: elem.data("key") - })); - } - - keysDown[keycode] = true; - } - }); - - $(document).keyup(function(evt) { - if (!monitorKeypresses) { - return; - } - var keycode = (event.keyCode ? - event.keyCode : - event.which); - keysDown[keycode] = null; - - var elem = $("#ScriptUIKeys .keyboardKey[data-keycode=" + keycode + "]"); - elem.removeClass("down"); - - if (connReady) { - conn.send(JSON.stringify({ - action: "keyUp", - key: elem.data("key") - })); - } - }); - - $("#ScriptUIModal").on("mousedown", "a.btnScriptUI", function() { - var elem = $(this); - if (connReady && !elem.hasClass("toggled")) { - conn.send(JSON.stringify({ - action: "buttonDown", - button: elem.data("buttonname") - })); - } - }); - - $("#ScriptUIModal").on("mouseup", "a.btnScriptUI", function() { - var elem = $(this); - - if (elem.data("toggle")) { - // Toggle button - if (elem.hasClass("toggled")) { - if (connReady) { - conn.send(JSON.stringify({ - action: "buttonUp", - button: elem.data("buttonname") - })); - } - } - elem.toggleClass("toggled"); - } else { - // Regular button - if (connReady) { - conn.send(JSON.stringify({ - action: "buttonUp", - button: elem.data("buttonname") - })); - } - } - }); - - self.scriptUI = function() { - $("#ScriptUIModal").foundation("reveal", "open"); - }; - - // if (action_data.openfile) { - // self.loadFileData(action_data.openfile || ""); - // } else { - // self.init(); - // } - - }; - // This makes Knockout get to work - var model = new Model(); - ko.applyBindings(model); - model.fileIsModified(false); - - // if (Blockly != null) { - config_file_operations("scripts", model.fileExtension(), model.saveFileData, model.loadFileData, model.init); - loadFileHandler('scripts/currentscript.xml.tmp'); - // } -}); diff --git a/src/opsoro/apps/visual_programming/static/blockly/README.md b/src/opsoro/apps/visual_programming/static/blockly/README.md deleted file mode 100644 index 5de76cb..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Blockly - -Google's Blockly is a web-based, visual programming editor. Users can drag -blocks together to build programs. All code is free and open source. - -**The project page is https://developers.google.com/blockly/** - -![](https://developers.google.com/blockly/sample.png) diff --git a/src/opsoro/apps/visual_programming/static/blockly/appengine/README.txt b/src/opsoro/apps/visual_programming/static/blockly/appengine/README.txt deleted file mode 100644 index 6ad341c..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/appengine/README.txt +++ /dev/null @@ -1,43 +0,0 @@ - - Running an App Engine server - -This directory contains the files needed to setup the optional Blockly server. -Although Blockly itself is 100% client-side, the server enables cloud storage -and sharing. Store your programs in Datastore and get a unique URL that allows -you to load the program on any computer. - -To run your own App Engine instance you'll need to create this directory -structure: - -blockly/ - |- app.yaml - |- index.yaml - |- index_redirect.py - |- README.txt - |- storage.js - |- storage.py - |- closure-library/ (Optional) - `- static/ - |- blocks/ - |- core/ - |- demos/ - |- generators/ - |- media/ - |- msg/ - |- tests/ - |- blockly_compressed.js - |- blockly_uncompressed.js (Optional) - |- blocks_compressed.js - |- dart_compressed.js - |- javascript_compressed.js - |- php_compressed.js - `- python_compressed.js - -Instructions for fetching the optional Closure library may be found here: - https://developers.google.com/blockly/hacking/closure - -Go to https://appengine.google.com/ and create your App Engine application. -Modify the 'application' name of app.yaml to your App Engine application name. - -Finally, upload this directory structure to your App Engine account, -wait a minute, then go to http://YOURAPPNAME.appspot.com/ diff --git a/src/opsoro/apps/visual_programming/static/blockly/blockly_compressed.js b/src/opsoro/apps/visual_programming/static/blockly/blockly_compressed.js deleted file mode 100644 index 9d9b3a8..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/blockly_compressed.js +++ /dev/null @@ -1,1300 +0,0 @@ -// Do not edit this file; automatically generated by build.py. -'use strict'; - -var COMPILED=!0,goog=goog||{};goog.global=this;goog.isDef=function(a){return void 0!==a};goog.exportPath_=function(a,b,c){a=a.split(".");c=c||goog.global;a[0]in c||!c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)!a.length&&goog.isDef(b)?c[d]=b:c=c[d]?c[d]:c[d]={}}; -goog.define=function(a,b){var c=b;COMPILED||(goog.global.CLOSURE_UNCOMPILED_DEFINES&&Object.prototype.hasOwnProperty.call(goog.global.CLOSURE_UNCOMPILED_DEFINES,a)?c=goog.global.CLOSURE_UNCOMPILED_DEFINES[a]:goog.global.CLOSURE_DEFINES&&Object.prototype.hasOwnProperty.call(goog.global.CLOSURE_DEFINES,a)&&(c=goog.global.CLOSURE_DEFINES[a]));goog.exportPath_(a,c)};goog.DEBUG=!1;goog.LOCALE="en";goog.TRUSTED_SITE=!0;goog.STRICT_MODE_COMPATIBLE=!1;goog.DISALLOW_TEST_ONLY_CODE=COMPILED&&!goog.DEBUG; -goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING=!1;goog.provide=function(a){if(!COMPILED&&goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');goog.constructNamespace_(a)};goog.constructNamespace_=function(a,b){if(!COMPILED){delete goog.implicitNamespaces_[a];for(var c=a;(c=c.substring(0,c.lastIndexOf(".")))&&!goog.getObjectByName(c);)goog.implicitNamespaces_[c]=!0}goog.exportPath_(a,b)};goog.VALID_MODULE_RE_=/^[a-zA-Z_$][a-zA-Z0-9._$]*$/; -goog.module=function(a){if(!goog.isString(a)||!a||-1==a.search(goog.VALID_MODULE_RE_))throw Error("Invalid module identifier");if(!goog.isInModuleLoader_())throw Error("Module "+a+" has been loaded incorrectly.");if(goog.moduleLoaderState_.moduleName)throw Error("goog.module may only be called once per module.");goog.moduleLoaderState_.moduleName=a;if(!COMPILED){if(goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');delete goog.implicitNamespaces_[a]}};goog.module.get=function(a){return goog.module.getInternal_(a)}; -goog.module.getInternal_=function(a){if(!COMPILED)return goog.isProvided_(a)?a in goog.loadedModules_?goog.loadedModules_[a]:goog.getObjectByName(a):null};goog.moduleLoaderState_=null;goog.isInModuleLoader_=function(){return null!=goog.moduleLoaderState_}; -goog.module.declareLegacyNamespace=function(){if(!COMPILED&&!goog.isInModuleLoader_())throw Error("goog.module.declareLegacyNamespace must be called from within a goog.module");if(!COMPILED&&!goog.moduleLoaderState_.moduleName)throw Error("goog.module must be called prior to goog.module.declareLegacyNamespace.");goog.moduleLoaderState_.declareLegacyNamespace=!0}; -goog.setTestOnly=function(a){if(goog.DISALLOW_TEST_ONLY_CODE)throw a=a||"",Error("Importing test-only code into non-debug environment"+(a?": "+a:"."));};goog.forwardDeclare=function(a){};COMPILED||(goog.isProvided_=function(a){return a in goog.loadedModules_||!goog.implicitNamespaces_[a]&&goog.isDefAndNotNull(goog.getObjectByName(a))},goog.implicitNamespaces_={"goog.module":!0}); -goog.getObjectByName=function(a,b){for(var c=a.split("."),d=b||goog.global,e;e=c.shift();)if(goog.isDefAndNotNull(d[e]))d=d[e];else return null;return d};goog.globalize=function(a,b){var c=b||goog.global,d;for(d in a)c[d]=a[d]};goog.addDependency=function(a,b,c,d){if(goog.DEPENDENCIES_ENABLED){var e;a=a.replace(/\\/g,"/");for(var f=goog.dependencies_,g=0;e=b[g];g++)f.nameToPath[e]=a,f.pathIsModule[a]=!!d;for(d=0;b=c[d];d++)a in f.requires||(f.requires[a]={}),f.requires[a][b]=!0}}; -goog.ENABLE_DEBUG_LOADER=!0;goog.logToConsole_=function(a){goog.global.console&&goog.global.console.error(a)};goog.require=function(a){if(!COMPILED){goog.ENABLE_DEBUG_LOADER&&goog.IS_OLD_IE_&&goog.maybeProcessDeferredDep_(a);if(goog.isProvided_(a))return goog.isInModuleLoader_()?goog.module.getInternal_(a):null;if(goog.ENABLE_DEBUG_LOADER){var b=goog.getPathFromDeps_(a);if(b)return goog.writeScripts_(b),null}a="goog.require could not find: "+a;goog.logToConsole_(a);throw Error(a);}}; -goog.basePath="";goog.nullFunction=function(){};goog.abstractMethod=function(){throw Error("unimplemented abstract method");};goog.addSingletonGetter=function(a){a.getInstance=function(){if(a.instance_)return a.instance_;goog.DEBUG&&(goog.instantiatedSingletons_[goog.instantiatedSingletons_.length]=a);return a.instance_=new a}};goog.instantiatedSingletons_=[];goog.LOAD_MODULE_USING_EVAL=!0;goog.SEAL_MODULE_EXPORTS=goog.DEBUG;goog.loadedModules_={};goog.DEPENDENCIES_ENABLED=!COMPILED&&goog.ENABLE_DEBUG_LOADER; -goog.DEPENDENCIES_ENABLED&&(goog.dependencies_={pathIsModule:{},nameToPath:{},requires:{},visited:{},written:{},deferred:{}},goog.inHtmlDocument_=function(){var a=goog.global.document;return"undefined"!=typeof a&&"write"in a},goog.findBasePath_=function(){if(goog.isDef(goog.global.CLOSURE_BASE_PATH))goog.basePath=goog.global.CLOSURE_BASE_PATH;else if(goog.inHtmlDocument_())for(var a=goog.global.document.getElementsByTagName("SCRIPT"),b=a.length-1;0<=b;--b){var c=a[b].src,d=c.lastIndexOf("?"),d=-1== -d?c.length:d;if("base.js"==c.substr(d-7,7)){goog.basePath=c.substr(0,d-7);break}}},goog.importScript_=function(a,b){(goog.global.CLOSURE_IMPORT_SCRIPT||goog.writeScriptTag_)(a,b)&&(goog.dependencies_.written[a]=!0)},goog.IS_OLD_IE_=!(goog.global.atob||!goog.global.document||!goog.global.document.all),goog.importModule_=function(a){goog.importScript_("",'goog.retrieveAndExecModule_("'+a+'");')&&(goog.dependencies_.written[a]=!0)},goog.queuedModules_=[],goog.wrapModule_=function(a,b){return goog.LOAD_MODULE_USING_EVAL&& -goog.isDef(goog.global.JSON)?"goog.loadModule("+goog.global.JSON.stringify(b+"\n//# sourceURL="+a+"\n")+");":'goog.loadModule(function(exports) {"use strict";'+b+"\n;return exports});\n//# sourceURL="+a+"\n"},goog.loadQueuedModules_=function(){var a=goog.queuedModules_.length;if(0\x3c/script>')},goog.appendScriptSrcNode_=function(a){var b=goog.global.document,c=b.createElement("script");c.type="text/javascript";c.src=a;c.defer=!1;c.async=!1;b.head.appendChild(c)},goog.writeScriptTag_= -function(a,b){if(goog.inHtmlDocument_()){var c=goog.global.document;if(!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING&&"complete"==c.readyState){if(/\bdeps.js$/.test(a))return!1;throw Error('Cannot write "'+a+'" after document load');}var d=goog.IS_OLD_IE_;void 0===b?d?(d=" onreadystatechange='goog.onScriptLoad_(this, "+ ++goog.lastNonModuleScriptIndex_+")' ",c.write(''); -// Load fresh Closure Library. -document.write(''); -document.write(''); diff --git a/src/opsoro/apps/visual_programming/static/blockly/blocks/colour.js b/src/opsoro/apps/visual_programming/static/blockly/blocks/colour.js deleted file mode 100644 index 7c92122..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/blocks/colour.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Colour blocks for Blockly. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Blocks.colour'); - -goog.require('Blockly.Blocks'); - - -/** - * Common HSV hue for all blocks in this category. - */ -Blockly.Blocks.colour.HUE = 20; - -Blockly.Blocks['colour_picker'] = { - /** - * Block for colour picker. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_colour", - "name": "COLOUR", - "colour": "#ff0000" - } - ], - "output": "Colour", - "colour": Blockly.Blocks.colour.HUE, - "tooltip": Blockly.Msg.COLOUR_PICKER_TOOLTIP, - "helpUrl": Blockly.Msg.COLOUR_PICKER_HELPURL - }); - } -}; - -Blockly.Blocks['colour_random'] = { - /** - * Block for random colour. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.COLOUR_RANDOM_TITLE, - "output": "Colour", - "colour": Blockly.Blocks.colour.HUE, - "tooltip": Blockly.Msg.COLOUR_RANDOM_TOOLTIP, - "helpUrl": Blockly.Msg.COLOUR_RANDOM_HELPURL - }); - } -}; - -Blockly.Blocks['colour_rgb'] = { - /** - * Block for composing a colour from RGB components. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.COLOUR_RGB_HELPURL); - this.setColour(Blockly.Blocks.colour.HUE); - this.appendValueInput('RED') - .setCheck('Number') - .setAlign(Blockly.ALIGN_RIGHT) - .appendField(Blockly.Msg.COLOUR_RGB_TITLE) - .appendField(Blockly.Msg.COLOUR_RGB_RED); - this.appendValueInput('GREEN') - .setCheck('Number') - .setAlign(Blockly.ALIGN_RIGHT) - .appendField(Blockly.Msg.COLOUR_RGB_GREEN); - this.appendValueInput('BLUE') - .setCheck('Number') - .setAlign(Blockly.ALIGN_RIGHT) - .appendField(Blockly.Msg.COLOUR_RGB_BLUE); - this.setOutput(true, 'Colour'); - this.setTooltip(Blockly.Msg.COLOUR_RGB_TOOLTIP); - } -}; - -Blockly.Blocks['colour_blend'] = { - /** - * Block for blending two colours together. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.COLOUR_BLEND_HELPURL); - this.setColour(Blockly.Blocks.colour.HUE); - this.appendValueInput('COLOUR1') - .setCheck('Colour') - .setAlign(Blockly.ALIGN_RIGHT) - .appendField(Blockly.Msg.COLOUR_BLEND_TITLE) - .appendField(Blockly.Msg.COLOUR_BLEND_COLOUR1); - this.appendValueInput('COLOUR2') - .setCheck('Colour') - .setAlign(Blockly.ALIGN_RIGHT) - .appendField(Blockly.Msg.COLOUR_BLEND_COLOUR2); - this.appendValueInput('RATIO') - .setCheck('Number') - .setAlign(Blockly.ALIGN_RIGHT) - .appendField(Blockly.Msg.COLOUR_BLEND_RATIO); - this.setOutput(true, 'Colour'); - this.setTooltip(Blockly.Msg.COLOUR_BLEND_TOOLTIP); - } -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/blocks/lists.js b/src/opsoro/apps/visual_programming/static/blockly/blocks/lists.js deleted file mode 100644 index 19ac883..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/blocks/lists.js +++ /dev/null @@ -1,711 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview List blocks for Blockly. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Blocks.lists'); - -goog.require('Blockly.Blocks'); - - -/** - * Common HSV hue for all blocks in this category. - */ -Blockly.Blocks.lists.HUE = 260; - -Blockly.Blocks['lists_create_empty'] = { - /** - * Block for creating an empty list. - * The 'list_create_with' block is preferred as it is more flexible. - * - * - * - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LISTS_CREATE_EMPTY_TITLE, - "output": "Array", - "colour": Blockly.Blocks.lists.HUE, - "tooltip": Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP, - "helpUrl": Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL - }); - } -}; - -Blockly.Blocks['lists_create_with'] = { - /** - * Block for creating a list with any number of elements of any type. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.LISTS_CREATE_WITH_HELPURL); - this.setColour(Blockly.Blocks.lists.HUE); - this.itemCount_ = 3; - this.updateShape_(); - this.setOutput(true, 'Array'); - this.setMutator(new Blockly.Mutator(['lists_create_with_item'])); - this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP); - }, - /** - * Create XML to represent list inputs. - * @return {!Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - var container = document.createElement('mutation'); - container.setAttribute('items', this.itemCount_); - return container; - }, - /** - * Parse XML to restore the list inputs. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); - this.updateShape_(); - }, - /** - * Populate the mutator's dialog with this block's components. - * @param {!Blockly.Workspace} workspace Mutator's workspace. - * @return {!Blockly.Block} Root block in mutator. - * @this Blockly.Block - */ - decompose: function(workspace) { - var containerBlock = - Blockly.Block.obtain(workspace, 'lists_create_with_container'); - containerBlock.initSvg(); - var connection = containerBlock.getInput('STACK').connection; - for (var i = 0; i < this.itemCount_; i++) { - var itemBlock = Blockly.Block.obtain(workspace, 'lists_create_with_item'); - itemBlock.initSvg(); - connection.connect(itemBlock.previousConnection); - connection = itemBlock.nextConnection; - } - return containerBlock; - }, - /** - * Reconfigure this block based on the mutator dialog's components. - * @param {!Blockly.Block} containerBlock Root block in mutator. - * @this Blockly.Block - */ - compose: function(containerBlock) { - var itemBlock = containerBlock.getInputTargetBlock('STACK'); - // Count number of inputs. - var connections = []; - while (itemBlock) { - connections.push(itemBlock.valueConnection_); - itemBlock = itemBlock.nextConnection && - itemBlock.nextConnection.targetBlock(); - } - this.itemCount_ = connections.length; - this.updateShape_(); - // Reconnect any child blocks. - for (var i = 0; i < this.itemCount_; i++) { - if (connections[i]) { - this.getInput('ADD' + i).connection.connect(connections[i]); - } - } - }, - /** - * Store pointers to any connected child blocks. - * @param {!Blockly.Block} containerBlock Root block in mutator. - * @this Blockly.Block - */ - saveConnections: function(containerBlock) { - var itemBlock = containerBlock.getInputTargetBlock('STACK'); - var i = 0; - while (itemBlock) { - var input = this.getInput('ADD' + i); - itemBlock.valueConnection_ = input && input.connection.targetConnection; - i++; - itemBlock = itemBlock.nextConnection && - itemBlock.nextConnection.targetBlock(); - } - }, - /** - * Modify this block to have the correct number of inputs. - * @private - * @this Blockly.Block - */ - updateShape_: function() { - // Delete everything. - if (this.getInput('EMPTY')) { - this.removeInput('EMPTY'); - } else { - var i = 0; - while (this.getInput('ADD' + i)) { - this.removeInput('ADD' + i); - i++; - } - } - // Rebuild block. - if (this.itemCount_ == 0) { - this.appendDummyInput('EMPTY') - .appendField(Blockly.Msg.LISTS_CREATE_EMPTY_TITLE); - } else { - for (var i = 0; i < this.itemCount_; i++) { - var input = this.appendValueInput('ADD' + i); - if (i == 0) { - input.appendField(Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH); - } - } - } - } -}; - -Blockly.Blocks['lists_create_with_container'] = { - /** - * Mutator block for list container. - * @this Blockly.Block - */ - init: function() { - this.setColour(Blockly.Blocks.lists.HUE); - this.appendDummyInput() - .appendField(Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD); - this.appendStatementInput('STACK'); - this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP); - this.contextMenu = false; - } -}; - -Blockly.Blocks['lists_create_with_item'] = { - /** - * Mutator bolck for adding items. - * @this Blockly.Block - */ - init: function() { - this.setColour(Blockly.Blocks.lists.HUE); - this.appendDummyInput() - .appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP); - this.contextMenu = false; - } -}; - -Blockly.Blocks['lists_repeat'] = { - /** - * Block for creating a list with one element repeated. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LISTS_REPEAT_TITLE, - "args0": [ - { - "type": "input_value", - "name": "ITEM" - }, - { - "type": "input_value", - "name": "NUM", - "check": "Number" - } - ], - "output": "Array", - "colour": Blockly.Blocks.lists.HUE, - "tooltip": Blockly.Msg.LISTS_REPEAT_TOOLTIP, - "helpUrl": Blockly.Msg.LISTS_REPEAT_HELPURL - }); - } -}; - -Blockly.Blocks['lists_length'] = { - /** - * Block for list length. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LISTS_LENGTH_TITLE, - "args0": [ - { - "type": "input_value", - "name": "VALUE", - "check": ['String', 'Array'] - } - ], - "output": 'Number', - "colour": Blockly.Blocks.lists.HUE, - "tooltip": Blockly.Msg.LISTS_LENGTH_TOOLTIP, - "helpUrl": Blockly.Msg.LISTS_LENGTH_HELPURL - }); - } -}; - -Blockly.Blocks['lists_isEmpty'] = { - /** - * Block for is the list empty? - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LISTS_ISEMPTY_TITLE, - "args0": [ - { - "type": "input_value", - "name": "VALUE", - "check": ['String', 'Array'] - } - ], - "output": 'Boolean', - "colour": Blockly.Blocks.lists.HUE, - "tooltip": Blockly.Msg.LISTS_ISEMPTY_TOOLTIP, - "helpUrl": Blockly.Msg.LISTS_ISEMPTY_HELPURL - }); - } -}; - -Blockly.Blocks['lists_indexOf'] = { - /** - * Block for finding an item in the list. - * @this Blockly.Block - */ - init: function() { - var OPERATORS = - [[Blockly.Msg.LISTS_INDEX_OF_FIRST, 'FIRST'], - [Blockly.Msg.LISTS_INDEX_OF_LAST, 'LAST']]; - this.setHelpUrl(Blockly.Msg.LISTS_INDEX_OF_HELPURL); - this.setColour(Blockly.Blocks.lists.HUE); - this.setOutput(true, 'Number'); - this.appendValueInput('VALUE') - .setCheck('Array') - .appendField(Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST); - this.appendValueInput('FIND') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'END'); - this.setInputsInline(true); - this.setTooltip(Blockly.Msg.LISTS_INDEX_OF_TOOLTIP); - } -}; - -Blockly.Blocks['lists_getIndex'] = { - /** - * Block for getting element at index. - * @this Blockly.Block - */ - init: function() { - var MODE = - [[Blockly.Msg.LISTS_GET_INDEX_GET, 'GET'], - [Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE, 'GET_REMOVE'], - [Blockly.Msg.LISTS_GET_INDEX_REMOVE, 'REMOVE']]; - this.WHERE_OPTIONS = - [[Blockly.Msg.LISTS_GET_INDEX_FROM_START, 'FROM_START'], - [Blockly.Msg.LISTS_GET_INDEX_FROM_END, 'FROM_END'], - [Blockly.Msg.LISTS_GET_INDEX_FIRST, 'FIRST'], - [Blockly.Msg.LISTS_GET_INDEX_LAST, 'LAST'], - [Blockly.Msg.LISTS_GET_INDEX_RANDOM, 'RANDOM']]; - this.setHelpUrl(Blockly.Msg.LISTS_GET_INDEX_HELPURL); - this.setColour(Blockly.Blocks.lists.HUE); - var modeMenu = new Blockly.FieldDropdown(MODE, function(value) { - var isStatement = (value == 'REMOVE'); - this.sourceBlock_.updateStatement_(isStatement); - }); - this.appendValueInput('VALUE') - .setCheck('Array') - .appendField(Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST); - this.appendDummyInput() - .appendField(modeMenu, 'MODE') - .appendField('', 'SPACE'); - this.appendDummyInput('AT'); - if (Blockly.Msg.LISTS_GET_INDEX_TAIL) { - this.appendDummyInput('TAIL') - .appendField(Blockly.Msg.LISTS_GET_INDEX_TAIL); - } - this.setInputsInline(true); - this.setOutput(true); - this.updateAt_(true); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function() { - var combo = thisBlock.getFieldValue('MODE') + '_' + - thisBlock.getFieldValue('WHERE'); - return Blockly.Msg['LISTS_GET_INDEX_TOOLTIP_' + combo]; - }); - }, - /** - * Create XML to represent whether the block is a statement or a value. - * Also represent whether there is an 'AT' input. - * @return {Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - var container = document.createElement('mutation'); - var isStatement = !this.outputConnection; - container.setAttribute('statement', isStatement); - var isAt = this.getInput('AT').type == Blockly.INPUT_VALUE; - container.setAttribute('at', isAt); - return container; - }, - /** - * Parse XML to restore the 'AT' input. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - // Note: Until January 2013 this block did not have mutations, - // so 'statement' defaults to false and 'at' defaults to true. - var isStatement = (xmlElement.getAttribute('statement') == 'true'); - this.updateStatement_(isStatement); - var isAt = (xmlElement.getAttribute('at') != 'false'); - this.updateAt_(isAt); - }, - /** - * Switch between a value block and a statement block. - * @param {boolean} newStatement True if the block should be a statement. - * False if the block should be a value. - * @private - * @this Blockly.Block - */ - updateStatement_: function(newStatement) { - var oldStatement = !this.outputConnection; - if (newStatement != oldStatement) { - this.unplug(true, true); - if (newStatement) { - this.setOutput(false); - this.setPreviousStatement(true); - this.setNextStatement(true); - } else { - this.setPreviousStatement(false); - this.setNextStatement(false); - this.setOutput(true); - } - } - }, - /** - * Create or delete an input for the numeric index. - * @param {boolean} isAt True if the input should exist. - * @private - * @this Blockly.Block - */ - updateAt_: function(isAt) { - // Destroy old 'AT' and 'ORDINAL' inputs. - this.removeInput('AT'); - this.removeInput('ORDINAL', true); - // Create either a value 'AT' input or a dummy input. - if (isAt) { - this.appendValueInput('AT').setCheck('Number'); - if (Blockly.Msg.ORDINAL_NUMBER_SUFFIX) { - this.appendDummyInput('ORDINAL') - .appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX); - } - } else { - this.appendDummyInput('AT'); - } - var menu = new Blockly.FieldDropdown(this.WHERE_OPTIONS, function(value) { - var newAt = (value == 'FROM_START') || (value == 'FROM_END'); - // The 'isAt' variable is available due to this function being a closure. - if (newAt != isAt) { - var block = this.sourceBlock_; - block.updateAt_(newAt); - // This menu has been destroyed and replaced. Update the replacement. - block.setFieldValue(value, 'WHERE'); - return null; - } - return undefined; - }); - this.getInput('AT').appendField(menu, 'WHERE'); - if (Blockly.Msg.LISTS_GET_INDEX_TAIL) { - this.moveInputBefore('TAIL', null); - } - } -}; - -Blockly.Blocks['lists_setIndex'] = { - /** - * Block for setting the element at index. - * @this Blockly.Block - */ - init: function() { - var MODE = - [[Blockly.Msg.LISTS_SET_INDEX_SET, 'SET'], - [Blockly.Msg.LISTS_SET_INDEX_INSERT, 'INSERT']]; - this.WHERE_OPTIONS = - [[Blockly.Msg.LISTS_GET_INDEX_FROM_START, 'FROM_START'], - [Blockly.Msg.LISTS_GET_INDEX_FROM_END, 'FROM_END'], - [Blockly.Msg.LISTS_GET_INDEX_FIRST, 'FIRST'], - [Blockly.Msg.LISTS_GET_INDEX_LAST, 'LAST'], - [Blockly.Msg.LISTS_GET_INDEX_RANDOM, 'RANDOM']]; - this.setHelpUrl(Blockly.Msg.LISTS_SET_INDEX_HELPURL); - this.setColour(Blockly.Blocks.lists.HUE); - this.appendValueInput('LIST') - .setCheck('Array') - .appendField(Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST); - this.appendDummyInput() - .appendField(new Blockly.FieldDropdown(MODE), 'MODE') - .appendField('', 'SPACE'); - this.appendDummyInput('AT'); - this.appendValueInput('TO') - .appendField(Blockly.Msg.LISTS_SET_INDEX_INPUT_TO); - this.setInputsInline(true); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setTooltip(Blockly.Msg.LISTS_SET_INDEX_TOOLTIP); - this.updateAt_(true); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function() { - var combo = thisBlock.getFieldValue('MODE') + '_' + - thisBlock.getFieldValue('WHERE'); - return Blockly.Msg['LISTS_SET_INDEX_TOOLTIP_' + combo]; - }); - }, - /** - * Create XML to represent whether there is an 'AT' input. - * @return {Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - var container = document.createElement('mutation'); - var isAt = this.getInput('AT').type == Blockly.INPUT_VALUE; - container.setAttribute('at', isAt); - return container; - }, - /** - * Parse XML to restore the 'AT' input. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - // Note: Until January 2013 this block did not have mutations, - // so 'at' defaults to true. - var isAt = (xmlElement.getAttribute('at') != 'false'); - this.updateAt_(isAt); - }, - /** - * Create or delete an input for the numeric index. - * @param {boolean} isAt True if the input should exist. - * @private - * @this Blockly.Block - */ - updateAt_: function(isAt) { - // Destroy old 'AT' and 'ORDINAL' input. - this.removeInput('AT'); - this.removeInput('ORDINAL', true); - // Create either a value 'AT' input or a dummy input. - if (isAt) { - this.appendValueInput('AT').setCheck('Number'); - if (Blockly.Msg.ORDINAL_NUMBER_SUFFIX) { - this.appendDummyInput('ORDINAL') - .appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX); - } - } else { - this.appendDummyInput('AT'); - } - var menu = new Blockly.FieldDropdown(this.WHERE_OPTIONS, function(value) { - var newAt = (value == 'FROM_START') || (value == 'FROM_END'); - // The 'isAt' variable is available due to this function being a closure. - if (newAt != isAt) { - var block = this.sourceBlock_; - block.updateAt_(newAt); - // This menu has been destroyed and replaced. Update the replacement. - block.setFieldValue(value, 'WHERE'); - return null; - } - return undefined; - }); - this.moveInputBefore('AT', 'TO'); - if (this.getInput('ORDINAL')) { - this.moveInputBefore('ORDINAL', 'TO'); - } - - this.getInput('AT').appendField(menu, 'WHERE'); - } -}; - -Blockly.Blocks['lists_getSublist'] = { - /** - * Block for getting sublist. - * @this Blockly.Block - */ - init: function() { - this['WHERE_OPTIONS_1'] = - [[Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START, 'FROM_START'], - [Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END, 'FROM_END'], - [Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST, 'FIRST']]; - this['WHERE_OPTIONS_2'] = - [[Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START, 'FROM_START'], - [Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END, 'FROM_END'], - [Blockly.Msg.LISTS_GET_SUBLIST_END_LAST, 'LAST']]; - this.setHelpUrl(Blockly.Msg.LISTS_GET_SUBLIST_HELPURL); - this.setColour(Blockly.Blocks.lists.HUE); - this.appendValueInput('LIST') - .setCheck('Array') - .appendField(Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST); - this.appendDummyInput('AT1'); - this.appendDummyInput('AT2'); - if (Blockly.Msg.LISTS_GET_SUBLIST_TAIL) { - this.appendDummyInput('TAIL') - .appendField(Blockly.Msg.LISTS_GET_SUBLIST_TAIL); - } - this.setInputsInline(true); - this.setOutput(true, 'Array'); - this.updateAt_(1, true); - this.updateAt_(2, true); - this.setTooltip(Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP); - }, - /** - * Create XML to represent whether there are 'AT' inputs. - * @return {Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - var container = document.createElement('mutation'); - var isAt1 = this.getInput('AT1').type == Blockly.INPUT_VALUE; - container.setAttribute('at1', isAt1); - var isAt2 = this.getInput('AT2').type == Blockly.INPUT_VALUE; - container.setAttribute('at2', isAt2); - return container; - }, - /** - * Parse XML to restore the 'AT' inputs. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - var isAt1 = (xmlElement.getAttribute('at1') == 'true'); - var isAt2 = (xmlElement.getAttribute('at2') == 'true'); - this.updateAt_(1, isAt1); - this.updateAt_(2, isAt2); - }, - /** - * Create or delete an input for a numeric index. - * This block has two such inputs, independant of each other. - * @param {number} n Specify first or second input (1 or 2). - * @param {boolean} isAt True if the input should exist. - * @private - * @this Blockly.Block - */ - updateAt_: function(n, isAt) { - // Create or delete an input for the numeric index. - // Destroy old 'AT' and 'ORDINAL' inputs. - this.removeInput('AT' + n); - this.removeInput('ORDINAL' + n, true); - // Create either a value 'AT' input or a dummy input. - if (isAt) { - this.appendValueInput('AT' + n).setCheck('Number'); - if (Blockly.Msg.ORDINAL_NUMBER_SUFFIX) { - this.appendDummyInput('ORDINAL' + n) - .appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX); - } - } else { - this.appendDummyInput('AT' + n); - } - var menu = new Blockly.FieldDropdown(this['WHERE_OPTIONS_' + n], - function(value) { - var newAt = (value == 'FROM_START') || (value == 'FROM_END'); - // The 'isAt' variable is available due to this function being a closure. - if (newAt != isAt) { - var block = this.sourceBlock_; - block.updateAt_(n, newAt); - // This menu has been destroyed and replaced. Update the replacement. - block.setFieldValue(value, 'WHERE' + n); - return null; - } - return undefined; - }); - this.getInput('AT' + n) - .appendField(menu, 'WHERE' + n); - if (n == 1) { - this.moveInputBefore('AT1', 'AT2'); - if (this.getInput('ORDINAL1')) { - this.moveInputBefore('ORDINAL1', 'AT2'); - } - } - if (Blockly.Msg.LISTS_GET_SUBLIST_TAIL) { - this.moveInputBefore('TAIL', null); - } - } -}; - -Blockly.Blocks['lists_split'] = { - /** - * Block for splitting text into a list, or joining a list into text. - * @this Blockly.Block - */ - init: function() { - // Assign 'this' to a variable for use in the closures below. - var thisBlock = this; - var dropdown = new Blockly.FieldDropdown( - [[Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT, 'SPLIT'], - [Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST, 'JOIN']], - function(newMode) { - thisBlock.updateType_(newMode); - }); - this.setHelpUrl(Blockly.Msg.LISTS_SPLIT_HELPURL); - this.setColour(Blockly.Blocks.lists.HUE); - this.appendValueInput('INPUT') - .setCheck('String') - .appendField(dropdown, 'MODE'); - this.appendValueInput('DELIM') - .setCheck('String') - .appendField(Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER); - this.setInputsInline(true); - this.setOutput(true, 'Array'); - this.setTooltip(function() { - var mode = thisBlock.getFieldValue('MODE'); - if (mode == 'SPLIT') { - return Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT; - } else if (mode == 'JOIN') { - return Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN; - } - throw 'Unknown mode: ' + mode; - }); - }, - /** - * Modify this block to have the correct input and output types. - * @param {string} newMode Either 'SPLIT' or 'JOIN'. - * @private - * @this Blockly.Block - */ - updateType_: function(newMode) { - if (newMode == 'SPLIT') { - this.outputConnection.setCheck('Array'); - this.getInput('INPUT').setCheck('String'); - } else { - this.outputConnection.setCheck('String'); - this.getInput('INPUT').setCheck('Array'); - } - }, - /** - * Create XML to represent the input and output types. - * @return {!Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - var container = document.createElement('mutation'); - container.setAttribute('mode', this.getFieldValue('MODE')); - return container; - }, - /** - * Parse XML to restore the input and output types. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - this.updateType_(xmlElement.getAttribute('mode')); - } -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/blocks/logic.js b/src/opsoro/apps/visual_programming/static/blockly/blocks/logic.js deleted file mode 100644 index 5190399..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/blocks/logic.js +++ /dev/null @@ -1,473 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Logic blocks for Blockly. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Blocks.logic'); - -goog.require('Blockly.Blocks'); - - -/** - * Common HSV hue for all blocks in this category. - */ -Blockly.Blocks.logic.HUE = 210; - -Blockly.Blocks['controls_if'] = { - /** - * Block for if/elseif/else condition. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.CONTROLS_IF_HELPURL); - this.setColour(Blockly.Blocks.logic.HUE); - this.appendValueInput('IF0') - .setCheck('Boolean') - .appendField(Blockly.Msg.CONTROLS_IF_MSG_IF); - this.appendStatementInput('DO0') - .appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setMutator(new Blockly.Mutator(['controls_if_elseif', - 'controls_if_else'])); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function() { - if (!thisBlock.elseifCount_ && !thisBlock.elseCount_) { - return Blockly.Msg.CONTROLS_IF_TOOLTIP_1; - } else if (!thisBlock.elseifCount_ && thisBlock.elseCount_) { - return Blockly.Msg.CONTROLS_IF_TOOLTIP_2; - } else if (thisBlock.elseifCount_ && !thisBlock.elseCount_) { - return Blockly.Msg.CONTROLS_IF_TOOLTIP_3; - } else if (thisBlock.elseifCount_ && thisBlock.elseCount_) { - return Blockly.Msg.CONTROLS_IF_TOOLTIP_4; - } - return ''; - }); - this.elseifCount_ = 0; - this.elseCount_ = 0; - }, - /** - * Create XML to represent the number of else-if and else inputs. - * @return {Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - if (!this.elseifCount_ && !this.elseCount_) { - return null; - } - var container = document.createElement('mutation'); - if (this.elseifCount_) { - container.setAttribute('elseif', this.elseifCount_); - } - if (this.elseCount_) { - container.setAttribute('else', 1); - } - return container; - }, - /** - * Parse XML to restore the else-if and else inputs. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - this.elseifCount_ = parseInt(xmlElement.getAttribute('elseif'), 10) || 0; - this.elseCount_ = parseInt(xmlElement.getAttribute('else'), 10) || 0; - for (var i = 1; i <= this.elseifCount_; i++) { - this.appendValueInput('IF' + i) - .setCheck('Boolean') - .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF); - this.appendStatementInput('DO' + i) - .appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); - } - if (this.elseCount_) { - this.appendStatementInput('ELSE') - .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE); - } - }, - /** - * Populate the mutator's dialog with this block's components. - * @param {!Blockly.Workspace} workspace Mutator's workspace. - * @return {!Blockly.Block} Root block in mutator. - * @this Blockly.Block - */ - decompose: function(workspace) { - var containerBlock = Blockly.Block.obtain(workspace, 'controls_if_if'); - containerBlock.initSvg(); - var connection = containerBlock.getInput('STACK').connection; - for (var i = 1; i <= this.elseifCount_; i++) { - var elseifBlock = Blockly.Block.obtain(workspace, 'controls_if_elseif'); - elseifBlock.initSvg(); - connection.connect(elseifBlock.previousConnection); - connection = elseifBlock.nextConnection; - } - if (this.elseCount_) { - var elseBlock = Blockly.Block.obtain(workspace, 'controls_if_else'); - elseBlock.initSvg(); - connection.connect(elseBlock.previousConnection); - } - return containerBlock; - }, - /** - * Reconfigure this block based on the mutator dialog's components. - * @param {!Blockly.Block} containerBlock Root block in mutator. - * @this Blockly.Block - */ - compose: function(containerBlock) { - // Disconnect the else input blocks and remove the inputs. - if (this.elseCount_) { - this.removeInput('ELSE'); - } - this.elseCount_ = 0; - // Disconnect all the elseif input blocks and remove the inputs. - for (var i = this.elseifCount_; i > 0; i--) { - this.removeInput('IF' + i); - this.removeInput('DO' + i); - } - this.elseifCount_ = 0; - // Rebuild the block's optional inputs. - var clauseBlock = containerBlock.getInputTargetBlock('STACK'); - while (clauseBlock) { - switch (clauseBlock.type) { - case 'controls_if_elseif': - this.elseifCount_++; - var ifInput = this.appendValueInput('IF' + this.elseifCount_) - .setCheck('Boolean') - .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF); - var doInput = this.appendStatementInput('DO' + this.elseifCount_); - doInput.appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); - // Reconnect any child blocks. - if (clauseBlock.valueConnection_) { - ifInput.connection.connect(clauseBlock.valueConnection_); - } - if (clauseBlock.statementConnection_) { - doInput.connection.connect(clauseBlock.statementConnection_); - } - break; - case 'controls_if_else': - this.elseCount_++; - var elseInput = this.appendStatementInput('ELSE'); - elseInput.appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE); - // Reconnect any child blocks. - if (clauseBlock.statementConnection_) { - elseInput.connection.connect(clauseBlock.statementConnection_); - } - break; - default: - throw 'Unknown block type.'; - } - clauseBlock = clauseBlock.nextConnection && - clauseBlock.nextConnection.targetBlock(); - } - }, - /** - * Store pointers to any connected child blocks. - * @param {!Blockly.Block} containerBlock Root block in mutator. - * @this Blockly.Block - */ - saveConnections: function(containerBlock) { - var clauseBlock = containerBlock.getInputTargetBlock('STACK'); - var i = 1; - while (clauseBlock) { - switch (clauseBlock.type) { - case 'controls_if_elseif': - var inputIf = this.getInput('IF' + i); - var inputDo = this.getInput('DO' + i); - clauseBlock.valueConnection_ = - inputIf && inputIf.connection.targetConnection; - clauseBlock.statementConnection_ = - inputDo && inputDo.connection.targetConnection; - i++; - break; - case 'controls_if_else': - var inputDo = this.getInput('ELSE'); - clauseBlock.statementConnection_ = - inputDo && inputDo.connection.targetConnection; - break; - default: - throw 'Unknown block type.'; - } - clauseBlock = clauseBlock.nextConnection && - clauseBlock.nextConnection.targetBlock(); - } - } -}; - -Blockly.Blocks['controls_if_if'] = { - /** - * Mutator block for if container. - * @this Blockly.Block - */ - init: function() { - this.setColour(Blockly.Blocks.logic.HUE); - this.appendDummyInput() - .appendField(Blockly.Msg.CONTROLS_IF_IF_TITLE_IF); - this.appendStatementInput('STACK'); - this.setTooltip(Blockly.Msg.CONTROLS_IF_IF_TOOLTIP); - this.contextMenu = false; - } -}; - -Blockly.Blocks['controls_if_elseif'] = { - /** - * Mutator bolck for else-if condition. - * @this Blockly.Block - */ - init: function() { - this.setColour(Blockly.Blocks.logic.HUE); - this.appendDummyInput() - .appendField(Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP); - this.contextMenu = false; - } -}; - -Blockly.Blocks['controls_if_else'] = { - /** - * Mutator block for else condition. - * @this Blockly.Block - */ - init: function() { - this.setColour(Blockly.Blocks.logic.HUE); - this.appendDummyInput() - .appendField(Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE); - this.setPreviousStatement(true); - this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP); - this.contextMenu = false; - } -}; - -Blockly.Blocks['logic_compare'] = { - /** - * Block for comparison operator. - * @this Blockly.Block - */ - init: function() { - var OPERATORS = this.RTL ? [ - ['=', 'EQ'], - ['\u2260', 'NEQ'], - ['>', 'LT'], - ['\u2265', 'LTE'], - ['<', 'GT'], - ['\u2264', 'GTE'] - ] : [ - ['=', 'EQ'], - ['\u2260', 'NEQ'], - ['<', 'LT'], - ['\u2264', 'LTE'], - ['>', 'GT'], - ['\u2265', 'GTE'] - ]; - this.setHelpUrl(Blockly.Msg.LOGIC_COMPARE_HELPURL); - this.setColour(Blockly.Blocks.logic.HUE); - this.setOutput(true, 'Boolean'); - this.appendValueInput('A'); - this.appendValueInput('B') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP'); - this.setInputsInline(true); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function() { - var op = thisBlock.getFieldValue('OP'); - var TOOLTIPS = { - 'EQ': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ, - 'NEQ': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ, - 'LT': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT, - 'LTE': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE, - 'GT': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT, - 'GTE': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE - }; - return TOOLTIPS[op]; - }); - this.prevBlocks_ = [null, null]; - }, - /** - * Called whenever anything on the workspace changes. - * Prevent mismatched types from being compared. - * @this Blockly.Block - */ - onchange: function() { - var blockA = this.getInputTargetBlock('A'); - var blockB = this.getInputTargetBlock('B'); - // Disconnect blocks that existed prior to this change if they don't match. - if (blockA && blockB && - !blockA.outputConnection.checkType_(blockB.outputConnection)) { - // Mismatch between two inputs. Disconnect previous and bump it away. - for (var i = 0; i < this.prevBlocks_.length; i++) { - var block = this.prevBlocks_[i]; - if (block === blockA || block === blockB) { - block.setParent(null); - block.bumpNeighbours_(); - } - } - } - this.prevBlocks_[0] = blockA; - this.prevBlocks_[1] = blockB; - } -}; - -Blockly.Blocks['logic_operation'] = { - /** - * Block for logical operations: 'and', 'or'. - * @this Blockly.Block - */ - init: function() { - var OPERATORS = - [[Blockly.Msg.LOGIC_OPERATION_AND, 'AND'], - [Blockly.Msg.LOGIC_OPERATION_OR, 'OR']]; - this.setHelpUrl(Blockly.Msg.LOGIC_OPERATION_HELPURL); - this.setColour(Blockly.Blocks.logic.HUE); - this.setOutput(true, 'Boolean'); - this.appendValueInput('A') - .setCheck('Boolean'); - this.appendValueInput('B') - .setCheck('Boolean') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP'); - this.setInputsInline(true); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function() { - var op = thisBlock.getFieldValue('OP'); - var TOOLTIPS = { - 'AND': Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND, - 'OR': Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR - }; - return TOOLTIPS[op]; - }); - } -}; - -Blockly.Blocks['logic_negate'] = { - /** - * Block for negation. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOGIC_NEGATE_TITLE, - "args0": [ - { - "type": "input_value", - "name": "BOOL", - "check": "Boolean" - } - ], - "output": "Boolean", - "colour": Blockly.Blocks.logic.HUE, - "tooltip": Blockly.Msg.LOGIC_NEGATE_TOOLTIP, - "helpUrl": Blockly.Msg.LOGIC_NEGATE_HELPURL - }); - } -}; - -Blockly.Blocks['logic_boolean'] = { - /** - * Block for boolean data type: true and false. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": "BOOL", - "options": [ - [Blockly.Msg.LOGIC_BOOLEAN_TRUE, "TRUE"], - [Blockly.Msg.LOGIC_BOOLEAN_FALSE, "FALSE"] - ] - } - ], - "output": "Boolean", - "colour": Blockly.Blocks.logic.HUE, - "tooltip": Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP, - "helpUrl": Blockly.Msg.LOGIC_BOOLEAN_HELPURL - }); - } -}; - -Blockly.Blocks['logic_null'] = { - /** - * Block for null data type. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOGIC_NULL, - "output": null, - "colour": Blockly.Blocks.logic.HUE, - "tooltip": Blockly.Msg.LOGIC_NULL_TOOLTIP, - "helpUrl": Blockly.Msg.LOGIC_NULL_HELPURL - }); - } -}; - -Blockly.Blocks['logic_ternary'] = { - /** - * Block for ternary operator. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.LOGIC_TERNARY_HELPURL); - this.setColour(Blockly.Blocks.logic.HUE); - this.appendValueInput('IF') - .setCheck('Boolean') - .appendField(Blockly.Msg.LOGIC_TERNARY_CONDITION); - this.appendValueInput('THEN') - .appendField(Blockly.Msg.LOGIC_TERNARY_IF_TRUE); - this.appendValueInput('ELSE') - .appendField(Blockly.Msg.LOGIC_TERNARY_IF_FALSE); - this.setOutput(true); - this.setTooltip(Blockly.Msg.LOGIC_TERNARY_TOOLTIP); - this.prevParentConnection_ = null; - }, - /** - * Called whenever anything on the workspace changes. - * Prevent mismatched types. - * @this Blockly.Block - */ - onchange: function() { - var blockA = this.getInputTargetBlock('THEN'); - var blockB = this.getInputTargetBlock('ELSE'); - var parentConnection = this.outputConnection.targetConnection; - // Disconnect blocks that existed prior to this change if they don't match. - if ((blockA || blockB) && parentConnection) { - for (var i = 0; i < 2; i++) { - var block = (i == 1) ? blockA : blockB; - if (block && !block.outputConnection.checkType_(parentConnection)) { - if (parentConnection === this.prevParentConnection_) { - this.setParent(null); - parentConnection.sourceBlock_.bumpNeighbours_(); - } else { - block.setParent(null); - block.bumpNeighbours_(); - } - } - } - } - this.prevParentConnection_ = parentConnection; - } -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/blocks/loops.js b/src/opsoro/apps/visual_programming/static/blockly/blocks/loops.js deleted file mode 100644 index 06e5596..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/blocks/loops.js +++ /dev/null @@ -1,319 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Loop blocks for Blockly. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Blocks.loops'); - -goog.require('Blockly.Blocks'); - - -/** - * Common HSV hue for all blocks in this category. - */ -Blockly.Blocks.loops.HUE = 120; - -Blockly.Blocks['controls_repeat_ext'] = { - /** - * Block for repeat n times (external number). - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.CONTROLS_REPEAT_TITLE, - "args0": [ - { - "type": "input_value", - "name": "TIMES", - "check": "Number" - } - ], - "previousStatement": null, - "nextStatement": null, - "colour": Blockly.Blocks.loops.HUE, - "tooltip": Blockly.Msg.CONTROLS_REPEAT_TOOLTIP, - "helpUrl": Blockly.Msg.CONTROLS_REPEAT_HELPURL - }); - this.appendStatementInput('DO') - .appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO); - } -}; - -Blockly.Blocks['controls_repeat'] = { - /** - * Block for repeat n times (internal number). - * The 'controls_repeat_ext' block is preferred as it is more flexible. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.CONTROLS_REPEAT_TITLE, - "args0": [ - { - "type": "field_input", - "name": "TIMES", - "text": "10" - } - ], - "previousStatement": null, - "nextStatement": null, - "colour": Blockly.Blocks.loops.HUE, - "tooltip": Blockly.Msg.CONTROLS_REPEAT_TOOLTIP, - "helpUrl": Blockly.Msg.CONTROLS_REPEAT_HELPURL - }); - this.appendStatementInput('DO') - .appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO); - this.getField('TIMES').setChangeHandler( - Blockly.FieldTextInput.nonnegativeIntegerValidator); - } -}; - -Blockly.Blocks['controls_whileUntil'] = { - /** - * Block for 'do while/until' loop. - * @this Blockly.Block - */ - init: function() { - var OPERATORS = - [[Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE, 'WHILE'], - [Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL, 'UNTIL']]; - this.setHelpUrl(Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL); - this.setColour(Blockly.Blocks.loops.HUE); - this.appendValueInput('BOOL') - .setCheck('Boolean') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'MODE'); - this.appendStatementInput('DO') - .appendField(Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO); - this.setPreviousStatement(true); - this.setNextStatement(true); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function() { - var op = thisBlock.getFieldValue('MODE'); - var TOOLTIPS = { - 'WHILE': Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE, - 'UNTIL': Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL - }; - return TOOLTIPS[op]; - }); - } -}; - -Blockly.Blocks['controls_for'] = { - /** - * Block for 'for' loop. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.CONTROLS_FOR_TITLE, - "args0": [ - { - "type": "field_variable", - "name": "VAR", - "variable": null - }, - { - "type": "input_value", - "name": "FROM", - "check": "Number", - "align": "RIGHT" - }, - { - "type": "input_value", - "name": "TO", - "check": "Number", - "align": "RIGHT" - }, - { - "type": "input_value", - "name": "BY", - "check": "Number", - "align": "RIGHT" - } - ], - "inputsInline": true, - "previousStatement": null, - "nextStatement": null, - "colour": Blockly.Blocks.loops.HUE, - "helpUrl": Blockly.Msg.CONTROLS_FOR_HELPURL - }); - this.appendStatementInput('DO') - .appendField(Blockly.Msg.CONTROLS_FOR_INPUT_DO); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function() { - return Blockly.Msg.CONTROLS_FOR_TOOLTIP.replace('%1', - thisBlock.getFieldValue('VAR')); - }); - }, - /** - * Return all variables referenced by this block. - * @return {!Array.} List of variable names. - * @this Blockly.Block - */ - getVars: function() { - return [this.getFieldValue('VAR')]; - }, - /** - * Notification that a variable is renaming. - * If the name matches one of this block's variables, rename it. - * @param {string} oldName Previous name of variable. - * @param {string} newName Renamed variable. - * @this Blockly.Block - */ - renameVar: function(oldName, newName) { - if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { - this.setFieldValue(newName, 'VAR'); - } - }, - /** - * Add menu option to create getter block for loop variable. - * @param {!Array} options List of menu options to add to. - * @this Blockly.Block - */ - customContextMenu: function(options) { - if (!this.isCollapsed()) { - var option = {enabled: true}; - var name = this.getFieldValue('VAR'); - option.text = Blockly.Msg.VARIABLES_SET_CREATE_GET.replace('%1', name); - var xmlField = goog.dom.createDom('field', null, name); - xmlField.setAttribute('name', 'VAR'); - var xmlBlock = goog.dom.createDom('block', null, xmlField); - xmlBlock.setAttribute('type', 'variables_get'); - option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); - options.push(option); - } - } -}; - -Blockly.Blocks['controls_forEach'] = { - /** - * Block for 'for each' loop. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.CONTROLS_FOREACH_TITLE, - "args0": [ - { - "type": "field_variable", - "name": "VAR", - "variable": null - }, - { - "type": "input_value", - "name": "LIST", - "check": "Array" - } - ], - "previousStatement": null, - "nextStatement": null, - "colour": Blockly.Blocks.loops.HUE, - "helpUrl": Blockly.Msg.CONTROLS_FOREACH_HELPURL - }); - this.appendStatementInput('DO') - .appendField(Blockly.Msg.CONTROLS_FOREACH_INPUT_DO); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function() { - return Blockly.Msg.CONTROLS_FOREACH_TOOLTIP.replace('%1', - thisBlock.getFieldValue('VAR')); - }); - }, - /** - * Return all variables referenced by this block. - * @return {!Array.} List of variable names. - * @this Blockly.Block - */ - getVars: function() { - return [this.getFieldValue('VAR')]; - }, - /** - * Notification that a variable is renaming. - * If the name matches one of this block's variables, rename it. - * @param {string} oldName Previous name of variable. - * @param {string} newName Renamed variable. - * @this Blockly.Block - */ - renameVar: function(oldName, newName) { - if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { - this.setFieldValue(newName, 'VAR'); - } - }, - customContextMenu: Blockly.Blocks['controls_for'].customContextMenu -}; - -Blockly.Blocks['controls_flow_statements'] = { - /** - * Block for flow statements: continue, break. - * @this Blockly.Block - */ - init: function() { - var OPERATORS = - [[Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK, 'BREAK'], - [Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE, 'CONTINUE']]; - this.setHelpUrl(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL); - this.setColour(Blockly.Blocks.loops.HUE); - this.appendDummyInput() - .appendField(new Blockly.FieldDropdown(OPERATORS), 'FLOW'); - this.setPreviousStatement(true); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function() { - var op = thisBlock.getFieldValue('FLOW'); - var TOOLTIPS = { - 'BREAK': Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK, - 'CONTINUE': Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE - }; - return TOOLTIPS[op]; - }); - }, - /** - * Called whenever anything on the workspace changes. - * Add warning if this flow block is not nested inside a loop. - * @this Blockly.Block - */ - onchange: function() { - var legal = false; - // Is the block nested in a loop? - var block = this; - do { - if (block.type == 'controls_repeat' || - block.type == 'controls_repeat_ext' || - block.type == 'controls_forEach' || - block.type == 'controls_for' || - block.type == 'controls_whileUntil') { - legal = true; - break; - } - block = block.getSurroundParent(); - } while (block); - if (legal) { - this.setWarningText(null); - } else { - this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING); - } - } -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/blocks/math.js b/src/opsoro/apps/visual_programming/static/blockly/blocks/math.js deleted file mode 100644 index f897041..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/blocks/math.js +++ /dev/null @@ -1,508 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Math blocks for Blockly. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Blocks.math'); - -goog.require('Blockly.Blocks'); - - -/** - * Common HSV hue for all blocks in this category. - */ -Blockly.Blocks.math.HUE = 230; - -Blockly.Blocks['math_number'] = { - /** - * Block for numeric value. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.MATH_NUMBER_HELPURL); - this.setColour(Blockly.Blocks.math.HUE); - this.appendDummyInput() - .appendField(new Blockly.FieldTextInput('0', - Blockly.FieldTextInput.numberValidator), 'NUM'); - this.setOutput(true, 'Number'); - this.setTooltip(Blockly.Msg.MATH_NUMBER_TOOLTIP); - } -}; - -Blockly.Blocks['math_arithmetic'] = { - /** - * Block for basic arithmetic operator. - * @this Blockly.Block - */ - init: function() { - var OPERATORS = - [[Blockly.Msg.MATH_ADDITION_SYMBOL, 'ADD'], - [Blockly.Msg.MATH_SUBTRACTION_SYMBOL, 'MINUS'], - [Blockly.Msg.MATH_MULTIPLICATION_SYMBOL, 'MULTIPLY'], - [Blockly.Msg.MATH_DIVISION_SYMBOL, 'DIVIDE'], - [Blockly.Msg.MATH_POWER_SYMBOL, 'POWER']]; - this.setHelpUrl(Blockly.Msg.MATH_ARITHMETIC_HELPURL); - this.setColour(Blockly.Blocks.math.HUE); - this.setOutput(true, 'Number'); - this.appendValueInput('A') - .setCheck('Number'); - this.appendValueInput('B') - .setCheck('Number') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP'); - this.setInputsInline(true); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function() { - var mode = thisBlock.getFieldValue('OP'); - var TOOLTIPS = { - 'ADD': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD, - 'MINUS': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS, - 'MULTIPLY': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY, - 'DIVIDE': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE, - 'POWER': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER - }; - return TOOLTIPS[mode]; - }); - } -}; - -Blockly.Blocks['math_single'] = { - /** - * Block for advanced math operators with single operand. - * @this Blockly.Block - */ - init: function() { - var OPERATORS = - [[Blockly.Msg.MATH_SINGLE_OP_ROOT, 'ROOT'], - [Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE, 'ABS'], - ['-', 'NEG'], - ['ln', 'LN'], - ['log10', 'LOG10'], - ['e^', 'EXP'], - ['10^', 'POW10']]; - this.setHelpUrl(Blockly.Msg.MATH_SINGLE_HELPURL); - this.setColour(Blockly.Blocks.math.HUE); - this.setOutput(true, 'Number'); - this.appendValueInput('NUM') - .setCheck('Number') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP'); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function() { - var mode = thisBlock.getFieldValue('OP'); - var TOOLTIPS = { - 'ROOT': Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT, - 'ABS': Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS, - 'NEG': Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG, - 'LN': Blockly.Msg.MATH_SINGLE_TOOLTIP_LN, - 'LOG10': Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10, - 'EXP': Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP, - 'POW10': Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 - }; - return TOOLTIPS[mode]; - }); - } -}; - -Blockly.Blocks['math_trig'] = { - /** - * Block for trigonometry operators. - * @this Blockly.Block - */ - init: function() { - var OPERATORS = - [[Blockly.Msg.MATH_TRIG_SIN, 'SIN'], - [Blockly.Msg.MATH_TRIG_COS, 'COS'], - [Blockly.Msg.MATH_TRIG_TAN, 'TAN'], - [Blockly.Msg.MATH_TRIG_ASIN, 'ASIN'], - [Blockly.Msg.MATH_TRIG_ACOS, 'ACOS'], - [Blockly.Msg.MATH_TRIG_ATAN, 'ATAN']]; - this.setHelpUrl(Blockly.Msg.MATH_TRIG_HELPURL); - this.setColour(Blockly.Blocks.math.HUE); - this.setOutput(true, 'Number'); - this.appendValueInput('NUM') - .setCheck('Number') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP'); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function() { - var mode = thisBlock.getFieldValue('OP'); - var TOOLTIPS = { - 'SIN': Blockly.Msg.MATH_TRIG_TOOLTIP_SIN, - 'COS': Blockly.Msg.MATH_TRIG_TOOLTIP_COS, - 'TAN': Blockly.Msg.MATH_TRIG_TOOLTIP_TAN, - 'ASIN': Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN, - 'ACOS': Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS, - 'ATAN': Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN - }; - return TOOLTIPS[mode]; - }); - } -}; - -Blockly.Blocks['math_constant'] = { - /** - * Block for constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. - * @this Blockly.Block - */ - init: function() { - var CONSTANTS = - [['\u03c0', 'PI'], - ['e', 'E'], - ['\u03c6', 'GOLDEN_RATIO'], - ['sqrt(2)', 'SQRT2'], - ['sqrt(\u00bd)', 'SQRT1_2'], - ['\u221e', 'INFINITY']]; - this.setHelpUrl(Blockly.Msg.MATH_CONSTANT_HELPURL); - this.setColour(Blockly.Blocks.math.HUE); - this.setOutput(true, 'Number'); - this.appendDummyInput() - .appendField(new Blockly.FieldDropdown(CONSTANTS), 'CONSTANT'); - this.setTooltip(Blockly.Msg.MATH_CONSTANT_TOOLTIP); - } -}; - -Blockly.Blocks['math_number_property'] = { - /** - * Block for checking if a number is even, odd, prime, whole, positive, - * negative or if it is divisible by certain number. - * @this Blockly.Block - */ - init: function() { - var PROPERTIES = - [[Blockly.Msg.MATH_IS_EVEN, 'EVEN'], - [Blockly.Msg.MATH_IS_ODD, 'ODD'], - [Blockly.Msg.MATH_IS_PRIME, 'PRIME'], - [Blockly.Msg.MATH_IS_WHOLE, 'WHOLE'], - [Blockly.Msg.MATH_IS_POSITIVE, 'POSITIVE'], - [Blockly.Msg.MATH_IS_NEGATIVE, 'NEGATIVE'], - [Blockly.Msg.MATH_IS_DIVISIBLE_BY, 'DIVISIBLE_BY']]; - this.setColour(Blockly.Blocks.math.HUE); - this.appendValueInput('NUMBER_TO_CHECK') - .setCheck('Number'); - var dropdown = new Blockly.FieldDropdown(PROPERTIES, function(option) { - var divisorInput = (option == 'DIVISIBLE_BY'); - this.sourceBlock_.updateShape_(divisorInput); - }); - this.appendDummyInput() - .appendField(dropdown, 'PROPERTY'); - this.setInputsInline(true); - this.setOutput(true, 'Boolean'); - this.setTooltip(Blockly.Msg.MATH_IS_TOOLTIP); - }, - /** - * Create XML to represent whether the 'divisorInput' should be present. - * @return {Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - var container = document.createElement('mutation'); - var divisorInput = (this.getFieldValue('PROPERTY') == 'DIVISIBLE_BY'); - container.setAttribute('divisor_input', divisorInput); - return container; - }, - /** - * Parse XML to restore the 'divisorInput'. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - var divisorInput = (xmlElement.getAttribute('divisor_input') == 'true'); - this.updateShape_(divisorInput); - }, - /** - * Modify this block to have (or not have) an input for 'is divisible by'. - * @param {boolean} divisorInput True if this block has a divisor input. - * @private - * @this Blockly.Block - */ - updateShape_: function(divisorInput) { - // Add or remove a Value Input. - var inputExists = this.getInput('DIVISOR'); - if (divisorInput) { - if (!inputExists) { - this.appendValueInput('DIVISOR') - .setCheck('Number'); - } - } else if (inputExists) { - this.removeInput('DIVISOR'); - } - } -}; - -Blockly.Blocks['math_change'] = { - /** - * Block for adding to a variable in place. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MATH_CHANGE_TITLE, - "args0": [ - { - "type": "field_variable", - "name": "VAR", - "variable": Blockly.Msg.MATH_CHANGE_TITLE_ITEM - }, - { - "type": "input_value", - "name": "DELTA", - "check": "Number" - } - ], - "previousStatement": null, - "nextStatement": null, - "colour": Blockly.Blocks.math.HUE, - "helpUrl": Blockly.Msg.MATH_CHANGE_HELPURL - }); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function() { - return Blockly.Msg.MATH_CHANGE_TOOLTIP.replace('%1', - thisBlock.getFieldValue('VAR')); - }); - }, - /** - * Return all variables referenced by this block. - * @return {!Array.} List of variable names. - * @this Blockly.Block - */ - getVars: function() { - return [this.getFieldValue('VAR')]; - }, - /** - * Notification that a variable is renaming. - * If the name matches one of this block's variables, rename it. - * @param {string} oldName Previous name of variable. - * @param {string} newName Renamed variable. - * @this Blockly.Block - */ - renameVar: function(oldName, newName) { - if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { - this.setFieldValue(newName, 'VAR'); - } - } -}; - -Blockly.Blocks['math_round'] = { - /** - * Block for rounding functions. - * @this Blockly.Block - */ - init: function() { - var OPERATORS = - [[Blockly.Msg.MATH_ROUND_OPERATOR_ROUND, 'ROUND'], - [Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP, 'ROUNDUP'], - [Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN, 'ROUNDDOWN']]; - this.setHelpUrl(Blockly.Msg.MATH_ROUND_HELPURL); - this.setColour(Blockly.Blocks.math.HUE); - this.setOutput(true, 'Number'); - this.appendValueInput('NUM') - .setCheck('Number') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP'); - this.setTooltip(Blockly.Msg.MATH_ROUND_TOOLTIP); - } -}; - -Blockly.Blocks['math_on_list'] = { - /** - * Block for evaluating a list of numbers to return sum, average, min, max, - * etc. Some functions also work on text (min, max, mode, median). - * @this Blockly.Block - */ - init: function() { - var OPERATORS = - [[Blockly.Msg.MATH_ONLIST_OPERATOR_SUM, 'SUM'], - [Blockly.Msg.MATH_ONLIST_OPERATOR_MIN, 'MIN'], - [Blockly.Msg.MATH_ONLIST_OPERATOR_MAX, 'MAX'], - [Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE, 'AVERAGE'], - [Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN, 'MEDIAN'], - [Blockly.Msg.MATH_ONLIST_OPERATOR_MODE, 'MODE'], - [Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV, 'STD_DEV'], - [Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM, 'RANDOM']]; - // Assign 'this' to a variable for use in the closures below. - var thisBlock = this; - this.setHelpUrl(Blockly.Msg.MATH_ONLIST_HELPURL); - this.setColour(Blockly.Blocks.math.HUE); - this.setOutput(true, 'Number'); - var dropdown = new Blockly.FieldDropdown(OPERATORS, function(newOp) { - thisBlock.updateType_(newOp); - }); - this.appendValueInput('LIST') - .setCheck('Array') - .appendField(dropdown, 'OP'); - this.setTooltip(function() { - var mode = thisBlock.getFieldValue('OP'); - var TOOLTIPS = { - 'SUM': Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM, - 'MIN': Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN, - 'MAX': Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX, - 'AVERAGE': Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE, - 'MEDIAN': Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN, - 'MODE': Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE, - 'STD_DEV': Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV, - 'RANDOM': Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM - }; - return TOOLTIPS[mode]; - }); - }, - /** - * Modify this block to have the correct output type. - * @param {string} newOp Either 'MODE' or some op than returns a number. - * @private - * @this Blockly.Block - */ - updateType_: function(newOp) { - if (newOp == 'MODE') { - this.outputConnection.setCheck('Array'); - } else { - this.outputConnection.setCheck('Number'); - } - }, - /** - * Create XML to represent the output type. - * @return {Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - var container = document.createElement('mutation'); - container.setAttribute('op', this.getFieldValue('OP')); - return container; - }, - /** - * Parse XML to restore the output type. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - this.updateType_(xmlElement.getAttribute('op')); - } -}; - -Blockly.Blocks['math_modulo'] = { - /** - * Block for remainder of a division. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MATH_MODULO_TITLE, - "args0": [ - { - "type": "input_value", - "name": "DIVIDEND", - "check": "Number" - }, - { - "type": "input_value", - "name": "DIVISOR", - "check": "Number" - } - ], - "inputsInline": true, - "output": "Number", - "colour": Blockly.Blocks.math.HUE, - "tooltip": Blockly.Msg.MATH_MODULO_TOOLTIP, - "helpUrl": Blockly.Msg.MATH_MODULO_HELPURL - }); - } -}; - -Blockly.Blocks['math_constrain'] = { - /** - * Block for constraining a number between two limits. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MATH_CONSTRAIN_TITLE, - "args0": [ - { - "type": "input_value", - "name": "VALUE", - "check": "Number" - }, - { - "type": "input_value", - "name": "LOW", - "check": "Number" - }, - { - "type": "input_value", - "name": "HIGH", - "check": "Number" - } - ], - "inputsInline": true, - "output": "Number", - "colour": Blockly.Blocks.math.HUE, - "tooltip": Blockly.Msg.MATH_CONSTRAIN_TOOLTIP, - "helpUrl": Blockly.Msg.MATH_CONSTRAIN_HELPURL - }); - } -}; - -Blockly.Blocks['math_random_int'] = { - /** - * Block for random integer between [X] and [Y]. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MATH_RANDOM_INT_TITLE, - "args0": [ - { - "type": "input_value", - "name": "FROM", - "check": "Number" - }, - { - "type": "input_value", - "name": "TO", - "check": "Number" - } - ], - "inputsInline": true, - "output": "Number", - "colour": Blockly.Blocks.math.HUE, - "tooltip": Blockly.Msg.MATH_RANDOM_INT_TOOLTIP, - "helpUrl": Blockly.Msg.MATH_RANDOM_INT_HELPURL - }); - } -}; - -Blockly.Blocks['math_random_float'] = { - /** - * Block for random fraction between 0 and 1. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL); - this.setColour(Blockly.Blocks.math.HUE); - this.setOutput(true, 'Number'); - this.appendDummyInput() - .appendField(Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM); - this.setTooltip(Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP); - } -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/blocks/procedures.js b/src/opsoro/apps/visual_programming/static/blockly/blocks/procedures.js deleted file mode 100644 index 9407b66..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/blocks/procedures.js +++ /dev/null @@ -1,775 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Procedure blocks for Blockly. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Blocks.procedures'); - -goog.require('Blockly.Blocks'); - - -/** - * Common HSV hue for all blocks in this category. - */ -Blockly.Blocks.procedures.HUE = 290; - -Blockly.Blocks['procedures_defnoreturn'] = { - /** - * Block for defining a procedure with no return value. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL); - this.setColour(Blockly.Blocks.procedures.HUE); - var nameField = new Blockly.FieldTextInput( - Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE, - Blockly.Procedures.rename); - nameField.setSpellcheck(false); - this.appendDummyInput() - .appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE) - .appendField(nameField, 'NAME') - .appendField('', 'PARAMS'); - this.setMutator(new Blockly.Mutator(['procedures_mutatorarg'])); - this.setTooltip(Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP); - this.arguments_ = []; - this.setStatements_(true); - this.statementConnection_ = null; - }, - /** - * Initialization of the block has completed, clean up anything that may be - * inconsistent as a result of the XML loading. - * @this Blockly.Block - */ - validate: function () { - var name = Blockly.Procedures.findLegalName( - this.getFieldValue('NAME'), this); - this.setFieldValue(name, 'NAME'); - }, - /** - * Add or remove the statement block from this function definition. - * @param {boolean} hasStatements True if a statement block is needed. - * @this Blockly.Block - */ - setStatements_: function(hasStatements) { - if (this.hasStatements_ === hasStatements) { - return; - } - if (hasStatements) { - this.appendStatementInput('STACK') - .appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_DO); - if (this.getInput('RETURN')) { - this.moveInputBefore('STACK', 'RETURN'); - } - } else { - this.removeInput('STACK', true); - } - this.hasStatements_ = hasStatements; - }, - /** - * Update the display of parameters for this procedure definition block. - * Display a warning if there are duplicately named parameters. - * @private - * @this Blockly.Block - */ - updateParams_: function() { - // Check for duplicated arguments. - var badArg = false; - var hash = {}; - for (var i = 0; i < this.arguments_.length; i++) { - if (hash['arg_' + this.arguments_[i].toLowerCase()]) { - badArg = true; - break; - } - hash['arg_' + this.arguments_[i].toLowerCase()] = true; - } - if (badArg) { - this.setWarningText(Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING); - } else { - this.setWarningText(null); - } - // Merge the arguments into a human-readable list. - var paramString = ''; - if (this.arguments_.length) { - paramString = Blockly.Msg.PROCEDURES_BEFORE_PARAMS + - ' ' + this.arguments_.join(', '); - } - this.setFieldValue(paramString, 'PARAMS'); - }, - /** - * Create XML to represent the argument inputs. - * @return {!Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - var container = document.createElement('mutation'); - for (var i = 0; i < this.arguments_.length; i++) { - var parameter = document.createElement('arg'); - parameter.setAttribute('name', this.arguments_[i]); - container.appendChild(parameter); - } - - // Save whether the statement input is visible. - if (!this.hasStatements_) { - container.setAttribute('statements', 'false'); - } - return container; - }, - /** - * Parse XML to restore the argument inputs. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - this.arguments_ = []; - for (var i = 0, childNode; childNode = xmlElement.childNodes[i]; i++) { - if (childNode.nodeName.toLowerCase() == 'arg') { - this.arguments_.push(childNode.getAttribute('name')); - } - } - this.updateParams_(); - - // Show or hide the statement input. - this.setStatements_(xmlElement.getAttribute('statements') !== 'false'); - }, - /** - * Populate the mutator's dialog with this block's components. - * @param {!Blockly.Workspace} workspace Mutator's workspace. - * @return {!Blockly.Block} Root block in mutator. - * @this Blockly.Block - */ - decompose: function(workspace) { - var containerBlock = Blockly.Block.obtain(workspace, - 'procedures_mutatorcontainer'); - containerBlock.initSvg(); - - // Check/uncheck the allow statement box. - if (this.getInput('RETURN')) { - containerBlock.setFieldValue(this.hasStatements_ ? 'TRUE' : 'FALSE', - 'STATEMENTS'); - } else { - containerBlock.getInput('STATEMENT_INPUT').setVisible(false); - } - - // Parameter list. - var connection = containerBlock.getInput('STACK').connection; - for (var i = 0; i < this.arguments_.length; i++) { - var paramBlock = Blockly.Block.obtain(workspace, 'procedures_mutatorarg'); - paramBlock.initSvg(); - paramBlock.setFieldValue(this.arguments_[i], 'NAME'); - // Store the old location. - paramBlock.oldLocation = i; - connection.connect(paramBlock.previousConnection); - connection = paramBlock.nextConnection; - } - // Initialize procedure's callers with blank IDs. - Blockly.Procedures.mutateCallers(this.getFieldValue('NAME'), - this.workspace, this.arguments_, null); - return containerBlock; - }, - /** - * Reconfigure this block based on the mutator dialog's components. - * @param {!Blockly.Block} containerBlock Root block in mutator. - * @this Blockly.Block - */ - compose: function(containerBlock) { - // Parameter list. - this.arguments_ = []; - this.paramIds_ = []; - var paramBlock = containerBlock.getInputTargetBlock('STACK'); - while (paramBlock) { - this.arguments_.push(paramBlock.getFieldValue('NAME')); - this.paramIds_.push(paramBlock.id); - paramBlock = paramBlock.nextConnection && - paramBlock.nextConnection.targetBlock(); - } - this.updateParams_(); - Blockly.Procedures.mutateCallers(this.getFieldValue('NAME'), - this.workspace, this.arguments_, this.paramIds_); - - // Show/hide the statement input. - var hasStatements = containerBlock.getFieldValue('STATEMENTS'); - if (hasStatements !== null) { - hasStatements = hasStatements == 'TRUE'; - if (this.hasStatements_ != hasStatements) { - if (hasStatements) { - this.setStatements_(true); - // Restore the stack, if one was saved. - var stackConnection = this.getInput('STACK').connection; - if (stackConnection.targetConnection || - !this.statementConnection_ || - this.statementConnection_.targetConnection || - this.statementConnection_.sourceBlock_.workspace != - this.workspace) { - // Block no longer exists or has been attached elsewhere. - this.statementConnection_ = null; - } else { - stackConnection.connect(this.statementConnection_); - } - } else { - // Save the stack, then disconnect it. - var stackConnection = this.getInput('STACK').connection; - this.statementConnection_ = stackConnection.targetConnection; - if (this.statementConnection_) { - var stackBlock = stackConnection.targetBlock(); - stackBlock.setParent(null); - stackBlock.bumpNeighbours_(); - } - this.setStatements_(false); - } - } - } - }, - /** - * Dispose of any callers. - * @this Blockly.Block - */ - dispose: function() { - var name = this.getFieldValue('NAME'); - Blockly.Procedures.disposeCallers(name, this.workspace); - // Call parent's destructor. - this.constructor.prototype.dispose.apply(this, arguments); - }, - /** - * Return the signature of this procedure definition. - * @return {!Array} Tuple containing three elements: - * - the name of the defined procedure, - * - a list of all its arguments, - * - that it DOES NOT have a return value. - * @this Blockly.Block - */ - getProcedureDef: function() { - return [this.getFieldValue('NAME'), this.arguments_, false]; - }, - /** - * Return all variables referenced by this block. - * @return {!Array.} List of variable names. - * @this Blockly.Block - */ - getVars: function() { - return this.arguments_; - }, - /** - * Notification that a variable is renaming. - * If the name matches one of this block's variables, rename it. - * @param {string} oldName Previous name of variable. - * @param {string} newName Renamed variable. - * @this Blockly.Block - */ - renameVar: function(oldName, newName) { - var change = false; - for (var i = 0; i < this.arguments_.length; i++) { - if (Blockly.Names.equals(oldName, this.arguments_[i])) { - this.arguments_[i] = newName; - change = true; - } - } - if (change) { - this.updateParams_(); - // Update the mutator's variables if the mutator is open. - if (this.mutator.isVisible()) { - var blocks = this.mutator.workspace_.getAllBlocks(); - for (var i = 0, block; block = blocks[i]; i++) { - if (block.type == 'procedures_mutatorarg' && - Blockly.Names.equals(oldName, block.getFieldValue('NAME'))) { - block.setFieldValue(newName, 'NAME'); - } - } - } - } - }, - /** - * Add custom menu options to this block's context menu. - * @param {!Array} options List of menu options to add to. - * @this Blockly.Block - */ - customContextMenu: function(options) { - // Add option to create caller. - var option = {enabled: true}; - var name = this.getFieldValue('NAME'); - option.text = Blockly.Msg.PROCEDURES_CREATE_DO.replace('%1', name); - var xmlMutation = goog.dom.createDom('mutation'); - xmlMutation.setAttribute('name', name); - for (var i = 0; i < this.arguments_.length; i++) { - var xmlArg = goog.dom.createDom('arg'); - xmlArg.setAttribute('name', this.arguments_[i]); - xmlMutation.appendChild(xmlArg); - } - var xmlBlock = goog.dom.createDom('block', null, xmlMutation); - xmlBlock.setAttribute('type', this.callType_); - option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); - options.push(option); - - // Add options to create getters for each parameter. - if (!this.isCollapsed()) { - for (var i = 0; i < this.arguments_.length; i++) { - var option = {enabled: true}; - var name = this.arguments_[i]; - option.text = Blockly.Msg.VARIABLES_SET_CREATE_GET.replace('%1', name); - var xmlField = goog.dom.createDom('field', null, name); - xmlField.setAttribute('name', 'VAR'); - var xmlBlock = goog.dom.createDom('block', null, xmlField); - xmlBlock.setAttribute('type', 'variables_get'); - option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); - options.push(option); - } - } - }, - callType_: 'procedures_callnoreturn' -}; - -Blockly.Blocks['procedures_defreturn'] = { - /** - * Block for defining a procedure with a return value. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL); - this.setColour(Blockly.Blocks.procedures.HUE); - var nameField = new Blockly.FieldTextInput( - Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE, - Blockly.Procedures.rename); - nameField.setSpellcheck(false); - this.appendDummyInput() - .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_TITLE) - .appendField(nameField, 'NAME') - .appendField('', 'PARAMS'); - this.appendValueInput('RETURN') - .setAlign(Blockly.ALIGN_RIGHT) - .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN); - this.setMutator(new Blockly.Mutator(['procedures_mutatorarg'])); - this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP); - this.arguments_ = []; - this.setStatements_(true); - this.statementConnection_ = null; - }, - setStatements_: Blockly.Blocks['procedures_defnoreturn'].setStatements_, - validate: Blockly.Blocks['procedures_defnoreturn'].validate, - updateParams_: Blockly.Blocks['procedures_defnoreturn'].updateParams_, - mutationToDom: Blockly.Blocks['procedures_defnoreturn'].mutationToDom, - domToMutation: Blockly.Blocks['procedures_defnoreturn'].domToMutation, - decompose: Blockly.Blocks['procedures_defnoreturn'].decompose, - compose: Blockly.Blocks['procedures_defnoreturn'].compose, - dispose: Blockly.Blocks['procedures_defnoreturn'].dispose, - /** - * Return the signature of this procedure definition. - * @return {!Array} Tuple containing three elements: - * - the name of the defined procedure, - * - a list of all its arguments, - * - that it DOES have a return value. - * @this Blockly.Block - */ - getProcedureDef: function() { - return [this.getFieldValue('NAME'), this.arguments_, true]; - }, - getVars: Blockly.Blocks['procedures_defnoreturn'].getVars, - renameVar: Blockly.Blocks['procedures_defnoreturn'].renameVar, - customContextMenu: Blockly.Blocks['procedures_defnoreturn'].customContextMenu, - callType_: 'procedures_callreturn' -}; - -Blockly.Blocks['procedures_mutatorcontainer'] = { - /** - * Mutator block for procedure container. - * @this Blockly.Block - */ - init: function() { - this.setColour(Blockly.Blocks.procedures.HUE); - this.appendDummyInput() - .appendField(Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE); - this.appendStatementInput('STACK'); - this.appendDummyInput('STATEMENT_INPUT') - .appendField(Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS) - .appendField(new Blockly.FieldCheckbox('TRUE'), 'STATEMENTS'); - this.setTooltip(Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP); - this.contextMenu = false; - } -}; - -Blockly.Blocks['procedures_mutatorarg'] = { - /** - * Mutator block for procedure argument. - * @this Blockly.Block - */ - init: function() { - this.setColour(Blockly.Blocks.procedures.HUE); - this.appendDummyInput() - .appendField(Blockly.Msg.PROCEDURES_MUTATORARG_TITLE) - .appendField(new Blockly.FieldTextInput('x', this.validator_), 'NAME'); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setTooltip(Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP); - this.contextMenu = false; - }, - /** - * Obtain a valid name for the procedure. - * Merge runs of whitespace. Strip leading and trailing whitespace. - * Beyond this, all names are legal. - * @param {string} newVar User-supplied name. - * @return {?string} Valid name, or null if a name was not specified. - * @private - * @this Blockly.Block - */ - validator_: function(newVar) { - newVar = newVar.replace(/[\s\xa0]+/g, ' ').replace(/^ | $/g, ''); - return newVar || null; - } -}; - -Blockly.Blocks['procedures_callnoreturn'] = { - /** - * Block for calling a procedure with no return value. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL); - this.setColour(Blockly.Blocks.procedures.HUE); - this.appendDummyInput('TOPROW') - .appendField(Blockly.Msg.PROCEDURES_CALLNORETURN_CALL) - .appendField('', 'NAME'); - this.setPreviousStatement(true); - this.setNextStatement(true); - // Tooltip is set in domToMutation. - this.arguments_ = []; - this.quarkConnections_ = {}; - this.quarkArguments_ = null; - }, - /** - * Returns the name of the procedure this block calls. - * @return {string} Procedure name. - * @this Blockly.Block - */ - getProcedureCall: function() { - // The NAME field is guaranteed to exist, null will never be returned. - return /** @type {string} */ (this.getFieldValue('NAME')); - }, - /** - * Notification that a procedure is renaming. - * If the name matches this block's procedure, rename it. - * @param {string} oldName Previous name of procedure. - * @param {string} newName Renamed procedure. - * @this Blockly.Block - */ - renameProcedure: function(oldName, newName) { - if (Blockly.Names.equals(oldName, this.getProcedureCall())) { - this.setFieldValue(newName, 'NAME'); - this.setTooltip( - (this.outputConnection ? Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP : - Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP) - .replace('%1', newName)); - } - }, - /** - * Notification that the procedure's parameters have changed. - * @param {!Array.} paramNames New param names, e.g. ['x', 'y', 'z']. - * @param {!Array.} paramIds IDs of params (consistent for each - * parameter through the life of a mutator, regardless of param renaming), - * e.g. ['piua', 'f8b_', 'oi.o']. - * @this Blockly.Block - */ - setProcedureParameters: function(paramNames, paramIds) { - // Data structures: - // this.arguments = ['x', 'y'] - // Existing param names. - // this.quarkConnections_ {piua: null, f8b_: Blockly.Connection} - // Look-up of paramIds to connections plugged into the call block. - // this.quarkArguments_ = ['piua', 'f8b_'] - // Existing param IDs. - // Note that quarkConnections_ may include IDs that no longer exist, but - // which might reappear if a param is reattached in the mutator. - if (!paramIds) { - // Reset the quarks (a mutator is about to open). - this.quarkConnections_ = {}; - this.quarkArguments_ = null; - return; - } - if (goog.array.equals(this.arguments_, paramNames)) { - // No change. - this.quarkArguments_ = paramIds; - return; - } - this.setCollapsed(false); - if (paramIds.length != paramNames.length) { - throw 'Error: paramNames and paramIds must be the same length.'; - } - if (!this.quarkArguments_) { - // Initialize tracking for this block. - this.quarkConnections_ = {}; - if (paramNames.join('\n') == this.arguments_.join('\n')) { - // No change to the parameters, allow quarkConnections_ to be - // populated with the existing connections. - this.quarkArguments_ = paramIds; - } else { - this.quarkArguments_ = []; - } - } - // Switch off rendering while the block is rebuilt. - var savedRendered = this.rendered; - this.rendered = false; - // Update the quarkConnections_ with existing connections. - for (var i = this.arguments_.length - 1; i >= 0; i--) { - var input = this.getInput('ARG' + i); - if (input) { - var connection = input.connection.targetConnection; - this.quarkConnections_[this.quarkArguments_[i]] = connection; - // Disconnect all argument blocks and remove all inputs. - this.removeInput('ARG' + i); - } - } - // Rebuild the block's arguments. - this.arguments_ = [].concat(paramNames); - this.renderArgs_(); - this.quarkArguments_ = paramIds; - // Reconnect any child blocks. - if (this.quarkArguments_) { - for (var i = 0; i < this.arguments_.length; i++) { - var input = this.getInput('ARG' + i); - var quarkName = this.quarkArguments_[i]; - if (quarkName in this.quarkConnections_) { - var connection = this.quarkConnections_[quarkName]; - if (!connection || connection.targetConnection || - connection.sourceBlock_.workspace != this.workspace) { - // Block no longer exists or has been attached elsewhere. - delete this.quarkConnections_[quarkName]; - } else { - input.connection.connect(connection); - } - } - } - } - // Restore rendering and show the changes. - this.rendered = savedRendered; - if (this.rendered) { - this.render(); - } - }, - /** - * Render the arguments. - * @this Blockly.Block - * @private - */ - renderArgs_: function() { - for (var i = 0; i < this.arguments_.length; i++) { - var input = this.appendValueInput('ARG' + i) - .setAlign(Blockly.ALIGN_RIGHT) - .appendField(this.arguments_[i]); - input.init(); - } - // Add 'with:' if there are parameters. - var input = this.getInput('TOPROW'); - if (input) { - if (this.arguments_.length) { - if (!this.getField('WITH')) { - input.appendField(Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS, 'WITH'); - input.init(); - } - } else { - if (this.getField('WITH')) { - input.removeField('WITH'); - } - } - } - }, - /** - * Create XML to represent the (non-editable) name and arguments. - * @return {!Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - var container = document.createElement('mutation'); - container.setAttribute('name', this.getProcedureCall()); - for (var i = 0; i < this.arguments_.length; i++) { - var parameter = document.createElement('arg'); - parameter.setAttribute('name', this.arguments_[i]); - container.appendChild(parameter); - } - return container; - }, - /** - * Parse XML to restore the (non-editable) name and parameters. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - var name = xmlElement.getAttribute('name'); - this.setFieldValue(name, 'NAME'); - this.setTooltip( - (this.outputConnection ? Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP : - Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP).replace('%1', name)); - var def = Blockly.Procedures.getDefinition(name, this.workspace); - if (def && def.mutator && def.mutator.isVisible()) { - // Initialize caller with the mutator's IDs. - this.setProcedureParameters(def.arguments_, def.paramIds_); - } else { - var args = []; - for (var i = 0, childNode; childNode = xmlElement.childNodes[i]; i++) { - if (childNode.nodeName.toLowerCase() == 'arg') { - args.push(childNode.getAttribute('name')); - } - } - // For the second argument (paramIds) use the arguments list as a dummy - // list. - this.setProcedureParameters(args, args); - } - }, - /** - * Notification that a variable is renaming. - * If the name matches one of this block's variables, rename it. - * @param {string} oldName Previous name of variable. - * @param {string} newName Renamed variable. - * @this Blockly.Block - */ - renameVar: function(oldName, newName) { - for (var i = 0; i < this.arguments_.length; i++) { - if (Blockly.Names.equals(oldName, this.arguments_[i])) { - this.arguments_[i] = newName; - this.getInput('ARG' + i).fieldRow[0].setText(newName); - } - } - }, - /** - * Add menu option to find the definition block for this call. - * @param {!Array} options List of menu options to add to. - * @this Blockly.Block - */ - customContextMenu: function(options) { - var option = {enabled: true}; - option.text = Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF; - var name = this.getProcedureCall(); - var workspace = this.workspace; - option.callback = function() { - var def = Blockly.Procedures.getDefinition(name, workspace); - def && def.select(); - }; - options.push(option); - } -}; - -Blockly.Blocks['procedures_callreturn'] = { - /** - * Block for calling a procedure with a return value. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL); - this.setColour(Blockly.Blocks.procedures.HUE); - this.appendDummyInput('TOPROW') - .appendField(Blockly.Msg.PROCEDURES_CALLRETURN_CALL) - .appendField('', 'NAME'); - this.setOutput(true); - // Tooltip is set in domToMutation. - this.arguments_ = []; - this.quarkConnections_ = {}; - this.quarkArguments_ = null; - }, - getProcedureCall: Blockly.Blocks['procedures_callnoreturn'].getProcedureCall, - renameProcedure: Blockly.Blocks['procedures_callnoreturn'].renameProcedure, - setProcedureParameters: - Blockly.Blocks['procedures_callnoreturn'].setProcedureParameters, - renderArgs_: Blockly.Blocks['procedures_callnoreturn'].renderArgs_, - mutationToDom: Blockly.Blocks['procedures_callnoreturn'].mutationToDom, - domToMutation: Blockly.Blocks['procedures_callnoreturn'].domToMutation, - renameVar: Blockly.Blocks['procedures_callnoreturn'].renameVar, - customContextMenu: Blockly.Blocks['procedures_callnoreturn'].customContextMenu -}; - -Blockly.Blocks['procedures_ifreturn'] = { - /** - * Block for conditionally returning a value from a procedure. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl('http://c2.com/cgi/wiki?GuardClause'); - this.setColour(Blockly.Blocks.procedures.HUE); - this.appendValueInput('CONDITION') - .setCheck('Boolean') - .appendField(Blockly.Msg.CONTROLS_IF_MSG_IF); - this.appendValueInput('VALUE') - .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN); - this.setInputsInline(true); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setTooltip(Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP); - this.hasReturnValue_ = true; - }, - /** - * Create XML to represent whether this block has a return value. - * @return {!Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - var container = document.createElement('mutation'); - container.setAttribute('value', Number(this.hasReturnValue_)); - return container; - }, - /** - * Parse XML to restore whether this block has a return value. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - var value = xmlElement.getAttribute('value'); - this.hasReturnValue_ = (value == 1); - if (!this.hasReturnValue_) { - this.removeInput('VALUE'); - this.appendDummyInput('VALUE') - .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN); - } - }, - /** - * Called whenever anything on the workspace changes. - * Add warning if this flow block is not nested inside a loop. - * @this Blockly.Block - */ - onchange: function() { - var legal = false; - // Is the block nested in a procedure? - var block = this; - do { - if (block.type == 'procedures_defnoreturn' || - block.type == 'procedures_defreturn') { - legal = true; - break; - } - block = block.getSurroundParent(); - } while (block); - if (legal) { - // If needed, toggle whether this block has a return value. - if (block.type == 'procedures_defnoreturn' && this.hasReturnValue_) { - this.removeInput('VALUE'); - this.appendDummyInput('VALUE') - .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN); - this.hasReturnValue_ = false; - } else if (block.type == 'procedures_defreturn' && - !this.hasReturnValue_) { - this.removeInput('VALUE'); - this.appendValueInput('VALUE') - .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN); - this.hasReturnValue_ = true; - } - this.setWarningText(null); - } else { - this.setWarningText(Blockly.Msg.PROCEDURES_IFRETURN_WARNING); - } - } -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/blocks/text.js b/src/opsoro/apps/visual_programming/static/blockly/blocks/text.js deleted file mode 100644 index 9dac6b2..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/blocks/text.js +++ /dev/null @@ -1,687 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Text blocks for Blockly. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Blocks.texts'); - -goog.require('Blockly.Blocks'); - - -/** - * Common HSV hue for all blocks in this category. - */ -Blockly.Blocks.texts.HUE = 160; - -Blockly.Blocks['text'] = { - /** - * Block for text value. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.TEXT_TEXT_HELPURL); - this.setColour(Blockly.Blocks.texts.HUE); - this.appendDummyInput() - .appendField(this.newQuote_(true)) - .appendField(new Blockly.FieldTextInput(''), 'TEXT') - .appendField(this.newQuote_(false)); - this.setOutput(true, 'String'); - this.setTooltip(Blockly.Msg.TEXT_TEXT_TOOLTIP); - }, - /** - * Create an image of an open or closed quote. - * @param {boolean} open True if open quote, false if closed. - * @return {!Blockly.FieldImage} The field image of the quote. - * @this Blockly.Block - * @private - */ - newQuote_: function(open) { - if (open == this.RTL) { - var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg=='; - } else { - var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC'; - } - return new Blockly.FieldImage(file, 12, 12, '"'); - } -}; - -Blockly.Blocks['text_join'] = { - /** - * Block for creating a string made up of any number of elements of any type. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.TEXT_JOIN_HELPURL); - this.setColour(Blockly.Blocks.texts.HUE); - this.itemCount_ = 2; - this.updateShape_(); - this.setOutput(true, 'String'); - this.setMutator(new Blockly.Mutator(['text_create_join_item'])); - this.setTooltip(Blockly.Msg.TEXT_JOIN_TOOLTIP); - }, - /** - * Create XML to represent number of text inputs. - * @return {!Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - var container = document.createElement('mutation'); - container.setAttribute('items', this.itemCount_); - return container; - }, - /** - * Parse XML to restore the text inputs. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); - this.updateShape_(); - }, - /** - * Populate the mutator's dialog with this block's components. - * @param {!Blockly.Workspace} workspace Mutator's workspace. - * @return {!Blockly.Block} Root block in mutator. - * @this Blockly.Block - */ - decompose: function(workspace) { - var containerBlock = Blockly.Block.obtain(workspace, - 'text_create_join_container'); - containerBlock.initSvg(); - var connection = containerBlock.getInput('STACK').connection; - for (var i = 0; i < this.itemCount_; i++) { - var itemBlock = Blockly.Block.obtain(workspace, 'text_create_join_item'); - itemBlock.initSvg(); - connection.connect(itemBlock.previousConnection); - connection = itemBlock.nextConnection; - } - return containerBlock; - }, - /** - * Reconfigure this block based on the mutator dialog's components. - * @param {!Blockly.Block} containerBlock Root block in mutator. - * @this Blockly.Block - */ - compose: function(containerBlock) { - var itemBlock = containerBlock.getInputTargetBlock('STACK'); - // Count number of inputs. - var connections = []; - while (itemBlock) { - connections.push(itemBlock.valueConnection_); - itemBlock = itemBlock.nextConnection && - itemBlock.nextConnection.targetBlock(); - } - this.itemCount_ = connections.length; - this.updateShape_(); - // Reconnect any child blocks. - for (var i = 0; i < this.itemCount_; i++) { - if (connections[i]) { - this.getInput('ADD' + i).connection.connect(connections[i]); - } - } - }, - /** - * Store pointers to any connected child blocks. - * @param {!Blockly.Block} containerBlock Root block in mutator. - * @this Blockly.Block - */ - saveConnections: function(containerBlock) { - var itemBlock = containerBlock.getInputTargetBlock('STACK'); - var i = 0; - while (itemBlock) { - var input = this.getInput('ADD' + i); - itemBlock.valueConnection_ = input && input.connection.targetConnection; - i++; - itemBlock = itemBlock.nextConnection && - itemBlock.nextConnection.targetBlock(); - } - }, - /** - * Modify this block to have the correct number of inputs. - * @private - * @this Blockly.Block - */ - updateShape_: function() { - // Delete everything. - if (this.getInput('EMPTY')) { - this.removeInput('EMPTY'); - } else { - var i = 0; - while (this.getInput('ADD' + i)) { - this.removeInput('ADD' + i); - i++; - } - } - // Rebuild block. - if (this.itemCount_ == 0) { - this.appendDummyInput('EMPTY') - .appendField(this.newQuote_(true)) - .appendField(this.newQuote_(false)); - } else { - for (var i = 0; i < this.itemCount_; i++) { - var input = this.appendValueInput('ADD' + i); - if (i == 0) { - input.appendField(Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH); - } - } - } - }, - newQuote_: Blockly.Blocks['text'].newQuote_ -}; - -Blockly.Blocks['text_create_join_container'] = { - /** - * Mutator block for container. - * @this Blockly.Block - */ - init: function() { - this.setColour(Blockly.Blocks.texts.HUE); - this.appendDummyInput() - .appendField(Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN); - this.appendStatementInput('STACK'); - this.setTooltip(Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP); - this.contextMenu = false; - } -}; - -Blockly.Blocks['text_create_join_item'] = { - /** - * Mutator block for add items. - * @this Blockly.Block - */ - init: function() { - this.setColour(Blockly.Blocks.texts.HUE); - this.appendDummyInput() - .appendField(Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setTooltip(Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP); - this.contextMenu = false; - } -}; - -Blockly.Blocks['text_append'] = { - /** - * Block for appending to a variable in place. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.TEXT_APPEND_HELPURL); - this.setColour(Blockly.Blocks.texts.HUE); - this.appendValueInput('TEXT') - .appendField(Blockly.Msg.TEXT_APPEND_TO) - .appendField(new Blockly.FieldVariable( - Blockly.Msg.TEXT_APPEND_VARIABLE), 'VAR') - .appendField(Blockly.Msg.TEXT_APPEND_APPENDTEXT); - this.setPreviousStatement(true); - this.setNextStatement(true); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function() { - return Blockly.Msg.TEXT_APPEND_TOOLTIP.replace('%1', - thisBlock.getFieldValue('VAR')); - }); - }, - /** - * Return all variables referenced by this block. - * @return {!Array.} List of variable names. - * @this Blockly.Block - */ - getVars: function() { - return [this.getFieldValue('VAR')]; - }, - /** - * Notification that a variable is renaming. - * If the name matches one of this block's variables, rename it. - * @param {string} oldName Previous name of variable. - * @param {string} newName Renamed variable. - * @this Blockly.Block - */ - renameVar: function(oldName, newName) { - if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { - this.setFieldValue(newName, 'VAR'); - } - } -}; - -Blockly.Blocks['text_length'] = { - /** - * Block for string length. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.TEXT_LENGTH_TITLE, - "args0": [ - { - "type": "input_value", - "name": "VALUE", - "check": ['String', 'Array'] - } - ], - "output": 'Number', - "colour": Blockly.Blocks.texts.HUE, - "tooltip": Blockly.Msg.TEXT_LENGTH_TOOLTIP, - "helpUrl": Blockly.Msg.TEXT_LENGTH_HELPURL - }); - } -}; - -Blockly.Blocks['text_isEmpty'] = { - /** - * Block for is the string null? - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.TEXT_ISEMPTY_TITLE, - "args0": [ - { - "type": "input_value", - "name": "VALUE", - "check": ['String', 'Array'] - } - ], - "output": 'Boolean', - "colour": Blockly.Blocks.texts.HUE, - "tooltip": Blockly.Msg.TEXT_ISEMPTY_TOOLTIP, - "helpUrl": Blockly.Msg.TEXT_ISEMPTY_HELPURL - }); - } -}; - -Blockly.Blocks['text_indexOf'] = { - /** - * Block for finding a substring in the text. - * @this Blockly.Block - */ - init: function() { - var OPERATORS = - [[Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST, 'FIRST'], - [Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST, 'LAST']]; - this.setHelpUrl(Blockly.Msg.TEXT_INDEXOF_HELPURL); - this.setColour(Blockly.Blocks.texts.HUE); - this.setOutput(true, 'Number'); - this.appendValueInput('VALUE') - .setCheck('String') - .appendField(Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT); - this.appendValueInput('FIND') - .setCheck('String') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'END'); - if (Blockly.Msg.TEXT_INDEXOF_TAIL) { - this.appendDummyInput().appendField(Blockly.Msg.TEXT_INDEXOF_TAIL); - } - this.setInputsInline(true); - this.setTooltip(Blockly.Msg.TEXT_INDEXOF_TOOLTIP); - } -}; - -Blockly.Blocks['text_charAt'] = { - /** - * Block for getting a character from the string. - * @this Blockly.Block - */ - init: function() { - this.WHERE_OPTIONS = - [[Blockly.Msg.TEXT_CHARAT_FROM_START, 'FROM_START'], - [Blockly.Msg.TEXT_CHARAT_FROM_END, 'FROM_END'], - [Blockly.Msg.TEXT_CHARAT_FIRST, 'FIRST'], - [Blockly.Msg.TEXT_CHARAT_LAST, 'LAST'], - [Blockly.Msg.TEXT_CHARAT_RANDOM, 'RANDOM']]; - this.setHelpUrl(Blockly.Msg.TEXT_CHARAT_HELPURL); - this.setColour(Blockly.Blocks.texts.HUE); - this.setOutput(true, 'String'); - this.appendValueInput('VALUE') - .setCheck('String') - .appendField(Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT); - this.appendDummyInput('AT'); - this.setInputsInline(true); - this.updateAt_(true); - this.setTooltip(Blockly.Msg.TEXT_CHARAT_TOOLTIP); - }, - /** - * Create XML to represent whether there is an 'AT' input. - * @return {!Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - var container = document.createElement('mutation'); - var isAt = this.getInput('AT').type == Blockly.INPUT_VALUE; - container.setAttribute('at', isAt); - return container; - }, - /** - * Parse XML to restore the 'AT' input. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - // Note: Until January 2013 this block did not have mutations, - // so 'at' defaults to true. - var isAt = (xmlElement.getAttribute('at') != 'false'); - this.updateAt_(isAt); - }, - /** - * Create or delete an input for the numeric index. - * @param {boolean} isAt True if the input should exist. - * @private - * @this Blockly.Block - */ - updateAt_: function(isAt) { - // Destroy old 'AT' and 'ORDINAL' inputs. - this.removeInput('AT'); - this.removeInput('ORDINAL', true); - // Create either a value 'AT' input or a dummy input. - if (isAt) { - this.appendValueInput('AT').setCheck('Number'); - if (Blockly.Msg.ORDINAL_NUMBER_SUFFIX) { - this.appendDummyInput('ORDINAL') - .appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX); - } - } else { - this.appendDummyInput('AT'); - } - if (Blockly.Msg.TEXT_CHARAT_TAIL) { - this.removeInput('TAIL', true); - this.appendDummyInput('TAIL') - .appendField(Blockly.Msg.TEXT_CHARAT_TAIL); - } - var menu = new Blockly.FieldDropdown(this.WHERE_OPTIONS, function(value) { - var newAt = (value == 'FROM_START') || (value == 'FROM_END'); - // The 'isAt' variable is available due to this function being a closure. - if (newAt != isAt) { - var block = this.sourceBlock_; - block.updateAt_(newAt); - // This menu has been destroyed and replaced. Update the replacement. - block.setFieldValue(value, 'WHERE'); - return null; - } - return undefined; - }); - this.getInput('AT').appendField(menu, 'WHERE'); - } -}; - -Blockly.Blocks['text_getSubstring'] = { - /** - * Block for getting substring. - * @this Blockly.Block - */ - init: function() { - this['WHERE_OPTIONS_1'] = - [[Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START, 'FROM_START'], - [Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END, 'FROM_END'], - [Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST, 'FIRST']]; - this['WHERE_OPTIONS_2'] = - [[Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START, 'FROM_START'], - [Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END, 'FROM_END'], - [Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST, 'LAST']]; - this.setHelpUrl(Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL); - this.setColour(Blockly.Blocks.texts.HUE); - this.appendValueInput('STRING') - .setCheck('String') - .appendField(Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT); - this.appendDummyInput('AT1'); - this.appendDummyInput('AT2'); - if (Blockly.Msg.TEXT_GET_SUBSTRING_TAIL) { - this.appendDummyInput('TAIL') - .appendField(Blockly.Msg.TEXT_GET_SUBSTRING_TAIL); - } - this.setInputsInline(true); - this.setOutput(true, 'String'); - this.updateAt_(1, true); - this.updateAt_(2, true); - this.setTooltip(Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP); - }, - /** - * Create XML to represent whether there are 'AT' inputs. - * @return {!Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - var container = document.createElement('mutation'); - var isAt1 = this.getInput('AT1').type == Blockly.INPUT_VALUE; - container.setAttribute('at1', isAt1); - var isAt2 = this.getInput('AT2').type == Blockly.INPUT_VALUE; - container.setAttribute('at2', isAt2); - return container; - }, - /** - * Parse XML to restore the 'AT' inputs. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - var isAt1 = (xmlElement.getAttribute('at1') == 'true'); - var isAt2 = (xmlElement.getAttribute('at2') == 'true'); - this.updateAt_(1, isAt1); - this.updateAt_(2, isAt2); - }, - /** - * Create or delete an input for a numeric index. - * This block has two such inputs, independant of each other. - * @param {number} n Specify first or second input (1 or 2). - * @param {boolean} isAt True if the input should exist. - * @private - * @this Blockly.Block - */ - updateAt_: function(n, isAt) { - // Create or delete an input for the numeric index. - // Destroy old 'AT' and 'ORDINAL' inputs. - this.removeInput('AT' + n); - this.removeInput('ORDINAL' + n, true); - // Create either a value 'AT' input or a dummy input. - if (isAt) { - this.appendValueInput('AT' + n).setCheck('Number'); - if (Blockly.Msg.ORDINAL_NUMBER_SUFFIX) { - this.appendDummyInput('ORDINAL' + n) - .appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX); - } - } else { - this.appendDummyInput('AT' + n); - } - // Move tail, if present, to end of block. - if (n == 2 && Blockly.Msg.TEXT_GET_SUBSTRING_TAIL) { - this.removeInput('TAIL', true); - this.appendDummyInput('TAIL') - .appendField(Blockly.Msg.TEXT_GET_SUBSTRING_TAIL); - } - var menu = new Blockly.FieldDropdown(this['WHERE_OPTIONS_' + n], - function(value) { - var newAt = (value == 'FROM_START') || (value == 'FROM_END'); - // The 'isAt' variable is available due to this function being a closure. - if (newAt != isAt) { - var block = this.sourceBlock_; - block.updateAt_(n, newAt); - // This menu has been destroyed and replaced. Update the replacement. - block.setFieldValue(value, 'WHERE' + n); - return null; - } - return undefined; - }); - this.getInput('AT' + n) - .appendField(menu, 'WHERE' + n); - if (n == 1) { - this.moveInputBefore('AT1', 'AT2'); - } - } -}; - -Blockly.Blocks['text_changeCase'] = { - /** - * Block for changing capitalization. - * @this Blockly.Block - */ - init: function() { - var OPERATORS = - [[Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE, 'UPPERCASE'], - [Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE, 'LOWERCASE'], - [Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE, 'TITLECASE']]; - this.setHelpUrl(Blockly.Msg.TEXT_CHANGECASE_HELPURL); - this.setColour(Blockly.Blocks.texts.HUE); - this.appendValueInput('TEXT') - .setCheck('String') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'CASE'); - this.setOutput(true, 'String'); - this.setTooltip(Blockly.Msg.TEXT_CHANGECASE_TOOLTIP); - } -}; - -Blockly.Blocks['text_trim'] = { - /** - * Block for trimming spaces. - * @this Blockly.Block - */ - init: function() { - var OPERATORS = - [[Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH, 'BOTH'], - [Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT, 'LEFT'], - [Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT, 'RIGHT']]; - this.setHelpUrl(Blockly.Msg.TEXT_TRIM_HELPURL); - this.setColour(Blockly.Blocks.texts.HUE); - this.appendValueInput('TEXT') - .setCheck('String') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'MODE'); - this.setOutput(true, 'String'); - this.setTooltip(Blockly.Msg.TEXT_TRIM_TOOLTIP); - } -}; - -Blockly.Blocks['text_print'] = { - /** - * Block for print statement. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.TEXT_PRINT_TITLE, - "args0": [ - { - "type": "input_value", - "name": "TEXT" - } - ], - "previousStatement": null, - "nextStatement": null, - "colour": Blockly.Blocks.texts.HUE, - "tooltip": Blockly.Msg.TEXT_PRINT_TOOLTIP, - "helpUrl": Blockly.Msg.TEXT_PRINT_HELPURL - }); - } -}; - -Blockly.Blocks['text_prompt_ext'] = { - /** - * Block for prompt function (external message). - * @this Blockly.Block - */ - init: function() { - var TYPES = - [[Blockly.Msg.TEXT_PROMPT_TYPE_TEXT, 'TEXT'], - [Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER, 'NUMBER']]; - this.setHelpUrl(Blockly.Msg.TEXT_PROMPT_HELPURL); - this.setColour(Blockly.Blocks.texts.HUE); - // Assign 'this' to a variable for use in the closures below. - var thisBlock = this; - var dropdown = new Blockly.FieldDropdown(TYPES, function(newOp) { - thisBlock.updateType_(newOp); - }); - this.appendValueInput('TEXT') - .appendField(dropdown, 'TYPE'); - this.setOutput(true, 'String'); - this.setTooltip(function() { - return (thisBlock.getFieldValue('TYPE') == 'TEXT') ? - Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT : - Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER; - }); - }, - /** - * Modify this block to have the correct output type. - * @param {string} newOp Either 'TEXT' or 'NUMBER'. - * @private - * @this Blockly.Block - */ - updateType_: function(newOp) { - if (newOp == 'NUMBER') { - this.outputConnection.setCheck('Number'); - } else { - this.outputConnection.setCheck('String'); - } - }, - /** - * Create XML to represent the output type. - * @return {!Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - var container = document.createElement('mutation'); - container.setAttribute('type', this.getFieldValue('TYPE')); - return container; - }, - /** - * Parse XML to restore the output type. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - this.updateType_(xmlElement.getAttribute('type')); - } -}; - -Blockly.Blocks['text_prompt'] = { - /** - * Block for prompt function (internal message). - * The 'text_prompt_ext' block is preferred as it is more flexible. - * @this Blockly.Block - */ - init: function() { - var TYPES = - [[Blockly.Msg.TEXT_PROMPT_TYPE_TEXT, 'TEXT'], - [Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER, 'NUMBER']]; - // Assign 'this' to a variable for use in the closure below. - var thisBlock = this; - this.setHelpUrl(Blockly.Msg.TEXT_PROMPT_HELPURL); - this.setColour(Blockly.Blocks.texts.HUE); - var dropdown = new Blockly.FieldDropdown(TYPES, function(newOp) { - thisBlock.updateType_(newOp); - }); - this.appendDummyInput() - .appendField(dropdown, 'TYPE') - .appendField(this.newQuote_(true)) - .appendField(new Blockly.FieldTextInput(''), 'TEXT') - .appendField(this.newQuote_(false)); - this.setOutput(true, 'String'); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function() { - return (thisBlock.getFieldValue('TYPE') == 'TEXT') ? - Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT : - Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER; - }); - }, - newQuote_: Blockly.Blocks['text'].newQuote_, - updateType_: Blockly.Blocks['text_prompt_ext'].updateType_, - mutationToDom: Blockly.Blocks['text_prompt_ext'].mutationToDom, - domToMutation: Blockly.Blocks['text_prompt_ext'].domToMutation -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/blocks/variables.js b/src/opsoro/apps/visual_programming/static/blockly/blocks/variables.js deleted file mode 100644 index 5aab716..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/blocks/variables.js +++ /dev/null @@ -1,140 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Variable blocks for Blockly. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Blocks.variables'); - -goog.require('Blockly.Blocks'); - - -/** - * Common HSV hue for all blocks in this category. - */ -Blockly.Blocks.variables.HUE = 330; - -Blockly.Blocks['variables_get'] = { - /** - * Block for variable getter. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.VARIABLES_GET_HELPURL); - this.setColour(Blockly.Blocks.variables.HUE); - this.appendDummyInput() - .appendField(new Blockly.FieldVariable( - Blockly.Msg.VARIABLES_DEFAULT_NAME), 'VAR'); - this.setOutput(true); - this.setTooltip(Blockly.Msg.VARIABLES_GET_TOOLTIP); - this.contextMenuMsg_ = Blockly.Msg.VARIABLES_GET_CREATE_SET; - }, - /** - * Return all variables referenced by this block. - * @return {!Array.} List of variable names. - * @this Blockly.Block - */ - getVars: function() { - return [this.getFieldValue('VAR')]; - }, - /** - * Notification that a variable is renaming. - * If the name matches one of this block's variables, rename it. - * @param {string} oldName Previous name of variable. - * @param {string} newName Renamed variable. - * @this Blockly.Block - */ - renameVar: function(oldName, newName) { - if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { - this.setFieldValue(newName, 'VAR'); - } - }, - contextMenuType_: 'variables_set', - /** - * Add menu option to create getter/setter block for this setter/getter. - * @param {!Array} options List of menu options to add to. - * @this Blockly.Block - */ - customContextMenu: function(options) { - var option = {enabled: true}; - var name = this.getFieldValue('VAR'); - option.text = this.contextMenuMsg_.replace('%1', name); - var xmlField = goog.dom.createDom('field', null, name); - xmlField.setAttribute('name', 'VAR'); - var xmlBlock = goog.dom.createDom('block', null, xmlField); - xmlBlock.setAttribute('type', this.contextMenuType_); - option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); - options.push(option); - } -}; - -Blockly.Blocks['variables_set'] = { - /** - * Block for variable setter. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.VARIABLES_SET, - "args0": [ - { - "type": "field_variable", - "name": "VAR", - "variable": Blockly.Msg.VARIABLES_DEFAULT_NAME - }, - { - "type": "input_value", - "name": "VALUE" - } - ], - "previousStatement": null, - "nextStatement": null, - "colour": Blockly.Blocks.variables.HUE, - "tooltip": Blockly.Msg.VARIABLES_SET_TOOLTIP, - "helpUrl": Blockly.Msg.VARIABLES_SET_HELPURL - }); - this.contextMenuMsg_ = Blockly.Msg.VARIABLES_SET_CREATE_GET; - }, - /** - * Return all variables referenced by this block. - * @return {!Array.} List of variable names. - * @this Blockly.Block - */ - getVars: function() { - return [this.getFieldValue('VAR')]; - }, - /** - * Notification that a variable is renaming. - * If the name matches one of this block's variables, rename it. - * @param {string} oldName Previous name of variable. - * @param {string} newName Renamed variable. - * @this Blockly.Block - */ - renameVar: function(oldName, newName) { - if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { - this.setFieldValue(newName, 'VAR'); - } - }, - contextMenuType_: 'variables_get', - customContextMenu: Blockly.Blocks['variables_get'].customContextMenu -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/blocks_compressed.js b/src/opsoro/apps/visual_programming/static/blockly/blocks_compressed.js deleted file mode 100644 index f34cbec..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/blocks_compressed.js +++ /dev/null @@ -1,141 +0,0 @@ -// Do not edit this file; automatically generated by build.py. -'use strict'; - - -// Copyright 2012 Google Inc. Apache License 2.0 -Blockly.Blocks.colour={};Blockly.Blocks.colour.HUE=20;Blockly.Blocks.colour_picker={init:function(){this.jsonInit({message0:"%1",args0:[{type:"field_colour",name:"COLOUR",colour:"#ff0000"}],output:"Colour",colour:Blockly.Blocks.colour.HUE,tooltip:Blockly.Msg.COLOUR_PICKER_TOOLTIP,helpUrl:Blockly.Msg.COLOUR_PICKER_HELPURL})}}; -Blockly.Blocks.colour_random={init:function(){this.jsonInit({message0:Blockly.Msg.COLOUR_RANDOM_TITLE,output:"Colour",colour:Blockly.Blocks.colour.HUE,tooltip:Blockly.Msg.COLOUR_RANDOM_TOOLTIP,helpUrl:Blockly.Msg.COLOUR_RANDOM_HELPURL})}}; -Blockly.Blocks.colour_rgb={init:function(){this.setHelpUrl(Blockly.Msg.COLOUR_RGB_HELPURL);this.setColour(Blockly.Blocks.colour.HUE);this.appendValueInput("RED").setCheck("Number").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.COLOUR_RGB_TITLE).appendField(Blockly.Msg.COLOUR_RGB_RED);this.appendValueInput("GREEN").setCheck("Number").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.COLOUR_RGB_GREEN);this.appendValueInput("BLUE").setCheck("Number").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.COLOUR_RGB_BLUE); -this.setOutput(!0,"Colour");this.setTooltip(Blockly.Msg.COLOUR_RGB_TOOLTIP)}}; -Blockly.Blocks.colour_blend={init:function(){this.setHelpUrl(Blockly.Msg.COLOUR_BLEND_HELPURL);this.setColour(Blockly.Blocks.colour.HUE);this.appendValueInput("COLOUR1").setCheck("Colour").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.COLOUR_BLEND_TITLE).appendField(Blockly.Msg.COLOUR_BLEND_COLOUR1);this.appendValueInput("COLOUR2").setCheck("Colour").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.COLOUR_BLEND_COLOUR2);this.appendValueInput("RATIO").setCheck("Number").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.COLOUR_BLEND_RATIO); -this.setOutput(!0,"Colour");this.setTooltip(Blockly.Msg.COLOUR_BLEND_TOOLTIP)}};Blockly.Blocks.lists={};Blockly.Blocks.lists.HUE=260;Blockly.Blocks.lists_create_empty={init:function(){this.jsonInit({message0:Blockly.Msg.LISTS_CREATE_EMPTY_TITLE,output:"Array",colour:Blockly.Blocks.lists.HUE,tooltip:Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP,helpUrl:Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL})}}; -Blockly.Blocks.lists_create_with={init:function(){this.setHelpUrl(Blockly.Msg.LISTS_CREATE_WITH_HELPURL);this.setColour(Blockly.Blocks.lists.HUE);this.itemCount_=3;this.updateShape_();this.setOutput(!0,"Array");this.setMutator(new Blockly.Mutator(["lists_create_with_item"]));this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP)},mutationToDom:function(){var a=document.createElement("mutation");a.setAttribute("items",this.itemCount_);return a},domToMutation:function(a){this.itemCount_=parseInt(a.getAttribute("items"), -10);this.updateShape_()},decompose:function(a){var b=Blockly.Block.obtain(a,"lists_create_with_container");b.initSvg();for(var c=b.getInput("STACK").connection,d=0;d","LT"],["\u2265","LTE"],["<","GT"],["\u2264","GTE"]]:[["=","EQ"],["\u2260","NEQ"],["<","LT"],["\u2264","LTE"],[">","GT"],["\u2265","GTE"]];this.setHelpUrl(Blockly.Msg.LOGIC_COMPARE_HELPURL);this.setColour(Blockly.Blocks.logic.HUE);this.setOutput(!0,"Boolean");this.appendValueInput("A");this.appendValueInput("B").appendField(new Blockly.FieldDropdown(a),"OP");this.setInputsInline(!0);var b=this;this.setTooltip(function(){var a= -b.getFieldValue("OP");return{EQ:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ,NEQ:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ,LT:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT,LTE:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE,GT:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT,GTE:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE}[a]});this.prevBlocks_=[null,null]},onchange:function(){var a=this.getInputTargetBlock("A"),b=this.getInputTargetBlock("B");if(a&&b&&!a.outputConnection.checkType_(b.outputConnection))for(var c=0;cd;d++){var e=1==d?a:b;e&&!e.outputConnection.checkType_(c)&&(c===this.prevParentConnection_?(this.setParent(null),c.sourceBlock_.bumpNeighbours_()):(e.setParent(null),e.bumpNeighbours_()))}this.prevParentConnection_=c}};Blockly.Blocks.loops={};Blockly.Blocks.loops.HUE=120;Blockly.Blocks.controls_repeat_ext={init:function(){this.jsonInit({message0:Blockly.Msg.CONTROLS_REPEAT_TITLE,args0:[{type:"input_value",name:"TIMES",check:"Number"}],previousStatement:null,nextStatement:null,colour:Blockly.Blocks.loops.HUE,tooltip:Blockly.Msg.CONTROLS_REPEAT_TOOLTIP,helpUrl:Blockly.Msg.CONTROLS_REPEAT_HELPURL});this.appendStatementInput("DO").appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO)}}; -Blockly.Blocks.controls_repeat={init:function(){this.jsonInit({message0:Blockly.Msg.CONTROLS_REPEAT_TITLE,args0:[{type:"field_input",name:"TIMES",text:"10"}],previousStatement:null,nextStatement:null,colour:Blockly.Blocks.loops.HUE,tooltip:Blockly.Msg.CONTROLS_REPEAT_TOOLTIP,helpUrl:Blockly.Msg.CONTROLS_REPEAT_HELPURL});this.appendStatementInput("DO").appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO);this.getField("TIMES").setChangeHandler(Blockly.FieldTextInput.nonnegativeIntegerValidator)}}; -Blockly.Blocks.controls_whileUntil={init:function(){var a=[[Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE,"WHILE"],[Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL,"UNTIL"]];this.setHelpUrl(Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL);this.setColour(Blockly.Blocks.loops.HUE);this.appendValueInput("BOOL").setCheck("Boolean").appendField(new Blockly.FieldDropdown(a),"MODE");this.appendStatementInput("DO").appendField(Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO);this.setPreviousStatement(!0);this.setNextStatement(!0); -var b=this;this.setTooltip(function(){var a=b.getFieldValue("MODE");return{WHILE:Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE,UNTIL:Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL}[a]})}}; -Blockly.Blocks.controls_for={init:function(){this.jsonInit({message0:Blockly.Msg.CONTROLS_FOR_TITLE,args0:[{type:"field_variable",name:"VAR",variable:null},{type:"input_value",name:"FROM",check:"Number",align:"RIGHT"},{type:"input_value",name:"TO",check:"Number",align:"RIGHT"},{type:"input_value",name:"BY",check:"Number",align:"RIGHT"}],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Blocks.loops.HUE,helpUrl:Blockly.Msg.CONTROLS_FOR_HELPURL});this.appendStatementInput("DO").appendField(Blockly.Msg.CONTROLS_FOR_INPUT_DO); -var a=this;this.setTooltip(function(){return Blockly.Msg.CONTROLS_FOR_TOOLTIP.replace("%1",a.getFieldValue("VAR"))})},getVars:function(){return[this.getFieldValue("VAR")]},renameVar:function(a,b){Blockly.Names.equals(a,this.getFieldValue("VAR"))&&this.setFieldValue(b,"VAR")},customContextMenu:function(a){if(!this.isCollapsed()){var b={enabled:!0},c=this.getFieldValue("VAR");b.text=Blockly.Msg.VARIABLES_SET_CREATE_GET.replace("%1",c);c=goog.dom.createDom("field",null,c);c.setAttribute("name","VAR"); -c=goog.dom.createDom("block",null,c);c.setAttribute("type","variables_get");b.callback=Blockly.ContextMenu.callbackFactory(this,c);a.push(b)}}}; -Blockly.Blocks.controls_forEach={init:function(){this.jsonInit({message0:Blockly.Msg.CONTROLS_FOREACH_TITLE,args0:[{type:"field_variable",name:"VAR",variable:null},{type:"input_value",name:"LIST",check:"Array"}],previousStatement:null,nextStatement:null,colour:Blockly.Blocks.loops.HUE,helpUrl:Blockly.Msg.CONTROLS_FOREACH_HELPURL});this.appendStatementInput("DO").appendField(Blockly.Msg.CONTROLS_FOREACH_INPUT_DO);var a=this;this.setTooltip(function(){return Blockly.Msg.CONTROLS_FOREACH_TOOLTIP.replace("%1", -a.getFieldValue("VAR"))})},getVars:function(){return[this.getFieldValue("VAR")]},renameVar:function(a,b){Blockly.Names.equals(a,this.getFieldValue("VAR"))&&this.setFieldValue(b,"VAR")},customContextMenu:Blockly.Blocks.controls_for.customContextMenu}; -Blockly.Blocks.controls_flow_statements={init:function(){var a=[[Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK,"BREAK"],[Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE,"CONTINUE"]];this.setHelpUrl(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL);this.setColour(Blockly.Blocks.loops.HUE);this.appendDummyInput().appendField(new Blockly.FieldDropdown(a),"FLOW");this.setPreviousStatement(!0);var b=this;this.setTooltip(function(){var a=b.getFieldValue("FLOW");return{BREAK:Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK, -CONTINUE:Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE}[a]})},onchange:function(){var a=!1,b=this;do{if("controls_repeat"==b.type||"controls_repeat_ext"==b.type||"controls_forEach"==b.type||"controls_for"==b.type||"controls_whileUntil"==b.type){a=!0;break}b=b.getSurroundParent()}while(b);a?this.setWarningText(null):this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING)}};Blockly.Blocks.math={};Blockly.Blocks.math.HUE=230;Blockly.Blocks.math_number={init:function(){this.setHelpUrl(Blockly.Msg.MATH_NUMBER_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.appendDummyInput().appendField(new Blockly.FieldTextInput("0",Blockly.FieldTextInput.numberValidator),"NUM");this.setOutput(!0,"Number");this.setTooltip(Blockly.Msg.MATH_NUMBER_TOOLTIP)}}; -Blockly.Blocks.math_arithmetic={init:function(){var a=[[Blockly.Msg.MATH_ADDITION_SYMBOL,"ADD"],[Blockly.Msg.MATH_SUBTRACTION_SYMBOL,"MINUS"],[Blockly.Msg.MATH_MULTIPLICATION_SYMBOL,"MULTIPLY"],[Blockly.Msg.MATH_DIVISION_SYMBOL,"DIVIDE"],[Blockly.Msg.MATH_POWER_SYMBOL,"POWER"]];this.setHelpUrl(Blockly.Msg.MATH_ARITHMETIC_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.setOutput(!0,"Number");this.appendValueInput("A").setCheck("Number");this.appendValueInput("B").setCheck("Number").appendField(new Blockly.FieldDropdown(a), -"OP");this.setInputsInline(!0);var b=this;this.setTooltip(function(){var a=b.getFieldValue("OP");return{ADD:Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD,MINUS:Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS,MULTIPLY:Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY,DIVIDE:Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,POWER:Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER}[a]})}}; -Blockly.Blocks.math_single={init:function(){var a=[[Blockly.Msg.MATH_SINGLE_OP_ROOT,"ROOT"],[Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE,"ABS"],["-","NEG"],["ln","LN"],["log10","LOG10"],["e^","EXP"],["10^","POW10"]];this.setHelpUrl(Blockly.Msg.MATH_SINGLE_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.setOutput(!0,"Number");this.appendValueInput("NUM").setCheck("Number").appendField(new Blockly.FieldDropdown(a),"OP");var b=this;this.setTooltip(function(){var a=b.getFieldValue("OP");return{ROOT:Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT, -ABS:Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS,NEG:Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG,LN:Blockly.Msg.MATH_SINGLE_TOOLTIP_LN,LOG10:Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10,EXP:Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP,POW10:Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10}[a]})}}; -Blockly.Blocks.math_trig={init:function(){var a=[[Blockly.Msg.MATH_TRIG_SIN,"SIN"],[Blockly.Msg.MATH_TRIG_COS,"COS"],[Blockly.Msg.MATH_TRIG_TAN,"TAN"],[Blockly.Msg.MATH_TRIG_ASIN,"ASIN"],[Blockly.Msg.MATH_TRIG_ACOS,"ACOS"],[Blockly.Msg.MATH_TRIG_ATAN,"ATAN"]];this.setHelpUrl(Blockly.Msg.MATH_TRIG_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.setOutput(!0,"Number");this.appendValueInput("NUM").setCheck("Number").appendField(new Blockly.FieldDropdown(a),"OP");var b=this;this.setTooltip(function(){var a= -b.getFieldValue("OP");return{SIN:Blockly.Msg.MATH_TRIG_TOOLTIP_SIN,COS:Blockly.Msg.MATH_TRIG_TOOLTIP_COS,TAN:Blockly.Msg.MATH_TRIG_TOOLTIP_TAN,ASIN:Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN,ACOS:Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS,ATAN:Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN}[a]})}}; -Blockly.Blocks.math_constant={init:function(){this.setHelpUrl(Blockly.Msg.MATH_CONSTANT_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.setOutput(!0,"Number");this.appendDummyInput().appendField(new Blockly.FieldDropdown([["\u03c0","PI"],["e","E"],["\u03c6","GOLDEN_RATIO"],["sqrt(2)","SQRT2"],["sqrt(\u00bd)","SQRT1_2"],["\u221e","INFINITY"]]),"CONSTANT");this.setTooltip(Blockly.Msg.MATH_CONSTANT_TOOLTIP)}}; -Blockly.Blocks.math_number_property={init:function(){var a=[[Blockly.Msg.MATH_IS_EVEN,"EVEN"],[Blockly.Msg.MATH_IS_ODD,"ODD"],[Blockly.Msg.MATH_IS_PRIME,"PRIME"],[Blockly.Msg.MATH_IS_WHOLE,"WHOLE"],[Blockly.Msg.MATH_IS_POSITIVE,"POSITIVE"],[Blockly.Msg.MATH_IS_NEGATIVE,"NEGATIVE"],[Blockly.Msg.MATH_IS_DIVISIBLE_BY,"DIVISIBLE_BY"]];this.setColour(Blockly.Blocks.math.HUE);this.appendValueInput("NUMBER_TO_CHECK").setCheck("Number");a=new Blockly.FieldDropdown(a,function(a){this.sourceBlock_.updateShape_("DIVISIBLE_BY"== -a)});this.appendDummyInput().appendField(a,"PROPERTY");this.setInputsInline(!0);this.setOutput(!0,"Boolean");this.setTooltip(Blockly.Msg.MATH_IS_TOOLTIP)},mutationToDom:function(){var a=document.createElement("mutation"),b="DIVISIBLE_BY"==this.getFieldValue("PROPERTY");a.setAttribute("divisor_input",b);return a},domToMutation:function(a){a="true"==a.getAttribute("divisor_input");this.updateShape_(a)},updateShape_:function(a){var b=this.getInput("DIVISOR");a?b||this.appendValueInput("DIVISOR").setCheck("Number"): -b&&this.removeInput("DIVISOR")}}; -Blockly.Blocks.math_change={init:function(){this.jsonInit({message0:Blockly.Msg.MATH_CHANGE_TITLE,args0:[{type:"field_variable",name:"VAR",variable:Blockly.Msg.MATH_CHANGE_TITLE_ITEM},{type:"input_value",name:"DELTA",check:"Number"}],previousStatement:null,nextStatement:null,colour:Blockly.Blocks.math.HUE,helpUrl:Blockly.Msg.MATH_CHANGE_HELPURL});var a=this;this.setTooltip(function(){return Blockly.Msg.MATH_CHANGE_TOOLTIP.replace("%1",a.getFieldValue("VAR"))})},getVars:function(){return[this.getFieldValue("VAR")]},renameVar:function(a, -b){Blockly.Names.equals(a,this.getFieldValue("VAR"))&&this.setFieldValue(b,"VAR")}}; -Blockly.Blocks.math_round={init:function(){var a=[[Blockly.Msg.MATH_ROUND_OPERATOR_ROUND,"ROUND"],[Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP,"ROUNDUP"],[Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN,"ROUNDDOWN"]];this.setHelpUrl(Blockly.Msg.MATH_ROUND_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.setOutput(!0,"Number");this.appendValueInput("NUM").setCheck("Number").appendField(new Blockly.FieldDropdown(a),"OP");this.setTooltip(Blockly.Msg.MATH_ROUND_TOOLTIP)}}; -Blockly.Blocks.math_on_list={init:function(){var a=[[Blockly.Msg.MATH_ONLIST_OPERATOR_SUM,"SUM"],[Blockly.Msg.MATH_ONLIST_OPERATOR_MIN,"MIN"],[Blockly.Msg.MATH_ONLIST_OPERATOR_MAX,"MAX"],[Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE,"AVERAGE"],[Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN,"MEDIAN"],[Blockly.Msg.MATH_ONLIST_OPERATOR_MODE,"MODE"],[Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV,"STD_DEV"],[Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM,"RANDOM"]],b=this;this.setHelpUrl(Blockly.Msg.MATH_ONLIST_HELPURL);this.setColour(Blockly.Blocks.math.HUE); -this.setOutput(!0,"Number");a=new Blockly.FieldDropdown(a,function(a){b.updateType_(a)});this.appendValueInput("LIST").setCheck("Array").appendField(a,"OP");this.setTooltip(function(){var a=b.getFieldValue("OP");return{SUM:Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM,MIN:Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN,MAX:Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX,AVERAGE:Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE,MEDIAN:Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN,MODE:Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE,STD_DEV:Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV, -RANDOM:Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM}[a]})},updateType_:function(a){"MODE"==a?this.outputConnection.setCheck("Array"):this.outputConnection.setCheck("Number")},mutationToDom:function(){var a=document.createElement("mutation");a.setAttribute("op",this.getFieldValue("OP"));return a},domToMutation:function(a){this.updateType_(a.getAttribute("op"))}}; -Blockly.Blocks.math_modulo={init:function(){this.jsonInit({message0:Blockly.Msg.MATH_MODULO_TITLE,args0:[{type:"input_value",name:"DIVIDEND",check:"Number"},{type:"input_value",name:"DIVISOR",check:"Number"}],inputsInline:!0,output:"Number",colour:Blockly.Blocks.math.HUE,tooltip:Blockly.Msg.MATH_MODULO_TOOLTIP,helpUrl:Blockly.Msg.MATH_MODULO_HELPURL})}}; -Blockly.Blocks.math_constrain={init:function(){this.jsonInit({message0:Blockly.Msg.MATH_CONSTRAIN_TITLE,args0:[{type:"input_value",name:"VALUE",check:"Number"},{type:"input_value",name:"LOW",check:"Number"},{type:"input_value",name:"HIGH",check:"Number"}],inputsInline:!0,output:"Number",colour:Blockly.Blocks.math.HUE,tooltip:Blockly.Msg.MATH_CONSTRAIN_TOOLTIP,helpUrl:Blockly.Msg.MATH_CONSTRAIN_HELPURL})}}; -Blockly.Blocks.math_random_int={init:function(){this.jsonInit({message0:Blockly.Msg.MATH_RANDOM_INT_TITLE,args0:[{type:"input_value",name:"FROM",check:"Number"},{type:"input_value",name:"TO",check:"Number"}],inputsInline:!0,output:"Number",colour:Blockly.Blocks.math.HUE,tooltip:Blockly.Msg.MATH_RANDOM_INT_TOOLTIP,helpUrl:Blockly.Msg.MATH_RANDOM_INT_HELPURL})}}; -Blockly.Blocks.math_random_float={init:function(){this.setHelpUrl(Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.setOutput(!0,"Number");this.appendDummyInput().appendField(Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM);this.setTooltip(Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP)}};Blockly.Blocks.procedures={};Blockly.Blocks.procedures.HUE=290; -Blockly.Blocks.procedures_defnoreturn={init:function(){this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL);this.setColour(Blockly.Blocks.procedures.HUE);var a=new Blockly.FieldTextInput(Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE,Blockly.Procedures.rename);a.setSpellcheck(!1);this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE).appendField(a,"NAME").appendField("","PARAMS");this.setMutator(new Blockly.Mutator(["procedures_mutatorarg"]));this.setTooltip(Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP); -this.arguments_=[];this.setStatements_(!0);this.statementConnection_=null},validate:function(){var a=Blockly.Procedures.findLegalName(this.getFieldValue("NAME"),this);this.setFieldValue(a,"NAME")},setStatements_:function(a){this.hasStatements_!==a&&(a?(this.appendStatementInput("STACK").appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_DO),this.getInput("RETURN")&&this.moveInputBefore("STACK","RETURN")):this.removeInput("STACK",!0),this.hasStatements_=a)},updateParams_:function(){for(var a=!1,b={},c= -0;c.js for every language defined in msg/js/.json. - -import sys -if sys.version_info[0] != 2: - raise Exception("Blockly build only compatible with Python 2.x.\n" - "You are using: " + sys.version) - -import errno, glob, httplib, json, os, re, subprocess, threading, urllib - - -def import_path(fullpath): - """Import a file with full path specification. - Allows one to import from any directory, something __import__ does not do. - - Args: - fullpath: Path and filename of import. - - Returns: - An imported module. - """ - path, filename = os.path.split(fullpath) - filename, ext = os.path.splitext(filename) - sys.path.append(path) - module = __import__(filename) - reload(module) # Might be out of date. - del sys.path[-1] - return module - - -HEADER = ("// Do not edit this file; automatically generated by build.py.\n" - "'use strict';\n") - - -class Gen_uncompressed(threading.Thread): - """Generate a JavaScript file that loads Blockly's raw files. - Runs in a separate thread. - """ - def __init__(self, search_paths): - threading.Thread.__init__(self) - self.search_paths = search_paths - - def run(self): - target_filename = "blockly_uncompressed.js" - add_dependency = [] - base_path = calcdeps.FindClosureBasePath(self.search_paths) - deps = calcdeps.BuildDependenciesFromFiles(self.search_paths) - filenames = calcdeps.CalculateDependencies(self.search_paths, - [os.path.join("core", "blockly.js")]) - - for dep in deps: - if dep.filename in filenames: - add_dependency.append(calcdeps.GetDepsLine(dep, base_path)) - add_dependency = "\n".join(add_dependency) - # Find the Blockly directory name and replace it with a JS variable. - # This allows blockly_uncompressed.js to be compiled on one computer and be - # used on another, even if the directory name differs. - m = re.search("[\\/]([^\\/]+)[\\/]core[\\/]blockly.js", add_dependency) - add_dependency = re.sub("([\\/])" + re.escape(m.group(1)) + - "([\\/]core[\\/])", '\\1" + dir + "\\2', add_dependency) - - provides = [] - for dep in deps: - if dep.filename in filenames: - if not dep.filename.startswith(os.pardir + os.sep): # "../" - provides.extend(dep.provides) - provides.sort() - - f = open(target_filename, "w") - f.write(HEADER) - f.write(""" -// 'this' is 'window' in a browser, or 'global' in node.js. -this.BLOCKLY_DIR = (function() { - // Find name of current directory. - var scripts = document.getElementsByTagName('script'); - var re = new RegExp('(.+)[\/]blockly_uncompressed\.js$'); - for (var x = 0, script; script = scripts[x]; x++) { - var match = re.exec(script.src); - if (match) { - return match[1]; - } - } - alert('Could not detect Blockly\\'s directory name.'); - return ''; -})(); - -this.BLOCKLY_BOOT = function() { -// Execute after Closure has loaded. -if (!this.goog) { - alert('Error: Closure not found. Read this:\\n' + - 'developers.google.com/blockly/hacking/closure'); -} - -// Build map of all dependencies (used and unused). -var dir = this.BLOCKLY_DIR.match(/[^\\/]+$/)[0]; -""") - f.write(add_dependency + "\n") - f.write("\n") - f.write("// Load Blockly.\n") - for provide in provides: - f.write("goog.require('%s');\n" % provide) - - f.write(""" -delete this.BLOCKLY_DIR; -delete this.BLOCKLY_BOOT; -}; - -if (typeof DOMParser == 'undefined' && typeof require == 'function') { - // Node.js needs DOMParser loaded separately. - var DOMParser = require('xmldom').DOMParser; -} - -// Delete any existing Closure (e.g. Soy's nogoog_shim). -document.write(''); -// Load fresh Closure Library. -document.write(''); -document.write(''); -""") - f.close() - print("SUCCESS: " + target_filename) - - -class Gen_compressed(threading.Thread): - """Generate a JavaScript file that contains all of Blockly's core and all - required parts of Closure, compiled together. - Uses the Closure Compiler's online API. - Runs in a separate thread. - """ - def __init__(self, search_paths): - threading.Thread.__init__(self) - self.search_paths = search_paths - - def run(self): - self.gen_core() - self.gen_blocks() - self.gen_generator("javascript") - self.gen_generator("python") - self.gen_generator("php") - self.gen_generator("dart") - - def gen_core(self): - target_filename = "blockly_compressed.js" - # Define the parameters for the POST request. - params = [ - ("compilation_level", "SIMPLE_OPTIMIZATIONS"), - ("use_closure_library", "true"), - ("output_format", "json"), - ("output_info", "compiled_code"), - ("output_info", "warnings"), - ("output_info", "errors"), - ("output_info", "statistics"), - ] - - # Read in all the source files. - filenames = calcdeps.CalculateDependencies(self.search_paths, - [os.path.join("core", "blockly.js")]) - for filename in filenames: - # Filter out the Closure files (the compiler will add them). - if filename.startswith(os.pardir + os.sep): # '../' - continue - f = open(filename) - params.append(("js_code", "".join(f.readlines()))) - f.close() - - self.do_compile(params, target_filename, filenames, "") - - def gen_blocks(self): - target_filename = "blocks_compressed.js" - # Define the parameters for the POST request. - params = [ - ("compilation_level", "SIMPLE_OPTIMIZATIONS"), - ("output_format", "json"), - ("output_info", "compiled_code"), - ("output_info", "warnings"), - ("output_info", "errors"), - ("output_info", "statistics"), - ] - - # Read in all the source files. - # Add Blockly.Blocks to be compatible with the compiler. - params.append(("js_code", "goog.provide('Blockly.Blocks');")) - filenames = glob.glob(os.path.join("blocks", "*.js")) - for filename in filenames: - f = open(filename) - params.append(("js_code", "".join(f.readlines()))) - f.close() - - # Remove Blockly.Blocks to be compatible with Blockly. - remove = "var Blockly={Blocks:{}};" - self.do_compile(params, target_filename, filenames, remove) - - def gen_generator(self, language): - target_filename = language + "_compressed.js" - # Define the parameters for the POST request. - params = [ - ("compilation_level", "SIMPLE_OPTIMIZATIONS"), - ("output_format", "json"), - ("output_info", "compiled_code"), - ("output_info", "warnings"), - ("output_info", "errors"), - ("output_info", "statistics"), - ] - - # Read in all the source files. - # Add Blockly.Generator to be compatible with the compiler. - params.append(("js_code", "goog.provide('Blockly.Generator');")) - filenames = glob.glob( - os.path.join("generators", language, "*.js")) - filenames.insert(0, os.path.join("generators", language + ".js")) - for filename in filenames: - f = open(filename) - params.append(("js_code", "".join(f.readlines()))) - f.close() - filenames.insert(0, "[goog.provide]") - - # Remove Blockly.Generator to be compatible with Blockly. - remove = "var Blockly={Generator:{}};" - self.do_compile(params, target_filename, filenames, remove) - - def do_compile(self, params, target_filename, filenames, remove): - # Send the request to Google. - headers = {"Content-type": "application/x-www-form-urlencoded"} - conn = httplib.HTTPConnection("closure-compiler.appspot.com") - conn.request("POST", "/compile", urllib.urlencode(params), headers) - response = conn.getresponse() - json_str = response.read() - conn.close() - - # Parse the JSON response. - json_data = json.loads(json_str) - - def file_lookup(name): - if not name.startswith("Input_"): - return "???" - n = int(name[6:]) - 1 - return filenames[n] - - if json_data.has_key("serverErrors"): - errors = json_data["serverErrors"] - for error in errors: - print("SERVER ERROR: %s" % target_filename) - print(error["error"]) - elif json_data.has_key("errors"): - errors = json_data["errors"] - for error in errors: - print("FATAL ERROR") - print(error["error"]) - if error["file"]: - print("%s at line %d:" % ( - file_lookup(error["file"]), error["lineno"])) - print(error["line"]) - print((" " * error["charno"]) + "^") - sys.exit(1) - else: - if json_data.has_key("warnings"): - warnings = json_data["warnings"] - for warning in warnings: - print("WARNING") - print(warning["warning"]) - if warning["file"]: - print("%s at line %d:" % ( - file_lookup(warning["file"]), warning["lineno"])) - print(warning["line"]) - print((" " * warning["charno"]) + "^") - print() - - if not json_data.has_key("compiledCode"): - print("FATAL ERROR: Compiler did not return compiledCode.") - sys.exit(1) - - code = HEADER + "\n" + json_data["compiledCode"] - code = code.replace(remove, "") - - # Trim down Google's Apache licences. - # The Closure Compiler used to preserve these until August 2015. - # Delete this in a few months if the licences don't return. - LICENSE = re.compile("""/\\* - - [\w ]+ - - (Copyright \\d+ Google Inc.) - https://developers.google.com/blockly/ - - Licensed under the Apache License, Version 2.0 \(the "License"\); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -\\*/""") - code = re.sub(LICENSE, r"\n// \1 Apache License 2.0", code) - - stats = json_data["statistics"] - original_b = stats["originalSize"] - compressed_b = stats["compressedSize"] - if original_b > 0 and compressed_b > 0: - f = open(target_filename, "w") - f.write(code) - f.close() - - original_kb = int(original_b / 1024 + 0.5) - compressed_kb = int(compressed_b / 1024 + 0.5) - ratio = int(float(compressed_b) / float(original_b) * 100 + 0.5) - print("SUCCESS: " + target_filename) - print("Size changed from %d KB to %d KB (%d%%)." % ( - original_kb, compressed_kb, ratio)) - else: - print("UNKNOWN ERROR") - - -class Gen_langfiles(threading.Thread): - """Generate JavaScript file for each natural language supported. - - Runs in a separate thread. - """ - - def __init__(self): - threading.Thread.__init__(self) - - def _rebuild(self, srcs, dests): - # Determine whether any of the files in srcs is newer than any in dests. - try: - return (max(os.path.getmtime(src) for src in srcs) > - min(os.path.getmtime(dest) for dest in dests)) - except OSError as e: - # Was a file not found? - if e.errno == errno.ENOENT: - # If it was a source file, we can't proceed. - if e.filename in srcs: - print("Source file missing: " + e.filename) - sys.exit(1) - else: - # If a destination file was missing, rebuild. - return True - else: - print("Error checking file creation times: " + e) - - def run(self): - # The files msg/json/{en,qqq,synonyms}.json depend on msg/messages.js. - if self._rebuild([os.path.join("msg", "messages.js")], - [os.path.join("msg", "json", f) for f in - ["en.json", "qqq.json", "synonyms.json"]]): - try: - subprocess.check_call([ - "python", - os.path.join("i18n", "js_to_json.py"), - "--input_file", "msg/messages.js", - "--output_dir", "msg/json/", - "--quiet"]) - except (subprocess.CalledProcessError, OSError) as e: - # Documentation for subprocess.check_call says that CalledProcessError - # will be raised on failure, but I found that OSError is also possible. - print("Error running i18n/js_to_json.py: ", e) - sys.exit(1) - - # Checking whether it is necessary to rebuild the js files would be a lot of - # work since we would have to compare each .json file with each - # .js file. Rebuilding is easy and cheap, so just go ahead and do it. - try: - # Use create_messages.py to create .js files from .json files. - cmd = [ - "python", - os.path.join("i18n", "create_messages.py"), - "--source_lang_file", os.path.join("msg", "json", "en.json"), - "--source_synonym_file", os.path.join("msg", "json", "synonyms.json"), - "--key_file", os.path.join("msg", "json", "keys.json"), - "--output_dir", os.path.join("msg", "js"), - "--quiet"] - json_files = glob.glob(os.path.join("msg", "json", "*.json")) - json_files = [file for file in json_files if not - (file.endswith(("keys.json", "synonyms.json", "qqq.json")))] - cmd.extend(json_files) - subprocess.check_call(cmd) - except (subprocess.CalledProcessError, OSError) as e: - print("Error running i18n/create_messages.py: ", e) - sys.exit(1) - - # Output list of .js files created. - for f in json_files: - # This assumes the path to the current directory does not contain "json". - f = f.replace("json", "js") - if os.path.isfile(f): - print("SUCCESS: " + f) - else: - print("FAILED to create " + f) - - -if __name__ == "__main__": - try: - calcdeps = import_path(os.path.join( - os.path.pardir, "closure-library", "closure", "bin", "calcdeps.py")) - except ImportError: - if os.path.isdir(os.path.join(os.path.pardir, "closure-library-read-only")): - # Dir got renamed when Closure moved from Google Code to GitHub in 2014. - print("Error: Closure directory needs to be renamed from" - "'closure-library-read-only' to 'closure-library'.\n" - "Please rename this directory.") - else: - print("""Error: Closure not found. Read this: -https://developers.google.com/blockly/hacking/closure""") - sys.exit(1) - search_paths = calcdeps.ExpandDirectories( - ["core", os.path.join(os.path.pardir, "closure-library")]) - - # Run both tasks in parallel threads. - # Uncompressed is limited by processor speed. - # Compressed is limited by network and server speed. - Gen_uncompressed(search_paths).start() - Gen_compressed(search_paths).start() - - # This is run locally in a separate thread. - Gen_langfiles().start() diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/block.js b/src/opsoro/apps/visual_programming/static/blockly/core/block.js deleted file mode 100644 index e89a37a..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/block.js +++ /dev/null @@ -1,1258 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview The class representing one block. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Block'); - -goog.require('Blockly.Blocks'); -goog.require('Blockly.Comment'); -goog.require('Blockly.Connection'); -goog.require('Blockly.Input'); -goog.require('Blockly.Mutator'); -goog.require('Blockly.Warning'); -goog.require('Blockly.Workspace'); -goog.require('Blockly.Xml'); -goog.require('goog.array'); -goog.require('goog.asserts'); -goog.require('goog.math.Coordinate'); -goog.require('goog.string'); - - -/** -* Class for one block. -* @constructor -*/ -Blockly.Block = function() { - // We assert this here because there may be users of the previous form of - // this constructor, which took arguments. - goog.asserts.assert(arguments.length == 0, - 'Please use Blockly.Block.obtain.'); -}; - -/** - * Obtain a newly created block. - * @param {!Blockly.Workspace} workspace The block's workspace. - * @param {?string} prototypeName Name of the language object containing - * type-specific functions for this block. - * @return {!Blockly.Block} The created block - */ -Blockly.Block.obtain = function(workspace, prototypeName) { - if (Blockly.Realtime.isEnabled()) { - return Blockly.Realtime.obtainBlock(workspace, prototypeName); - } else { - if (workspace.rendered) { - var newBlock = new Blockly.BlockSvg(); - } else { - var newBlock = new Blockly.Block(); - } - newBlock.initialize(workspace, prototypeName); - return newBlock; - } -}; - -/** - * Initialization for one block. - * @param {!Blockly.Workspace} workspace The new block's workspace. - * @param {?string} prototypeName Name of the language object containing - * type-specific functions for this block. - */ -Blockly.Block.prototype.initialize = function(workspace, prototypeName) { - /** @type {string} */ - this.id = Blockly.Blocks.genUid(); - workspace.addTopBlock(this); - this.fill(workspace, prototypeName); -}; - -/** - * Fill a block with initial values. - * @param {!Blockly.Workspace} workspace The workspace to use. - * @param {string} prototypeName The typename of the block. - */ -Blockly.Block.prototype.fill = function(workspace, prototypeName) { - /** @type {Blockly.Connection} */ - this.outputConnection = null; - /** @type {Blockly.Connection} */ - this.nextConnection = null; - /** @type {Blockly.Connection} */ - this.previousConnection = null; - /** @type {!Array.} */ - this.inputList = []; - /** @type {boolean|undefined} */ - this.inputsInline = undefined; - /** @type {boolean} */ - this.rendered = false; - /** @type {boolean} */ - this.disabled = false; - /** @type {string|!Function} */ - this.tooltip = ''; - /** @type {boolean} */ - this.contextMenu = true; - - /** @type {Blockly.Block} */ - this.parentBlock_ = null; - /** @type {!Array.} */ - this.childBlocks_ = []; - /** @type {boolean} */ - this.deletable_ = true; - /** @type {boolean} */ - this.movable_ = true; - /** @type {boolean} */ - this.editable_ = true; - /** @type {boolean} */ - this.isShadow_ = false; - /** @type {boolean} */ - this.collapsed_ = false; - - /** @type {string|Blockly.Comment} */ - this.comment = null; - - /** @type {!goog.math.Coordinate} */ - this.xy_ = new goog.math.Coordinate(0, 0); - - /** @type {!Blockly.Workspace} */ - this.workspace = workspace; - /** @type {boolean} */ - this.isInFlyout = workspace.isFlyout; - /** @type {boolean} */ - this.RTL = workspace.RTL; - - // Copy the type-specific functions and data from the prototype. - if (prototypeName) { - /** @type {string} */ - this.type = prototypeName; - var prototype = Blockly.Blocks[prototypeName]; - goog.asserts.assertObject(prototype, - 'Error: "%s" is an unknown language block.', prototypeName); - goog.mixin(this, prototype); - } - // Call an initialization function, if it exists. - if (goog.isFunction(this.init)) { - this.init(); - } - // Record initial inline state. - /** @type {boolean|undefined} */ - this.inputsInlineDefault = this.inputsInline; -}; - -/** - * Get an existing block. - * @param {string} id The block's id. - * @param {!Blockly.Workspace} workspace The block's workspace. - * @return {Blockly.Block} The found block, or null if not found. - */ -Blockly.Block.getById = function(id, workspace) { - if (Blockly.Realtime.isEnabled()) { - return Blockly.Realtime.getBlockById(id); - } else { - return workspace.getBlockById(id); - } -}; - -/** - * Dispose of this block. - * @param {boolean} healStack If true, then try to heal any gap by connecting - * the next statement with the previous statement. Otherwise, dispose of - * all children of this block. - * @param {boolean} animate If true, show a disposal animation and sound. - * @param {boolean=} opt_dontRemoveFromWorkspace If true, don't remove this - * block from the workspace's list of top blocks. - */ -Blockly.Block.prototype.dispose = function(healStack, animate, - opt_dontRemoveFromWorkspace) { - this.unplug(healStack, false); - - // This block is now at the top of the workspace. - // Remove this block from the workspace's list of top-most blocks. - if (this.workspace && !opt_dontRemoveFromWorkspace) { - this.workspace.removeTopBlock(this); - this.workspace = null; - } - - // Just deleting this block from the DOM would result in a memory leak as - // well as corruption of the connection database. Therefore we must - // methodically step through the blocks and carefully disassemble them. - - if (Blockly.selected == this) { - Blockly.selected = null; - } - - // First, dispose of all my children. - for (var i = this.childBlocks_.length - 1; i >= 0; i--) { - this.childBlocks_[i].dispose(false); - } - // Then dispose of myself. - // Dispose of all inputs and their fields. - for (var i = 0, input; input = this.inputList[i]; i++) { - input.dispose(); - } - this.inputList.length = 0; - // Dispose of any remaining connections (next/previous/output). - var connections = this.getConnections_(true); - for (var i = 0; i < connections.length; i++) { - var connection = connections[i]; - if (connection.targetConnection) { - connection.disconnect(); - } - connections[i].dispose(); - } - // Remove from Realtime set of blocks. - if (Blockly.Realtime.isEnabled() && !Blockly.Realtime.withinSync) { - Blockly.Realtime.removeBlock(this); - } -}; - -/** - * Unplug this block from its superior block. If this block is a statement, - * optionally reconnect the block underneath with the block on top. - * @param {boolean} healStack Disconnect child statement and reconnect stack. - * @param {boolean} bump Move the unplugged block sideways a short distance. - */ -Blockly.Block.prototype.unplug = function(healStack, bump) { - bump = bump && !!this.getParent(); - if (this.outputConnection) { - if (this.outputConnection.targetConnection) { - // Disconnect from any superior block. - this.setParent(null); - } - } else { - var previousTarget = null; - if (this.previousConnection && this.previousConnection.targetConnection) { - // Remember the connection that any next statements need to connect to. - previousTarget = this.previousConnection.targetConnection; - // Detach this block from the parent's tree. - this.setParent(null); - } - var nextBlock = this.getNextBlock(); - if (healStack && nextBlock) { - // Disconnect the next statement. - var nextTarget = this.nextConnection.targetConnection; - nextBlock.setParent(null); - if (previousTarget && previousTarget.checkType_(nextTarget)) { - // Attach the next statement to the previous statement. - previousTarget.connect(nextTarget); - } - } - } - if (bump) { - // Bump the block sideways. - var dx = Blockly.SNAP_RADIUS * (this.RTL ? -1 : 1); - var dy = Blockly.SNAP_RADIUS * 2; - this.moveBy(dx, dy); - } -}; - -/** - * Returns all connections originating from this block. - * @param {boolean} all If true, return all connections even hidden ones. - * Otherwise return those that are visible. - * @return {!Array.} Array of connections. - * @private - */ -Blockly.Block.prototype.getConnections_ = function(all) { - var myConnections = []; - if (all || this.rendered) { - if (this.outputConnection) { - myConnections.push(this.outputConnection); - } - if (this.previousConnection) { - myConnections.push(this.previousConnection); - } - if (this.nextConnection) { - myConnections.push(this.nextConnection); - } - if (all || !this.collapsed_) { - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.connection) { - myConnections.push(input.connection); - } - } - } - } - return myConnections; -}; - -/** - * Bump unconnected blocks out of alignment. Two blocks which aren't actually - * connected should not coincidentally line up on screen. - * @private - */ -Blockly.Block.prototype.bumpNeighbours_ = function() { - if (!this.workspace) { - return; // Deleted block. - } - if (Blockly.dragMode_ != 0) { - return; // Don't bump blocks during a drag. - } - var rootBlock = this.getRootBlock(); - if (rootBlock.isInFlyout) { - return; // Don't move blocks around in a flyout. - } - // Loop though every connection on this block. - var myConnections = this.getConnections_(false); - for (var i = 0, connection; connection = myConnections[i]; i++) { - // Spider down from this block bumping all sub-blocks. - if (connection.targetConnection && connection.isSuperior()) { - connection.targetBlock().bumpNeighbours_(); - } - - var neighbours = connection.neighbours_(Blockly.SNAP_RADIUS); - for (var j = 0, otherConnection; otherConnection = neighbours[j]; j++) { - // If both connections are connected, that's probably fine. But if - // either one of them is unconnected, then there could be confusion. - if (!connection.targetConnection || !otherConnection.targetConnection) { - // Only bump blocks if they are from different tree structures. - if (otherConnection.sourceBlock_.getRootBlock() != rootBlock) { - // Always bump the inferior block. - if (connection.isSuperior()) { - otherConnection.bumpAwayFrom_(connection); - } else { - connection.bumpAwayFrom_(otherConnection); - } - } - } - } - } -}; - -/** - * Return the parent block or null if this block is at the top level. - * @return {Blockly.Block} The block that holds the current block. - */ -Blockly.Block.prototype.getParent = function() { - // Look at the DOM to see if we are nested in another block. - return this.parentBlock_; -}; - -/** - * Return the parent block that surrounds the current block, or null if this - * block has no surrounding block. A parent block might just be the previous - * statement, whereas the surrounding block is an if statement, while loop, etc. - * @return {Blockly.Block} The block that surrounds the current block. - */ -Blockly.Block.prototype.getSurroundParent = function() { - var block = this; - while (true) { - do { - var prevBlock = block; - block = block.getParent(); - if (!block) { - // Ran off the top. - return null; - } - } while (block.getNextBlock() == prevBlock); - // This block is an enclosing parent, not just a statement in a stack. - return block; - } -}; - -/** - * Return the next statement block directly connected to this block. - * @return {Blockly.Block} The next statement block or null. - */ -Blockly.Block.prototype.getNextBlock = function() { - return this.nextConnection && this.nextConnection.targetBlock(); -}; - -/** - * Return the top-most block in this block's tree. - * This will return itself if this block is at the top level. - * @return {!Blockly.Block} The root block. - */ -Blockly.Block.prototype.getRootBlock = function() { - var rootBlock; - var block = this; - do { - rootBlock = block; - block = rootBlock.parentBlock_; - } while (block); - return rootBlock; -}; - -/** - * Find all the blocks that are directly nested inside this one. - * Includes value and block inputs, as well as any following statement. - * Excludes any connection on an output tab or any preceding statement. - * @return {!Array.} Array of blocks. - */ -Blockly.Block.prototype.getChildren = function() { - return this.childBlocks_; -}; - -/** - * Set parent of this block to be a new block or null. - * @param {Blockly.Block} newParent New parent block. - */ -Blockly.Block.prototype.setParent = function(newParent) { - if (this.parentBlock_) { - // Remove this block from the old parent's child list. - var children = this.parentBlock_.childBlocks_; - for (var child, x = 0; child = children[x]; x++) { - if (child == this) { - children.splice(x, 1); - break; - } - } - - // Disconnect from superior blocks. - this.parentBlock_ = null; - if (this.previousConnection && this.previousConnection.targetConnection) { - this.previousConnection.disconnect(); - } - if (this.outputConnection && this.outputConnection.targetConnection) { - this.outputConnection.disconnect(); - } - // This block hasn't actually moved on-screen, so there's no need to update - // its connection locations. - } else { - // Remove this block from the workspace's list of top-most blocks. - // Note that during realtime sync we sometimes create child blocks that are - // not top level so we check first before removing. - if (goog.array.contains(this.workspace.getTopBlocks(false), this)) { - this.workspace.removeTopBlock(this); - } - } - - this.parentBlock_ = newParent; - if (newParent) { - // Add this block to the new parent's child list. - newParent.childBlocks_.push(this); - } else { - this.workspace.addTopBlock(this); - } -}; - -/** - * Find all the blocks that are directly or indirectly nested inside this one. - * Includes this block in the list. - * Includes value and block inputs, as well as any following statements. - * Excludes any connection on an output tab or any preceding statements. - * @return {!Array.} Flattened array of blocks. - */ -Blockly.Block.prototype.getDescendants = function() { - var blocks = [this]; - for (var child, x = 0; child = this.childBlocks_[x]; x++) { - blocks.push.apply(blocks, child.getDescendants()); - } - return blocks; -}; - -/** - * Get whether this block is deletable or not. - * @return {boolean} True if deletable. - */ -Blockly.Block.prototype.isDeletable = function() { - return this.deletable_ && - !(this.workspace && this.workspace.options.readOnly); -}; - -/** - * Set whether this block is deletable or not. - * @param {boolean} deletable True if deletable. - */ -Blockly.Block.prototype.setDeletable = function(deletable) { - this.deletable_ = deletable; -}; - -/** - * Get whether this block is movable or not. - * @return {boolean} True if movable. - */ -Blockly.Block.prototype.isMovable = function() { - return this.movable_ && !this.isShadow_ && - !(this.workspace && this.workspace.options.readOnly); -}; - -/** - * Set whether this block is movable or not. - * @param {boolean} movable True if movable. - */ -Blockly.Block.prototype.setMovable = function(movable) { - this.movable_ = movable; -}; - -/** - * Get whether this block is a shadow block or not. - * @return {boolean} True if a shadow. - */ -Blockly.Block.prototype.isShadow = function() { - return this.isShadow_; -}; - -/** - * Set whether this block is a shadow block or not. - * @param {boolean} shadow True if a shadow. - */ -Blockly.Block.prototype.setShadow = function(shadow) { - this.isShadow_ = shadow; -}; - -/** - * Get whether this block is editable or not. - * @return {boolean} True if editable. - */ -Blockly.Block.prototype.isEditable = function() { - return this.editable_ && !(this.workspace && this.workspace.options.readOnly); -}; - -/** - * Set whether this block is editable or not. - * @param {boolean} editable True if editable. - */ -Blockly.Block.prototype.setEditable = function(editable) { - this.editable_ = editable; - for (var i = 0, input; input = this.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - field.updateEditable(); - } - } -}; - -/** - * Set whether the connections are hidden (not tracked in a database) or not. - * Recursively walk down all child blocks (except collapsed blocks). - * @param {boolean} hidden True if connections are hidden. - */ -Blockly.Block.prototype.setConnectionsHidden = function(hidden) { - if (!hidden && this.isCollapsed()) { - if (this.outputConnection) { - this.outputConnection.setHidden(hidden); - } - if (this.previousConnection) { - this.previousConnection.setHidden(hidden); - } - if (this.nextConnection) { - this.nextConnection.setHidden(hidden); - var child = this.nextConnection.targetBlock(); - if (child) { - child.setConnectionsHidden(hidden); - } - } - } else { - var myConnections = this.getConnections_(true); - for (var i = 0, connection; connection = myConnections[i]; i++) { - connection.setHidden(hidden); - if (connection.isSuperior()) { - var child = connection.targetBlock(); - if (child) { - child.setConnectionsHidden(hidden); - } - } - } - } -}; - -/** - * Set the URL of this block's help page. - * @param {string|Function} url URL string for block help, or function that - * returns a URL. Null for no help. - */ -Blockly.Block.prototype.setHelpUrl = function(url) { - this.helpUrl = url; -}; - -/** - * Change the tooltip text for a block. - * @param {string|!Function} newTip Text for tooltip or a parent element to - * link to for its tooltip. May be a function that returns a string. - */ -Blockly.Block.prototype.setTooltip = function(newTip) { - this.tooltip = newTip; -}; - -/** - * Get the colour of a block. - * @return {number} HSV hue value. - */ -Blockly.Block.prototype.getColour = function() { - return this.colourHue_; -}; - -/** - * Change the colour of a block. - * @param {number} colourHue HSV hue value. - */ -Blockly.Block.prototype.setColour = function(colourHue) { - this.colourHue_ = colourHue; - if (this.rendered) { - this.updateColour(); - } -}; - -/** - * Returns the named field from a block. - * @param {string} name The name of the field. - * @return {Blockly.Field} Named field, or null if field does not exist. - */ -Blockly.Block.prototype.getField = function(name) { - for (var i = 0, input; input = this.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - if (field.name === name) { - return field; - } - } - } - return null; -}; - -/** - * Returns the language-neutral value from the field of a block. - * @param {string} name The name of the field. - * @return {?string} Value from the field or null if field does not exist. - */ -Blockly.Block.prototype.getFieldValue = function(name) { - var field = this.getField(name); - if (field) { - return field.getValue(); - } - return null; -}; - -/** - * Returns the language-neutral value from the field of a block. - * @param {string} name The name of the field. - * @return {?string} Value from the field or null if field does not exist. - * @deprecated December 2013 - */ -Blockly.Block.prototype.getTitleValue = function(name) { - console.warn('Deprecated call to getTitleValue, use getFieldValue instead.'); - return this.getFieldValue(name); -}; - -/** - * Change the field value for a block (e.g. 'CHOOSE' or 'REMOVE'). - * @param {string} newValue Value to be the new field. - * @param {string} name The name of the field. - */ -Blockly.Block.prototype.setFieldValue = function(newValue, name) { - var field = this.getField(name); - goog.asserts.assertObject(field, 'Field "%s" not found.', name); - field.setValue(newValue); -}; - -/** - * Change the field value for a block (e.g. 'CHOOSE' or 'REMOVE'). - * @param {string} newValue Value to be the new field. - * @param {string} name The name of the field. - * @deprecated December 2013 - */ -Blockly.Block.prototype.setTitleValue = function(newValue, name) { - console.warn('Deprecated call to setTitleValue, use setFieldValue instead.'); - this.setFieldValue(newValue, name); -}; - -/** - * Set whether this block can chain onto the bottom of another block. - * @param {boolean} newBoolean True if there can be a previous statement. - * @param {string|Array.|null|undefined} opt_check Statement type or - * list of statement types. Null/undefined if any type could be connected. - */ -Blockly.Block.prototype.setPreviousStatement = function(newBoolean, opt_check) { - if (this.previousConnection) { - goog.asserts.assert(!this.previousConnection.targetConnection, - 'Must disconnect previous statement before removing connection.'); - this.previousConnection.dispose(); - this.previousConnection = null; - } - if (newBoolean) { - goog.asserts.assert(!this.outputConnection, - 'Remove output connection prior to adding previous connection.'); - if (opt_check === undefined) { - opt_check = null; - } - this.previousConnection = - new Blockly.Connection(this, Blockly.PREVIOUS_STATEMENT); - this.previousConnection.setCheck(opt_check); - } - if (this.rendered) { - this.render(); - this.bumpNeighbours_(); - } -}; - -/** - * Set whether another block can chain onto the bottom of this block. - * @param {boolean} newBoolean True if there can be a next statement. - * @param {string|Array.|null|undefined} opt_check Statement type or - * list of statement types. Null/undefined if any type could be connected. - */ -Blockly.Block.prototype.setNextStatement = function(newBoolean, opt_check) { - if (this.nextConnection) { - goog.asserts.assert(!this.nextConnection.targetConnection, - 'Must disconnect next statement before removing connection.'); - this.nextConnection.dispose(); - this.nextConnection = null; - } - if (newBoolean) { - if (opt_check === undefined) { - opt_check = null; - } - this.nextConnection = - new Blockly.Connection(this, Blockly.NEXT_STATEMENT); - this.nextConnection.setCheck(opt_check); - } - if (this.rendered) { - this.render(); - this.bumpNeighbours_(); - } -}; - -/** - * Set whether this block returns a value. - * @param {boolean} newBoolean True if there is an output. - * @param {string|Array.|null|undefined} opt_check Returned type or list - * of returned types. Null or undefined if any type could be returned - * (e.g. variable get). - */ -Blockly.Block.prototype.setOutput = function(newBoolean, opt_check) { - if (this.outputConnection) { - goog.asserts.assert(!this.outputConnection.targetConnection, - 'Must disconnect output value before removing connection.'); - this.outputConnection.dispose(); - this.outputConnection = null; - } - if (newBoolean) { - goog.asserts.assert(!this.previousConnection, - 'Remove previous connection prior to adding output connection.'); - if (opt_check === undefined) { - opt_check = null; - } - this.outputConnection = - new Blockly.Connection(this, Blockly.OUTPUT_VALUE); - this.outputConnection.setCheck(opt_check); - } - if (this.rendered) { - this.render(); - this.bumpNeighbours_(); - } -}; - -/** - * Set whether value inputs are arranged horizontally or vertically. - * @param {boolean} newBoolean True if inputs are horizontal. - */ -Blockly.Block.prototype.setInputsInline = function(newBoolean) { - this.inputsInline = newBoolean; - if (this.rendered) { - this.render(); - this.bumpNeighbours_(); - this.workspace.fireChangeEvent(); - } -}; - -/** - * Get whether value inputs are arranged horizontally or vertically. - * @return {boolean} True if inputs are horizontal. - */ -Blockly.Block.prototype.getInputsInline = function() { - if (this.inputsInline != undefined) { - // Set explicitly. - return this.inputsInline; - } - // Not defined explicitly. Figure out what would look best. - for (var i = 1; i < this.inputList.length; i++) { - if (this.inputList[i - 1].type == Blockly.DUMMY_INPUT && - this.inputList[i].type == Blockly.DUMMY_INPUT) { - // Two dummy inputs in a row. Don't inline them. - return false; - } - } - for (var i = 1; i < this.inputList.length; i++) { - if (this.inputList[i - 1].type == Blockly.INPUT_VALUE && - this.inputList[i].type == Blockly.DUMMY_INPUT) { - // Dummy input after a value input. Inline them. - return true; - } - } - return false; -}; - -/** - * Set whether the block is disabled or not. - * @param {boolean} disabled True if disabled. - */ -Blockly.Block.prototype.setDisabled = function(disabled) { - this.disabled = disabled; -}; - -/** - * Get whether the block is disabled or not due to parents. - * The block's own disabled property is not considered. - * @return {boolean} True if disabled. - */ -Blockly.Block.prototype.getInheritedDisabled = function() { - var block = this; - while (true) { - block = block.getSurroundParent(); - if (!block) { - // Ran off the top. - return false; - } else if (block.disabled) { - return true; - } - } -}; - -/** - * Get whether the block is collapsed or not. - * @return {boolean} True if collapsed. - */ -Blockly.Block.prototype.isCollapsed = function() { - return this.collapsed_; -}; - -/** - * Set whether the block is collapsed or not. - * @param {boolean} collapsed True if collapsed. - */ -Blockly.Block.prototype.setCollapsed = function(collapsed) { - this.collapsed_ = collapsed; -}; - -/** - * Create a human-readable text representation of this block and any children. - * @param {number=} opt_maxLength Truncate the string to this length. - * @return {string} Text of block. - */ -Blockly.Block.prototype.toString = function(opt_maxLength) { - var text = []; - if (this.collapsed_) { - text.push(this.getInput('_TEMP_COLLAPSED_INPUT').fieldRow[0].text_); - } else { - for (var i = 0, input; input = this.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - text.push(field.getText()); - } - if (input.connection) { - var child = input.connection.targetBlock(); - if (child) { - text.push(child.toString()); - } else { - text.push('?'); - } - } - } - } - text = goog.string.trim(text.join(' ')) || '???'; - if (opt_maxLength) { - // TODO: Improve truncation so that text from this block is given priority. - // TODO: Handle FieldImage better. - text = goog.string.truncate(text, opt_maxLength); - } - return text; -}; - -/** - * Shortcut for appending a value input row. - * @param {string} name Language-neutral identifier which may used to find this - * input again. Should be unique to this block. - * @return {!Blockly.Input} The input object created. - */ -Blockly.Block.prototype.appendValueInput = function(name) { - return this.appendInput_(Blockly.INPUT_VALUE, name); -}; - -/** - * Shortcut for appending a statement input row. - * @param {string} name Language-neutral identifier which may used to find this - * input again. Should be unique to this block. - * @return {!Blockly.Input} The input object created. - */ -Blockly.Block.prototype.appendStatementInput = function(name) { - return this.appendInput_(Blockly.NEXT_STATEMENT, name); -}; - -/** - * Shortcut for appending a dummy input row. - * @param {string=} opt_name Language-neutral identifier which may used to find - * this input again. Should be unique to this block. - * @return {!Blockly.Input} The input object created. - */ -Blockly.Block.prototype.appendDummyInput = function(opt_name) { - return this.appendInput_(Blockly.DUMMY_INPUT, opt_name || ''); -}; - -/** - * Initialize this block using a cross-platform, internationalization-friendly - * JSON description. - * @param {!Object} json Structured data describing the block. - */ -Blockly.Block.prototype.jsonInit = function(json) { - // Validate inputs. - goog.asserts.assert(json['output'] == undefined || - json['previousStatement'] == undefined, - 'Must not have both an output and a previousStatement.'); - - // Set basic properties of block. - this.setColour(json['colour']); - - // Interpolate the message blocks. - var i = 0; - while (json['message' + i] !== undefined) { - this.interpolate_(json['message' + i], json['args' + i] || [], - json['lastDummyAlign' + i]); - i++; - } - - if (json['inputsInline'] !== undefined) { - this.setInputsInline(json['inputsInline']); - } - // Set output and previous/next connections. - if (json['output'] !== undefined) { - this.setOutput(true, json['output']); - } - if (json['previousStatement'] !== undefined) { - this.setPreviousStatement(true, json['previousStatement']); - } - if (json['nextStatement'] !== undefined) { - this.setNextStatement(true, json['nextStatement']); - } - if (json['tooltip'] !== undefined) { - this.setTooltip(json['tooltip']); - } - if (json['helpUrl'] !== undefined) { - this.setHelpUrl(json['helpUrl']); - } -}; - -/** - * Interpolate a message description onto the block. - * @param {string} message Text contains interpolation tokens (%1, %2, ...) - * that match with fields or inputs defined in the args array. - * @param {!Array} args Array of arguments to be interpolated. - * @param {=string} lastDummyAlign If a dummy input is added at the end, - * how should it be aligned? - * @private - */ -Blockly.Block.prototype.interpolate_ = function(message, args, lastDummyAlign) { - var tokens = Blockly.tokenizeInterpolation(message); - // Interpolate the arguments. Build a list of elements. - var indexDup = []; - var indexCount = 0; - var elements = []; - for (var i = 0; i < tokens.length; i++) { - var token = tokens[i]; - if (typeof token == 'number') { - goog.asserts.assert(token > 0 && token <= args.length, - 'Message index "%s" out of range.', token); - goog.asserts.assert(!indexDup[token], - 'Message index "%s" duplicated.', token); - indexDup[token] = true; - indexCount++; - elements.push(args[token - 1]); - } else { - token = token.trim(); - if (token) { - elements.push(token); - } - } - } - goog.asserts.assert(indexCount == args.length, - 'Message does not reference all %s arg(s).', args.length); - // Add last dummy input if needed. - if (elements.length && (typeof elements[elements.length - 1] == 'string' || - elements[elements.length - 1]['type'].indexOf('field_') == 0)) { - var input = {type: 'input_dummy'}; - if (lastDummyAlign) { - input['align'] = lastDummyAlign; - } - elements.push(input); - } - // Lookup of alignment constants. - var alignmentLookup = { - 'LEFT': Blockly.ALIGN_LEFT, - 'RIGHT': Blockly.ALIGN_RIGHT, - 'CENTRE': Blockly.ALIGN_CENTRE - }; - // Populate block with inputs and fields. - var fieldStack = []; - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - if (typeof element == 'string') { - fieldStack.push([element, undefined]); - } else { - var field = null; - var input = null; - do { - var altRepeat = false; - switch (element['type']) { - case 'input_value': - input = this.appendValueInput(element['name']); - break; - case 'input_statement': - input = this.appendStatementInput(element['name']); - break; - case 'input_dummy': - input = this.appendDummyInput(element['name']); - break; - case 'field_label': - field = new Blockly.FieldLabel(element['text']); - break; - case 'field_input': - field = new Blockly.FieldTextInput(element['text']); - if (typeof element['spellcheck'] == 'boolean') { - field.setSpellcheck(element['spellcheck']); - } - break; - case 'field_angle': - field = new Blockly.FieldAngle(element['angle']); - break; - case 'field_checkbox': - field = new Blockly.FieldCheckbox( - element['checked'] ? 'TRUE' : 'FALSE'); - break; - case 'field_colour': - field = new Blockly.FieldColour(element['colour']); - break; - case 'field_variable': - field = new Blockly.FieldVariable(element['variable']); - break; - case 'field_dropdown': - field = new Blockly.FieldDropdown(element['options']); - break; - case 'field_image': - field = new Blockly.FieldImage(element['src'], - element['width'], element['height'], element['alt']); - break; - case 'field_date': - if (Blockly.FieldDate) { - field = new Blockly.FieldDate(element['date']); - break; - } - // Fall through if FieldDate is not compiled in. - default: - // Unknown field. - if (element['alt']) { - element = element['alt']; - altRepeat = true; - } - } - } while (altRepeat); - if (field) { - fieldStack.push([field, element['name']]); - } else if (input) { - if (element['check']) { - input.setCheck(element['check']); - } - if (element['align']) { - input.setAlign(alignmentLookup[element['align']]); - } - for (var j = 0; j < fieldStack.length; j++) { - input.appendField(fieldStack[j][0], fieldStack[j][1]); - } - fieldStack.length = 0; - } - } - } -}; - -/** - * Add a value input, statement input or local variable to this block. - * @param {number} type Either Blockly.INPUT_VALUE or Blockly.NEXT_STATEMENT or - * Blockly.DUMMY_INPUT. - * @param {string} name Language-neutral identifier which may used to find this - * input again. Should be unique to this block. - * @return {!Blockly.Input} The input object created. - * @private - */ -Blockly.Block.prototype.appendInput_ = function(type, name) { - var connection = null; - if (type == Blockly.INPUT_VALUE || type == Blockly.NEXT_STATEMENT) { - connection = new Blockly.Connection(this, type); - } - var input = new Blockly.Input(type, name, this, connection); - // Append input to list. - this.inputList.push(input); - if (this.rendered) { - this.render(); - // Adding an input will cause the block to change shape. - this.bumpNeighbours_(); - } - return input; -}; - -/** - * Move a named input to a different location on this block. - * @param {string} name The name of the input to move. - * @param {?string} refName Name of input that should be after the moved input, - * or null to be the input at the end. - */ -Blockly.Block.prototype.moveInputBefore = function(name, refName) { - if (name == refName) { - return; - } - // Find both inputs. - var inputIndex = -1; - var refIndex = refName ? -1 : this.inputList.length; - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.name == name) { - inputIndex = i; - if (refIndex != -1) { - break; - } - } else if (refName && input.name == refName) { - refIndex = i; - if (inputIndex != -1) { - break; - } - } - } - goog.asserts.assert(inputIndex != -1, 'Named input "%s" not found.', name); - goog.asserts.assert(refIndex != -1, 'Reference input "%s" not found.', - refName); - this.moveNumberedInputBefore(inputIndex, refIndex); -}; - -/** - * Move a numbered input to a different location on this block. - * @param {number} inputIndex Index of the input to move. - * @param {number} refIndex Index of input that should be after the moved input. - */ -Blockly.Block.prototype.moveNumberedInputBefore = function( - inputIndex, refIndex) { - // Validate arguments. - goog.asserts.assert(inputIndex != refIndex, 'Can\'t move input to itself.'); - goog.asserts.assert(inputIndex < this.inputList.length, - 'Input index ' + inputIndex + ' out of bounds.'); - goog.asserts.assert(refIndex <= this.inputList.length, - 'Reference input ' + refIndex + ' out of bounds.'); - // Remove input. - var input = this.inputList[inputIndex]; - this.inputList.splice(inputIndex, 1); - if (inputIndex < refIndex) { - refIndex--; - } - // Reinsert input. - this.inputList.splice(refIndex, 0, input); - if (this.rendered) { - this.render(); - // Moving an input will cause the block to change shape. - this.bumpNeighbours_(); - } -}; - -/** - * Remove an input from this block. - * @param {string} name The name of the input. - * @param {boolean=} opt_quiet True to prevent error if input is not present. - * @throws {goog.asserts.AssertionError} if the input is not present and - * opt_quiet is not true. - */ -Blockly.Block.prototype.removeInput = function(name, opt_quiet) { - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.name == name) { - if (input.connection && input.connection.targetConnection) { - // Disconnect any attached block. - input.connection.targetBlock().setParent(null); - } - input.dispose(); - this.inputList.splice(i, 1); - if (this.rendered) { - this.render(); - // Removing an input will cause the block to change shape. - this.bumpNeighbours_(); - } - return; - } - } - if (!opt_quiet) { - goog.asserts.fail('Input "%s" not found.', name); - } -}; - -/** - * Fetches the named input object. - * @param {string} name The name of the input. - * @return {Blockly.Input} The input object, or null of the input does not exist. - */ -Blockly.Block.prototype.getInput = function(name) { - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.name == name) { - return input; - } - } - // This input does not exist. - return null; -}; - -/** - * Fetches the block attached to the named input. - * @param {string} name The name of the input. - * @return {Blockly.Block} The attached value block, or null if the input is - * either disconnected or if the input does not exist. - */ -Blockly.Block.prototype.getInputTargetBlock = function(name) { - var input = this.getInput(name); - return input && input.connection && input.connection.targetBlock(); -}; - -/** - * Returns the comment on this block (or '' if none). - * @return {string} Block's comment. - */ -Blockly.Block.prototype.getCommentText = function() { - return this.comment || ''; -}; - -/** - * Set this block's comment text. - * @param {?string} text The text, or null to delete. - */ -Blockly.Block.prototype.setCommentText = function(text) { - this.comment = text; -}; - -/** - * Set this block's warning text. - * @param {?string} text The text, or null to delete. - */ -Blockly.Block.prototype.setWarningText = function(text) { - // NOP. -}; - -/** - * Give this block a mutator dialog. - * @param {Blockly.Mutator} mutator A mutator dialog instance or null to remove. - */ -Blockly.Block.prototype.setMutator = function(mutator) { - // NOP. -}; - -/** - * Return the coordinates of the top-left corner of this block relative to the - * drawing surface's origin (0,0). - * @return {!goog.math.Coordinate} Object with .x and .y properties. - */ -Blockly.Block.prototype.getRelativeToSurfaceXY = function() { - return this.xy_; -}; - -/** - * Move a block by a relative offset. - * @param {number} dx Horizontal offset. - * @param {number} dy Vertical offset. - */ -Blockly.Block.prototype.moveBy = function(dx, dy) { - this.xy_.translate(dx, dy); -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/block_svg.js b/src/opsoro/apps/visual_programming/static/blockly/core/block_svg.js deleted file mode 100644 index 1045f37..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/block_svg.js +++ /dev/null @@ -1,2195 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Methods for graphically rendering a block as SVG. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.BlockSvg'); - -goog.require('Blockly.Block'); -goog.require('Blockly.ContextMenu'); -goog.require('goog.Timer'); -goog.require('goog.asserts'); -goog.require('goog.dom'); -goog.require('goog.math.Coordinate'); - - -/** - * Class for a block's SVG representation. - * @extends {Blockly.Block} - * @constructor - */ -Blockly.BlockSvg = function() { - // Create core elements for the block. - this.svgGroup_ = Blockly.createSvgElement('g', {}, null); - this.svgPathDark_ = Blockly.createSvgElement('path', - {'class': 'blocklyPathDark', 'transform': 'translate(1,1)'}, - this.svgGroup_); - this.svgPath_ = Blockly.createSvgElement('path', {'class': 'blocklyPath'}, - this.svgGroup_); - this.svgPathLight_ = Blockly.createSvgElement('path', - {'class': 'blocklyPathLight'}, this.svgGroup_); - this.svgPath_.tooltip = this; - Blockly.Tooltip.bindMouseEvents(this.svgPath_); -}; -goog.inherits(Blockly.BlockSvg, Blockly.Block); - -/** - * Height of this block, not including any statement blocks above or below. - */ -Blockly.BlockSvg.prototype.height = 0; -/** - * Width of this block, including any connected value blocks. - */ -Blockly.BlockSvg.prototype.width = 0; - -/** - * Original location of block being dragged. - * @type {goog.math.Coordinate} - * @private - */ -Blockly.BlockSvg.prototype.dragStartXY_ = null; - -/** - * Constant for identifying rows that are to be rendered inline. - * Don't collide with Blockly.INPUT_VALUE and friends. - * @const - */ -Blockly.BlockSvg.INLINE = -1; - -/** - * Create and initialize the SVG representation of the block. - * May be called more than once. - */ -Blockly.BlockSvg.prototype.initSvg = function() { - goog.asserts.assert(this.workspace.rendered, 'Workspace is headless.'); - for (var i = 0, input; input = this.inputList[i]; i++) { - input.init(); - } - if (this.mutator) { - this.mutator.createIcon(); - } - this.updateColour(); - this.updateMovable(); - if (!this.workspace.options.readOnly && !this.eventsInit_) { - Blockly.bindEvent_(this.getSvgRoot(), 'mousedown', this, - this.onMouseDown_); - var thisBlock = this; - Blockly.bindEvent_(this.getSvgRoot(), 'touchstart', null, - function(e) {Blockly.longStart_(e, thisBlock);}); - } - // Bind an onchange function, if it exists. - if (goog.isFunction(this.onchange) && !this.eventsInit_) { - this.onchangeWrapper_ = Blockly.bindEvent_(this.workspace.getCanvas(), - 'blocklyWorkspaceChange', this, this.onchange); - } - this.eventsInit_ = true; - - if (!this.getSvgRoot().parentNode) { - this.workspace.getCanvas().appendChild(this.getSvgRoot()); - } -}; - -/** - * Select this block. Highlight it visually. - */ -Blockly.BlockSvg.prototype.select = function() { - if (Blockly.selected) { - // Unselect any previously selected block. - Blockly.selected.unselect(); - } - Blockly.selected = this; - this.addSelect(); - Blockly.fireUiEvent(this.workspace.getCanvas(), 'blocklySelectChange'); -}; - -/** - * Unselect this block. Remove its highlighting. - */ -Blockly.BlockSvg.prototype.unselect = function() { - Blockly.selected = null; - this.removeSelect(); - Blockly.fireUiEvent(this.workspace.getCanvas(), 'blocklySelectChange'); -}; - -/** - * Block's mutator icon (if any). - * @type {Blockly.Mutator} - */ -Blockly.BlockSvg.prototype.mutator = null; - -/** - * Block's comment icon (if any). - * @type {Blockly.Comment} - */ -Blockly.BlockSvg.prototype.comment = null; - -/** - * Block's warning icon (if any). - * @type {Blockly.Warning} - */ -Blockly.BlockSvg.prototype.warning = null; - -/** - * Returns a list of mutator, comment, and warning icons. - * @return {!Array} List of icons. - */ -Blockly.BlockSvg.prototype.getIcons = function() { - var icons = []; - if (this.mutator) { - icons.push(this.mutator); - } - if (this.comment) { - icons.push(this.comment); - } - if (this.warning) { - icons.push(this.warning); - } - return icons; -}; - -/** - * Wrapper function called when a mouseUp occurs during a drag operation. - * @type {Array.} - * @private - */ -Blockly.BlockSvg.onMouseUpWrapper_ = null; - -/** - * Wrapper function called when a mouseMove occurs during a drag operation. - * @type {Array.} - * @private - */ -Blockly.BlockSvg.onMouseMoveWrapper_ = null; - -/** - * Stop binding to the global mouseup and mousemove events. - * @private - */ -Blockly.BlockSvg.terminateDrag_ = function() { - Blockly.BlockSvg.disconnectUiStop_(); - if (Blockly.BlockSvg.onMouseUpWrapper_) { - Blockly.unbindEvent_(Blockly.BlockSvg.onMouseUpWrapper_); - Blockly.BlockSvg.onMouseUpWrapper_ = null; - } - if (Blockly.BlockSvg.onMouseMoveWrapper_) { - Blockly.unbindEvent_(Blockly.BlockSvg.onMouseMoveWrapper_); - Blockly.BlockSvg.onMouseMoveWrapper_ = null; - } - var selected = Blockly.selected; - if (Blockly.dragMode_ == 2) { - // Terminate a drag operation. - if (selected) { - // Update the connection locations. - var xy = selected.getRelativeToSurfaceXY(); - var dxy = goog.math.Coordinate.difference(xy, selected.dragStartXY_); - selected.moveConnections_(dxy.x, dxy.y); - delete selected.draggedBubbles_; - selected.setDragging_(false); - selected.render(); - goog.Timer.callOnce( - selected.snapToGrid, Blockly.BUMP_DELAY / 2, selected); - goog.Timer.callOnce( - selected.bumpNeighbours_, Blockly.BUMP_DELAY, selected); - // Fire an event to allow scrollbars to resize. - Blockly.fireUiEvent(window, 'resize'); - selected.workspace.fireChangeEvent(); - } - } - Blockly.dragMode_ = 0; - Blockly.Css.setCursor(Blockly.Css.Cursor.OPEN); -}; - -/** - * Set parent of this block to be a new block or null. - * @param {Blockly.BlockSvg} newParent New parent block. - */ -Blockly.BlockSvg.prototype.setParent = function(newParent) { - var svgRoot = this.getSvgRoot(); - if (this.parentBlock_ && svgRoot) { - // Move this block up the DOM. Keep track of x/y translations. - var xy = this.getRelativeToSurfaceXY(); - this.workspace.getCanvas().appendChild(svgRoot); - svgRoot.setAttribute('transform', 'translate(' + xy.x + ',' + xy.y + ')'); - } - - Blockly.Field.startCache(); - Blockly.BlockSvg.superClass_.setParent.call(this, newParent); - Blockly.Field.stopCache(); - - if (newParent) { - var oldXY = this.getRelativeToSurfaceXY(); - newParent.getSvgRoot().appendChild(svgRoot); - var newXY = this.getRelativeToSurfaceXY(); - // Move the connections to match the child's new position. - this.moveConnections_(newXY.x - oldXY.x, newXY.y - oldXY.y); - } -}; - -/** - * Return the coordinates of the top-left corner of this block relative to the - * drawing surface's origin (0,0). - * @return {!goog.math.Coordinate} Object with .x and .y properties. - */ -Blockly.BlockSvg.prototype.getRelativeToSurfaceXY = function() { - var x = 0; - var y = 0; - var element = this.getSvgRoot(); - if (element) { - do { - // Loop through this block and every parent. - var xy = Blockly.getRelativeXY_(element); - x += xy.x; - y += xy.y; - element = element.parentNode; - } while (element && element != this.workspace.getCanvas()); - } - return new goog.math.Coordinate(x, y); -}; - -/** - * Move a block by a relative offset. - * @param {number} dx Horizontal offset. - * @param {number} dy Vertical offset. - */ -Blockly.BlockSvg.prototype.moveBy = function(dx, dy) { - var xy = this.getRelativeToSurfaceXY(); - this.getSvgRoot().setAttribute('transform', - 'translate(' + (xy.x + dx) + ',' + (xy.y + dy) + ')'); - this.moveConnections_(dx, dy); - Blockly.Realtime.blockChanged(this); -}; - -/** - * Snap this block to the nearest grid point. - */ -Blockly.BlockSvg.prototype.snapToGrid = function() { - if (!this.workspace) { - return; // Deleted block. - } - if (Blockly.dragMode_ != 0) { - return; // Don't bump blocks during a drag. - } - if (this.getParent()) { - return; // Only snap top-level blocks. - } - if (this.isInFlyout) { - return; // Don't move blocks around in a flyout. - } - if (!this.workspace.options.gridOptions || - !this.workspace.options.gridOptions['snap']) { - return; // Config says no snapping. - } - var spacing = this.workspace.options.gridOptions['spacing']; - var half = spacing / 2; - var xy = this.getRelativeToSurfaceXY(); - var dx = Math.round((xy.x - half) / spacing) * spacing + half - xy.x; - var dy = Math.round((xy.y - half) / spacing) * spacing + half - xy.y; - dx = Math.round(dx); - dy = Math.round(dy); - if (dx != 0 || dy != 0) { - this.moveBy(dx, dy); - } -}; - -/** - * Returns a bounding box describing the dimensions of this block - * and any blocks stacked below it. - * @return {!Object} Object with height and width properties. - */ -Blockly.BlockSvg.prototype.getHeightWidth = function() { - var height = this.height; - var width = this.width; - // Recursively add size of subsequent blocks. - var nextBlock = this.getNextBlock(); - if (nextBlock) { - var nextHeightWidth = nextBlock.getHeightWidth(); - height += nextHeightWidth.height - 4; // Height of tab. - width = Math.max(width, nextHeightWidth.width); - } else if (!this.nextConnection && !this.outputConnection) { - // Add a bit of margin under blocks with no bottom tab. - height += 2; - } - return {height: height, width: width}; -}; - -/** - * Set whether the block is collapsed or not. - * @param {boolean} collapsed True if collapsed. - */ -Blockly.BlockSvg.prototype.setCollapsed = function(collapsed) { - if (this.collapsed_ == collapsed) { - return; - } - var renderList = []; - // Show/hide the inputs. - for (var i = 0, input; input = this.inputList[i]; i++) { - renderList.push.apply(renderList, input.setVisible(!collapsed)); - } - - var COLLAPSED_INPUT_NAME = '_TEMP_COLLAPSED_INPUT'; - if (collapsed) { - var icons = this.getIcons(); - for (var i = 0; i < icons.length; i++) { - icons[i].setVisible(false); - } - var text = this.toString(Blockly.COLLAPSE_CHARS); - this.appendDummyInput(COLLAPSED_INPUT_NAME).appendField(text).init(); - } else { - this.removeInput(COLLAPSED_INPUT_NAME); - // Clear any warnings inherited from enclosed blocks. - this.setWarningText(null); - } - Blockly.BlockSvg.superClass_.setCollapsed.call(this, collapsed); - - if (!renderList.length) { - // No child blocks, just render this block. - renderList[0] = this; - } - if (this.rendered) { - for (var i = 0, block; block = renderList[i]; i++) { - block.render(); - } - // Don't bump neighbours. - // Although bumping neighbours would make sense, users often collapse - // all their functions and store them next to each other. Expanding and - // bumping causes all their definitions to go out of alignment. - } - this.workspace.fireChangeEvent(); -}; - -/** - * Handle a mouse-down on an SVG block. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.BlockSvg.prototype.onMouseDown_ = function(e) { - if (this.isInFlyout) { - return; - } - this.workspace.markFocused(); - // Update Blockly's knowledge of its own location. - Blockly.svgResize(this.workspace); - Blockly.terminateDrag_(); - this.select(); - Blockly.hideChaff(); - if (Blockly.isRightButton(e)) { - // Right-click. - this.showContextMenu_(e); - } else if (!this.isMovable()) { - // Allow unmovable blocks to be selected and context menued, but not - // dragged. Let this event bubble up to document, so the workspace may be - // dragged instead. - return; - } else { - // Left-click (or middle click) - Blockly.removeAllRanges(); - Blockly.Css.setCursor(Blockly.Css.Cursor.CLOSED); - - this.dragStartXY_ = this.getRelativeToSurfaceXY(); - this.workspace.startDrag(e, this.dragStartXY_.x, this.dragStartXY_.y); - - Blockly.dragMode_ = 1; - Blockly.BlockSvg.onMouseUpWrapper_ = Blockly.bindEvent_(document, - 'mouseup', this, this.onMouseUp_); - Blockly.BlockSvg.onMouseMoveWrapper_ = Blockly.bindEvent_(document, - 'mousemove', this, this.onMouseMove_); - // Build a list of bubbles that need to be moved and where they started. - this.draggedBubbles_ = []; - var descendants = this.getDescendants(); - for (var i = 0, descendant; descendant = descendants[i]; i++) { - var icons = descendant.getIcons(); - for (var j = 0; j < icons.length; j++) { - var data = icons[j].getIconLocation(); - data.bubble = icons[j]; - this.draggedBubbles_.push(data); - } - } - } - // This event has been handled. No need to bubble up to the document. - e.stopPropagation(); -}; - -/** - * Handle a mouse-up anywhere in the SVG pane. Is only registered when a - * block is clicked. We can't use mouseUp on the block since a fast-moving - * cursor can briefly escape the block before it catches up. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.BlockSvg.prototype.onMouseUp_ = function(e) { - var this_ = this; - Blockly.doCommand(function() { - Blockly.terminateDrag_(); - if (Blockly.selected && Blockly.highlightedConnection_) { - // Connect two blocks together. - Blockly.localConnection_.connect(Blockly.highlightedConnection_); - if (this_.rendered) { - // Trigger a connection animation. - // Determine which connection is inferior (lower in the source stack). - var inferiorConnection; - if (Blockly.localConnection_.isSuperior()) { - inferiorConnection = Blockly.highlightedConnection_; - } else { - inferiorConnection = Blockly.localConnection_; - } - inferiorConnection.sourceBlock_.connectionUiEffect(); - } - if (this_.workspace.trashcan) { - // Don't throw an object in the trash can if it just got connected. - this_.workspace.trashcan.close(); - } - } else if (!this_.getParent() && Blockly.selected.isDeletable() && - this_.workspace.isDeleteArea(e)) { - var trashcan = this_.workspace.trashcan; - if (trashcan) { - goog.Timer.callOnce(trashcan.close, 100, trashcan); - } - Blockly.selected.dispose(false, true); - // Dropping a block on the trash can will usually cause the workspace to - // resize to contain the newly positioned block. Force a second resize - // now that the block has been deleted. - Blockly.fireUiEvent(window, 'resize'); - } - if (Blockly.highlightedConnection_) { - Blockly.highlightedConnection_.unhighlight(); - Blockly.highlightedConnection_ = null; - } - Blockly.Css.setCursor(Blockly.Css.Cursor.OPEN); - }); -}; - -/** - * Load the block's help page in a new window. - * @private - */ -Blockly.BlockSvg.prototype.showHelp_ = function() { - var url = goog.isFunction(this.helpUrl) ? this.helpUrl() : this.helpUrl; - if (url) { - window.open(url); - } -}; - -/** - * Show the context menu for this block. - * @param {!Event} e Mouse event. - * @private - */ -Blockly.BlockSvg.prototype.showContextMenu_ = function(e) { - if (this.workspace.options.readOnly || !this.contextMenu) { - return; - } - // Save the current block in a variable for use in closures. - var block = this; - var options = []; - - if (this.isDeletable() && this.isMovable() && !block.isInFlyout) { - // Option to duplicate this block. - var duplicateOption = { - text: Blockly.Msg.DUPLICATE_BLOCK, - enabled: true, - callback: function() { - Blockly.duplicate_(block); - } - }; - if (this.getDescendants().length > this.workspace.remainingCapacity()) { - duplicateOption.enabled = false; - } - options.push(duplicateOption); - - if (this.isEditable() && !this.collapsed_ && - this.workspace.options.comments) { - // Option to add/remove a comment. - var commentOption = {enabled: true}; - if (this.comment) { - commentOption.text = Blockly.Msg.REMOVE_COMMENT; - commentOption.callback = function() { - block.setCommentText(null); - }; - } else { - commentOption.text = Blockly.Msg.ADD_COMMENT; - commentOption.callback = function() { - block.setCommentText(''); - }; - } - options.push(commentOption); - } - - // Option to make block inline. - if (!this.collapsed_) { - for (var i = 1; i < this.inputList.length; i++) { - if (this.inputList[i - 1].type != Blockly.NEXT_STATEMENT && - this.inputList[i].type != Blockly.NEXT_STATEMENT) { - // Only display this option if there are two value or dummy inputs - // next to each other. - var inlineOption = {enabled: true}; - var isInline = this.getInputsInline(); - inlineOption.text = isInline ? - Blockly.Msg.EXTERNAL_INPUTS : Blockly.Msg.INLINE_INPUTS; - inlineOption.callback = function() { - block.setInputsInline(!isInline); - }; - options.push(inlineOption); - break; - } - } - } - - if (this.workspace.options.collapse) { - // Option to collapse/expand block. - if (this.collapsed_) { - var expandOption = {enabled: true}; - expandOption.text = Blockly.Msg.EXPAND_BLOCK; - expandOption.callback = function() { - block.setCollapsed(false); - }; - options.push(expandOption); - } else { - var collapseOption = {enabled: true}; - collapseOption.text = Blockly.Msg.COLLAPSE_BLOCK; - collapseOption.callback = function() { - block.setCollapsed(true); - }; - options.push(collapseOption); - } - } - - if (this.workspace.options.disable) { - // Option to disable/enable block. - var disableOption = { - text: this.disabled ? - Blockly.Msg.ENABLE_BLOCK : Blockly.Msg.DISABLE_BLOCK, - enabled: !this.getInheritedDisabled(), - callback: function() { - block.setDisabled(!block.disabled); - } - }; - options.push(disableOption); - } - - // Option to delete this block. - // Count the number of blocks that are nested in this block. - var descendantCount = this.getDescendants().length; - var nextBlock = this.getNextBlock(); - if (nextBlock) { - // Blocks in the current stack would survive this block's deletion. - descendantCount -= nextBlock.getDescendants().length; - } - var deleteOption = { - text: descendantCount == 1 ? Blockly.Msg.DELETE_BLOCK : - Blockly.Msg.DELETE_X_BLOCKS.replace('%1', String(descendantCount)), - enabled: true, - callback: function() { - block.dispose(true, true); - } - }; - options.push(deleteOption); - } - - // Option to get help. - var url = goog.isFunction(this.helpUrl) ? this.helpUrl() : this.helpUrl; - var helpOption = {enabled: !!url}; - helpOption.text = Blockly.Msg.HELP; - helpOption.callback = function() { - block.showHelp_(); - }; - options.push(helpOption); - - // Allow the block to add or modify options. - if (this.customContextMenu && !block.isInFlyout) { - this.customContextMenu(options); - } - - Blockly.ContextMenu.show(e, options, this.RTL); - Blockly.ContextMenu.currentBlock = this; -}; - -/** - * Move the connections for this block and all blocks attached under it. - * Also update any attached bubbles. - * @param {number} dx Horizontal offset from current location. - * @param {number} dy Vertical offset from current location. - * @private - */ -Blockly.BlockSvg.prototype.moveConnections_ = function(dx, dy) { - if (!this.rendered) { - // Rendering is required to lay out the blocks. - // This is probably an invisible block attached to a collapsed block. - return; - } - var myConnections = this.getConnections_(false); - for (var i = 0; i < myConnections.length; i++) { - myConnections[i].moveBy(dx, dy); - } - var icons = this.getIcons(); - for (var i = 0; i < icons.length; i++) { - icons[i].computeIconLocation(); - } - - // Recurse through all blocks attached under this one. - for (var i = 0; i < this.childBlocks_.length; i++) { - this.childBlocks_[i].moveConnections_(dx, dy); - } -}; - -/** - * Recursively adds or removes the dragging class to this node and its children. - * @param {boolean} adding True if adding, false if removing. - * @private - */ -Blockly.BlockSvg.prototype.setDragging_ = function(adding) { - if (adding) { - this.addDragging(); - } else { - this.removeDragging(); - } - // Recurse through all blocks attached under this one. - for (var i = 0; i < this.childBlocks_.length; i++) { - this.childBlocks_[i].setDragging_(adding); - } -}; - -/** - * Drag this block to follow the mouse. - * @param {!Event} e Mouse move event. - * @private - */ -Blockly.BlockSvg.prototype.onMouseMove_ = function(e) { - var this_ = this; - var workspace_ = this.workspace; - Blockly.doCommand(function() { - if (e.type == 'mousemove' && e.clientX <= 1 && e.clientY == 0 && - e.button == 0) { - /* HACK: - Safari Mobile 6.0 and Chrome for Android 18.0 fire rogue mousemove - events on certain touch actions. Ignore events with these signatures. - This may result in a one-pixel blind spot in other browsers, - but this shouldn't be noticeable. */ - e.stopPropagation(); - return; - } - Blockly.removeAllRanges(); - - var oldXY = this_.getRelativeToSurfaceXY(); - var newXY = workspace_.moveDrag(e); - - var group = this_.getSvgRoot(); - if (Blockly.dragMode_ == 1) { - // Still dragging within the sticky DRAG_RADIUS. - var dr = goog.math.Coordinate.distance(oldXY, newXY) * workspace_.scale; - if (dr > Blockly.DRAG_RADIUS) { - // Switch to unrestricted dragging. - Blockly.dragMode_ = 2; - Blockly.longStop_(); - group.translate_ = ''; - group.skew_ = ''; - if (this_.parentBlock_) { - // Push this block to the very top of the stack. - this_.setParent(null); - this_.disconnectUiEffect(); - } - this_.setDragging_(true); - workspace_.recordDeleteAreas(); - } - } - if (Blockly.dragMode_ == 2) { - // Unrestricted dragging. - var dx = oldXY.x - this_.dragStartXY_.x; - var dy = oldXY.y - this_.dragStartXY_.y; - group.translate_ = 'translate(' + newXY.x + ',' + newXY.y + ')'; - group.setAttribute('transform', group.translate_ + group.skew_); - // Drag all the nested bubbles. - for (var i = 0; i < this_.draggedBubbles_.length; i++) { - var commentData = this_.draggedBubbles_[i]; - commentData.bubble.setIconLocation(commentData.x + dx, - commentData.y + dy); - } - - // Check to see if any of this block's connections are within range of - // another block's connection. - var myConnections = this_.getConnections_(false); - var closestConnection = null; - var localConnection = null; - var radiusConnection = Blockly.SNAP_RADIUS; - for (var i = 0; i < myConnections.length; i++) { - var myConnection = myConnections[i]; - var neighbour = myConnection.closest(radiusConnection, dx, dy); - if (neighbour.connection) { - closestConnection = neighbour.connection; - localConnection = myConnection; - radiusConnection = neighbour.radius; - } - } - - // Remove connection highlighting if needed. - if (Blockly.highlightedConnection_ && - Blockly.highlightedConnection_ != closestConnection) { - Blockly.highlightedConnection_.unhighlight(); - Blockly.highlightedConnection_ = null; - Blockly.localConnection_ = null; - } - // Add connection highlighting if needed. - if (closestConnection && - closestConnection != Blockly.highlightedConnection_) { - closestConnection.highlight(); - Blockly.highlightedConnection_ = closestConnection; - Blockly.localConnection_ = localConnection; - } - // Provide visual indication of whether the block will be deleted if - // dropped here. - if (this_.isDeletable()) { - workspace_.isDeleteArea(e); - } - } - // This event has been handled. No need to bubble up to the document. - e.stopPropagation(); - }); -}; - -/** - * Add or remove the UI indicating if this block is movable or not. - */ -Blockly.BlockSvg.prototype.updateMovable = function() { - if (this.isMovable()) { - Blockly.addClass_(/** @type {!Element} */ (this.svgGroup_), - 'blocklyDraggable'); - } else { - Blockly.removeClass_(/** @type {!Element} */ (this.svgGroup_), - 'blocklyDraggable'); - } -}; - -/** - * Set whether this block is movable or not. - * @param {boolean} movable True if movable. - */ -Blockly.BlockSvg.prototype.setMovable = function(movable) { - Blockly.BlockSvg.superClass_.setMovable.call(this, movable); - this.updateMovable(); -}; - -/** - * Set whether this block is editable or not. - * @param {boolean} movable True if editable. - */ -Blockly.BlockSvg.prototype.setEditable = function(editable) { - Blockly.BlockSvg.superClass_.setEditable.call(this, editable); - if (this.rendered) { - for (var i = 0; i < this.icons_.length; i++) { - this.icons_[i].updateEditable(); - } - } -}; - -/** - * Return the root node of the SVG or null if none exists. - * @return {Element} The root SVG node (probably a group). - */ -Blockly.BlockSvg.prototype.getSvgRoot = function() { - return this.svgGroup_; -}; - -// UI constants for rendering blocks. -/** - * Horizontal space between elements. - * @const - */ -Blockly.BlockSvg.SEP_SPACE_X = 10; -/** - * Vertical space between elements. - * @const - */ -Blockly.BlockSvg.SEP_SPACE_Y = 10; -/** - * Vertical padding around inline elements. - * @const - */ -Blockly.BlockSvg.INLINE_PADDING_Y = 5; -/** - * Minimum height of a block. - * @const - */ -Blockly.BlockSvg.MIN_BLOCK_Y = 25; -/** - * Height of horizontal puzzle tab. - * @const - */ -Blockly.BlockSvg.TAB_HEIGHT = 20; -/** - * Width of horizontal puzzle tab. - * @const - */ -Blockly.BlockSvg.TAB_WIDTH = 8; -/** - * Width of vertical tab (inc left margin). - * @const - */ -Blockly.BlockSvg.NOTCH_WIDTH = 30; -/** - * Rounded corner radius. - * @const - */ -Blockly.BlockSvg.CORNER_RADIUS = 8; -/** - * Do blocks with no previous or output connections have a 'hat' on top? - * @const - */ -Blockly.BlockSvg.START_HAT = false; -/** - * Path of the top hat's curve. - * @const - */ -Blockly.BlockSvg.START_HAT_PATH = 'c 30,-15 70,-15 100,0'; -/** - * Path of the top hat's curve's highlight in LTR. - * @const - */ -Blockly.BlockSvg.START_HAT_HIGHLIGHT_LTR = - 'c 17.8,-9.2 45.3,-14.9 75,-8.7 M 100.5,0.5'; -/** - * Path of the top hat's curve's highlight in RTL. - * @const - */ -Blockly.BlockSvg.START_HAT_HIGHLIGHT_RTL = - 'm 25,-8.7 c 29.7,-6.2 57.2,-0.5 75,8.7'; -/** - * Distance from shape edge to intersect with a curved corner at 45 degrees. - * Applies to highlighting on around the inside of a curve. - * @const - */ -Blockly.BlockSvg.DISTANCE_45_INSIDE = (1 - Math.SQRT1_2) * - (Blockly.BlockSvg.CORNER_RADIUS - 0.5) + 0.5; -/** - * Distance from shape edge to intersect with a curved corner at 45 degrees. - * Applies to highlighting on around the outside of a curve. - * @const - */ -Blockly.BlockSvg.DISTANCE_45_OUTSIDE = (1 - Math.SQRT1_2) * - (Blockly.BlockSvg.CORNER_RADIUS + 0.5) - 0.5; -/** - * SVG path for drawing next/previous notch from left to right. - * @const - */ -Blockly.BlockSvg.NOTCH_PATH_LEFT = 'l 6,4 3,0 6,-4'; -/** - * SVG path for drawing next/previous notch from left to right with - * highlighting. - * @const - */ -Blockly.BlockSvg.NOTCH_PATH_LEFT_HIGHLIGHT = 'l 6,4 3,0 6,-4'; -/** - * SVG path for drawing next/previous notch from right to left. - * @const - */ -Blockly.BlockSvg.NOTCH_PATH_RIGHT = 'l -6,4 -3,0 -6,-4'; -/** - * SVG path for drawing jagged teeth at the end of collapsed blocks. - * @const - */ -Blockly.BlockSvg.JAGGED_TEETH = 'l 8,0 0,4 8,4 -16,8 8,4'; -/** - * Height of SVG path for jagged teeth at the end of collapsed blocks. - * @const - */ -Blockly.BlockSvg.JAGGED_TEETH_HEIGHT = 20; -/** - * Width of SVG path for jagged teeth at the end of collapsed blocks. - * @const - */ -Blockly.BlockSvg.JAGGED_TEETH_WIDTH = 15; -/** - * SVG path for drawing a horizontal puzzle tab from top to bottom. - * @const - */ -Blockly.BlockSvg.TAB_PATH_DOWN = 'v 5 c 0,10 -' + Blockly.BlockSvg.TAB_WIDTH + - ',-8 -' + Blockly.BlockSvg.TAB_WIDTH + ',7.5 s ' + - Blockly.BlockSvg.TAB_WIDTH + ',-2.5 ' + Blockly.BlockSvg.TAB_WIDTH + ',7.5'; -/** - * SVG path for drawing a horizontal puzzle tab from top to bottom with - * highlighting from the upper-right. - * @const - */ -Blockly.BlockSvg.TAB_PATH_DOWN_HIGHLIGHT_RTL = 'v 6.5 m -' + - (Blockly.BlockSvg.TAB_WIDTH * 0.97) + ',3 q -' + - (Blockly.BlockSvg.TAB_WIDTH * 0.05) + ',10 ' + - (Blockly.BlockSvg.TAB_WIDTH * 0.3) + ',9.5 m ' + - (Blockly.BlockSvg.TAB_WIDTH * 0.67) + ',-1.9 v 1.4'; - -/** - * SVG start point for drawing the top-left corner. - * @const - */ -Blockly.BlockSvg.TOP_LEFT_CORNER_START = - 'm 0,' + Blockly.BlockSvg.CORNER_RADIUS; -/** - * SVG start point for drawing the top-left corner's highlight in RTL. - * @const - */ -Blockly.BlockSvg.TOP_LEFT_CORNER_START_HIGHLIGHT_RTL = - 'm ' + Blockly.BlockSvg.DISTANCE_45_INSIDE + ',' + - Blockly.BlockSvg.DISTANCE_45_INSIDE; -/** - * SVG start point for drawing the top-left corner's highlight in LTR. - * @const - */ -Blockly.BlockSvg.TOP_LEFT_CORNER_START_HIGHLIGHT_LTR = - 'm 0.5,' + (Blockly.BlockSvg.CORNER_RADIUS - 0.5); -/** - * SVG path for drawing the rounded top-left corner. - * @const - */ -Blockly.BlockSvg.TOP_LEFT_CORNER = - 'A ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 ' + - Blockly.BlockSvg.CORNER_RADIUS + ',0'; -/** - * SVG path for drawing the highlight on the rounded top-left corner. - * @const - */ -Blockly.BlockSvg.TOP_LEFT_CORNER_HIGHLIGHT = - 'A ' + (Blockly.BlockSvg.CORNER_RADIUS - 0.5) + ',' + - (Blockly.BlockSvg.CORNER_RADIUS - 0.5) + ' 0 0,1 ' + - Blockly.BlockSvg.CORNER_RADIUS + ',0.5'; -/** - * SVG path for drawing the top-left corner of a statement input. - * Includes the top notch, a horizontal space, and the rounded inside corner. - * @const - */ -Blockly.BlockSvg.INNER_TOP_LEFT_CORNER = - Blockly.BlockSvg.NOTCH_PATH_RIGHT + ' h -' + - (Blockly.BlockSvg.NOTCH_WIDTH - 15 - Blockly.BlockSvg.CORNER_RADIUS) + - ' h -0.5 a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 -' + - Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS; -/** - * SVG path for drawing the bottom-left corner of a statement input. - * Includes the rounded inside corner. - * @const - */ -Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER = - 'a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + - Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS; -/** - * SVG path for drawing highlight on the top-left corner of a statement - * input in RTL. - * @const - */ -Blockly.BlockSvg.INNER_TOP_LEFT_CORNER_HIGHLIGHT_RTL = - 'a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + - (-Blockly.BlockSvg.DISTANCE_45_OUTSIDE - 0.5) + ',' + - (Blockly.BlockSvg.CORNER_RADIUS - - Blockly.BlockSvg.DISTANCE_45_OUTSIDE); -/** - * SVG path for drawing highlight on the bottom-left corner of a statement - * input in RTL. - * @const - */ -Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_RTL = - 'a ' + (Blockly.BlockSvg.CORNER_RADIUS + 0.5) + ',' + - (Blockly.BlockSvg.CORNER_RADIUS + 0.5) + ' 0 0,0 ' + - (Blockly.BlockSvg.CORNER_RADIUS + 0.5) + ',' + - (Blockly.BlockSvg.CORNER_RADIUS + 0.5); -/** - * SVG path for drawing highlight on the bottom-left corner of a statement - * input in LTR. - * @const - */ -Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_LTR = - 'a ' + (Blockly.BlockSvg.CORNER_RADIUS + 0.5) + ',' + - (Blockly.BlockSvg.CORNER_RADIUS + 0.5) + ' 0 0,0 ' + - (Blockly.BlockSvg.CORNER_RADIUS - - Blockly.BlockSvg.DISTANCE_45_OUTSIDE) + ',' + - (Blockly.BlockSvg.DISTANCE_45_OUTSIDE + 0.5); - -/** - * Dispose of this block. - * @param {boolean} healStack If true, then try to heal any gap by connecting - * the next statement with the previous statement. Otherwise, dispose of - * all children of this block. - * @param {boolean} animate If true, show a disposal animation and sound. - * @param {boolean=} opt_dontRemoveFromWorkspace If true, don't remove this - * block from the workspace's list of top blocks. - */ -Blockly.BlockSvg.prototype.dispose = function(healStack, animate, - opt_dontRemoveFromWorkspace) { - Blockly.Field.startCache(); - // Terminate onchange event calls. - if (this.onchangeWrapper_) { - Blockly.unbindEvent_(this.onchangeWrapper_); - this.onchangeWrapper_ = null; - } - // If this block is being dragged, unlink the mouse events. - if (Blockly.selected == this) { - Blockly.terminateDrag_(); - } - // If this block has a context menu open, close it. - if (Blockly.ContextMenu.currentBlock == this) { - Blockly.ContextMenu.hide(); - } - - if (animate && this.rendered) { - this.disposeUiEffect(); - } - // Stop rerendering. - this.rendered = false; - - var icons = this.getIcons(); - for (var i = 0; i < icons.length; i++) { - icons[i].dispose(); - } - - Blockly.BlockSvg.superClass_.dispose.call(this, healStack); - - goog.dom.removeNode(this.svgGroup_); - // Sever JavaScript to DOM connections. - this.svgGroup_ = null; - this.svgPath_ = null; - this.svgPathLight_ = null; - this.svgPathDark_ = null; - Blockly.Field.stopCache(); -}; - -/** - * Play some UI effects (sound, animation) when disposing of a block. - */ -Blockly.BlockSvg.prototype.disposeUiEffect = function() { - this.workspace.playAudio('delete'); - - var xy = Blockly.getSvgXY_(/** @type {!Element} */ (this.svgGroup_), - this.workspace); - // Deeply clone the current block. - var clone = this.svgGroup_.cloneNode(true); - clone.translateX_ = xy.x; - clone.translateY_ = xy.y; - clone.setAttribute('transform', - 'translate(' + clone.translateX_ + ',' + clone.translateY_ + ')'); - this.workspace.options.svg.appendChild(clone); - clone.bBox_ = clone.getBBox(); - // Start the animation. - Blockly.BlockSvg.disposeUiStep_(clone, this.RTL, new Date(), - this.workspace.scale); -}; - -/** - * Animate a cloned block and eventually dispose of it. - * This is a class method, not an instace method since the original block has - * been destroyed and is no longer accessible. - * @param {!Element} clone SVG element to animate and dispose of. - * @param {boolean} rtl True if RTL, false if LTR. - * @param {!Date} start Date of animation's start. - * @param {number} workspaceScale Scale of workspace. - * @private - */ -Blockly.BlockSvg.disposeUiStep_ = function(clone, rtl, start, workspaceScale) { - var ms = (new Date()) - start; - var percent = ms / 150; - if (percent > 1) { - goog.dom.removeNode(clone); - } else { - var x = clone.translateX_ + - (rtl ? -1 : 1) * clone.bBox_.width * workspaceScale / 2 * percent; - var y = clone.translateY_ + clone.bBox_.height * workspaceScale * percent; - var scale = (1 - percent) * workspaceScale; - clone.setAttribute('transform', 'translate(' + x + ',' + y + ')' + - ' scale(' + scale + ')'); - var closure = function() { - Blockly.BlockSvg.disposeUiStep_(clone, rtl, start, workspaceScale); - }; - setTimeout(closure, 10); - } -}; - -/** - * Play some UI effects (sound, ripple) after a connection has been established. - */ -Blockly.BlockSvg.prototype.connectionUiEffect = function() { - this.workspace.playAudio('click'); - if (this.workspace.scale < 1) { - return; // Too small to care about visual effects. - } - // Determine the absolute coordinates of the inferior block. - var xy = Blockly.getSvgXY_(/** @type {!Element} */ (this.svgGroup_), - this.workspace); - // Offset the coordinates based on the two connection types, fix scale. - if (this.outputConnection) { - xy.x += (this.RTL ? 3 : -3) * this.workspace.scale; - xy.y += 13 * this.workspace.scale; - } else if (this.previousConnection) { - xy.x += (this.RTL ? -23 : 23) * this.workspace.scale; - xy.y += 3 * this.workspace.scale; - } - var ripple = Blockly.createSvgElement('circle', - {'cx': xy.x, 'cy': xy.y, 'r': 0, 'fill': 'none', - 'stroke': '#888', 'stroke-width': 10}, - this.workspace.options.svg); - // Start the animation. - Blockly.BlockSvg.connectionUiStep_(ripple, new Date(), this.workspace.scale); -}; - -/** - * Expand a ripple around a connection. - * @param {!Element} ripple Element to animate. - * @param {!Date} start Date of animation's start. - * @param {number} workspaceScale Scale of workspace. - * @private - */ -Blockly.BlockSvg.connectionUiStep_ = function(ripple, start, workspaceScale) { - var ms = (new Date()) - start; - var percent = ms / 150; - if (percent > 1) { - goog.dom.removeNode(ripple); - } else { - ripple.setAttribute('r', percent * 25 * workspaceScale); - ripple.style.opacity = 1 - percent; - var closure = function() { - Blockly.BlockSvg.connectionUiStep_(ripple, start, workspaceScale); - }; - Blockly.BlockSvg.disconnectUiStop_.pid_ = setTimeout(closure, 10); - } -}; - -/** - * Play some UI effects (sound, animation) when disconnecting a block. - */ -Blockly.BlockSvg.prototype.disconnectUiEffect = function() { - this.workspace.playAudio('disconnect'); - if (this.workspace.scale < 1) { - return; // Too small to care about visual effects. - } - // Horizontal distance for bottom of block to wiggle. - var DISPLACEMENT = 10; - // Scale magnitude of skew to height of block. - var height = this.getHeightWidth().height; - var magnitude = Math.atan(DISPLACEMENT / height) / Math.PI * 180; - if (!this.RTL) { - magnitude *= -1; - } - // Start the animation. - Blockly.BlockSvg.disconnectUiStep_(this.svgGroup_, magnitude, new Date()); -}; - -/** - * Animate a brief wiggle of a disconnected block. - * @param {!Element} group SVG element to animate. - * @param {number} magnitude Maximum degrees skew (reversed for RTL). - * @param {!Date} start Date of animation's start. - * @private - */ -Blockly.BlockSvg.disconnectUiStep_ = function(group, magnitude, start) { - var DURATION = 200; // Milliseconds. - var WIGGLES = 3; // Half oscillations. - - var ms = (new Date()) - start; - var percent = ms / DURATION; - - if (percent > 1) { - group.skew_ = ''; - } else { - var skew = Math.round(Math.sin(percent * Math.PI * WIGGLES) * - (1 - percent) * magnitude); - group.skew_ = 'skewX(' + skew + ')'; - var closure = function() { - Blockly.BlockSvg.disconnectUiStep_(group, magnitude, start); - }; - Blockly.BlockSvg.disconnectUiStop_.group = group; - Blockly.BlockSvg.disconnectUiStop_.pid = setTimeout(closure, 10); - } - group.setAttribute('transform', group.translate_ + group.skew_); -}; - -/** - * Stop the disconnect UI animation immediately. - * @private - */ -Blockly.BlockSvg.disconnectUiStop_ = function() { - if (Blockly.BlockSvg.disconnectUiStop_.group) { - clearTimeout(Blockly.BlockSvg.disconnectUiStop_.pid); - var group = Blockly.BlockSvg.disconnectUiStop_.group - group.skew_ = ''; - group.setAttribute('transform', group.translate_); - Blockly.BlockSvg.disconnectUiStop_.group = null; - } -}; - -/** - * PID of disconnect UI animation. There can only be one at a time. - * @type {number} - */ -Blockly.BlockSvg.disconnectUiStop_.pid = 0; - -/** - * SVG group of wobbling block. There can only be one at a time. - * @type {Element} - */ -Blockly.BlockSvg.disconnectUiStop_.group = null; - -/** - * Change the colour of a block. - */ -Blockly.BlockSvg.prototype.updateColour = function() { - if (this.disabled) { - // Disabled blocks don't have colour. - return; - } - var hexColour = Blockly.makeColour(this.getColour()); - var rgb = goog.color.hexToRgb(hexColour); - if (this.isShadow()) { - rgb = goog.color.lighten(rgb, 0.6); - hexColour = goog.color.rgbArrayToHex(rgb); - this.svgPathLight_.style.display = 'none'; - this.svgPathDark_.setAttribute('fill', hexColour); - } else { - this.svgPathLight_.style.display = ''; - var hexLight = goog.color.rgbArrayToHex(goog.color.lighten(rgb, 0.3)); - var hexDark = goog.color.rgbArrayToHex(goog.color.darken(rgb, 0.2)); - this.svgPathLight_.setAttribute('stroke', hexLight); - this.svgPathDark_.setAttribute('fill', hexDark); - } - this.svgPath_.setAttribute('fill', hexColour); - - var icons = this.getIcons(); - for (var i = 0; i < icons.length; i++) { - icons[i].updateColour(); - } - - // Bump every dropdown to change its colour. - for (var x = 0, input; input = this.inputList[x]; x++) { - for (var y = 0, field; field = input.fieldRow[y]; y++) { - field.setText(null); - } - } -}; - -/** - * Enable or disable a block. - */ -Blockly.BlockSvg.prototype.updateDisabled = function() { - var hasClass = Blockly.hasClass_(/** @type {!Element} */ (this.svgGroup_), - 'blocklyDisabled'); - if (this.disabled || this.getInheritedDisabled()) { - if (!hasClass) { - Blockly.addClass_(/** @type {!Element} */ (this.svgGroup_), - 'blocklyDisabled'); - this.svgPath_.setAttribute('fill', - 'url(#' + this.workspace.options.disabledPatternId + ')'); - } - } else { - if (hasClass) { - Blockly.removeClass_(/** @type {!Element} */ (this.svgGroup_), - 'blocklyDisabled'); - this.updateColour(); - } - } - var children = this.getChildren(); - for (var i = 0, child; child = children[i]; i++) { - child.updateDisabled(); - } -}; - -/** - * Returns the comment on this block (or '' if none). - * @return {string} Block's comment. - */ -Blockly.BlockSvg.prototype.getCommentText = function() { - if (this.comment) { - var comment = this.comment.getText(); - // Trim off trailing whitespace. - return comment.replace(/\s+$/, '').replace(/ +\n/g, '\n'); - } - return ''; -}; - -/** - * Set this block's comment text. - * @param {?string} text The text, or null to delete. - */ -Blockly.BlockSvg.prototype.setCommentText = function(text) { - var changedState = false; - if (goog.isString(text)) { - if (!this.comment) { - this.comment = new Blockly.Comment(this); - changedState = true; - } - this.comment.setText(/** @type {string} */ (text)); - } else { - if (this.comment) { - this.comment.dispose(); - changedState = true; - } - } - if (changedState && this.rendered) { - this.render(); - // Adding or removing a comment icon will cause the block to change shape. - this.bumpNeighbours_(); - } -}; - -/** - * Set this block's warning text. - * @param {?string} text The text, or null to delete. - * @param {string=} opt_id An optional ID for the warning text to be able to - * maintain multiple warnings. - */ -Blockly.BlockSvg.prototype.setWarningText = function(text, opt_id) { - if (!this.setWarningText.pid_) { - // Create a database of warning PIDs. - // Only runs once per block (and only those with warnings). - this.setWarningText.pid_ = Object.create(null); - } - var id = opt_id || ''; - if (!id) { - // Kill all previous pending processes, this edit supercedes them all. - for (var n in this.setWarningText.pid_) { - clearTimeout(this.setWarningText.pid_[n]); - delete this.setWarningText.pid_[n]; - } - } else if (this.setWarningText.pid_[id]) { - // Only queue up the latest change. Kill any earlier pending process. - clearTimeout(this.setWarningText.pid_[id]); - delete this.setWarningText.pid_[id]; - } - if (Blockly.dragMode_ == 2) { - // Don't change the warning text during a drag. - // Wait until the drag finishes. - var thisBlock = this; - this.setWarningText.pid_[id] = setTimeout(function() { - if (thisBlock.workspace) { // Check block wasn't deleted. - delete thisBlock.setWarningText.pid_[id]; - thisBlock.setWarningText(text, id); - } - }, 100); - return; - } - if (this.isInFlyout) { - text = null; - } - - // Bubble up to add a warning on top-most collapsed block. - var parent = this.getSurroundParent(); - var collapsedParent = null; - while (parent) { - if (parent.isCollapsed()) { - collapsedParent = parent; - } - parent = parent.getSurroundParent(); - } - if (collapsedParent) { - collapsedParent.setWarningText(text, 'collapsed ' + this.id + ' ' + id); - } - - var changedState = false; - if (goog.isString(text)) { - if (!this.warning) { - this.warning = new Blockly.Warning(this); - changedState = true; - } - this.warning.setText(/** @type {string} */ (text), id); - } else { - // Dispose all warnings if no id is given. - if (this.warning && !id) { - this.warning.dispose(); - changedState = true; - } else if (this.warning) { - var oldText = this.warning.getText(); - this.warning.setText('', id); - var newText = this.warning.getText(); - if (!newText) { - this.warning.dispose(); - } - changedState = oldText == newText; - } - } - if (changedState && this.rendered) { - this.render(); - // Adding or removing a warning icon will cause the block to change shape. - this.bumpNeighbours_(); - } -}; - -/** - * Give this block a mutator dialog. - * @param {Blockly.Mutator} mutator A mutator dialog instance or null to remove. - */ -Blockly.BlockSvg.prototype.setMutator = function(mutator) { - if (this.mutator && this.mutator !== mutator) { - this.mutator.dispose(); - } - if (mutator) { - mutator.block_ = this; - this.mutator = mutator; - if (this.rendered) { - mutator.createIcon(); - } - } -}; - -/** - * Set whether the block is disabled or not. - * @param {boolean} disabled True if disabled. - */ -Blockly.BlockSvg.prototype.setDisabled = function(disabled) { - if (this.disabled == disabled) { - return; - } - Blockly.BlockSvg.superClass_.setDisabled.call(this, disabled); - if (this.rendered) { - this.updateDisabled(); - } - this.workspace.fireChangeEvent(); -}; - -/** - * Select this block. Highlight it visually. - */ -Blockly.BlockSvg.prototype.addSelect = function() { - Blockly.addClass_(/** @type {!Element} */ (this.svgGroup_), - 'blocklySelected'); - // Move the selected block to the top of the stack. - this.svgGroup_.parentNode.appendChild(this.svgGroup_); -}; - -/** - * Unselect this block. Remove its highlighting. - */ -Blockly.BlockSvg.prototype.removeSelect = function() { - Blockly.removeClass_(/** @type {!Element} */ (this.svgGroup_), - 'blocklySelected'); -}; - -/** - * Adds the dragging class to this block. - * Also disables the highlights/shadows to improve performance. - */ -Blockly.BlockSvg.prototype.addDragging = function() { - Blockly.addClass_(/** @type {!Element} */ (this.svgGroup_), - 'blocklyDragging'); -}; - -/** - * Removes the dragging class from this block. - */ -Blockly.BlockSvg.prototype.removeDragging = function() { - Blockly.removeClass_(/** @type {!Element} */ (this.svgGroup_), - 'blocklyDragging'); -}; - -/** - * Render the block. - * Lays out and reflows a block based on its contents and settings. - * @param {boolean=} opt_bubble If false, just render this block. - * If true, also render block's parent, grandparent, etc. Defaults to true. - */ -Blockly.BlockSvg.prototype.render = function(opt_bubble) { - Blockly.Field.startCache(); - this.rendered = true; - - var cursorX = Blockly.BlockSvg.SEP_SPACE_X; - if (this.RTL) { - cursorX = -cursorX; - } - // Move the icons into position. - var icons = this.getIcons(); - for (var i = 0; i < icons.length; i++) { - cursorX = icons[i].renderIcon(cursorX); - } - cursorX += this.RTL ? - Blockly.BlockSvg.SEP_SPACE_X : -Blockly.BlockSvg.SEP_SPACE_X; - // If there are no icons, cursorX will be 0, otherwise it will be the - // width that the first label needs to move over by. - - var inputRows = this.renderCompute_(cursorX); - this.renderDraw_(cursorX, inputRows); - - if (opt_bubble !== false) { - // Render all blocks above this one (propagate a reflow). - var parentBlock = this.getParent(); - if (parentBlock) { - parentBlock.render(true); - } else { - // Top-most block. Fire an event to allow scrollbars to resize. - Blockly.fireUiEvent(window, 'resize'); - } - } - Blockly.Field.stopCache(); - Blockly.Realtime.blockChanged(this); -}; - -/** - * Render a list of fields starting at the specified location. - * @param {!Array.} fieldList List of fields. - * @param {number} cursorX X-coordinate to start the fields. - * @param {number} cursorY Y-coordinate to start the fields. - * @return {number} X-coordinate of the end of the field row (plus a gap). - * @private - */ -Blockly.BlockSvg.prototype.renderFields_ = - function(fieldList, cursorX, cursorY) { - cursorY += Blockly.BlockSvg.INLINE_PADDING_Y; - if (this.RTL) { - cursorX = -cursorX; - } - for (var t = 0, field; field = fieldList[t]; t++) { - var root = field.getSvgRoot(); - if (!root) { - continue; - } - if (this.RTL) { - cursorX -= field.renderSep + field.renderWidth; - root.setAttribute('transform', - 'translate(' + cursorX + ',' + cursorY + ')'); - if (field.renderWidth) { - cursorX -= Blockly.BlockSvg.SEP_SPACE_X; - } - } else { - root.setAttribute('transform', - 'translate(' + (cursorX + field.renderSep) + ',' + cursorY + ')'); - if (field.renderWidth) { - cursorX += field.renderSep + field.renderWidth + - Blockly.BlockSvg.SEP_SPACE_X; - } - } - } - return this.RTL ? -cursorX : cursorX; -}; - -/** - * Computes the height and widths for each row and field. - * @param {number} iconWidth Offset of first row due to icons. - * @return {!Array.>} 2D array of objects, each containing - * position information. - * @private - */ -Blockly.BlockSvg.prototype.renderCompute_ = function(iconWidth) { - var inputList = this.inputList; - var inputRows = []; - inputRows.rightEdge = iconWidth + Blockly.BlockSvg.SEP_SPACE_X * 2; - if (this.previousConnection || this.nextConnection) { - inputRows.rightEdge = Math.max(inputRows.rightEdge, - Blockly.BlockSvg.NOTCH_WIDTH + Blockly.BlockSvg.SEP_SPACE_X); - } - var fieldValueWidth = 0; // Width of longest external value field. - var fieldStatementWidth = 0; // Width of longest statement field. - var hasValue = false; - var hasStatement = false; - var hasDummy = false; - var lastType = undefined; - var isInline = this.getInputsInline() && !this.isCollapsed(); - for (var i = 0, input; input = inputList[i]; i++) { - if (!input.isVisible()) { - continue; - } - var row; - if (!isInline || !lastType || - lastType == Blockly.NEXT_STATEMENT || - input.type == Blockly.NEXT_STATEMENT) { - // Create new row. - lastType = input.type; - row = []; - if (isInline && input.type != Blockly.NEXT_STATEMENT) { - row.type = Blockly.BlockSvg.INLINE; - } else { - row.type = input.type; - } - row.height = 0; - inputRows.push(row); - } else { - row = inputRows[inputRows.length - 1]; - } - row.push(input); - - // Compute minimum input size. - input.renderHeight = Blockly.BlockSvg.MIN_BLOCK_Y; - // The width is currently only needed for inline value inputs. - if (isInline && input.type == Blockly.INPUT_VALUE) { - input.renderWidth = Blockly.BlockSvg.TAB_WIDTH + - Blockly.BlockSvg.SEP_SPACE_X * 1.25; - } else { - input.renderWidth = 0; - } - // Expand input size if there is a connection. - if (input.connection && input.connection.targetConnection) { - var linkedBlock = input.connection.targetBlock(); - var bBox = linkedBlock.getHeightWidth(); - input.renderHeight = Math.max(input.renderHeight, bBox.height); - input.renderWidth = Math.max(input.renderWidth, bBox.width); - } - // Blocks have a one pixel shadow that should sometimes overhang. - if (!isInline && i == inputList.length - 1) { - // Last value input should overhang. - input.renderHeight--; - } else if (!isInline && input.type == Blockly.INPUT_VALUE && - inputList[i + 1] && inputList[i + 1].type == Blockly.NEXT_STATEMENT) { - // Value input above statement input should overhang. - input.renderHeight--; - } - - row.height = Math.max(row.height, input.renderHeight); - input.fieldWidth = 0; - if (inputRows.length == 1) { - // The first row gets shifted to accommodate any icons. - input.fieldWidth += this.RTL ? -iconWidth : iconWidth; - } - var previousFieldEditable = false; - for (var j = 0, field; field = input.fieldRow[j]; j++) { - if (j != 0) { - input.fieldWidth += Blockly.BlockSvg.SEP_SPACE_X; - } - // Get the dimensions of the field. - var fieldSize = field.getSize(); - field.renderWidth = fieldSize.width; - field.renderSep = (previousFieldEditable && field.EDITABLE) ? - Blockly.BlockSvg.SEP_SPACE_X : 0; - input.fieldWidth += field.renderWidth + field.renderSep; - row.height = Math.max(row.height, fieldSize.height); - previousFieldEditable = field.EDITABLE; - } - - if (row.type != Blockly.BlockSvg.INLINE) { - if (row.type == Blockly.NEXT_STATEMENT) { - hasStatement = true; - fieldStatementWidth = Math.max(fieldStatementWidth, input.fieldWidth); - } else { - if (row.type == Blockly.INPUT_VALUE) { - hasValue = true; - } else if (row.type == Blockly.DUMMY_INPUT) { - hasDummy = true; - } - fieldValueWidth = Math.max(fieldValueWidth, input.fieldWidth); - } - } - } - - // Make inline rows a bit thicker in order to enclose the values. - for (var y = 0, row; row = inputRows[y]; y++) { - row.thicker = false; - if (row.type == Blockly.BlockSvg.INLINE) { - for (var z = 0, input; input = row[z]; z++) { - if (input.type == Blockly.INPUT_VALUE) { - row.height += 2 * Blockly.BlockSvg.INLINE_PADDING_Y; - row.thicker = true; - break; - } - } - } - } - - // Compute the statement edge. - // This is the width of a block where statements are nested. - inputRows.statementEdge = 2 * Blockly.BlockSvg.SEP_SPACE_X + - fieldStatementWidth; - // Compute the preferred right edge. Inline blocks may extend beyond. - // This is the width of the block where external inputs connect. - if (hasStatement) { - inputRows.rightEdge = Math.max(inputRows.rightEdge, - inputRows.statementEdge + Blockly.BlockSvg.NOTCH_WIDTH); - } - if (hasValue) { - inputRows.rightEdge = Math.max(inputRows.rightEdge, fieldValueWidth + - Blockly.BlockSvg.SEP_SPACE_X * 2 + Blockly.BlockSvg.TAB_WIDTH); - } else if (hasDummy) { - inputRows.rightEdge = Math.max(inputRows.rightEdge, fieldValueWidth + - Blockly.BlockSvg.SEP_SPACE_X * 2); - } - - inputRows.hasValue = hasValue; - inputRows.hasStatement = hasStatement; - inputRows.hasDummy = hasDummy; - return inputRows; -}; - - -/** - * Draw the path of the block. - * Move the fields to the correct locations. - * @param {number} iconWidth Offset of first row due to icons. - * @param {!Array.>} inputRows 2D array of objects, each - * containing position information. - * @private - */ -Blockly.BlockSvg.prototype.renderDraw_ = function(iconWidth, inputRows) { - this.startHat_ = false; - // Should the top and bottom left corners be rounded or square? - if (this.outputConnection) { - this.squareTopLeftCorner_ = true; - this.squareBottomLeftCorner_ = true; - } else { - this.squareTopLeftCorner_ = false; - this.squareBottomLeftCorner_ = false; - // If this block is in the middle of a stack, square the corners. - if (this.previousConnection) { - var prevBlock = this.previousConnection.targetBlock(); - if (prevBlock && prevBlock.getNextBlock() == this) { - this.squareTopLeftCorner_ = true; - } - } else if (Blockly.BlockSvg.START_HAT) { - // No output or previous connection. - this.squareTopLeftCorner_ = true; - this.startHat_ = true; - inputRows.rightEdge = Math.max(inputRows.rightEdge, 100); - } - var nextBlock = this.getNextBlock(); - if (nextBlock) { - this.squareBottomLeftCorner_ = true; - } - } - - // Fetch the block's coordinates on the surface for use in anchoring - // the connections. - var connectionsXY = this.getRelativeToSurfaceXY(); - - // Assemble the block's path. - var steps = []; - var inlineSteps = []; - // The highlighting applies to edges facing the upper-left corner. - // Since highlighting is a two-pixel wide border, it would normally overhang - // the edge of the block by a pixel. So undersize all measurements by a pixel. - var highlightSteps = []; - var highlightInlineSteps = []; - - this.renderDrawTop_(steps, highlightSteps, connectionsXY, - inputRows.rightEdge); - var cursorY = this.renderDrawRight_(steps, highlightSteps, inlineSteps, - highlightInlineSteps, connectionsXY, inputRows, iconWidth); - this.renderDrawBottom_(steps, highlightSteps, connectionsXY, cursorY); - this.renderDrawLeft_(steps, highlightSteps, connectionsXY, cursorY); - - var pathString = steps.join(' ') + '\n' + inlineSteps.join(' '); - this.svgPath_.setAttribute('d', pathString); - this.svgPathDark_.setAttribute('d', pathString); - pathString = highlightSteps.join(' ') + '\n' + highlightInlineSteps.join(' '); - this.svgPathLight_.setAttribute('d', pathString); - if (this.RTL) { - // Mirror the block's path. - this.svgPath_.setAttribute('transform', 'scale(-1 1)'); - this.svgPathLight_.setAttribute('transform', 'scale(-1 1)'); - this.svgPathDark_.setAttribute('transform', 'translate(1,1) scale(-1 1)'); - } -}; - -/** - * Render the top edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {!Array.} highlightSteps Path of block highlights. - * @param {!Object} connectionsXY Location of block. - * @param {number} rightEdge Minimum width of block. - * @private - */ -Blockly.BlockSvg.prototype.renderDrawTop_ = - function(steps, highlightSteps, connectionsXY, rightEdge) { - // Position the cursor at the top-left starting point. - if (this.squareTopLeftCorner_) { - steps.push('m 0,0'); - highlightSteps.push('m 0.5,0.5'); - if (this.startHat_) { - steps.push(Blockly.BlockSvg.START_HAT_PATH); - highlightSteps.push(this.RTL ? - Blockly.BlockSvg.START_HAT_HIGHLIGHT_RTL : - Blockly.BlockSvg.START_HAT_HIGHLIGHT_LTR); - } - } else { - steps.push(Blockly.BlockSvg.TOP_LEFT_CORNER_START); - highlightSteps.push(this.RTL ? - Blockly.BlockSvg.TOP_LEFT_CORNER_START_HIGHLIGHT_RTL : - Blockly.BlockSvg.TOP_LEFT_CORNER_START_HIGHLIGHT_LTR); - // Top-left rounded corner. - steps.push(Blockly.BlockSvg.TOP_LEFT_CORNER); - highlightSteps.push(Blockly.BlockSvg.TOP_LEFT_CORNER_HIGHLIGHT); - } - - // Top edge. - if (this.previousConnection) { - steps.push('H', Blockly.BlockSvg.NOTCH_WIDTH - 15); - highlightSteps.push('H', Blockly.BlockSvg.NOTCH_WIDTH - 15); - steps.push(Blockly.BlockSvg.NOTCH_PATH_LEFT); - highlightSteps.push(Blockly.BlockSvg.NOTCH_PATH_LEFT_HIGHLIGHT); - // Create previous block connection. - var connectionX = connectionsXY.x + (this.RTL ? - -Blockly.BlockSvg.NOTCH_WIDTH : Blockly.BlockSvg.NOTCH_WIDTH); - var connectionY = connectionsXY.y; - this.previousConnection.moveTo(connectionX, connectionY); - // This connection will be tightened when the parent renders. - } - steps.push('H', rightEdge); - highlightSteps.push('H', rightEdge - 0.5); - this.width = rightEdge; -}; - -/** - * Render the right edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {!Array.} highlightSteps Path of block highlights. - * @param {!Array.} inlineSteps Inline block outlines. - * @param {!Array.} highlightInlineSteps Inline block highlights. - * @param {!Object} connectionsXY Location of block. - * @param {!Array.>} inputRows 2D array of objects, each - * containing position information. - * @param {number} iconWidth Offset of first row due to icons. - * @return {number} Height of block. - * @private - */ -Blockly.BlockSvg.prototype.renderDrawRight_ = function(steps, highlightSteps, - inlineSteps, highlightInlineSteps, connectionsXY, inputRows, iconWidth) { - var cursorX; - var cursorY = 0; - var connectionX, connectionY; - for (var y = 0, row; row = inputRows[y]; y++) { - cursorX = Blockly.BlockSvg.SEP_SPACE_X; - if (y == 0) { - cursorX += this.RTL ? -iconWidth : iconWidth; - } - highlightSteps.push('M', (inputRows.rightEdge - 0.5) + ',' + - (cursorY + 0.5)); - if (this.isCollapsed()) { - // Jagged right edge. - var input = row[0]; - var fieldX = cursorX; - var fieldY = cursorY; - this.renderFields_(input.fieldRow, fieldX, fieldY); - steps.push(Blockly.BlockSvg.JAGGED_TEETH); - highlightSteps.push('h 8'); - var remainder = row.height - Blockly.BlockSvg.JAGGED_TEETH_HEIGHT; - steps.push('v', remainder); - if (this.RTL) { - highlightSteps.push('v 3.9 l 7.2,3.4 m -14.5,8.9 l 7.3,3.5'); - highlightSteps.push('v', remainder - 0.7); - } - this.width += Blockly.BlockSvg.JAGGED_TEETH_WIDTH; - } else if (row.type == Blockly.BlockSvg.INLINE) { - // Inline inputs. - for (var x = 0, input; input = row[x]; x++) { - var fieldX = cursorX; - var fieldY = cursorY; - if (row.thicker) { - // Lower the field slightly. - fieldY += Blockly.BlockSvg.INLINE_PADDING_Y; - } - // TODO: Align inline field rows (left/right/centre). - cursorX = this.renderFields_(input.fieldRow, fieldX, fieldY); - if (input.type != Blockly.DUMMY_INPUT) { - cursorX += input.renderWidth + Blockly.BlockSvg.SEP_SPACE_X; - } - if (input.type == Blockly.INPUT_VALUE) { - inlineSteps.push('M', (cursorX - Blockly.BlockSvg.SEP_SPACE_X) + - ',' + (cursorY + Blockly.BlockSvg.INLINE_PADDING_Y)); - inlineSteps.push('h', Blockly.BlockSvg.TAB_WIDTH - 2 - - input.renderWidth); - inlineSteps.push(Blockly.BlockSvg.TAB_PATH_DOWN); - inlineSteps.push('v', input.renderHeight + 1 - - Blockly.BlockSvg.TAB_HEIGHT); - inlineSteps.push('h', input.renderWidth + 2 - - Blockly.BlockSvg.TAB_WIDTH); - inlineSteps.push('z'); - if (this.RTL) { - // Highlight right edge, around back of tab, and bottom. - highlightInlineSteps.push('M', - (cursorX - Blockly.BlockSvg.SEP_SPACE_X - 2.5 + - Blockly.BlockSvg.TAB_WIDTH - input.renderWidth) + ',' + - (cursorY + Blockly.BlockSvg.INLINE_PADDING_Y + 0.5)); - highlightInlineSteps.push( - Blockly.BlockSvg.TAB_PATH_DOWN_HIGHLIGHT_RTL); - highlightInlineSteps.push('v', - input.renderHeight - Blockly.BlockSvg.TAB_HEIGHT + 2.5); - highlightInlineSteps.push('h', - input.renderWidth - Blockly.BlockSvg.TAB_WIDTH + 2); - } else { - // Highlight right edge, bottom. - highlightInlineSteps.push('M', - (cursorX - Blockly.BlockSvg.SEP_SPACE_X + 0.5) + ',' + - (cursorY + Blockly.BlockSvg.INLINE_PADDING_Y + 0.5)); - highlightInlineSteps.push('v', input.renderHeight + 1); - highlightInlineSteps.push('h', Blockly.BlockSvg.TAB_WIDTH - 2 - - input.renderWidth); - // Short highlight glint at bottom of tab. - highlightInlineSteps.push('M', - (cursorX - input.renderWidth - Blockly.BlockSvg.SEP_SPACE_X + - 0.9) + ',' + (cursorY + Blockly.BlockSvg.INLINE_PADDING_Y + - Blockly.BlockSvg.TAB_HEIGHT - 0.7)); - highlightInlineSteps.push('l', - (Blockly.BlockSvg.TAB_WIDTH * 0.46) + ',-2.1'); - } - // Create inline input connection. - if (this.RTL) { - connectionX = connectionsXY.x - cursorX - - Blockly.BlockSvg.TAB_WIDTH + Blockly.BlockSvg.SEP_SPACE_X + - input.renderWidth + 1; - } else { - connectionX = connectionsXY.x + cursorX + - Blockly.BlockSvg.TAB_WIDTH - Blockly.BlockSvg.SEP_SPACE_X - - input.renderWidth - 1; - } - connectionY = connectionsXY.y + cursorY + - Blockly.BlockSvg.INLINE_PADDING_Y + 1; - input.connection.moveTo(connectionX, connectionY); - if (input.connection.targetConnection) { - input.connection.tighten_(); - } - } - } - - cursorX = Math.max(cursorX, inputRows.rightEdge); - this.width = Math.max(this.width, cursorX); - steps.push('H', cursorX); - highlightSteps.push('H', cursorX - 0.5); - steps.push('v', row.height); - if (this.RTL) { - highlightSteps.push('v', row.height - 1); - } - } else if (row.type == Blockly.INPUT_VALUE) { - // External input. - var input = row[0]; - var fieldX = cursorX; - var fieldY = cursorY; - if (input.align != Blockly.ALIGN_LEFT) { - var fieldRightX = inputRows.rightEdge - input.fieldWidth - - Blockly.BlockSvg.TAB_WIDTH - 2 * Blockly.BlockSvg.SEP_SPACE_X; - if (input.align == Blockly.ALIGN_RIGHT) { - fieldX += fieldRightX; - } else if (input.align == Blockly.ALIGN_CENTRE) { - fieldX += fieldRightX / 2; - } - } - this.renderFields_(input.fieldRow, fieldX, fieldY); - steps.push(Blockly.BlockSvg.TAB_PATH_DOWN); - var v = row.height - Blockly.BlockSvg.TAB_HEIGHT; - steps.push('v', v); - if (this.RTL) { - // Highlight around back of tab. - highlightSteps.push(Blockly.BlockSvg.TAB_PATH_DOWN_HIGHLIGHT_RTL); - highlightSteps.push('v', v + 0.5); - } else { - // Short highlight glint at bottom of tab. - highlightSteps.push('M', (inputRows.rightEdge - 5) + ',' + - (cursorY + Blockly.BlockSvg.TAB_HEIGHT - 0.7)); - highlightSteps.push('l', (Blockly.BlockSvg.TAB_WIDTH * 0.46) + - ',-2.1'); - } - // Create external input connection. - connectionX = connectionsXY.x + - (this.RTL ? -inputRows.rightEdge - 1 : inputRows.rightEdge + 1); - connectionY = connectionsXY.y + cursorY; - input.connection.moveTo(connectionX, connectionY); - if (input.connection.targetConnection) { - input.connection.tighten_(); - this.width = Math.max(this.width, inputRows.rightEdge + - input.connection.targetBlock().getHeightWidth().width - - Blockly.BlockSvg.TAB_WIDTH + 1); - } - } else if (row.type == Blockly.DUMMY_INPUT) { - // External naked field. - var input = row[0]; - var fieldX = cursorX; - var fieldY = cursorY; - if (input.align != Blockly.ALIGN_LEFT) { - var fieldRightX = inputRows.rightEdge - input.fieldWidth - - 2 * Blockly.BlockSvg.SEP_SPACE_X; - if (inputRows.hasValue) { - fieldRightX -= Blockly.BlockSvg.TAB_WIDTH; - } - if (input.align == Blockly.ALIGN_RIGHT) { - fieldX += fieldRightX; - } else if (input.align == Blockly.ALIGN_CENTRE) { - fieldX += fieldRightX / 2; - } - } - this.renderFields_(input.fieldRow, fieldX, fieldY); - steps.push('v', row.height); - if (this.RTL) { - highlightSteps.push('v', row.height - 1); - } - } else if (row.type == Blockly.NEXT_STATEMENT) { - // Nested statement. - var input = row[0]; - if (y == 0) { - // If the first input is a statement stack, add a small row on top. - steps.push('v', Blockly.BlockSvg.SEP_SPACE_Y); - if (this.RTL) { - highlightSteps.push('v', Blockly.BlockSvg.SEP_SPACE_Y - 1); - } - cursorY += Blockly.BlockSvg.SEP_SPACE_Y; - } - var fieldX = cursorX; - var fieldY = cursorY; - if (input.align != Blockly.ALIGN_LEFT) { - var fieldRightX = inputRows.statementEdge - input.fieldWidth - - 2 * Blockly.BlockSvg.SEP_SPACE_X; - if (input.align == Blockly.ALIGN_RIGHT) { - fieldX += fieldRightX; - } else if (input.align == Blockly.ALIGN_CENTRE) { - fieldX += fieldRightX / 2; - } - } - this.renderFields_(input.fieldRow, fieldX, fieldY); - cursorX = inputRows.statementEdge + Blockly.BlockSvg.NOTCH_WIDTH; - steps.push('H', cursorX); - steps.push(Blockly.BlockSvg.INNER_TOP_LEFT_CORNER); - steps.push('v', row.height - 2 * Blockly.BlockSvg.CORNER_RADIUS); - steps.push(Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER); - steps.push('H', inputRows.rightEdge); - if (this.RTL) { - highlightSteps.push('M', - (cursorX - Blockly.BlockSvg.NOTCH_WIDTH + - Blockly.BlockSvg.DISTANCE_45_OUTSIDE) + - ',' + (cursorY + Blockly.BlockSvg.DISTANCE_45_OUTSIDE)); - highlightSteps.push( - Blockly.BlockSvg.INNER_TOP_LEFT_CORNER_HIGHLIGHT_RTL); - highlightSteps.push('v', - row.height - 2 * Blockly.BlockSvg.CORNER_RADIUS); - highlightSteps.push( - Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_RTL); - highlightSteps.push('H', inputRows.rightEdge - 0.5); - } else { - highlightSteps.push('M', - (cursorX - Blockly.BlockSvg.NOTCH_WIDTH + - Blockly.BlockSvg.DISTANCE_45_OUTSIDE) + ',' + - (cursorY + row.height - Blockly.BlockSvg.DISTANCE_45_OUTSIDE)); - highlightSteps.push( - Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_LTR); - highlightSteps.push('H', inputRows.rightEdge - 0.5); - } - // Create statement connection. - connectionX = connectionsXY.x + (this.RTL ? -cursorX : cursorX + 1); - connectionY = connectionsXY.y + cursorY + 1; - input.connection.moveTo(connectionX, connectionY); - if (input.connection.targetConnection) { - input.connection.tighten_(); - this.width = Math.max(this.width, inputRows.statementEdge + - input.connection.targetBlock().getHeightWidth().width); - } - if (y == inputRows.length - 1 || - inputRows[y + 1].type == Blockly.NEXT_STATEMENT) { - // If the final input is a statement stack, add a small row underneath. - // Consecutive statement stacks are also separated by a small divider. - steps.push('v', Blockly.BlockSvg.SEP_SPACE_Y); - if (this.RTL) { - highlightSteps.push('v', Blockly.BlockSvg.SEP_SPACE_Y - 1); - } - cursorY += Blockly.BlockSvg.SEP_SPACE_Y; - } - } - cursorY += row.height; - } - if (!inputRows.length) { - cursorY = Blockly.BlockSvg.MIN_BLOCK_Y; - steps.push('V', cursorY); - if (this.RTL) { - highlightSteps.push('V', cursorY - 1); - } - } - return cursorY; -}; - -/** - * Render the bottom edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {!Array.} highlightSteps Path of block highlights. - * @param {!Object} connectionsXY Location of block. - * @param {number} cursorY Height of block. - * @private - */ -Blockly.BlockSvg.prototype.renderDrawBottom_ = - function(steps, highlightSteps, connectionsXY, cursorY) { - this.height = cursorY + 1; // Add one for the shadow. - if (this.nextConnection) { - steps.push('H', (Blockly.BlockSvg.NOTCH_WIDTH + (this.RTL ? 0.5 : - 0.5)) + - ' ' + Blockly.BlockSvg.NOTCH_PATH_RIGHT); - // Create next block connection. - var connectionX; - if (this.RTL) { - connectionX = connectionsXY.x - Blockly.BlockSvg.NOTCH_WIDTH; - } else { - connectionX = connectionsXY.x + Blockly.BlockSvg.NOTCH_WIDTH; - } - var connectionY = connectionsXY.y + cursorY + 1; - this.nextConnection.moveTo(connectionX, connectionY); - if (this.nextConnection.targetConnection) { - this.nextConnection.tighten_(); - } - this.height += 4; // Height of tab. - } - - // Should the bottom-left corner be rounded or square? - if (this.squareBottomLeftCorner_) { - steps.push('H 0'); - if (!this.RTL) { - highlightSteps.push('M', '0.5,' + (cursorY - 0.5)); - } - } else { - steps.push('H', Blockly.BlockSvg.CORNER_RADIUS); - steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 -' + - Blockly.BlockSvg.CORNER_RADIUS + ',-' + - Blockly.BlockSvg.CORNER_RADIUS); - if (!this.RTL) { - highlightSteps.push('M', Blockly.BlockSvg.DISTANCE_45_INSIDE + ',' + - (cursorY - Blockly.BlockSvg.DISTANCE_45_INSIDE)); - highlightSteps.push('A', (Blockly.BlockSvg.CORNER_RADIUS - 0.5) + ',' + - (Blockly.BlockSvg.CORNER_RADIUS - 0.5) + ' 0 0,1 ' + - '0.5,' + (cursorY - Blockly.BlockSvg.CORNER_RADIUS)); - } - } -}; - -/** - * Render the left edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {!Array.} highlightSteps Path of block highlights. - * @param {!Object} connectionsXY Location of block. - * @param {number} cursorY Height of block. - * @private - */ -Blockly.BlockSvg.prototype.renderDrawLeft_ = - function(steps, highlightSteps, connectionsXY, cursorY) { - if (this.outputConnection) { - // Create output connection. - this.outputConnection.moveTo(connectionsXY.x, connectionsXY.y); - // This connection will be tightened when the parent renders. - steps.push('V', Blockly.BlockSvg.TAB_HEIGHT); - steps.push('c 0,-10 -' + Blockly.BlockSvg.TAB_WIDTH + ',8 -' + - Blockly.BlockSvg.TAB_WIDTH + ',-7.5 s ' + Blockly.BlockSvg.TAB_WIDTH + - ',2.5 ' + Blockly.BlockSvg.TAB_WIDTH + ',-7.5'); - if (this.RTL) { - highlightSteps.push('M', (Blockly.BlockSvg.TAB_WIDTH * -0.25) + ',8.4'); - highlightSteps.push('l', (Blockly.BlockSvg.TAB_WIDTH * -0.45) + ',-2.1'); - } else { - highlightSteps.push('V', Blockly.BlockSvg.TAB_HEIGHT - 1.5); - highlightSteps.push('m', (Blockly.BlockSvg.TAB_WIDTH * -0.92) + - ',-0.5 q ' + (Blockly.BlockSvg.TAB_WIDTH * -0.19) + - ',-5.5 0,-11'); - highlightSteps.push('m', (Blockly.BlockSvg.TAB_WIDTH * 0.92) + - ',1 V 0.5 H 1'); - } - this.width += Blockly.BlockSvg.TAB_WIDTH; - } else if (!this.RTL) { - if (this.squareTopLeftCorner_) { - // Statement block in a stack. - highlightSteps.push('V', 0.5); - } else { - highlightSteps.push('V', Blockly.BlockSvg.CORNER_RADIUS); - } - } - steps.push('z'); -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/blockly.js b/src/opsoro/apps/visual_programming/static/blockly/core/blockly.js deleted file mode 100644 index e024237..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/blockly.js +++ /dev/null @@ -1,652 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Core JavaScript library for Blockly. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -// Top level object for Blockly. -goog.provide('Blockly'); - -goog.require('Blockly.BlockSvg'); -goog.require('Blockly.FieldAngle'); -goog.require('Blockly.FieldCheckbox'); -goog.require('Blockly.FieldColour'); -// Date picker commented out since it increases footprint by 60%. -// Add it only if you need it. -//goog.require('Blockly.FieldDate'); -goog.require('Blockly.FieldDropdown'); -goog.require('Blockly.FieldImage'); -goog.require('Blockly.FieldTextInput'); -goog.require('Blockly.FieldVariable'); -goog.require('Blockly.Generator'); -goog.require('Blockly.Msg'); -goog.require('Blockly.Procedures'); -// Realtime is currently badly broken. Stub it out. -//goog.require('Blockly.Realtime'); -Blockly.Realtime = { - isEnabled: function() {return false;}, - blockChanged: function() {}, - doCommand: function(cmdThunk) {cmdThunk();} -}; -goog.require('Blockly.Toolbox'); -goog.require('Blockly.WidgetDiv'); -goog.require('Blockly.WorkspaceSvg'); -goog.require('Blockly.inject'); -goog.require('Blockly.utils'); -goog.require('goog.color'); -goog.require('goog.userAgent'); - - -// Turn off debugging when compiled. -var CLOSURE_DEFINES = {'goog.DEBUG': false}; - -/** - * Required name space for SVG elements. - * @const - */ -Blockly.SVG_NS = 'http://www.w3.org/2000/svg'; -/** - * Required name space for HTML elements. - * @const - */ -Blockly.HTML_NS = 'http://www.w3.org/1999/xhtml'; - -/** - * The richness of block colours, regardless of the hue. - * Must be in the range of 0 (inclusive) to 1 (exclusive). - */ -Blockly.HSV_SATURATION = 0.45; -/** - * The intensity of block colours, regardless of the hue. - * Must be in the range of 0 (inclusive) to 1 (exclusive). - */ -Blockly.HSV_VALUE = 0.65; - -/** - * Sprited icons and images. - */ -Blockly.SPRITE = { - width: 96, - height: 124, - url: 'sprites.png' -}; - -/** - * Convert a hue (HSV model) into an RGB hex triplet. - * @param {number} hue Hue on a colour wheel (0-360). - * @return {string} RGB code, e.g. '#5ba65b'. - */ -Blockly.makeColour = function(hue) { - return goog.color.hsvToHex(hue, Blockly.HSV_SATURATION, - Blockly.HSV_VALUE * 255); -}; - -/** - * ENUM for a right-facing value input. E.g. 'set item to' or 'return'. - * @const - */ -Blockly.INPUT_VALUE = 1; -/** - * ENUM for a left-facing value output. E.g. 'random fraction'. - * @const - */ -Blockly.OUTPUT_VALUE = 2; -/** - * ENUM for a down-facing block stack. E.g. 'if-do' or 'else'. - * @const - */ -Blockly.NEXT_STATEMENT = 3; -/** - * ENUM for an up-facing block stack. E.g. 'break out of loop'. - * @const - */ -Blockly.PREVIOUS_STATEMENT = 4; -/** - * ENUM for an dummy input. Used to add field(s) with no input. - * @const - */ -Blockly.DUMMY_INPUT = 5; - -/** - * ENUM for left alignment. - * @const - */ -Blockly.ALIGN_LEFT = -1; -/** - * ENUM for centre alignment. - * @const - */ -Blockly.ALIGN_CENTRE = 0; -/** - * ENUM for right alignment. - * @const - */ -Blockly.ALIGN_RIGHT = 1; - -/** - * Lookup table for determining the opposite type of a connection. - * @const - */ -Blockly.OPPOSITE_TYPE = []; -Blockly.OPPOSITE_TYPE[Blockly.INPUT_VALUE] = Blockly.OUTPUT_VALUE; -Blockly.OPPOSITE_TYPE[Blockly.OUTPUT_VALUE] = Blockly.INPUT_VALUE; -Blockly.OPPOSITE_TYPE[Blockly.NEXT_STATEMENT] = Blockly.PREVIOUS_STATEMENT; -Blockly.OPPOSITE_TYPE[Blockly.PREVIOUS_STATEMENT] = Blockly.NEXT_STATEMENT; - -/** - * Currently selected block. - * @type {Blockly.Block} - */ -Blockly.selected = null; - -/** - * Currently highlighted connection (during a drag). - * @type {Blockly.Connection} - * @private - */ -Blockly.highlightedConnection_ = null; - -/** - * Connection on dragged block that matches the highlighted connection. - * @type {Blockly.Connection} - * @private - */ -Blockly.localConnection_ = null; - -/** - * Number of pixels the mouse must move before a drag starts. - */ -Blockly.DRAG_RADIUS = 5; - -/** - * Maximum misalignment between connections for them to snap together. - */ -Blockly.SNAP_RADIUS = 20; - -/** - * Delay in ms between trigger and bumping unconnected block out of alignment. - */ -Blockly.BUMP_DELAY = 250; - -/** - * Number of characters to truncate a collapsed block to. - */ -Blockly.COLLAPSE_CHARS = 30; - -/** - * Length in ms for a touch to become a long press. - */ -Blockly.LONGPRESS = 750; - -/** - * The main workspace most recently used. - * Set by Blockly.WorkspaceSvg.prototype.markFocused - * @type {Blockly.Workspace} - */ -Blockly.mainWorkspace = null; - -/** - * Contents of the local clipboard. - * @type {Element} - * @private - */ -Blockly.clipboardXml_ = null; - -/** - * Source of the local clipboard. - * @type {Blockly.WorkspaceSvg} - * @private - */ -Blockly.clipboardSource_ = null; - -/** - * Is the mouse dragging a block? - * 0 - No drag operation. - * 1 - Still inside the sticky DRAG_RADIUS. - * 2 - Freely draggable. - * @private - */ -Blockly.dragMode_ = 0; - -/** - * Wrapper function called when a touch mouseUp occurs during a drag operation. - * @type {Array.} - * @private - */ -Blockly.onTouchUpWrapper_ = null; - -/** - * Returns the dimensions of the specified SVG image. - * @param {!Element} svg SVG image. - * @return {!Object} Contains width and height properties. - */ -Blockly.svgSize = function(svg) { - return {width: svg.cachedWidth_, - height: svg.cachedHeight_}; -}; - -/** - * Size the SVG image to completely fill its container. - * Record the height/width of the SVG image. - * @param {!Blockly.WorkspaceSvg} workspace Any workspace in the SVG. - */ -Blockly.svgResize = function(workspace) { - var mainWorkspace = workspace; - while (mainWorkspace.options.parentWorkspace) { - mainWorkspace = mainWorkspace.options.parentWorkspace; - } - var svg = mainWorkspace.options.svg; - var div = svg.parentNode; - if (!div) { - // Workspace deteted, or something. - return; - } - var width = div.offsetWidth; - var height = div.offsetHeight; - if (svg.cachedWidth_ != width) { - svg.setAttribute('width', width + 'px'); - svg.cachedWidth_ = width; - } - if (svg.cachedHeight_ != height) { - svg.setAttribute('height', height + 'px'); - svg.cachedHeight_ = height; - } - mainWorkspace.resize(); -}; - -/** - * Handle a mouse-up anywhere on the page. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.onMouseUp_ = function(e) { - var workspace = Blockly.getMainWorkspace(); - Blockly.Css.setCursor(Blockly.Css.Cursor.OPEN); - workspace.isScrolling = false; - - // Unbind the touch event if it exists. - if (Blockly.onTouchUpWrapper_) { - Blockly.unbindEvent_(Blockly.onTouchUpWrapper_); - Blockly.onTouchUpWrapper_ = null; - } - if (Blockly.onMouseMoveWrapper_) { - Blockly.unbindEvent_(Blockly.onMouseMoveWrapper_); - Blockly.onMouseMoveWrapper_ = null; - } -}; - -/** - * Handle a mouse-move on SVG drawing surface. - * @param {!Event} e Mouse move event. - * @private - */ -Blockly.onMouseMove_ = function(e) { - if (e.touches && e.touches.length >= 2) { - return; // Multi-touch gestures won't have e.clientX. - } - var workspace = Blockly.getMainWorkspace(); - if (workspace.isScrolling) { - Blockly.removeAllRanges(); - var dx = e.clientX - workspace.startDragMouseX; - var dy = e.clientY - workspace.startDragMouseY; - var metrics = workspace.startDragMetrics; - var x = workspace.startScrollX + dx; - var y = workspace.startScrollY + dy; - x = Math.min(x, -metrics.contentLeft); - y = Math.min(y, -metrics.contentTop); - x = Math.max(x, metrics.viewWidth - metrics.contentLeft - - metrics.contentWidth); - y = Math.max(y, metrics.viewHeight - metrics.contentTop - - metrics.contentHeight); - - // Move the scrollbars and the page will scroll automatically. - workspace.scrollbar.set(-x - metrics.contentLeft, - -y - metrics.contentTop); - // Cancel the long-press if the drag has moved too far. - if (Math.sqrt(dx * dx + dy * dy) > Blockly.DRAG_RADIUS) { - Blockly.longStop_(); - } - e.stopPropagation(); - } -}; - -/** - * Handle a key-down on SVG drawing surface. - * @param {!Event} e Key down event. - * @private - */ -Blockly.onKeyDown_ = function(e) { - if (Blockly.isTargetInput_(e)) { - // When focused on an HTML text input widget, don't trap any keys. - return; - } - var deleteBlock = false; - if (e.keyCode == 27) { - // Pressing esc closes the context menu. - Blockly.hideChaff(); - } else if (e.keyCode == 8 || e.keyCode == 46) { - // Delete or backspace. - try { - if (Blockly.selected && Blockly.selected.isDeletable()) { - deleteBlock = true; - } - } finally { - // Stop the browser from going back to the previous page. - // Use a finally so that any error in delete code above doesn't disappear - // from the console when the page rolls back. - e.preventDefault(); - } - } else if (e.altKey || e.ctrlKey || e.metaKey) { - if (Blockly.selected && - Blockly.selected.isDeletable() && Blockly.selected.isMovable()) { - if (e.keyCode == 67) { - // 'c' for copy. - Blockly.hideChaff(); - Blockly.copy_(Blockly.selected); - } else if (e.keyCode == 88) { - // 'x' for cut. - Blockly.copy_(Blockly.selected); - deleteBlock = true; - } - } - if (e.keyCode == 86) { - // 'v' for paste. - if (Blockly.clipboardXml_) { - Blockly.clipboardSource_.paste(Blockly.clipboardXml_); - } - } - } - if (deleteBlock) { - // Common code for delete and cut. - Blockly.hideChaff(); - var heal = Blockly.dragMode_ != 2; - Blockly.selected.dispose(heal, true); - if (Blockly.highlightedConnection_) { - Blockly.highlightedConnection_.unhighlight(); - Blockly.highlightedConnection_ = null; - } - } -}; - -/** - * Stop binding to the global mouseup and mousemove events. - * @private - */ -Blockly.terminateDrag_ = function() { - Blockly.BlockSvg.terminateDrag_(); - Blockly.Flyout.terminateDrag_(); -}; - -/** - * PID of queued long-press task. - * @private - */ -Blockly.longPid_ = 0; - -/** - * Context menus on touch devices are activated using a long-press. - * Unfortunately the contextmenu touch event is currently (2015) only suported - * by Chrome. This function is fired on any touchstart event, queues a task, - * which after about a second opens the context menu. The tasks is killed - * if the touch event terminates early. - * @param {!Event} e Touch start event. - * @param {!Blockly.Block|!Blockly.WorkspaceSvg} uiObject The block or workspace - * under the touchstart event. - * @private - */ -Blockly.longStart_ = function(e, uiObject) { - Blockly.longStop_(); - Blockly.longPid_ = setTimeout(function() { - e.button = 2; // Simulate a right button click. - uiObject.onMouseDown_(e); - }, Blockly.LONGPRESS); -}; - -/** - * Nope, that's not a long-press. Either touchend or touchcancel was fired, - * or a drag hath begun. Kill the queued long-press task. - * @private - */ -Blockly.longStop_ = function() { - if (Blockly.longPid_) { - clearTimeout(Blockly.longPid_); - Blockly.longPid_ = 0; - } -}; - -/** - * Copy a block onto the local clipboard. - * @param {!Blockly.Block} block Block to be copied. - * @private - */ -Blockly.copy_ = function(block) { - var xmlBlock = Blockly.Xml.blockToDom_(block); - if (Blockly.dragMode_ != 2) { - Blockly.Xml.deleteNext(xmlBlock); - } - // Encode start position in XML. - var xy = block.getRelativeToSurfaceXY(); - xmlBlock.setAttribute('x', block.RTL ? -xy.x : xy.x); - xmlBlock.setAttribute('y', xy.y); - Blockly.clipboardXml_ = xmlBlock; - Blockly.clipboardSource_ = block.workspace; -}; - -/** - * Duplicate this block and its children. - * @param {!Blockly.Block} block Block to be copied. - * @private - */ -Blockly.duplicate_ = function(block) { - // Save the clipboard. - var clipboardXml = Blockly.clipboardXml_; - var clipboardSource = Blockly.clipboardSource_; - - // Create a duplicate via a copy/paste operation. - Blockly.copy_(block); - block.workspace.paste(Blockly.clipboardXml_); - - // Restore the clipboard. - Blockly.clipboardXml_ = clipboardXml; - Blockly.clipboardSource_ = clipboardSource; -}; - -/** - * Cancel the native context menu, unless the focus is on an HTML input widget. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.onContextMenu_ = function(e) { - if (!Blockly.isTargetInput_(e)) { - // When focused on an HTML text input widget, don't cancel the context menu. - e.preventDefault(); - } -}; - -/** - * Close tooltips, context menus, dropdown selections, etc. - * @param {boolean=} opt_allowToolbox If true, don't close the toolbox. - */ -Blockly.hideChaff = function(opt_allowToolbox) { - Blockly.Tooltip.hide(); - Blockly.WidgetDiv.hide(); - if (!opt_allowToolbox) { - var workspace = Blockly.getMainWorkspace(); - if (workspace.toolbox_ && - workspace.toolbox_.flyout_ && - workspace.toolbox_.flyout_.autoClose) { - workspace.toolbox_.clearSelection(); - } - } -}; - -/** - * Return an object with all the metrics required to size scrollbars for the - * main workspace. The following properties are computed: - * .viewHeight: Height of the visible rectangle, - * .viewWidth: Width of the visible rectangle, - * .contentHeight: Height of the contents, - * .contentWidth: Width of the content, - * .viewTop: Offset of top edge of visible rectangle from parent, - * .viewLeft: Offset of left edge of visible rectangle from parent, - * .contentTop: Offset of the top-most content from the y=0 coordinate, - * .contentLeft: Offset of the left-most content from the x=0 coordinate. - * .absoluteTop: Top-edge of view. - * .absoluteLeft: Left-edge of view. - * @return {Object} Contains size and position metrics of main workspace. - * @private - * @this Blockly.WorkspaceSvg - */ -Blockly.getMainWorkspaceMetrics_ = function() { - var svgSize = Blockly.svgSize(this.options.svg); - if (this.toolbox_) { - svgSize.width -= this.toolbox_.width; - } - // Set the margin to match the flyout's margin so that the workspace does - // not jump as blocks are added. - var MARGIN = Blockly.Flyout.prototype.CORNER_RADIUS - 1; - var viewWidth = svgSize.width - MARGIN; - var viewHeight = svgSize.height - MARGIN; - try { - var blockBox = this.getCanvas().getBBox(); - } catch (e) { - // Firefox has trouble with hidden elements (Bug 528969). - return null; - } - // Fix scale. - var contentWidth = blockBox.width * this.scale; - var contentHeight = blockBox.height * this.scale; - var contentX = blockBox.x * this.scale; - var contentY = blockBox.y * this.scale; - if (this.scrollbar) { - // Add a border around the content that is at least half a screenful wide. - // Ensure border is wide enough that blocks can scroll over entire screen. - var leftEdge = Math.min(contentX - viewWidth / 2, - contentX + contentWidth - viewWidth); - var rightEdge = Math.max(contentX + contentWidth + viewWidth / 2, - contentX + viewWidth); - var topEdge = Math.min(contentY - viewHeight / 2, - contentY + contentHeight - viewHeight); - var bottomEdge = Math.max(contentY + contentHeight + viewHeight / 2, - contentY + viewHeight); - } else { - var leftEdge = blockBox.x; - var rightEdge = leftEdge + blockBox.width; - var topEdge = blockBox.y; - var bottomEdge = topEdge + blockBox.height; - } - var absoluteLeft = 0; - if (!this.RTL && this.toolbox_) { - absoluteLeft = this.toolbox_.width; - } - var metrics = { - viewHeight: svgSize.height, - viewWidth: svgSize.width, - contentHeight: bottomEdge - topEdge, - contentWidth: rightEdge - leftEdge, - viewTop: -this.scrollY, - viewLeft: -this.scrollX, - contentTop: topEdge, - contentLeft: leftEdge, - absoluteTop: 0, - absoluteLeft: absoluteLeft - }; - return metrics; -}; - -/** - * Sets the X/Y translations of the main workspace to match the scrollbars. - * @param {!Object} xyRatio Contains an x and/or y property which is a float - * between 0 and 1 specifying the degree of scrolling. - * @private - * @this Blockly.WorkspaceSvg - */ -Blockly.setMainWorkspaceMetrics_ = function(xyRatio) { - if (!this.scrollbar) { - throw 'Attempt to set main workspace scroll without scrollbars.'; - } - var metrics = this.getMetrics(); - if (goog.isNumber(xyRatio.x)) { - this.scrollX = -metrics.contentWidth * xyRatio.x - metrics.contentLeft; - } - if (goog.isNumber(xyRatio.y)) { - this.scrollY = -metrics.contentHeight * xyRatio.y - metrics.contentTop; - } - var x = this.scrollX + metrics.absoluteLeft; - var y = this.scrollY + metrics.absoluteTop; - this.translate(x, y); - if (this.options.gridPattern) { - this.options.gridPattern.setAttribute('x', x); - this.options.gridPattern.setAttribute('y', y); - if (goog.userAgent.IE) { - // IE doesn't notice that the x/y offsets have changed. Force an update. - this.updateGridPattern_(); - } - } -}; - -/** - * Execute a command. Generally, a command is the result of a user action - * e.g., a click, drag or context menu selection. Calling the cmdThunk function - * through doCommand() allows us to capture information that can be used for - * capabilities like undo (which is supported by the realtime collaboration - * feature). - * @param {function()} cmdThunk A function representing the command execution. - */ -Blockly.doCommand = function(cmdThunk) { - if (Blockly.Realtime.isEnabled) { - Blockly.Realtime.doCommand(cmdThunk); - } else { - cmdThunk(); - } -}; - -/** - * When something in Blockly's workspace changes, call a function. - * @param {!Function} func Function to call. - * @return {!Array.} Opaque data that can be passed to - * removeChangeListener. - * @deprecated April 2015 - */ -Blockly.addChangeListener = function(func) { - // Backwards compatability from before there could be multiple workspaces. - console.warn('Deprecated call to Blockly.addChangeListener, ' + - 'use workspace.addChangeListener instead.'); - return Blockly.getMainWorkspace().addChangeListener(func); -}; - -/** - * Returns the main workspace. Returns the last used main workspace (based on - * focus). - * @return {!Blockly.Workspace} The main workspace. - */ -Blockly.getMainWorkspace = function() { - return Blockly.mainWorkspace; -}; - -// Export symbols that would otherwise be renamed by Closure compiler. -if (!goog.global['Blockly']) { - goog.global['Blockly'] = {}; -} -goog.global['Blockly']['getMainWorkspace'] = Blockly.getMainWorkspace; -goog.global['Blockly']['addChangeListener'] = Blockly.addChangeListener; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/blocks.js b/src/opsoro/apps/visual_programming/static/blockly/core/blocks.js deleted file mode 100644 index 26e1eaa..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/blocks.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2013 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Name space for the Blocks singleton. - * @author spertus@google.com (Ellen Spertus) - */ -'use strict'; - -goog.provide('Blockly.Blocks'); - - -/** - * Unique ID counter for created blocks. - * @private - */ -Blockly.Blocks.uidCounter_ = 0; - -/** - * Generate a unique ID. This will be locally or globally unique, depending on - * whether we are in single user or realtime collaborative mode. - * @return {string} - */ -Blockly.Blocks.genUid = function() { - var uid = (++Blockly.Blocks.uidCounter_).toString(); - if (Blockly.Realtime.isEnabled()) { - return Blockly.Realtime.genUid(uid); - } else { - return uid; - } -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/comment.js b/src/opsoro/apps/visual_programming/static/blockly/core/comment.js deleted file mode 100644 index 3f2c1f7..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/comment.js +++ /dev/null @@ -1,241 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Object representing a code comment. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Comment'); - -goog.require('Blockly.Bubble'); -goog.require('Blockly.Icon'); -goog.require('goog.userAgent'); - - -/** - * Class for a comment. - * @param {!Blockly.Block} block The block associated with this comment. - * @extends {Blockly.Icon} - * @constructor - */ -Blockly.Comment = function(block) { - Blockly.Comment.superClass_.constructor.call(this, block); - this.createIcon(); -}; -goog.inherits(Blockly.Comment, Blockly.Icon); - -/** - * Icon in base64 format. - * @private - */ -Blockly.Comment.prototype.png_ = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAANyAAADcgBffIlqAAAAAd0SU1FB98DGgAnBf0Xj5sAAAIBSURBVDjLjZO9SxxRFMXPrFkWl2UFYSOIRtF210YtAiH/gGATRNZFgo19IBaB9Ipgk3SiEoKQgI19JIVgGaOIgpWJEAV1kZk3b1ad0V+KRYIzk5ALh1ecc88978tRSgHPg0Bjvq/BbFalMNR5oaBv+bzWHMfZjOudWPOg6+pDva6elRXlt7fVcnYmPX4sDQ3pdmpKQXu7frS16aXjON8T06OIMWOwtRp3jgNSEpkMTE5y5/v4UcSLePxnroutVNKb4xgYANfFAk/vDbLG8Gtk5P8M7jE6CsZwDDwSMLm5iYmLlpbg4ABOTmBjA4aHk0ZbWxigposLvlarScH5OSwvw9oaABwdJTW1GtTrfJHnUe/uTgqKxeZaKEAUgTEQP/CeHvA8LhRFhLlc+r6zWVhfbyaZn0/yuRxEEaGCAK9USjdZWGgarK5CS0uS7+gAa3EzjYaOy2WlludJi4vSzIx0e5vky2Xp6ko/M4WCPleruk4zsVa6vJSur9OHTEzoqljUJwEdQYDf25uMe3jY3E5fX5Lr7wdr8YGSJCkIeL23h9/a+lA4Pg7T039u6h75POzv4wcBrx5Ec11Wd3bwOzv//VK7umB3F991+Zj2/R1reWstdnaWm3L5YXOlAnNz3FiLbTR4Azj6WwFPjOG953EahoT1On4YEnoep8bwDuiO9/wG1sM4kG8A4fUAAAAASUVORK5CYII='; - -/** - * Comment text (if bubble is not visible). - * @private - */ -Blockly.Comment.prototype.text_ = ''; - -/** - * Width of bubble. - * @private - */ -Blockly.Comment.prototype.width_ = 160; - -/** - * Height of bubble. - * @private - */ -Blockly.Comment.prototype.height_ = 80; - -/** - * Create the editor for the comment's bubble. - * @return {!Element} The top-level node of the editor. - * @private - */ -Blockly.Comment.prototype.createEditor_ = function() { - /* Create the editor. Here's the markup that will be generated: - - - - - - */ - this.foreignObject_ = Blockly.createSvgElement('foreignObject', - {'x': Blockly.Bubble.BORDER_WIDTH, 'y': Blockly.Bubble.BORDER_WIDTH}, - null); - var body = document.createElementNS(Blockly.HTML_NS, 'body'); - body.setAttribute('xmlns', Blockly.HTML_NS); - body.className = 'blocklyMinimalBody'; - this.textarea_ = document.createElementNS(Blockly.HTML_NS, 'textarea'); - this.textarea_.className = 'blocklyCommentTextarea'; - this.textarea_.setAttribute('dir', this.block_.RTL ? 'RTL' : 'LTR'); - body.appendChild(this.textarea_); - this.foreignObject_.appendChild(body); - Blockly.bindEvent_(this.textarea_, 'mouseup', this, this.textareaFocus_); - // Don't zoom with mousewheel. - Blockly.bindEvent_(this.textarea_, 'wheel', this, function(e) { - e.stopPropagation(); - }); - return this.foreignObject_; -}; - -/** - * Add or remove editability of the comment. - * @override - */ -Blockly.Comment.prototype.updateEditable = function() { - if (this.isVisible()) { - // Toggling visibility will force a rerendering. - this.setVisible(false); - this.setVisible(true); - } - // Allow the icon to update. - Blockly.Icon.prototype.updateEditable.call(this); -}; - -/** - * Callback function triggered when the bubble has resized. - * Resize the text area accordingly. - * @private - */ -Blockly.Comment.prototype.resizeBubble_ = function() { - var size = this.bubble_.getBubbleSize(); - var doubleBorderWidth = 2 * Blockly.Bubble.BORDER_WIDTH; - this.foreignObject_.setAttribute('width', size.width - doubleBorderWidth); - this.foreignObject_.setAttribute('height', size.height - doubleBorderWidth); - this.textarea_.style.width = (size.width - doubleBorderWidth - 4) + 'px'; - this.textarea_.style.height = (size.height - doubleBorderWidth - 4) + 'px'; -}; - -/** - * Show or hide the comment bubble. - * @param {boolean} visible True if the bubble should be visible. - */ -Blockly.Comment.prototype.setVisible = function(visible) { - if (visible == this.isVisible()) { - // No change. - return; - } - if ((!this.block_.isEditable() && !this.textarea_) || goog.userAgent.IE) { - // Steal the code from warnings to make an uneditable text bubble. - // MSIE does not support foreignobject; textareas are impossible. - // http://msdn.microsoft.com/en-us/library/hh834675%28v=vs.85%29.aspx - // Always treat comments in IE as uneditable. - Blockly.Warning.prototype.setVisible.call(this, visible); - return; - } - // Save the bubble stats before the visibility switch. - var text = this.getText(); - var size = this.getBubbleSize(); - if (visible) { - // Create the bubble. - this.bubble_ = new Blockly.Bubble( - /** @type {!Blockly.Workspace} */ (this.block_.workspace), - this.createEditor_(), this.block_.svgPath_, - this.iconX_, this.iconY_, - this.width_, this.height_); - this.bubble_.registerResizeEvent(this, this.resizeBubble_); - this.updateColour(); - this.text_ = null; - } else { - // Dispose of the bubble. - this.bubble_.dispose(); - this.bubble_ = null; - this.textarea_ = null; - this.foreignObject_ = null; - } - // Restore the bubble stats after the visibility switch. - this.setText(text); - this.setBubbleSize(size.width, size.height); -}; - -/** - * Bring the comment to the top of the stack when clicked on. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.Comment.prototype.textareaFocus_ = function(e) { - // Ideally this would be hooked to the focus event for the comment. - // However doing so in Firefox swallows the cursor for unknown reasons. - // So this is hooked to mouseup instead. No big deal. - this.bubble_.promote_(); - // Since the act of moving this node within the DOM causes a loss of focus, - // we need to reapply the focus. - this.textarea_.focus(); -}; - -/** - * Get the dimensions of this comment's bubble. - * @return {!Object} Object with width and height properties. - */ -Blockly.Comment.prototype.getBubbleSize = function() { - if (this.isVisible()) { - return this.bubble_.getBubbleSize(); - } else { - return {width: this.width_, height: this.height_}; - } -}; - -/** - * Size this comment's bubble. - * @param {number} width Width of the bubble. - * @param {number} height Height of the bubble. - */ -Blockly.Comment.prototype.setBubbleSize = function(width, height) { - if (this.textarea_) { - this.bubble_.setBubbleSize(width, height); - } else { - this.width_ = width; - this.height_ = height; - } -}; - -/** - * Returns this comment's text. - * @return {string} Comment text. - */ -Blockly.Comment.prototype.getText = function() { - return this.textarea_ ? this.textarea_.value : this.text_; -}; - -/** - * Set this comment's text. - * @param {string} text Comment text. - */ -Blockly.Comment.prototype.setText = function(text) { - if (this.textarea_) { - this.textarea_.value = text; - } else { - this.text_ = text; - } -}; - -/** - * Dispose of this comment. - */ -Blockly.Comment.prototype.dispose = function() { - this.block_.comment = null; - Blockly.Icon.prototype.dispose.call(this); -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/connection.js b/src/opsoro/apps/visual_programming/static/blockly/core/connection.js deleted file mode 100644 index 96799bf..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/connection.js +++ /dev/null @@ -1,925 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Components for creating connections between blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Connection'); -goog.provide('Blockly.ConnectionDB'); - -goog.require('goog.dom'); - - -/** - * Class for a connection between blocks. - * @param {!Blockly.Block} source The block establishing this connection. - * @param {number} type The type of the connection. - * @constructor - */ -Blockly.Connection = function(source, type) { - /** @type {!Blockly.Block} */ - this.sourceBlock_ = source; - /** @type {number} */ - this.type = type; - // Shortcut for the databases for this connection's workspace. - if (source.workspace.connectionDBList) { - this.db_ = source.workspace.connectionDBList[type]; - this.dbOpposite_ = - source.workspace.connectionDBList[Blockly.OPPOSITE_TYPE[type]]; - this.hidden_ = !this.db_; - } -}; - -/** - * Connection this connection connects to. Null if not connected. - * @type {Blockly.Connection} - */ -Blockly.Connection.prototype.targetConnection = null; - -/** - * List of compatible value types. Null if all types are compatible. - * @type {Array} - * @private - */ -Blockly.Connection.prototype.check_ = null; - -/** - * DOM representation of a shadow block, or null if none. - * @type {Element} - * @private - */ -Blockly.Connection.prototype.shadowDom_ = null; - -/** - * Horizontal location of this connection. - * @type {number} - * @private - */ -Blockly.Connection.prototype.x_ = 0; - -/** - * Vertical location of this connection. - * @type {number} - * @private - */ -Blockly.Connection.prototype.y_ = 0; - -/** - * Has this connection been added to the connection database? - * @type {boolean} - * @private - */ -Blockly.Connection.prototype.inDB_ = false; - -/** - * Connection database for connections of this type on the current workspace. - * @type {Blockly.ConnectionDB} - * @private - */ -Blockly.Connection.prototype.db_ = null; - -/** - * Connection database for connections compatible with this type on the - * current workspace. - * @type {Blockly.ConnectionDB} - * @private - */ -Blockly.Connection.prototype.dbOpposite_ = null; - -/** - * Whether this connections is hidden (not tracked in a database) or not. - * @type {boolean} - * @private - */ -Blockly.Connection.prototype.hidden_ = null; - -/** - * Sever all links to this connection (not including from the source object). - */ -Blockly.Connection.prototype.dispose = function() { - if (this.targetConnection) { - throw 'Disconnect connection before disposing of it.'; - } - if (this.inDB_) { - this.db_.removeConnection_(this); - } - if (Blockly.highlightedConnection_ == this) { - Blockly.highlightedConnection_ = null; - } - if (Blockly.localConnection_ == this) { - Blockly.localConnection_ = null; - } - this.db_ = null; - this.dbOpposite_ = null; -}; - -/** - * Does the connection belong to a superior block (higher in the source stack)? - * @return {boolean} True if connection faces down or right. - */ -Blockly.Connection.prototype.isSuperior = function() { - return this.type == Blockly.INPUT_VALUE || - this.type == Blockly.NEXT_STATEMENT; -}; - -/** - * Connect this connection to another connection. - * @param {!Blockly.Connection} otherConnection Connection to connect to. - */ -Blockly.Connection.prototype.connect = function(otherConnection) { - if (this.sourceBlock_ == otherConnection.sourceBlock_) { - throw 'Attempted to connect a block to itself.'; - } - if (this.sourceBlock_.workspace !== otherConnection.sourceBlock_.workspace) { - throw 'Blocks are on different workspaces.'; - } - if (Blockly.OPPOSITE_TYPE[this.type] != otherConnection.type) { - throw 'Attempt to connect incompatible types.'; - } - if (this.type == Blockly.INPUT_VALUE || this.type == Blockly.OUTPUT_VALUE) { - if (this.targetConnection) { - // Can't make a value connection if male block is already connected. - throw 'Source connection already connected (value).'; - } else if (otherConnection.targetConnection) { - // Record and disable the shadow so that it does not respawn here. - var shadowDom = otherConnection.getShadowDom(); - otherConnection.setShadowDom(null); - // If female block is already connected, disconnect and bump the male. - var orphanBlock = otherConnection.targetBlock(); - orphanBlock.setParent(null); - if (orphanBlock.isShadow()) { - otherConnection.setShadowDom(Blockly.Xml.blockToDom_(orphanBlock)); - orphanBlock.dispose(); - } else { - if (!orphanBlock.outputConnection) { - throw 'Orphan block does not have an output connection.'; - } - // Attempt to reattach the orphan at the end of the newly inserted - // block. Since this block may be a row, walk down to the end. - var newBlock = this.sourceBlock_; - var connection; - while (connection = Blockly.Connection.singleConnection_( - /** @type {!Blockly.Block} */ (newBlock), orphanBlock)) { - // '=' is intentional in line above. - newBlock = connection.targetBlock(); - if (!newBlock || newBlock.isShadow()) { - orphanBlock.outputConnection.connect(connection); - orphanBlock = null; - break; - } - } - if (orphanBlock) { - // Unable to reattach orphan. Bump it off to the side. - setTimeout(function() { - orphanBlock.outputConnection.bumpAwayFrom_(otherConnection); - }, Blockly.BUMP_DELAY); - } - // Restore the shadow. - otherConnection.setShadowDom(shadowDom); - } - } - } else { - if (this.targetConnection) { - throw 'Source connection already connected (block).'; - } else if (otherConnection.targetConnection) { - // Statement blocks may be inserted into the middle of a stack. - if (this.type != Blockly.PREVIOUS_STATEMENT) { - throw 'Can only do a mid-stack connection with the top of a block.'; - } - // Split the stack. - var orphanBlock = otherConnection.targetBlock(); - orphanBlock.setParent(null); - if (!orphanBlock.previousConnection) { - throw 'Orphan block does not have a previous connection.'; - } - // Attempt to reattach the orphan at the bottom of the newly inserted - // block. Since this block may be a stack, walk down to the end. - var newBlock = this.sourceBlock_; - while (newBlock.nextConnection) { - if (newBlock.nextConnection.targetConnection) { - newBlock = newBlock.getNextBlock(); - } else { - if (orphanBlock.previousConnection.checkType_( - newBlock.nextConnection)) { - newBlock.nextConnection.connect(orphanBlock.previousConnection); - orphanBlock = null; - } - break; - } - } - if (orphanBlock) { - // Unable to reattach orphan. Bump it off to the side. - setTimeout(function() { - orphanBlock.previousConnection.bumpAwayFrom_(otherConnection); - }, Blockly.BUMP_DELAY); - } - } - } - - // Determine which block is superior (higher in the source stack). - var parentBlock, childBlock; - if (this.isSuperior()) { - // Superior block. - parentBlock = this.sourceBlock_; - childBlock = otherConnection.sourceBlock_; - } else { - // Inferior block. - parentBlock = otherConnection.sourceBlock_; - childBlock = this.sourceBlock_; - } - - // Establish the connections. - this.targetConnection = otherConnection; - otherConnection.targetConnection = this; - - // Demote the inferior block so that one is a child of the superior one. - childBlock.setParent(parentBlock); - - if (parentBlock.rendered) { - parentBlock.updateDisabled(); - } - if (childBlock.rendered) { - childBlock.updateDisabled(); - } - if (parentBlock.rendered && childBlock.rendered) { - if (this.type == Blockly.NEXT_STATEMENT || - this.type == Blockly.PREVIOUS_STATEMENT) { - // Child block may need to square off its corners if it is in a stack. - // Rendering a child will render its parent. - childBlock.render(); - } else { - // Child block does not change shape. Rendering the parent node will - // move its connected children into position. - parentBlock.render(); - } - } -}; - -/** - * Does the given block have one and only one connection point that will accept - * an orphaned block? - * @param {!Blockly.Block} block The superior block. - * @param {!Blockly.Block} orphanBlock The inferior block. - * @return {Blockly.Connection} The suitable connection point on 'block', - * or null. - * @private - */ -Blockly.Connection.singleConnection_ = function(block, orphanBlock) { - var connection = false; - for (var i = 0; i < block.inputList.length; i++) { - var thisConnection = block.inputList[i].connection; - if (thisConnection && thisConnection.type == Blockly.INPUT_VALUE && - orphanBlock.outputConnection.checkType_(thisConnection)) { - if (connection) { - return null; // More than one connection. - } - connection = thisConnection; - } - } - return connection; -}; - -/** - * Disconnect this connection. - */ -Blockly.Connection.prototype.disconnect = function() { - var otherConnection = this.targetConnection; - if (!otherConnection) { - throw 'Source connection not connected.'; - } else if (otherConnection.targetConnection != this) { - throw 'Target connection not connected to source connection.'; - } - otherConnection.targetConnection = null; - this.targetConnection = null; - - // Rerender the parent so that it may reflow. - var parentBlock, childBlock, parentConnection; - if (this.isSuperior()) { - // Superior block. - parentBlock = this.sourceBlock_; - childBlock = otherConnection.sourceBlock_; - parentConnection = this; - } else { - // Inferior block. - parentBlock = otherConnection.sourceBlock_; - childBlock = this.sourceBlock_; - parentConnection = otherConnection; - } - var shadow = parentConnection.getShadowDom(); - if (parentBlock.workspace && !childBlock.isShadow() && shadow) { - // Respawn the shadow block. - var blockShadow = - Blockly.Xml.domToBlock(parentBlock.workspace, shadow); - if (blockShadow.outputConnection) { - parentConnection.connect(blockShadow.outputConnection); - } else if (blockShadow.previousConnection) { - parentConnection.connect(blockShadow.previousConnection); - } else { - throw 'Child block does not have output or previous statement.'; - } - blockShadow.initSvg(); - blockShadow.render(false); - } - if (parentBlock.rendered) { - parentBlock.render(); - } - if (childBlock.rendered) { - childBlock.updateDisabled(); - childBlock.render(); - } -}; - -/** - * Returns the block that this connection connects to. - * @return {Blockly.Block} The connected block or null if none is connected. - */ -Blockly.Connection.prototype.targetBlock = function() { - if (this.targetConnection) { - return this.targetConnection.sourceBlock_; - } - return null; -}; - -/** - * Move the block(s) belonging to the connection to a point where they don't - * visually interfere with the specified connection. - * @param {!Blockly.Connection} staticConnection The connection to move away - * from. - * @private - */ -Blockly.Connection.prototype.bumpAwayFrom_ = function(staticConnection) { - if (Blockly.dragMode_ != 0) { - // Don't move blocks around while the user is doing the same. - return; - } - // Move the root block. - var rootBlock = this.sourceBlock_.getRootBlock(); - if (rootBlock.isInFlyout) { - // Don't move blocks around in a flyout. - return; - } - var reverse = false; - if (!rootBlock.isMovable()) { - // Can't bump an uneditable block away. - // Check to see if the other block is movable. - rootBlock = staticConnection.sourceBlock_.getRootBlock(); - if (!rootBlock.isMovable()) { - return; - } - // Swap the connections and move the 'static' connection instead. - staticConnection = this; - reverse = true; - } - // Raise it to the top for extra visibility. - rootBlock.getSvgRoot().parentNode.appendChild(rootBlock.getSvgRoot()); - var dx = (staticConnection.x_ + Blockly.SNAP_RADIUS) - this.x_; - var dy = (staticConnection.y_ + Blockly.SNAP_RADIUS) - this.y_; - if (reverse) { - // When reversing a bump due to an uneditable block, bump up. - dy = -dy; - } - if (rootBlock.RTL) { - dx = -dx; - } - rootBlock.moveBy(dx, dy); -}; - -/** - * Change the connection's coordinates. - * @param {number} x New absolute x coordinate. - * @param {number} y New absolute y coordinate. - */ -Blockly.Connection.prototype.moveTo = function(x, y) { - // Remove it from its old location in the database (if already present) - if (this.inDB_) { - this.db_.removeConnection_(this); - } - this.x_ = x; - this.y_ = y; - // Insert it into its new location in the database. - if (!this.hidden_) { - this.db_.addConnection_(this); - } -}; - -/** - * Change the connection's coordinates. - * @param {number} dx Change to x coordinate. - * @param {number} dy Change to y coordinate. - */ -Blockly.Connection.prototype.moveBy = function(dx, dy) { - this.moveTo(this.x_ + dx, this.y_ + dy); -}; - -/** - * Add highlighting around this connection. - */ -Blockly.Connection.prototype.highlight = function() { - var steps; - if (this.type == Blockly.INPUT_VALUE || this.type == Blockly.OUTPUT_VALUE) { - var tabWidth = this.sourceBlock_.RTL ? -Blockly.BlockSvg.TAB_WIDTH : - Blockly.BlockSvg.TAB_WIDTH; - steps = 'm 0,0 v 5 c 0,10 ' + -tabWidth + ',-8 ' + -tabWidth + ',7.5 s ' + - tabWidth + ',-2.5 ' + tabWidth + ',7.5 v 5'; - } else { - if (this.sourceBlock_.RTL) { - steps = 'm 20,0 h -5 ' + Blockly.BlockSvg.NOTCH_PATH_RIGHT + ' h -5'; - } else { - steps = 'm -20,0 h 5 ' + Blockly.BlockSvg.NOTCH_PATH_LEFT + ' h 5'; - } - } - var xy = this.sourceBlock_.getRelativeToSurfaceXY(); - var x = this.x_ - xy.x; - var y = this.y_ - xy.y; - Blockly.Connection.highlightedPath_ = Blockly.createSvgElement('path', - {'class': 'blocklyHighlightedConnectionPath', - 'd': steps, - transform: 'translate(' + x + ',' + y + ')'}, - this.sourceBlock_.getSvgRoot()); -}; - -/** - * Remove the highlighting around this connection. - */ -Blockly.Connection.prototype.unhighlight = function() { - goog.dom.removeNode(Blockly.Connection.highlightedPath_); - delete Blockly.Connection.highlightedPath_; -}; - -/** - * Move the blocks on either side of this connection right next to each other. - * @private - */ -Blockly.Connection.prototype.tighten_ = function() { - var dx = this.targetConnection.x_ - this.x_; - var dy = this.targetConnection.y_ - this.y_; - if (dx != 0 || dy != 0) { - var block = this.targetBlock(); - var svgRoot = block.getSvgRoot(); - if (!svgRoot) { - throw 'block is not rendered.'; - } - var xy = Blockly.getRelativeXY_(svgRoot); - block.getSvgRoot().setAttribute('transform', - 'translate(' + (xy.x - dx) + ',' + (xy.y - dy) + ')'); - block.moveConnections_(-dx, -dy); - } -}; - -/** - * Find the closest compatible connection to this connection. - * @param {number} maxLimit The maximum radius to another connection. - * @param {number} dx Horizontal offset between this connection's location - * in the database and the current location (as a result of dragging). - * @param {number} dy Vertical offset between this connection's location - * in the database and the current location (as a result of dragging). - * @return {!Object} Contains two properties: 'connection' which is either - * another connection or null, and 'radius' which is the distance. - */ -Blockly.Connection.prototype.closest = function(maxLimit, dx, dy) { - if (this.targetConnection) { - // Don't offer to connect to a connection that's already connected. - return {connection: null, radius: maxLimit}; - } - // Determine the opposite type of connection. - var db = this.dbOpposite_; - - // Since this connection is probably being dragged, add the delta. - var currentX = this.x_ + dx; - var currentY = this.y_ + dy; - - // Binary search to find the closest y location. - var pointerMin = 0; - var pointerMax = db.length - 2; - var pointerMid = pointerMax; - while (pointerMin < pointerMid) { - if (db[pointerMid].y_ < currentY) { - pointerMin = pointerMid; - } else { - pointerMax = pointerMid; - } - pointerMid = Math.floor((pointerMin + pointerMax) / 2); - } - - // Walk forward and back on the y axis looking for the closest x,y point. - pointerMin = pointerMid; - pointerMax = pointerMid; - var closestConnection = null; - var sourceBlock = this.sourceBlock_; - var thisConnection = this; - if (db.length) { - while (pointerMin >= 0 && checkConnection_(pointerMin)) { - pointerMin--; - } - do { - pointerMax++; - } while (pointerMax < db.length && checkConnection_(pointerMax)); - } - - /** - * Computes if the current connection is within the allowed radius of another - * connection. - * This function is a closure and has access to outside variables. - * @param {number} yIndex The other connection's index in the database. - * @return {boolean} True if the search needs to continue: either the current - * connection's vertical distance from the other connection is less than - * the allowed radius, or if the connection is not compatible. - * @private - */ - function checkConnection_(yIndex) { - var connection = db[yIndex]; - if (connection.type == Blockly.OUTPUT_VALUE || - connection.type == Blockly.PREVIOUS_STATEMENT) { - // Don't offer to connect an already connected left (male) value plug to - // an available right (female) value plug. Don't offer to connect the - // bottom of a statement block to one that's already connected. - if (connection.targetConnection) { - return true; - } - } - // Offering to connect the top of a statement block to an already connected - // connection is ok, we'll just insert it into the stack. - - // Offering to connect the left (male) of a value block to an already - // connected value pair is ok, we'll splice it in. - // However, don't offer to splice into an unmovable block. - if (connection.type == Blockly.INPUT_VALUE && - connection.targetConnection && - !connection.targetBlock().isMovable() && - !connection.targetBlock().isShadow()) { - return true; - } - - // Do type checking. - if (!thisConnection.checkType_(connection)) { - return true; - } - - // Don't let blocks try to connect to themselves or ones they nest. - var targetSourceBlock = connection.sourceBlock_; - do { - if (sourceBlock == targetSourceBlock) { - return true; - } - targetSourceBlock = targetSourceBlock.getParent(); - } while (targetSourceBlock); - - // Only connections within the maxLimit radius. - var dx = currentX - connection.x_; - var dy = currentY - connection.y_; - var r = Math.sqrt(dx * dx + dy * dy); - if (r <= maxLimit) { - closestConnection = connection; - maxLimit = r; - } - return Math.abs(dy) < maxLimit; - } - return {connection: closestConnection, radius: maxLimit}; -}; - -/** - * Is this connection compatible with another connection with respect to the - * value type system. E.g. square_root("Hello") is not compatible. - * @param {!Blockly.Connection} otherConnection Connection to compare against. - * @return {boolean} True if the connections share a type. - * @private - */ -Blockly.Connection.prototype.checkType_ = function(otherConnection) { - // Don't split a connection where both sides are immovable. - var thisTargetBlock = this.targetBlock(); - if (thisTargetBlock && !thisTargetBlock.isMovable() && - !this.sourceBlock_.isMovable()) { - return false; - } - var otherTargetBlock = otherConnection.targetBlock(); - if (otherTargetBlock && !otherTargetBlock.isMovable() && - !otherConnection.sourceBlock_.isMovable()) { - return false; - } - if (!this.check_ || !otherConnection.check_) { - // One or both sides are promiscuous enough that anything will fit. - return true; - } - // Find any intersection in the check lists. - for (var i = 0; i < this.check_.length; i++) { - if (otherConnection.check_.indexOf(this.check_[i]) != -1) { - return true; - } - } - // No intersection. - return false; -}; - -/** - * Change a connection's compatibility. - * @param {*} check Compatible value type or list of value types. - * Null if all types are compatible. - * @return {!Blockly.Connection} The connection being modified - * (to allow chaining). - */ -Blockly.Connection.prototype.setCheck = function(check) { - if (check) { - // Ensure that check is in an array. - if (!goog.isArray(check)) { - check = [check]; - } - this.check_ = check; - // The new value type may not be compatible with the existing connection. - if (this.targetConnection && !this.checkType_(this.targetConnection)) { - if (this.isSuperior()) { - this.targetBlock().setParent(null); - } else { - this.sourceBlock_.setParent(null); - } - // Bump away. - this.sourceBlock_.bumpNeighbours_(); - } - } else { - this.check_ = null; - } - return this; -}; - -/** - * Change a connection's shadow block. - * @param {Element} shadow DOM representation of a block or null. - */ -Blockly.Connection.prototype.setShadowDom = function(shadow) { - this.shadowDom_ = shadow; -}; - -/** - * Return a connection's shadow block. - * @return {Element} shadow DOM representation of a block or null. - */ -Blockly.Connection.prototype.getShadowDom = function() { - return this.shadowDom_; -}; - -/** - * Find all nearby compatible connections to this connection. - * Type checking does not apply, since this function is used for bumping. - * @param {number} maxLimit The maximum radius to another connection. - * @return {!Array.} List of connections. - * @private - */ -Blockly.Connection.prototype.neighbours_ = function(maxLimit) { - // Determine the opposite type of connection. - var db = this.dbOpposite_; - - var currentX = this.x_; - var currentY = this.y_; - - // Binary search to find the closest y location. - var pointerMin = 0; - var pointerMax = db.length - 2; - var pointerMid = pointerMax; - while (pointerMin < pointerMid) { - if (db[pointerMid].y_ < currentY) { - pointerMin = pointerMid; - } else { - pointerMax = pointerMid; - } - pointerMid = Math.floor((pointerMin + pointerMax) / 2); - } - - // Walk forward and back on the y axis looking for the closest x,y point. - pointerMin = pointerMid; - pointerMax = pointerMid; - var neighbours = []; - var sourceBlock = this.sourceBlock_; - if (db.length) { - while (pointerMin >= 0 && checkConnection_(pointerMin)) { - pointerMin--; - } - do { - pointerMax++; - } while (pointerMax < db.length && checkConnection_(pointerMax)); - } - - /** - * Computes if the current connection is within the allowed radius of another - * connection. - * This function is a closure and has access to outside variables. - * @param {number} yIndex The other connection's index in the database. - * @return {boolean} True if the current connection's vertical distance from - * the other connection is less than the allowed radius. - */ - function checkConnection_(yIndex) { - var dx = currentX - db[yIndex].x_; - var dy = currentY - db[yIndex].y_; - var r = Math.sqrt(dx * dx + dy * dy); - if (r <= maxLimit) { - neighbours.push(db[yIndex]); - } - return dy < maxLimit; - } - return neighbours; -}; - -/** - * Set whether this connections is hidden (not tracked in a database) or not. - * @param {boolean} hidden True if connection is hidden. - */ -Blockly.Connection.prototype.setHidden = function(hidden) { - this.hidden_ = hidden; - if (hidden && this.inDB_) { - this.db_.removeConnection_(this); - } else if (!hidden && !this.inDB_) { - this.db_.addConnection_(this); - } -}; - -/** - * Hide this connection, as well as all down-stream connections on any block - * attached to this connection. This happens when a block is collapsed. - * Also hides down-stream comments. - */ -Blockly.Connection.prototype.hideAll = function() { - this.setHidden(true); - if (this.targetConnection) { - var blocks = this.targetBlock().getDescendants(); - for (var b = 0; b < blocks.length; b++) { - var block = blocks[b]; - // Hide all connections of all children. - var connections = block.getConnections_(true); - for (var c = 0; c < connections.length; c++) { - connections[c].setHidden(true); - } - // Close all bubbles of all children. - var icons = block.getIcons(); - for (var i = 0; i < icons.length; i++) { - icons[i].setVisible(false); - } - } - } -}; - -/** - * Unhide this connection, as well as all down-stream connections on any block - * attached to this connection. This happens when a block is expanded. - * Also unhides down-stream comments. - * @return {!Array.} List of blocks to render. - */ -Blockly.Connection.prototype.unhideAll = function() { - this.setHidden(false); - // All blocks that need unhiding must be unhidden before any rendering takes - // place, since rendering requires knowing the dimensions of lower blocks. - // Also, since rendering a block renders all its parents, we only need to - // render the leaf nodes. - var renderList = []; - if (this.type != Blockly.INPUT_VALUE && this.type != Blockly.NEXT_STATEMENT) { - // Only spider down. - return renderList; - } - var block = this.targetBlock(); - if (block) { - var connections; - if (block.isCollapsed()) { - // This block should only be partially revealed since it is collapsed. - connections = []; - block.outputConnection && connections.push(block.outputConnection); - block.nextConnection && connections.push(block.nextConnection); - block.previousConnection && connections.push(block.previousConnection); - } else { - // Show all connections of this block. - connections = block.getConnections_(true); - } - for (var c = 0; c < connections.length; c++) { - renderList.push.apply(renderList, connections[c].unhideAll()); - } - if (renderList.length == 0) { - // Leaf block. - renderList[0] = block; - } - } - return renderList; -}; - - -/** - * Database of connections. - * Connections are stored in order of their vertical component. This way - * connections in an area may be looked up quickly using a binary search. - * @constructor - */ -Blockly.ConnectionDB = function() { -}; - -Blockly.ConnectionDB.prototype = new Array(); -/** - * Don't inherit the constructor from Array. - * @type {!Function} - */ -Blockly.ConnectionDB.constructor = Blockly.ConnectionDB; - -/** - * Add a connection to the database. Must not already exist in DB. - * @param {!Blockly.Connection} connection The connection to be added. - * @private - */ -Blockly.ConnectionDB.prototype.addConnection_ = function(connection) { - if (connection.inDB_) { - throw 'Connection already in database.'; - } - if (connection.sourceBlock_.isInFlyout) { - // Don't bother maintaining a database of connections in a flyout. - return; - } - // Insert connection using binary search. - var pointerMin = 0; - var pointerMax = this.length; - while (pointerMin < pointerMax) { - var pointerMid = Math.floor((pointerMin + pointerMax) / 2); - if (this[pointerMid].y_ < connection.y_) { - pointerMin = pointerMid + 1; - } else if (this[pointerMid].y_ > connection.y_) { - pointerMax = pointerMid; - } else { - pointerMin = pointerMid; - break; - } - } - this.splice(pointerMin, 0, connection); - connection.inDB_ = true; -}; - -/** - * Remove a connection from the database. Must already exist in DB. - * @param {!Blockly.Connection} connection The connection to be removed. - * @private - */ -Blockly.ConnectionDB.prototype.removeConnection_ = function(connection) { - if (!connection.inDB_) { - throw 'Connection not in database.'; - } - connection.inDB_ = false; - // Find the connection using a binary search. - // About 10% faster than a linear search using indexOf. - var pointerMin = 0; - var pointerMax = this.length - 2; - var pointerMid = pointerMax; - while (pointerMin < pointerMid) { - if (this[pointerMid].y_ < connection.y_) { - pointerMin = pointerMid; - } else { - pointerMax = pointerMid; - } - pointerMid = Math.floor((pointerMin + pointerMax) / 2); - } - - // Walk forward and back on the y axis looking for the connection. - // When found, splice it out of the array. - pointerMin = pointerMid; - pointerMax = pointerMid; - while (pointerMin >= 0 && this[pointerMin].y_ == connection.y_) { - if (this[pointerMin] == connection) { - this.splice(pointerMin, 1); - return; - } - pointerMin--; - } - do { - if (this[pointerMax] == connection) { - this.splice(pointerMax, 1); - return; - } - pointerMax++; - } while (pointerMax < this.length && - this[pointerMax].y_ == connection.y_); - throw 'Unable to find connection in connectionDB.'; -}; - -/** - * Initialize a set of connection DBs for a specified workspace. - * @param {!Blockly.Workspace} workspace The workspace this DB is for. - */ -Blockly.ConnectionDB.init = function(workspace) { - // Create four databases, one for each connection type. - var dbList = []; - dbList[Blockly.INPUT_VALUE] = new Blockly.ConnectionDB(); - dbList[Blockly.OUTPUT_VALUE] = new Blockly.ConnectionDB(); - dbList[Blockly.NEXT_STATEMENT] = new Blockly.ConnectionDB(); - dbList[Blockly.PREVIOUS_STATEMENT] = new Blockly.ConnectionDB(); - workspace.connectionDBList = dbList; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/field.js b/src/opsoro/apps/visual_programming/static/blockly/core/field.js deleted file mode 100644 index 9dfed24..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/field.js +++ /dev/null @@ -1,414 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Input field. Used for editable titles, variables, etc. - * This is an abstract class that defines the UI on the block. Actual - * instances would be Blockly.FieldTextInput, Blockly.FieldDropdown, etc. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Field'); - -goog.require('goog.asserts'); -goog.require('goog.dom'); -goog.require('goog.math.Size'); -goog.require('goog.style'); -goog.require('goog.userAgent'); - - -/** - * Class for an editable field. - * @param {string} text The initial content of the field. - * @constructor - */ -Blockly.Field = function(text) { - this.size_ = new goog.math.Size(0, 25); - this.setText(text); -}; - -/** - * Temporary cache of text widths. - * @type {Object} - * @private - */ -Blockly.Field.cacheWidths_ = null; - -/** - * Number of current references to cache. - * @type {number} - * @private - */ -Blockly.Field.cacheReference_ = 0; - -/** - * Maximum characters of text to display before adding an ellipsis. - */ -Blockly.Field.prototype.maxDisplayLength = 50; - -/** - * Block this field is attached to. Starts as null, then in set in init. - * @private - */ -Blockly.Field.prototype.sourceBlock_ = null; - -/** - * Is the field visible, or hidden due to the block being collapsed? - * @private - */ -Blockly.Field.prototype.visible_ = true; - -/** - * Change handler called when user edits an editable field. - * @private - */ -Blockly.Field.prototype.changeHandler_ = null; - -/** - * Non-breaking space. - */ -Blockly.Field.NBSP = '\u00A0'; - -/** - * Editable fields are saved by the XML renderer, non-editable fields are not. - */ -Blockly.Field.prototype.EDITABLE = true; - -/** - * Install this field on a block. - * @param {!Blockly.Block} block The block containing this field. - */ -Blockly.Field.prototype.init = function(block) { - if (this.sourceBlock_) { - // Field has already been initialized once. - return; - } - this.sourceBlock_ = block; - // Build the DOM. - this.fieldGroup_ = Blockly.createSvgElement('g', {}, null); - if (!this.visible_) { - this.fieldGroup_.style.display = 'none'; - } - this.borderRect_ = Blockly.createSvgElement('rect', - {'rx': 4, - 'ry': 4, - 'x': -Blockly.BlockSvg.SEP_SPACE_X / 2, - 'y': 0, - 'height': 16}, this.fieldGroup_, this.sourceBlock_.workspace); - /** @type {!Element} */ - this.textElement_ = Blockly.createSvgElement('text', - {'class': 'blocklyText', 'y': this.size_.height - 12.5}, - this.fieldGroup_); - - this.updateEditable(); - block.getSvgRoot().appendChild(this.fieldGroup_); - this.mouseUpWrapper_ = - Blockly.bindEvent_(this.fieldGroup_, 'mouseup', this, this.onMouseUp_); - // Force a render. - this.updateTextNode_(); -}; - -/** - * Dispose of all DOM objects belonging to this editable field. - */ -Blockly.Field.prototype.dispose = function() { - if (this.mouseUpWrapper_) { - Blockly.unbindEvent_(this.mouseUpWrapper_); - this.mouseUpWrapper_ = null; - } - this.sourceBlock_ = null; - goog.dom.removeNode(this.fieldGroup_); - this.fieldGroup_ = null; - this.textElement_ = null; - this.borderRect_ = null; - this.changeHandler_ = null; -}; - -/** - * Add or remove the UI indicating if this field is editable or not. - */ -Blockly.Field.prototype.updateEditable = function() { - if (!this.EDITABLE || !this.sourceBlock_) { - return; - } - if (this.sourceBlock_.isEditable()) { - Blockly.addClass_(/** @type {!Element} */ (this.fieldGroup_), - 'blocklyEditableText'); - Blockly.removeClass_(/** @type {!Element} */ (this.fieldGroup_), - 'blocklyNoNEditableText'); - this.fieldGroup_.style.cursor = this.CURSOR; - } else { - Blockly.addClass_(/** @type {!Element} */ (this.fieldGroup_), - 'blocklyNonEditableText'); - Blockly.removeClass_(/** @type {!Element} */ (this.fieldGroup_), - 'blocklyEditableText'); - this.fieldGroup_.style.cursor = ''; - } -}; - -/** - * Gets whether this editable field is visible or not. - * @return {boolean} True if visible. - */ -Blockly.Field.prototype.isVisible = function() { - return this.visible_; -}; - -/** - * Sets whether this editable field is visible or not. - * @param {boolean} visible True if visible. - */ -Blockly.Field.prototype.setVisible = function(visible) { - if (this.visible_ == visible) { - return; - } - this.visible_ = visible; - var root = this.getSvgRoot(); - if (root) { - root.style.display = visible ? 'block' : 'none'; - this.render_(); - } -}; - -/** - * Sets a new change handler for editable fields. - * @param {Function} handler New change handler, or null. - */ -Blockly.Field.prototype.setChangeHandler = function(handler) { - this.changeHandler_ = handler; -}; - -/** - * Gets the group element for this editable field. - * Used for measuring the size and for positioning. - * @return {!Element} The group element. - */ -Blockly.Field.prototype.getSvgRoot = function() { - return /** @type {!Element} */ (this.fieldGroup_); -}; - -/** - * Draws the border with the correct width. - * Saves the computed width in a property. - * @private - */ -Blockly.Field.prototype.render_ = function() { - if (this.visible_ && this.textElement_) { - var key = this.textElement_.textContent + '\n' + - this.textElement_.className.baseVal; - if (Blockly.Field.cacheWidths_ && Blockly.Field.cacheWidths_[key]) { - var width = Blockly.Field.cacheWidths_[key]; - } else { - try { - var width = this.textElement_.getComputedTextLength(); - } catch (e) { - // MSIE 11 is known to throw "Unexpected call to method or property - // access." if Blockly is hidden. - var width = this.textElement_.textContent.length * 8; - } - if (Blockly.Field.cacheWidths_) { - Blockly.Field.cacheWidths_[key] = width; - } - } - if (this.borderRect_) { - this.borderRect_.setAttribute('width', - width + Blockly.BlockSvg.SEP_SPACE_X); - } - } else { - var width = 0; - } - this.size_.width = width; -}; - -/** - * Start caching field widths. Every call to this function MUST also call - * stopCache. Caches must not survive between execution threads. - * @type {Object} - * @private - */ -Blockly.Field.startCache = function() { - Blockly.Field.cacheReference_++; - if (!Blockly.Field.cacheWidths_) { - Blockly.Field.cacheWidths_ = {}; - } -}; - -/** - * Stop caching field widths. Unless caching was already on when the - * corresponding call to startCache was made. - * @type {number} - * @private - */ -Blockly.Field.stopCache = function() { - Blockly.Field.cacheReference_--; - if (!Blockly.Field.cacheReference_) { - Blockly.Field.cacheWidths_ = null; - } -}; - -/** - * Returns the height and width of the field. - * @return {!goog.math.Size} Height and width. - */ -Blockly.Field.prototype.getSize = function() { - if (!this.size_.width) { - this.render_(); - } - return this.size_; -}; - -/** - * Returns the height and width of the field, - * accounting for the workspace scaling. - * @return {!goog.math.Size} Height and width. - */ -Blockly.Field.prototype.getScaledBBox_ = function() { - var bBox = this.borderRect_.getBBox(); - // Create new object, as getBBox can return an uneditable SVGRect in IE. - return new goog.math.Size(bBox.width * this.sourceBlock_.workspace.scale, - bBox.height * this.sourceBlock_.workspace.scale); -}; - -/** - * Get the text from this field. - * @return {string} Current text. - */ -Blockly.Field.prototype.getText = function() { - return this.text_; -}; - -/** - * Set the text in this field. Trigger a rerender of the source block. - * @param {*} text New text. - */ -Blockly.Field.prototype.setText = function(text) { - if (text === null) { - // No change if null. - return; - } - text = String(text); - if (text === this.text_) { - // No change. - return; - } - this.text_ = text; - this.updateTextNode_(); - - if (this.sourceBlock_ && this.sourceBlock_.rendered) { - this.sourceBlock_.render(); - this.sourceBlock_.bumpNeighbours_(); - this.sourceBlock_.workspace.fireChangeEvent(); - } -}; - -/** - * Update the text node of this field to display the current text. - * @private - */ -Blockly.Field.prototype.updateTextNode_ = function() { - if (!this.textElement_) { - // Not rendered yet. - return; - } - var text = this.text_; - if (text.length > this.maxDisplayLength) { - // Truncate displayed string and add an ellipsis ('...'). - text = text.substring(0, this.maxDisplayLength - 2) + '\u2026'; - } - // Empty the text element. - goog.dom.removeChildren(/** @type {!Element} */ (this.textElement_)); - // Replace whitespace with non-breaking spaces so the text doesn't collapse. - text = text.replace(/\s/g, Blockly.Field.NBSP); - if (this.sourceBlock_.RTL && text) { - // The SVG is LTR, force text to be RTL. - text += '\u200F'; - } - if (!text) { - // Prevent the field from disappearing if empty. - text = Blockly.Field.NBSP; - } - var textNode = document.createTextNode(text); - this.textElement_.appendChild(textNode); - - // Cached width is obsolete. Clear it. - this.size_.width = 0; -}; - -/** - * By default there is no difference between the human-readable text and - * the language-neutral values. Subclasses (such as dropdown) may define this. - * @return {string} Current text. - */ -Blockly.Field.prototype.getValue = function() { - return this.getText(); -}; - -/** - * By default there is no difference between the human-readable text and - * the language-neutral values. Subclasses (such as dropdown) may define this. - * @param {string} text New text. - */ -Blockly.Field.prototype.setValue = function(text) { - this.setText(text); -}; - -/** - * Handle a mouse up event on an editable field. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.Field.prototype.onMouseUp_ = function(e) { - if ((goog.userAgent.IPHONE || goog.userAgent.IPAD) && - !goog.userAgent.isVersionOrHigher('537.51.2') && - e.layerX !== 0 && e.layerY !== 0) { - // Old iOS spawns a bogus event on the next touch after a 'prompt()' edit. - // Unlike the real events, these have a layerX and layerY set. - return; - } else if (Blockly.isRightButton(e)) { - // Right-click. - return; - } else if (Blockly.dragMode_ == 2) { - // Drag operation is concluding. Don't open the editor. - return; - } else if (this.sourceBlock_.isEditable()) { - // Non-abstract sub-classes must define a showEditor_ method. - this.showEditor_(); - } -}; - -/** - * Change the tooltip text for this field. - * @param {string|!Element} newTip Text for tooltip or a parent element to - * link to for its tooltip. - */ -Blockly.Field.prototype.setTooltip = function(newTip) { - // Non-abstract sub-classes may wish to implement this. See FieldLabel. -}; - -/** - * Return the absolute coordinates of the top-left corner of this field. - * The origin (0,0) is the top-left corner of the page body. - * @return {{!goog.math.Coordinate}} Object with .x and .y properties. - * @private - */ -Blockly.Field.prototype.getAbsoluteXY_ = function() { - return goog.style.getPageOffset(this.borderRect_); -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/field_angle.js b/src/opsoro/apps/visual_programming/static/blockly/core/field_angle.js deleted file mode 100644 index 8fb311f..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/field_angle.js +++ /dev/null @@ -1,279 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2013 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Angle input field. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.FieldAngle'); - -goog.require('Blockly.FieldTextInput'); -goog.require('goog.math'); -goog.require('goog.userAgent'); - - -/** - * Class for an editable angle field. - * @param {string} text The initial content of the field. - * @param {Function=} opt_changeHandler An optional function that is called - * to validate any constraints on what the user entered. Takes the new - * text as an argument and returns the accepted text or null to abort - * the change. - * @extends {Blockly.FieldTextInput} - * @constructor - */ -Blockly.FieldAngle = function(text, opt_changeHandler) { - // Add degree symbol: "360°" (LTR) or "°360" (RTL) - this.symbol_ = Blockly.createSvgElement('tspan', {}, null); - this.symbol_.appendChild(document.createTextNode('\u00B0')); - - Blockly.FieldAngle.superClass_.constructor.call(this, text, null); - this.setChangeHandler(opt_changeHandler); -}; -goog.inherits(Blockly.FieldAngle, Blockly.FieldTextInput); - -/** - * Sets a new change handler for angle field. - * @param {Function} handler New change handler, or null. - */ -Blockly.FieldAngle.prototype.setChangeHandler = function(handler) { - var wrappedHandler; - if (handler) { - // Wrap the user's change handler together with the angle validator. - wrappedHandler = function(value) { - var v1 = handler.call(this, value); - if (v1 === null) { - var v2 = v1; - } else { - if (v1 === undefined) { - v1 = value; - } - var v2 = Blockly.FieldAngle.angleValidator.call(this, v1); - if (v2 !== undefined) { - v2 = v1; - } - } - return v2 === value ? undefined : v2; - }; - } else { - wrappedHandler = Blockly.FieldAngle.angleValidator; - } - Blockly.FieldAngle.superClass_.setChangeHandler.call(this, wrappedHandler); -}; - -/** - * Round angles to the nearest 15 degrees when using mouse. - * Set to 0 to disable rounding. - */ -Blockly.FieldAngle.ROUND = 15; - -/** - * Half the width of protractor image. - */ -Blockly.FieldAngle.HALF = 100 / 2; - -/** - * Radius of protractor circle. Slightly smaller than protractor size since - * otherwise SVG crops off half the border at the edges. - */ -Blockly.FieldAngle.RADIUS = Blockly.FieldAngle.HALF - 1; - -/** - * Clean up this FieldAngle, as well as the inherited FieldTextInput. - * @return {!Function} Closure to call on destruction of the WidgetDiv. - * @private - */ -Blockly.FieldAngle.prototype.dispose_ = function() { - var thisField = this; - return function() { - Blockly.FieldAngle.superClass_.dispose_.call(thisField)(); - thisField.gauge_ = null; - if (thisField.clickWrapper_) { - Blockly.unbindEvent_(thisField.clickWrapper_); - } - if (thisField.moveWrapper1_) { - Blockly.unbindEvent_(thisField.moveWrapper1_); - } - if (thisField.moveWrapper2_) { - Blockly.unbindEvent_(thisField.moveWrapper2_); - } - }; -}; - -/** - * Show the inline free-text editor on top of the text. - * @private - */ -Blockly.FieldAngle.prototype.showEditor_ = function() { - var noFocus = - goog.userAgent.MOBILE || goog.userAgent.ANDROID || goog.userAgent.IPAD; - // Mobile browsers have issues with in-line textareas (focus & keyboards). - Blockly.FieldAngle.superClass_.showEditor_.call(this, noFocus); - var div = Blockly.WidgetDiv.DIV; - if (!div.firstChild) { - // Mobile interface uses window.prompt. - return; - } - // Build the SVG DOM. - var svg = Blockly.createSvgElement('svg', { - 'xmlns': 'http://www.w3.org/2000/svg', - 'xmlns:html': 'http://www.w3.org/1999/xhtml', - 'xmlns:xlink': 'http://www.w3.org/1999/xlink', - 'version': '1.1', - 'height': (Blockly.FieldAngle.HALF * 2) + 'px', - 'width': (Blockly.FieldAngle.HALF * 2) + 'px' - }, div); - var circle = Blockly.createSvgElement('circle', { - 'cx': Blockly.FieldAngle.HALF, 'cy': Blockly.FieldAngle.HALF, - 'r': Blockly.FieldAngle.RADIUS, - 'class': 'blocklyAngleCircle' - }, svg); - this.gauge_ = Blockly.createSvgElement('path', - {'class': 'blocklyAngleGauge'}, svg); - this.line_ = Blockly.createSvgElement('line', - {'x1': Blockly.FieldAngle.HALF, - 'y1': Blockly.FieldAngle.HALF, - 'class': 'blocklyAngleLine'}, svg); - // Draw markers around the edge. - for (var a = 0; a < 360; a += 15) { - Blockly.createSvgElement('line', { - 'x1': Blockly.FieldAngle.HALF + Blockly.FieldAngle.RADIUS, - 'y1': Blockly.FieldAngle.HALF, - 'x2': Blockly.FieldAngle.HALF + Blockly.FieldAngle.RADIUS - - (a % 45 == 0 ? 10 : 5), - 'y2': Blockly.FieldAngle.HALF, - 'class': 'blocklyAngleMarks', - 'transform': 'rotate(' + a + ',' + - Blockly.FieldAngle.HALF + ',' + Blockly.FieldAngle.HALF + ')' - }, svg); - } - svg.style.marginLeft = (15 - Blockly.FieldAngle.RADIUS) + 'px'; - this.clickWrapper_ = - Blockly.bindEvent_(svg, 'click', this, Blockly.WidgetDiv.hide); - this.moveWrapper1_ = - Blockly.bindEvent_(circle, 'mousemove', this, this.onMouseMove); - this.moveWrapper2_ = - Blockly.bindEvent_(this.gauge_, 'mousemove', this, this.onMouseMove); - this.updateGraph_(); -}; - -/** - * Set the angle to match the mouse's position. - * @param {!Event} e Mouse move event. - */ -Blockly.FieldAngle.prototype.onMouseMove = function(e) { - var bBox = this.gauge_.ownerSVGElement.getBoundingClientRect(); - var dx = e.clientX - bBox.left - Blockly.FieldAngle.HALF; - var dy = e.clientY - bBox.top - Blockly.FieldAngle.HALF; - var angle = Math.atan(-dy / dx); - if (isNaN(angle)) { - // This shouldn't happen, but let's not let this error propogate further. - return; - } - angle = goog.math.toDegrees(angle); - // 0: East, 90: North, 180: West, 270: South. - if (dx < 0) { - angle += 180; - } else if (dy > 0) { - angle += 360; - } - if (Blockly.FieldAngle.ROUND) { - angle = Math.round(angle / Blockly.FieldAngle.ROUND) * - Blockly.FieldAngle.ROUND; - } - if (angle >= 360) { - // Rounding may have rounded up to 360. - angle -= 360; - } - angle = String(angle); - Blockly.FieldTextInput.htmlInput_.value = angle; - this.setText(angle); - this.validate_(); -}; - -/** - * Insert a degree symbol. - * @param {?string} text New text. - */ -Blockly.FieldAngle.prototype.setText = function(text) { - Blockly.FieldAngle.superClass_.setText.call(this, text); - if (!this.textElement_) { - // Not rendered yet. - return; - } - this.updateGraph_(); - // Insert degree symbol. - if (this.sourceBlock_.RTL) { - this.textElement_.insertBefore(this.symbol_, this.textElement_.firstChild); - } else { - this.textElement_.appendChild(this.symbol_); - } - // Cached width is obsolete. Clear it. - this.size_.width = 0; -}; - -/** - * Redraw the graph with the current angle. - * @private - */ -Blockly.FieldAngle.prototype.updateGraph_ = function() { - if (!this.gauge_) { - return; - } - var angleRadians = goog.math.toRadians(Number(this.getText())); - if (isNaN(angleRadians)) { - this.gauge_.setAttribute('d', - 'M ' + Blockly.FieldAngle.HALF + ',' + Blockly.FieldAngle.HALF); - this.line_.setAttribute('x2', Blockly.FieldAngle.HALF); - this.line_.setAttribute('y2', Blockly.FieldAngle.HALF); - } else { - var x = Blockly.FieldAngle.HALF + Math.cos(angleRadians) * - Blockly.FieldAngle.RADIUS; - var y = Blockly.FieldAngle.HALF + Math.sin(angleRadians) * - -Blockly.FieldAngle.RADIUS; - var largeFlag = (angleRadians > Math.PI) ? 1 : 0; - this.gauge_.setAttribute('d', - 'M ' + Blockly.FieldAngle.HALF + ',' + Blockly.FieldAngle.HALF + - ' h ' + Blockly.FieldAngle.RADIUS + - ' A ' + Blockly.FieldAngle.RADIUS + ',' + Blockly.FieldAngle.RADIUS + - ' 0 ' + largeFlag + ' 0 ' + x + ',' + y + ' z'); - this.line_.setAttribute('x2', x); - this.line_.setAttribute('y2', y); - } -}; - -/** - * Ensure that only an angle may be entered. - * @param {string} text The user's text. - * @return {?string} A string representing a valid angle, or null if invalid. - */ -Blockly.FieldAngle.angleValidator = function(text) { - var n = Blockly.FieldTextInput.numberValidator(text); - if (n !== null) { - n = n % 360; - if (n < 0) { - n += 360; - } - n = String(n); - } - return n; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/field_checkbox.js b/src/opsoro/apps/visual_programming/static/blockly/core/field_checkbox.js deleted file mode 100644 index 1971432..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/field_checkbox.js +++ /dev/null @@ -1,116 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Checkbox field. Checked or not checked. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.FieldCheckbox'); - -goog.require('Blockly.Field'); - - -/** - * Class for a checkbox field. - * @param {string} state The initial state of the field ('TRUE' or 'FALSE'). - * @param {Function=} opt_changeHandler A function that is executed when a new - * option is selected. Its sole argument is the new checkbox state. If - * it returns a value, this becomes the new checkbox state, unless the - * value is null, in which case the change is aborted. - * @extends {Blockly.Field} - * @constructor - */ -Blockly.FieldCheckbox = function(state, opt_changeHandler) { - Blockly.FieldCheckbox.superClass_.constructor.call(this, ''); - - this.setChangeHandler(opt_changeHandler); - // Set the initial state. - this.setValue(state); -}; -goog.inherits(Blockly.FieldCheckbox, Blockly.Field); - -/** - * Mouse cursor style when over the hotspot that initiates editability. - */ -Blockly.FieldCheckbox.prototype.CURSOR = 'default'; - -/** - * Install this checkbox on a block. - * @param {!Blockly.Block} block The block containing this text. - */ -Blockly.FieldCheckbox.prototype.init = function(block) { - if (this.sourceBlock_) { - // Checkbox has already been initialized once. - return; - } - Blockly.FieldCheckbox.superClass_.init.call(this, block); - // The checkbox doesn't use the inherited text element. - // Instead it uses a custom checkmark element that is either visible or not. - this.checkElement_ = Blockly.createSvgElement('text', - {'class': 'blocklyText', 'x': -3, 'y': 14}, this.fieldGroup_); - var textNode = document.createTextNode('\u2713'); - this.checkElement_.appendChild(textNode); - this.checkElement_.style.display = this.state_ ? 'block' : 'none'; -}; - -/** - * Return 'TRUE' if the checkbox is checked, 'FALSE' otherwise. - * @return {string} Current state. - */ -Blockly.FieldCheckbox.prototype.getValue = function() { - return String(this.state_).toUpperCase(); -}; - -/** - * Set the checkbox to be checked if strBool is 'TRUE', unchecks otherwise. - * @param {string} strBool New state. - */ -Blockly.FieldCheckbox.prototype.setValue = function(strBool) { - var newState = (strBool == 'TRUE'); - if (this.state_ !== newState) { - this.state_ = newState; - if (this.checkElement_) { - this.checkElement_.style.display = newState ? 'block' : 'none'; - } - if (this.sourceBlock_ && this.sourceBlock_.rendered) { - this.sourceBlock_.workspace.fireChangeEvent(); - } - } -}; - -/** - * Toggle the state of the checkbox. - * @private - */ -Blockly.FieldCheckbox.prototype.showEditor_ = function() { - var newState = !this.state_; - if (this.sourceBlock_ && this.changeHandler_) { - // Call any change handler, and allow it to override. - var override = this.changeHandler_(newState); - if (override !== undefined) { - newState = override; - } - } - if (newState !== null) { - this.setValue(String(newState).toUpperCase()); - } -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/field_dropdown.js b/src/opsoro/apps/visual_programming/static/blockly/core/field_dropdown.js deleted file mode 100644 index 7373e47..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/field_dropdown.js +++ /dev/null @@ -1,320 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Dropdown input field. Used for editable titles and variables. - * In the interests of a consistent UI, the toolbox shares some functions and - * properties with the context menu. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.FieldDropdown'); - -goog.require('Blockly.Field'); -goog.require('goog.dom'); -goog.require('goog.events'); -goog.require('goog.style'); -goog.require('goog.ui.Menu'); -goog.require('goog.ui.MenuItem'); -goog.require('goog.userAgent'); - - -/** - * Class for an editable dropdown field. - * @param {(!Array.>|!Function)} menuGenerator An array of options - * for a dropdown list, or a function which generates these options. - * @param {Function=} opt_changeHandler A function that is executed when a new - * option is selected, with the newly selected value as its sole argument. - * If it returns a value, that value (which must be one of the options) will - * become selected in place of the newly selected option, unless the return - * value is null, in which case the change is aborted. - * @extends {Blockly.Field} - * @constructor - */ -Blockly.FieldDropdown = function(menuGenerator, opt_changeHandler) { - this.menuGenerator_ = menuGenerator; - this.setChangeHandler(opt_changeHandler); - this.trimOptions_(); - var firstTuple = this.getOptions_()[0]; - this.value_ = firstTuple[1]; - - // Call parent's constructor. - Blockly.FieldDropdown.superClass_.constructor.call(this, firstTuple[0]); -}; -goog.inherits(Blockly.FieldDropdown, Blockly.Field); - -/** - * Horizontal distance that a checkmark ovehangs the dropdown. - */ -Blockly.FieldDropdown.CHECKMARK_OVERHANG = 25; - -/** - * Android can't (in 2014) display "▾", so use "▼" instead. - */ -Blockly.FieldDropdown.ARROW_CHAR = goog.userAgent.ANDROID ? '\u25BC' : '\u25BE'; - -/** - * Mouse cursor style when over the hotspot that initiates the editor. - */ -Blockly.FieldDropdown.prototype.CURSOR = 'default'; - -/** - * Install this dropdown on a block. - * @param {!Blockly.Block} block The block containing this text. - */ -Blockly.FieldDropdown.prototype.init = function(block) { - if (this.sourceBlock_) { - // Dropdown has already been initialized once. - return; - } - - // Add dropdown arrow: "option ▾" (LTR) or "▾ אופציה" (RTL) - this.arrow_ = Blockly.createSvgElement('tspan', {}, null); - this.arrow_.appendChild(document.createTextNode( - block.RTL ? Blockly.FieldDropdown.ARROW_CHAR + ' ' : - ' ' + Blockly.FieldDropdown.ARROW_CHAR)); - - Blockly.FieldDropdown.superClass_.init.call(this, block); - // Force a reset of the text to add the arrow. - var text = this.text_; - this.text_ = null; - this.setText(text); -}; - -/** - * Create a dropdown menu under the text. - * @private - */ -Blockly.FieldDropdown.prototype.showEditor_ = function() { - Blockly.WidgetDiv.show(this, this.sourceBlock_.RTL, null); - var thisField = this; - - function callback(e) { - var menuItem = e.target; - if (menuItem) { - var value = menuItem.getValue(); - if (thisField.sourceBlock_ && thisField.changeHandler_) { - // Call any change handler, and allow it to override. - var override = thisField.changeHandler_(value); - if (override !== undefined) { - value = override; - } - } - if (value !== null) { - thisField.setValue(value); - } - } - Blockly.WidgetDiv.hideIfOwner(thisField); - } - - var menu = new goog.ui.Menu(); - menu.setRightToLeft(this.sourceBlock_.RTL); - var options = this.getOptions_(); - for (var x = 0; x < options.length; x++) { - var text = options[x][0]; // Human-readable text. - var value = options[x][1]; // Language-neutral value. - var menuItem = new goog.ui.MenuItem(text); - menuItem.setRightToLeft(this.sourceBlock_.RTL); - menuItem.setValue(value); - menuItem.setCheckable(true); - menu.addChild(menuItem, true); - menuItem.setChecked(value == this.value_); - } - // Listen for mouse/keyboard events. - goog.events.listen(menu, goog.ui.Component.EventType.ACTION, callback); - // Listen for touch events (why doesn't Closure handle this already?). - function callbackTouchStart(e) { - var control = this.getOwnerControl(/** @type {Node} */ (e.target)); - // Highlight the menu item. - control.handleMouseDown(e); - } - function callbackTouchEnd(e) { - var control = this.getOwnerControl(/** @type {Node} */ (e.target)); - // Activate the menu item. - control.performActionInternal(e); - } - menu.getHandler().listen(menu.getElement(), goog.events.EventType.TOUCHSTART, - callbackTouchStart); - menu.getHandler().listen(menu.getElement(), goog.events.EventType.TOUCHEND, - callbackTouchEnd); - - // Record windowSize and scrollOffset before adding menu. - var windowSize = goog.dom.getViewportSize(); - var scrollOffset = goog.style.getViewportPageOffset(document); - var xy = this.getAbsoluteXY_(); - var borderBBox = this.getScaledBBox_(); - var div = Blockly.WidgetDiv.DIV; - menu.render(div); - var menuDom = menu.getElement(); - Blockly.addClass_(menuDom, 'blocklyDropdownMenu'); - // Record menuSize after adding menu. - var menuSize = goog.style.getSize(menuDom); - // Recalculate height for the total content, not only box height. - menuSize.height = menuDom.scrollHeight; - - // Position the menu. - // Flip menu vertically if off the bottom. - if (xy.y + menuSize.height + borderBBox.height >= - windowSize.height + scrollOffset.y) { - xy.y -= menuSize.height + 2; - } else { - xy.y += borderBBox.height; - } - if (this.sourceBlock_.RTL) { - xy.x += borderBBox.width; - xy.x += Blockly.FieldDropdown.CHECKMARK_OVERHANG; - // Don't go offscreen left. - if (xy.x < scrollOffset.x + menuSize.width) { - xy.x = scrollOffset.x + menuSize.width; - } - } else { - xy.x -= Blockly.FieldDropdown.CHECKMARK_OVERHANG; - // Don't go offscreen right. - if (xy.x > windowSize.width + scrollOffset.x - menuSize.width) { - xy.x = windowSize.width + scrollOffset.x - menuSize.width; - } - } - Blockly.WidgetDiv.position(xy.x, xy.y, windowSize, scrollOffset, - this.sourceBlock_.RTL); - menu.setAllowAutoFocus(true); - menuDom.focus(); -}; - -/** - * Factor out common words in statically defined options. - * Create prefix and/or suffix labels. - * @private - */ -Blockly.FieldDropdown.prototype.trimOptions_ = function() { - this.prefixField = null; - this.suffixField = null; - var options = this.menuGenerator_; - if (!goog.isArray(options) || options.length < 2) { - return; - } - var strings = options.map(function(t) {return t[0];}); - var shortest = Blockly.shortestStringLength(strings); - var prefixLength = Blockly.commonWordPrefix(strings, shortest); - var suffixLength = Blockly.commonWordSuffix(strings, shortest); - if (!prefixLength && !suffixLength) { - return; - } - if (shortest <= prefixLength + suffixLength) { - // One or more strings will entirely vanish if we proceed. Abort. - return; - } - if (prefixLength) { - this.prefixField = strings[0].substring(0, prefixLength - 1); - } - if (suffixLength) { - this.suffixField = strings[0].substr(1 - suffixLength); - } - // Remove the prefix and suffix from the options. - var newOptions = []; - for (var x = 0; x < options.length; x++) { - var text = options[x][0]; - var value = options[x][1]; - text = text.substring(prefixLength, text.length - suffixLength); - newOptions[x] = [text, value]; - } - this.menuGenerator_ = newOptions; -}; - -/** - * Return a list of the options for this dropdown. - * @return {!Array.>} Array of option tuples: - * (human-readable text, language-neutral name). - * @private - */ -Blockly.FieldDropdown.prototype.getOptions_ = function() { - if (goog.isFunction(this.menuGenerator_)) { - return this.menuGenerator_.call(this); - } - return /** @type {!Array.>} */ (this.menuGenerator_); -}; - -/** - * Get the language-neutral value from this dropdown menu. - * @return {string} Current text. - */ -Blockly.FieldDropdown.prototype.getValue = function() { - return this.value_; -}; - -/** - * Set the language-neutral value for this dropdown menu. - * @param {string} newValue New value to set. - */ -Blockly.FieldDropdown.prototype.setValue = function(newValue) { - this.value_ = newValue; - // Look up and display the human-readable text. - var options = this.getOptions_(); - for (var x = 0; x < options.length; x++) { - // Options are tuples of human-readable text and language-neutral values. - if (options[x][1] == newValue) { - this.setText(options[x][0]); - return; - } - } - // Value not found. Add it, maybe it will become valid once set - // (like variable names). - this.setText(newValue); -}; - -/** - * Set the text in this field. Trigger a rerender of the source block. - * @param {?string} text New text. - */ -Blockly.FieldDropdown.prototype.setText = function(text) { - if (this.sourceBlock_ && this.arrow_) { - // Update arrow's colour. - this.arrow_.style.fill = Blockly.makeColour(this.sourceBlock_.getColour()); - } - if (text === null || text === this.text_) { - // No change if null. - return; - } - this.text_ = text; - this.updateTextNode_(); - - if (this.textElement_) { - // Insert dropdown arrow. - if (this.sourceBlock_.RTL) { - this.textElement_.insertBefore(this.arrow_, this.textElement_.firstChild); - } else { - this.textElement_.appendChild(this.arrow_); - } - } - - if (this.sourceBlock_ && this.sourceBlock_.rendered) { - this.sourceBlock_.render(); - this.sourceBlock_.bumpNeighbours_(); - this.sourceBlock_.workspace.fireChangeEvent(); - } -}; - -/** - * Close the dropdown menu if this input is being deleted. - */ -Blockly.FieldDropdown.prototype.dispose = function() { - Blockly.WidgetDiv.hideIfOwner(this); - Blockly.FieldDropdown.superClass_.dispose.call(this); -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/field_image.js b/src/opsoro/apps/visual_programming/static/blockly/core/field_image.js deleted file mode 100644 index 252d5fe..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/field_image.js +++ /dev/null @@ -1,168 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Image field. Used for titles, labels, etc. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.FieldImage'); - -goog.require('Blockly.Field'); -goog.require('goog.dom'); -goog.require('goog.math.Size'); -goog.require('goog.userAgent'); - - -/** - * Class for an image. - * @param {string} src The URL of the image. - * @param {number} width Width of the image. - * @param {number} height Height of the image. - * @param {string=} opt_alt Optional alt text for when block is collapsed. - * @extends {Blockly.Field} - * @constructor - */ -Blockly.FieldImage = function(src, width, height, opt_alt) { - this.sourceBlock_ = null; - // Ensure height and width are numbers. Strings are bad at math. - this.height_ = Number(height); - this.width_ = Number(width); - this.size_ = new goog.math.Size(this.width_, - this.height_ + 2 * Blockly.BlockSvg.INLINE_PADDING_Y); - this.text_ = opt_alt || ''; - this.setValue(src); -}; -goog.inherits(Blockly.FieldImage, Blockly.Field); - -/** - * Rectangular mask used by Firefox. - * @type {Element} - * @private - */ -Blockly.FieldImage.prototype.rectElement_ = null; - -/** - * Editable fields are saved by the XML renderer, non-editable fields are not. - */ -Blockly.FieldImage.prototype.EDITABLE = false; - -/** - * Install this image on a block. - * @param {!Blockly.Block} block The block containing this text. - */ -Blockly.FieldImage.prototype.init = function(block) { - if (this.sourceBlock_) { - // Image has already been initialized once. - return; - } - this.sourceBlock_ = block; - // Build the DOM. - this.fieldGroup_ = Blockly.createSvgElement('g', {}, null); - if (!this.visible_) { - this.fieldGroup_.style.display = 'none'; - } - this.imageElement_ = Blockly.createSvgElement('image', - {'height': this.height_ + 'px', - 'width': this.width_ + 'px'}, this.fieldGroup_); - this.setValue(this.src_); - if (goog.userAgent.GECKO) { - // Due to a Firefox bug which eats mouse events on image elements, - // a transparent rectangle needs to be placed on top of the image. - this.rectElement_ = Blockly.createSvgElement('rect', - {'height': this.height_ + 'px', - 'width': this.width_ + 'px', - 'fill-opacity': 0}, this.fieldGroup_); - } - block.getSvgRoot().appendChild(this.fieldGroup_); - - // Configure the field to be transparent with respect to tooltips. - var topElement = this.rectElement_ || this.imageElement_; - topElement.tooltip = this.sourceBlock_; - Blockly.Tooltip.bindMouseEvents(topElement); -}; - -/** - * Dispose of all DOM objects belonging to this text. - */ -Blockly.FieldImage.prototype.dispose = function() { - goog.dom.removeNode(this.fieldGroup_); - this.fieldGroup_ = null; - this.imageElement_ = null; - this.rectElement_ = null; -}; - -/** - * Change the tooltip text for this field. - * @param {string|!Element} newTip Text for tooltip or a parent element to - * link to for its tooltip. - */ -Blockly.FieldImage.prototype.setTooltip = function(newTip) { - var topElement = this.rectElement_ || this.imageElement_; - topElement.tooltip = newTip; -}; - -/** - * Get the source URL of this image. - * @return {string} Current text. - * @override - */ -Blockly.FieldImage.prototype.getValue = function() { - return this.src_; -}; - -/** - * Set the source URL of this image. - * @param {?string} src New source. - * @override - */ -Blockly.FieldImage.prototype.setValue = function(src) { - if (src === null) { - // No change if null. - return; - } - this.src_ = src; - if (this.imageElement_) { - this.imageElement_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', goog.isString(src) ? src : ''); - } -}; - -/** - * Set the alt text of this image. - * @param {?string} alt New alt text. - * @override - */ -Blockly.FieldImage.prototype.setText = function(alt) { - if (alt === null) { - // No change if null. - return; - } - this.text_ = alt; -}; - -/** - * Images are fixed width, no need to render. - * @private - */ -Blockly.FieldImage.prototype.render_ = function() { - // NOP -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/field_textinput.js b/src/opsoro/apps/visual_programming/static/blockly/core/field_textinput.js deleted file mode 100644 index b019386..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/field_textinput.js +++ /dev/null @@ -1,323 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Text input field. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.FieldTextInput'); - -goog.require('Blockly.Field'); -goog.require('Blockly.Msg'); -goog.require('goog.asserts'); -goog.require('goog.dom'); -goog.require('goog.userAgent'); - - -/** - * Class for an editable text field. - * @param {string} text The initial content of the field. - * @param {Function=} opt_changeHandler An optional function that is called - * to validate any constraints on what the user entered. Takes the new - * text as an argument and returns either the accepted text, a replacement - * text, or null to abort the change. - * @extends {Blockly.Field} - * @constructor - */ -Blockly.FieldTextInput = function(text, opt_changeHandler) { - Blockly.FieldTextInput.superClass_.constructor.call(this, text); - this.setChangeHandler(opt_changeHandler); -}; -goog.inherits(Blockly.FieldTextInput, Blockly.Field); - -/** - * Point size of text. Should match blocklyText's font-size in CSS. - */ -Blockly.FieldTextInput.FONTSIZE = 11; - -/** - * Mouse cursor style when over the hotspot that initiates the editor. - */ -Blockly.FieldTextInput.prototype.CURSOR = 'text'; - -/** - * Allow browser to spellcheck this field. - * @private - */ -Blockly.FieldTextInput.prototype.spellcheck_ = true; - -/** - * Close the input widget if this input is being deleted. - */ -Blockly.FieldTextInput.prototype.dispose = function() { - Blockly.WidgetDiv.hideIfOwner(this); - Blockly.FieldTextInput.superClass_.dispose.call(this); -}; - -/** - * Set the text in this field. - * @param {?string} text New text. - * @override - */ -Blockly.FieldTextInput.prototype.setText = function(text) { - if (text === null) { - // No change if null. - return; - } - if (this.sourceBlock_ && this.changeHandler_) { - var validated = this.changeHandler_(text); - // If the new text is invalid, validation returns null. - // In this case we still want to display the illegal result. - if (validated !== null && validated !== undefined) { - text = validated; - } - } - Blockly.Field.prototype.setText.call(this, text); -}; - -/** - * Set whether this field is spellchecked by the browser. - * @param {boolean} check True if checked. - */ -Blockly.FieldTextInput.prototype.setSpellcheck = function(check) { - this.spellcheck_ = check; -}; - -/** - * Show the inline free-text editor on top of the text. - * @param {boolean=} opt_quietInput True if editor should be created without - * focus. Defaults to false. - * @private - */ -Blockly.FieldTextInput.prototype.showEditor_ = function(opt_quietInput) { - var quietInput = opt_quietInput || false; - if (!quietInput && (goog.userAgent.MOBILE || goog.userAgent.ANDROID || - goog.userAgent.IPAD)) { - // Mobile browsers have issues with in-line textareas (focus & keyboards). - var newValue = window.prompt(Blockly.Msg.CHANGE_VALUE_TITLE, this.text_); - if (this.sourceBlock_ && this.changeHandler_) { - var override = this.changeHandler_(newValue); - if (override !== undefined) { - newValue = override; - } - } - if (newValue !== null) { - this.setText(newValue); - } - return; - } - - Blockly.WidgetDiv.show(this, this.sourceBlock_.RTL, this.widgetDispose_()); - var div = Blockly.WidgetDiv.DIV; - // Create the input. - var htmlInput = goog.dom.createDom('input', 'blocklyHtmlInput'); - htmlInput.setAttribute('spellcheck', this.spellcheck_); - var fontSize = (Blockly.FieldTextInput.FONTSIZE * - this.sourceBlock_.workspace.scale) + 'pt'; - div.style.fontSize = fontSize; - htmlInput.style.fontSize = fontSize; - /** @type {!HTMLInputElement} */ - Blockly.FieldTextInput.htmlInput_ = htmlInput; - div.appendChild(htmlInput); - - htmlInput.value = htmlInput.defaultValue = this.text_; - htmlInput.oldValue_ = null; - this.validate_(); - this.resizeEditor_(); - if (!quietInput) { - htmlInput.focus(); - htmlInput.select(); - } - - // Bind to keydown -- trap Enter without IME and Esc to hide. - htmlInput.onKeyDownWrapper_ = - Blockly.bindEvent_(htmlInput, 'keydown', this, this.onHtmlInputKeyDown_); - // Bind to keyup -- trap Enter; resize after every keystroke. - htmlInput.onKeyUpWrapper_ = - Blockly.bindEvent_(htmlInput, 'keyup', this, this.onHtmlInputChange_); - // Bind to keyPress -- repeatedly resize when holding down a key. - htmlInput.onKeyPressWrapper_ = - Blockly.bindEvent_(htmlInput, 'keypress', this, this.onHtmlInputChange_); - var workspaceSvg = this.sourceBlock_.workspace.getCanvas(); - htmlInput.onWorkspaceChangeWrapper_ = - Blockly.bindEvent_(workspaceSvg, 'blocklyWorkspaceChange', this, - this.resizeEditor_); -}; - -/** - * Handle key down to the editor. - * @param {!Event} e Keyboard event. - * @private - */ -Blockly.FieldTextInput.prototype.onHtmlInputKeyDown_ = function(e) { - var htmlInput = Blockly.FieldTextInput.htmlInput_; - var enterKey = 13, escKey = 27; - if (e.keyCode == enterKey) { - Blockly.WidgetDiv.hide(); - } else if (e.keyCode == escKey) { - this.setText(htmlInput.defaultValue); - Blockly.WidgetDiv.hide(); - } -}; - -/** - * Handle a change to the editor. - * @param {!Event} e Keyboard event. - * @private - */ -Blockly.FieldTextInput.prototype.onHtmlInputChange_ = function(e) { - var htmlInput = Blockly.FieldTextInput.htmlInput_; - var escKey = 27; - if (e.keyCode != escKey) { - // Update source block. - var text = htmlInput.value; - if (text !== htmlInput.oldValue_) { - htmlInput.oldValue_ = text; - this.setText(text); - this.validate_(); - } else if (goog.userAgent.WEBKIT) { - // Cursor key. Render the source block to show the caret moving. - // Chrome only (version 26, OS X). - this.sourceBlock_.render(); - } - } -}; - -/** - * Check to see if the contents of the editor validates. - * Style the editor accordingly. - * @private - */ -Blockly.FieldTextInput.prototype.validate_ = function() { - var valid = true; - goog.asserts.assertObject(Blockly.FieldTextInput.htmlInput_); - var htmlInput = Blockly.FieldTextInput.htmlInput_; - if (this.sourceBlock_ && this.changeHandler_) { - valid = this.changeHandler_(htmlInput.value); - } - if (valid === null) { - Blockly.addClass_(htmlInput, 'blocklyInvalidInput'); - } else { - Blockly.removeClass_(htmlInput, 'blocklyInvalidInput'); - } -}; - -/** - * Resize the editor and the underlying block to fit the text. - * @private - */ -Blockly.FieldTextInput.prototype.resizeEditor_ = function() { - var div = Blockly.WidgetDiv.DIV; - var bBox = this.fieldGroup_.getBBox(); - div.style.width = bBox.width * this.sourceBlock_.workspace.scale + 'px'; - div.style.height = bBox.height * this.sourceBlock_.workspace.scale + 'px'; - var xy = this.getAbsoluteXY_(); - // In RTL mode block fields and LTR input fields the left edge moves, - // whereas the right edge is fixed. Reposition the editor. - if (this.sourceBlock_.RTL) { - var borderBBox = this.getScaledBBox_(); - xy.x += borderBBox.width; - xy.x -= div.offsetWidth; - } - // Shift by a few pixels to line up exactly. - xy.y += 1; - if (goog.userAgent.GECKO && Blockly.WidgetDiv.DIV.style.top) { - // Firefox mis-reports the location of the border by a pixel - // once the WidgetDiv is moved into position. - xy.x -= 1; - xy.y -= 1; - } - if (goog.userAgent.WEBKIT) { - xy.y -= 3; - } - div.style.left = xy.x + 'px'; - div.style.top = xy.y + 'px'; -}; - -/** - * Close the editor, save the results, and dispose of the editable - * text field's elements. - * @return {!Function} Closure to call on destruction of the WidgetDiv. - * @private - */ -Blockly.FieldTextInput.prototype.widgetDispose_ = function() { - var thisField = this; - return function() { - var htmlInput = Blockly.FieldTextInput.htmlInput_; - // Save the edit (if it validates). - var text = htmlInput.value; - if (thisField.sourceBlock_ && thisField.changeHandler_) { - var text1 = thisField.changeHandler_(text); - if (text1 === null) { - // Invalid edit. - text = htmlInput.defaultValue; - } else if (text1 !== undefined) { - // Change handler has changed the text. - text = text1; - } - } - thisField.setText(text); - thisField.sourceBlock_.rendered && thisField.sourceBlock_.render(); - Blockly.unbindEvent_(htmlInput.onKeyDownWrapper_); - Blockly.unbindEvent_(htmlInput.onKeyUpWrapper_); - Blockly.unbindEvent_(htmlInput.onKeyPressWrapper_); - Blockly.unbindEvent_(htmlInput.onWorkspaceChangeWrapper_); - Blockly.FieldTextInput.htmlInput_ = null; - // Delete style properties. - var style = Blockly.WidgetDiv.DIV.style; - style.width = 'auto'; - style.height = 'auto'; - style.fontSize = ''; - }; -}; - -/** - * Ensure that only a number may be entered. - * @param {string} text The user's text. - * @return {?string} A string representing a valid number, or null if invalid. - */ -Blockly.FieldTextInput.numberValidator = function(text) { - if (text === null) { - return null; - } - text = String(text); - // TODO: Handle cases like 'ten', '1.203,14', etc. - // 'O' is sometimes mistaken for '0' by inexperienced users. - text = text.replace(/O/ig, '0'); - // Strip out thousands separators. - text = text.replace(/,/g, ''); - var n = parseFloat(text || 0); - return isNaN(n) ? null : String(n); -}; - -/** - * Ensure that only a nonnegative integer may be entered. - * @param {string} text The user's text. - * @return {?string} A string representing a valid int, or null if invalid. - */ -Blockly.FieldTextInput.nonnegativeIntegerValidator = function(text) { - var n = Blockly.FieldTextInput.numberValidator(text); - if (n) { - n = String(Math.max(0, Math.floor(n))); - } - return n; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/field_variable.js b/src/opsoro/apps/visual_programming/static/blockly/core/field_variable.js deleted file mode 100644 index a03cfe6..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/field_variable.js +++ /dev/null @@ -1,197 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Variable input field. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.FieldVariable'); - -goog.require('Blockly.FieldDropdown'); -goog.require('Blockly.Msg'); -goog.require('Blockly.Variables'); -goog.require('goog.string'); - - -/** - * Class for a variable's dropdown field. - * @param {?string} varname The default name for the variable. If null, - * a unique variable name will be generated. - * @param {Function=} opt_changeHandler A function that is executed when a new - * option is selected. Its sole argument is the new option value. - * @extends {Blockly.FieldDropdown} - * @constructor - */ -Blockly.FieldVariable = function(varname, opt_changeHandler) { - Blockly.FieldVariable.superClass_.constructor.call(this, - Blockly.FieldVariable.dropdownCreate, null); - this.setChangeHandler(opt_changeHandler); - this.setValue(varname || ''); -}; -goog.inherits(Blockly.FieldVariable, Blockly.FieldDropdown); - -/** - * Sets a new change handler for angle field. - * @param {Function} handler New change handler, or null. - */ -Blockly.FieldVariable.prototype.setChangeHandler = function(handler) { - var wrappedHandler; - if (handler) { - // Wrap the user's change handler together with the variable rename handler. - wrappedHandler = function(value) { - var v1 = handler.call(this, value); - if (v1 === null) { - var v2 = v1; - } else { - if (v1 === undefined) { - v1 = value; - } - var v2 = Blockly.FieldVariable.dropdownChange.call(this, v1); - if (v2 !== undefined) { - v2 = v1; - } - } - return v2 === value ? undefined : v2; - }; - } else { - wrappedHandler = Blockly.FieldVariable.dropdownChange; - } - Blockly.FieldVariable.superClass_.setChangeHandler.call(this, wrappedHandler); -}; - -/** - * Install this dropdown on a block. - * @param {!Blockly.Block} block The block containing this text. - */ -Blockly.FieldVariable.prototype.init = function(block) { - if (this.sourceBlock_) { - // Dropdown has already been initialized once. - return; - } - - if (!this.getValue()) { - // Variables without names get uniquely named for this workspace. - if (block.isInFlyout) { - var workspace = block.workspace.targetWorkspace; - } else { - var workspace = block.workspace; - } - this.setValue(Blockly.Variables.generateUniqueName(workspace)); - } - Blockly.FieldVariable.superClass_.init.call(this, block); -}; - -/** - * Get the variable's name (use a variableDB to convert into a real name). - * Unline a regular dropdown, variables are literal and have no neutral value. - * @return {string} Current text. - */ -Blockly.FieldVariable.prototype.getValue = function() { - return this.getText(); -}; - -/** - * Set the variable name. - * @param {string} text New text. - */ -Blockly.FieldVariable.prototype.setValue = function(text) { - this.value_ = text; - this.setText(text); -}; - -/** - * Return a sorted list of variable names for variable dropdown menus. - * Include a special option at the end for creating a new variable name. - * @return {!Array.} Array of variable names. - * @this {!Blockly.FieldVariable} - */ -Blockly.FieldVariable.dropdownCreate = function() { - if (this.sourceBlock_ && this.sourceBlock_.workspace) { - var variableList = - Blockly.Variables.allVariables(this.sourceBlock_.workspace); - } else { - var variableList = []; - } - // Ensure that the currently selected variable is an option. - var name = this.getText(); - if (name && variableList.indexOf(name) == -1) { - variableList.push(name); - } - variableList.sort(goog.string.caseInsensitiveCompare); - variableList.push(Blockly.Msg.RENAME_VARIABLE); - variableList.push(Blockly.Msg.NEW_VARIABLE); - // Variables are not language-specific, use the name as both the user-facing - // text and the internal representation. - var options = []; - for (var x = 0; x < variableList.length; x++) { - options[x] = [variableList[x], variableList[x]]; - } - return options; -}; - -/** - * Event handler for a change in variable name. - * Special case the 'New variable...' and 'Rename variable...' options. - * In both of these special cases, prompt the user for a new name. - * @param {string} text The selected dropdown menu option. - * @return {null|undefined|string} An acceptable new variable name, or null if - * change is to be either aborted (cancel button) or has been already - * handled (rename), or undefined if an existing variable was chosen. - * @this {!Blockly.FieldVariable} - */ -Blockly.FieldVariable.dropdownChange = function(text) { - function promptName(promptText, defaultText) { - Blockly.hideChaff(); - var newVar = window.prompt(promptText, defaultText); - // Merge runs of whitespace. Strip leading and trailing whitespace. - // Beyond this, all names are legal. - if (newVar) { - newVar = newVar.replace(/[\s\xa0]+/g, ' ').replace(/^ | $/g, ''); - if (newVar == Blockly.Msg.RENAME_VARIABLE || - newVar == Blockly.Msg.NEW_VARIABLE) { - // Ok, not ALL names are legal... - newVar = null; - } - } - return newVar; - } - var workspace = this.sourceBlock_.workspace; - if (text == Blockly.Msg.RENAME_VARIABLE) { - var oldVar = this.getText(); - text = promptName(Blockly.Msg.RENAME_VARIABLE_TITLE.replace('%1', oldVar), - oldVar); - if (text) { - Blockly.Variables.renameVariable(oldVar, text, workspace); - } - return null; - } else if (text == Blockly.Msg.NEW_VARIABLE) { - text = promptName(Blockly.Msg.NEW_VARIABLE_TITLE, ''); - // Since variables are case-insensitive, ensure that if the new variable - // matches with an existing variable, the new case prevails throughout. - if (text) { - Blockly.Variables.renameVariable(text, text, workspace); - return text; - } - return null; - } - return undefined; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/flyout.js b/src/opsoro/apps/visual_programming/static/blockly/core/flyout.js deleted file mode 100644 index 5319d91..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/flyout.js +++ /dev/null @@ -1,725 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Flyout tray containing blocks which may be created. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Flyout'); - -goog.require('Blockly.Block'); -goog.require('Blockly.Comment'); -goog.require('Blockly.WorkspaceSvg'); -goog.require('goog.dom'); -goog.require('goog.events'); -goog.require('goog.math.Rect'); -goog.require('goog.userAgent'); - - -/** - * Class for a flyout. - * @param {!Object} workspaceOptions Dictionary of options for the workspace. - * @constructor - */ -Blockly.Flyout = function(workspaceOptions) { - var flyout = this; - workspaceOptions.getMetrics = function() {return flyout.getMetrics_();}; - workspaceOptions.setMetrics = - function(ratio) {return flyout.setMetrics_(ratio);}; - /** - * @type {!Blockly.Workspace} - * @private - */ - this.workspace_ = new Blockly.WorkspaceSvg(workspaceOptions); - this.workspace_.isFlyout = true; - - /** - * Is RTL vs LTR. - * @type {boolean} - */ - this.RTL = !!workspaceOptions.RTL; - - /** - * Opaque data that can be passed to Blockly.unbindEvent_. - * @type {!Array.} - * @private - */ - this.eventWrappers_ = []; - - /** - * List of background buttons that lurk behind each block to catch clicks - * landing in the blocks' lakes and bays. - * @type {!Array.} - * @private - */ - this.buttons_ = []; - - /** - * List of event listeners. - * @type {!Array.} - * @private - */ - this.listeners_ = []; -}; - -/** - * Does the flyout automatically close when a block is created? - * @type {boolean} - */ -Blockly.Flyout.prototype.autoClose = true; - -/** - * Corner radius of the flyout background. - * @type {number} - * @const - */ -Blockly.Flyout.prototype.CORNER_RADIUS = 8; - -/** - * Top/bottom padding between scrollbar and edge of flyout background. - * @type {number} - * @const - */ -Blockly.Flyout.prototype.SCROLLBAR_PADDING = 2; - -/** - * Width of flyout. - * @type {number} - * @private - */ -Blockly.Flyout.prototype.width_ = 0; - -/** - * Height of flyout. - * @type {number} - * @private - */ -Blockly.Flyout.prototype.height_ = 0; - -/** - * Creates the flyout's DOM. Only needs to be called once. - * @return {!Element} The flyout's SVG group. - */ -Blockly.Flyout.prototype.createDom = function() { - /* - - - - - */ - this.svgGroup_ = Blockly.createSvgElement('g', - {'class': 'blocklyFlyout'}, null); - this.svgBackground_ = Blockly.createSvgElement('path', - {'class': 'blocklyFlyoutBackground'}, this.svgGroup_); - this.svgGroup_.appendChild(this.workspace_.createDom()); - return this.svgGroup_; -}; - -/** - * Initializes the flyout. - * @param {!Blockly.Workspace} targetWorkspace The workspace in which to create - * new blocks. - */ -Blockly.Flyout.prototype.init = function(targetWorkspace) { - this.targetWorkspace_ = targetWorkspace; - this.workspace_.targetWorkspace = targetWorkspace; - // Add scrollbar. - this.scrollbar_ = new Blockly.Scrollbar(this.workspace_, false, false); - - this.hide(); - - Array.prototype.push.apply(this.eventWrappers_, - Blockly.bindEvent_(this.svgGroup_, 'wheel', this, this.wheel_)); - Array.prototype.push.apply(this.eventWrappers_, - Blockly.bindEvent_(this.targetWorkspace_.getCanvas(), - 'blocklyWorkspaceChange', this, this.filterForCapacity_)); - // Dragging the flyout up and down. - Array.prototype.push.apply(this.eventWrappers_, - Blockly.bindEvent_(this.svgGroup_, 'mousedown', this, this.onMouseDown_)); -}; - -/** - * Dispose of this flyout. - * Unlink from all DOM elements to prevent memory leaks. - */ -Blockly.Flyout.prototype.dispose = function() { - this.hide(); - Blockly.unbindEvent_(this.eventWrappers_); - if (this.scrollbar_) { - this.scrollbar_.dispose(); - this.scrollbar_ = null; - } - if (this.workspace_) { - this.workspace_.targetWorkspace = null; - this.workspace_.dispose(); - this.workspace_ = null; - } - if (this.svgGroup_) { - goog.dom.removeNode(this.svgGroup_); - this.svgGroup_ = null; - } - this.svgBackground_ = null; - this.targetWorkspace_ = null; -}; - -/** - * Return an object with all the metrics required to size scrollbars for the - * flyout. The following properties are computed: - * .viewHeight: Height of the visible rectangle, - * .viewWidth: Width of the visible rectangle, - * .contentHeight: Height of the contents, - * .viewTop: Offset of top edge of visible rectangle from parent, - * .contentTop: Offset of the top-most content from the y=0 coordinate, - * .absoluteTop: Top-edge of view. - * .absoluteLeft: Left-edge of view. - * @return {Object} Contains size and position metrics of the flyout. - * @private - */ -Blockly.Flyout.prototype.getMetrics_ = function() { - if (!this.isVisible()) { - // Flyout is hidden. - return null; - } - var viewHeight = this.height_ - 2 * this.SCROLLBAR_PADDING; - var viewWidth = this.width_; - try { - var optionBox = this.workspace_.getCanvas().getBBox(); - } catch (e) { - // Firefox has trouble with hidden elements (Bug 528969). - var optionBox = {height: 0, y: 0}; - } - return { - viewHeight: viewHeight, - viewWidth: viewWidth, - contentHeight: (optionBox.height + optionBox.y) * this.workspace_.scale, - viewTop: -this.workspace_.scrollY, - contentTop: 0, - absoluteTop: this.SCROLLBAR_PADDING, - absoluteLeft: 0 - }; -}; - -/** - * Sets the Y translation of the flyout to match the scrollbars. - * @param {!Object} yRatio Contains a y property which is a float - * between 0 and 1 specifying the degree of scrolling. - * @private - */ -Blockly.Flyout.prototype.setMetrics_ = function(yRatio) { - var metrics = this.getMetrics_(); - // This is a fix to an apparent race condition. - if (!metrics) { - return; - } - if (goog.isNumber(yRatio.y)) { - this.workspace_.scrollY = - -metrics.contentHeight * yRatio.y - metrics.contentTop; - } - this.workspace_.translate(0, this.workspace_.scrollY + metrics.absoluteTop); -}; - -/** - * Move the toolbox to the edge of the workspace. - */ -Blockly.Flyout.prototype.position = function() { - if (!this.isVisible()) { - return; - } - var metrics = this.targetWorkspace_.getMetrics(); - if (!metrics) { - // Hidden components will return null. - return; - } - var edgeWidth = this.width_ - this.CORNER_RADIUS; - if (this.RTL) { - edgeWidth *= -1; - } - var path = ['M ' + (this.RTL ? this.width_ : 0) + ',0']; - path.push('h', edgeWidth); - path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, - this.RTL ? 0 : 1, - this.RTL ? -this.CORNER_RADIUS : this.CORNER_RADIUS, - this.CORNER_RADIUS); - path.push('v', Math.max(0, metrics.viewHeight - this.CORNER_RADIUS * 2)); - path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, - this.RTL ? 0 : 1, - this.RTL ? this.CORNER_RADIUS : -this.CORNER_RADIUS, - this.CORNER_RADIUS); - path.push('h', -edgeWidth); - path.push('z'); - this.svgBackground_.setAttribute('d', path.join(' ')); - - var x = metrics.absoluteLeft; - if (this.RTL) { - x += metrics.viewWidth; - x -= this.width_; - } - this.svgGroup_.setAttribute('transform', - 'translate(' + x + ',' + metrics.absoluteTop + ')'); - - // Record the height for Blockly.Flyout.getMetrics_. - this.height_ = metrics.viewHeight; - - // Update the scrollbar (if one exists). - if (this.scrollbar_) { - this.scrollbar_.resize(); - } -}; - -/** - * Scroll the flyout to the top. - */ -Blockly.Flyout.prototype.scrollToTop = function() { - this.scrollbar_.set(0); -}; - -/** - * Scroll the flyout up or down. - * @param {!Event} e Mouse wheel scroll event. - * @private - */ -Blockly.Flyout.prototype.wheel_ = function(e) { - var delta = e.deltaY; - if (delta) { - if (goog.userAgent.GECKO) { - // Firefox's deltas are a tenth that of Chrome/Safari. - delta *= 10; - } - var metrics = this.getMetrics_(); - var y = metrics.viewTop + delta; - y = Math.min(y, metrics.contentHeight - metrics.viewHeight); - y = Math.max(y, 0); - this.scrollbar_.set(y); - // Don't scroll the page. - e.preventDefault(); - // Don't propagate mousewheel event (zooming). - e.stopPropagation(); - } -}; - -/** - * Is the flyout visible? - * @return {boolean} True if visible. - */ -Blockly.Flyout.prototype.isVisible = function() { - return this.svgGroup_ && this.svgGroup_.style.display == 'block'; -}; - -/** - * Hide and empty the flyout. - */ -Blockly.Flyout.prototype.hide = function() { - if (!this.isVisible()) { - return; - } - this.svgGroup_.style.display = 'none'; - // Delete all the event listeners. - for (var x = 0, listen; listen = this.listeners_[x]; x++) { - Blockly.unbindEvent_(listen); - } - this.listeners_.length = 0; - if (this.reflowWrapper_) { - Blockly.unbindEvent_(this.reflowWrapper_); - this.reflowWrapper_ = null; - } - // Do NOT delete the blocks here. Wait until Flyout.show. - // https://neil.fraser.name/news/2014/08/09/ -}; - -/** - * Show and populate the flyout. - * @param {!Array|string} xmlList List of blocks to show. - * Variables and procedures have a custom set of blocks. - */ -Blockly.Flyout.prototype.show = function(xmlList) { - this.hide(); - // Delete any blocks from a previous showing. - var blocks = this.workspace_.getTopBlocks(false); - for (var x = 0, block; block = blocks[x]; x++) { - if (block.workspace == this.workspace_) { - block.dispose(false, false); - } - } - // Delete any background buttons from a previous showing. - for (var x = 0, rect; rect = this.buttons_[x]; x++) { - goog.dom.removeNode(rect); - } - this.buttons_.length = 0; - - var margin = this.CORNER_RADIUS; - this.svgGroup_.style.display = 'block'; - - // Create the blocks to be shown in this flyout. - var blocks = []; - var gaps = []; - if (xmlList == Blockly.Variables.NAME_TYPE) { - // Special category for variables. - Blockly.Variables.flyoutCategory(blocks, gaps, margin, - /** @type {!Blockly.Workspace} */ (this.workspace_)); - } else if (xmlList == Blockly.Procedures.NAME_TYPE) { - // Special category for procedures. - Blockly.Procedures.flyoutCategory(blocks, gaps, margin, - /** @type {!Blockly.Workspace} */ (this.workspace_)); - } else { - for (var i = 0, xml; xml = xmlList[i]; i++) { - if (xml.tagName && xml.tagName.toUpperCase() == 'BLOCK') { - var block = Blockly.Xml.domToBlock( - /** @type {!Blockly.Workspace} */ (this.workspace_), xml); - blocks.push(block); - gaps.push(margin * 3); - } - } - } - - // Lay out the blocks vertically. - var cursorY = margin; - for (var i = 0, block; block = blocks[i]; i++) { - var allBlocks = block.getDescendants(); - for (var j = 0, child; child = allBlocks[j]; j++) { - // Mark blocks as being inside a flyout. This is used to detect and - // prevent the closure of the flyout if the user right-clicks on such a - // block. - child.isInFlyout = true; - // There is no good way to handle comment bubbles inside the flyout. - // Blocks shouldn't come with predefined comments, but someone will - // try this, I'm sure. Kill the comment. - child.setCommentText(null); - } - block.render(); - var root = block.getSvgRoot(); - var blockHW = block.getHeightWidth(); - var x = this.RTL ? 0 : margin / this.workspace_.scale + - Blockly.BlockSvg.TAB_WIDTH; - block.moveBy(x, cursorY); - cursorY += blockHW.height + gaps[i]; - - // Create an invisible rectangle under the block to act as a button. Just - // using the block as a button is poor, since blocks have holes in them. - var rect = Blockly.createSvgElement('rect', {'fill-opacity': 0}, null); - // Add the rectangles under the blocks, so that the blocks' tooltips work. - this.workspace_.getCanvas().insertBefore(rect, block.getSvgRoot()); - block.flyoutRect_ = rect; - this.buttons_[i] = rect; - - if (this.autoClose) { - this.listeners_.push(Blockly.bindEvent_(root, 'mousedown', null, - this.createBlockFunc_(block))); - } else { - this.listeners_.push(Blockly.bindEvent_(root, 'mousedown', null, - this.blockMouseDown_(block))); - } - this.listeners_.push(Blockly.bindEvent_(root, 'mouseover', block, - block.addSelect)); - this.listeners_.push(Blockly.bindEvent_(root, 'mouseout', block, - block.removeSelect)); - this.listeners_.push(Blockly.bindEvent_(rect, 'mousedown', null, - this.createBlockFunc_(block))); - this.listeners_.push(Blockly.bindEvent_(rect, 'mouseover', block, - block.addSelect)); - this.listeners_.push(Blockly.bindEvent_(rect, 'mouseout', block, - block.removeSelect)); - } - - // IE 11 is an incompetant browser that fails to fire mouseout events. - // When the mouse is over the background, deselect all blocks. - var deselectAll = function(e) { - var blocks = this.workspace_.getTopBlocks(false); - for (var i = 0, block; block = blocks[i]; i++) { - block.removeSelect(); - } - }; - this.listeners_.push(Blockly.bindEvent_(this.svgBackground_, 'mouseover', - this, deselectAll)); - - this.width_ = 0; - this.reflow(); - - this.filterForCapacity_(); - - // Fire a resize event to update the flyout's scrollbar. - Blockly.fireUiEventNow(window, 'resize'); - this.reflowWrapper_ = Blockly.bindEvent_(this.workspace_.getCanvas(), - 'blocklyWorkspaceChange', this, this.reflow); - this.workspace_.fireChangeEvent(); -}; - -/** - * Compute width of flyout. Position button under each block. - * For RTL: Lay out the blocks right-aligned. - */ -Blockly.Flyout.prototype.reflow = function() { - this.workspace_.scale = this.targetWorkspace_.scale; - var flyoutWidth = 0; - var margin = this.CORNER_RADIUS; - var blocks = this.workspace_.getTopBlocks(false); - for (var x = 0, block; block = blocks[x]; x++) { - var width = block.getHeightWidth().width; - if (block.outputConnection) { - width -= Blockly.BlockSvg.TAB_WIDTH; - } - flyoutWidth = Math.max(flyoutWidth, width); - } - flyoutWidth += Blockly.BlockSvg.TAB_WIDTH; - flyoutWidth *= this.workspace_.scale; - flyoutWidth += margin * 1.5 + Blockly.Scrollbar.scrollbarThickness; - if (this.width_ != flyoutWidth) { - for (var x = 0, block; block = blocks[x]; x++) { - var blockHW = block.getHeightWidth(); - if (this.RTL) { - // With the flyoutWidth known, right-align the blocks. - var oldX = block.getRelativeToSurfaceXY().x; - var dx = flyoutWidth - margin; - dx /= this.workspace_.scale; - dx -= Blockly.BlockSvg.TAB_WIDTH; - block.moveBy(dx - oldX, 0); - } - if (block.flyoutRect_) { - block.flyoutRect_.setAttribute('width', blockHW.width); - block.flyoutRect_.setAttribute('height', blockHW.height); - // Blocks with output tabs are shifted a bit. - var tab = block.outputConnection ? Blockly.BlockSvg.TAB_WIDTH : 0; - var blockXY = block.getRelativeToSurfaceXY(); - block.flyoutRect_.setAttribute('x', - this.RTL ? blockXY.x - blockHW.width + tab : blockXY.x - tab); - block.flyoutRect_.setAttribute('y', blockXY.y); - } - } - // Record the width for .getMetrics_ and .position. - this.width_ = flyoutWidth; - // Fire a resize event to update the flyout's scrollbar. - Blockly.fireUiEvent(window, 'resize'); - } -}; - -/** - * Handle a mouse-down on an SVG block in a non-closing flyout. - * @param {!Blockly.Block} block The flyout block to copy. - * @return {!Function} Function to call when block is clicked. - * @private - */ -Blockly.Flyout.prototype.blockMouseDown_ = function(block) { - var flyout = this; - return function(e) { - Blockly.terminateDrag_(); - Blockly.hideChaff(); - if (Blockly.isRightButton(e)) { - // Right-click. - block.showContextMenu_(e); - } else { - // Left-click (or middle click) - Blockly.removeAllRanges(); - Blockly.Css.setCursor(Blockly.Css.Cursor.CLOSED); - // Record the current mouse position. - Blockly.Flyout.startDownEvent_ = e; - Blockly.Flyout.startBlock_ = block; - Blockly.Flyout.startFlyout_ = flyout; - Blockly.Flyout.onMouseUpWrapper_ = Blockly.bindEvent_(document, - 'mouseup', this, Blockly.terminateDrag_); - Blockly.Flyout.onMouseMoveBlockWrapper_ = Blockly.bindEvent_(document, - 'mousemove', this, flyout.onMouseMoveBlock_); - } - // This event has been handled. No need to bubble up to the document. - e.stopPropagation(); - }; -}; - -/** - * Mouse down on the flyout background. Start a vertical scroll drag. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.Flyout.prototype.onMouseDown_ = function(e) { - if (Blockly.isRightButton(e)) { - return; - } - Blockly.hideChaff(true); - Blockly.Flyout.terminateDrag_(); - this.startDragMouseY_ = e.clientY; - Blockly.Flyout.onMouseMoveWrapper_ = Blockly.bindEvent_(document, 'mousemove', - this, this.onMouseMove_); - Blockly.Flyout.onMouseUpWrapper_ = Blockly.bindEvent_(document, 'mouseup', - this, Blockly.Flyout.terminateDrag_); - // This event has been handled. No need to bubble up to the document. - e.preventDefault(); - e.stopPropagation(); -}; - -/** - * Handle a mouse-move to vertically drag the flyout. - * @param {!Event} e Mouse move event. - * @private - */ -Blockly.Flyout.prototype.onMouseMove_ = function(e) { - var dy = e.clientY - this.startDragMouseY_; - this.startDragMouseY_ = e.clientY; - var metrics = this.getMetrics_(); - var y = metrics.viewTop - dy; - y = Math.min(y, metrics.contentHeight - metrics.viewHeight); - y = Math.max(y, 0); - this.scrollbar_.set(y); -}; - -/** - * Mouse button is down on a block in a non-closing flyout. Create the block - * if the mouse moves beyond a small radius. This allows one to play with - * fields without instantiating blocks that instantly self-destruct. - * @param {!Event} e Mouse move event. - * @private - */ -Blockly.Flyout.prototype.onMouseMoveBlock_ = function(e) { - if (e.type == 'mousemove' && e.clientX <= 1 && e.clientY == 0 && - e.button == 0) { - /* HACK: - Safari Mobile 6.0 and Chrome for Android 18.0 fire rogue mousemove events - on certain touch actions. Ignore events with these signatures. - This may result in a one-pixel blind spot in other browsers, - but this shouldn't be noticable. */ - e.stopPropagation(); - return; - } - Blockly.removeAllRanges(); - var dx = e.clientX - Blockly.Flyout.startDownEvent_.clientX; - var dy = e.clientY - Blockly.Flyout.startDownEvent_.clientY; - // Still dragging within the sticky DRAG_RADIUS. - if (Math.sqrt(dx * dx + dy * dy) > Blockly.DRAG_RADIUS) { - // Create the block. - Blockly.Flyout.startFlyout_.createBlockFunc_(Blockly.Flyout.startBlock_)( - Blockly.Flyout.startDownEvent_); - } -}; - -/** - * Create a copy of this block on the workspace. - * @param {!Blockly.Block} originBlock The flyout block to copy. - * @return {!Function} Function to call when block is clicked. - * @private - */ -Blockly.Flyout.prototype.createBlockFunc_ = function(originBlock) { - var flyout = this; - var workspace = this.targetWorkspace_; - return function(e) { - if (Blockly.isRightButton(e)) { - // Right-click. Don't create a block, let the context menu show. - return; - } - if (originBlock.disabled) { - // Beyond capacity. - return; - } - // Create the new block by cloning the block in the flyout (via XML). - var xml = Blockly.Xml.blockToDom_(originBlock); - var block = Blockly.Xml.domToBlock(workspace, xml); - // Place it in the same spot as the flyout copy. - var svgRootOld = originBlock.getSvgRoot(); - if (!svgRootOld) { - throw 'originBlock is not rendered.'; - } - var xyOld = Blockly.getSvgXY_(svgRootOld, workspace); - // Scale the scroll (getSvgXY_ did not do this). - if (flyout.RTL) { - var width = workspace.getMetrics().viewWidth - flyout.width_; - xyOld.x += width / workspace.scale - width; - } else { - xyOld.x += flyout.workspace_.scrollX / flyout.workspace_.scale - - flyout.workspace_.scrollX; - } - xyOld.y += flyout.workspace_.scrollY / flyout.workspace_.scale - - flyout.workspace_.scrollY; - var svgRootNew = block.getSvgRoot(); - if (!svgRootNew) { - throw 'block is not rendered.'; - } - var xyNew = Blockly.getSvgXY_(svgRootNew, workspace); - // Scale the scroll (getSvgXY_ did not do this). - xyNew.x += workspace.scrollX / workspace.scale - workspace.scrollX; - xyNew.y += workspace.scrollY / workspace.scale - workspace.scrollY; - block.moveBy(xyOld.x - xyNew.x, xyOld.y - xyNew.y); - if (flyout.autoClose) { - flyout.hide(); - } else { - flyout.filterForCapacity_(); - } - // Start a dragging operation on the new block. - block.onMouseDown_(e); - }; -}; - -/** - * Filter the blocks on the flyout to disable the ones that are above the - * capacity limit. - * @private - */ -Blockly.Flyout.prototype.filterForCapacity_ = function() { - var remainingCapacity = this.targetWorkspace_.remainingCapacity(); - var blocks = this.workspace_.getTopBlocks(false); - for (var i = 0, block; block = blocks[i]; i++) { - var allBlocks = block.getDescendants(); - var disabled = allBlocks.length > remainingCapacity; - block.setDisabled(disabled); - } -}; - -/** - * Return the deletion rectangle for this flyout. - * @return {goog.math.Rect} Rectangle in which to delete. - */ -Blockly.Flyout.prototype.getRect = function() { - // BIG_NUM is offscreen padding so that blocks dragged beyond the shown flyout - // area are still deleted. Must be larger than the largest screen size, - // but be smaller than half Number.MAX_SAFE_INTEGER (not available on IE). - var BIG_NUM = 1000000000; - var mainWorkspace = Blockly.mainWorkspace; - var x = Blockly.getSvgXY_(this.svgGroup_, mainWorkspace).x; - if (!this.RTL) { - x -= BIG_NUM; - } - // Fix scale if nested in zoomed workspace. - var scale = this.targetWorkspace_ == mainWorkspace ? 1 : mainWorkspace.scale; - return new goog.math.Rect(x, -BIG_NUM, - BIG_NUM + this.width_ * scale, BIG_NUM * 2); -}; - -/** - * Stop binding to the global mouseup and mousemove events. - * @private - */ -Blockly.Flyout.terminateDrag_ = function() { - if (Blockly.Flyout.onMouseUpWrapper_) { - Blockly.unbindEvent_(Blockly.Flyout.onMouseUpWrapper_); - Blockly.Flyout.onMouseUpWrapper_ = null; - } - if (Blockly.Flyout.onMouseMoveBlockWrapper_) { - Blockly.unbindEvent_(Blockly.Flyout.onMouseMoveBlockWrapper_); - Blockly.Flyout.onMouseMoveBlockWrapper_ = null; - } - if (Blockly.Flyout.onMouseMoveWrapper_) { - Blockly.unbindEvent_(Blockly.Flyout.onMouseMoveWrapper_); - Blockly.Flyout.onMouseMoveWrapper_ = null; - } - if (Blockly.Flyout.onMouseUpWrapper_) { - Blockly.unbindEvent_(Blockly.Flyout.onMouseUpWrapper_); - Blockly.Flyout.onMouseUpWrapper_ = null; - } - Blockly.Flyout.startDownEvent_ = null; - Blockly.Flyout.startBlock_ = null; - Blockly.Flyout.startFlyout_ = null; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/generator.js b/src/opsoro/apps/visual_programming/static/blockly/core/generator.js deleted file mode 100644 index ce0cc36..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/generator.js +++ /dev/null @@ -1,328 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Utility functions for generating executable code from - * Blockly code. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Generator'); - -goog.require('Blockly.Block'); -goog.require('goog.asserts'); - - -/** - * Class for a code generator that translates the blocks into a language. - * @param {string} name Language name of this generator. - * @constructor - */ -Blockly.Generator = function(name) { - this.name_ = name; - this.FUNCTION_NAME_PLACEHOLDER_REGEXP_ = - new RegExp(this.FUNCTION_NAME_PLACEHOLDER_, 'g'); -}; - -/** - * Category to separate generated function names from variables and procedures. - */ -Blockly.Generator.NAME_TYPE = 'generated_function'; - -/** - * Arbitrary code to inject into locations that risk causing infinite loops. - * Any instances of '%1' will be replaced by the block ID that failed. - * E.g. ' checkTimeout(%1);\n' - * @type {?string} - */ -Blockly.Generator.prototype.INFINITE_LOOP_TRAP = null; - -/** - * Arbitrary code to inject before every statement. - * Any instances of '%1' will be replaced by the block ID of the statement. - * E.g. 'highlight(%1);\n' - * @type {?string} - */ -Blockly.Generator.prototype.STATEMENT_PREFIX = null; - -/** - * Generate code for all blocks in the workspace to the specified language. - * @param {Blockly.Workspace} workspace Workspace to generate code from. - * @return {string} Generated code. - */ -Blockly.Generator.prototype.workspaceToCode = function(workspace) { - if (!workspace) { - // Backwards compatability from before there could be multiple workspaces. - console.warn('No workspace specified in workspaceToCode call. Guessing.'); - workspace = Blockly.getMainWorkspace(); - } - var code = []; - this.init(workspace); - var blocks = workspace.getTopBlocks(true); - for (var x = 0, block; block = blocks[x]; x++) { - var line = this.blockToCode(block); - if (goog.isArray(line)) { - // Value blocks return tuples of code and operator order. - // Top-level blocks don't care about operator order. - line = line[0]; - } - if (line) { - if (block.outputConnection && this.scrubNakedValue) { - // This block is a naked value. Ask the language's code generator if - // it wants to append a semicolon, or something. - line = this.scrubNakedValue(line); - } - code.push(line); - } - } - code = code.join('\n'); // Blank line between each section. - code = this.finish(code); - // Final scrubbing of whitespace. - code = code.replace(/^\s+\n/, ''); - code = code.replace(/\n\s+$/, '\n'); - code = code.replace(/[ \t]+\n/g, '\n'); - return code; -}; - -// The following are some helpful functions which can be used by multiple -// languages. - -/** - * Prepend a common prefix onto each line of code. - * @param {string} text The lines of code. - * @param {string} prefix The common prefix. - * @return {string} The prefixed lines of code. - */ -Blockly.Generator.prototype.prefixLines = function(text, prefix) { - return prefix + text.replace(/\n(.)/g, '\n' + prefix + '$1'); -}; - -/** - * Recursively spider a tree of blocks, returning all their comments. - * @param {!Blockly.Block} block The block from which to start spidering. - * @return {string} Concatenated list of comments. - */ -Blockly.Generator.prototype.allNestedComments = function(block) { - var comments = []; - var blocks = block.getDescendants(); - for (var x = 0; x < blocks.length; x++) { - var comment = blocks[x].getCommentText(); - if (comment) { - comments.push(comment); - } - } - // Append an empty string to create a trailing line break when joined. - if (comments.length) { - comments.push(''); - } - return comments.join('\n'); -}; - -/** - * Generate code for the specified block (and attached blocks). - * @param {Blockly.Block} block The block to generate code for. - * @return {string|!Array} For statement blocks, the generated code. - * For value blocks, an array containing the generated code and an - * operator order value. Returns '' if block is null. - */ -Blockly.Generator.prototype.blockToCode = function(block) { - if (!block) { - return ''; - } - if (block.disabled) { - // Skip past this block if it is disabled. - return this.blockToCode(block.getNextBlock()); - } - - var func = this[block.type]; - goog.asserts.assertFunction(func, - 'Language "%s" does not know how to generate code for block type "%s".', - this.name_, block.type); - // First argument to func.call is the value of 'this' in the generator. - // Prior to 24 September 2013 'this' was the only way to access the block. - // The current prefered method of accessing the block is through the second - // argument to func.call, which becomes the first parameter to the generator. - var code = func.call(block, block); - if (goog.isArray(code)) { - // Value blocks return tuples of code and operator order. - return [this.scrub_(block, code[0]), code[1]]; - } else if (goog.isString(code)) { - if (this.STATEMENT_PREFIX) { - code = this.STATEMENT_PREFIX.replace(/%1/g, '\'' + block.id + '\'') + - code; - } - return this.scrub_(block, code); - } else if (code === null) { - // Block has handled code generation itself. - return ''; - } else { - goog.asserts.fail('Invalid code generated: %s', code); - } -}; - -/** - * Generate code representing the specified value input. - * @param {!Blockly.Block} block The block containing the input. - * @param {string} name The name of the input. - * @param {number} order The maximum binding strength (minimum order value) - * of any operators adjacent to "block". - * @return {string} Generated code or '' if no blocks are connected or the - * specified input does not exist. - */ -Blockly.Generator.prototype.valueToCode = function(block, name, order) { - if (isNaN(order)) { - goog.asserts.fail('Expecting valid order from block "%s".', block.type); - } - var targetBlock = block.getInputTargetBlock(name); - if (!targetBlock) { - return ''; - } - var tuple = this.blockToCode(targetBlock); - if (tuple === '') { - // Disabled block. - return ''; - } - // Value blocks must return code and order of operations info. - // Statement blocks must only return code. - goog.asserts.assertArray(tuple, - 'Expecting tuple from value block "%s".', targetBlock.type); - var code = tuple[0]; - var innerOrder = tuple[1]; - if (isNaN(innerOrder)) { - goog.asserts.fail('Expecting valid order from value block "%s".', - targetBlock.type); - } - if (code && order <= innerOrder) { - if (order == innerOrder && (order == 0 || order == 99)) { - // Don't generate parens around NONE-NONE and ATOMIC-ATOMIC pairs. - // 0 is the atomic order, 99 is the none order. No parentheses needed. - // In all known languages multiple such code blocks are not order - // sensitive. In fact in Python ('a' 'b') 'c' would fail. - } else { - // The operators outside this code are stonger than the operators - // inside this code. To prevent the code from being pulled apart, - // wrap the code in parentheses. - // Technically, this should be handled on a language-by-language basis. - // However all known (sane) languages use parentheses for grouping. - code = '(' + code + ')'; - } - } - return code; -}; - -/** - * Generate code representing the statement. Indent the code. - * @param {!Blockly.Block} block The block containing the input. - * @param {string} name The name of the input. - * @return {string} Generated code or '' if no blocks are connected. - */ -Blockly.Generator.prototype.statementToCode = function(block, name) { - var targetBlock = block.getInputTargetBlock(name); - var code = this.blockToCode(targetBlock); - // Value blocks must return code and order of operations info. - // Statement blocks must only return code. - goog.asserts.assertString(code, - 'Expecting code from statement block "%s".', - targetBlock && targetBlock.type); - if (code) { - code = this.prefixLines(/** @type {string} */ (code), this.INDENT); - } - return code; -}; - -/** - * Add an infinite loop trap to the contents of a loop. - * If loop is empty, add a statment prefix for the loop block. - * @param {string} branch Code for loop contents. - * @param {string} id ID of enclosing block. - * @return {string} Loop contents, with infinite loop trap added. - */ -Blockly.Generator.prototype.addLoopTrap = function(branch, id) { - if (this.INFINITE_LOOP_TRAP) { - branch = this.INFINITE_LOOP_TRAP.replace(/%1/g, '\'' + id + '\'') + branch; - } - if (this.STATEMENT_PREFIX) { - branch += this.prefixLines(this.STATEMENT_PREFIX.replace(/%1/g, - '\'' + id + '\''), this.INDENT); - } - return branch; -}; - -/** - * The method of indenting. Defaults to two spaces, but language generators - * may override this to increase indent or change to tabs. - * @type {string} - */ -Blockly.Generator.prototype.INDENT = ' '; - -/** - * Comma-separated list of reserved words. - * @type {string} - * @private - */ -Blockly.Generator.prototype.RESERVED_WORDS_ = ''; - -/** - * Add one or more words to the list of reserved words for this language. - * @param {string} words Comma-separated list of words to add to the list. - * No spaces. Duplicates are ok. - */ -Blockly.Generator.prototype.addReservedWords = function(words) { - this.RESERVED_WORDS_ += words + ','; -}; - -/** - * This is used as a placeholder in functions defined using - * Blockly.Generator.provideFunction_. It must not be legal code that could - * legitimately appear in a function definition (or comment), and it must - * not confuse the regular expression parser. - * @type {string} - * @private - */ -Blockly.Generator.prototype.FUNCTION_NAME_PLACEHOLDER_ = '{leCUI8hutHZI4480Dc}'; - -/** - * Define a function to be included in the generated code. - * The first time this is called with a given desiredName, the code is - * saved and an actual name is generated. Subsequent calls with the - * same desiredName have no effect but have the same return value. - * - * It is up to the caller to make sure the same desiredName is not - * used for different code values. - * - * The code gets output when Blockly.Generator.finish() is called. - * - * @param {string} desiredName The desired name of the function (e.g., isPrime). - * @param {!Array.} code A list of Python statements. - * @return {string} The actual name of the new function. This may differ - * from desiredName if the former has already been taken by the user. - * @private - */ -Blockly.Generator.prototype.provideFunction_ = function(desiredName, code) { - if (!this.definitions_[desiredName]) { - var functionName = - this.variableDB_.getDistinctName(desiredName, this.NAME_TYPE); - this.functionNames_[desiredName] = functionName; - this.definitions_[desiredName] = code.join('\n').replace( - this.FUNCTION_NAME_PLACEHOLDER_REGEXP_, functionName); - } - return this.functionNames_[desiredName]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/icon.js b/src/opsoro/apps/visual_programming/static/blockly/core/icon.js deleted file mode 100644 index 6b3042d..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/icon.js +++ /dev/null @@ -1,222 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2013 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Object representing an icon on a block. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Icon'); - -goog.require('goog.dom'); - - -/** - * Class for an icon. - * @param {Blockly.Block} block The block associated with this icon. - * @constructor - */ -Blockly.Icon = function(block) { - this.block_ = block; -}; - -/** - * Does this icon get hidden when the block is collapsed. - */ -Blockly.Icon.prototype.collapseHidden = true; - -/** - * Height and width of icons. - */ -Blockly.Icon.prototype.SIZE = 17; - -/** - * Icon in base64 format. - * @private - */ -Blockly.Icon.prototype.png_ = ''; - -/** - * Bubble UI (if visible). - * @type {Blockly.Bubble} - * @private - */ -Blockly.Icon.prototype.bubble_ = null; - -/** - * Absolute X coordinate of icon's center. - * @private - */ -Blockly.Icon.prototype.iconX_ = 0; - -/** - * Absolute Y coordinate of icon's centre. - * @private - */ -Blockly.Icon.prototype.iconY_ = 0; - -/** - * Create the icon on the block. - */ -Blockly.Icon.prototype.createIcon = function() { - if (this.iconGroup_) { - // Icon already exists. - return; - } - /* Here's the markup that will be generated: - - - - */ - this.iconGroup_ = Blockly.createSvgElement('g', - {'class': 'blocklyIconGroup'}, null); - var img = Blockly.createSvgElement('image', - {'width': this.SIZE, 'height': this.SIZE}, - this.iconGroup_); - img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', this.png_); - - this.block_.getSvgRoot().appendChild(this.iconGroup_); - Blockly.bindEvent_(this.iconGroup_, 'mouseup', this, this.iconClick_); - this.updateEditable(); -}; - -/** - * Dispose of this icon. - */ -Blockly.Icon.prototype.dispose = function() { - // Dispose of and unlink the icon. - goog.dom.removeNode(this.iconGroup_); - this.iconGroup_ = null; - // Dispose of and unlink the bubble. - this.setVisible(false); - this.block_ = null; -}; - -/** - * Add or remove the UI indicating if this icon may be clicked or not. - */ -Blockly.Icon.prototype.updateEditable = function() { - if (this.block_.isInFlyout || !this.block_.isEditable()) { - Blockly.addClass_(/** @type {!Element} */ (this.iconGroup_), - 'blocklyIconGroupReadonly'); - } else { - Blockly.removeClass_(/** @type {!Element} */ (this.iconGroup_), - 'blocklyIconGroupReadonly'); - } -}; - -/** - * Is the associated bubble visible? - * @return {boolean} True if the bubble is visible. - */ -Blockly.Icon.prototype.isVisible = function() { - return !!this.bubble_; -}; - -/** - * Clicking on the icon toggles if the bubble is visible. - * @param {!Event} e Mouse click event. - * @private - */ -Blockly.Icon.prototype.iconClick_ = function(e) { - if (Blockly.dragMode_ == 2) { - // Drag operation is concluding. Don't open the editor. - return; - } - if (!this.block_.isInFlyout && !Blockly.isRightButton(e)) { - this.setVisible(!this.isVisible()); - } -}; - -/** - * Change the colour of the associated bubble to match its block. - */ -Blockly.Icon.prototype.updateColour = function() { - if (this.isVisible()) { - var hexColour = Blockly.makeColour(this.block_.getColour()); - this.bubble_.setColour(hexColour); - } -}; - -/** - * Render the icon. - * @param {number} cursorX Horizontal offset at which to position the icon. - * @return {number} Horizontal offset for next item to draw. - */ -Blockly.Icon.prototype.renderIcon = function(cursorX) { - if (this.collapseHidden && this.block_.isCollapsed()) { - this.iconGroup_.setAttribute('display', 'none'); - return cursorX; - } - this.iconGroup_.setAttribute('display', 'block'); - - var TOP_MARGIN = 5; - var width = this.SIZE; - if (this.block_.RTL) { - cursorX -= width; - } - this.iconGroup_.setAttribute('transform', - 'translate(' + cursorX + ',' + TOP_MARGIN + ')'); - this.computeIconLocation(); - if (this.block_.RTL) { - cursorX -= Blockly.BlockSvg.SEP_SPACE_X; - } else { - cursorX += width + Blockly.BlockSvg.SEP_SPACE_X; - } - return cursorX; -}; - -/** - * Notification that the icon has moved. Update the arrow accordingly. - * @param {number} x Absolute horizontal location. - * @param {number} y Absolute vertical location. - */ -Blockly.Icon.prototype.setIconLocation = function(x, y) { - this.iconX_ = x; - this.iconY_ = y; - if (this.isVisible()) { - this.bubble_.setAnchorLocation(x, y); - } -}; - -/** - * Notification that the icon has moved, but we don't really know where. - * Recompute the icon's location from scratch. - */ -Blockly.Icon.prototype.computeIconLocation = function() { - // Find coordinates for the centre of the icon and update the arrow. - var blockXY = this.block_.getRelativeToSurfaceXY(); - var iconXY = Blockly.getRelativeXY_(this.iconGroup_); - var newX = blockXY.x + iconXY.x + this.SIZE / 2; - var newY = blockXY.y + iconXY.y + this.SIZE / 2; - if (newX !== this.iconX_ || newY !== this.iconY_) { - this.setIconLocation(newX, newY); - } -}; - -/** - * Returns the center of the block's icon relative to the surface. - * @return {!Object} Object with x and y properties. - */ -Blockly.Icon.prototype.getIconLocation = function() { - return {x: this.iconX_, y: this.iconY_}; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/inject.js b/src/opsoro/apps/visual_programming/static/blockly/core/inject.js deleted file mode 100644 index fd18dbd..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/inject.js +++ /dev/null @@ -1,542 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Functions for injecting Blockly into a web page. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.inject'); - -goog.require('Blockly.Css'); -goog.require('Blockly.WorkspaceSvg'); -goog.require('goog.dom'); -goog.require('goog.ui.Component'); -goog.require('goog.userAgent'); - - -/** - * Inject a Blockly editor into the specified container element (usually a div). - * @param {!Element|string} container Containing element or its ID. - * @param {Object=} opt_options Optional dictionary of options. - * @return {!Blockly.Workspace} Newly created main workspace. - */ -Blockly.inject = function(container, opt_options) { - if (goog.isString(container)) { - container = document.getElementById(container); - } - // Verify that the container is in document. - if (!goog.dom.contains(document, container)) { - throw 'Error: container is not in current document.'; - } - var options = Blockly.parseOptions_(opt_options || {}); - var workspace; - var startUi = function() { - var svg = Blockly.createDom_(container, options); - workspace = Blockly.createMainWorkspace_(svg, options); - Blockly.init_(workspace); - workspace.markFocused(); - Blockly.bindEvent_(svg, 'focus', workspace, workspace.markFocused); - }; - if (options.enableRealtime) { - var realtimeElement = document.getElementById('realtime'); - if (realtimeElement) { - realtimeElement.style.display = 'block'; - } - Blockly.Realtime.startRealtime(startUi, container, options.realtimeOptions); - } else { - startUi(); - } - return workspace; -}; - -/** - * Parse the provided toolbox tree into a consistent DOM format. - * @param {Node|string} tree DOM tree of blocks, or text representation of same. - * @return {Node} DOM tree of blocks, or null. - * @private - */ -Blockly.parseToolboxTree_ = function(tree) { - if (tree) { - if (typeof tree != 'string' && typeof XSLTProcessor == 'undefined') { - // In this case the tree will not have been properly built by the - // browser. The HTML will be contained in the element, but it will - // not have the proper DOM structure since the browser doesn't support - // XSLTProcessor (XML -> HTML). This is the case in IE 9+. - tree = tree.outerHTML; - } - if (typeof tree == 'string') { - tree = Blockly.Xml.textToDom(tree); - } - } else { - tree = null; - } - return tree; -}; - -/** - * Configure Blockly to behave according to a set of options. - * @param {!Object} options Dictionary of options. Specification: - * https://developers.google.com/blockly/installation/overview#configuration - * @return {!Object} Dictionary of normalized options. - * @private - */ -Blockly.parseOptions_ = function(options) { - var readOnly = !!options['readOnly']; - if (readOnly) { - var languageTree = null; - var hasCategories = false; - var hasTrashcan = false; - var hasCollapse = false; - var hasComments = false; - var hasDisable = false; - var hasSounds = false; - } else { - var languageTree = Blockly.parseToolboxTree_(options['toolbox']); - var hasCategories = Boolean(languageTree && - languageTree.getElementsByTagName('category').length); - var hasTrashcan = options['trashcan']; - if (hasTrashcan === undefined) { - hasTrashcan = hasCategories; - } - var hasCollapse = options['collapse']; - if (hasCollapse === undefined) { - hasCollapse = hasCategories; - } - var hasComments = options['comments']; - if (hasComments === undefined) { - hasComments = hasCategories; - } - var hasDisable = options['disable']; - if (hasDisable === undefined) { - hasDisable = hasCategories; - } - var hasSounds = options['sounds']; - if (hasSounds === undefined) { - hasSounds = true; - } - } - var hasScrollbars = options['scrollbars']; - if (hasScrollbars === undefined) { - hasScrollbars = hasCategories; - } - var hasCss = options['css']; - if (hasCss === undefined) { - hasCss = true; - } - // See grid documentation at: - // https://developers.google.com/blockly/installation/grid - var grid = options['grid'] || {}; - var gridOptions = {}; - gridOptions.spacing = parseFloat(grid['spacing']) || 0; - gridOptions.colour = grid['colour'] || '#888'; - gridOptions.length = parseFloat(grid['length']) || 1; - gridOptions.snap = gridOptions.spacing > 0 && !!grid['snap']; - var pathToMedia = 'https://blockly-demo.appspot.com/static/media/'; - if (options['media']) { - pathToMedia = options['media']; - } else if (options['path']) { - // 'path' is a deprecated option which has been replaced by 'media'. - pathToMedia = options['path'] + 'media/'; - } - -/* TODO (fraser): Add documentation page: - * https://developers.google.com/blockly/installation/zoom - * - * enabled - * - * Set to `true` to allow zooming of the main workspace. Zooming is only - * possible if the workspace has scrollbars. If `false`, then the options - * below have no effect. Defaults to `false`. - * - * controls - * - * Set to `true` to show zoom-in and zoom-out buttons. Defaults to `true`. - * - * wheel - * - * Set to `true` to allow the mouse wheel to zoom. Defaults to `true`. - * - * maxScale - * - * Maximum multiplication factor for how far one can zoom in. Defaults to `3`. - * - * minScale - * - * Minimum multiplication factor for how far one can zoom out. Defaults to `0.3`. - * - * scaleSpeed - * - * For each zooming in-out step the scale is multiplied - * or divided respectively by the scale speed, this means that: - * `scale = scaleSpeed ^ steps`, note that in this formula - * steps of zoom-out are subtracted and zoom-in steps are added. - */ - // See zoom documentation at: - // https://developers.google.com/blockly/installation/zoom - var zoom = options['zoom'] || {}; - var zoomOptions = {}; - zoomOptions.enabled = hasScrollbars && !!zoom['enabled']; - if (zoomOptions.enabled) { - if (zoom['controls'] === undefined) { - zoomOptions.controls = true; - } else { - zoomOptions.controls = !!zoom['controls']; - } - if (zoom['wheel'] === undefined) { - zoomOptions.wheel = true; - } else { - zoomOptions.wheel = !!zoom['wheel']; - } - if (zoom['maxScale'] === undefined) { - zoomOptions.maxScale = 3; - } else { - zoomOptions.maxScale = parseFloat(zoom['maxScale']); - } - if (zoom['minScale'] === undefined) { - zoomOptions.minScale = 0.3; - } else { - zoomOptions.minScale = parseFloat(zoom['minScale']); - } - if (zoom['scaleSpeed'] === undefined) { - zoomOptions.scaleSpeed = 1.2; - } else { - zoomOptions.scaleSpeed = parseFloat(zoom['scaleSpeed']); - } - } else { - zoomOptions.controls = false; - zoomOptions.wheel = false; - } - - var enableRealtime = !!options['realtime']; - var realtimeOptions = enableRealtime ? options['realtimeOptions'] : undefined; - - return { - RTL: !!options['rtl'], - collapse: hasCollapse, - comments: hasComments, - disable: hasDisable, - readOnly: readOnly, - maxBlocks: options['maxBlocks'] || Infinity, - pathToMedia: pathToMedia, - hasCategories: hasCategories, - hasScrollbars: hasScrollbars, - hasTrashcan: hasTrashcan, - hasSounds: hasSounds, - hasCss: hasCss, - languageTree: languageTree, - gridOptions: gridOptions, - zoomOptions: zoomOptions, - enableRealtime: enableRealtime, - realtimeOptions: realtimeOptions - }; -}; - -/** - * Create the SVG image. - * @param {!Element} container Containing element. - * @param {Object} options Dictionary of options. - * @return {!Element} Newly created SVG image. - * @private - */ -Blockly.createDom_ = function(container, options) { - // Sadly browsers (Chrome vs Firefox) are currently inconsistent in laying - // out content in RTL mode. Therefore Blockly forces the use of LTR, - // then manually positions content in RTL as needed. - container.setAttribute('dir', 'LTR'); - // Closure can be trusted to create HTML widgets with the proper direction. - goog.ui.Component.setDefaultRightToLeft(options.RTL); - - // Load CSS. - Blockly.Css.inject(options.hasCss, options.pathToMedia); - - // Build the SVG DOM. - /* - - ... - - */ - var svg = Blockly.createSvgElement('svg', { - 'xmlns': 'http://www.w3.org/2000/svg', - 'xmlns:html': 'http://www.w3.org/1999/xhtml', - 'xmlns:xlink': 'http://www.w3.org/1999/xlink', - 'version': '1.1', - 'class': 'blocklySvg' - }, container); - /* - - ... filters go here ... - - */ - var defs = Blockly.createSvgElement('defs', {}, svg); - var rnd = String(Math.random()).substring(2); - /* - - - - - - - - - */ - var embossFilter = Blockly.createSvgElement('filter', - {'id': 'blocklyEmbossFilter' + rnd}, defs); - Blockly.createSvgElement('feGaussianBlur', - {'in': 'SourceAlpha', 'stdDeviation': 1, 'result': 'blur'}, embossFilter); - var feSpecularLighting = Blockly.createSvgElement('feSpecularLighting', - {'in': 'blur', 'surfaceScale': 1, 'specularConstant': 0.5, - 'specularExponent': 10, 'lighting-color': 'white', 'result': 'specOut'}, - embossFilter); - Blockly.createSvgElement('fePointLight', - {'x': -5000, 'y': -10000, 'z': 20000}, feSpecularLighting); - Blockly.createSvgElement('feComposite', - {'in': 'specOut', 'in2': 'SourceAlpha', 'operator': 'in', - 'result': 'specOut'}, embossFilter); - Blockly.createSvgElement('feComposite', - {'in': 'SourceGraphic', 'in2': 'specOut', 'operator': 'arithmetic', - 'k1': 0, 'k2': 1, 'k3': 1, 'k4': 0}, embossFilter); - options.embossFilterId = embossFilter.id; - /* - - - - - */ - var disabledPattern = Blockly.createSvgElement('pattern', - {'id': 'blocklyDisabledPattern' + rnd, - 'patternUnits': 'userSpaceOnUse', - 'width': 10, 'height': 10}, defs); - Blockly.createSvgElement('rect', - {'width': 10, 'height': 10, 'fill': '#aaa'}, disabledPattern); - Blockly.createSvgElement('path', - {'d': 'M 0 0 L 10 10 M 10 0 L 0 10', 'stroke': '#cc0'}, disabledPattern); - options.disabledPatternId = disabledPattern.id; - /* - - - - - */ - var gridPattern = Blockly.createSvgElement('pattern', - {'id': 'blocklyGridPattern' + rnd, - 'patternUnits': 'userSpaceOnUse'}, defs); - if (options.gridOptions['length'] > 0 && options.gridOptions['spacing'] > 0) { - Blockly.createSvgElement('line', - {'stroke': options.gridOptions['colour']}, - gridPattern); - if (options.gridOptions['length'] > 1) { - Blockly.createSvgElement('line', - {'stroke': options.gridOptions['colour']}, - gridPattern); - } - // x1, y1, x1, x2 properties will be set later in updateGridPattern_. - } - options.gridPattern = gridPattern; - options.svg = svg; - return svg; -}; - -/** - * Create a main workspace and add it to the SVG. - * @param {!Element} svg SVG element with pattern defined. - * @param {Object} options Dictionary of options. - * @return {!Blockly.Workspace} Newly created main workspace. - * @private - */ -Blockly.createMainWorkspace_ = function(svg, options) { - options.parentWorkspace = null; - options.getMetrics = Blockly.getMainWorkspaceMetrics_; - options.setMetrics = Blockly.setMainWorkspaceMetrics_; - var mainWorkspace = new Blockly.WorkspaceSvg(options); - svg.appendChild(mainWorkspace.createDom('blocklyMainBackground')); - mainWorkspace.markFocused(); - - if (!options.readOnly && !options.hasScrollbars) { - var workspaceChanged = function() { - if (Blockly.dragMode_ == 0) { - var metrics = mainWorkspace.getMetrics(); - var edgeLeft = metrics.viewLeft + metrics.absoluteLeft; - var edgeTop = metrics.viewTop + metrics.absoluteTop; - if (metrics.contentTop < edgeTop || - metrics.contentTop + metrics.contentHeight > - metrics.viewHeight + edgeTop || - metrics.contentLeft < - (options.RTL ? metrics.viewLeft : edgeLeft) || - metrics.contentLeft + metrics.contentWidth > (options.RTL ? - metrics.viewWidth : metrics.viewWidth + edgeLeft)) { - // One or more blocks may be out of bounds. Bump them back in. - var MARGIN = 25; - var blocks = mainWorkspace.getTopBlocks(false); - for (var b = 0, block; block = blocks[b]; b++) { - var blockXY = block.getRelativeToSurfaceXY(); - var blockHW = block.getHeightWidth(); - // Bump any block that's above the top back inside. - var overflow = edgeTop + MARGIN - blockHW.height - blockXY.y; - if (overflow > 0) { - block.moveBy(0, overflow); - } - // Bump any block that's below the bottom back inside. - var overflow = edgeTop + metrics.viewHeight - MARGIN - blockXY.y; - if (overflow < 0) { - block.moveBy(0, overflow); - } - // Bump any block that's off the left back inside. - var overflow = MARGIN + edgeLeft - - blockXY.x - (options.RTL ? 0 : blockHW.width); - if (overflow > 0) { - block.moveBy(overflow, 0); - } - // Bump any block that's off the right back inside. - var overflow = edgeLeft + metrics.viewWidth - MARGIN - - blockXY.x + (options.RTL ? blockHW.width : 0); - if (overflow < 0) { - block.moveBy(overflow, 0); - } - } - } - } - }; - mainWorkspace.addChangeListener(workspaceChanged); - } - // The SVG is now fully assembled. - Blockly.svgResize(mainWorkspace); - Blockly.WidgetDiv.createDom(); - Blockly.Tooltip.createDom(); - return mainWorkspace; -}; - -/** - * Initialize Blockly with various handlers. - * @param {!Blockly.Workspace} mainWorkspace Newly created main workspace. - * @private - */ -Blockly.init_ = function(mainWorkspace) { - var options = mainWorkspace.options; - var svg = mainWorkspace.options.svg; - // Supress the browser's context menu. - Blockly.bindEvent_(svg, 'contextmenu', null, - function(e) { - if (!Blockly.isTargetInput_(e)) { - e.preventDefault(); - } - }); - // Bind events for scrolling the workspace. - // Most of these events should be bound to the SVG's surface. - // However, 'mouseup' has to be on the whole document so that a block dragged - // out of bounds and released will know that it has been released. - // Also, 'keydown' has to be on the whole document since the browser doesn't - // understand a concept of focus on the SVG image. - - Blockly.bindEvent_(window, 'resize', null, - function() {Blockly.svgResize(mainWorkspace);}); - - if (!Blockly.documentEventsBound_) { - // Only bind the window/document events once. - // Destroying and reinjecting Blockly should not bind again. - Blockly.bindEvent_(document, 'keydown', null, Blockly.onKeyDown_); - Blockly.bindEvent_(document, 'touchend', null, Blockly.longStop_); - Blockly.bindEvent_(document, 'touchcancel', null, Blockly.longStop_); - // Don't use bindEvent_ for document's mouseup since that would create a - // corresponding touch handler that would squeltch the ability to interact - // with non-Blockly elements. - document.addEventListener('mouseup', Blockly.onMouseUp_, false); - // Some iPad versions don't fire resize after portrait to landscape change. - if (goog.userAgent.IPAD) { - Blockly.bindEvent_(window, 'orientationchange', document, function() { - Blockly.fireUiEvent(window, 'resize'); - }); - } - Blockly.documentEventsBound_ = true; - } - - if (options.languageTree) { - if (mainWorkspace.toolbox_) { - mainWorkspace.toolbox_.init(mainWorkspace); - } else if (mainWorkspace.flyout_) { - // Build a fixed flyout with the root blocks. - mainWorkspace.flyout_.init(mainWorkspace); - mainWorkspace.flyout_.show(options.languageTree.childNodes); - // Translate the workspace sideways to avoid the fixed flyout. - mainWorkspace.scrollX = mainWorkspace.flyout_.width_; - if (options.RTL) { - mainWorkspace.scrollX *= -1; - } - var translation = 'translate(' + mainWorkspace.scrollX + ',0)'; - mainWorkspace.getCanvas().setAttribute('transform', translation); - mainWorkspace.getBubbleCanvas().setAttribute('transform', translation); - } - } - if (options.hasScrollbars) { - mainWorkspace.scrollbar = new Blockly.ScrollbarPair(mainWorkspace); - mainWorkspace.scrollbar.resize(); - } - - // Load the sounds. - if (options.hasSounds) { - mainWorkspace.loadAudio_( - [options.pathToMedia + 'click.mp3', - options.pathToMedia + 'click.wav', - options.pathToMedia + 'click.ogg'], 'click'); - mainWorkspace.loadAudio_( - [options.pathToMedia + 'disconnect.wav', - options.pathToMedia + 'disconnect.mp3', - options.pathToMedia + 'disconnect.ogg'], 'disconnect'); - mainWorkspace.loadAudio_( - [options.pathToMedia + 'delete.mp3', - options.pathToMedia + 'delete.ogg', - options.pathToMedia + 'delete.wav'], 'delete'); - - // Bind temporary hooks that preload the sounds. - var soundBinds = []; - var unbindSounds = function() { - while (soundBinds.length) { - Blockly.unbindEvent_(soundBinds.pop()); - } - mainWorkspace.preloadAudio_(); - }; - // Android ignores any sound not loaded as a result of a user action. - soundBinds.push( - Blockly.bindEvent_(document, 'mousemove', null, unbindSounds)); - soundBinds.push( - Blockly.bindEvent_(document, 'touchstart', null, unbindSounds)); - } -}; - -/** - * Modify the block tree on the existing toolbox. - * @param {Node|string} tree DOM tree of blocks, or text representation of same. - */ -Blockly.updateToolbox = function(tree) { - console.warn('Deprecated call to Blockly.updateToolbox, ' + - 'use workspace.updateToolbox instead.'); - Blockly.getMainWorkspace().updateToolbox(tree); -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/mutator.js b/src/opsoro/apps/visual_programming/static/blockly/core/mutator.js deleted file mode 100644 index cdad26e..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/mutator.js +++ /dev/null @@ -1,303 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Object representing a mutator dialog. A mutator allows the - * user to change the shape of a block using a nested blocks editor. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Mutator'); - -goog.require('Blockly.Bubble'); -goog.require('Blockly.Icon'); -goog.require('Blockly.WorkspaceSvg'); -goog.require('goog.Timer'); -goog.require('goog.dom'); - - -/** - * Class for a mutator dialog. - * @param {!Array.} quarkNames List of names of sub-blocks for flyout. - * @extends {Blockly.Icon} - * @constructor - */ -Blockly.Mutator = function(quarkNames) { - Blockly.Mutator.superClass_.constructor.call(this, null); - this.quarkNames_ = quarkNames; -}; -goog.inherits(Blockly.Mutator, Blockly.Icon); - -/** - * Icon in base64 format. - * @private - */ -Blockly.Mutator.prototype.png_ = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAANyAAADcgBffIlqAAAAAd0SU1FB98DGhULOIajyb8AAAHMSURBVDjLnZS9SiRBFIXP/CQ9iIHgPoGBTo8vIAaivoKaKJr6DLuxYqKYKIqRgSCMrblmIxqsICgOmAriziIiRXWjYPdnUDvT2+PMsOyBoop7qk71vedWS5KAkrWsGUMjSYjpgSQhNoZGFLEKeGoKGMNttUpULkOhAFL3USiA70MQEBnDDeDJWtaqVaJeB7uNICAKQ1ZkDI1yufOm+XnY2YHl5c6874MxPClJiDulkMvBxYWrw/095POdU0sS4hxALqcWtreloSGpVJLGxtL49bX0+Ci9vUkzM2kcXGFbypUKxHHLBXZ3YW4ONjfh4yN1aGIiPQOQEenrg6MjR+zvZz99Y8PFT09hYCArktdfsFY6PHTr83NlUKu5+eREennJchmR/n5pYcGtJyezG6em3Dw7Kw0OZrlMOr6f1gTg4ACWlmBvz9WoifHxbDpf3Flfd+54njQ9ncYvL6WHB+n9XVpcbHOnW59IUKu5m+p11zftfLHo+qRorZ6Hh/Xt7k5fsLUl1evS1dWfG9swMiJZq9+KIlaD4P/eztkZNgz5LsAzhpvjY6JK5d9e8eioE3h95SdQbDrkhSErxvArjkl6/U/imMQYnsKQH02BT7vbZZfVOiWhAAAAAElFTkSuQmCC'; - -/** - * Width of workspace. - * @private - */ -Blockly.Mutator.prototype.workspaceWidth_ = 0; - -/** - * Height of workspace. - * @private - */ -Blockly.Mutator.prototype.workspaceHeight_ = 0; - -/** - * Clicking on the icon toggles if the mutator bubble is visible. - * Disable if block is uneditable. - * @param {!Event} e Mouse click event. - * @private - * @override - */ -Blockly.Mutator.prototype.iconClick_ = function(e) { - if (this.block_.isEditable()) { - Blockly.Icon.prototype.iconClick_.call(this, e); - } -}; - -/** - * Create the editor for the mutator's bubble. - * @return {!Element} The top-level node of the editor. - * @private - */ -Blockly.Mutator.prototype.createEditor_ = function() { - /* Create the editor. Here's the markup that will be generated: - - - [Workspace] - - */ - this.svgDialog_ = Blockly.createSvgElement('svg', - {'x': Blockly.Bubble.BORDER_WIDTH, 'y': Blockly.Bubble.BORDER_WIDTH}, - null); - // Convert the list of names into a list of XML objects for the flyout. - var quarkXml = goog.dom.createDom('xml'); - for (var i = 0, quarkName; quarkName = this.quarkNames_[i]; i++) { - quarkXml.appendChild(goog.dom.createDom('block', {'type': quarkName})); - } - var mutator = this; - var workspaceOptions = { - languageTree: quarkXml, - parentWorkspace: this.block_.workspace, - pathToMedia: this.block_.workspace.options.pathToMedia, - RTL: this.block_.RTL, - getMetrics: function() {return mutator.getFlyoutMetrics_();}, - setMetrics: null, - svg: this.svgDialog_ - }; - this.workspace_ = new Blockly.WorkspaceSvg(workspaceOptions); - this.svgDialog_.appendChild( - this.workspace_.createDom('blocklyMutatorBackground')); - return this.svgDialog_; -}; - -/** - * Add or remove the UI indicating if this icon may be clicked or not. - */ -Blockly.Mutator.prototype.updateEditable = function() { - if (this.block_.isEditable()) { - // Default behaviour for an icon. - Blockly.Icon.prototype.updateEditable.call(this); - } else { - // Close any mutator bubble. Icon is not clickable. - this.setVisible(false); - if (this.iconGroup_) { - Blockly.addClass_(/** @type {!Element} */ (this.iconGroup_), - 'blocklyIconGroupReadonly'); - } - } -}; - -/** - * Callback function triggered when the bubble has resized. - * Resize the workspace accordingly. - * @private - */ -Blockly.Mutator.prototype.resizeBubble_ = function() { - var doubleBorderWidth = 2 * Blockly.Bubble.BORDER_WIDTH; - var workspaceSize = this.workspace_.getCanvas().getBBox(); - var flyoutMetrics = this.workspace_.flyout_.getMetrics_(); - var width; - if (this.block_.RTL) { - width = -workspaceSize.x; - } else { - width = workspaceSize.width + workspaceSize.x; - } - var height = Math.max(workspaceSize.height + doubleBorderWidth * 3, - flyoutMetrics.contentHeight + 20); - width += doubleBorderWidth * 3; - // Only resize if the size difference is significant. Eliminates shuddering. - if (Math.abs(this.workspaceWidth_ - width) > doubleBorderWidth || - Math.abs(this.workspaceHeight_ - height) > doubleBorderWidth) { - // Record some layout information for getFlyoutMetrics_. - this.workspaceWidth_ = width; - this.workspaceHeight_ = height; - // Resize the bubble. - this.bubble_.setBubbleSize(width + doubleBorderWidth, - height + doubleBorderWidth); - this.svgDialog_.setAttribute('width', this.workspaceWidth_); - this.svgDialog_.setAttribute('height', this.workspaceHeight_); - } - - if (this.block_.RTL) { - // Scroll the workspace to always left-align. - var translation = 'translate(' + this.workspaceWidth_ + ',0)'; - this.workspace_.getCanvas().setAttribute('transform', translation); - } - this.workspace_.resize(); -}; - -/** - * Show or hide the mutator bubble. - * @param {boolean} visible True if the bubble should be visible. - */ -Blockly.Mutator.prototype.setVisible = function(visible) { - if (visible == this.isVisible()) { - // No change. - return; - } - if (visible) { - // Create the bubble. - this.bubble_ = new Blockly.Bubble(this.block_.workspace, - this.createEditor_(), this.block_.svgPath_, - this.iconX_, this.iconY_, null, null); - var thisObj = this; - this.workspace_.flyout_.init(this.workspace_); - this.workspace_.flyout_.show( - this.workspace_.options.languageTree.childNodes); - - this.rootBlock_ = this.block_.decompose(this.workspace_); - var blocks = this.rootBlock_.getDescendants(); - for (var i = 0, child; child = blocks[i]; i++) { - child.render(); - } - // The root block should not be dragable or deletable. - this.rootBlock_.setMovable(false); - this.rootBlock_.setDeletable(false); - var margin = this.workspace_.flyout_.CORNER_RADIUS * 2; - var x = this.workspace_.flyout_.width_ + margin; - if (this.block_.RTL) { - x = -x; - } - this.rootBlock_.moveBy(x, margin); - // Save the initial connections, then listen for further changes. - if (this.block_.saveConnections) { - this.block_.saveConnections(this.rootBlock_); - this.sourceListener_ = Blockly.bindEvent_( - this.block_.workspace.getCanvas(), - 'blocklyWorkspaceChange', this.block_, - function() {thisObj.block_.saveConnections(thisObj.rootBlock_)}); - } - this.resizeBubble_(); - // When the mutator's workspace changes, update the source block. - Blockly.bindEvent_(this.workspace_.getCanvas(), 'blocklyWorkspaceChange', - this.block_, function() {thisObj.workspaceChanged_();}); - this.updateColour(); - } else { - // Dispose of the bubble. - this.svgDialog_ = null; - this.workspace_.dispose(); - this.workspace_ = null; - this.rootBlock_ = null; - this.bubble_.dispose(); - this.bubble_ = null; - this.workspaceWidth_ = 0; - this.workspaceHeight_ = 0; - if (this.sourceListener_) { - Blockly.unbindEvent_(this.sourceListener_); - this.sourceListener_ = null; - } - } -}; - -/** - * Update the source block when the mutator's blocks are changed. - * Bump down any block that's too high. - * Fired whenever a change is made to the mutator's workspace. - * @private - */ -Blockly.Mutator.prototype.workspaceChanged_ = function() { - if (Blockly.dragMode_ == 0) { - var blocks = this.workspace_.getTopBlocks(false); - var MARGIN = 20; - for (var b = 0, block; block = blocks[b]; b++) { - var blockXY = block.getRelativeToSurfaceXY(); - var blockHW = block.getHeightWidth(); - if (blockXY.y + blockHW.height < MARGIN) { - // Bump any block that's above the top back inside. - block.moveBy(0, MARGIN - blockHW.height - blockXY.y); - } - } - } - - // When the mutator's workspace changes, update the source block. - if (this.rootBlock_.workspace == this.workspace_) { - // Switch off rendering while the source block is rebuilt. - var savedRendered = this.block_.rendered; - this.block_.rendered = false; - // Allow the source block to rebuild itself. - this.block_.compose(this.rootBlock_); - // Restore rendering and show the changes. - this.block_.rendered = savedRendered; - // Mutation may have added some elements that need initalizing. - this.block_.initSvg(); - if (this.block_.rendered) { - this.block_.render(); - } - this.resizeBubble_(); - // The source block may have changed, notify its workspace. - this.block_.workspace.fireChangeEvent(); - goog.Timer.callOnce( - this.block_.bumpNeighbours_, Blockly.BUMP_DELAY, this.block_); - } -}; - -/** - * Return an object with all the metrics required to size scrollbars for the - * mutator flyout. The following properties are computed: - * .viewHeight: Height of the visible rectangle, - * .viewWidth: Width of the visible rectangle, - * .absoluteTop: Top-edge of view. - * .absoluteLeft: Left-edge of view. - * @return {!Object} Contains size and position metrics of mutator dialog's - * workspace. - * @private - */ -Blockly.Mutator.prototype.getFlyoutMetrics_ = function() { - return { - viewHeight: this.workspaceHeight_, - viewWidth: this.workspaceWidth_, - absoluteTop: 0, - absoluteLeft: 0 - }; -}; - -/** - * Dispose of this mutator. - */ -Blockly.Mutator.prototype.dispose = function() { - this.block_.mutator = null; - Blockly.Icon.prototype.dispose.call(this); -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/procedures.js b/src/opsoro/apps/visual_programming/static/blockly/core/procedures.js deleted file mode 100644 index 5e84b59..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/procedures.js +++ /dev/null @@ -1,272 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Utility functions for handling procedures. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Procedures'); - -// TODO(scr): Fix circular dependencies -// goog.require('Blockly.Block'); -goog.require('Blockly.Field'); -goog.require('Blockly.Names'); -goog.require('Blockly.Workspace'); - - -/** - * Category to separate procedure names from variables and generated functions. - */ -Blockly.Procedures.NAME_TYPE = 'PROCEDURE'; - -/** - * Find all user-created procedure definitions in a workspace. - * @param {!Blockly.Workspace} root Root workspace. - * @return {!Array.>} Pair of arrays, the - * first contains procedures without return variables, the second with. - * Each procedure is defined by a three-element list of name, parameter - * list, and return value boolean. - */ -Blockly.Procedures.allProcedures = function(root) { - var blocks = root.getAllBlocks(); - var proceduresReturn = []; - var proceduresNoReturn = []; - for (var i = 0; i < blocks.length; i++) { - if (blocks[i].getProcedureDef) { - var tuple = blocks[i].getProcedureDef(); - if (tuple) { - if (tuple[2]) { - proceduresReturn.push(tuple); - } else { - proceduresNoReturn.push(tuple); - } - } - } - } - proceduresNoReturn.sort(Blockly.Procedures.procTupleComparator_); - proceduresReturn.sort(Blockly.Procedures.procTupleComparator_); - return [proceduresNoReturn, proceduresReturn]; -}; - -/** - * Comparison function for case-insensitive sorting of the first element of - * a tuple. - * @param {!Array} ta First tuple. - * @param {!Array} tb Second tuple. - * @return {number} -1, 0, or 1 to signify greater than, equality, or less than. - * @private - */ -Blockly.Procedures.procTupleComparator_ = function(ta, tb) { - return ta[0].toLowerCase().localeCompare(tb[0].toLowerCase()); -}; - -/** - * Ensure two identically-named procedures don't exist. - * @param {string} name Proposed procedure name. - * @param {!Blockly.Block} block Block to disambiguate. - * @return {string} Non-colliding name. - */ -Blockly.Procedures.findLegalName = function(name, block) { - if (block.isInFlyout) { - // Flyouts can have multiple procedures called 'do something'. - return name; - } - while (!Blockly.Procedures.isLegalName(name, block.workspace, block)) { - // Collision with another procedure. - var r = name.match(/^(.*?)(\d+)$/); - if (!r) { - name += '2'; - } else { - name = r[1] + (parseInt(r[2], 10) + 1); - } - } - return name; -}; - -/** - * Does this procedure have a legal name? Illegal names include names of - * procedures already defined. - * @param {string} name The questionable name. - * @param {!Blockly.Workspace} workspace The workspace to scan for collisions. - * @param {Blockly.Block=} opt_exclude Optional block to exclude from - * comparisons (one doesn't want to collide with oneself). - * @return {boolean} True if the name is legal. - */ -Blockly.Procedures.isLegalName = function(name, workspace, opt_exclude) { - var blocks = workspace.getAllBlocks(); - // Iterate through every block and check the name. - for (var i = 0; i < blocks.length; i++) { - if (blocks[i] == opt_exclude) { - continue; - } - if (blocks[i].getProcedureDef) { - var procName = blocks[i].getProcedureDef(); - if (Blockly.Names.equals(procName[0], name)) { - return false; - } - } - } - return true; -}; - -/** - * Rename a procedure. Called by the editable field. - * @param {string} text The proposed new name. - * @return {string} The accepted name. - * @this {!Blockly.Field} - */ -Blockly.Procedures.rename = function(text) { - // Strip leading and trailing whitespace. Beyond this, all names are legal. - text = text.replace(/^[\s\xa0]+|[\s\xa0]+$/g, ''); - - // Ensure two identically-named procedures don't exist. - text = Blockly.Procedures.findLegalName(text, this.sourceBlock_); - // Rename any callers. - var blocks = this.sourceBlock_.workspace.getAllBlocks(); - for (var i = 0; i < blocks.length; i++) { - if (blocks[i].renameProcedure) { - blocks[i].renameProcedure(this.text_, text); - } - } - return text; -}; - -/** - * Construct the blocks required by the flyout for the procedure category. - * @param {!Array.} blocks List of blocks to show. - * @param {!Array.} gaps List of widths between blocks. - * @param {number} margin Standard margin width for calculating gaps. - * @param {!Blockly.Workspace} workspace The flyout's workspace. - */ -Blockly.Procedures.flyoutCategory = function(blocks, gaps, margin, workspace) { - if (Blockly.Blocks['procedures_defnoreturn']) { - var block = Blockly.Block.obtain(workspace, 'procedures_defnoreturn'); - block.initSvg(); - blocks.push(block); - gaps.push(margin * 2); - } - if (Blockly.Blocks['procedures_defreturn']) { - var block = Blockly.Block.obtain(workspace, 'procedures_defreturn'); - block.initSvg(); - blocks.push(block); - gaps.push(margin * 2); - } - if (Blockly.Blocks['procedures_ifreturn']) { - var block = Blockly.Block.obtain(workspace, 'procedures_ifreturn'); - block.initSvg(); - blocks.push(block); - gaps.push(margin * 2); - } - if (gaps.length) { - // Add slightly larger gap between system blocks and user calls. - gaps[gaps.length - 1] = margin * 3; - } - - function populateProcedures(procedureList, templateName) { - for (var x = 0; x < procedureList.length; x++) { - var block = Blockly.Block.obtain(workspace, templateName); - block.setFieldValue(procedureList[x][0], 'NAME'); - var tempIds = []; - for (var t = 0; t < procedureList[x][1].length; t++) { - tempIds[t] = 'ARG' + t; - } - block.setProcedureParameters(procedureList[x][1], tempIds); - block.initSvg(); - blocks.push(block); - gaps.push(margin * 2); - } - } - - var tuple = Blockly.Procedures.allProcedures(workspace.targetWorkspace); - populateProcedures(tuple[0], 'procedures_callnoreturn'); - populateProcedures(tuple[1], 'procedures_callreturn'); -}; - -/** - * Find all the callers of a named procedure. - * @param {string} name Name of procedure. - * @param {!Blockly.Workspace} workspace The workspace to find callers in. - * @return {!Array.} Array of caller blocks. - */ -Blockly.Procedures.getCallers = function(name, workspace) { - var callers = []; - var blocks = workspace.getAllBlocks(); - // Iterate through every block and check the name. - for (var i = 0; i < blocks.length; i++) { - if (blocks[i].getProcedureCall) { - var procName = blocks[i].getProcedureCall(); - // Procedure name may be null if the block is only half-built. - if (procName && Blockly.Names.equals(procName, name)) { - callers.push(blocks[i]); - } - } - } - return callers; -}; - -/** - * When a procedure definition is disposed of, find and dispose of all its - * callers. - * @param {string} name Name of deleted procedure definition. - * @param {!Blockly.Workspace} workspace The workspace to delete callers from. - */ -Blockly.Procedures.disposeCallers = function(name, workspace) { - var callers = Blockly.Procedures.getCallers(name, workspace); - for (var i = 0; i < callers.length; i++) { - callers[i].dispose(true, false); - } -}; - -/** - * When a procedure definition changes its parameters, find and edit all its - * callers. - * @param {string} name Name of edited procedure definition. - * @param {!Blockly.Workspace} workspace The workspace to delete callers from. - * @param {!Array.} paramNames Array of new parameter names. - * @param {!Array.} paramIds Array of unique parameter IDs. - */ -Blockly.Procedures.mutateCallers = function(name, workspace, - paramNames, paramIds) { - var callers = Blockly.Procedures.getCallers(name, workspace); - for (var i = 0; i < callers.length; i++) { - callers[i].setProcedureParameters(paramNames, paramIds); - } -}; - -/** - * Find the definition block for the named procedure. - * @param {string} name Name of procedure. - * @param {!Blockly.Workspace} workspace The workspace to search. - * @return {Blockly.Block} The procedure definition block, or null not found. - */ -Blockly.Procedures.getDefinition = function(name, workspace) { - var blocks = workspace.getAllBlocks(); - for (var i = 0; i < blocks.length; i++) { - if (blocks[i].getProcedureDef) { - var tuple = blocks[i].getProcedureDef(); - if (tuple && Blockly.Names.equals(tuple[0], name)) { - return blocks[i]; - } - } - } - return null; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/realtime-client-utils.js b/src/opsoro/apps/visual_programming/static/blockly/core/realtime-client-utils.js deleted file mode 100644 index 10e6a9c..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/realtime-client-utils.js +++ /dev/null @@ -1,500 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2013 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Common utility functionality for Google Drive Realtime API, - * including authorization and file loading. This functionality should serve - * mostly as a well-documented example, though is usable in its own right. - * - * You can find this code as part of the Google Drive Realtime API Quickstart at - * https://developers.google.com/drive/realtime/realtime-quickstart and also as - * part of the Google Drive Realtime Playground code at - * https://github.com/googledrive/realtime-playground/blob/master/js/realtime-client-utils.js - */ -'use strict'; - -/** - * Realtime client utilities namespace. - */ -goog.provide('rtclient'); - - -/** - * OAuth 2.0 scope for installing Drive Apps. - * @const - */ -rtclient.INSTALL_SCOPE = 'https://www.googleapis.com/auth/drive.install'; - -/** - * OAuth 2.0 scope for opening and creating files. - * @const - */ -rtclient.FILE_SCOPE = 'https://www.googleapis.com/auth/drive.file'; - -/** - * OAuth 2.0 scope for accessing the appdata folder, a hidden folder private - * to this app. - * @const - */ -rtclient.APPDATA_SCOPE = 'https://www.googleapis.com/auth/drive.appdata'; - -/** - * OAuth 2.0 scope for accessing the user's ID. - * @const - */ -rtclient.OPENID_SCOPE = 'openid'; - -/** - * MIME type for newly created Realtime files. - * @const - */ -rtclient.REALTIME_MIMETYPE = 'application/vnd.google-apps.drive-sdk'; - -/** - * Key used to store the folder id of the Drive folder in which we will store - * Realtime files. - * @type {string} - */ -rtclient.FOLDER_KEY = 'folderId'; - -/** - * Parses the hash parameters to this page and returns them as an object. - * @return {!Object} Parameter object. - */ -rtclient.getParams = function() { - // Be careful with regards to node.js which has no window or location. - var location = goog.global['location'] || {}; - var params = {}; - function parseParams(fragment) { - // Split up the query string and store in an object. - var paramStrs = fragment.slice(1).split('&'); - for (var i = 0; i < paramStrs.length; i++) { - var paramStr = paramStrs[i].split('='); - params[decodeURIComponent(paramStr[0])] = decodeURIComponent(paramStr[1]); - } - } - var hashFragment = location.hash; - if (hashFragment) { - parseParams(hashFragment); - } - // Opening from Drive will encode the state in a query search parameter. - var searchFragment = location.search; - if (searchFragment) { - parseParams(searchFragment); - } - return params; -}; - -/** - * Instance of the query parameters. - */ -rtclient.params = rtclient.getParams(); - -/** - * Fetches an option from options or a default value, logging an error if - * neither is available. - * @param {!Object} options Containing options. - * @param {string} key Option key. - * @param {*=} opt_defaultValue Default option value (optional). - * @return {*} Option value. - */ -rtclient.getOption = function(options, key, opt_defaultValue) { - if (options.hasOwnProperty(key)) { - return options[key]; - } - if (opt_defaultValue === undefined) { - console.error(key + ' should be present in the options.'); - } - return opt_defaultValue; -}; - -/** - * Creates a new Authorizer from the options. - * @constructor - * @param {!Object} options For authorizer. Two keys are required as mandatory, - * these are: - * - * 1. "clientId", the Client ID from the console - * 2. "authButtonElementId", the is of the dom element to use for - * authorizing. - */ -rtclient.Authorizer = function(options) { - this.clientId = rtclient.getOption(options, 'clientId'); - // Get the user ID if it's available in the state query parameter. - this.userId = rtclient.params['userId']; - this.authButton = document.getElementById(rtclient.getOption(options, - 'authButtonElementId')); - this.authDiv = document.getElementById(rtclient.getOption(options, - 'authDivElementId')); -}; - -/** - * Start the authorization process. - * @param {Function} onAuthComplete To call once authorization has completed. - */ -rtclient.Authorizer.prototype.start = function(onAuthComplete) { - var _this = this; - gapi.load('auth:client,drive-realtime,drive-share', function() { - _this.authorize(onAuthComplete); - }); -}; - -/** - * Reauthorize the client with no callback (used for authorization failure). - * @param {Function} onAuthComplete To call once authorization has completed. - */ -rtclient.Authorizer.prototype.authorize = function(onAuthComplete) { - var clientId = this.clientId; - var userId = this.userId; - var _this = this; - var handleAuthResult = function(authResult) { - if (authResult && !authResult.error) { - _this.authButton.disabled = true; - _this.fetchUserId(onAuthComplete); - _this.authDiv.style.display = 'none'; - } else { - _this.authButton.disabled = false; - _this.authButton.onclick = authorizeWithPopup; - _this.authDiv.style.display = 'block'; - } - }; - var authorizeWithPopup = function() { - gapi.auth.authorize({ - 'client_id': clientId, - 'scope': [ - rtclient.INSTALL_SCOPE, - rtclient.FILE_SCOPE, - rtclient.OPENID_SCOPE, - rtclient.APPDATA_SCOPE - ], - 'user_id': userId, - 'immediate': false - }, handleAuthResult); - }; - // Try with no popups first. - gapi.auth.authorize({ - 'client_id': clientId, - 'scope': [ - rtclient.INSTALL_SCOPE, - rtclient.FILE_SCOPE, - rtclient.OPENID_SCOPE, - rtclient.APPDATA_SCOPE - ], - 'user_id': userId, - 'immediate': true - }, handleAuthResult); -}; - -/** - * Fetch the user ID using the UserInfo API and save it locally. - * @param {Function} callback The callback to call after user ID has been - * fetched. - */ -rtclient.Authorizer.prototype.fetchUserId = function(callback) { - var _this = this; - gapi.client.load('oauth2', 'v2', function() { - gapi.client.oauth2.userinfo.get().execute(function(resp) { - if (resp.id) { - _this.userId = resp.id; - } - if (callback) { - callback(); - } - }); - }); -}; - -/** - * Creates a new Realtime file. - * @param {string} title Title of the newly created file. - * @param {string} mimeType The MIME type of the new file. - * @param {string} folderTitle Title of the folder to place the file in. - * @param {Function} callback The callback to call after creation. - */ -rtclient.createRealtimeFile = function(title, mimeType, folderTitle, callback) { - - function insertFile(folderId) { - gapi.client.drive.files.insert({ - 'resource': { - 'mimeType': mimeType, - 'title': title, - 'parents': [{'id': folderId}] - } - }).execute(callback); - } - - function getOrCreateFolder() { - - function storeInAppdataProperty(folderId) { - // Store folder id in a custom property of the appdata folder. The - // 'appdata' folder is a special Google Drive folder that is only - // accessible by a specific app (i.e. identified by the client id). - gapi.client.drive.properties.insert({ - 'fileId': 'appdata', - 'resource': { 'key': rtclient.FOLDER_KEY, 'value': folderId } - }).execute(function(resp) { - insertFile(folderId); - }); - }; - - function createFolder() { - gapi.client.drive.files.insert({ - 'resource': { - 'mimeType': 'application/vnd.google-apps.folder', - 'title': folderTitle - } - }).execute(function(folder) { - storeInAppdataProperty(folder.id); - }); - } - - // Get the folder id from the appdata properties. - gapi.client.drive.properties.get({ - 'fileId': 'appdata', - 'propertyKey': rtclient.FOLDER_KEY - }).execute(function(resp) { - if (resp.error) { - // There's no folder id stored yet so we create a new folder if a - // folderTitle has been supplied. - if (folderTitle) { - createFolder(); - } else { - // There's no folder specified, so we just store the file in the - // user's root folder. - storeInAppdataProperty('root'); - } - } else { - var folderId = resp.result.value; - gapi.client.drive.files.get({ - 'fileId': folderId - }).execute(function(resp) { - if (resp.error || resp.labels.trashed) { - // Folder doesn't exist or was deleted, so create a new one. - createFolder(); - } else { - insertFile(folderId); - } - }); - } - }); - } - - gapi.client.load('drive', 'v2', function() { - getOrCreateFolder(); - }); -}; - -/** - * Fetches the metadata for a Realtime file. - * @param {string} fileId The file to load metadata for. - * @param {Function} callback The callback to be called on completion, - * with signature: - * - * function onGetFileMetadata(file) {} - * - * where the file parameter is a Google Drive API file resource instance. - */ -rtclient.getFileMetadata = function(fileId, callback) { - gapi.client.load('drive', 'v2', function() { - gapi.client.drive.files.get({ - 'fileId': fileId - }).execute(callback); - }); -}; - -/** - * Parses the state parameter passed from the Drive user interface after - * Open With operations. - * @param {string} stateParam The state query parameter as a JSON string. - * @return {Object} The state query parameter as an object or null if - * parsing failed. - */ -rtclient.parseState = function(stateParam) { - try { - var stateObj = JSON.parse(stateParam); - return stateObj; - } catch (e) { - return null; - } -}; - -/** - * Handles authorizing, parsing query parameters, loading and creating Realtime - * documents. - * @constructor - * @param {!Object} options Options for loader. Four keys are required as - * mandatory, these are: - * - * 1. "clientId", the Client ID from the console - * 2. "initializeModel", the callback to call when the file is loaded. - * 3. "onFileLoaded", the callback to call when the model is first created. - * - * and two keys are optional: - * - * 1. "defaultTitle", the title of newly created Realtime files. - * 2. "defaultFolderTitle", the folder to place in which to place newly - * created Realtime files. - */ -rtclient.RealtimeLoader = function(options) { - // Initialize configuration variables. - this.onFileLoaded = rtclient.getOption(options, 'onFileLoaded'); - this.newFileMimeType = rtclient.getOption(options, 'newFileMimeType', - rtclient.REALTIME_MIMETYPE); - this.initializeModel = rtclient.getOption(options, 'initializeModel'); - this.registerTypes = rtclient.getOption(options, 'registerTypes', - function() {}); - this.afterAuth = rtclient.getOption(options, 'afterAuth', function() {}); - // This tells us if need to we automatically create a file after auth. - this.autoCreate = rtclient.getOption(options, 'autoCreate', false); - this.defaultTitle = rtclient.getOption(options, 'defaultTitle', - 'New Realtime File'); - this.defaultFolderTitle = rtclient.getOption(options, 'defaultFolderTitle', - ''); - this.afterCreate = rtclient.getOption(options, 'afterCreate', function() {}); - this.authorizer = new rtclient.Authorizer(options); -}; - -/** - * Redirects the browser back to the current page with an appropriate file ID. - * @param {Array.} fileIds The IDs of the files to open. - * @param {string} userId The ID of the user. - */ -rtclient.RealtimeLoader.prototype.redirectTo = function(fileIds, userId) { - var params = []; - if (fileIds) { - params.push('fileIds=' + fileIds.join(',')); - } - if (userId) { - params.push('userId=' + userId); - } - // Naive URL construction. - var newUrl = params.length == 0 ? - window.location.pathname : - (window.location.pathname + '#' + params.join('&')); - // Using HTML URL re-write if available. - if (window.history && window.history.replaceState) { - window.history.replaceState('Google Drive Realtime API Playground', - 'Google Drive Realtime API Playground', newUrl); - } else { - window.location.href = newUrl; - } - // We are still here that means the page didn't reload. - rtclient.params = rtclient.getParams(); - for (var index in fileIds) { - gapi.drive.realtime.load(fileIds[index], this.onFileLoaded, - this.initializeModel, this.handleErrors); - } -}; - -/** - * Starts the loader by authorizing. - */ -rtclient.RealtimeLoader.prototype.start = function() { - // Bind to local context to make them suitable for callbacks. - var _this = this; - this.authorizer.start(function() { - if (_this.registerTypes) { - _this.registerTypes(); - } - if (_this.afterAuth) { - _this.afterAuth(); - } - _this.load(); - }); -}; - -/** - * Handles errors thrown by the Realtime API. - * @param {!Error} e Error. - */ -rtclient.RealtimeLoader.prototype.handleErrors = function(e) { - if (e.type == gapi.drive.realtime.ErrorType.TOKEN_REFRESH_REQUIRED) { - this.authorizer.authorize(); - } else if (e.type == gapi.drive.realtime.ErrorType.CLIENT_ERROR) { - alert('An Error happened: ' + e.message); - window.location.href = '/'; - } else if (e.type == gapi.drive.realtime.ErrorType.NOT_FOUND) { - alert('The file was not found. It does not exist or you do not have ' + - 'read access to the file.'); - window.location.href = '/'; - } -}; - -/** - * Loads or creates a Realtime file depending on the fileId and state query - * parameters. - */ -rtclient.RealtimeLoader.prototype.load = function() { - var fileIds = rtclient.params['fileIds']; - if (fileIds) { - fileIds = fileIds.split(','); - } - var userId = this.authorizer.userId; - var state = rtclient.params['state']; - // Creating the error callback. - var authorizer = this.authorizer; - // We have file IDs in the query parameters, so we will use them to load a - // file. - if (fileIds) { - for (var index in fileIds) { - gapi.drive.realtime.load(fileIds[index], this.onFileLoaded, - this.initializeModel, this.handleErrors); - } - return; - } - // We have a state parameter being redirected from the Drive UI. - // We will parse it and redirect to the fileId contained. - else if (state) { - var stateObj = rtclient.parseState(state); - // If opening a file from Drive. - if (stateObj.action == 'open') { - fileIds = stateObj.ids; - userId = stateObj.userId; - this.redirectTo(fileIds, userId); - return; - } - } - if (this.autoCreate) { - this.createNewFileAndRedirect(); - } -}; - -/** - * Creates a new file and redirects to the URL to load it. - */ -rtclient.RealtimeLoader.prototype.createNewFileAndRedirect = function() { - // No fileId or state have been passed. We create a new Realtime file and - // redirect to it. - var _this = this; - rtclient.createRealtimeFile(this.defaultTitle, this.newFileMimeType, - this.defaultFolderTitle, - function(file) { - if (file.id) { - if (_this.afterCreate) { - _this.afterCreate(file.id); - } - _this.redirectTo([file.id], _this.authorizer.userId); - } else { - // File failed to be created, log why and do not attempt to redirect. - console.error('Error creating file.'); - console.error(file); - } - }); -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/realtime.js b/src/opsoro/apps/visual_programming/static/blockly/core/realtime.js deleted file mode 100644 index 4af3218..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/realtime.js +++ /dev/null @@ -1,869 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2014 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * This file contains functions used by any Blockly app that wants to provide - * realtime collaboration functionality. - */ - -/** - * @fileoverview Common support code for Blockly apps using realtime - * collaboration. - * Note that to use this you must set up a project via the Google Developers - * Console. Instructions on how to do that can be found at - * https://developers.google.com/blockly/realtime-collaboration - * Once you do that you can set the clientId in - * Blockly.Realtime.rtclientOptions_ - * @author markf@google.com (Mark Friedman) - */ -'use strict'; - -goog.provide('Blockly.Realtime'); - -goog.require('goog.array'); -goog.require('goog.dom'); -goog.require('goog.style'); -goog.require('rtclient'); - -/** - * Is realtime collaboration enabled? - * @type {boolean} - * @private - */ -Blockly.Realtime.enabled_ = false; - -/** - * The Realtime document being collaborated on. - * @type {gapi.drive.realtime.Document} - * @private - */ -Blockly.Realtime.document_ = null; - -/** - * The Realtime model of this doc. - * @type {gapi.drive.realtime.Model} - * @private - */ -Blockly.Realtime.model_ = null; - -/** - * The unique id associated with this editing session. - * @type {string} - * @private - */ -Blockly.Realtime.sessionId_ = null; - -/** - * The function used to initialize the UI after realtime is initialized. - * @type {function()} - * @private - */ -Blockly.Realtime.initUi_ = null; - -/** - * A map from block id to blocks. - * @type {gapi.drive.realtime.CollaborativeMap} - * @private - */ -Blockly.Realtime.blocksMap_ = null; - -/** - * Are currently syncing from another instance of this realtime doc. - * @type {boolean} - */ -Blockly.Realtime.withinSync = false; - -/** - * The current instance of the realtime loader client - * @type {rtclient.RealtimeLoader} - * @private - */ -Blockly.Realtime.realtimeLoader_ = null; - -/** - * The id of a text area to be used as a realtime chat box. - * @type {string} - * @private - */ -Blockly.Realtime.chatBoxElementId_ = null; - -/** - * The initial text to be placed in the realtime chat box. - * @type {string} - * @private - */ -Blockly.Realtime.chatBoxInitialText_ = null; - -/** - * Indicator of whether we are in the context of an undo or redo operation. - * @type {boolean} - * @private - */ -Blockly.Realtime.withinUndo_ = false; - -/** - * Returns whether realtime collaboration is enabled. - * @return {boolean} - */ -Blockly.Realtime.isEnabled = function() { - return Blockly.Realtime.enabled_; -}; - -/** - * The id of the button to use for undo. - * @type {string} - * @private - */ -Blockly.Realtime.undoElementId_ = null; - -/** - * The id of the button to use for redo. - * @type {string} - * @private - */ -Blockly.Realtime.redoElementId_ = null; - -/** - * URL of the animated progress indicator. - * @type {string} - * @private - */ -Blockly.Realtime.PROGRESS_URL_ = 'progress.gif'; - -/** - * URL of the anonymous user image. - * @type {string} - * @private - */ -Blockly.Realtime.ANONYMOUS_URL_ = 'anon.jpeg'; - -/** - * This function is called the first time that the Realtime model is created - * for a file. This function should be used to initialize any values of the - * model. - * @param {!gapi.drive.realtime.Model} model The Realtime root model object. - * @private - */ -Blockly.Realtime.initializeModel_ = function(model) { - Blockly.Realtime.model_ = model; - var blocksMap = model.createMap(); - model.getRoot().set('blocks', blocksMap); - var topBlocks = model.createList(); - model.getRoot().set('topBlocks', topBlocks); - if (Blockly.Realtime.chatBoxElementId_) { - model.getRoot().set(Blockly.Realtime.chatBoxElementId_, - model.createString(Blockly.Realtime.chatBoxInitialText_)); - } -}; - -/** - * Delete a block from the realtime blocks map. - * @param {!Blockly.Block} block The block to remove. - */ -Blockly.Realtime.removeBlock = function(block) { - Blockly.Realtime.blocksMap_['delete'](block.id.toString()); -}; - -/** - * Add to the list of top-level blocks. - * @param {!Blockly.Block} block The block to add. - */ -Blockly.Realtime.addTopBlock = function(block) { - if (Blockly.Realtime.topBlocks_.indexOf(block) == -1) { - Blockly.Realtime.topBlocks_.push(block); - } -}; - -/** - * Delete a block from the list of top-level blocks. - * @param {!Blockly.Block} block The block to remove. - */ -Blockly.Realtime.removeTopBlock = function(block) { - Blockly.Realtime.topBlocks_.removeValue(block); -}; - -/** - * Obtain a newly created block known by the Realtime API. - * @param {!Blockly.Workspace} workspace The workspace to put the block in. - * @param {string} prototypeName The name of the prototype for the block. - * @return {!Blockly.Block} - */ -Blockly.Realtime.obtainBlock = function(workspace, prototypeName) { - var newBlock = - Blockly.Realtime.model_.create(Blockly.Block, workspace, prototypeName); - return newBlock; -}; - -/** - * Get an existing block by id. - * @param {string} id The block's id. - * @return {Blockly.Block} The found block. - */ -Blockly.Realtime.getBlockById = function(id) { - return Blockly.Realtime.blocksMap_.get(id); -}; - -/** - * Log the event for debugging purposes. - * @param {gapi.drive.realtime.BaseModelEvent} evt The event that occurred. - * @private - */ -Blockly.Realtime.logEvent_ = function(evt) { - console.log('Object event:'); - console.log(' id: ' + evt.target.id); - console.log(' type: ' + evt.type); - var events = evt.events; - if (events) { - var eventCount = events.length; - for (var i = 0; i < eventCount; i++) { - var event = events[i]; - console.log(' child event:'); - console.log(' id: ' + event.target.id); - console.log(' type: ' + event.type); - } - } -}; - -/** - * Event handler to call when a block is changed. - * @param {!gapi.drive.realtime.ObjectChangedEvent} evt The event that occurred. - * @private - */ -Blockly.Realtime.onObjectChange_ = function(evt) { - var events = evt.events; - var eventCount = evt.events.length; - for (var i = 0; i < eventCount; i++) { - var event = events[i]; - if (!event.isLocal || Blockly.Realtime.withinUndo_) { - var block = event.target; - if (event.type == 'value_changed') { - if (event.property == 'xmlDom') { - Blockly.Realtime.doWithinSync_(function() { - Blockly.Realtime.placeBlockOnWorkspace_(block, false); - Blockly.Realtime.moveBlock_(block); - }); - } else if (event.property == 'relativeX' || - event.property == 'relativeY') { - Blockly.Realtime.doWithinSync_(function() { - if (!block.svg_) { - // If this is a move of a newly disconnected (i.e. newly top - // level) block it will not have any svg (because it has been - // disposed of by its parent), so we need to handle that here. - Blockly.Realtime.placeBlockOnWorkspace_(block, false); - } - Blockly.Realtime.moveBlock_(block); - }); - } - } - } - } -}; - -/** - * Event handler to call when there is a change to the realtime blocks map. - * @param {!gapi.drive.realtime.ValueChangedEvent} evt The event that occurred. - * @private - */ -Blockly.Realtime.onBlocksMapChange_ = function(evt) { - if (!evt.isLocal || Blockly.Realtime.withinUndo_) { - var block = evt.newValue; - if (block) { - Blockly.Realtime.placeBlockOnWorkspace_(block, !(evt.oldValue)); - } else { - block = evt.oldValue; - Blockly.Realtime.deleteBlock(block); - } - } -}; - -/** - * A convenient wrapper around code that synchronizes the local model being - * edited with changes from another non-local model. - * @param {!function()} thunk A thunk of code to call. - * @private - */ -Blockly.Realtime.doWithinSync_ = function(thunk) { - if (Blockly.Realtime.withinSync) { - thunk(); - } else { - try { - Blockly.Realtime.withinSync = true; - thunk(); - } finally { - Blockly.Realtime.withinSync = false; - } - } -}; - -/** - * Places a block to be synced on this docs main workspace. The block might - * already exist on this doc, in which case it is updated and/or moved. - * @param {!Blockly.Block} block The block. - * @param {boolean} addToTop Whether to add the block to the workspace/s list of - * top-level blocks. - * @private - */ -Blockly.Realtime.placeBlockOnWorkspace_ = function(block, addToTop) { - Blockly.Realtime.doWithinSync_(function() { -// if (!Blockly.Realtime.blocksMap_.has(block.id)) { -// Blockly.Realtime.blocksMap_.set(block.id, block); -// } - var blockDom = Blockly.Xml.textToDom(block.xmlDom).firstChild; - var newBlock = - Blockly.Xml.domToBlock(Blockly.mainWorkspace, blockDom, true); - // TODO: The following is for debugging. It should never actually happen. - if (!newBlock) { - return; - } - // Since Blockly.Xml.blockDomToBlock() purposely won't add blocks to - // workspace.topBlocks_ we sometimes need to do it explicitly here. - if (addToTop) { - newBlock.workspace.addTopBlock(newBlock); - } - if (addToTop || - goog.array.contains(Blockly.Realtime.topBlocks_, newBlock)) { - Blockly.Realtime.moveBlock_(newBlock); - } - }); -}; - -/** - * Move a block. - * @param {!Blockly.Block} block The block to move. - * @private - */ -Blockly.Realtime.moveBlock_ = function(block) { - if (!isNaN(block.relativeX) && !isNaN(block.relativeY)) { - var width = Blockly.svgSize().width; - var curPos = block.getRelativeToSurfaceXY(); - var dx = block.relativeX - curPos.x; - var dy = block.relativeY - curPos.y; - block.moveBy(Blockly.RTL ? width - dx : dx, dy); - } -}; - -/** - * Delete a block. - * @param {!Blockly.Block} block The block to delete. - */ -Blockly.Realtime.deleteBlock = function(block) { - Blockly.Realtime.doWithinSync_(function() { - block.dispose(true, true, true); - }); -}; - -/** - * Load all the blocks from the realtime model's blocks map and place them - * appropriately on the main Blockly workspace. - * @private - */ -Blockly.Realtime.loadBlocks_ = function() { - var topBlocks = Blockly.Realtime.topBlocks_; - for (var j = 0; j < topBlocks.length; j++) { - var topBlock = topBlocks.get(j); - Blockly.Realtime.placeBlockOnWorkspace_(topBlock, true); - } -}; - -/** - * Cause a changed block to update the realtime model, and therefore to be - * synced with other apps editing this same doc. - * @param {!Blockly.Block} block The block that changed. - */ -Blockly.Realtime.blockChanged = function(block) { - if (block.workspace == Blockly.mainWorkspace && - Blockly.Realtime.isEnabled() && - !Blockly.Realtime.withinSync) { - var rootBlock = block.getRootBlock(); - var xy = rootBlock.getRelativeToSurfaceXY(); - var changed = false; - var xml = Blockly.Xml.blockToDom_(rootBlock); - xml.setAttribute('id', rootBlock.id); - var topXml = goog.dom.createDom('xml'); - topXml.appendChild(xml); - var newXml = Blockly.Xml.domToText(topXml); - if (newXml != rootBlock.xmlDom) { - changed = true; - rootBlock.xmlDom = newXml; - } - if (rootBlock.relativeX != xy.x || rootBlock.relativeY != xy.y) { - rootBlock.relativeX = xy.x; - rootBlock.relativeY = xy.y; - changed = true; - } - if (changed) { - var blockId = rootBlock.id.toString(); - Blockly.Realtime.blocksMap_.set(blockId, rootBlock); - } - } -}; - -/** - * This function is called when the Realtime file has been loaded. It should - * be used to initialize any user interface components and event handlers - * depending on the Realtime model. In this case, create a text control binder - * and bind it to our string model that we created in initializeModel. - * @param {!gapi.drive.realtime.Document} doc The Realtime document. - * @private - */ -Blockly.Realtime.onFileLoaded_ = function(doc) { - Blockly.Realtime.document_ = doc; - Blockly.Realtime.sessionId_ = Blockly.Realtime.getSessionId_(doc); - Blockly.Realtime.model_ = doc.getModel(); - Blockly.Realtime.blocksMap_ = - Blockly.Realtime.model_.getRoot().get('blocks'); - Blockly.Realtime.topBlocks_ = - Blockly.Realtime.model_.getRoot().get('topBlocks'); - - Blockly.Realtime.model_.getRoot().addEventListener( - gapi.drive.realtime.EventType.OBJECT_CHANGED, - Blockly.Realtime.onObjectChange_); - Blockly.Realtime.blocksMap_.addEventListener( - gapi.drive.realtime.EventType.VALUE_CHANGED, - Blockly.Realtime.onBlocksMapChange_); - - Blockly.Realtime.initUi_(); - - //Adding Listeners for Collaborator events. - doc.addEventListener(gapi.drive.realtime.EventType.COLLABORATOR_JOINED, - Blockly.Realtime.onCollaboratorJoined_); - doc.addEventListener(gapi.drive.realtime.EventType.COLLABORATOR_LEFT, - Blockly.Realtime.onCollaboratorLeft_); - Blockly.Realtime.updateCollabUi_(); - - Blockly.Realtime.loadBlocks_(); - - // Add logic for undo button. - // TODO: Uncomment this when undo/redo are fixed. -// -// var undoButton = document.getElementById(Blockly.Realtime.undoElementId_); -// var redoButton = document.getElementById(Blockly.Realtime.redoElementId_); -// -// if (undoButton) { -// undoButton.onclick = function (e) { -// try { -// Blockly.Realtime.withinUndo_ = true; -// Blockly.Realtime.model_.undo(); -// } finally { -// Blockly.Realtime.withinUndo_ = false; -// } -// }; -// } -// if (redoButton) { -// redoButton.onclick = function (e) { -// try { -// Blockly.Realtime.withinUndo_ = true; -// Blockly.Realtime.model_.redo(); -// } finally { -// Blockly.Realtime.withinUndo_ = false; -// } -// }; -// } -// -// // Add event handler for UndoRedoStateChanged events. -// var onUndoRedoStateChanged = function(e) { -// undoButton.disabled = !e.canUndo; -// redoButton.disabled = !e.canRedo; -// }; -// Blockly.Realtime.model_.addEventListener( -// gapi.drive.realtime.EventType.UNDO_REDO_STATE_CHANGED, -// onUndoRedoStateChanged); - -}; - -/** - * Get the sessionId associated with this editing session. Note that it is - * unique to the current browser window/tab. - * @param {gapi.drive.realtime.Document} doc - * @return {*} - * @private - */ -Blockly.Realtime.getSessionId_ = function(doc) { - var collaborators = doc.getCollaborators(); - for (var i = 0; i < collaborators.length; i++) { - var collaborator = collaborators[i]; - if (collaborator.isMe) { - return collaborator.sessionId; - } - } - return undefined; -}; - -/** - * Register the Blockly types and attributes that are reflected in the realtime - * model. - * @private - */ -Blockly.Realtime.registerTypes_ = function() { - var custom = gapi.drive.realtime.custom; - - custom.registerType(Blockly.Block, 'Block'); - Blockly.Block.prototype.id = custom.collaborativeField('id'); - Blockly.Block.prototype.xmlDom = custom.collaborativeField('xmlDom'); - Blockly.Block.prototype.relativeX = custom.collaborativeField('relativeX'); - Blockly.Block.prototype.relativeY = custom.collaborativeField('relativeY'); - - custom.setInitializer(Blockly.Block, Blockly.Block.prototype.initialize); -}; - -/** - * Time period for realtime re-authorization - * @type {number} - * @private - */ -Blockly.Realtime.REAUTH_INTERVAL_IN_MILLISECONDS_ = 30 * 60 * 1000; - -/** - * What to do after Realtime authorization. - * @private - */ -Blockly.Realtime.afterAuth_ = function() { - // This is a workaround for the fact that the code in realtime-client-utils.js - // doesn't deal with auth timeouts correctly. So we explicitly reauthorize at - // regular intervals. - setTimeout( - function() { - Blockly.Realtime.realtimeLoader_.authorizer.authorize( - Blockly.Realtime.afterAuth_); - }, - Blockly.Realtime.REAUTH_INTERVAL_IN_MILLISECONDS_); -}; - -/** - * Add "Anyone with the link" permissions to the file. - * @param {string} fileId the file id - * @private - */ -Blockly.Realtime.afterCreate_ = function(fileId) { - var resource = { - 'type': 'anyone', - 'role': 'writer', - 'value': 'default', - 'withLink': true - }; - var request = gapi.client.drive.permissions.insert({ - 'fileId': fileId, - 'resource': resource - }); - request.execute(function(resp) { - // If we have an error try to just set the permission for all users - // of the domain. - if (resp.error) { - Blockly.Realtime.getUserDomain(fileId, function(domain) { - var resource = { - 'type': 'domain', - 'role': 'writer', - 'value': domain, - 'withLink': true - }; - request = gapi.client.drive.permissions.insert({ - 'fileId': fileId, - 'resource': resource - }); - request.execute(function(resp) { }); - }); - } - }); -}; - -/** - * Get the domain (if it exists) associated with a realtime file. The callback - * will be called with the domain, if it exists. - * @param {string} fileId the id of the file - * @param {function(string)} callback a function to call back with the domain - */ -Blockly.Realtime.getUserDomain = function(fileId, callback) { - /** - * Note that there may be a more direct way to get the domain by, for example, - * using the Google profile API but this way we don't need any additional - * APIs or scopes. But if it turns out that the permissions API stops - * providing the domain this might have to change. - */ - var request = gapi.client.drive.permissions.list({ - 'fileId': fileId - }); - request.execute(function(resp) { - for (var i = 0; i < resp.items.length; i++) { - var item = resp.items[i]; - if (item.role == 'owner') { - callback(item.domain); - return; - } - } - }); -}; - -/** - * Options for the Realtime loader. - * @private - */ -Blockly.Realtime.rtclientOptions_ = { - /** - * Client ID from the console. - * This will be set from the options passed into Blockly.Realtime.start() - */ - 'clientId': null, - - /** - * The ID of the button to click to authorize. Must be a DOM element ID. - */ - 'authButtonElementId': 'authorizeButton', - - /** - * The ID of the container of the authorize button. - */ - 'authDivElementId': 'authButtonDiv', - - /** - * Function to be called when a Realtime model is first created. - */ - 'initializeModel': Blockly.Realtime.initializeModel_, - - /** - * Autocreate files right after auth automatically. - */ - 'autoCreate': true, - - /** - * The name of newly created Drive files. - */ - 'defaultTitle': 'Realtime Blockly File', - - /** - * The name of the folder to place newly created Drive files in. - */ - 'defaultFolderTitle': 'Realtime Blockly Folder', - - /** - * The MIME type of newly created Drive Files. By default the application - * specific MIME type will be used: - * application/vnd.google-apps.drive-sdk. - */ - 'newFileMimeType': null, // Using default. - - /** - * Function to be called every time a Realtime file is loaded. - */ - 'onFileLoaded': Blockly.Realtime.onFileLoaded_, - - /** - * Function to be called to initialize custom Collaborative Objects types. - */ - 'registerTypes': Blockly.Realtime.registerTypes_, - - /** - * Function to be called after authorization and before loading files. - */ - 'afterAuth': Blockly.Realtime.afterAuth_, - - /** - * Function to be called after file creation, if autoCreate is true. - */ - 'afterCreate': Blockly.Realtime.afterCreate_ -}; - -/** - * Parse options to startRealtime(). - * @param {!Object} options Object containing the options. - * @private - */ -Blockly.Realtime.parseOptions_ = function(options) { - var chatBoxOptions = rtclient.getOption(options, 'chatbox'); - if (chatBoxOptions) { - Blockly.Realtime.chatBoxElementId_ = - rtclient.getOption(chatBoxOptions, 'elementId'); - Blockly.Realtime.chatBoxInitialText_ = - rtclient.getOption(chatBoxOptions, 'initText', Blockly.Msg.CHAT); - } - Blockly.Realtime.rtclientOptions_.clientId = - rtclient.getOption(options, 'clientId'); - Blockly.Realtime.collabElementId = - rtclient.getOption(options, 'collabElementId'); - // TODO: Uncomment this when undo/redo are fixed. -// Blockly.Realtime.undoElementId_ = -// rtclient.getOption(options, 'undoElementId', 'undoButton'); -// Blockly.Realtime.redoElementId_ = -// rtclient.getOption(options, 'redoElementId', 'redoButton'); -}; - -/** - * Setup the Blockly container for realtime authorization and start the - * Realtime loader. - * @param {function()} uiInitialize Function to initialize the Blockly UI. - * @param {!Element} uiContainer Container element for the Blockly UI. - * @param {!Object} options The realtime options. - */ -Blockly.Realtime.startRealtime = function(uiInitialize, uiContainer, options) { - Blockly.Realtime.parseOptions_(options); - Blockly.Realtime.enabled_ = true; - // Note that we need to setup the UI for realtime authorization before - // loading the realtime code (which, in turn, will handle initializing the - // rest of the Blockly UI). - var authDiv = Blockly.Realtime.addAuthUi_(uiContainer); - Blockly.Realtime.initUi_ = function() { - uiInitialize(); - if (Blockly.Realtime.chatBoxElementId_) { - var chatText = Blockly.Realtime.model_.getRoot().get( - Blockly.Realtime.chatBoxElementId_); - var chatBox = document.getElementById(Blockly.Realtime.chatBoxElementId_); - gapi.drive.realtime.databinding.bindString(chatText, chatBox); - chatBox.disabled = false; - } - }; - Blockly.Realtime.realtimeLoader_ = - new rtclient.RealtimeLoader(Blockly.Realtime.rtclientOptions_); - Blockly.Realtime.realtimeLoader_.start(); -}; - -/** - * Setup the Blockly container for realtime authorization. - * @param {!Element} uiContainer A DOM container element for the Blockly UI. - * @return {!Element} The DOM element for the authorization UI. - * @private - */ -Blockly.Realtime.addAuthUi_ = function(uiContainer) { - // Add progress indicator to the UI container. - uiContainer.style.background = 'url(' + Blockly.pathToMedia + - Blockly.Realtime.PROGRESS_URL_ + ') no-repeat center center'; - // Setup authorization button - var blocklyDivBounds = goog.style.getBounds(uiContainer); - var authButtonDiv = goog.dom.createDom('div'); - authButtonDiv.id = Blockly.Realtime.rtclientOptions_['authDivElementId']; - var authText = goog.dom.createDom('p', null, Blockly.Msg.AUTH); - authButtonDiv.appendChild(authText); - var authButton = goog.dom.createDom('button', null, 'Authorize'); - authButton.id = Blockly.Realtime.rtclientOptions_.authButtonElementId; - authButtonDiv.appendChild(authButton); - uiContainer.appendChild(authButtonDiv); - - // TODO: I would have liked to set the style for the authButtonDiv in css.js - // but that CSS doesn't get injected until after this code gets run. - authButtonDiv.style.display = 'none'; - authButtonDiv.style.position = 'relative'; - authButtonDiv.style.textAlign = 'center'; - authButtonDiv.style.border = '1px solid'; - authButtonDiv.style.backgroundColor = '#f6f9ff'; - authButtonDiv.style.borderRadius = '15px'; - authButtonDiv.style.boxShadow = '10px 10px 5px #888'; - authButtonDiv.style.width = (blocklyDivBounds.width / 3) + 'px'; - var authButtonDivBounds = goog.style.getBounds(authButtonDiv); - authButtonDiv.style.left = - (blocklyDivBounds.width - authButtonDivBounds.width) / 3 + 'px'; - authButtonDiv.style.top = - (blocklyDivBounds.height - authButtonDivBounds.height) / 4 + 'px'; - return authButtonDiv; -}; - -/** - * Update the collaborators UI to include the latest set of users. - * @private - */ -Blockly.Realtime.updateCollabUi_ = function() { - if (!Blockly.Realtime.collabElementId) { - return; - } - var collabElement = goog.dom.getElement(Blockly.Realtime.collabElementId); - goog.dom.removeChildren(collabElement); - var collaboratorsList = Blockly.Realtime.document_.getCollaborators(); - for (var i = 0; i < collaboratorsList.length; i++) { - var collaborator = collaboratorsList[i]; - var imgSrc = collaborator.photoUrl || - Blockly.pathToMedia + Blockly.Realtime.ANONYMOUS_URL_; - var img = goog.dom.createDom('img', - { - 'src': imgSrc, - 'alt': collaborator.displayName, - 'title': collaborator.displayName + - (collaborator.isMe ? ' (' + Blockly.Msg.ME + ')' : '')}); - img.style.backgroundColor = collaborator.color; - goog.dom.appendChild(collabElement, img); - } -}; - -/** - * Event handler for when collaborators join. - * @param {gapi.drive.realtime.CollaboratorJoinedEvent} event The event. - * @private - */ -Blockly.Realtime.onCollaboratorJoined_ = function(event) { - Blockly.Realtime.updateCollabUi_(); -}; - -/** - * Event handler for when collaborators leave. - * @param {gapi.drive.realtime.CollaboratorLeftEvent} event The event. - * @private - */ -Blockly.Realtime.onCollaboratorLeft_ = function(event) { - Blockly.Realtime.updateCollabUi_(); -}; - -/** - * Execute a command. Generally, a command is the result of a user action - * e.g. a click, drag or context menu selection. - * @param {function()} cmdThunk A function representing the command execution. - */ -Blockly.Realtime.doCommand = function(cmdThunk) { - // TODO(): We'd like to use the realtime API compound operations as in the - // commented out code below. However, it appears that the realtime API is - // re-ordering events when they're within compound operations in a way which - // breaks us. We might need to implement our own compound operations as a - // workaround. Doing so might give us some other advantages since we could - // then allow compound operations that span synchronous blocks of code (e.g., - // span multiple Blockly events). It would also allow us to deal with the - // fact that the current realtime API puts some operations into the undo stack - // that we would prefer weren't there; namely local changes that occur as a - // result of remote realtime events. -// try { -// Blockly.Realtime.model_.beginCompoundOperation(); -// cmdThunk(); -// } finally { -// Blockly.Realtime.model_.endCompoundOperation(); -// } - cmdThunk(); -}; - -/** - * Generate an id that is unique among the all the sessions that ever - * collaborated on this document. - * @param {string} extra A string id which is unique within this particular - * session. - * @return {string} - */ -Blockly.Realtime.genUid = function(extra) { - /* The idea here is that we use the extra string to ensure uniqueness within - this session and the current sessionId to ensure uniqueness across - all the current sessions. There's still the (remote) chance that the - current sessionId is the same as some old (non-current) one, so we still - need to check that our uid hasn't been previously used. - - Note that you could potentially use a random number to generate the id but - there remains the small chance of regenerating the same number that's been - used before and I'm paranoid. It's not enough to just check that the - random uid hasn't been previously used because other concurrent sessions - might generate the same uid at the same time. Like I said, I'm paranoid. - */ - var potentialUid = Blockly.Realtime.sessionId_ + '-' + extra; - if (!Blockly.Realtime.blocksMap_.has(potentialUid)) { - return potentialUid; - } else { - return (Blockly.Realtime.genUid('-' + extra)); - } -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/scrollbar.js b/src/opsoro/apps/visual_programming/static/blockly/core/scrollbar.js deleted file mode 100644 index b833ebe..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/scrollbar.js +++ /dev/null @@ -1,523 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Library for creating scrollbars. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Scrollbar'); -goog.provide('Blockly.ScrollbarPair'); - -goog.require('goog.dom'); -goog.require('goog.events'); - - -/** - * Class for a pair of scrollbars. Horizontal and vertical. - * @param {!Blockly.Workspace} workspace Workspace to bind the scrollbars to. - * @constructor - */ -Blockly.ScrollbarPair = function(workspace) { - this.workspace_ = workspace; - this.hScroll = new Blockly.Scrollbar(workspace, true, true); - this.vScroll = new Blockly.Scrollbar(workspace, false, true); - this.corner_ = Blockly.createSvgElement('rect', - {'height': Blockly.Scrollbar.scrollbarThickness, - 'width': Blockly.Scrollbar.scrollbarThickness, - 'class': 'blocklyScrollbarBackground'}, null); - Blockly.Scrollbar.insertAfter_(this.corner_, workspace.getBubbleCanvas()); -}; - -/** - * Previously recorded metrics from the workspace. - * @type {Object} - * @private - */ -Blockly.ScrollbarPair.prototype.oldHostMetrics_ = null; - -/** - * Dispose of this pair of scrollbars. - * Unlink from all DOM elements to prevent memory leaks. - */ -Blockly.ScrollbarPair.prototype.dispose = function() { - goog.dom.removeNode(this.corner_); - this.corner_ = null; - this.workspace_ = null; - this.oldHostMetrics_ = null; - this.hScroll.dispose(); - this.hScroll = null; - this.vScroll.dispose(); - this.vScroll = null; -}; - -/** - * Recalculate both of the scrollbars' locations and lengths. - * Also reposition the corner rectangle. - */ -Blockly.ScrollbarPair.prototype.resize = function() { - // Look up the host metrics once, and use for both scrollbars. - var hostMetrics = this.workspace_.getMetrics(); - if (!hostMetrics) { - // Host element is likely not visible. - return; - } - - // Only change the scrollbars if there has been a change in metrics. - var resizeH = false; - var resizeV = false; - if (!this.oldHostMetrics_ || - this.oldHostMetrics_.viewWidth != hostMetrics.viewWidth || - this.oldHostMetrics_.viewHeight != hostMetrics.viewHeight || - this.oldHostMetrics_.absoluteTop != hostMetrics.absoluteTop || - this.oldHostMetrics_.absoluteLeft != hostMetrics.absoluteLeft) { - // The window has been resized or repositioned. - resizeH = true; - resizeV = true; - } else { - // Has the content been resized or moved? - if (!this.oldHostMetrics_ || - this.oldHostMetrics_.contentWidth != hostMetrics.contentWidth || - this.oldHostMetrics_.viewLeft != hostMetrics.viewLeft || - this.oldHostMetrics_.contentLeft != hostMetrics.contentLeft) { - resizeH = true; - } - if (!this.oldHostMetrics_ || - this.oldHostMetrics_.contentHeight != hostMetrics.contentHeight || - this.oldHostMetrics_.viewTop != hostMetrics.viewTop || - this.oldHostMetrics_.contentTop != hostMetrics.contentTop) { - resizeV = true; - } - } - if (resizeH) { - this.hScroll.resize(hostMetrics); - } - if (resizeV) { - this.vScroll.resize(hostMetrics); - } - - // Reposition the corner square. - if (!this.oldHostMetrics_ || - this.oldHostMetrics_.viewWidth != hostMetrics.viewWidth || - this.oldHostMetrics_.absoluteLeft != hostMetrics.absoluteLeft) { - this.corner_.setAttribute('x', this.vScroll.xCoordinate); - } - if (!this.oldHostMetrics_ || - this.oldHostMetrics_.viewHeight != hostMetrics.viewHeight || - this.oldHostMetrics_.absoluteTop != hostMetrics.absoluteTop) { - this.corner_.setAttribute('y', this.hScroll.yCoordinate); - } - - // Cache the current metrics to potentially short-cut the next resize event. - this.oldHostMetrics_ = hostMetrics; -}; - -/** - * Set the sliders of both scrollbars to be at a certain position. - * @param {number} x Horizontal scroll value. - * @param {number} y Vertical scroll value. - */ -Blockly.ScrollbarPair.prototype.set = function(x, y) { - this.hScroll.set(x); - this.vScroll.set(y); -}; - -// -------------------------------------------------------------------- - -/** - * Class for a pure SVG scrollbar. - * This technique offers a scrollbar that is guaranteed to work, but may not - * look or behave like the system's scrollbars. - * @param {!Blockly.Workspace} workspace Workspace to bind the scrollbar to. - * @param {boolean} horizontal True if horizontal, false if vertical. - * @param {boolean=} opt_pair True if the scrollbar is part of a horiz/vert pair. - * @constructor - */ -Blockly.Scrollbar = function(workspace, horizontal, opt_pair) { - this.workspace_ = workspace; - this.pair_ = opt_pair || false; - this.horizontal_ = horizontal; - - this.createDom_(); - - if (horizontal) { - this.svgBackground_.setAttribute('height', - Blockly.Scrollbar.scrollbarThickness); - this.svgKnob_.setAttribute('height', - Blockly.Scrollbar.scrollbarThickness - 5); - this.svgKnob_.setAttribute('y', 2.5); - } else { - this.svgBackground_.setAttribute('width', - Blockly.Scrollbar.scrollbarThickness); - this.svgKnob_.setAttribute('width', - Blockly.Scrollbar.scrollbarThickness - 5); - this.svgKnob_.setAttribute('x', 2.5); - } - var scrollbar = this; - this.onMouseDownBarWrapper_ = Blockly.bindEvent_(this.svgBackground_, - 'mousedown', scrollbar, scrollbar.onMouseDownBar_); - this.onMouseDownKnobWrapper_ = Blockly.bindEvent_(this.svgKnob_, - 'mousedown', scrollbar, scrollbar.onMouseDownKnob_); -}; - -/** - * Width of vertical scrollbar or height of horizontal scrollbar. - * Increase the size of scrollbars on touch devices. - * Don't define if there is no document object (e.g. node.js). - */ -Blockly.Scrollbar.scrollbarThickness = 15; -if (goog.events.BrowserFeature.TOUCH_ENABLED) { - Blockly.Scrollbar.scrollbarThickness = 25; -} - -/** - * Dispose of this scrollbar. - * Unlink from all DOM elements to prevent memory leaks. - */ -Blockly.Scrollbar.prototype.dispose = function() { - this.onMouseUpKnob_(); - Blockly.unbindEvent_(this.onMouseDownBarWrapper_); - this.onMouseDownBarWrapper_ = null; - Blockly.unbindEvent_(this.onMouseDownKnobWrapper_); - this.onMouseDownKnobWrapper_ = null; - - goog.dom.removeNode(this.svgGroup_); - this.svgGroup_ = null; - this.svgBackground_ = null; - this.svgKnob_ = null; - this.workspace_ = null; -}; - -/** - * Recalculate the scrollbar's location and its length. - * @param {Object=} opt_metrics A data structure of from the describing all the - * required dimensions. If not provided, it will be fetched from the host - * object. - */ -Blockly.Scrollbar.prototype.resize = function(opt_metrics) { - // Determine the location, height and width of the host element. - var hostMetrics = opt_metrics; - if (!hostMetrics) { - hostMetrics = this.workspace_.getMetrics(); - if (!hostMetrics) { - // Host element is likely not visible. - return; - } - } - /* hostMetrics is an object with the following properties. - * .viewHeight: Height of the visible rectangle, - * .viewWidth: Width of the visible rectangle, - * .contentHeight: Height of the contents, - * .contentWidth: Width of the content, - * .viewTop: Offset of top edge of visible rectangle from parent, - * .viewLeft: Offset of left edge of visible rectangle from parent, - * .contentTop: Offset of the top-most content from the y=0 coordinate, - * .contentLeft: Offset of the left-most content from the x=0 coordinate, - * .absoluteTop: Top-edge of view. - * .absoluteLeft: Left-edge of view. - */ - if (this.horizontal_) { - var outerLength = hostMetrics.viewWidth - 1; - if (this.pair_) { - // Shorten the scrollbar to make room for the corner square. - outerLength -= Blockly.Scrollbar.scrollbarThickness; - } else { - // Only show the scrollbar if needed. - // Ideally this would also apply to scrollbar pairs, but that's a bigger - // headache (due to interactions with the corner square). - this.setVisible(outerLength < hostMetrics.contentHeight); - } - this.ratio_ = outerLength / hostMetrics.contentWidth; - if (this.ratio_ === -Infinity || this.ratio_ === Infinity || - isNaN(this.ratio_)) { - this.ratio_ = 0; - } - var innerLength = hostMetrics.viewWidth * this.ratio_; - var innerOffset = (hostMetrics.viewLeft - hostMetrics.contentLeft) * - this.ratio_; - this.svgKnob_.setAttribute('width', Math.max(0, innerLength)); - this.xCoordinate = hostMetrics.absoluteLeft + 0.5; - if (this.pair_ && this.workspace_.RTL) { - this.xCoordinate += hostMetrics.absoluteLeft + - Blockly.Scrollbar.scrollbarThickness; - } - this.yCoordinate = hostMetrics.absoluteTop + hostMetrics.viewHeight - - Blockly.Scrollbar.scrollbarThickness - 0.5; - this.svgGroup_.setAttribute('transform', - 'translate(' + this.xCoordinate + ',' + this.yCoordinate + ')'); - this.svgBackground_.setAttribute('width', Math.max(0, outerLength)); - this.svgKnob_.setAttribute('x', this.constrainKnob_(innerOffset)); - } else { - var outerLength = hostMetrics.viewHeight - 1; - if (this.pair_) { - // Shorten the scrollbar to make room for the corner square. - outerLength -= Blockly.Scrollbar.scrollbarThickness; - } else { - // Only show the scrollbar if needed. - this.setVisible(outerLength < hostMetrics.contentHeight); - } - this.ratio_ = outerLength / hostMetrics.contentHeight; - if (this.ratio_ === -Infinity || this.ratio_ === Infinity || - isNaN(this.ratio_)) { - this.ratio_ = 0; - } - var innerLength = hostMetrics.viewHeight * this.ratio_; - var innerOffset = (hostMetrics.viewTop - hostMetrics.contentTop) * - this.ratio_; - this.svgKnob_.setAttribute('height', Math.max(0, innerLength)); - this.xCoordinate = hostMetrics.absoluteLeft + 0.5; - if (!this.workspace_.RTL) { - this.xCoordinate += hostMetrics.viewWidth - - Blockly.Scrollbar.scrollbarThickness - 1; - } - this.yCoordinate = hostMetrics.absoluteTop + 0.5; - this.svgGroup_.setAttribute('transform', - 'translate(' + this.xCoordinate + ',' + this.yCoordinate + ')'); - this.svgBackground_.setAttribute('height', Math.max(0, outerLength)); - this.svgKnob_.setAttribute('y', this.constrainKnob_(innerOffset)); - } - // Resizing may have caused some scrolling. - this.onScroll_(); -}; - -/** - * Create all the DOM elements required for a scrollbar. - * The resulting widget is not sized. - * @private - */ -Blockly.Scrollbar.prototype.createDom_ = function() { - /* Create the following DOM: - - - - - */ - var className = 'blocklyScrollbar' + - (this.horizontal_ ? 'Horizontal' : 'Vertical'); - this.svgGroup_ = Blockly.createSvgElement('g', {'class': className}, null); - this.svgBackground_ = Blockly.createSvgElement('rect', - {'class': 'blocklyScrollbarBackground'}, this.svgGroup_); - var radius = Math.floor((Blockly.Scrollbar.scrollbarThickness - 5) / 2); - this.svgKnob_ = Blockly.createSvgElement('rect', - {'class': 'blocklyScrollbarKnob', 'rx': radius, 'ry': radius}, - this.svgGroup_); - Blockly.Scrollbar.insertAfter_(this.svgGroup_, - this.workspace_.getBubbleCanvas()); -}; - -/** - * Is the scrollbar visible. Non-paired scrollbars disappear when they aren't - * needed. - * @return {boolean} True if visible. - */ -Blockly.Scrollbar.prototype.isVisible = function() { - return this.svgGroup_.getAttribute('display') != 'none'; -}; - -/** - * Set whether the scrollbar is visible. - * Only applies to non-paired scrollbars. - * @param {boolean} visible True if visible. - */ -Blockly.Scrollbar.prototype.setVisible = function(visible) { - if (visible == this.isVisible()) { - return; - } - // Ideally this would also apply to scrollbar pairs, but that's a bigger - // headache (due to interactions with the corner square). - if (this.pair_) { - throw 'Unable to toggle visibility of paired scrollbars.'; - } - if (visible) { - this.svgGroup_.setAttribute('display', 'block'); - } else { - // Hide the scrollbar. - this.workspace_.setMetrics({x: 0, y: 0}); - this.svgGroup_.setAttribute('display', 'none'); - } -}; - -/** - * Scroll by one pageful. - * Called when scrollbar background is clicked. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.Scrollbar.prototype.onMouseDownBar_ = function(e) { - this.onMouseUpKnob_(); - if (Blockly.isRightButton(e)) { - // Right-click. - // Scrollbars have no context menu. - e.stopPropagation(); - return; - } - var mouseXY = Blockly.mouseToSvg(e, this.workspace_.options.svg); - var mouseLocation = this.horizontal_ ? mouseXY.x : mouseXY.y; - - var knobXY = Blockly.getSvgXY_(this.svgKnob_, this.workspace_); - var knobStart = this.horizontal_ ? knobXY.x : knobXY.y; - var knobLength = parseFloat( - this.svgKnob_.getAttribute(this.horizontal_ ? 'width' : 'height')); - var knobValue = parseFloat( - this.svgKnob_.getAttribute(this.horizontal_ ? 'x' : 'y')); - - var pageLength = knobLength * 0.95; - if (mouseLocation <= knobStart) { - // Decrease the scrollbar's value by a page. - knobValue -= pageLength; - } else if (mouseLocation >= knobStart + knobLength) { - // Increase the scrollbar's value by a page. - knobValue += pageLength; - } - this.svgKnob_.setAttribute(this.horizontal_ ? 'x' : 'y', - this.constrainKnob_(knobValue)); - this.onScroll_(); - e.stopPropagation(); -}; - -/** - * Start a dragging operation. - * Called when scrollbar knob is clicked. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.Scrollbar.prototype.onMouseDownKnob_ = function(e) { - this.onMouseUpKnob_(); - if (Blockly.isRightButton(e)) { - // Right-click. - // Scrollbars have no context menu. - e.stopPropagation(); - return; - } - // Look up the current translation and record it. - this.startDragKnob = parseFloat( - this.svgKnob_.getAttribute(this.horizontal_ ? 'x' : 'y')); - // Record the current mouse position. - this.startDragMouse = this.horizontal_ ? e.clientX : e.clientY; - Blockly.Scrollbar.onMouseUpWrapper_ = Blockly.bindEvent_(document, - 'mouseup', this, this.onMouseUpKnob_); - Blockly.Scrollbar.onMouseMoveWrapper_ = Blockly.bindEvent_(document, - 'mousemove', this, this.onMouseMoveKnob_); - e.stopPropagation(); -}; - -/** - * Drag the scrollbar's knob. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.Scrollbar.prototype.onMouseMoveKnob_ = function(e) { - var currentMouse = this.horizontal_ ? e.clientX : e.clientY; - var mouseDelta = currentMouse - this.startDragMouse; - var knobValue = this.startDragKnob + mouseDelta; - // Position the bar. - this.svgKnob_.setAttribute(this.horizontal_ ? 'x' : 'y', - this.constrainKnob_(knobValue)); - this.onScroll_(); -}; - -/** - * Stop binding to the global mouseup and mousemove events. - * @private - */ -Blockly.Scrollbar.prototype.onMouseUpKnob_ = function() { - Blockly.removeAllRanges(); - Blockly.hideChaff(true); - if (Blockly.Scrollbar.onMouseUpWrapper_) { - Blockly.unbindEvent_(Blockly.Scrollbar.onMouseUpWrapper_); - Blockly.Scrollbar.onMouseUpWrapper_ = null; - } - if (Blockly.Scrollbar.onMouseMoveWrapper_) { - Blockly.unbindEvent_(Blockly.Scrollbar.onMouseMoveWrapper_); - Blockly.Scrollbar.onMouseMoveWrapper_ = null; - } -}; - -/** - * Constrain the knob's position within the minimum (0) and maximum - * (length of scrollbar) values allowed for the scrollbar. - * @param {number} value Value that is potentially out of bounds. - * @return {number} Constrained value. - * @private - */ -Blockly.Scrollbar.prototype.constrainKnob_ = function(value) { - if (value <= 0 || isNaN(value)) { - value = 0; - } else { - var axis = this.horizontal_ ? 'width' : 'height'; - var barLength = parseFloat(this.svgBackground_.getAttribute(axis)); - var knobLength = parseFloat(this.svgKnob_.getAttribute(axis)); - value = Math.min(value, barLength - knobLength); - } - return value; -}; - -/** - * Called when scrollbar is moved. - * @private - */ -Blockly.Scrollbar.prototype.onScroll_ = function() { - var knobValue = parseFloat( - this.svgKnob_.getAttribute(this.horizontal_ ? 'x' : 'y')); - var barLength = parseFloat( - this.svgBackground_.getAttribute(this.horizontal_ ? 'width' : 'height')); - var ratio = knobValue / barLength; - if (isNaN(ratio)) { - ratio = 0; - } - var xyRatio = {}; - if (this.horizontal_) { - xyRatio.x = ratio; - } else { - xyRatio.y = ratio; - } - this.workspace_.setMetrics(xyRatio); -}; - -/** - * Set the scrollbar slider's position. - * @param {number} value The distance from the top/left end of the bar. - */ -Blockly.Scrollbar.prototype.set = function(value) { - // Move the scrollbar slider. - this.svgKnob_.setAttribute(this.horizontal_ ? 'x' : 'y', value * this.ratio_); - this.onScroll_(); -}; - -/** - * Insert a node after a reference node. - * Contrast with node.insertBefore function. - * @param {!Element} newNode New element to insert. - * @param {!Element} refNode Existing element to precede new node. - * @private - */ -Blockly.Scrollbar.insertAfter_ = function(newNode, refNode) { - var siblingNode = refNode.nextSibling; - var parentNode = refNode.parentNode; - if (!parentNode) { - throw 'Reference node has no parent.'; - } - if (siblingNode) { - parentNode.insertBefore(newNode, siblingNode); - } else { - parentNode.appendChild(newNode); - } -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/toolbox.js b/src/opsoro/apps/visual_programming/static/blockly/core/toolbox.js deleted file mode 100644 index 2b433d3..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/toolbox.js +++ /dev/null @@ -1,460 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Toolbox from whence to create blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Toolbox'); - -goog.require('Blockly.Flyout'); -goog.require('goog.dom'); -goog.require('goog.events'); -goog.require('goog.events.BrowserFeature'); -goog.require('goog.html.SafeHtml'); -goog.require('goog.math.Rect'); -goog.require('goog.style'); -goog.require('goog.ui.tree.TreeControl'); -goog.require('goog.ui.tree.TreeNode'); - - -/** - * Class for a Toolbox. - * Creates the toolbox's DOM. - * @param {!Blockly.Workspace} workspace The workspace in which to create new - * blocks. - * @constructor - */ -Blockly.Toolbox = function(workspace) { - /** - * @type {!Blockly.Workspace} - * @private - */ - this.workspace_ = workspace; -}; - -/** - * Width of the toolbox. - * @type {number} - */ -Blockly.Toolbox.prototype.width = 0; - -/** - * The SVG group currently selected. - * @type {SVGGElement} - * @private - */ -Blockly.Toolbox.prototype.selectedOption_ = null; - -/** - * The tree node most recently selected. - * @type {goog.ui.tree.BaseNode} - * @private - */ -Blockly.Toolbox.prototype.lastCategory_ = null; - -/** - * Configuration constants for Closure's tree UI. - * @type {Object.} - * @const - * @private - */ -Blockly.Toolbox.prototype.CONFIG_ = { - indentWidth: 19, - cssRoot: 'blocklyTreeRoot', - cssHideRoot: 'blocklyHidden', - cssItem: '', - cssTreeRow: 'blocklyTreeRow', - cssItemLabel: 'blocklyTreeLabel', - cssTreeIcon: 'blocklyTreeIcon', - cssExpandedFolderIcon: 'blocklyTreeIconOpen', - cssFileIcon: 'blocklyTreeIconNone', - cssSelectedRow: 'blocklyTreeSelected' -}; - -/** - * Initializes the toolbox. - */ -Blockly.Toolbox.prototype.init = function() { - var workspace = this.workspace_; - - // Create an HTML container for the Toolbox menu. - this.HtmlDiv = goog.dom.createDom('div', 'blocklyToolboxDiv'); - this.HtmlDiv.setAttribute('dir', workspace.RTL ? 'RTL' : 'LTR'); - document.body.appendChild(this.HtmlDiv); - - // Clicking on toolbar closes popups. - Blockly.bindEvent_(this.HtmlDiv, 'mousedown', this, - function(e) { - if (Blockly.isRightButton(e) || e.target == this.HtmlDiv) { - // Close flyout. - Blockly.hideChaff(false); - } else { - // Just close popups. - Blockly.hideChaff(true); - } - }); - var workspaceOptions = { - parentWorkspace: workspace, - RTL: workspace.RTL, - svg: workspace.options.svg - }; - /** - * @type {!Blockly.Flyout} - * @private - */ - this.flyout_ = new Blockly.Flyout(workspaceOptions); - goog.dom.insertSiblingAfter(this.flyout_.createDom(), workspace.svgGroup_); - this.flyout_.init(workspace); - - this.CONFIG_['cleardotPath'] = workspace.options.pathToMedia + '1x1.gif'; - this.CONFIG_['cssCollapsedFolderIcon'] = - 'blocklyTreeIconClosed' + (workspace.RTL ? 'Rtl' : 'Ltr'); - var tree = new Blockly.Toolbox.TreeControl(this, this.CONFIG_); - this.tree_ = tree; - tree.setShowRootNode(false); - tree.setShowLines(false); - tree.setShowExpandIcons(false); - tree.setSelectedItem(null); - this.populate_(workspace.options.languageTree); - tree.render(this.HtmlDiv); - this.addColour_(tree); - this.position(); -}; - -/** - * Dispose of this toolbox. - */ -Blockly.Toolbox.prototype.dispose = function() { - this.flyout_.dispose(); - this.tree_.dispose(); - goog.dom.removeNode(this.HtmlDiv); - this.workspace_ = null; - this.lastCategory_ = null; -}; - -/** - * Move the toolbox to the edge. - */ -Blockly.Toolbox.prototype.position = function() { - var treeDiv = this.HtmlDiv; - if (!treeDiv) { - // Not initialized yet. - return; - } - var svg = this.workspace_.options.svg; - var svgPosition = goog.style.getPageOffset(svg); - var svgSize = Blockly.svgSize(svg); - if (this.workspace_.RTL) { - treeDiv.style.left = - (svgPosition.x + svgSize.width - treeDiv.offsetWidth) + 'px'; - } else { - treeDiv.style.left = svgPosition.x + 'px'; - } - treeDiv.style.height = svgSize.height + 'px'; - treeDiv.style.top = svgPosition.y + 'px'; - this.width = treeDiv.offsetWidth; - if (!this.workspace_.RTL) { - // For some reason the LTR toolbox now reports as 1px too wide. - this.width -= 1; - } - this.flyout_.position(); -}; - -/** - * Fill the toolbox with categories and blocks. - * @param {Node} newTree DOM tree of blocks, or null. - * @private - */ -Blockly.Toolbox.prototype.populate_ = function(newTree) { - var rootOut = this.tree_; - rootOut.removeChildren(); // Delete any existing content. - rootOut.blocks = []; - function syncTrees(treeIn, treeOut) { - for (var i = 0, childIn; childIn = treeIn.childNodes[i]; i++) { - if (!childIn.tagName) { - // Skip over text. - continue; - } - switch (childIn.tagName.toUpperCase()) { - case 'CATEGORY': - var childOut = rootOut.createNode(childIn.getAttribute('name')); - childOut.blocks = []; - treeOut.add(childOut); - var custom = childIn.getAttribute('custom'); - if (custom) { - // Variables and procedures are special dynamic categories. - childOut.blocks = custom; - } else { - syncTrees(childIn, childOut); - } - var hue = childIn.getAttribute('colour'); - childOut.hexColour = goog.isString(hue) ? - Blockly.makeColour(hue) : ''; - if (childIn.getAttribute('expanded') == 'true') { - if (childOut.blocks.length) { - rootOut.setSelectedItem(childOut); - } - childOut.setExpanded(true); - } - break; - case 'SEP': - treeOut.add(new Blockly.Toolbox.TreeSeparator()); - break; - case 'BLOCK': - treeOut.blocks.push(childIn); - break; - } - } - } - syncTrees(newTree, this.tree_); - - if (rootOut.blocks.length) { - throw 'Toolbox cannot have both blocks and categories in the root level.'; - } - - // Fire a resize event since the toolbox may have changed width and height. - Blockly.fireUiEvent(window, 'resize'); -}; - -/** - * Recursively add colours to this toolbox. - * @param {!Blockly.Toolbox.TreeNode} - * @private - */ -Blockly.Toolbox.prototype.addColour_ = function(tree) { - var children = tree.getChildren(); - for (var i = 0, child; child = children[i]; i++) { - var element = child.getElement(); - if (element) { - var border = '8px solid ' + (child.hexColour || '#ddd'); - if (this.workspace_.RTL) { - element.style.borderLeft = border; - } else { - element.style.borderRight = border; - } - } - this.addColour_(child); - } -}; - -/** - * Unhighlight any previously specified option. - */ -Blockly.Toolbox.prototype.clearSelection = function() { - this.tree_.setSelectedItem(null); -}; - -/** - * Return the deletion rectangle for this toolbar. - * @return {goog.math.Rect} Rectangle in which to delete. - */ -Blockly.Toolbox.prototype.getRect = function() { - // BIG_NUM is offscreen padding so that blocks dragged beyond the toolbox - // area are still deleted. Must be smaller than Infinity, but larger than - // the largest screen size. - var BIG_NUM = 10000000; - // Assumes that the toolbox is on the SVG edge. If this changes - // (e.g. toolboxes in mutators) then this code will need to be more complex. - if (this.workspace_.RTL) { - var svgSize = Blockly.svgSize(this.workspace_.options.svg); - var x = svgSize.width - this.width; - } else { - var x = -BIG_NUM; - } - return new goog.math.Rect(x, -BIG_NUM, BIG_NUM + this.width, 2 * BIG_NUM); -}; - -// Extending Closure's Tree UI. - -/** - * Extention of a TreeControl object that uses a custom tree node. - * @param {Blockly.Toolbox} toolbox The parent toolbox for this tree. - * @param {Object} config The configuration for the tree. See - * goog.ui.tree.TreeControl.DefaultConfig. - * @constructor - * @extends {goog.ui.tree.TreeControl} - */ -Blockly.Toolbox.TreeControl = function(toolbox, config) { - this.toolbox_ = toolbox; - goog.ui.tree.TreeControl.call(this, goog.html.SafeHtml.EMPTY, config); -}; -goog.inherits(Blockly.Toolbox.TreeControl, goog.ui.tree.TreeControl); - -/** - * Adds touch handling to TreeControl. - * @override - */ -Blockly.Toolbox.TreeControl.prototype.enterDocument = function() { - Blockly.Toolbox.TreeControl.superClass_.enterDocument.call(this); - - // Add touch handler. - if (goog.events.BrowserFeature.TOUCH_ENABLED) { - var el = this.getElement(); - Blockly.bindEvent_(el, goog.events.EventType.TOUCHSTART, this, - this.handleTouchEvent_); - } -}; -/** - * Handles touch events. - * @param {!goog.events.BrowserEvent} e The browser event. - * @private - */ -Blockly.Toolbox.TreeControl.prototype.handleTouchEvent_ = function(e) { - e.preventDefault(); - var node = this.getNodeFromEvent_(e); - if (node && e.type === goog.events.EventType.TOUCHSTART) { - // Fire asynchronously since onMouseDown takes long enough that the browser - // would fire the default mouse event before this method returns. - setTimeout(function() { - node.onMouseDown(e); // Same behaviour for click and touch. - }, 1); - } -}; - -/** - * Creates a new tree node using a custom tree node. - * @param {string=} opt_html The HTML content of the node label. - * @return {!goog.ui.tree.TreeNode} The new item. - * @override - */ -Blockly.Toolbox.TreeControl.prototype.createNode = function(opt_html) { - return new Blockly.Toolbox.TreeNode(this.toolbox_, opt_html ? - goog.html.SafeHtml.htmlEscape(opt_html) : goog.html.SafeHtml.EMPTY, - this.getConfig(), this.getDomHelper()); -}; - -/** - * Display/hide the flyout when an item is selected. - * @param {goog.ui.tree.BaseNode} node The item to select. - * @override - */ -Blockly.Toolbox.TreeControl.prototype.setSelectedItem = function(node) { - Blockly.removeAllRanges(); - var toolbox = this.toolbox_; - if (node == this.selectedItem_ || node == toolbox.tree_) { - return; - } - if (toolbox.lastCategory_) { - toolbox.lastCategory_.getElement().style.backgroundColor = ''; - } - if (node) { - var hexColour = node.hexColour || '#57e'; - node.getElement().style.backgroundColor = hexColour; - } - goog.ui.tree.TreeControl.prototype.setSelectedItem.call(this, node); - if (node && node.blocks && node.blocks.length) { - toolbox.flyout_.show(node.blocks); - // Scroll the flyout to the top if the category has changed. - if (toolbox.lastCategory_ != node) { - toolbox.flyout_.scrollToTop(); - toolbox.lastCategory_ = node; - } - } else { - // Hide the flyout. - toolbox.flyout_.hide(); - } -}; - -/** - * A single node in the tree, customized for Blockly's UI. - * @param {Blockly.Toolbox} toolbox The parent toolbox for this tree. - * @param {!goog.html.SafeHtml} html The HTML content of the node label. - * @param {Object=} opt_config The configuration for the tree. See - * goog.ui.tree.TreeControl.DefaultConfig. If not specified, a default config - * will be used. - * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper. - * @constructor - * @extends {goog.ui.tree.TreeNode} - */ -Blockly.Toolbox.TreeNode = function(toolbox, html, opt_config, opt_domHelper) { - goog.ui.tree.TreeNode.call(this, html, opt_config, opt_domHelper); - if (toolbox) { - var resize = function() { - Blockly.fireUiEvent(window, 'resize'); - }; - // Fire a resize event since the toolbox may have changed width. - goog.events.listen(toolbox.tree_, - goog.ui.tree.BaseNode.EventType.EXPAND, resize); - goog.events.listen(toolbox.tree_, - goog.ui.tree.BaseNode.EventType.COLLAPSE, resize); - } -}; -goog.inherits(Blockly.Toolbox.TreeNode, goog.ui.tree.TreeNode); - -/** - * Supress population of the +/- icon. - * @return {!goog.html.SafeHtml} The source for the icon. - * @override - */ -Blockly.Toolbox.TreeNode.prototype.getExpandIconSafeHtml = function() { - return goog.html.SafeHtml.create('span'); -}; - -/** - * Expand or collapse the node on mouse click. - * @param {!goog.events.BrowserEvent} e The browser event. - * @override - */ -Blockly.Toolbox.TreeNode.prototype.onMouseDown = function(e) { - // Expand icon. - if (this.hasChildren() && this.isUserCollapsible_) { - this.toggle(); - this.select(); - } else if (this.isSelected()) { - this.getTree().setSelectedItem(null); - } else { - this.select(); - } - this.updateRow(); -}; - -/** - * Supress the inherited double-click behaviour. - * @param {!goog.events.BrowserEvent} e The browser event. - * @override - * @private - */ -Blockly.Toolbox.TreeNode.prototype.onDoubleClick_ = function(e) { - // NOP. -}; - -/** - * A blank separator node in the tree. - * @constructor - * @extends {Blockly.Toolbox.TreeNode} - */ -Blockly.Toolbox.TreeSeparator = function() { - Blockly.Toolbox.TreeNode.call(this, null, '', - Blockly.Toolbox.TreeSeparator.CONFIG_); -}; -goog.inherits(Blockly.Toolbox.TreeSeparator, Blockly.Toolbox.TreeNode); - -/** - * Configuration constants for tree separator. - * @type {Object.} - * @const - * @private - */ -Blockly.Toolbox.TreeSeparator.CONFIG_ = { - cssTreeRow: 'blocklyTreeSeparator' -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/tooltip.js b/src/opsoro/apps/visual_programming/static/blockly/core/tooltip.js deleted file mode 100644 index 4ac8049..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/tooltip.js +++ /dev/null @@ -1,438 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Library to create tooltips for Blockly. - * First, call Blockly.Tooltip.init() after onload. - * Second, set the 'tooltip' property on any SVG element that needs a tooltip. - * If the tooltip is a string, then that message will be displayed. - * If the tooltip is an SVG element, then that object's tooltip will be used. - * Third, call Blockly.Tooltip.bindMouseEvents(e) passing the SVG element. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Tooltip'); - -goog.require('goog.dom'); - - -/** - * Is a tooltip currently showing? - */ -Blockly.Tooltip.visible = false; - -/** - * Maximum width (in characters) of a tooltip. - */ -Blockly.Tooltip.LIMIT = 50; - -/** - * PID of suspended thread to clear tooltip on mouse out. - * @private - */ -Blockly.Tooltip.mouseOutPid_ = 0; - -/** - * PID of suspended thread to show the tooltip. - * @private - */ -Blockly.Tooltip.showPid_ = 0; - -/** - * Last observed X location of the mouse pointer (freezes when tooltip appears). - * @private - */ -Blockly.Tooltip.lastX_ = 0; - -/** - * Last observed Y location of the mouse pointer (freezes when tooltip appears). - * @private - */ -Blockly.Tooltip.lastY_ = 0; - -/** - * Current element being pointed at. - * @private - */ -Blockly.Tooltip.element_ = null; - -/** - * Once a tooltip has opened for an element, that element is 'poisoned' and - * cannot respawn a tooltip until the pointer moves over a different element. - * @private - */ -Blockly.Tooltip.poisonedElement_ = null; - -/** - * Horizontal offset between mouse cursor and tooltip. - */ -Blockly.Tooltip.OFFSET_X = 0; - -/** - * Vertical offset between mouse cursor and tooltip. - */ -Blockly.Tooltip.OFFSET_Y = 10; - -/** - * Radius mouse can move before killing tooltip. - */ -Blockly.Tooltip.RADIUS_OK = 10; - -/** - * Delay before tooltip appears. - */ -Blockly.Tooltip.HOVER_MS = 1000; - -/** - * Horizontal padding between tooltip and screen edge. - */ -Blockly.Tooltip.MARGINS = 5; - -/** - * The HTML container. Set once by Blockly.Tooltip.createDom. - * @type {Element} - */ -Blockly.Tooltip.DIV = null; - -/** - * Create the tooltip div and inject it onto the page. - */ -Blockly.Tooltip.createDom = function() { - if (Blockly.Tooltip.DIV) { - return; // Already created. - } - // Create an HTML container for popup overlays (e.g. editor widgets). - Blockly.Tooltip.DIV = goog.dom.createDom('div', 'blocklyTooltipDiv'); - document.body.appendChild(Blockly.Tooltip.DIV); -}; - -/** - * Binds the required mouse events onto an SVG element. - * @param {!Element} element SVG element onto which tooltip is to be bound. - */ -Blockly.Tooltip.bindMouseEvents = function(element) { - Blockly.bindEvent_(element, 'mouseover', null, Blockly.Tooltip.onMouseOver_); - Blockly.bindEvent_(element, 'mouseout', null, Blockly.Tooltip.onMouseOut_); - Blockly.bindEvent_(element, 'mousemove', null, Blockly.Tooltip.onMouseMove_); -}; - -/** - * Hide the tooltip if the mouse is over a different object. - * Initialize the tooltip to potentially appear for this object. - * @param {!Event} e Mouse event. - * @private - */ -Blockly.Tooltip.onMouseOver_ = function(e) { - // If the tooltip is an object, treat it as a pointer to the next object in - // the chain to look at. Terminate when a string or function is found. - var element = e.target; - while (!goog.isString(element.tooltip) && !goog.isFunction(element.tooltip)) { - element = element.tooltip; - } - if (Blockly.Tooltip.element_ != element) { - Blockly.Tooltip.hide(); - Blockly.Tooltip.poisonedElement_ = null; - Blockly.Tooltip.element_ = element; - } - // Forget about any immediately preceeding mouseOut event. - clearTimeout(Blockly.Tooltip.mouseOutPid_); -}; - -/** - * Hide the tooltip if the mouse leaves the object and enters the workspace. - * @param {!Event} e Mouse event. - * @private - */ -Blockly.Tooltip.onMouseOut_ = function(e) { - // Moving from one element to another (overlapping or with no gap) generates - // a mouseOut followed instantly by a mouseOver. Fork off the mouseOut - // event and kill it if a mouseOver is received immediately. - // This way the task only fully executes if mousing into the void. - Blockly.Tooltip.mouseOutPid_ = setTimeout(function() { - Blockly.Tooltip.element_ = null; - Blockly.Tooltip.poisonedElement_ = null; - Blockly.Tooltip.hide(); - }, 1); - clearTimeout(Blockly.Tooltip.showPid_); -}; - -/** - * When hovering over an element, schedule a tooltip to be shown. If a tooltip - * is already visible, hide it if the mouse strays out of a certain radius. - * @param {!Event} e Mouse event. - * @private - */ -Blockly.Tooltip.onMouseMove_ = function(e) { - if (!Blockly.Tooltip.element_ || !Blockly.Tooltip.element_.tooltip) { - // No tooltip here to show. - return; - } else if (Blockly.dragMode_ != 0) { - // Don't display a tooltip during a drag. - return; - } else if (Blockly.WidgetDiv.isVisible()) { - // Don't display a tooltip if a widget is open (tooltip would be under it). - return; - } - if (Blockly.Tooltip.visible) { - // Compute the distance between the mouse position when the tooltip was - // shown and the current mouse position. Pythagorean theorem. - var dx = Blockly.Tooltip.lastX_ - e.pageX; - var dy = Blockly.Tooltip.lastY_ - e.pageY; - if (Math.sqrt(dx * dx + dy * dy) > Blockly.Tooltip.RADIUS_OK) { - Blockly.Tooltip.hide(); - } - } else if (Blockly.Tooltip.poisonedElement_ != Blockly.Tooltip.element_) { - // The mouse moved, clear any previously scheduled tooltip. - clearTimeout(Blockly.Tooltip.showPid_); - // Maybe this time the mouse will stay put. Schedule showing of tooltip. - Blockly.Tooltip.lastX_ = e.pageX; - Blockly.Tooltip.lastY_ = e.pageY; - Blockly.Tooltip.showPid_ = - setTimeout(Blockly.Tooltip.show_, Blockly.Tooltip.HOVER_MS); - } -}; - -/** - * Hide the tooltip. - */ -Blockly.Tooltip.hide = function() { - if (Blockly.Tooltip.visible) { - Blockly.Tooltip.visible = false; - if (Blockly.Tooltip.DIV) { - Blockly.Tooltip.DIV.style.display = 'none'; - } - } - clearTimeout(Blockly.Tooltip.showPid_); -}; - -/** - * Create the tooltip and show it. - * @private - */ -Blockly.Tooltip.show_ = function() { - Blockly.Tooltip.poisonedElement_ = Blockly.Tooltip.element_; - if (!Blockly.Tooltip.DIV) { - return; - } - // Erase all existing text. - goog.dom.removeChildren(/** @type {!Element} */ (Blockly.Tooltip.DIV)); - // Get the new text. - var tip = Blockly.Tooltip.element_.tooltip; - if (goog.isFunction(tip)) { - tip = tip(); - } - tip = Blockly.Tooltip.wrap_(tip, Blockly.Tooltip.LIMIT); - // Create new text, line by line. - var lines = tip.split('\n'); - for (var i = 0; i < lines.length; i++) { - var div = document.createElement('div'); - div.appendChild(document.createTextNode(lines[i])); - Blockly.Tooltip.DIV.appendChild(div); - } - var rtl = Blockly.Tooltip.element_.RTL; - var windowSize = goog.dom.getViewportSize(); - // Display the tooltip. - Blockly.Tooltip.DIV.style.direction = rtl ? 'rtl' : 'ltr'; - Blockly.Tooltip.DIV.style.display = 'block'; - Blockly.Tooltip.visible = true; - // Move the tooltip to just below the cursor. - var anchorX = Blockly.Tooltip.lastX_; - if (rtl) { - anchorX -= Blockly.Tooltip.OFFSET_X + Blockly.Tooltip.DIV.offsetWidth; - } else { - anchorX += Blockly.Tooltip.OFFSET_X; - } - var anchorY = Blockly.Tooltip.lastY_ + Blockly.Tooltip.OFFSET_Y; - - if (anchorY + Blockly.Tooltip.DIV.offsetHeight > - windowSize.height + window.scrollY) { - // Falling off the bottom of the screen; shift the tooltip up. - anchorY -= Blockly.Tooltip.DIV.offsetHeight + 2 * Blockly.Tooltip.OFFSET_Y; - } - if (rtl) { - // Prevent falling off left edge in RTL mode. - anchorX = Math.max(Blockly.Tooltip.MARGINS - window.scrollX, anchorX); - } else { - if (anchorX + Blockly.Tooltip.DIV.offsetWidth > - windowSize.width + window.scrollX - 2 * Blockly.Tooltip.MARGINS) { - // Falling off the right edge of the screen; - // clamp the tooltip on the edge. - anchorX = windowSize.width - Blockly.Tooltip.DIV.offsetWidth - - 2 * Blockly.Tooltip.MARGINS; - } - } - Blockly.Tooltip.DIV.style.top = anchorY + 'px'; - Blockly.Tooltip.DIV.style.left = anchorX + 'px'; -}; - -/** - * Wrap text to the specified width. - * @param {string} text Text to wrap. - * @param {number} limit Width to wrap each line. - * @return {string} Wrapped text. - * @private - */ -Blockly.Tooltip.wrap_ = function(text, limit) { - if (text.length <= limit) { - // Short text, no need to wrap. - return text; - } - // Split the text into words. - var words = text.trim().split(/\s+/); - // Set limit to be the length of the largest word. - for (var i = 0; i < words.length; i++) { - if (words[i].length > limit) { - limit = words[i].length; - } - } - - var lastScore; - var score = -Infinity; - var lastText; - var lineCount = 1; - do { - lastScore = score; - lastText = text; - // Create a list of booleans representing if a space (false) or - // a break (true) appears after each word. - var wordBreaks = []; - // Seed the list with evenly spaced linebreaks. - var steps = words.length / lineCount; - var insertedBreaks = 1; - for (var i = 0; i < words.length - 1; i++) { - if (insertedBreaks < (i + 1.5) / steps) { - insertedBreaks++; - wordBreaks[i] = true; - } else { - wordBreaks[i] = false; - } - } - wordBreaks = Blockly.Tooltip.wrapMutate_(words, wordBreaks, limit); - score = Blockly.Tooltip.wrapScore_(words, wordBreaks, limit); - text = Blockly.Tooltip.wrapToText_(words, wordBreaks); - lineCount++; - } while (score > lastScore); - return lastText; -}; - -/** - * Compute a score for how good the wrapping is. - * @param {!Array.} words Array of each word. - * @param {!Array.} wordBreaks Array of line breaks. - * @param {number} limit Width to wrap each line. - * @return {number} Larger the better. - * @private - */ -Blockly.Tooltip.wrapScore_ = function(words, wordBreaks, limit) { - // If this function becomes a performance liability, add caching. - // Compute the length of each line. - var lineLengths = [0]; - var linePunctuation = []; - for (var i = 0; i < words.length; i++) { - lineLengths[lineLengths.length - 1] += words[i].length; - if (wordBreaks[i] === true) { - lineLengths.push(0); - linePunctuation.push(words[i].charAt(words[i].length - 1)); - } else if (wordBreaks[i] === false) { - lineLengths[lineLengths.length - 1]++; - } - } - var maxLength = Math.max.apply(Math, lineLengths); - - var score = 0; - for (var i = 0; i < lineLengths.length; i++) { - // Optimize for width. - // -2 points per char over limit (scaled to the power of 1.5). - score -= Math.pow(Math.abs(limit - lineLengths[i]), 1.5) * 2; - // Optimize for even lines. - // -1 point per char smaller than max (scaled to the power of 1.5). - score -= Math.pow(maxLength - lineLengths[i], 1.5); - // Optimize for structure. - // Add score to line endings after punctuation. - if ('.?!'.indexOf(linePunctuation[i]) != -1) { - score += limit / 3; - } else if (',;)]}'.indexOf(linePunctuation[i]) != -1) { - score += limit / 4; - } - } - // All else being equal, the last line should not be longer than the - // previous line. For example, this looks wrong: - // aaa bbb - // ccc ddd eee - if (lineLengths.length > 1 && lineLengths[lineLengths.length - 1] <= - lineLengths[lineLengths.length - 2]) { - score += 0.5; - } - return score; -}; - -/** - * Mutate the array of line break locations until an optimal solution is found. - * No line breaks are added or deleted, they are simply moved around. - * @param {!Array.} words Array of each word. - * @param {!Array.} wordBreaks Array of line breaks. - * @param {number} limit Width to wrap each line. - * @return {!Array.} New array of optimal line breaks. - * @private - */ -Blockly.Tooltip.wrapMutate_ = function(words, wordBreaks, limit) { - var bestScore = Blockly.Tooltip.wrapScore_(words, wordBreaks, limit); - var bestBreaks; - // Try shifting every line break forward or backward. - for (var i = 0; i < wordBreaks.length - 1; i++) { - if (wordBreaks[i] == wordBreaks[i + 1]) { - continue; - } - var mutatedWordBreaks = [].concat(wordBreaks); - mutatedWordBreaks[i] = !mutatedWordBreaks[i]; - mutatedWordBreaks[i + 1] = !mutatedWordBreaks[i + 1]; - var mutatedScore = - Blockly.Tooltip.wrapScore_(words, mutatedWordBreaks, limit); - if (mutatedScore > bestScore) { - bestScore = mutatedScore; - bestBreaks = mutatedWordBreaks; - } - } - if (bestBreaks) { - // Found an improvement. See if it may be improved further. - return Blockly.Tooltip.wrapMutate_(words, bestBreaks, limit); - } - // No improvements found. Done. - return wordBreaks; -}; - -/** - * Reassemble the array of words into text, with the specified line breaks. - * @param {!Array.} words Array of each word. - * @param {!Array.} wordBreaks Array of line breaks. - * @return {string} Plain text. - * @private - */ -Blockly.Tooltip.wrapToText_ = function(words, wordBreaks) { - var text = []; - for (var i = 0; i < words.length; i++) { - text.push(words[i]); - if (wordBreaks[i] !== undefined) { - text.push(wordBreaks[i] ? '\n' : ' '); - } - } - return text.join(''); -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/utils.js b/src/opsoro/apps/visual_programming/static/blockly/core/utils.js deleted file mode 100644 index d02ca16..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/utils.js +++ /dev/null @@ -1,553 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Utility methods. - * These methods are not specific to Blockly, and could be factored out into - * a JavaScript framework such as Closure. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.utils'); - -goog.require('goog.dom'); -goog.require('goog.events.BrowserFeature'); -goog.require('goog.math.Coordinate'); -goog.require('goog.userAgent'); - - -/** - * Add a CSS class to a element. - * Similar to Closure's goog.dom.classes.add, except it handles SVG elements. - * @param {!Element} element DOM element to add class to. - * @param {string} className Name of class to add. - * @private - */ -Blockly.addClass_ = function(element, className) { - var classes = element.getAttribute('class') || ''; - if ((' ' + classes + ' ').indexOf(' ' + className + ' ') == -1) { - if (classes) { - classes += ' '; - } - element.setAttribute('class', classes + className); - } -}; - -/** - * Remove a CSS class from a element. - * Similar to Closure's goog.dom.classes.remove, except it handles SVG elements. - * @param {!Element} element DOM element to remove class from. - * @param {string} className Name of class to remove. - * @private - */ -Blockly.removeClass_ = function(element, className) { - var classes = element.getAttribute('class'); - if ((' ' + classes + ' ').indexOf(' ' + className + ' ') != -1) { - var classList = classes.split(/\s+/); - for (var i = 0; i < classList.length; i++) { - if (!classList[i] || classList[i] == className) { - classList.splice(i, 1); - i--; - } - } - if (classList.length) { - element.setAttribute('class', classList.join(' ')); - } else { - element.removeAttribute('class'); - } - } -}; - -/** - * Checks if an element has the specified CSS class. - * Similar to Closure's goog.dom.classes.has, except it handles SVG elements. - * @param {!Element} element DOM element to check. - * @param {string} className Name of class to check. - * @return {boolean} True if class exists, false otherwise. - * @private - */ -Blockly.hasClass_ = function(element, className) { - var classes = element.getAttribute('class'); - return (' ' + classes + ' ').indexOf(' ' + className + ' ') != -1; -}; - -/** - * Bind an event to a function call. - * @param {!Node} node Node upon which to listen. - * @param {string} name Event name to listen to (e.g. 'mousedown'). - * @param {Object} thisObject The value of 'this' in the function. - * @param {!Function} func Function to call when event is triggered. - * @return {!Array.} Opaque data that can be passed to unbindEvent_. - * @private - */ -Blockly.bindEvent_ = function(node, name, thisObject, func) { - if (thisObject) { - var wrapFunc = function(e) { - func.call(thisObject, e); - }; - } else { - var wrapFunc = func; - } - node.addEventListener(name, wrapFunc, false); - var bindData = [[node, name, wrapFunc]]; - // Add equivalent touch event. - if (name in Blockly.bindEvent_.TOUCH_MAP) { - wrapFunc = function(e) { - // Punt on multitouch events. - if (e.changedTouches.length == 1) { - // Map the touch event's properties to the event. - var touchPoint = e.changedTouches[0]; - e.clientX = touchPoint.clientX; - e.clientY = touchPoint.clientY; - } - func.call(thisObject, e); - // Stop the browser from scrolling/zooming the page. - e.preventDefault(); - }; - for (var i = 0, eventName; - eventName = Blockly.bindEvent_.TOUCH_MAP[name][i]; i++) { - node.addEventListener(eventName, wrapFunc, false); - bindData.push([node, eventName, wrapFunc]); - } - } - return bindData; -}; - -/** - * The TOUCH_MAP lookup dictionary specifies additional touch events to fire, - * in conjunction with mouse events. - * @type {Object} - */ -Blockly.bindEvent_.TOUCH_MAP = {}; -if (goog.events.BrowserFeature.TOUCH_ENABLED) { - Blockly.bindEvent_.TOUCH_MAP = { - 'mousedown': ['touchstart'], - 'mousemove': ['touchmove'], - 'mouseup': ['touchend', 'touchcancel'] - }; -} - -/** - * Unbind one or more events event from a function call. - * @param {!Array.} bindData Opaque data from bindEvent_. This list is - * emptied during the course of calling this function. - * @return {!Function} The function call. - * @private - */ -Blockly.unbindEvent_ = function(bindData) { - while (bindData.length) { - var bindDatum = bindData.pop(); - var node = bindDatum[0]; - var name = bindDatum[1]; - var func = bindDatum[2]; - node.removeEventListener(name, func, false); - } - return func; -}; - -/** - * Fire a synthetic event synchronously. - * @param {!EventTarget} node The event's target node. - * @param {string} eventName Name of event (e.g. 'click'). - */ -Blockly.fireUiEventNow = function(node, eventName) { - // Remove the event from the anti-duplicate database. - var list = Blockly.fireUiEvent.DB_[eventName]; - if (list) { - var i = list.indexOf(node); - if (i != -1) { - list.splice(i, 1); - } - } - // Fire the event in a browser-compatible way. - if (document.createEvent) { - // W3 - var evt = document.createEvent('UIEvents'); - evt.initEvent(eventName, true, true); // event type, bubbling, cancelable - node.dispatchEvent(evt); - } else if (document.createEventObject) { - // MSIE - var evt = document.createEventObject(); - node.fireEvent('on' + eventName, evt); - } else { - throw 'FireEvent: No event creation mechanism.'; - } -}; - -/** - * Fire a synthetic event asynchronously. Groups of simultaneous events (e.g. - * a tree of blocks being deleted) are merged into one event. - * @param {!EventTarget} node The event's target node. - * @param {string} eventName Name of event (e.g. 'click'). - */ -Blockly.fireUiEvent = function(node, eventName) { - var list = Blockly.fireUiEvent.DB_[eventName]; - if (list) { - if (list.indexOf(node) != -1) { - // This event is already scheduled to fire. - return; - } - list.push(node); - } else { - Blockly.fireUiEvent.DB_[eventName] = [node]; - } - var fire = function() { - Blockly.fireUiEventNow(node, eventName); - }; - setTimeout(fire, 0); -}; - -/** - * Database of upcoming firing event types. - * Used to fire only one event after multiple changes. - * @type {!Object} - * @private - */ -Blockly.fireUiEvent.DB_ = {}; - -/** - * Don't do anything for this event, just halt propagation. - * @param {!Event} e An event. - */ -Blockly.noEvent = function(e) { - // This event has been handled. No need to bubble up to the document. - e.preventDefault(); - e.stopPropagation(); -}; - -/** - * Is this event targeting a text input widget? - * @param {!Event} e An event. - * @return {boolean} True if text input. - * @private - */ -Blockly.isTargetInput_ = function(e) { - return e.target.type == 'textarea' || e.target.type == 'text' || - e.target.type == 'number' || e.target.type == 'email' || - e.target.type == 'password' || e.target.type == 'search' || - e.target.type == 'tel' || e.target.type == 'url' || - e.target.isContentEditable; -}; - -/** - * Return the coordinates of the top-left corner of this element relative to - * its parent. Only for SVG elements and children (e.g. rect, g, path). - * @param {!Element} element SVG element to find the coordinates of. - * @return {!goog.math.Coordinate} Object with .x and .y properties. - * @private - */ -Blockly.getRelativeXY_ = function(element) { - var xy = new goog.math.Coordinate(0, 0); - // First, check for x and y attributes. - var x = element.getAttribute('x'); - if (x) { - xy.x = parseInt(x, 10); - } - var y = element.getAttribute('y'); - if (y) { - xy.y = parseInt(y, 10); - } - // Second, check for transform="translate(...)" attribute. - var transform = element.getAttribute('transform'); - var r = transform && transform.match(Blockly.getRelativeXY_.XY_REGEXP_); - if (r) { - xy.x += parseFloat(r[1]); - if (r[3]) { - xy.y += parseFloat(r[3]); - } - } - return xy; -}; - -/** - * Static regex to pull the x,y values out of an SVG translate() directive. - * Note that Firefox and IE (9,10) return 'translate(12)' instead of - * 'translate(12, 0)'. - * Note that IE (9,10) returns 'translate(16 8)' instead of 'translate(16, 8)'. - * Note that IE has been reported to return scientific notation (0.123456e-42). - * @type {!RegExp} - * @private - */ -Blockly.getRelativeXY_.XY_REGEXP_ = - /translate\(\s*([-+\d.e]+)([ ,]\s*([-+\d.e]+)\s*\))?/; - -/** - * Return the absolute coordinates of the top-left corner of this element, - * scales that after canvas SVG element, if it's a descendant. - * The origin (0,0) is the top-left corner of the Blockly SVG. - * @param {!Element} element Element to find the coordinates of. - * @param {!Blockly.Workspace} workspace Element must be in this workspace. - * @return {!goog.math.Coordinate} Object with .x and .y properties. - * @private - */ -Blockly.getSvgXY_ = function(element, workspace) { - var x = 0; - var y = 0; - var scale = 1; - if (goog.dom.contains(workspace.getCanvas(), element) || - goog.dom.contains(workspace.getBubbleCanvas(), element)) { - // Before the SVG canvas, scale the coordinates. - scale = workspace.scale; - } - do { - // Loop through this block and every parent. - var xy = Blockly.getRelativeXY_(element); - if (element == workspace.getCanvas() || - element == workspace.getBubbleCanvas()) { - // After the SVG canvas, don't scale the coordinates. - scale = 1; - } - x += xy.x * scale; - y += xy.y * scale; - element = element.parentNode; - } while (element && element != workspace.options.svg); - return new goog.math.Coordinate(x, y); -}; - -/** - * Helper method for creating SVG elements. - * @param {string} name Element's tag name. - * @param {!Object} attrs Dictionary of attribute names and values. - * @param {Element} parent Optional parent on which to append the element. - * @param {Blockly.Workspace=} opt_workspace Optional workspace for access to - * context (scale...). - * @return {!SVGElement} Newly created SVG element. - */ -Blockly.createSvgElement = function(name, attrs, parent, opt_workspace) { - var e = /** @type {!SVGElement} */ ( - document.createElementNS(Blockly.SVG_NS, name)); - for (var key in attrs) { - e.setAttribute(key, attrs[key]); - } - // IE defines a unique attribute "runtimeStyle", it is NOT applied to - // elements created with createElementNS. However, Closure checks for IE - // and assumes the presence of the attribute and crashes. - if (document.body.runtimeStyle) { // Indicates presence of IE-only attr. - e.runtimeStyle = e.currentStyle = e.style; - } - if (parent) { - parent.appendChild(e); - } - return e; -}; - -/** - * Deselect any selections on the webpage. - * Chrome will select text outside the SVG when double-clicking. - * Deselect this text, so that it doesn't mess up any subsequent drag. - */ -Blockly.removeAllRanges = function() { - if (window.getSelection) { - setTimeout(function() { - try { - var selection = window.getSelection(); - if (!selection.isCollapsed) { - selection.removeAllRanges(); - } - } catch (e) { - // MSIE throws 'error 800a025e' here. - } - }, 0); - } -}; - -/** - * Is this event a right-click? - * @param {!Event} e Mouse event. - * @return {boolean} True if right-click. - */ -Blockly.isRightButton = function(e) { - if (e.ctrlKey && goog.userAgent.MAC) { - // Control-clicking on Mac OS X is treated as a right-click. - // WebKit on Mac OS X fails to change button to 2 (but Gecko does). - return true; - } - return e.button == 2; -}; - -/** - * Return the converted coordinates of the given mouse event. - * The origin (0,0) is the top-left corner of the Blockly svg. - * @param {!Event} e Mouse event. - * @param {!Element} svg SVG element. - * @return {!Object} Object with .x and .y properties. - */ -Blockly.mouseToSvg = function(e, svg) { - var svgPoint = svg.createSVGPoint(); - svgPoint.x = e.clientX; - svgPoint.y = e.clientY; - var matrix = svg.getScreenCTM(); - matrix = matrix.inverse(); - return svgPoint.matrixTransform(matrix); -}; - -/** - * Given an array of strings, return the length of the shortest one. - * @param {!Array.} array Array of strings. - * @return {number} Length of shortest string. - */ -Blockly.shortestStringLength = function(array) { - if (!array.length) { - return 0; - } - var len = array[0].length; - for (var i = 1; i < array.length; i++) { - len = Math.min(len, array[i].length); - } - return len; -}; - -/** - * Given an array of strings, return the length of the common prefix. - * Words may not be split. Any space after a word is included in the length. - * @param {!Array.} array Array of strings. - * @param {number=} opt_shortest Length of shortest string. - * @return {number} Length of common prefix. - */ -Blockly.commonWordPrefix = function(array, opt_shortest) { - if (!array.length) { - return 0; - } else if (array.length == 1) { - return array[0].length; - } - var wordPrefix = 0; - var max = opt_shortest || Blockly.shortestStringLength(array); - for (var len = 0; len < max; len++) { - var letter = array[0][len]; - for (var i = 1; i < array.length; i++) { - if (letter != array[i][len]) { - return wordPrefix; - } - } - if (letter == ' ') { - wordPrefix = len + 1; - } - } - for (var i = 1; i < array.length; i++) { - var letter = array[i][len]; - if (letter && letter != ' ') { - return wordPrefix; - } - } - return max; -}; - -/** - * Given an array of strings, return the length of the common suffix. - * Words may not be split. Any space after a word is included in the length. - * @param {!Array.} array Array of strings. - * @param {number=} opt_shortest Length of shortest string. - * @return {number} Length of common suffix. - */ -Blockly.commonWordSuffix = function(array, opt_shortest) { - if (!array.length) { - return 0; - } else if (array.length == 1) { - return array[0].length; - } - var wordPrefix = 0; - var max = opt_shortest || Blockly.shortestStringLength(array); - for (var len = 0; len < max; len++) { - var letter = array[0].substr(-len - 1, 1); - for (var i = 1; i < array.length; i++) { - if (letter != array[i].substr(-len - 1, 1)) { - return wordPrefix; - } - } - if (letter == ' ') { - wordPrefix = len + 1; - } - } - for (var i = 1; i < array.length; i++) { - var letter = array[i].charAt(array[i].length - len - 1); - if (letter && letter != ' ') { - return wordPrefix; - } - } - return max; -}; - -/** - * Is the given string a number (includes negative and decimals). - * @param {string} str Input string. - * @return {boolean} True if number, false otherwise. - */ -Blockly.isNumber = function(str) { - return !!str.match(/^\s*-?\d+(\.\d+)?\s*$/); -}; - -/** - * Parse a string with any number of interpolation tokens (%1, %2, ...). - * '%' characters may be self-escaped (%%). - * @param {string} message Text containing interpolation tokens. - * @return {!Array.} Array of strings and numbers. - */ -Blockly.tokenizeInterpolation = function(message) { - var tokens = []; - var chars = message.split(''); - chars.push(''); // End marker. - // Parse the message with a finite state machine. - // 0 - Base case. - // 1 - % found. - // 2 - Digit found. - var state = 0; - var buffer = []; - var number = null; - for (var i = 0; i < chars.length; i++) { - var c = chars[i]; - if (state == 0) { - if (c == '%') { - state = 1; // Start escape. - } else { - buffer.push(c); // Regular char. - } - } else if (state == 1) { - if (c == '%') { - buffer.push(c); // Escaped %: %% - state = 0; - } else if ('0' <= c && c <= '9') { - state = 2; - number = c; - var text = buffer.join(''); - if (text) { - tokens.push(text); - } - buffer.length = 0; - } else { - buffer.push('%', c); // Not an escape: %a - state = 0; - } - } else if (state == 2) { - if ('0' <= c && c <= '9') { - number += c; // Multi-digit number. - } else { - tokens.push(parseInt(number, 10)); - i--; // Parse this char again. - state = 0; - } - } - } - var text = buffer.join(''); - if (text) { - tokens.push(text); - } - return tokens; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/variables.js b/src/opsoro/apps/visual_programming/static/blockly/core/variables.js deleted file mode 100644 index 4d5a695..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/variables.js +++ /dev/null @@ -1,182 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Utility functions for handling variables. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Variables'); - -// TODO(scr): Fix circular dependencies -// goog.require('Blockly.Block'); -goog.require('Blockly.Workspace'); -goog.require('goog.string'); - - -/** - * Category to separate variable names from procedures and generated functions. - */ -Blockly.Variables.NAME_TYPE = 'VARIABLE'; - -/** - * Find all user-created variables. - * @param {!Blockly.Block|!Blockly.Workspace} root Root block or workspace. - * @return {!Array.} Array of variable names. - */ -Blockly.Variables.allVariables = function(root) { - var blocks; - if (root.getDescendants) { - // Root is Block. - blocks = root.getDescendants(); - } else if (root.getAllBlocks) { - // Root is Workspace. - blocks = root.getAllBlocks(); - } else { - throw 'Not Block or Workspace: ' + root; - } - var variableHash = Object.create(null); - // Iterate through every block and add each variable to the hash. - for (var x = 0; x < blocks.length; x++) { - if (blocks[x].getVars) { - var blockVariables = blocks[x].getVars(); - for (var y = 0; y < blockVariables.length; y++) { - var varName = blockVariables[y]; - // Variable name may be null if the block is only half-built. - if (varName) { - variableHash[varName.toLowerCase()] = varName; - } - } - } - } - // Flatten the hash into a list. - var variableList = []; - for (var name in variableHash) { - variableList.push(variableHash[name]); - } - return variableList; -}; - -/** - * Find all instances of the specified variable and rename them. - * @param {string} oldName Variable to rename. - * @param {string} newName New variable name. - * @param {!Blockly.Workspace} workspace Workspace rename variables in. - */ -Blockly.Variables.renameVariable = function(oldName, newName, workspace) { - var blocks = workspace.getAllBlocks(); - // Iterate through every block. - for (var i = 0; i < blocks.length; i++) { - if (blocks[i].renameVar) { - blocks[i].renameVar(oldName, newName); - } - } -}; - -/** - * Construct the blocks required by the flyout for the variable category. - * @param {!Array.} blocks List of blocks to show. - * @param {!Array.} gaps List of widths between blocks. - * @param {number} margin Standard margin width for calculating gaps. - * @param {!Blockly.Workspace} workspace The flyout's workspace. - */ -Blockly.Variables.flyoutCategory = function(blocks, gaps, margin, workspace) { - var variableList = Blockly.Variables.allVariables(workspace.targetWorkspace); - variableList.sort(goog.string.caseInsensitiveCompare); - // In addition to the user's variables, we also want to display the default - // variable name at the top. We also don't want this duplicated if the - // user has created a variable of the same name. - variableList.unshift(null); - var defaultVariable = undefined; - for (var i = 0; i < variableList.length; i++) { - if (variableList[i] === defaultVariable) { - continue; - } - var getBlock = Blockly.Blocks['variables_get'] ? - Blockly.Block.obtain(workspace, 'variables_get') : null; - getBlock && getBlock.initSvg(); - var setBlock = Blockly.Blocks['variables_set'] ? - Blockly.Block.obtain(workspace, 'variables_set') : null; - setBlock && setBlock.initSvg(); - if (variableList[i] === null) { - defaultVariable = (getBlock || setBlock).getVars()[0]; - } else { - getBlock && getBlock.setFieldValue(variableList[i], 'VAR'); - setBlock && setBlock.setFieldValue(variableList[i], 'VAR'); - } - setBlock && blocks.push(setBlock); - getBlock && blocks.push(getBlock); - if (getBlock && setBlock) { - gaps.push(margin, margin * 3); - } else { - gaps.push(margin * 2); - } - } -}; - -/** -* Return a new variable name that is not yet being used. This will try to -* generate single letter variable names in the range 'i' to 'z' to start with. -* If no unique name is located it will try 'i' to 'z', 'a' to 'h', -* then 'i2' to 'z2' etc. Skip 'l'. - * @param {!Blockly.Workspace} workspace The workspace to be unique in. -* @return {string} New variable name. -*/ -Blockly.Variables.generateUniqueName = function(workspace) { - var variableList = Blockly.Variables.allVariables(workspace); - var newName = ''; - if (variableList.length) { - var nameSuffix = 1; - var letters = 'ijkmnopqrstuvwxyzabcdefgh'; // No 'l'. - var letterIndex = 0; - var potName = letters.charAt(letterIndex); - while (!newName) { - var inUse = false; - for (var i = 0; i < variableList.length; i++) { - if (variableList[i].toLowerCase() == potName) { - // This potential name is already used. - inUse = true; - break; - } - } - if (inUse) { - // Try the next potential name. - letterIndex++; - if (letterIndex == letters.length) { - // Reached the end of the character sequence so back to 'i'. - // a new suffix. - letterIndex = 0; - nameSuffix++; - } - potName = letters.charAt(letterIndex); - if (nameSuffix > 1) { - potName += nameSuffix; - } - } else { - // We can use the current potential name. - newName = potName; - } - } - } else { - newName = 'i'; - } - return newName; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/workspace.js b/src/opsoro/apps/visual_programming/static/blockly/core/workspace.js deleted file mode 100644 index bd62251..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/workspace.js +++ /dev/null @@ -1,187 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Object representing a workspace. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Workspace'); - -goog.require('goog.math'); - - -/** - * Class for a workspace. This is a data structure that contains blocks. - * There is no UI, and can be created headlessly. - * @param {Object=} opt_options Dictionary of options. - * @constructor - */ -Blockly.Workspace = function(opt_options) { - /** @type {!Object} */ - this.options = opt_options || {}; - /** @type {boolean} */ - this.RTL = !!this.options.RTL; - /** @type {!Array.} */ - this.topBlocks_ = []; -}; - -/** - * Workspaces may be headless. - * @type {boolean} True if visible. False if headless. - */ -Blockly.Workspace.prototype.rendered = false; - -/** - * Dispose of this workspace. - * Unlink from all DOM elements to prevent memory leaks. - */ -Blockly.Workspace.prototype.dispose = function() { - this.clear(); -}; - -/** - * Angle away from the horizontal to sweep for blocks. Order of execution is - * generally top to bottom, but a small angle changes the scan to give a bit of - * a left to right bias (reversed in RTL). Units are in degrees. - * See: http://tvtropes.org/pmwiki/pmwiki.php/Main/DiagonalBilling. - */ -Blockly.Workspace.SCAN_ANGLE = 3; - -/** - * Add a block to the list of top blocks. - * @param {!Blockly.Block} block Block to remove. - */ -Blockly.Workspace.prototype.addTopBlock = function(block) { - this.topBlocks_.push(block); - this.fireChangeEvent(); -}; - -/** - * Remove a block from the list of top blocks. - * @param {!Blockly.Block} block Block to remove. - */ -Blockly.Workspace.prototype.removeTopBlock = function(block) { - var found = false; - for (var child, i = 0; child = this.topBlocks_[i]; i++) { - if (child == block) { - this.topBlocks_.splice(i, 1); - found = true; - break; - } - } - if (!found) { - throw 'Block not present in workspace\'s list of top-most blocks.'; - } - this.fireChangeEvent(); -}; - -/** - * Finds the top-level blocks and returns them. Blocks are optionally sorted - * by position; top to bottom (with slight LTR or RTL bias). - * @param {boolean} ordered Sort the list if true. - * @return {!Array.} The top-level block objects. - */ -Blockly.Workspace.prototype.getTopBlocks = function(ordered) { - // Copy the topBlocks_ list. - var blocks = [].concat(this.topBlocks_); - if (ordered && blocks.length > 1) { - var offset = Math.sin(goog.math.toRadians(Blockly.Workspace.SCAN_ANGLE)); - if (this.RTL) { - offset *= -1; - } - blocks.sort(function(a, b) { - var aXY = a.getRelativeToSurfaceXY(); - var bXY = b.getRelativeToSurfaceXY(); - return (aXY.y + offset * aXY.x) - (bXY.y + offset * bXY.x); - }); - } - return blocks; -}; - -/** - * Find all blocks in workspace. No particular order. - * @return {!Array.} Array of blocks. - */ -Blockly.Workspace.prototype.getAllBlocks = function() { - var blocks = this.getTopBlocks(false); - for (var i = 0; i < blocks.length; i++) { - blocks.push.apply(blocks, blocks[i].getChildren()); - } - return blocks; -}; - -/** - * Dispose of all blocks in workspace. - */ -Blockly.Workspace.prototype.clear = function() { - while (this.topBlocks_.length) { - this.topBlocks_[0].dispose(); - } -}; - -/** - * Returns the horizontal offset of the workspace. - * Intended for LTR/RTL compatibility in XML. - * Not relevant for a headless workspace. - * @return {number} Width. - */ -Blockly.Workspace.prototype.getWidth = function() { - return 0; -}; - -/** - * Finds the block with the specified ID in this workspace. - * @param {string} id ID of block to find. - * @return {Blockly.Block} The matching block, or null if not found. - */ -Blockly.Workspace.prototype.getBlockById = function(id) { - // If this O(n) function fails to scale well, maintain a hash table of IDs. - var blocks = this.getAllBlocks(); - for (var i = 0, block; block = blocks[i]; i++) { - if (block.id == id) { - return block; - } - } - return null; -}; - -/** - * The number of blocks that may be added to the workspace before reaching - * the maxBlocks. - * @return {number} Number of blocks left. - */ -Blockly.Workspace.prototype.remainingCapacity = function() { - if (isNaN(this.options.maxBlocks)) { - return Infinity; - } - return this.options.maxBlocks - this.getAllBlocks().length; -}; - -/** - * Something on this workspace has changed. - */ -Blockly.Workspace.prototype.fireChangeEvent = function() { - // NOP. -}; - -// Export symbols that would otherwise be renamed by Closure compiler. -Blockly.Workspace.prototype['clear'] = Blockly.Workspace.prototype.clear; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/workspace_svg.js b/src/opsoro/apps/visual_programming/static/blockly/core/workspace_svg.js deleted file mode 100644 index e5fdbe5..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/workspace_svg.js +++ /dev/null @@ -1,1010 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2014 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Object representing a workspace rendered as SVG. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.WorkspaceSvg'); - -// TODO(scr): Fix circular dependencies -// goog.require('Blockly.Block'); -goog.require('Blockly.ScrollbarPair'); -goog.require('Blockly.Trashcan'); -goog.require('Blockly.ZoomControls'); -goog.require('Blockly.Workspace'); -goog.require('Blockly.Xml'); - -goog.require('goog.dom'); -goog.require('goog.math.Coordinate'); -goog.require('goog.userAgent'); - - -/** - * Class for a workspace. This is an onscreen area with optional trashcan, - * scrollbars, bubbles, and dragging. - * @param {!Object} options Dictionary of options. - * @extends {Blockly.Workspace} - * @constructor - */ -Blockly.WorkspaceSvg = function(options) { - Blockly.WorkspaceSvg.superClass_.constructor.call(this, options); - this.getMetrics = options.getMetrics; - this.setMetrics = options.setMetrics; - - Blockly.ConnectionDB.init(this); - - /** - * Database of pre-loaded sounds. - * @private - * @const - */ - this.SOUNDS_ = Object.create(null); - - /** - * Opaque data that can be passed to Blockly.unbindEvent_. - * @type {!Array.} - * @private - */ - this.eventWrappers_ = []; -}; -goog.inherits(Blockly.WorkspaceSvg, Blockly.Workspace); - -/** - * Svg workspaces are user-visible (as opposed to a headless workspace). - * @type {boolean} True if visible. False if headless. - */ -Blockly.WorkspaceSvg.prototype.rendered = true; - -/** - * Is this workspace the surface for a flyout? - * @type {boolean} - */ -Blockly.WorkspaceSvg.prototype.isFlyout = false; - -/** - * Is this workspace currently being dragged around? - * @type {boolean} - */ -Blockly.WorkspaceSvg.prototype.isScrolling = false; - -/** - * Current horizontal scrolling offset. - * @type {number} - */ -Blockly.WorkspaceSvg.prototype.scrollX = 0; - -/** - * Current vertical scrolling offset. - * @type {number} - */ -Blockly.WorkspaceSvg.prototype.scrollY = 0; - -/** - * Horizontal distance from mouse to object being dragged. - * @type {number} - * @private - */ -Blockly.WorkspaceSvg.prototype.dragDeltaX_ = 0; - -/** - * Vertical distance from mouse to object being dragged. - * @type {number} - * @private - */ -Blockly.WorkspaceSvg.prototype.dragDeltaY_ = 0; - -/** - * Current scale. - * @type {number} - */ -Blockly.WorkspaceSvg.prototype.scale = 1; - -/** - * The workspace's trashcan (if any). - * @type {Blockly.Trashcan} - */ -Blockly.WorkspaceSvg.prototype.trashcan = null; - -/** - * This workspace's scrollbars, if they exist. - * @type {Blockly.ScrollbarPair} - */ -Blockly.WorkspaceSvg.prototype.scrollbar = null; - -/** - * Create the workspace DOM elements. - * @param {string=} opt_backgroundClass Either 'blocklyMainBackground' or - * 'blocklyMutatorBackground'. - * @return {!Element} The workspace's SVG group. - */ -Blockly.WorkspaceSvg.prototype.createDom = function(opt_backgroundClass) { - /* - - - [Trashcan and/or flyout may go here] - - - [Scrollbars may go here] - - */ - this.svgGroup_ = Blockly.createSvgElement('g', - {'class': 'blocklyWorkspace'}, null); - if (opt_backgroundClass) { - this.svgBackground_ = Blockly.createSvgElement('rect', - {'height': '100%', 'width': '100%', - 'class': opt_backgroundClass}, this.svgGroup_); - if (opt_backgroundClass == 'blocklyMainBackground') { - this.svgBackground_.style.fill = - 'url(#' + this.options.gridPattern.id + ')'; - } - } - this.svgBlockCanvas_ = Blockly.createSvgElement('g', - {'class': 'blocklyBlockCanvas'}, this.svgGroup_, this); - this.svgBubbleCanvas_ = Blockly.createSvgElement('g', - {'class': 'blocklyBubbleCanvas'}, this.svgGroup_, this); - var bottom = Blockly.Scrollbar.scrollbarThickness; - if (this.options.hasTrashcan) { - bottom = this.addTrashcan_(bottom); - } - if (this.options.zoomOptions && this.options.zoomOptions.controls) { - bottom = this.addZoomControls_(bottom); - } - Blockly.bindEvent_(this.svgGroup_, 'mousedown', this, this.onMouseDown_); - var thisWorkspace = this; - Blockly.bindEvent_(this.svgGroup_, 'touchstart', null, - function(e) {Blockly.longStart_(e, thisWorkspace);}); - if (this.options.zoomOptions && this.options.zoomOptions.wheel) { - // Mouse-wheel. - Blockly.bindEvent_(this.svgGroup_, 'wheel', this, this.onMouseWheel_); - } - - // Determine if there needs to be a category tree, or a simple list of - // blocks. This cannot be changed later, since the UI is very different. - if (this.options.hasCategories) { - this.toolbox_ = new Blockly.Toolbox(this); - } else if (this.options.languageTree) { - this.addFlyout_(); - } - this.updateGridPattern_(); - return this.svgGroup_; -}; - -/** - * Dispose of this workspace. - * Unlink from all DOM elements to prevent memory leaks. - */ -Blockly.WorkspaceSvg.prototype.dispose = function() { - // Stop rerendering. - this.rendered = false; - Blockly.unbindEvent_(this.eventWrappers_); - Blockly.WorkspaceSvg.superClass_.dispose.call(this); - if (this.svgGroup_) { - goog.dom.removeNode(this.svgGroup_); - this.svgGroup_ = null; - } - this.svgBlockCanvas_ = null; - this.svgBubbleCanvas_ = null; - if (this.toolbox_) { - this.toolbox_.dispose(); - this.toolbox_ = null; - } - if (this.flyout_) { - this.flyout_.dispose(); - this.flyout_ = null; - } - if (this.trashcan) { - this.trashcan.dispose(); - this.trashcan = null; - } - if (this.scrollbar) { - this.scrollbar.dispose(); - this.scrollbar = null; - } - if (this.zoomControls_) { - this.zoomControls_.dispose(); - this.zoomControls_ = null; - } - if (!this.options.parentWorkspace) { - // Top-most workspace. Dispose of the SVG too. - goog.dom.removeNode(this.options.svg); - } -}; - -/** - * Add a trashcan. - * @param {number} bottom Distance from workspace bottom to bottom of trashcan. - * @return {number} Distance from workspace bottom to the top of trashcan. - * @private - */ -Blockly.WorkspaceSvg.prototype.addTrashcan_ = function(bottom) { - /** @type {Blockly.Trashcan} */ - this.trashcan = new Blockly.Trashcan(this); - var svgTrashcan = this.trashcan.createDom(); - this.svgGroup_.insertBefore(svgTrashcan, this.svgBlockCanvas_); - return this.trashcan.init(bottom); -}; - -/** - * Add zoom controls. - * @param {number} bottom Distance from workspace bottom to bottom of controls. - * @return {number} Distance from workspace bottom to the top of controls. - * @private - */ -Blockly.WorkspaceSvg.prototype.addZoomControls_ = function(bottom) { - /** @type {Blockly.ZoomControls} */ - this.zoomControls_ = new Blockly.ZoomControls(this); - var svgZoomControls = this.zoomControls_.createDom(); - this.svgGroup_.appendChild(svgZoomControls); - return this.zoomControls_.init(bottom); -}; - -/** - * Add a flyout. - * @private - */ -Blockly.WorkspaceSvg.prototype.addFlyout_ = function() { - var workspaceOptions = { - parentWorkspace: this, - RTL: this.RTL - }; - /** @type {Blockly.Flyout} */ - this.flyout_ = new Blockly.Flyout(workspaceOptions); - this.flyout_.autoClose = false; - var svgFlyout = this.flyout_.createDom(); - this.svgGroup_.insertBefore(svgFlyout, this.svgBlockCanvas_); -}; - -/** - * Resize this workspace and its containing objects. - */ -Blockly.WorkspaceSvg.prototype.resize = function() { - if (this.toolbox_) { - this.toolbox_.position(); - } - if (this.flyout_) { - this.flyout_.position(); - } - if (this.trashcan) { - this.trashcan.position(); - } - if (this.zoomControls_) { - this.zoomControls_.position(); - } - if (this.scrollbar) { - this.scrollbar.resize(); - } -}; - -/** - * Get the SVG element that forms the drawing surface. - * @return {!Element} SVG element. - */ -Blockly.WorkspaceSvg.prototype.getCanvas = function() { - return this.svgBlockCanvas_; -}; - -/** - * Get the SVG element that forms the bubble surface. - * @return {!SVGGElement} SVG element. - */ -Blockly.WorkspaceSvg.prototype.getBubbleCanvas = function() { - return this.svgBubbleCanvas_; -}; - -/** - * Translate this workspace to new coordinates. - * @param {number} x Horizontal translation. - * @param {number} y Vertical translation. - */ -Blockly.WorkspaceSvg.prototype.translate = function(x, y) { - var translation = 'translate(' + x + ',' + y + ')' + - 'scale(' + this.scale + ')'; - this.svgBlockCanvas_.setAttribute('transform', translation); - this.svgBubbleCanvas_.setAttribute('transform', translation); -}; - -/** - * Add a block to the list of top blocks. - * @param {!Blockly.Block} block Block to remove. - */ -Blockly.WorkspaceSvg.prototype.addTopBlock = function(block) { - Blockly.WorkspaceSvg.superClass_.addTopBlock.call(this, block); - if (Blockly.Realtime.isEnabled() && !this.options.parentWorkspace) { - Blockly.Realtime.addTopBlock(block); - } -}; - -/** - * Remove a block from the list of top blocks. - * @param {!Blockly.Block} block Block to remove. - */ -Blockly.WorkspaceSvg.prototype.removeTopBlock = function(block) { - Blockly.WorkspaceSvg.superClass_.removeTopBlock.call(this, block); - if (Blockly.Realtime.isEnabled() && !this.options.parentWorkspace) { - Blockly.Realtime.removeTopBlock(block); - } -}; - -/** - * Returns the horizontal offset of the workspace. - * Intended for LTR/RTL compatibility in XML. - * @return {number} Width. - */ -Blockly.WorkspaceSvg.prototype.getWidth = function() { - return this.getMetrics().viewWidth; -}; - -/** - * Toggles the visibility of the workspace. - * Currently only intended for main workspace. - * @param {boolean} isVisible True if workspace should be visible. - */ -Blockly.WorkspaceSvg.prototype.setVisible = function(isVisible) { - this.options.svg.style.display = isVisible ? 'block' : 'none'; - if (this.toolbox_) { - // Currently does not support toolboxes in mutators. - this.toolbox_.HtmlDiv.style.display = isVisible ? 'block' : 'none'; - } - if (isVisible) { - this.render(); - if (this.toolbox_) { - this.toolbox_.position(); - } - } else { - Blockly.hideChaff(true); - } -}; - -/** - * Render all blocks in workspace. - */ -Blockly.WorkspaceSvg.prototype.render = function() { - var renderList = this.getAllBlocks(); - for (var i = 0, block; block = renderList[i]; i++) { - if (!block.getChildren().length) { - block.render(); - } - } -}; - -/** - * Turn the visual trace functionality on or off. - * @param {boolean} armed True if the trace should be on. - */ -Blockly.WorkspaceSvg.prototype.traceOn = function(armed) { - this.traceOn_ = armed; - if (this.traceWrapper_) { - Blockly.unbindEvent_(this.traceWrapper_); - this.traceWrapper_ = null; - } - if (armed) { - this.traceWrapper_ = Blockly.bindEvent_(this.svgBlockCanvas_, - 'blocklySelectChange', this, function() {this.traceOn_ = false}); - } -}; - -/** - * Highlight a block in the workspace. - * @param {?string} id ID of block to find. - */ -Blockly.WorkspaceSvg.prototype.highlightBlock = function(id) { - if (this.traceOn_ && Blockly.dragMode_ != 0) { - // The blocklySelectChange event normally prevents this, but sometimes - // there is a race condition on fast-executing apps. - this.traceOn(false); - } - if (!this.traceOn_) { - return; - } - var block = null; - if (id) { - block = this.getBlockById(id); - if (!block) { - return; - } - } - // Temporary turn off the listener for selection changes, so that we don't - // trip the monitor for detecting user activity. - this.traceOn(false); - // Select the current block. - if (block) { - block.select(); - } else if (Blockly.selected) { - Blockly.selected.unselect(); - } - // Restore the monitor for user activity after the selection event has fired. - var thisWorkspace = this; - setTimeout(function() {thisWorkspace.traceOn(true);}, 1); -}; - -/** - * Fire a change event for this workspace. Changes include new block, dropdown - * edits, mutations, connections, etc. Groups of simultaneous changes (e.g. - * a tree of blocks being deleted) are merged into one event. - * Applications may hook workspace changes by listening for - * 'blocklyWorkspaceChange' on workspace.getCanvas(). - */ -Blockly.WorkspaceSvg.prototype.fireChangeEvent = function() { - if (this.rendered && this.svgBlockCanvas_) { - Blockly.fireUiEvent(this.svgBlockCanvas_, 'blocklyWorkspaceChange'); - } -}; - -/** - * Paste the provided block onto the workspace. - * @param {!Element} xmlBlock XML block element. - */ -Blockly.WorkspaceSvg.prototype.paste = function(xmlBlock) { - if (!this.rendered || xmlBlock.getElementsByTagName('block').length >= - this.remainingCapacity()) { - return; - } - Blockly.terminateDrag_(); // Dragging while pasting? No. - var block = Blockly.Xml.domToBlock(this, xmlBlock); - // Move the duplicate to original position. - var blockX = parseInt(xmlBlock.getAttribute('x'), 10); - var blockY = parseInt(xmlBlock.getAttribute('y'), 10); - if (!isNaN(blockX) && !isNaN(blockY)) { - if (this.RTL) { - blockX = -blockX; - } - // Offset block until not clobbering another block and not in connection - // distance with neighbouring blocks. - do { - var collide = false; - var allBlocks = this.getAllBlocks(); - for (var i = 0, otherBlock; otherBlock = allBlocks[i]; i++) { - var otherXY = otherBlock.getRelativeToSurfaceXY(); - if (Math.abs(blockX - otherXY.x) <= 1 && - Math.abs(blockY - otherXY.y) <= 1) { - collide = true; - break; - } - } - if (!collide) { - // Check for blocks in snap range to any of its connections. - var connections = block.getConnections_(false); - for (var i = 0, connection; connection = connections[i]; i++) { - var neighbour = - connection.closest(Blockly.SNAP_RADIUS, blockX, blockY); - if (neighbour.connection) { - collide = true; - break; - } - } - } - if (collide) { - if (this.RTL) { - blockX -= Blockly.SNAP_RADIUS; - } else { - blockX += Blockly.SNAP_RADIUS; - } - blockY += Blockly.SNAP_RADIUS * 2; - } - } while (collide); - block.moveBy(blockX, blockY); - } - block.select(); -}; - -/** - * Make a list of all the delete areas for this workspace. - */ -Blockly.WorkspaceSvg.prototype.recordDeleteAreas = function() { - if (this.trashcan) { - this.deleteAreaTrash_ = this.trashcan.getRect(); - } else { - this.deleteAreaTrash_ = null; - } - if (this.flyout_) { - this.deleteAreaToolbox_ = this.flyout_.getRect(); - } else if (this.toolbox_) { - this.deleteAreaToolbox_ = this.toolbox_.getRect(); - } else { - this.deleteAreaToolbox_ = null; - } -}; - -/** - * Is the mouse event over a delete area (toolbar or non-closing flyout)? - * Opens or closes the trashcan and sets the cursor as a side effect. - * @param {!Event} e Mouse move event. - * @return {boolean} True if event is in a delete area. - */ -Blockly.WorkspaceSvg.prototype.isDeleteArea = function(e) { - var isDelete = false; - var mouseXY = Blockly.mouseToSvg(e, Blockly.mainWorkspace.options.svg); - var xy = new goog.math.Coordinate(mouseXY.x, mouseXY.y); - if (this.deleteAreaTrash_) { - if (this.deleteAreaTrash_.contains(xy)) { - this.trashcan.setOpen_(true); - Blockly.Css.setCursor(Blockly.Css.Cursor.DELETE); - return true; - } - this.trashcan.setOpen_(false); - } - if (this.deleteAreaToolbox_) { - if (this.deleteAreaToolbox_.contains(xy)) { - Blockly.Css.setCursor(Blockly.Css.Cursor.DELETE); - return true; - } - } - Blockly.Css.setCursor(Blockly.Css.Cursor.CLOSED); - return false; -}; - -/** - * Handle a mouse-down on SVG drawing surface. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.WorkspaceSvg.prototype.onMouseDown_ = function(e) { - this.markFocused(); - if (Blockly.isTargetInput_(e)) { - return; - } - Blockly.svgResize(this); - Blockly.terminateDrag_(); // In case mouse-up event was lost. - Blockly.hideChaff(); - var isTargetWorkspace = e.target && e.target.nodeName && - (e.target.nodeName.toLowerCase() == 'svg' || - e.target == this.svgBackground_); - if (isTargetWorkspace && Blockly.selected && !this.options.readOnly) { - // Clicking on the document clears the selection. - Blockly.selected.unselect(); - } - if (Blockly.isRightButton(e)) { - // Right-click. - this.showContextMenu_(e); - } else if (this.scrollbar) { - Blockly.removeAllRanges(); - // If the workspace is editable, only allow scrolling when gripping empty - // space. Otherwise, allow scrolling when gripping anywhere. - this.isScrolling = true; - // Record the current mouse position. - this.startDragMouseX = e.clientX; - this.startDragMouseY = e.clientY; - this.startDragMetrics = this.getMetrics(); - this.startScrollX = this.scrollX; - this.startScrollY = this.scrollY; - - // If this is a touch event then bind to the mouseup so workspace drag mode - // is turned off and double move events are not performed on a block. - // See comment in inject.js Blockly.init_ as to why mouseup events are - // bound to the document instead of the SVG's surface. - if ('mouseup' in Blockly.bindEvent_.TOUCH_MAP) { - Blockly.onTouchUpWrapper_ = - Blockly.bindEvent_(document, 'mouseup', null, Blockly.onMouseUp_); - } - Blockly.onMouseMoveWrapper_ = - Blockly.bindEvent_(document, 'mousemove', null, Blockly.onMouseMove_); - } - // This event has been handled. No need to bubble up to the document. - e.stopPropagation(); -}; - -/** - * Start tracking a drag of an object on this workspace. - * @param {!Event} e Mouse down event. - * @param {number} x Starting horizontal location of object. - * @param {number} y Starting vertical location of object. - */ -Blockly.WorkspaceSvg.prototype.startDrag = function(e, x, y) { - // Record the starting offset between the bubble's location and the mouse. - var point = Blockly.mouseToSvg(e, this.options.svg); - // Fix scale of mouse event. - point.x /= this.scale; - point.y /= this.scale; - this.dragDeltaX_ = x - point.x; - this.dragDeltaY_ = y - point.y; -}; - -/** - * Track a drag of an object on this workspace. - * @param {!Event} e Mouse move event. - * @return {!goog.math.Coordinate} New location of object. - */ -Blockly.WorkspaceSvg.prototype.moveDrag = function(e) { - var point = Blockly.mouseToSvg(e, this.options.svg); - // Fix scale of mouse event. - point.x /= this.scale; - point.y /= this.scale; - var x = this.dragDeltaX_ + point.x; - var y = this.dragDeltaY_ + point.y; - return new goog.math.Coordinate(x, y); -}; - -/** - * Handle a mouse-wheel on SVG drawing surface. - * @param {!Event} e Mouse wheel event. - * @private - */ -Blockly.WorkspaceSvg.prototype.onMouseWheel_ = function(e) { - // TODO: Remove terminateDrag and compensate for coordinate skew during zoom. - Blockly.terminateDrag_(); - var delta = e.deltaY > 0 ? -1 : 1; - var position = Blockly.mouseToSvg(e, this.options.svg); - this.zoom(position.x, position.y, delta); - e.preventDefault(); -}; - -/** - * Clean up the workspace by ordering all the blocks in a column. - * @private - */ -Blockly.WorkspaceSvg.prototype.cleanUp_ = function() { - var topBlocks = this.getTopBlocks(true); - var cursorY = 0; - for (var i = 0, block; block = topBlocks[i]; i++) { - var xy = block.getRelativeToSurfaceXY(); - block.moveBy(-xy.x, cursorY - xy.y); - block.snapToGrid(); - cursorY = block.getRelativeToSurfaceXY().y + - block.getHeightWidth().height + Blockly.BlockSvg.MIN_BLOCK_Y; - } - // Fire an event to allow scrollbars to resize. - Blockly.fireUiEvent(window, 'resize'); - this.fireChangeEvent(); -}; - -/** - * Show the context menu for the workspace. - * @param {!Event} e Mouse event. - * @private - */ -Blockly.WorkspaceSvg.prototype.showContextMenu_ = function(e) { - if (this.options.readOnly) { - return; - } - var menuOptions = []; - var topBlocks = this.getTopBlocks(true); - // Option to clean up blocks. - var cleanOption = {}; - cleanOption.text = Blockly.Msg.CLEAN_UP; - cleanOption.enabled = topBlocks.length > 1; - cleanOption.callback = this.cleanUp_.bind(this); - menuOptions.push(cleanOption); - - // Add a little animation to collapsing and expanding. - var COLLAPSE_DELAY = 10; - if (this.options.collapse) { - var hasCollapsedBlocks = false; - var hasExpandedBlocks = false; - for (var i = 0; i < topBlocks.length; i++) { - var block = topBlocks[i]; - while (block) { - if (block.isCollapsed()) { - hasCollapsedBlocks = true; - } else { - hasExpandedBlocks = true; - } - block = block.getNextBlock(); - } - } - - /* - * Option to collapse or expand top blocks - * @param {boolean} shouldCollapse Whether a block should collapse. - * @private - */ - var toggleOption = function(shouldCollapse) { - var ms = 0; - for (var i = 0; i < topBlocks.length; i++) { - var block = topBlocks[i]; - while (block) { - setTimeout(block.setCollapsed.bind(block, shouldCollapse), ms); - block = block.getNextBlock(); - ms += COLLAPSE_DELAY; - } - } - }; - - // Option to collapse top blocks. - var collapseOption = {enabled: hasExpandedBlocks}; - collapseOption.text = Blockly.Msg.COLLAPSE_ALL; - collapseOption.callback = function() { - toggleOption(true); - }; - menuOptions.push(collapseOption); - - // Option to expand top blocks. - var expandOption = {enabled: hasCollapsedBlocks}; - expandOption.text = Blockly.Msg.EXPAND_ALL; - expandOption.callback = function() { - toggleOption(false); - }; - menuOptions.push(expandOption); - } - - Blockly.ContextMenu.show(e, menuOptions, this.RTL); -}; - -/** - * Load an audio file. Cache it, ready for instantaneous playing. - * @param {!Array.} filenames List of file types in decreasing order of - * preference (i.e. increasing size). E.g. ['media/go.mp3', 'media/go.wav'] - * Filenames include path from Blockly's root. File extensions matter. - * @param {string} name Name of sound. - * @private - */ -Blockly.WorkspaceSvg.prototype.loadAudio_ = function(filenames, name) { - if (!filenames.length) { - return; - } - try { - var audioTest = new window['Audio'](); - } catch(e) { - // No browser support for Audio. - // IE can throw an error even if the Audio object exists. - return; - } - var sound; - for (var i = 0; i < filenames.length; i++) { - var filename = filenames[i]; - var ext = filename.match(/\.(\w+)$/); - if (ext && audioTest.canPlayType('audio/' + ext[1])) { - // Found an audio format we can play. - sound = new window['Audio'](filename); - break; - } - } - if (sound && sound.play) { - this.SOUNDS_[name] = sound; - } -}; - -/** - * Preload all the audio files so that they play quickly when asked for. - * @private - */ -Blockly.WorkspaceSvg.prototype.preloadAudio_ = function() { - for (var name in this.SOUNDS_) { - var sound = this.SOUNDS_[name]; - sound.volume = .01; - sound.play(); - sound.pause(); - // iOS can only process one sound at a time. Trying to load more than one - // corrupts the earlier ones. Just load one and leave the others uncached. - if (goog.userAgent.IPAD || goog.userAgent.IPHONE) { - break; - } - } -}; - -/** - * Play an audio file at specified value. If volume is not specified, - * use full volume (1). - * @param {string} name Name of sound. - * @param {number=} opt_volume Volume of sound (0-1). - */ -Blockly.WorkspaceSvg.prototype.playAudio = function(name, opt_volume) { - var sound = this.SOUNDS_[name]; - if (sound) { - var mySound; - var ie9 = goog.userAgent.DOCUMENT_MODE && - goog.userAgent.DOCUMENT_MODE === 9; - if (ie9 || goog.userAgent.IPAD || goog.userAgent.ANDROID) { - // Creating a new audio node causes lag in IE9, Android and iPad. Android - // and IE9 refetch the file from the server, iPad uses a singleton audio - // node which must be deleted and recreated for each new audio tag. - mySound = sound; - } else { - mySound = sound.cloneNode(); - } - mySound.volume = (opt_volume === undefined ? 1 : opt_volume); - mySound.play(); - } else if (this.options.parentWorkspace) { - // Maybe a workspace on a lower level knows about this sound. - this.options.parentWorkspace.playAudio(name, opt_volume); - } -}; - -/** - * Modify the block tree on the existing toolbox. - * @param {Node|string} tree DOM tree of blocks, or text representation of same. - */ -Blockly.WorkspaceSvg.prototype.updateToolbox = function(tree) { - tree = Blockly.parseToolboxTree_(tree); - if (!tree) { - if (this.options.languageTree) { - throw 'Can\'t nullify an existing toolbox.'; - } - // No change (null to null). - return; - } - if (!this.options.languageTree) { - throw 'Existing toolbox is null. Can\'t create new toolbox.'; - } - if (this.options.hasCategories) { - if (!this.toolbox_) { - throw 'Existing toolbox has no categories. Can\'t change mode.'; - } - this.options.languageTree = tree; - this.toolbox_.populate_(tree); - } else { - if (!this.flyout_) { - throw 'Existing toolbox has categories. Can\'t change mode.'; - } - this.options.languageTree = tree; - this.flyout_.show(tree.childNodes); - } -}; - -/** - * When something in this workspace changes, call a function. - * @param {!Function} func Function to call. - * @return {!Array.} Opaque data that can be passed to - * removeChangeListener. - */ -Blockly.WorkspaceSvg.prototype.addChangeListener = function(func) { - var wrapper = Blockly.bindEvent_(this.getCanvas(), - 'blocklyWorkspaceChange', null, func); - Array.prototype.push.apply(this.eventWrappers_, wrapper); - return wrapper; -}; - -/** - * Stop listening for this workspace's changes. - * @param {!Array.} bindData Opaque data from addChangeListener. - */ -Blockly.WorkspaceSvg.prototype.removeChangeListener = function(bindData) { - Blockly.unbindEvent_(bindData); - var i = this.eventWrappers_.indexOf(bindData); - if (i != -1) { - this.eventWrappers_.splice(i, 1); - } -}; - -/** - * Mark this workspace as the currently focused main workspace. - */ -Blockly.WorkspaceSvg.prototype.markFocused = function() { - if (this.options.parentWorkspace) { - this.options.parentWorkspace.markFocused(); - } else { - Blockly.mainWorkspace = this; - } -}; - -/** - * Zooming the blocks centered in (x, y) coordinate with zooming in or out. - * @param {number} x X coordinate of center. - * @param {number} y Y coordinate of center. - * @param {number} type Type of zooming (-1 zooming out and 1 zooming in). - */ -Blockly.WorkspaceSvg.prototype.zoom = function(x, y, type) { - var speed = this.options.zoomOptions.scaleSpeed; - var metrics = this.getMetrics(); - var center = this.options.svg.createSVGPoint(); - center.x = x; - center.y = y; - center = center.matrixTransform(this.getCanvas().getCTM().inverse()); - x = center.x; - y = center.y; - var canvas = this.getCanvas(); - // Scale factor. - var scaleChange = (type == 1) ? speed : 1 / speed; - // Clamp scale within valid range. - var newScale = this.scale * scaleChange; - if (newScale > this.options.zoomOptions.maxScale) { - scaleChange = this.options.zoomOptions.maxScale / this.scale; - } else if (newScale < this.options.zoomOptions.minScale) { - scaleChange = this.options.zoomOptions.minScale / this.scale; - } - var matrix = canvas.getCTM() - .translate(x * (1 - scaleChange), y * (1 - scaleChange)) - .scale(scaleChange); - // newScale and matrix.a should be identical (within a rounding error). - if (this.scale == matrix.a) { - return; // No change in zoom. - } - this.scale = matrix.a; - this.scrollX = matrix.e - metrics.absoluteLeft; - this.scrollY = matrix.f - metrics.absoluteTop; - this.updateGridPattern_(); - this.scrollbar.resize(); - Blockly.hideChaff(false); - if (this.flyout_) { - // No toolbox, resize flyout. - this.flyout_.reflow(); - } -}; - -/** - * Zooming the blocks centered in the center of view with zooming in or out. - * @param {number} type Type of zooming (-1 zooming out and 1 zooming in). - */ -Blockly.WorkspaceSvg.prototype.zoomCenter = function(type) { - var metrics = this.getMetrics(); - var x = metrics.viewWidth / 2; - var y = metrics.viewHeight / 2; - this.zoom(x, y, type); -}; - -/** - * Reset zooming and dragging. - * @param {!Event} e Mouse down event. - */ -Blockly.WorkspaceSvg.prototype.zoomReset = function(e) { - this.scale = 1; - this.updateGridPattern_(); - Blockly.hideChaff(false); - if (this.flyout_) { - // No toolbox, resize flyout. - this.flyout_.reflow(); - } - // Zoom level has changed, update the scrollbars. - if (this.scrollbar) { - this.scrollbar.resize(); - } - // Center the workspace. - var metrics = this.getMetrics(); - this.scrollbar.set((metrics.contentWidth - metrics.viewWidth) / 2, - (metrics.contentHeight - metrics.viewHeight) / 2); - // This event has been handled. Don't start a workspace drag. - e.stopPropagation(); -}; - -/** - * Updates the grid pattern. - * @private - */ -Blockly.WorkspaceSvg.prototype.updateGridPattern_ = function() { - if (!this.options.gridPattern) { - return; // No grid. - } - // MSIE freaks if it sees a 0x0 pattern, so set empty patterns to 100x100. - var safeSpacing = (this.options.gridOptions['spacing'] * this.scale) || 100; - this.options.gridPattern.setAttribute('width', safeSpacing); - this.options.gridPattern.setAttribute('height', safeSpacing); - var half = Math.floor(this.options.gridOptions['spacing'] / 2) + 0.5; - var start = half - this.options.gridOptions['length'] / 2; - var end = half + this.options.gridOptions['length'] / 2; - var line1 = this.options.gridPattern.firstChild; - var line2 = line1 && line1.nextSibling; - half *= this.scale; - start *= this.scale; - end *= this.scale; - if (line1) { - line1.setAttribute('stroke-width', this.scale); - line1.setAttribute('x1', start); - line1.setAttribute('y1', half); - line1.setAttribute('x2', end); - line1.setAttribute('y2', half); - } - if (line2) { - line2.setAttribute('stroke-width', this.scale); - line2.setAttribute('x1', half); - line2.setAttribute('y1', start); - line2.setAttribute('x2', half); - line2.setAttribute('y2', end); - } -}; - -// Export symbols that would otherwise be renamed by Closure compiler. -Blockly.WorkspaceSvg.prototype['setVisible'] = - Blockly.WorkspaceSvg.prototype.setVisible; -Blockly.WorkspaceSvg.prototype['addChangeListener'] = - Blockly.WorkspaceSvg.prototype.addChangeListener; -Blockly.WorkspaceSvg.prototype['removeChangeListener'] = - Blockly.WorkspaceSvg.prototype.removeChangeListener; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/xml.js b/src/opsoro/apps/visual_programming/static/blockly/core/xml.js deleted file mode 100644 index 06a9726..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/core/xml.js +++ /dev/null @@ -1,551 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview XML reader and writer. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Xml'); - -// TODO(scr): Fix circular dependencies -// goog.require('Blockly.Block'); -goog.require('goog.dom'); - - -/** - * Encode a block tree as XML. - * @param {!Blockly.Workspace} workspace The workspace containing blocks. - * @return {!Element} XML document. - */ -Blockly.Xml.workspaceToDom = function(workspace) { - var width; // Not used in LTR. - if (workspace.RTL) { - width = workspace.getWidth(); - } - var xml = goog.dom.createDom('xml'); - var blocks = workspace.getTopBlocks(true); - for (var i = 0, block; block = blocks[i]; i++) { - var element = Blockly.Xml.blockToDom_(block); - var xy = block.getRelativeToSurfaceXY(); - element.setAttribute('x', Math.round(workspace.RTL ? width - xy.x : xy.x)); - element.setAttribute('y', Math.round(xy.y)); - xml.appendChild(element); - } - return xml; -}; - -/** - * Encode a block subtree as XML. - * @param {!Blockly.Block} block The root block to encode. - * @return {!Element} Tree of XML elements. - * @private - */ -Blockly.Xml.blockToDom_ = function(block) { - var element = goog.dom.createDom(block.isShadow() ? 'shadow' : 'block'); - element.setAttribute('type', block.type); - if (Blockly.Realtime.isEnabled()) { - // Only used by realtime. - element.setAttribute('id', block.id); - } - if (block.mutationToDom) { - // Custom data for an advanced block. - var mutation = block.mutationToDom(); - if (mutation && (mutation.hasChildNodes() || mutation.hasAttributes())) { - element.appendChild(mutation); - } - } - function fieldToDom(field) { - if (field.name && field.EDITABLE) { - var container = goog.dom.createDom('field', null, field.getValue()); - container.setAttribute('name', field.name); - element.appendChild(container); - } - } - for (var i = 0, input; input = block.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - fieldToDom(field); - } - } - - var commentText = block.getCommentText(); - if (commentText) { - var commentElement = goog.dom.createDom('comment', null, commentText); - if (typeof block.comment == 'object') { - commentElement.setAttribute('pinned', block.comment.isVisible()); - var hw = block.comment.getBubbleSize(); - commentElement.setAttribute('h', hw.height); - commentElement.setAttribute('w', hw.width); - } - element.appendChild(commentElement); - } - - if (block.data) { - // Optional text data that round-trips beween blocks and XML. - // Has no effect. May be used by 3rd parties for meta information. - var dataElement = goog.dom.createDom('data', null, block.data); - element.appendChild(dataElement); - } - - for (var i = 0, input; input = block.inputList[i]; i++) { - var container; - var empty = true; - if (input.type == Blockly.DUMMY_INPUT) { - continue; - } else { - var childBlock = input.connection.targetBlock(); - if (input.type == Blockly.INPUT_VALUE) { - container = goog.dom.createDom('value'); - } else if (input.type == Blockly.NEXT_STATEMENT) { - container = goog.dom.createDom('statement'); - } - var shadow = input.connection.getShadowDom(); - if (shadow && (!childBlock || !childBlock.isShadow())) { - container.appendChild(Blockly.Xml.cloneShadow_(shadow)); - } - if (childBlock) { - container.appendChild(Blockly.Xml.blockToDom_(childBlock)); - empty = false; - } - } - container.setAttribute('name', input.name); - if (!empty) { - element.appendChild(container); - } - } - if (block.inputsInlineDefault != block.inputsInline) { - element.setAttribute('inline', block.inputsInline); - } - if (block.isCollapsed()) { - element.setAttribute('collapsed', true); - } - if (block.disabled) { - element.setAttribute('disabled', true); - } - if (!block.isDeletable()) { - element.setAttribute('deletable', false); - } - if (!block.isMovable() && !block.isShadow()) { - element.setAttribute('movable', false); - } - if (!block.isEditable()) { - element.setAttribute('editable', false); - } - - var nextBlock = block.getNextBlock(); - if (nextBlock) { - var container = goog.dom.createDom('next', null, - Blockly.Xml.blockToDom_(nextBlock)); - element.appendChild(container); - } - var shadow = block.nextConnection && block.nextConnection.getShadowDom(); - if (shadow && (!nextBlock || !nextBlock.isShadow())) { - container.appendChild(Blockly.Xml.cloneShadow_(shadow)); - } - - return element; -}; - -/** - * Deeply clone the shadow's DOM so that changes don't back-wash to the block. - * @param {!Element} shadow A tree of XML elements. - * @return {!Element} A tree of XML elements. - * @private - */ -Blockly.Xml.cloneShadow_ = function(shadow) { - shadow = shadow.cloneNode(true); - // Walk the tree looking for whitespace. Don't prune whitespace in a tag. - var node = shadow; - var textNode; - while (node) { - if (node.firstChild) { - node = node.firstChild; - } else { - while (node && !node.nextSibling) { - textNode = node; - node = node.parentNode; - if (textNode.nodeType == 3 && textNode.data.trim() == '' && - node.firstChild != textNode) { - // Prune whitespace after a tag. - goog.dom.removeNode(textNode); - } - } - if (node) { - textNode = node; - node = node.nextSibling; - if (textNode.nodeType == 3 && textNode.data.trim() == '') { - // Prune whitespace before a tag. - goog.dom.removeNode(textNode); - } - } - } - } - return shadow; -}; - -/** - * Converts a DOM structure into plain text. - * Currently the text format is fairly ugly: all one line with no whitespace. - * @param {!Element} dom A tree of XML elements. - * @return {string} Text representation. - */ -Blockly.Xml.domToText = function(dom) { - var oSerializer = new XMLSerializer(); - return oSerializer.serializeToString(dom); -}; - -/** - * Converts a DOM structure into properly indented text. - * @param {!Element} dom A tree of XML elements. - * @return {string} Text representation. - */ -Blockly.Xml.domToPrettyText = function(dom) { - // This function is not guaranteed to be correct for all XML. - // But it handles the XML that Blockly generates. - var blob = Blockly.Xml.domToText(dom); - // Place every open and close tag on its own line. - var lines = blob.split('<'); - // Indent every line. - var indent = ''; - for (var i = 1; i < lines.length; i++) { - var line = lines[i]; - if (line[0] == '/') { - indent = indent.substring(2); - } - lines[i] = indent + '<' + line; - if (line[0] != '/' && line.slice(-2) != '/>') { - indent += ' '; - } - } - // Pull simple tags back together. - // E.g. - var text = lines.join('\n'); - text = text.replace(/(<(\w+)\b[^>]*>[^\n]*)\n *<\/\2>/g, '$1'); - // Trim leading blank line. - return text.replace(/^\n/, ''); -}; - -/** - * Converts plain text into a DOM structure. - * Throws an error if XML doesn't parse. - * @param {string} text Text representation. - * @return {!Element} A tree of XML elements. - */ -Blockly.Xml.textToDom = function(text) { - var oParser = new DOMParser(); - var dom = oParser.parseFromString(text, 'text/xml'); - // The DOM should have one and only one top-level node, an XML tag. - if (!dom || !dom.firstChild || - dom.firstChild.nodeName.toLowerCase() != 'xml' || - dom.firstChild !== dom.lastChild) { - // Whatever we got back from the parser is not XML. - throw 'Blockly.Xml.textToDom did not obtain a valid XML tree.'; - } - return dom.firstChild; -}; - -/** - * Decode an XML DOM and create blocks on the workspace. - * @param {!Blockly.Workspace} workspace The workspace. - * @param {!Element} xml XML DOM. - */ -Blockly.Xml.domToWorkspace = function(workspace, xml) { - var width; // Not used in LTR. - if (workspace.RTL) { - width = workspace.getWidth(); - } - Blockly.Field.startCache(); - // Safari 7.1.3 is known to provide node lists with extra references to - // children beyond the lists' length. Trust the length, do not use the - // looping pattern of checking the index for an object. - var childCount = xml.childNodes.length; - for (var i = 0; i < childCount; i++) { - var xmlChild = xml.childNodes[i]; - if (xmlChild.nodeName.toLowerCase() == 'block') { - var block = Blockly.Xml.domToBlock(workspace, xmlChild); - var blockX = parseInt(xmlChild.getAttribute('x'), 10); - var blockY = parseInt(xmlChild.getAttribute('y'), 10); - if (!isNaN(blockX) && !isNaN(blockY)) { - block.moveBy(workspace.RTL ? width - blockX : blockX, blockY); - } - } - } - Blockly.Field.stopCache(); -}; - -/** - * Decode an XML block tag and create a block (and possibly sub blocks) on the - * workspace. - * @param {!Blockly.Workspace} workspace The workspace. - * @param {!Element} xmlBlock XML block element. - * @param {boolean=} opt_reuseBlock Optional arg indicating whether to - * reinitialize an existing block. - * @return {!Blockly.Block} The root block created. - */ -Blockly.Xml.domToBlock = function(workspace, xmlBlock, opt_reuseBlock) { - // Create top-level block. - var topBlock = Blockly.Xml.domToBlockHeadless_(workspace, xmlBlock, - opt_reuseBlock); - if (workspace.rendered) { - // Hide connections to speed up assembly. - topBlock.setConnectionsHidden(true); - // Generate list of all blocks. - var blocks = topBlock.getDescendants(); - // Render each block. - for (var i = blocks.length - 1; i >= 0; i--) { - blocks[i].initSvg(); - } - for (var i = blocks.length - 1; i >= 0; i--) { - blocks[i].render(false); - } - // Populating the connection database may be defered until after the blocks - // have renderend. - setTimeout(function() { - if (topBlock.workspace) { // Check that the block hasn't been deleted. - topBlock.setConnectionsHidden(false); - } - }, 1); - topBlock.updateDisabled(); - // Fire an event to allow scrollbars to resize. - Blockly.fireUiEvent(window, 'resize'); - } - return topBlock; -}; - -/** - * Decode an XML block tag and create a block (and possibly sub blocks) on the - * workspace. - * @param {!Blockly.Workspace} workspace The workspace. - * @param {!Element} xmlBlock XML block element. - * @param {boolean=} opt_reuseBlock Optional arg indicating whether to - * reinitialize an existing block. - * @return {!Blockly.Block} The root block created. - * @private - */ -Blockly.Xml.domToBlockHeadless_ = - function(workspace, xmlBlock, opt_reuseBlock) { - var block = null; - var prototypeName = xmlBlock.getAttribute('type'); - if (!prototypeName) { - throw 'Block type unspecified: \n' + xmlBlock.outerHTML; - } - var id = xmlBlock.getAttribute('id'); - if (opt_reuseBlock && id) { - // Only used by realtime. - block = Blockly.Block.getById(id, workspace); - // TODO: The following is for debugging. It should never actually happen. - if (!block) { - throw 'Couldn\'t get Block with id: ' + id; - } - var parentBlock = block.getParent(); - // If we've already filled this block then we will dispose of it and then - // re-fill it. - if (block.workspace) { - block.dispose(true, false, true); - } - block.fill(workspace, prototypeName); - block.parent_ = parentBlock; - } else { - block = Blockly.Block.obtain(workspace, prototypeName); - } - - var blockChild = null; - for (var i = 0, xmlChild; xmlChild = xmlBlock.childNodes[i]; i++) { - if (xmlChild.nodeType == 3) { - // Ignore any text at the level. It's all whitespace anyway. - continue; - } - var input; - - // Find any enclosed blocks or shadows in this tag. - var childBlockNode = null; - var childShadowNode = null; - var shadowActive = false; - for (var j = 0, grandchildNode; grandchildNode = xmlChild.childNodes[j]; - j++) { - if (grandchildNode.nodeType == 1) { - if (grandchildNode.nodeName.toLowerCase() == 'block') { - childBlockNode = grandchildNode; - } else if (grandchildNode.nodeName.toLowerCase() == 'shadow') { - childShadowNode = grandchildNode; - } - } - } - // Use the shadow block if there is no child block. - if (!childBlockNode && childShadowNode) { - childBlockNode = childShadowNode; - shadowActive = true; - } - - var name = xmlChild.getAttribute('name'); - switch (xmlChild.nodeName.toLowerCase()) { - case 'mutation': - // Custom data for an advanced block. - if (block.domToMutation) { - block.domToMutation(xmlChild); - if (block.initSvg) { - // Mutation may have added some elements that need initalizing. - block.initSvg(); - } - } - break; - case 'comment': - block.setCommentText(xmlChild.textContent); - var visible = xmlChild.getAttribute('pinned'); - if (visible) { - // Give the renderer a millisecond to render and position the block - // before positioning the comment bubble. - setTimeout(function() { - if (block.comment && block.comment.setVisible) { - block.comment.setVisible(visible == 'true'); - } - }, 1); - } - var bubbleW = parseInt(xmlChild.getAttribute('w'), 10); - var bubbleH = parseInt(xmlChild.getAttribute('h'), 10); - if (!isNaN(bubbleW) && !isNaN(bubbleH) && - block.comment && block.comment.setVisible) { - block.comment.setBubbleSize(bubbleW, bubbleH); - } - break; - case 'data': - // Optional text data that round-trips beween blocks and XML. - // Has no effect. May be used by 3rd parties for meta information. - block.data = xmlChild.textContent; - break; - case 'title': - // Titles were renamed to field in December 2013. - // Fall through. - case 'field': - var field = block.getField(name); - if (!field) { - console.warn('Ignoring non-existent field ' + name + ' in block ' + - prototypeName); - break; - } - field.setValue(xmlChild.textContent); - break; - case 'value': - case 'statement': - input = block.getInput(name); - if (!input) { - console.warn('Ignoring non-existent input ' + name + ' in block ' + - prototypeName); - break; - } - if (childShadowNode) { - input.connection.setShadowDom(childShadowNode); - } - if (childBlockNode) { - blockChild = Blockly.Xml.domToBlockHeadless_(workspace, - childBlockNode, opt_reuseBlock); - if (blockChild.outputConnection) { - input.connection.connect(blockChild.outputConnection); - } else if (blockChild.previousConnection) { - input.connection.connect(blockChild.previousConnection); - } else { - throw 'Child block does not have output or previous statement.'; - } - } - break; - case 'next': - if (childShadowNode && block.nextConnection) { - block.nextConnection.setShadowDom(childShadowNode); - } - if (childBlockNode) { - if (!block.nextConnection) { - throw 'Next statement does not exist.'; - } else if (block.nextConnection.targetConnection) { - // This could happen if there is more than one XML 'next' tag. - throw 'Next statement is already connected.'; - } - blockChild = Blockly.Xml.domToBlockHeadless_(workspace, - childBlockNode, opt_reuseBlock); - if (!blockChild.previousConnection) { - throw 'Next block does not have previous statement.'; - } - block.nextConnection.connect(blockChild.previousConnection); - } - break; - default: - // Unknown tag; ignore. Same principle as HTML parsers. - console.warn('Ignoring unknown tag: ' + xmlChild.nodeName); - } - } - - var inline = xmlBlock.getAttribute('inline'); - if (inline) { - block.setInputsInline(inline == 'true'); - } - var disabled = xmlBlock.getAttribute('disabled'); - if (disabled) { - block.setDisabled(disabled == 'true'); - } - var deletable = xmlBlock.getAttribute('deletable'); - if (deletable) { - block.setDeletable(deletable == 'true'); - } - var movable = xmlBlock.getAttribute('movable'); - if (movable) { - block.setMovable(movable == 'true'); - } - var editable = xmlBlock.getAttribute('editable'); - if (editable) { - block.setEditable(editable == 'true'); - } - var collapsed = xmlBlock.getAttribute('collapsed'); - if (collapsed) { - block.setCollapsed(collapsed == 'true'); - } - if (xmlBlock.nodeName.toLowerCase() == 'shadow') { - block.setShadow(true); - } - // Give the block a chance to clean up any initial inputs. - if (block.validate) { - block.validate(); - } - return block; -}; - -/** - * Remove any 'next' block (statements in a stack). - * @param {!Element} xmlBlock XML block element. - */ -Blockly.Xml.deleteNext = function(xmlBlock) { - for (var i = 0, child; child = xmlBlock.childNodes[i]; i++) { - if (child.nodeName.toLowerCase() == 'next') { - xmlBlock.removeChild(child); - break; - } - } -}; - -// Export symbols that would otherwise be renamed by Closure compiler. -if (!goog.global['Blockly']) { - goog.global['Blockly'] = {}; -} -if (!goog.global['Blockly']['Xml']) { - goog.global['Blockly']['Xml'] = {}; -} -goog.global['Blockly']['Xml']['domToText'] = Blockly.Xml.domToText; -goog.global['Blockly']['Xml']['domToWorkspace'] = Blockly.Xml.domToWorkspace; -goog.global['Blockly']['Xml']['textToDom'] = Blockly.Xml.textToDom; -goog.global['Blockly']['Xml']['workspaceToDom'] = Blockly.Xml.workspaceToDom; diff --git a/src/opsoro/apps/visual_programming/static/blockly/dart_compressed.js b/src/opsoro/apps/visual_programming/static/blockly/dart_compressed.js deleted file mode 100644 index b9973ba..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/dart_compressed.js +++ /dev/null @@ -1,82 +0,0 @@ -// Do not edit this file; automatically generated by build.py. -'use strict'; - - -// Copyright 2014 Google Inc. Apache License 2.0 -Blockly.Dart=new Blockly.Generator("Dart");Blockly.Dart.addReservedWords("assert,break,case,catch,class,const,continue,default,do,else,enum,extends,false,final,finally,for,if,in,is,new,null,rethrow,return,super,switch,this,throw,true,try,var,void,while,with,print,identityHashCode,identical,BidirectionalIterator,Comparable,double,Function,int,Invocation,Iterable,Iterator,List,Map,Match,num,Pattern,RegExp,Set,StackTrace,String,StringSink,Type,bool,DateTime,Deprecated,Duration,Expando,Null,Object,RuneIterator,Runes,Stopwatch,StringBuffer,Symbol,Uri,Comparator,AbstractClassInstantiationError,ArgumentError,AssertionError,CastError,ConcurrentModificationError,CyclicInitializationError,Error,Exception,FallThroughError,FormatException,IntegerDivisionByZeroException,NoSuchMethodError,NullThrownError,OutOfMemoryError,RangeError,StackOverflowError,StateError,TypeError,UnimplementedError,UnsupportedError"); -Blockly.Dart.ORDER_ATOMIC=0;Blockly.Dart.ORDER_UNARY_POSTFIX=1;Blockly.Dart.ORDER_UNARY_PREFIX=2;Blockly.Dart.ORDER_MULTIPLICATIVE=3;Blockly.Dart.ORDER_ADDITIVE=4;Blockly.Dart.ORDER_SHIFT=5;Blockly.Dart.ORDER_BITWISE_AND=6;Blockly.Dart.ORDER_BITWISE_XOR=7;Blockly.Dart.ORDER_BITWISE_OR=8;Blockly.Dart.ORDER_RELATIONAL=9;Blockly.Dart.ORDER_EQUALITY=10;Blockly.Dart.ORDER_LOGICAL_AND=11;Blockly.Dart.ORDER_LOGICAL_OR=12;Blockly.Dart.ORDER_CONDITIONAL=13;Blockly.Dart.ORDER_CASCADE=14; -Blockly.Dart.ORDER_ASSIGNMENT=15;Blockly.Dart.ORDER_NONE=99; -Blockly.Dart.init=function(a){Blockly.Dart.definitions_=Object.create(null);Blockly.Dart.functionNames_=Object.create(null);Blockly.Dart.variableDB_?Blockly.Dart.variableDB_.reset():Blockly.Dart.variableDB_=new Blockly.Names(Blockly.Dart.RESERVED_WORDS_);var b=[];a=Blockly.Variables.allVariables(a);for(var c=0;c",GTE:">="}[a.getFieldValue("OP")],c="=="==b||"!="==b?Blockly.Dart.ORDER_EQUALITY:Blockly.Dart.ORDER_RELATIONAL,d=Blockly.Dart.valueToCode(a,"A",c)||"0";a=Blockly.Dart.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; -Blockly.Dart.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"&&":"||",c="&&"==b?Blockly.Dart.ORDER_LOGICAL_AND:Blockly.Dart.ORDER_LOGICAL_OR,d=Blockly.Dart.valueToCode(a,"A",c);a=Blockly.Dart.valueToCode(a,"B",c);if(d||a){var e="&&"==b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]};Blockly.Dart.logic_negate=function(a){var b=Blockly.Dart.ORDER_UNARY_PREFIX;return["!"+(Blockly.Dart.valueToCode(a,"BOOL",b)||"true"),b]}; -Blockly.Dart.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"true":"false",Blockly.Dart.ORDER_ATOMIC]};Blockly.Dart.logic_null=function(a){return["null",Blockly.Dart.ORDER_ATOMIC]};Blockly.Dart.logic_ternary=function(a){var b=Blockly.Dart.valueToCode(a,"IF",Blockly.Dart.ORDER_CONDITIONAL)||"false",c=Blockly.Dart.valueToCode(a,"THEN",Blockly.Dart.ORDER_CONDITIONAL)||"null";a=Blockly.Dart.valueToCode(a,"ELSE",Blockly.Dart.ORDER_CONDITIONAL)||"null";return[b+" ? "+c+" : "+a,Blockly.Dart.ORDER_CONDITIONAL]};Blockly.Dart.loops={}; -Blockly.Dart.controls_repeat_ext=function(a){var b=a.getField("TIMES")?String(Number(a.getFieldValue("TIMES"))):Blockly.Dart.valueToCode(a,"TIMES",Blockly.Dart.ORDER_ASSIGNMENT)||"0",c=Blockly.Dart.statementToCode(a,"DO"),c=Blockly.Dart.addLoopTrap(c,a.id);a="";var d=Blockly.Dart.variableDB_.getDistinctName("count",Blockly.Variables.NAME_TYPE),e=b;b.match(/^\w+$/)||Blockly.isNumber(b)||(e=Blockly.Dart.variableDB_.getDistinctName("repeat_end",Blockly.Variables.NAME_TYPE),a+="var "+e+" = "+b+";\n"); -return a+("for (int "+d+" = 0; "+d+" < "+e+"; "+d+"++) {\n"+c+"}\n")};Blockly.Dart.controls_repeat=Blockly.Dart.controls_repeat_ext;Blockly.Dart.controls_whileUntil=function(a){var b="UNTIL"==a.getFieldValue("MODE"),c=Blockly.Dart.valueToCode(a,"BOOL",b?Blockly.Dart.ORDER_UNARY_PREFIX:Blockly.Dart.ORDER_NONE)||"false",d=Blockly.Dart.statementToCode(a,"DO"),d=Blockly.Dart.addLoopTrap(d,a.id);b&&(c="!"+c);return"while ("+c+") {\n"+d+"}\n"}; -Blockly.Dart.controls_for=function(a){var b=Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.Dart.valueToCode(a,"FROM",Blockly.Dart.ORDER_ASSIGNMENT)||"0",d=Blockly.Dart.valueToCode(a,"TO",Blockly.Dart.ORDER_ASSIGNMENT)||"0",e=Blockly.Dart.valueToCode(a,"BY",Blockly.Dart.ORDER_ASSIGNMENT)||"1",f=Blockly.Dart.statementToCode(a,"DO"),f=Blockly.Dart.addLoopTrap(f,a.id);if(Blockly.isNumber(c)&&Blockly.isNumber(d)&&Blockly.isNumber(e)){var g=parseFloat(c)<= -parseFloat(d);a="for ("+b+" = "+c+"; "+b+(g?" <= ":" >= ")+d+"; "+b;b=Math.abs(parseFloat(e));a=(1==b?a+(g?"++":"--"):a+((g?" += ":" -= ")+b))+(") {\n"+f+"}\n")}else a="",g=c,c.match(/^\w+$/)||Blockly.isNumber(c)||(g=Blockly.Dart.variableDB_.getDistinctName(b+"_start",Blockly.Variables.NAME_TYPE),a+="var "+g+" = "+c+";\n"),c=d,d.match(/^\w+$/)||Blockly.isNumber(d)||(c=Blockly.Dart.variableDB_.getDistinctName(b+"_end",Blockly.Variables.NAME_TYPE),a+="var "+c+" = "+d+";\n"),d=Blockly.Dart.variableDB_.getDistinctName(b+ -"_inc",Blockly.Variables.NAME_TYPE),a+="num "+d+" = ",a=Blockly.isNumber(e)?a+(Math.abs(e)+";\n"):a+("("+e+").abs();\n"),a+="if ("+g+" > "+c+") {\n",a+=Blockly.Dart.INDENT+d+" = -"+d+";\n",a+="}\n",a+="for ("+b+" = "+g+";\n "+d+" >= 0 ? "+b+" <= "+c+" : "+b+" >= "+c+";\n "+b+" += "+d+") {\n"+f+"}\n";return a}; -Blockly.Dart.controls_forEach=function(a){var b=Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.Dart.valueToCode(a,"LIST",Blockly.Dart.ORDER_ASSIGNMENT)||"[]",d=Blockly.Dart.statementToCode(a,"DO"),d=Blockly.Dart.addLoopTrap(d,a.id);return"for (var "+b+" in "+c+") {\n"+d+"}\n"}; -Blockly.Dart.controls_flow_statements=function(a){switch(a.getFieldValue("FLOW")){case "BREAK":return"break;\n";case "CONTINUE":return"continue;\n"}throw"Unknown flow statement.";};Blockly.Dart.math={};Blockly.Dart.addReservedWords("Math");Blockly.Dart.math_number=function(a){a=window.parseFloat(a.getFieldValue("NUM"));return[a,0>a?Blockly.Dart.ORDER_UNARY_PREFIX:Blockly.Dart.ORDER_ATOMIC]}; -Blockly.Dart.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.Dart.ORDER_ADDITIVE],MINUS:[" - ",Blockly.Dart.ORDER_ADDITIVE],MULTIPLY:[" * ",Blockly.Dart.ORDER_MULTIPLICATIVE],DIVIDE:[" / ",Blockly.Dart.ORDER_MULTIPLICATIVE],POWER:[null,Blockly.Dart.ORDER_NONE]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.Dart.valueToCode(a,"A",b)||"0";a=Blockly.Dart.valueToCode(a,"B",b)||"0";return c?[d+c+a,b]:(Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;",["Math.pow("+d+", "+a+ -")",Blockly.Dart.ORDER_UNARY_POSTFIX])}; -Blockly.Dart.math_single=function(a){var b=a.getFieldValue("OP"),c;if("NEG"==b)return a=Blockly.Dart.valueToCode(a,"NUM",Blockly.Dart.ORDER_UNARY_PREFIX)||"0","-"==a[0]&&(a=" "+a),["-"+a,Blockly.Dart.ORDER_UNARY_PREFIX];Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";a="ABS"==b||"ROUND"==b.substring(0,5)?Blockly.Dart.valueToCode(a,"NUM",Blockly.Dart.ORDER_UNARY_POSTFIX)||"0":"SIN"==b||"COS"==b||"TAN"==b?Blockly.Dart.valueToCode(a,"NUM",Blockly.Dart.ORDER_MULTIPLICATIVE)|| -"0":Blockly.Dart.valueToCode(a,"NUM",Blockly.Dart.ORDER_NONE)||"0";switch(b){case "ABS":c=a+".abs()";break;case "ROOT":c="Math.sqrt("+a+")";break;case "LN":c="Math.log("+a+")";break;case "EXP":c="Math.exp("+a+")";break;case "POW10":c="Math.pow(10,"+a+")";break;case "ROUND":c=a+".round()";break;case "ROUNDUP":c=a+".ceil()";break;case "ROUNDDOWN":c=a+".floor()";break;case "SIN":c="Math.sin("+a+" / 180 * Math.PI)";break;case "COS":c="Math.cos("+a+" / 180 * Math.PI)";break;case "TAN":c="Math.tan("+a+ -" / 180 * Math.PI)"}if(c)return[c,Blockly.Dart.ORDER_UNARY_POSTFIX];switch(b){case "LOG10":c="Math.log("+a+") / Math.log(10)";break;case "ASIN":c="Math.asin("+a+") / Math.PI * 180";break;case "ACOS":c="Math.acos("+a+") / Math.PI * 180";break;case "ATAN":c="Math.atan("+a+") / Math.PI * 180";break;default:throw"Unknown math operator: "+b;}return[c,Blockly.Dart.ORDER_MULTIPLICATIVE]}; -Blockly.Dart.math_constant=function(a){var b={PI:["Math.PI",Blockly.Dart.ORDER_UNARY_POSTFIX],E:["Math.E",Blockly.Dart.ORDER_UNARY_POSTFIX],GOLDEN_RATIO:["(1 + Math.sqrt(5)) / 2",Blockly.Dart.ORDER_MULTIPLICATIVE],SQRT2:["Math.SQRT2",Blockly.Dart.ORDER_UNARY_POSTFIX],SQRT1_2:["Math.SQRT1_2",Blockly.Dart.ORDER_UNARY_POSTFIX],INFINITY:["double.INFINITY",Blockly.Dart.ORDER_ATOMIC]};a=a.getFieldValue("CONSTANT");"INFINITY"!=a&&(Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;"); -return b[a]}; -Blockly.Dart.math_number_property=function(a){var b=Blockly.Dart.valueToCode(a,"NUMBER_TO_CHECK",Blockly.Dart.ORDER_MULTIPLICATIVE);if(!b)return["false",Blockly.Python.ORDER_ATOMIC];var c=a.getFieldValue("PROPERTY"),d;if("PRIME"==c)return Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;",d=Blockly.Dart.provideFunction_("math_isPrime",["bool "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(n) {"," // https://en.wikipedia.org/wiki/Primality_test#Naive_methods"," if (n == 2 || n == 3) {"," return true;", -" }"," // False if n is null, negative, is 1, or not whole."," // And false if n is divisible by 2 or 3."," if (n == null || n <= 1 || n % 1 != 0 || n % 2 == 0 || n % 3 == 0) {"," return false;"," }"," // Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {"," if (n % (x - 1) == 0 || n % (x + 1) == 0) {"," return false;"," }"," }"," return true;","}"])+"("+b+")",[d,Blockly.Dart.ORDER_UNARY_POSTFIX];switch(c){case "EVEN":d= -b+" % 2 == 0";break;case "ODD":d=b+" % 2 == 1";break;case "WHOLE":d=b+" % 1 == 0";break;case "POSITIVE":d=b+" > 0";break;case "NEGATIVE":d=b+" < 0";break;case "DIVISIBLE_BY":a=Blockly.Dart.valueToCode(a,"DIVISOR",Blockly.Dart.ORDER_MULTIPLICATIVE);if(!a)return["false",Blockly.Python.ORDER_ATOMIC];d=b+" % "+a+" == 0"}return[d,Blockly.Dart.ORDER_EQUALITY]}; -Blockly.Dart.math_change=function(a){var b=Blockly.Dart.valueToCode(a,"DELTA",Blockly.Dart.ORDER_ADDITIVE)||"0";a=Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);return a+" = ("+a+" is num ? "+a+" : 0) + "+b+";\n"};Blockly.Dart.math_round=Blockly.Dart.math_single;Blockly.Dart.math_trig=Blockly.Dart.math_single; -Blockly.Dart.math_on_list=function(a){var b=a.getFieldValue("OP");a=Blockly.Dart.valueToCode(a,"LIST",Blockly.Dart.ORDER_NONE)||"[]";switch(b){case "SUM":b=Blockly.Dart.provideFunction_("math_sum",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," num sumVal = 0;"," myList.forEach((num entry) {sumVal += entry;});"," return sumVal;","}"]);b=b+"("+a+")";break;case "MIN":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_min", -["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," if (myList.isEmpty) return null;"," num minVal = myList[0];"," myList.forEach((num entry) {minVal = Math.min(minVal, entry);});"," return minVal;","}"]);b=b+"("+a+")";break;case "MAX":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_max",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," if (myList.isEmpty) return null;"," num maxVal = myList[0];", -" myList.forEach((num entry) {maxVal = Math.max(maxVal, entry);});"," return maxVal;","}"]);b=b+"("+a+")";break;case "AVERAGE":b=Blockly.Dart.provideFunction_("math_average",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," // First filter list for numbers only."," List localList = new List.from(myList);"," localList.removeMatching((a) => a is! num);"," if (localList.isEmpty) return null;"," num sumVal = 0;"," localList.forEach((num entry) {sumVal += entry;});"," return sumVal / localList.length;", -"}"]);b=b+"("+a+")";break;case "MEDIAN":b=Blockly.Dart.provideFunction_("math_median",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," // First filter list for numbers only, then sort, then return middle value"," // or the average of two middle values if list has an even number of elements."," List localList = new List.from(myList);"," localList.removeMatching((a) => a is! num);"," if (localList.isEmpty) return null;"," localList.sort((a, b) => (a - b));"," int index = localList.length ~/ 2;", -" if (localList.length % 2 == 1) {"," return localList[index];"," } else {"," return (localList[index - 1] + localList[index]) / 2;"," }","}"]);b=b+"("+a+")";break;case "MODE":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_modes",["List "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List values) {"," List modes = [];"," List counts = [];"," int maxCount = 0;"," for (int i = 0; i < values.length; i++) {"," var value = values[i];", -" bool found = false;"," int thisCount;"," for (int j = 0; j < counts.length; j++) {"," if (counts[j][0] == value) {"," thisCount = ++counts[j][1];"," found = true;"," break;"," }"," }"," if (!found) {"," counts.add([value, 1]);"," thisCount = 1;"," }"," maxCount = Math.max(thisCount, maxCount);"," }"," for (int j = 0; j < counts.length; j++) {"," if (counts[j][1] == maxCount) {"," modes.add(counts[j][0]);"," }"," }"," return modes;", -"}"]);b=b+"("+a+")";break;case "STD_DEV":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_standard_deviation",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," // First filter list for numbers only."," List numbers = new List.from(myList);"," numbers.removeMatching((a) => a is! num);"," if (numbers.isEmpty) return null;"," num n = numbers.length;"," num sum = 0;"," numbers.forEach((x) => sum += x);"," num mean = sum / n;", -" num sumSquare = 0;"," numbers.forEach((x) => sumSquare += Math.pow(x - mean, 2));"," return Math.sqrt(sumSquare / n);","}"]);b=b+"("+a+")";break;case "RANDOM":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_random_item",["dynamic "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," int x = new Math.Random().nextInt(myList.length);"," return myList[x];","}"]);b=b+"("+a+")";break;default:throw"Unknown operator: "+b;}return[b, -Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.math_modulo=function(a){var b=Blockly.Dart.valueToCode(a,"DIVIDEND",Blockly.Dart.ORDER_MULTIPLICATIVE)||"0";a=Blockly.Dart.valueToCode(a,"DIVISOR",Blockly.Dart.ORDER_MULTIPLICATIVE)||"0";return[b+" % "+a,Blockly.Dart.ORDER_MULTIPLICATIVE]}; -Blockly.Dart.math_constrain=function(a){Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";var b=Blockly.Dart.valueToCode(a,"VALUE",Blockly.Dart.ORDER_NONE)||"0",c=Blockly.Dart.valueToCode(a,"LOW",Blockly.Dart.ORDER_NONE)||"0";a=Blockly.Dart.valueToCode(a,"HIGH",Blockly.Dart.ORDER_NONE)||"double.INFINITY";return["Math.min(Math.max("+b+", "+c+"), "+a+")",Blockly.Dart.ORDER_UNARY_POSTFIX]}; -Blockly.Dart.math_random_int=function(a){Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";var b=Blockly.Dart.valueToCode(a,"FROM",Blockly.Dart.ORDER_NONE)||"0";a=Blockly.Dart.valueToCode(a,"TO",Blockly.Dart.ORDER_NONE)||"0";return[Blockly.Dart.provideFunction_("math_random_int",["int "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(num a, num b) {"," if (a > b) {"," // Swap a and b to ensure a is smaller."," num c = a;"," a = b;"," b = c;"," }"," return new Math.Random().nextInt(b - a + 1) + a;", -"}"])+"("+b+", "+a+")",Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.math_random_float=function(a){Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";return["new Math.Random().nextDouble()",Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.procedures={}; -Blockly.Dart.procedures_defreturn=function(a){var b=Blockly.Dart.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE),c=Blockly.Dart.statementToCode(a,"STACK");Blockly.Dart.STATEMENT_PREFIX&&(c=Blockly.Dart.prefixLines(Blockly.Dart.STATEMENT_PREFIX.replace(/%1/g,"'"+a.id+"'"),Blockly.Dart.INDENT)+c);Blockly.Dart.INFINITE_LOOP_TRAP&&(c=Blockly.Dart.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+a.id+"'")+c);var d=Blockly.Dart.valueToCode(a,"RETURN",Blockly.Dart.ORDER_NONE)||"";d&&(d=" return "+ -d+";\n");for(var e=d?"dynamic":"void",f=[],g=0;g list = str.split(exp);"," final title = new StringBuffer();"," for (String part in list) {"," if (part.length > 0) {", -" title.write(part[0].toUpperCase());"," if (part.length > 0) {"," title.write(part.substring(1).toLowerCase());"," }"," }"," }"," return title.toString();","}"]),a=Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_NONE)||"''",a=b+"("+a+")");return[a,Blockly.Dart.ORDER_UNARY_POSTFIX]}; -Blockly.Dart.text_trim=function(a){var b={LEFT:".replaceFirst(new RegExp(r'^\\s+'), '')",RIGHT:".replaceFirst(new RegExp(r'\\s+$'), '')",BOTH:".trim()"}[a.getFieldValue("MODE")];return[(Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_UNARY_POSTFIX)||"''")+b,Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.text_print=function(a){return"print("+(Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_NONE)||"''")+");\n"}; -Blockly.Dart.text_prompt_ext=function(a){Blockly.Dart.definitions_.import_dart_html="import 'dart:html' as Html;";var b="Html.window.prompt("+(a.getField("TEXT")?Blockly.Dart.quote_(a.getFieldValue("TEXT")):Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_NONE)||"''")+", '')";"NUMBER"==a.getFieldValue("TYPE")&&(Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;",b="Math.parseDouble("+b+")");return[b,Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.text_prompt=Blockly.Dart.text_prompt_ext;Blockly.Dart.variables={};Blockly.Dart.variables_get=function(a){return[Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),Blockly.Dart.ORDER_ATOMIC]};Blockly.Dart.variables_set=function(a){var b=Blockly.Dart.valueToCode(a,"VALUE",Blockly.Dart.ORDER_ASSIGNMENT)||"0";return Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE)+" = "+b+";\n"}; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/blockfactory/blocks.js b/src/opsoro/apps/visual_programming/static/blockly/demos/blockfactory/blocks.js deleted file mode 100644 index d182304..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/blockfactory/blocks.js +++ /dev/null @@ -1,754 +0,0 @@ -/** - * Blockly Demos: Block Factory Blocks - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Blocks for Blockly's Block Factory application. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -Blockly.Blocks['factory_base'] = { - // Base of new block. - init: function() { - this.setColour(120); - this.appendDummyInput() - .appendField('name') - .appendField(new Blockly.FieldTextInput('math_foo'), 'NAME'); - this.appendStatementInput('INPUTS') - .setCheck('Input') - .appendField('inputs'); - var dropdown = new Blockly.FieldDropdown([ - ['automatic inputs', 'AUTO'], - ['external inputs', 'EXT'], - ['inline inputs', 'INT']]); - this.appendDummyInput() - .appendField(dropdown, 'INLINE'); - dropdown = new Blockly.FieldDropdown([ - ['no connections', 'NONE'], - ['← left output', 'LEFT'], - ['↕ top+bottom connections', 'BOTH'], - ['↑ top connection', 'TOP'], - ['↓ bottom connection', 'BOTTOM']], - function(option) { - this.sourceBlock_.updateShape_(option); - }); - this.appendDummyInput() - .appendField(dropdown, 'CONNECTIONS'); - this.appendValueInput('COLOUR') - .setCheck('Colour') - .appendField('colour'); - /* - this.appendValueInput('TOOLTIP') - .setCheck('String') - .appendField('tooltip'); - this.appendValueInput('HELP') - .setCheck('String') - .appendField('help url'); - */ - this.setTooltip('Build a custom block by plugging\n' + - 'fields, inputs and other blocks here.'); - this.setHelpUrl( - 'https://developers.google.com/blockly/custom-blocks/block-factory'); - }, - mutationToDom: function() { - var container = document.createElement('mutation'); - container.setAttribute('connections', this.getFieldValue('CONNECTIONS')); - return container; - }, - domToMutation: function(xmlElement) { - var connections = xmlElement.getAttribute('connections'); - this.updateShape_(connections); - }, - updateShape_: function(option) { - var outputExists = this.getInput('OUTPUTTYPE'); - var topExists = this.getInput('TOPTYPE'); - var bottomExists = this.getInput('BOTTOMTYPE'); - if (option == 'LEFT') { - if (!outputExists) { - this.appendValueInput('OUTPUTTYPE') - .setCheck('Type') - .appendField('output type'); - this.moveInputBefore('OUTPUTTYPE', 'COLOUR'); - } - } else if (outputExists) { - this.removeInput('OUTPUTTYPE'); - } - if (option == 'TOP' || option == 'BOTH') { - if (!topExists) { - this.appendValueInput('TOPTYPE') - .setCheck('Type') - .appendField('top type'); - this.moveInputBefore('TOPTYPE', 'COLOUR'); - } - } else if (topExists) { - this.removeInput('TOPTYPE'); - } - if (option == 'BOTTOM' || option == 'BOTH') { - if (!bottomExists) { - this.appendValueInput('BOTTOMTYPE') - .setCheck('Type') - .appendField('bottom type'); - this.moveInputBefore('BOTTOMTYPE', 'COLOUR'); - } - } else if (bottomExists) { - this.removeInput('BOTTOMTYPE'); - } - } -}; - -var ALIGNMENT_OPTIONS = - [['left', 'LEFT'], ['right', 'RIGHT'], ['centre', 'CENTRE']]; - -Blockly.Blocks['input_value'] = { - // Value input. - init: function() { - this.setColour(210); - this.appendDummyInput() - .appendField('value input') - .appendField(new Blockly.FieldTextInput('NAME'), 'INPUTNAME'); - this.appendStatementInput('FIELDS') - .setCheck('Field') - .appendField('fields') - .appendField(new Blockly.FieldDropdown(ALIGNMENT_OPTIONS), 'ALIGN'); - this.appendValueInput('TYPE') - .setCheck('Type') - .setAlign(Blockly.ALIGN_RIGHT) - .appendField('type'); - this.setPreviousStatement(true, 'Input'); - this.setNextStatement(true, 'Input'); - this.setTooltip('A value socket for horizontal connections.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=71'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - inputNameCheck(this); - } -}; - -Blockly.Blocks['input_statement'] = { - // Statement input. - init: function() { - this.setColour(210); - this.appendDummyInput() - .appendField('statement input') - .appendField(new Blockly.FieldTextInput('NAME'), 'INPUTNAME'); - this.appendStatementInput('FIELDS') - .setCheck('Field') - .appendField('fields') - .appendField(new Blockly.FieldDropdown(ALIGNMENT_OPTIONS), 'ALIGN'); - this.appendValueInput('TYPE') - .setCheck('Type') - .setAlign(Blockly.ALIGN_RIGHT) - .appendField('type'); - this.setPreviousStatement(true, 'Input'); - this.setNextStatement(true, 'Input'); - this.setTooltip('A statement socket for enclosed vertical stacks.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=246'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - inputNameCheck(this); - } -}; - -Blockly.Blocks['input_dummy'] = { - // Dummy input. - init: function() { - this.setColour(210); - this.appendDummyInput() - .appendField('dummy input'); - this.appendStatementInput('FIELDS') - .setCheck('Field') - .appendField('fields') - .appendField(new Blockly.FieldDropdown(ALIGNMENT_OPTIONS), 'ALIGN'); - this.setPreviousStatement(true, 'Input'); - this.setNextStatement(true, 'Input'); - this.setTooltip('For adding fields on a separate row with no ' + - 'connections. Alignment options (left, right, centre) ' + - 'apply only to multi-line fields.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=293'); - } -}; - -Blockly.Blocks['field_static'] = { - // Text value. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('text') - .appendField(new Blockly.FieldTextInput(''), 'TEXT'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('Static text that serves as a label.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=88'); - } -}; - -Blockly.Blocks['field_input'] = { - // Text input. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('text input') - .appendField(new Blockly.FieldTextInput('default'), 'TEXT') - .appendField(',') - .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('An input field for the user to enter text.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=319'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - fieldNameCheck(this); - } -}; - -Blockly.Blocks['field_angle'] = { - // Angle input. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('angle input') - .appendField(new Blockly.FieldAngle('90'), 'ANGLE') - .appendField(',') - .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('An input field for the user to enter an angle.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=372'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - fieldNameCheck(this); - } -}; - -Blockly.Blocks['field_dropdown'] = { - // Dropdown menu. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('dropdown') - .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); - this.appendDummyInput('OPTION0') - .appendField(new Blockly.FieldTextInput('option'), 'USER0') - .appendField(',') - .appendField(new Blockly.FieldTextInput('OPTIONNAME'), 'CPU0'); - this.appendDummyInput('OPTION1') - .appendField(new Blockly.FieldTextInput('option'), 'USER1') - .appendField(',') - .appendField(new Blockly.FieldTextInput('OPTIONNAME'), 'CPU1'); - this.appendDummyInput('OPTION2') - .appendField(new Blockly.FieldTextInput('option'), 'USER2') - .appendField(',') - .appendField(new Blockly.FieldTextInput('OPTIONNAME'), 'CPU2'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setMutator(new Blockly.Mutator(['field_dropdown_option'])); - this.setTooltip('Dropdown menu with a list of options.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=386'); - this.optionCount_ = 3; - }, - mutationToDom: function(workspace) { - var container = document.createElement('mutation'); - container.setAttribute('options', this.optionCount_); - return container; - }, - domToMutation: function(container) { - for (var x = 0; x < this.optionCount_; x++) { - this.removeInput('OPTION' + x); - } - this.optionCount_ = parseInt(container.getAttribute('options'), 10); - for (var x = 0; x < this.optionCount_; x++) { - var input = this.appendDummyInput('OPTION' + x); - input.appendField(new Blockly.FieldTextInput('option'), 'USER' + x); - input.appendField(','); - input.appendField(new Blockly.FieldTextInput('OPTIONNAME'), 'CPU' + x); - } - }, - decompose: function(workspace) { - var containerBlock = - Blockly.Block.obtain(workspace, 'field_dropdown_container'); - containerBlock.initSvg(); - var connection = containerBlock.getInput('STACK').connection; - for (var x = 0; x < this.optionCount_; x++) { - var optionBlock = - Blockly.Block.obtain(workspace, 'field_dropdown_option'); - optionBlock.initSvg(); - connection.connect(optionBlock.previousConnection); - connection = optionBlock.nextConnection; - } - return containerBlock; - }, - compose: function(containerBlock) { - // Disconnect all input blocks and remove all inputs. - for (var x = this.optionCount_ - 1; x >= 0; x--) { - this.removeInput('OPTION' + x); - } - this.optionCount_ = 0; - // Rebuild the block's inputs. - var optionBlock = containerBlock.getInputTargetBlock('STACK'); - while (optionBlock) { - this.appendDummyInput('OPTION' + this.optionCount_) - .appendField(new Blockly.FieldTextInput( - optionBlock.userData_ || 'option'), 'USER' + this.optionCount_) - .appendField(',') - .appendField(new Blockly.FieldTextInput( - optionBlock.cpuData_ || 'OPTIONNAME'), 'CPU' + this.optionCount_); - this.optionCount_++; - optionBlock = optionBlock.nextConnection && - optionBlock.nextConnection.targetBlock(); - } - }, - saveConnections: function(containerBlock) { - // Store names and values for each option. - var optionBlock = containerBlock.getInputTargetBlock('STACK'); - var x = 0; - while (optionBlock) { - optionBlock.userData_ = this.getFieldValue('USER' + x); - optionBlock.cpuData_ = this.getFieldValue('CPU' + x); - x++; - optionBlock = optionBlock.nextConnection && - optionBlock.nextConnection.targetBlock(); - } - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - if (this.optionCount_ < 1) { - this.setWarningText('Drop down menu must\nhave at least one option.'); - } else { - fieldNameCheck(this); - } - } -}; - -Blockly.Blocks['field_dropdown_container'] = { - // Container. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('add options'); - this.appendStatementInput('STACK'); - this.setTooltip('Add, remove, or reorder options\n' + - 'to reconfigure this dropdown menu.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=386'); - this.contextMenu = false; - } -}; - -Blockly.Blocks['field_dropdown_option'] = { - // Add option. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('option'); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setTooltip('Add a new option to the dropdown menu.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=386'); - this.contextMenu = false; - } -}; - -Blockly.Blocks['field_checkbox'] = { - // Checkbox. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('checkbox') - .appendField(new Blockly.FieldCheckbox('TRUE'), 'CHECKED') - .appendField(',') - .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('Checkbox field.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=485'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - fieldNameCheck(this); - } -}; - -Blockly.Blocks['field_colour'] = { - // Colour input. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('colour') - .appendField(new Blockly.FieldColour('#ff0000'), 'COLOUR') - .appendField(',') - .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('Colour input field.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=495'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - fieldNameCheck(this); - } -}; - -Blockly.Blocks['field_date'] = { - // Date input. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('date') - .appendField(new Blockly.FieldDate(), 'DATE') - .appendField(',') - .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('Date input field.'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - fieldNameCheck(this); - } -}; - -Blockly.Blocks['field_variable'] = { - // Dropdown for variables. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('variable') - .appendField(new Blockly.FieldTextInput('item'), 'TEXT') - .appendField(',') - .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('Dropdown menu for variable names.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=510'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - fieldNameCheck(this); - } -}; - -Blockly.Blocks['field_image'] = { - // Image. - init: function() { - this.setColour(160); - var src = 'https://www.gstatic.com/codesite/ph/images/star_on.gif'; - this.appendDummyInput() - .appendField('image') - .appendField(new Blockly.FieldTextInput(src), 'SRC'); - this.appendDummyInput() - .appendField('width') - .appendField(new Blockly.FieldTextInput('15', - Blockly.FieldTextInput.numberValidator), 'WIDTH') - .appendField('height') - .appendField(new Blockly.FieldTextInput('15', - Blockly.FieldTextInput.numberValidator), 'HEIGHT') - .appendField('alt text') - .appendField(new Blockly.FieldTextInput('*'), 'ALT'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('Static image (JPEG, PNG, GIF, SVG, BMP).\n' + - 'Retains aspect ratio regardless of height and width.\n' + - 'Alt text is for when collapsed.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=567'); - } -}; - -Blockly.Blocks['type_group'] = { - // Group of types. - init: function() { - this.setColour(230); - this.appendValueInput('TYPE0') - .setCheck('Type') - .appendField('any of'); - this.appendValueInput('TYPE1') - .setCheck('Type'); - this.setOutput(true, 'Type'); - this.setMutator(new Blockly.Mutator(['type_group_item'])); - this.setTooltip('Allows more than one type to be accepted.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=677'); - this.typeCount_ = 2; - }, - mutationToDom: function(workspace) { - var container = document.createElement('mutation'); - container.setAttribute('types', this.typeCount_); - return container; - }, - domToMutation: function(container) { - for (var x = 0; x < this.typeCount_; x++) { - this.removeInput('TYPE' + x); - } - this.typeCount_ = parseInt(container.getAttribute('types'), 10); - for (var x = 0; x < this.typeCount_; x++) { - var input = this.appendValueInput('TYPE' + x) - .setCheck('Type'); - if (x == 0) { - input.appendField('any of'); - } - } - }, - decompose: function(workspace) { - var containerBlock = - Blockly.Block.obtain(workspace, 'type_group_container'); - containerBlock.initSvg(); - var connection = containerBlock.getInput('STACK').connection; - for (var x = 0; x < this.typeCount_; x++) { - var typeBlock = Blockly.Block.obtain(workspace, 'type_group_item'); - typeBlock.initSvg(); - connection.connect(typeBlock.previousConnection); - connection = typeBlock.nextConnection; - } - return containerBlock; - }, - compose: function(containerBlock) { - // Disconnect all input blocks and remove all inputs. - for (var x = this.typeCount_ - 1; x >= 0; x--) { - this.removeInput('TYPE' + x); - } - this.typeCount_ = 0; - // Rebuild the block's inputs. - var typeBlock = containerBlock.getInputTargetBlock('STACK'); - while (typeBlock) { - var input = this.appendValueInput('TYPE' + this.typeCount_) - .setCheck('Type'); - if (this.typeCount_ == 0) { - input.appendField('any of'); - } - // Reconnect any child blocks. - if (typeBlock.valueConnection_) { - input.connection.connect(typeBlock.valueConnection_); - } - this.typeCount_++; - typeBlock = typeBlock.nextConnection && - typeBlock.nextConnection.targetBlock(); - } - }, - saveConnections: function(containerBlock) { - // Store a pointer to any connected child blocks. - var typeBlock = containerBlock.getInputTargetBlock('STACK'); - var x = 0; - while (typeBlock) { - var input = this.getInput('TYPE' + x); - typeBlock.valueConnection_ = input && input.connection.targetConnection; - x++; - typeBlock = typeBlock.nextConnection && - typeBlock.nextConnection.targetBlock(); - } - } -}; - -Blockly.Blocks['type_group_container'] = { - // Container. - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('add types'); - this.appendStatementInput('STACK'); - this.setTooltip('Add, or remove allowed type.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=677'); - this.contextMenu = false; - } -}; - -Blockly.Blocks['type_group_item'] = { - // Add type. - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('type'); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setTooltip('Add a new allowed type.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=677'); - this.contextMenu = false; - } -}; - -Blockly.Blocks['type_null'] = { - // Null type. - valueType: null, - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('any'); - this.setOutput(true, 'Type'); - this.setTooltip('Any type is allowed.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=602'); - } -}; - -Blockly.Blocks['type_boolean'] = { - // Boolean type. - valueType: 'Boolean', - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('boolean'); - this.setOutput(true, 'Type'); - this.setTooltip('Booleans (true/false) are allowed.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=602'); - } -}; - -Blockly.Blocks['type_number'] = { - // Number type. - valueType: 'Number', - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('number'); - this.setOutput(true, 'Type'); - this.setTooltip('Numbers (int/float) are allowed.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=602'); - } -}; - -Blockly.Blocks['type_string'] = { - // String type. - valueType: 'String', - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('string'); - this.setOutput(true, 'Type'); - this.setTooltip('Strings (text) are allowed.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=602'); - } -}; - -Blockly.Blocks['type_list'] = { - // List type. - valueType: 'Array', - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('list'); - this.setOutput(true, 'Type'); - this.setTooltip('Arrays (lists) are allowed.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=602'); - } -}; - -Blockly.Blocks['type_other'] = { - // Other type. - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('other') - .appendField(new Blockly.FieldTextInput(''), 'TYPE'); - this.setOutput(true, 'Type'); - this.setTooltip('Custom type to allow.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=702'); - } -}; - -Blockly.Blocks['colour_hue'] = { - // Set the colour of the block. - init: function() { - this.appendDummyInput() - .appendField('hue:') - .appendField(new Blockly.FieldAngle('0', this.validator), 'HUE'); - this.setOutput(true, 'Colour'); - this.setTooltip('Paint the block with this colour.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=55'); - }, - validator: function(text) { - // Update the current block's colour to match. - this.sourceBlock_.setColour(text); - }, - mutationToDom: function(workspace) { - var container = document.createElement('mutation'); - container.setAttribute('colour', this.getColour()); - return container; - }, - domToMutation: function(container) { - this.setColour(container.getAttribute('colour')); - } -}; - -/** - * Check to see if more than one field has this name. - * Highly inefficient (On^2), but n is small. - * @param {!Blockly.Block} referenceBlock Block to check. - */ -function fieldNameCheck(referenceBlock) { - var name = referenceBlock.getFieldValue('FIELDNAME').toLowerCase(); - var count = 0; - var blocks = referenceBlock.workspace.getAllBlocks(); - for (var x = 0, block; block = blocks[x]; x++) { - var otherName = block.getFieldValue('FIELDNAME'); - if (!block.disabled && !block.getInheritedDisabled() && - otherName && otherName.toLowerCase() == name) { - count++; - } - } - var msg = (count > 1) ? - 'There are ' + count + ' field blocks\n with this name.' : null; - referenceBlock.setWarningText(msg); -} - -/** - * Check to see if more than one input has this name. - * Highly inefficient (On^2), but n is small. - * @param {!Blockly.Block} referenceBlock Block to check. - */ -function inputNameCheck(referenceBlock) { - var name = referenceBlock.getFieldValue('INPUTNAME').toLowerCase(); - var count = 0; - var blocks = referenceBlock.workspace.getAllBlocks(); - for (var x = 0, block; block = blocks[x]; x++) { - var otherName = block.getFieldValue('INPUTNAME'); - if (!block.disabled && !block.getInheritedDisabled() && - otherName && otherName.toLowerCase() == name) { - count++; - } - } - var msg = (count > 1) ? - 'There are ' + count + ' input blocks\n with this name.' : null; - referenceBlock.setWarningText(msg); -} diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/blockfactory/factory.js b/src/opsoro/apps/visual_programming/static/blockly/demos/blockfactory/factory.js deleted file mode 100644 index 649a895..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/blockfactory/factory.js +++ /dev/null @@ -1,790 +0,0 @@ -/** - * Blockly Demos: Block Factory - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview JavaScript for Blockly's Block Factory application. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * Workspace for user to build block. - * @type {Blockly.Workspace} - */ -var mainWorkspace = null; - -/** - * Workspace for preview of block. - * @type {Blockly.Workspace} - */ -var previewWorkspace = null; - -/** - * Name of block if not named. - */ -var UNNAMED = 'unnamed'; - -/** - * Change the language code format. - */ -function formatChange() { - var mask = document.getElementById('blocklyMask'); - var languagePre = document.getElementById('languagePre'); - var languageTA = document.getElementById('languageTA'); - if (document.getElementById('format').value == 'Manual') { - Blockly.hideChaff(); - mask.style.display = 'block'; - languagePre.style.display = 'none'; - languageTA.style.display = 'block'; - var code = languagePre.textContent.trim(); - languageTA.value = code; - languageTA.focus(); - updatePreview(); - } else { - mask.style.display = 'none'; - languageTA.style.display = 'none'; - languagePre.style.display = 'block'; - updateLanguage(); - } - disableEnableLink(); -} - -/** - * Update the language code based on constructs made in Blockly. - */ -function updateLanguage() { - var rootBlock = getRootBlock(); - if (!rootBlock) { - return; - } - var blockType = rootBlock.getFieldValue('NAME').trim().toLowerCase(); - if (!blockType) { - blockType = UNNAMED; - } - blockType = blockType.replace(/\W/g, '_').replace(/^(\d)/, '_\\1'); - switch (document.getElementById('format').value) { - case 'JSON': - var code = formatJson_(blockType, rootBlock); - break; - case 'JavaScript': - var code = formatJavaScript_(blockType, rootBlock); - break; - } - injectCode(code, 'languagePre'); - updatePreview(); -} - -/** - * Update the language code as JSON. - * @param {string} blockType Name of block. - * @param {!Blockly.Block} rootBlock Factory_base block. - * @return {string} Generanted language code. - * @private - */ -function formatJson_(blockType, rootBlock) { - var JS = {}; - // ID is not used by Blockly, but may be used by a loader. - JS.id = blockType; - // Generate inputs. - var message = []; - var args = []; - var contentsBlock = rootBlock.getInputTargetBlock('INPUTS'); - var lastInput = null; - while (contentsBlock) { - if (!contentsBlock.disabled && !contentsBlock.getInheritedDisabled()) { - var fields = getFieldsJson_(contentsBlock.getInputTargetBlock('FIELDS')); - for (var i = 0; i < fields.length; i++) { - if (typeof fields[i] == 'string') { - message.push(fields[i].replace(/%/g, '%%')); - } else { - args.push(fields[i]); - message.push('%' + args.length); - } - } - - var input = {type: contentsBlock.type}; - // Dummy inputs don't have names. Other inputs do. - if (contentsBlock.type != 'input_dummy') { - input.name = contentsBlock.getFieldValue('INPUTNAME'); - } - var check = JSON.parse(getOptTypesFrom(contentsBlock, 'TYPE') || 'null'); - if (check) { - input.check = check; - } - var align = contentsBlock.getFieldValue('ALIGN'); - if (align != 'LEFT') { - input.align = align; - } - args.push(input); - message.push('%' + args.length); - lastInput = contentsBlock; - } - contentsBlock = contentsBlock.nextConnection && - contentsBlock.nextConnection.targetBlock(); - } - // Remove last input if dummy and not empty. - if (lastInput && lastInput.type == 'input_dummy') { - var fields = lastInput.getInputTargetBlock('FIELDS'); - if (fields && getFieldsJson_(fields).join('').trim() != '') { - var align = lastInput.getFieldValue('ALIGN'); - if (align != 'LEFT') { - JS.lastDummyAlign0 = align; - } - args.pop(); - message.pop(); - } - } - JS.message0 = message.join(' '); - JS.args0 = args; - // Generate inline/external switch. - if (rootBlock.getFieldValue('INLINE') == 'EXT') { - JS.inputsInline = false; - } else if (rootBlock.getFieldValue('INLINE') == 'INT') { - JS.inputsInline = true; - } - // Generate output, or next/previous connections. - switch (rootBlock.getFieldValue('CONNECTIONS')) { - case 'LEFT': - JS.output = - JSON.parse(getOptTypesFrom(rootBlock, 'OUTPUTTYPE') || 'null'); - break; - case 'BOTH': - JS.previousStatement = - JSON.parse(getOptTypesFrom(rootBlock, 'TOPTYPE') || 'null'); - JS.nextStatement = - JSON.parse(getOptTypesFrom(rootBlock, 'BOTTOMTYPE') || 'null'); - break; - case 'TOP': - JS.previousStatement = - JSON.parse(getOptTypesFrom(rootBlock, 'TOPTYPE') || 'null'); - break; - case 'BOTTOM': - JS.nextStatement = - JSON.parse(getOptTypesFrom(rootBlock, 'BOTTOMTYPE') || 'null'); - break; - } - // Generate colour. - var colourBlock = rootBlock.getInputTargetBlock('COLOUR'); - if (colourBlock && !colourBlock.disabled) { - var hue = parseInt(colourBlock.getFieldValue('HUE'), 10); - JS.colour = hue; - } - JS.tooltip = ''; - JS.helpUrl = 'http://www.example.com/'; - return JSON.stringify(JS, null, ' '); -} - -/** - * Update the language code as JavaScript. - * @param {string} blockType Name of block. - * @param {!Blockly.Block} rootBlock Factory_base block. - * @return {string} Generanted language code. - * @private - */ -function formatJavaScript_(blockType, rootBlock) { - var code = []; - code.push("Blockly.Blocks['" + blockType + "'] = {"); - code.push(" init: function() {"); - // Generate inputs. - var TYPES = {'input_value': 'appendValueInput', - 'input_statement': 'appendStatementInput', - 'input_dummy': 'appendDummyInput'}; - var contentsBlock = rootBlock.getInputTargetBlock('INPUTS'); - while (contentsBlock) { - if (!contentsBlock.disabled && !contentsBlock.getInheritedDisabled()) { - var name = ''; - // Dummy inputs don't have names. Other inputs do. - if (contentsBlock.type != 'input_dummy') { - name = escapeString(contentsBlock.getFieldValue('INPUTNAME')); - } - code.push(' this.' + TYPES[contentsBlock.type] + '(' + name + ')'); - var check = getOptTypesFrom(contentsBlock, 'TYPE'); - if (check) { - code.push(' .setCheck(' + check + ')'); - } - var align = contentsBlock.getFieldValue('ALIGN'); - if (align != 'LEFT') { - code.push(' .setAlign(Blockly.ALIGN_' + align + ')'); - } - var fields = getFieldsJs_(contentsBlock.getInputTargetBlock('FIELDS')); - for (var i = 0; i < fields.length; i++) { - code.push(' .appendField(' + fields[i] + ')'); - } - // Add semicolon to last line to finish the statement. - code[code.length - 1] += ';'; - } - contentsBlock = contentsBlock.nextConnection && - contentsBlock.nextConnection.targetBlock(); - } - // Generate inline/external switch. - if (rootBlock.getFieldValue('INLINE') == 'EXT') { - code.push(' this.setInputsInline(false);'); - } else if (rootBlock.getFieldValue('INLINE') == 'INT') { - code.push(' this.setInputsInline(true);'); - } - // Generate output, or next/previous connections. - switch (rootBlock.getFieldValue('CONNECTIONS')) { - case 'LEFT': - code.push(connectionLineJs_('setOutput', 'OUTPUTTYPE')); - break; - case 'BOTH': - code.push(connectionLineJs_('setPreviousStatement', 'TOPTYPE')); - code.push(connectionLineJs_('setNextStatement', 'BOTTOMTYPE')); - break; - case 'TOP': - code.push(connectionLineJs_('setPreviousStatement', 'TOPTYPE')); - break; - case 'BOTTOM': - code.push(connectionLineJs_('setNextStatement', 'BOTTOMTYPE')); - break; - } - // Generate colour. - var colourBlock = rootBlock.getInputTargetBlock('COLOUR'); - if (colourBlock && !colourBlock.disabled) { - var hue = parseInt(colourBlock.getFieldValue('HUE'), 10); - code.push(' this.setColour(' + hue + ');'); - } - code.push(" this.setTooltip('');"); - code.push(" this.setHelpUrl('http://www.example.com/');"); - code.push(' }'); - code.push('};'); - return code.join('\n'); -} - -/** - * Create JS code required to create a top, bottom, or value connection. - * @param {string} functionName JavaScript function name. - * @param {string} typeName Name of type input. - * @return {string} Line of JavaScript code to create connection. - * @private - */ -function connectionLineJs_(functionName, typeName) { - var type = getOptTypesFrom(getRootBlock(), typeName); - if (type) { - type = ', ' + type; - } else { - type = ''; - } - return ' this.' + functionName + '(true' + type + ');'; -} - -/** - * Returns field strings and any config. - * @param {!Blockly.Block} block Input block. - * @return {!Array.} Field strings. - * @private - */ -function getFieldsJs_(block) { - var fields = []; - while (block) { - if (!block.disabled && !block.getInheritedDisabled()) { - switch (block.type) { - case 'field_static': - // Result: 'hello' - fields.push(escapeString(block.getFieldValue('TEXT'))); - break; - case 'field_input': - // Result: new Blockly.FieldTextInput('Hello'), 'GREET' - fields.push('new Blockly.FieldTextInput(' + - escapeString(block.getFieldValue('TEXT')) + '), ' + - escapeString(block.getFieldValue('FIELDNAME'))); - break; - case 'field_angle': - // Result: new Blockly.FieldAngle(90), 'ANGLE' - fields.push('new Blockly.FieldAngle(' + - escapeString(block.getFieldValue('ANGLE')) + '), ' + - escapeString(block.getFieldValue('FIELDNAME'))); - break; - case 'field_checkbox': - // Result: new Blockly.FieldCheckbox('TRUE'), 'CHECK' - fields.push('new Blockly.FieldCheckbox(' + - escapeString(block.getFieldValue('CHECKED')) + '), ' + - escapeString(block.getFieldValue('FIELDNAME'))); - break; - case 'field_colour': - // Result: new Blockly.FieldColour('#ff0000'), 'COLOUR' - fields.push('new Blockly.FieldColour(' + - escapeString(block.getFieldValue('COLOUR')) + '), ' + - escapeString(block.getFieldValue('FIELDNAME'))); - break; - case 'field_date': - // Result: new Blockly.FieldDate('2015-02-04'), 'DATE' - fields.push('new Blockly.FieldDate(' + - escapeString(block.getFieldValue('DATE')) + '), ' + - escapeString(block.getFieldValue('FIELDNAME'))); - break; - case 'field_variable': - // Result: new Blockly.FieldVariable('item'), 'VAR' - var varname = escapeString(block.getFieldValue('TEXT') || null); - fields.push('new Blockly.FieldVariable(' + varname + '), ' + - escapeString(block.getFieldValue('FIELDNAME'))); - break; - case 'field_dropdown': - // Result: - // new Blockly.FieldDropdown([['yes', '1'], ['no', '0']]), 'TOGGLE' - var options = []; - for (var i = 0; i < block.optionCount_; i++) { - options[i] = '[' + escapeString(block.getFieldValue('USER' + i)) + - ', ' + escapeString(block.getFieldValue('CPU' + i)) + ']'; - } - if (options.length) { - fields.push('new Blockly.FieldDropdown([' + - options.join(', ') + ']), ' + - escapeString(block.getFieldValue('FIELDNAME'))); - } - break; - case 'field_image': - // Result: new Blockly.FieldImage('http://...', 80, 60) - var src = escapeString(block.getFieldValue('SRC')); - var width = Number(block.getFieldValue('WIDTH')); - var height = Number(block.getFieldValue('HEIGHT')); - var alt = escapeString(block.getFieldValue('ALT')); - fields.push('new Blockly.FieldImage(' + - src + ', ' + width + ', ' + height + ', ' + alt + ')'); - break; - } - } - block = block.nextConnection && block.nextConnection.targetBlock(); - } - return fields; -} - -/** - * Returns field strings and any config. - * @param {!Blockly.Block} block Input block. - * @return {!Array.} Array of static text and field configs. - * @private - */ -function getFieldsJson_(block) { - var fields = []; - while (block) { - if (!block.disabled && !block.getInheritedDisabled()) { - switch (block.type) { - case 'field_static': - // Result: 'hello' - fields.push(block.getFieldValue('TEXT')); - break; - case 'field_input': - fields.push({ - type: block.type, - name: block.getFieldValue('FIELDNAME'), - text: block.getFieldValue('TEXT') - }); - break; - case 'field_angle': - fields.push({ - type: block.type, - name: block.getFieldValue('FIELDNAME'), - angle: Number(block.getFieldValue('ANGLE')) - }); - break; - case 'field_checkbox': - fields.push({ - type: block.type, - name: block.getFieldValue('FIELDNAME'), - checked: block.getFieldValue('CHECKED') == 'TRUE' - }); - break; - case 'field_colour': - fields.push({ - type: block.type, - name: block.getFieldValue('FIELDNAME'), - colour: block.getFieldValue('COLOUR') - }); - break; - case 'field_date': - fields.push({ - type: block.type, - name: block.getFieldValue('FIELDNAME'), - date: block.getFieldValue('DATE') - }); - break; - case 'field_variable': - fields.push({ - type: block.type, - name: block.getFieldValue('FIELDNAME'), - variable: block.getFieldValue('TEXT') || null - }); - break; - case 'field_dropdown': - var options = []; - for (var i = 0; i < block.optionCount_; i++) { - options[i] = [block.getFieldValue('USER' + i), - block.getFieldValue('CPU' + i)]; - } - if (options.length) { - fields.push({ - type: block.type, - name: block.getFieldValue('FIELDNAME'), - options: options - }); - } - break; - case 'field_image': - fields.push({ - type: block.type, - src: block.getFieldValue('SRC'), - width: Number(block.getFieldValue('WIDTH')), - height: Number(block.getFieldValue('HEIGHT')), - alt: block.getFieldValue('ALT') - }); - break; - } - } - block = block.nextConnection && block.nextConnection.targetBlock(); - } - return fields; -} - -/** - * Escape a string. - * @param {string} string String to escape. - * @return {string} Escaped string surrouned by quotes. - */ -function escapeString(string) { - return JSON.stringify(string); -} - -/** - * Fetch the type(s) defined in the given input. - * Format as a string for appending to the generated code. - * @param {!Blockly.Block} block Block with input. - * @param {string} name Name of the input. - * @return {?string} String defining the types. - */ -function getOptTypesFrom(block, name) { - var types = getTypesFrom_(block, name); - if (types.length == 0) { - return undefined; - } else if (types.indexOf('null') != -1) { - return 'null'; - } else if (types.length == 1) { - return types[0]; - } else { - return '[' + types.join(', ') + ']'; - } -} - -/** - * Fetch the type(s) defined in the given input. - * @param {!Blockly.Block} block Block with input. - * @param {string} name Name of the input. - * @return {!Array.} List of types. - * @private - */ -function getTypesFrom_(block, name) { - var typeBlock = block.getInputTargetBlock(name); - var types; - if (!typeBlock || typeBlock.disabled) { - types = []; - } else if (typeBlock.type == 'type_other') { - types = [escapeString(typeBlock.getFieldValue('TYPE'))]; - } else if (typeBlock.type == 'type_group') { - types = []; - for (var n = 0; n < typeBlock.typeCount_; n++) { - types = types.concat(getTypesFrom_(typeBlock, 'TYPE' + n)); - } - // Remove duplicates. - var hash = Object.create(null); - for (var n = types.length - 1; n >= 0; n--) { - if (hash[types[n]]) { - types.splice(n, 1); - } - hash[types[n]] = true; - } - } else { - types = [escapeString(typeBlock.valueType)]; - } - return types; -} - -/** - * Update the generator code. - * @param {!Blockly.Block} block Rendered block in preview workspace. - */ -function updateGenerator(block) { - function makeVar(root, name) { - name = name.toLowerCase().replace(/\W/g, '_'); - return ' var ' + root + '_' + name; - } - var language = document.getElementById('language').value; - var code = []; - code.push("Blockly." + language + "['" + block.type + - "'] = function(block) {"); - - // Generate getters for any fields or inputs. - for (var i = 0, input; input = block.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - var name = field.name; - if (!name) { - continue; - } - if (field instanceof Blockly.FieldVariable) { - // Subclass of Blockly.FieldDropdown, must test first. - code.push(makeVar('variable', name) + - " = Blockly." + language + - ".variableDB_.getName(block.getFieldValue('" + name + - "'), Blockly.Variables.NAME_TYPE);"); - } else if (field instanceof Blockly.FieldAngle) { - // Subclass of Blockly.FieldTextInput, must test first. - code.push(makeVar('angle', name) + - " = block.getFieldValue('" + name + "');"); - } else if (Blockly.FieldDate && field instanceof Blockly.FieldDate) { - // Blockly.FieldDate may not be compiled into Blockly. - code.push(makeVar('date', name) + - " = block.getFieldValue('" + name + "');"); - } else if (field instanceof Blockly.FieldColour) { - code.push(makeVar('colour', name) + - " = block.getFieldValue('" + name + "');"); - } else if (field instanceof Blockly.FieldCheckbox) { - code.push(makeVar('checkbox', name) + - " = block.getFieldValue('" + name + "') == 'TRUE';"); - } else if (field instanceof Blockly.FieldDropdown) { - code.push(makeVar('dropdown', name) + - " = block.getFieldValue('" + name + "');"); - } else if (field instanceof Blockly.FieldTextInput) { - code.push(makeVar('text', name) + - " = block.getFieldValue('" + name + "');"); - } - } - var name = input.name; - if (name) { - if (input.type == Blockly.INPUT_VALUE) { - code.push(makeVar('value', name) + - " = Blockly." + language + ".valueToCode(block, '" + name + - "', Blockly." + language + ".ORDER_ATOMIC);"); - } else if (input.type == Blockly.NEXT_STATEMENT) { - code.push(makeVar('statements', name) + - " = Blockly." + language + ".statementToCode(block, '" + - name + "');"); - } - } - } - code.push(" // TODO: Assemble " + language + " into code variable."); - code.push(" var code = \'...\';"); - if (block.outputConnection) { - code.push(" // TODO: Change ORDER_NONE to the correct strength."); - code.push(" return [code, Blockly." + language + ".ORDER_NONE];"); - } else { - code.push(" return code;"); - } - code.push("};"); - - injectCode(code.join('\n'), 'generatorPre'); -} - -/** - * Existing direction ('ltr' vs 'rtl') of preview. - */ -var oldDir = null; - -/** - * Update the preview display. - */ -function updatePreview() { - // Toggle between LTR/RTL if needed (also used in first display). - var newDir = document.getElementById('direction').value; - if (oldDir != newDir) { - if (previewWorkspace) { - previewWorkspace.dispose(); - } - var rtl = newDir == 'rtl'; - previewWorkspace = Blockly.inject('preview', - {rtl: rtl, - media: '../../media/', - scrollbars: true}); - oldDir = newDir; - } - previewWorkspace.clear(); - - // Fetch the code and determine its format (JSON or JavaScript). - var format = document.getElementById('format').value; - if (format == 'Manual') { - var code = document.getElementById('languageTA').value; - // If the code is JSON, it will parse, otherwise treat as JS. - try { - JSON.parse(code); - format = 'JSON'; - } catch (e) { - format = 'JavaScript'; - } - } else { - var code = document.getElementById('languagePre').textContent; - } - if (!code.trim()) { - // Nothing to render. Happens while cloud storage is loading. - return; - } - - // Backup Blockly.Blocks object so that main workspace and preview don't - // collide if user creates a 'factory_base' block, for instance. - var backupBlocks = Blockly.Blocks; - try { - // Make a shallow copy. - Blockly.Blocks = {}; - for (var prop in backupBlocks) { - Blockly.Blocks[prop] = backupBlocks[prop]; - } - - if (format == 'JSON') { - var json = JSON.parse(code); - Blockly.Blocks[json.id || UNNAMED] = { - init: function() { - this.jsonInit(json); - } - }; - } else if (format == 'JavaScript') { - eval(code); - } else { - throw 'Unknown format: ' + format; - } - - // Look for a block on Blockly.Blocks that does not match the backup. - var blockType = null; - for (var type in Blockly.Blocks) { - if (typeof Blockly.Blocks[type].init == 'function' && - Blockly.Blocks[type] != backupBlocks[type]) { - blockType = type; - break; - } - } - if (!blockType) { - return; - } - - // Create the preview block. - var previewBlock = Blockly.Block.obtain(previewWorkspace, blockType); - previewBlock.initSvg(); - previewBlock.render(); - previewBlock.setMovable(false); - previewBlock.setDeletable(false); - previewBlock.moveBy(15, 10); - - updateGenerator(previewBlock); - } finally { - Blockly.Blocks = backupBlocks; - } -} - -/** - * Inject code into a pre tag, with syntax highlighting. - * Safe from HTML/script injection. - * @param {string} code Lines of code. - * @param {string} id ID of
     element to inject into.
    - */
    -function injectCode(code, id) {
    -  Blockly.removeAllRanges();
    -  var pre = document.getElementById(id);
    -  pre.textContent = code;
    -  code = pre.innerHTML;
    -  code = prettyPrintOne(code, 'js');
    -  pre.innerHTML = code;
    -}
    -
    -/**
    - * Return the uneditable container block that everything else attaches to.
    - * @return {Blockly.Block}
    - */
    -function getRootBlock() {
    -  var blocks = mainWorkspace.getTopBlocks(false);
    -  for (var i = 0, block; block = blocks[i]; i++) {
    -    if (block.type == 'factory_base') {
    -      return block;
    -    }
    -  }
    -  return null;
    -}
    -
    -/**
    - * Disable the link button if the format is 'Manual', enable otherwise.
    - */
    -function disableEnableLink() {
    -  var linkButton = document.getElementById('linkButton');
    -  linkButton.disabled = document.getElementById('format').value == 'Manual';
    -}
    -
    -/**
    - * Initialize Blockly and layout.  Called on page load.
    - */
    -function init() {
    -  if ('BlocklyStorage' in window) {
    -    BlocklyStorage.HTTPREQUEST_ERROR =
    -        'There was a problem with the request.\n';
    -    BlocklyStorage.LINK_ALERT =
    -        'Share your blocks with this link:\n\n%1';
    -    BlocklyStorage.HASH_ERROR =
    -        'Sorry, "%1" doesn\'t correspond with any saved Blockly file.';
    -    BlocklyStorage.XML_ERROR = 'Could not load your saved file.\n'+
    -        'Perhaps it was created with a different version of Blockly?';
    -    var linkButton = document.getElementById('linkButton');
    -    linkButton.style.display = 'inline-block';
    -    linkButton.addEventListener('click',
    -        function() {BlocklyStorage.link(mainWorkspace);});
    -    disableEnableLink();
    -  }
    -
    -  document.getElementById('helpButton').addEventListener('click',
    -    function() {
    -      open('https://developers.google.com/blockly/custom-blocks/block-factory',
    -           'BlockFactoryHelp');
    -    });
    -
    -  var expandList = [
    -    document.getElementById('blockly'),
    -    document.getElementById('blocklyMask'),
    -    document.getElementById('preview'),
    -    document.getElementById('languagePre'),
    -    document.getElementById('languageTA'),
    -    document.getElementById('generatorPre')
    -  ];
    -  var onresize = function(e) {
    -    for (var i = 0, expand; expand = expandList[i]; i++) {
    -      expand.style.width = (expand.parentNode.offsetWidth - 2) + 'px';
    -      expand.style.height = (expand.parentNode.offsetHeight - 2) + 'px';
    -    }
    -  };
    -  onresize();
    -  window.addEventListener('resize', onresize);
    -
    -  var toolbox = document.getElementById('toolbox');
    -  mainWorkspace = Blockly.inject('blockly',
    -      {toolbox: toolbox, media: '../../media/'});
    -
    -  // Create the root block.
    -  if ('BlocklyStorage' in window && window.location.hash.length > 1) {
    -    BlocklyStorage.retrieveXml(window.location.hash.substring(1),
    -                               mainWorkspace);
    -  } else {
    -    var xml = '';
    -    Blockly.Xml.domToWorkspace(mainWorkspace, Blockly.Xml.textToDom(xml));
    -  }
    -
    -  mainWorkspace.addChangeListener(updateLanguage);
    -  document.getElementById('direction')
    -      .addEventListener('change', updatePreview);
    -  document.getElementById('languageTA')
    -      .addEventListener('change', updatePreview);
    -  document.getElementById('languageTA')
    -      .addEventListener('keyup', updatePreview);
    -  document.getElementById('format')
    -      .addEventListener('change', formatChange);
    -  document.getElementById('language')
    -      .addEventListener('change', updatePreview);
    -}
    -window.addEventListener('load', init);
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/blockfactory/icon.png b/src/opsoro/apps/visual_programming/static/blockly/demos/blockfactory/icon.png
    deleted file mode 100644
    index d4d19b4..0000000
    Binary files a/src/opsoro/apps/visual_programming/static/blockly/demos/blockfactory/icon.png and /dev/null differ
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/blockfactory/index.html b/src/opsoro/apps/visual_programming/static/blockly/demos/blockfactory/index.html
    deleted file mode 100644
    index dfa98de..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/blockfactory/index.html
    +++ /dev/null
    @@ -1,220 +0,0 @@
    -
    -
    -
    -  
    -  
    -  Blockly Demo: Block Factory
    -  
    -  
    -  
    -  
    -  
    -  
    -  
    -  
    -
    -
    -  
    -    
    -      
    -      
    -    
    -    
    -      
    -      
    -    
    -  
    -

    Blockly > - Demos > Block Factory

    -
    - - - - - -
    -

    Preview: - -

    -
    - - - -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - -
    -
    -
    -

    Language code: - -

    -
    -
    
    -              
    -            
    -

    Generator stub: - -

    -
    -
    
    -            
    -
    - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/blockfactory/link.png b/src/opsoro/apps/visual_programming/static/blockly/demos/blockfactory/link.png deleted file mode 100644 index 11dfd82..0000000 Binary files a/src/opsoro/apps/visual_programming/static/blockly/demos/blockfactory/link.png and /dev/null differ diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/code.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/code.js deleted file mode 100644 index 846c8ce..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/code.js +++ /dev/null @@ -1,526 +0,0 @@ -/** - * Blockly Demos: Code - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview JavaScript for Blockly's Code demo. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * Create a namespace for the application. - */ -var Code = {}; - -/** - * Lookup for names of supported languages. Keys should be in ISO 639 format. - */ -Code.LANGUAGE_NAME = { - 'ar': 'العربية', - 'be-tarask': 'Taraškievica', - 'br': 'Brezhoneg', - 'ca': 'Català', - 'cs': 'Česky', - 'da': 'Dansk', - 'de': 'Deutsch', - 'el': 'Ελληνικά', - 'en': 'English', - 'es': 'Español', - 'fa': 'فارسی', - 'fr': 'Français', - 'he': 'עברית', - 'hrx': 'Hunsrik', - 'hu': 'Magyar', - 'ia': 'Interlingua', - 'is': 'Íslenska', - 'it': 'Italiano', - 'ja': '日本語', - 'ko': '한국어', - 'mk': 'Македонски', - 'ms': 'Bahasa Melayu', - 'nb': 'Norsk Bokmål', - 'nl': 'Nederlands, Vlaams', - 'oc': 'Lenga d\'òc', - 'pl': 'Polski', - 'pms': 'Piemontèis', - 'pt-br': 'Português Brasileiro', - 'ro': 'Română', - 'ru': 'Русский', - 'sc': 'Sardu', - 'sk': 'Slovenčina', - 'sr': 'Српски', - 'sv': 'Svenska', - 'th': 'ภาษาไทย', - 'tlh': 'tlhIngan Hol', - 'tr': 'Türkçe', - 'uk': 'Українська', - 'vi': 'Tiếng Việt', - 'zh-hans': '簡體中文', - 'zh-hant': '正體中文' -}; - -/** - * List of RTL languages. - */ -Code.LANGUAGE_RTL = ['ar', 'fa', 'he']; - -/** - * Blockly's main workspace. - * @type {Blockly.WorkspaceSvg} - */ -Code.workspace = null; - -/** - * Extracts a parameter from the URL. - * If the parameter is absent default_value is returned. - * @param {string} name The name of the parameter. - * @param {string} defaultValue Value to return if paramater not found. - * @return {string} The parameter value or the default value if not found. - */ -Code.getStringParamFromUrl = function(name, defaultValue) { - var val = location.search.match(new RegExp('[?&]' + name + '=([^&]+)')); - return val ? decodeURIComponent(val[1].replace(/\+/g, '%20')) : defaultValue; -}; - -/** - * Get the language of this user from the URL. - * @return {string} User's language. - */ -Code.getLang = function() { - var lang = Code.getStringParamFromUrl('lang', ''); - if (Code.LANGUAGE_NAME[lang] === undefined) { - // Default to English. - lang = 'en'; - } - return lang; -}; - -/** - * Is the current language (Code.LANG) an RTL language? - * @return {boolean} True if RTL, false if LTR. - */ -Code.isRtl = function() { - return Code.LANGUAGE_RTL.indexOf(Code.LANG) != -1; -}; - -/** - * Load blocks saved on App Engine Storage or in session/local storage. - * @param {string} defaultXml Text representation of default blocks. - */ -Code.loadBlocks = function(defaultXml) { - try { - var loadOnce = window.sessionStorage.loadOnceBlocks; - } catch(e) { - // Firefox sometimes throws a SecurityError when accessing sessionStorage. - // Restarting Firefox fixes this, so it looks like a bug. - var loadOnce = null; - } - if ('BlocklyStorage' in window && window.location.hash.length > 1) { - // An href with #key trigers an AJAX call to retrieve saved blocks. - BlocklyStorage.retrieveXml(window.location.hash.substring(1)); - } else if (loadOnce) { - // Language switching stores the blocks during the reload. - delete window.sessionStorage.loadOnceBlocks; - var xml = Blockly.Xml.textToDom(loadOnce); - Blockly.Xml.domToWorkspace(Code.workspace, xml); - } else if (defaultXml) { - // Load the editor with default starting blocks. - var xml = Blockly.Xml.textToDom(defaultXml); - Blockly.Xml.domToWorkspace(Code.workspace, xml); - } else if ('BlocklyStorage' in window) { - // Restore saved blocks in a separate thread so that subsequent - // initialization is not affected from a failed load. - window.setTimeout(BlocklyStorage.restoreBlocks, 0); - } -}; - -/** - * Save the blocks and reload with a different language. - */ -Code.changeLanguage = function() { - // Store the blocks for the duration of the reload. - // This should be skipped for the index page, which has no blocks and does - // not load Blockly. - // MSIE 11 does not support sessionStorage on file:// URLs. - if (typeof Blockly != 'undefined' && window.sessionStorage) { - var xml = Blockly.Xml.workspaceToDom(Code.workspace); - var text = Blockly.Xml.domToText(xml); - window.sessionStorage.loadOnceBlocks = text; - } - - var languageMenu = document.getElementById('languageMenu'); - var newLang = encodeURIComponent( - languageMenu.options[languageMenu.selectedIndex].value); - var search = window.location.search; - if (search.length <= 1) { - search = '?lang=' + newLang; - } else if (search.match(/[?&]lang=[^&]*/)) { - search = search.replace(/([?&]lang=)[^&]*/, '$1' + newLang); - } else { - search = search.replace(/\?/, '?lang=' + newLang + '&'); - } - - window.location = window.location.protocol + '//' + - window.location.host + window.location.pathname + search; -}; - -/** - * Bind a function to a button's click event. - * On touch enabled browsers, ontouchend is treated as equivalent to onclick. - * @param {!Element|string} el Button element or ID thereof. - * @param {!Function} func Event handler to bind. - */ -Code.bindClick = function(el, func) { - if (typeof el == 'string') { - el = document.getElementById(el); - } - el.addEventListener('click', func, true); - el.addEventListener('touchend', func, true); -}; - -/** - * Load the Prettify CSS and JavaScript. - */ -Code.importPrettify = function() { - // - // - var link = document.createElement('link'); - link.setAttribute('rel', 'stylesheet'); - link.setAttribute('href', '../prettify.css'); - document.head.appendChild(link); - var script = document.createElement('script'); - script.setAttribute('src', '../prettify.js'); - document.head.appendChild(script); -}; - -/** - * Compute the absolute coordinates and dimensions of an HTML element. - * @param {!Element} element Element to match. - * @return {!Object} Contains height, width, x, and y properties. - * @private - */ -Code.getBBox_ = function(element) { - var height = element.offsetHeight; - var width = element.offsetWidth; - var x = 0; - var y = 0; - do { - x += element.offsetLeft; - y += element.offsetTop; - element = element.offsetParent; - } while (element); - return { - height: height, - width: width, - x: x, - y: y - }; -}; - -/** - * User's language (e.g. "en"). - * @type {string} - */ -Code.LANG = Code.getLang(); - -/** - * List of tab names. - * @private - */ -Code.TABS_ = ['blocks', 'javascript', 'php', 'python', 'dart', 'xml']; - -Code.selected = 'blocks'; - -/** - * Switch the visible pane when a tab is clicked. - * @param {string} clickedName Name of tab clicked. - */ -Code.tabClick = function(clickedName) { - // If the XML tab was open, save and render the content. - if (document.getElementById('tab_xml').className == 'tabon') { - var xmlTextarea = document.getElementById('content_xml'); - var xmlText = xmlTextarea.value; - var xmlDom = null; - try { - xmlDom = Blockly.Xml.textToDom(xmlText); - } catch (e) { - var q = - window.confirm(MSG['badXml'].replace('%1', e)); - if (!q) { - // Leave the user on the XML tab. - return; - } - } - if (xmlDom) { - Code.workspace.clear(); - Blockly.Xml.domToWorkspace(Code.workspace, xmlDom); - } - } - - if (document.getElementById('tab_blocks').className == 'tabon') { - Code.workspace.setVisible(false); - } - // Deselect all tabs and hide all panes. - for (var i = 0; i < Code.TABS_.length; i++) { - var name = Code.TABS_[i]; - document.getElementById('tab_' + name).className = 'taboff'; - document.getElementById('content_' + name).style.visibility = 'hidden'; - } - - // Select the active tab. - Code.selected = clickedName; - document.getElementById('tab_' + clickedName).className = 'tabon'; - // Show the selected pane. - document.getElementById('content_' + clickedName).style.visibility = - 'visible'; - Code.renderContent(); - if (clickedName == 'blocks') { - Code.workspace.setVisible(true); - } - Blockly.fireUiEvent(window, 'resize'); -}; - -/** - * Populate the currently selected pane with content generated from the blocks. - */ -Code.renderContent = function() { - var content = document.getElementById('content_' + Code.selected); - // Initialize the pane. - if (content.id == 'content_xml') { - var xmlTextarea = document.getElementById('content_xml'); - var xmlDom = Blockly.Xml.workspaceToDom(Code.workspace); - var xmlText = Blockly.Xml.domToPrettyText(xmlDom); - xmlTextarea.value = xmlText; - xmlTextarea.focus(); - } else if (content.id == 'content_javascript') { - var code = Blockly.JavaScript.workspaceToCode(Code.workspace); - content.textContent = code; - if (typeof prettyPrintOne == 'function') { - code = content.innerHTML; - code = prettyPrintOne(code, 'js'); - content.innerHTML = code; - } - } else if (content.id == 'content_python') { - code = Blockly.Python.workspaceToCode(Code.workspace); - content.textContent = code; - if (typeof prettyPrintOne == 'function') { - code = content.innerHTML; - code = prettyPrintOne(code, 'py'); - content.innerHTML = code; - } - } else if (content.id == 'content_php') { - code = Blockly.PHP.workspaceToCode(Code.workspace); - content.textContent = code; - if (typeof prettyPrintOne == 'function') { - code = content.innerHTML; - code = prettyPrintOne(code, 'php'); - content.innerHTML = code; - } - } else if (content.id == 'content_dart') { - code = Blockly.Dart.workspaceToCode(Code.workspace); - content.textContent = code; - if (typeof prettyPrintOne == 'function') { - code = content.innerHTML; - code = prettyPrintOne(code, 'dart'); - content.innerHTML = code; - } - } -}; - -/** - * Initialize Blockly. Called on page load. - */ -Code.init = function() { - Code.initLanguage(); - - var rtl = Code.isRtl(); - var container = document.getElementById('content_area'); - var onresize = function(e) { - var bBox = Code.getBBox_(container); - for (var i = 0; i < Code.TABS_.length; i++) { - var el = document.getElementById('content_' + Code.TABS_[i]); - el.style.top = bBox.y + 'px'; - el.style.left = bBox.x + 'px'; - // Height and width need to be set, read back, then set again to - // compensate for scrollbars. - el.style.height = bBox.height + 'px'; - el.style.height = (2 * bBox.height - el.offsetHeight) + 'px'; - el.style.width = bBox.width + 'px'; - el.style.width = (2 * bBox.width - el.offsetWidth) + 'px'; - } - // Make the 'Blocks' tab line up with the toolbox. - if (Code.workspace && Code.workspace.toolbox_.width) { - document.getElementById('tab_blocks').style.minWidth = - (Code.workspace.toolbox_.width - 38) + 'px'; - // Account for the 19 pixel margin and on each side. - } - }; - onresize(); - window.addEventListener('resize', onresize, false); - - var toolbox = document.getElementById('toolbox'); - Code.workspace = Blockly.inject('content_blocks', - {grid: - {spacing: 25, - length: 3, - colour: '#ccc', - snap: true}, - media: '../../media/', - rtl: rtl, - toolbox: toolbox, - zoom: {enabled: true} - }); - - // Add to reserved word list: Local variables in execution environment (runJS) - // and the infinite loop detection function. - Blockly.JavaScript.addReservedWords('code,timeouts,checkTimeout'); - - Code.loadBlocks(''); - - if ('BlocklyStorage' in window) { - // Hook a save function onto unload. - BlocklyStorage.backupOnUnload(Code.workspace); - } - - Code.tabClick(Code.selected); - - Code.bindClick('trashButton', - function() {Code.discard(); Code.renderContent();}); - Code.bindClick('runButton', Code.runJS); - // Disable the link button if page isn't backed by App Engine storage. - var linkButton = document.getElementById('linkButton'); - if ('BlocklyStorage' in window) { - BlocklyStorage['HTTPREQUEST_ERROR'] = MSG['httpRequestError']; - BlocklyStorage['LINK_ALERT'] = MSG['linkAlert']; - BlocklyStorage['HASH_ERROR'] = MSG['hashError']; - BlocklyStorage['XML_ERROR'] = MSG['xmlError']; - Code.bindClick(linkButton, - function() {BlocklyStorage.link(Code.workspace);}); - } else if (linkButton) { - linkButton.className = 'disabled'; - } - - for (var i = 0; i < Code.TABS_.length; i++) { - var name = Code.TABS_[i]; - Code.bindClick('tab_' + name, - function(name_) {return function() {Code.tabClick(name_);};}(name)); - } - - // Lazy-load the syntax-highlighting. - window.setTimeout(Code.importPrettify, 1); -}; - -/** - * Initialize the page language. - */ -Code.initLanguage = function() { - // Set the HTML's language and direction. - var rtl = Code.isRtl(); - document.dir = rtl ? 'rtl' : 'ltr'; - document.head.parentElement.setAttribute('lang', Code.LANG); - - // Sort languages alphabetically. - var languages = []; - for (var lang in Code.LANGUAGE_NAME) { - languages.push([Code.LANGUAGE_NAME[lang], lang]); - } - var comp = function(a, b) { - // Sort based on first argument ('English', 'Русский', '简体字', etc). - if (a[0] > b[0]) return 1; - if (a[0] < b[0]) return -1; - return 0; - }; - languages.sort(comp); - // Populate the language selection menu. - var languageMenu = document.getElementById('languageMenu'); - languageMenu.options.length = 0; - for (var i = 0; i < languages.length; i++) { - var tuple = languages[i]; - var lang = tuple[tuple.length - 1]; - var option = new Option(tuple[0], lang); - if (lang == Code.LANG) { - option.selected = true; - } - languageMenu.options.add(option); - } - languageMenu.addEventListener('change', Code.changeLanguage, true); - - // Inject language strings. - document.title += ' ' + MSG['title']; - document.getElementById('title').textContent = MSG['title']; - document.getElementById('tab_blocks').textContent = MSG['blocks']; - - document.getElementById('linkButton').title = MSG['linkTooltip']; - document.getElementById('runButton').title = MSG['runTooltip']; - document.getElementById('trashButton').title = MSG['trashTooltip']; - - var categories = ['catLogic', 'catLoops', 'catMath', 'catText', 'catLists', - 'catColour', 'catVariables', 'catFunctions']; - for (var i = 0, cat; cat = categories[i]; i++) { - document.getElementById(cat).setAttribute('name', MSG[cat]); - } - var textVars = document.getElementsByClassName('textVar'); - for (var i = 0, textVar; textVar = textVars[i]; i++) { - textVar.textContent = MSG['textVariable']; - } - var listVars = document.getElementsByClassName('listVar'); - for (var i = 0, listVar; listVar = listVars[i]; i++) { - listVar.textContent = MSG['listVariable']; - } -}; - -/** - * Execute the user's code. - * Just a quick and dirty eval. Catch infinite loops. - */ -Code.runJS = function() { - Blockly.JavaScript.INFINITE_LOOP_TRAP = ' checkTimeout();\n'; - var timeouts = 0; - var checkTimeout = function() { - if (timeouts++ > 1000000) { - throw MSG['timeout']; - } - }; - var code = Blockly.JavaScript.workspaceToCode(Code.workspace); - Blockly.JavaScript.INFINITE_LOOP_TRAP = null; - try { - eval(code); - } catch (e) { - alert(MSG['badCode'].replace('%1', e)); - } -}; - -/** - * Discard all blocks from the workspace. - */ -Code.discard = function() { - var count = Code.workspace.getAllBlocks().length; - if (count < 2 || - window.confirm(MSG['discard'].replace('%1', count))) { - Code.workspace.clear(); - window.location.hash = ''; - } -}; - -// Load the Code demo's language strings. -document.write('\n'); -// Load Blockly's language strings. -document.write('\n'); - -window.addEventListener('load', Code.init); diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/icon.png b/src/opsoro/apps/visual_programming/static/blockly/demos/code/icon.png deleted file mode 100644 index e2f23bd..0000000 Binary files a/src/opsoro/apps/visual_programming/static/blockly/demos/code/icon.png and /dev/null differ diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/icons.png b/src/opsoro/apps/visual_programming/static/blockly/demos/code/icons.png deleted file mode 100644 index 7cced7a..0000000 Binary files a/src/opsoro/apps/visual_programming/static/blockly/demos/code/icons.png and /dev/null differ diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/index.html b/src/opsoro/apps/visual_programming/static/blockly/demos/code/index.html deleted file mode 100644 index 747aaa2..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/index.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - Blockly Demo: - - - - - - - - - - - - - - - - - - - - - - -
    -

    Blockly‏ > - Demos‏ > - ... -

    -
    - -
    - - - - - - - - - - - - - - - -
    ... JavaScript Python PHP Dart XML - - - -
    -
    -
    -
    -
    
    -  
    
    -  
    
    -  
    
    -  
    -
    -  
    -
    -
    -
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ar.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ar.js
    deleted file mode 100644
    index bba0f5b..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ar.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "كود",
    -  blocks: "البلوكات",
    -  linkTooltip: "احفظ ووصلة إلى البلوكات.",
    -  runTooltip: "شغل البرنامج المعرف بواسطة البلوكات في مساحة العمل.",
    -  badCode: "خطأ في البرنامج:\n %1",
    -  timeout: "تم تجاوز الحد الأقصى لتكرارات التنفيذ .",
    -  discard: "حذف كل بلوكات %1؟",
    -  trashTooltip: "تجاهل كل البلوكات.",
    -  catLogic: "منطق",
    -  catLoops: "الحلقات",
    -  catMath: "رياضيات",
    -  catText: "نص",
    -  catLists: "قوائم",
    -  catColour: "لون",
    -  catVariables: "متغيرات",
    -  catFunctions: "إجراءات",
    -  listVariable: "قائمة",
    -  textVariable: "نص",
    -  httpRequestError: "كانت هناك مشكلة مع هذا الطلب.",
    -  linkAlert: "مشاركة كود بلوكلي الخاص بك مع هذا الرابط:\n %1",
    -  hashError: "عذراً،ال '%1' لا تتوافق مع أي برنامج تم حفظه.",
    -  xmlError: "تعذر تحميل الملف المحفوظة الخاصة بك.  ربما تم إنشاؤه باستخدام إصدار مختلف من بلوكلي؟",
    -  badXml: "خطأ في توزيع ال \"XML\":\n %1\n\nحدد 'موافق' للتخلي عن التغييرات أو 'إلغاء الأمر' لمواصلة تحرير ال\"XML\"."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/be-tarask.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/be-tarask.js
    deleted file mode 100644
    index 613ecb5..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/be-tarask.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Код",
    -  blocks: "Блёкі",
    -  linkTooltip: "Захаваць і зьвязаць з блёкамі.",
    -  runTooltip: "Запусьціце праграму, вызначаную блёкамі ў працоўнай вобласьці.",
    -  badCode: "Памылка праграмы:\n%1",
    -  timeout: "Перавышана максымальная колькасьць ітэрацыяў.",
    -  discard: "Выдаліць усе блёкі %1?",
    -  trashTooltip: "Выдаліць усе блёкі.",
    -  catLogic: "Лёгіка",
    -  catLoops: "Петлі",
    -  catMath: "Матэматычныя формулы",
    -  catText: "Тэкст",
    -  catLists: "Сьпісы",
    -  catColour: "Колер",
    -  catVariables: "Зьменныя",
    -  catFunctions: "Функцыі",
    -  listVariable: "сьпіс",
    -  textVariable: "тэкст",
    -  httpRequestError: "Узьнікла праблема з запытам.",
    -  linkAlert: "Падзяліцца Вашым блёкам праз гэтую спасылку:\n\n%1",
    -  hashError: "Прабачце, '%1' не адпавядае ніводнай захаванай праграме.",
    -  xmlError: "Не атрымалася загрузіць захаваны файл. Магчыма, ён быў створаны з іншай вэрсіяй Блёклі?",
    -  badXml: "Памылка сынтаксічнага аналізу XML:\n%1\n\nАбярыце \"ОК\", каб адмовіцца ад зьменаў ці \"Скасаваць\" для далейшага рэдагаваньня XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/br.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/br.js
    deleted file mode 100644
    index 8cbbeb4..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/br.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Kod",
    -  blocks: "Bloc'hoù",
    -  linkTooltip: "Enrollañ ha liammañ d'ar bloc'hadoù.",
    -  runTooltip: "Lañsañ ar programm termenet gant ar bloc'hadoù en takad labour.",
    -  badCode: "Fazi programm :\n%1",
    -  timeout: "Tizhet eo bet an niver brasañ a iteradurioù seveniñ aotreet.",
    -  discard: "Diverkañ an holl vloc'hoù %1 ?",
    -  trashTooltip: "Disteurel an holl vloc'hoù.",
    -  catLogic: "Poell",
    -  catLoops: "Boukloù",
    -  catMath: "Matematik",
    -  catText: "Testenn",
    -  catLists: "Rolloù",
    -  catColour: "Liv",
    -  catVariables: "Argemmennoù",
    -  catFunctions: "Arc'hwelioù",
    -  listVariable: "roll",
    -  textVariable: "testenn",
    -  httpRequestError: "Ur gudenn zo gant ar reked.",
    -  linkAlert: "Rannañ ho ploc'hoù gant al liamm-mañ :\n\n%1",
    -  hashError: "Digarezit. \"%1\" ne glot gant programm enrollet ebet.",
    -  xmlError: "Ne c'haller ket kargañ ho restr enrollet. Marteze e oa bet krouet gant ur stumm disheñvel eus Blockly ?",
    -  badXml: "Fazi dielfennañ XML :\n%1\n\nDibabit \"Mat eo\" evit dilezel ar c'hemmoù-se pe \"Nullañ\" evit kemmañ an XML c'hoazh."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ca.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ca.js
    deleted file mode 100644
    index 33cf9c3..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ca.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Codi",
    -  blocks: "Blocs",
    -  linkTooltip: "Desa i enllaça als blocs.",
    -  runTooltip: "Executa el programa definit pels blocs de l'àrea de treball.",
    -  badCode: "Error de programa:\n %1",
    -  timeout: "S'ha superat el nombre màxim d'iteracions d'execució.",
    -  discard: "Esborrar els %1 blocs?",
    -  trashTooltip: "Descarta tots els blocs.",
    -  catLogic: "Lògica",
    -  catLoops: "Bucles",
    -  catMath: "Matemàtiques",
    -  catText: "Text",
    -  catLists: "Llistes",
    -  catColour: "Color",
    -  catVariables: "Variables",
    -  catFunctions: "Procediments",
    -  listVariable: "llista",
    -  textVariable: "text",
    -  httpRequestError: "Hi ha hagut un problema amb la sol·licitud.",
    -  linkAlert: "Comparteix els teus blocs amb aquest enllaç: %1",
    -  hashError: "Ho sentim, '%1' no es correspon amb cap fitxer desat de Blockly.",
    -  xmlError: "No s'ha pogut carregar el teu fitxer desat.  Potser va ser creat amb una versió diferent de Blockly?",
    -  badXml: "Error d'anàlisi XML:\n%1\n\nSeleccioneu 'Acceptar' per abandonar els vostres canvis, o 'Cancel·lar' per continuar editant l'XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/cs.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/cs.js
    deleted file mode 100644
    index b1232a6..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/cs.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Kód",
    -  blocks: "Bloky",
    -  linkTooltip: "Ulož a spoj bloky..",
    -  runTooltip: "",
    -  badCode: "Chyba programu:\n%1",
    -  timeout: "Maximum execution iterations exceeded.",
    -  discard: "Odstranit všechny bloky %1?",
    -  trashTooltip: "Zahodit všechny bloky.",
    -  catLogic: "Logika",
    -  catLoops: "Smyčky",
    -  catMath: "Matematika",
    -  catText: "Text",
    -  catLists: "Seznamy",
    -  catColour: "Barva",
    -  catVariables: "Proměnné",
    -  catFunctions: "Procedury",
    -  listVariable: "seznam",
    -  textVariable: "text",
    -  httpRequestError: "Došlo k potížím s požadavkem.",
    -  linkAlert: "Sdílej bloky tímto odkazem: \n\n%1",
    -  hashError: "Omlouváme se, '%1' nesouhlasí s žádným z uložených souborů.",
    -  xmlError: "Nepodařilo se uložit vás soubor.  Pravděpodobně byl vytvořen jinou verzí Blockly?",
    -  badXml: "Chyba parsování XML:\n%1\n\nVybrat \"OK\" pro zahození vašich změn nebo 'Cancel' k dalšímu upravování XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/da.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/da.js
    deleted file mode 100644
    index 7d5cbdf..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/da.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Kode",
    -  blocks: "Blokke",
    -  linkTooltip: "Gem og link til blokke.",
    -  runTooltip: "Kør programmet, der er defineret af blokkene i arbejdsområdet.",
    -  badCode: "Programfejl:\n%1",
    -  timeout: "Maksimale antal udførelsesgentagelser overskredet.",
    -  discard: "Slet alle %1 blokke?",
    -  trashTooltip: "Kassér alle blokke.",
    -  catLogic: "Logik",
    -  catLoops: "Løkker",
    -  catMath: "Matematik",
    -  catText: "Tekst",
    -  catLists: "Lister",
    -  catColour: "Farve",
    -  catVariables: "Variabler",
    -  catFunctions: "Funktioner",
    -  listVariable: "liste",
    -  textVariable: "tekst",
    -  httpRequestError: "Der var et problem med forespørgslen.",
    -  linkAlert: "Del dine blokke med dette link:\n\n%1",
    -  hashError: "Beklager, '%1' passer ikke med nogen gemt Blockly fil.",
    -  xmlError: "Kunne ikke hente din gemte fil.  Måske er den lavet med en anden udgave af Blockly?",
    -  badXml: "Fejl under fortolkningen af XML:\n%1\n\nVælg 'OK' for at opgive dine ændringer eller 'Afbryd' for at redigere XML-filen yderligere."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/de.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/de.js
    deleted file mode 100644
    index 2d65620..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/de.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Code",
    -  blocks: "Bausteine",
    -  linkTooltip: "Speichern und auf Bausteine verlinken.",
    -  runTooltip: "Das Programm ausführen, das von den Bausteinen im Arbeitsbereich definiert ist.",
    -  badCode: "Programmfehler:\n%1",
    -  timeout: "Die maximalen Ausführungswiederholungen wurden überschritten.",
    -  discard: "Alle %1 Bausteine löschen?",
    -  trashTooltip: "Alle Bausteine verwerfen.",
    -  catLogic: "Logik",
    -  catLoops: "Schleifen",
    -  catMath: "Mathematik",
    -  catText: "Text",
    -  catLists: "Listen",
    -  catColour: "Farbe",
    -  catVariables: "Variablen",
    -  catFunctions: "Funktionen",
    -  listVariable: "Liste",
    -  textVariable: "Text",
    -  httpRequestError: "Mit der Anfrage gab es ein Problem.",
    -  linkAlert: "Teile deine Bausteine mit diesem Link:\n\n%1",
    -  hashError: "„%1“ stimmt leider mit keinem gespeicherten Programm überein.",
    -  xmlError: "Deine gespeicherte Datei konnte nicht geladen werden. Vielleicht wurde sie mit einer anderen Version von Blockly erstellt.",
    -  badXml: "Fehler beim Parsen von XML:\n%1\n\nWähle 'OK' zum Verwerfen deiner Änderungen oder 'Abbrechen' zum weiteren Bearbeiten des XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/el.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/el.js
    deleted file mode 100644
    index 3e128ad..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/el.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Κώδικας",
    -  blocks: "Μπλοκ",
    -  linkTooltip: "Αποθηκεύει και συνδέει σε μπλοκ.",
    -  runTooltip: "Εκτελεί το πρόγραμμα που ορίζεται από τα μπλοκ στον χώρο εργασίας.",
    -  badCode: "Σφάλμα προγράμματος:\n%1",
    -  timeout: "Υπέρβαση μέγιστου αριθμού επαναλήψεων.",
    -  discard: "Να διαγραφούν και τα %1 μπλοκ?",
    -  trashTooltip: "Απόρριψη όλων των μπλοκ.",
    -  catLogic: "Λογική",
    -  catLoops: "Επαναλήψεις",
    -  catMath: "Μαθηματικά",
    -  catText: "Κείμενο",
    -  catLists: "Λίστες",
    -  catColour: "Χρώμα",
    -  catVariables: "Μεταβλητές",
    -  catFunctions: "Συναρτήσεις",
    -  listVariable: "λίστα",
    -  textVariable: "κείμενο",
    -  httpRequestError: "Υπήρξε πρόβλημα με το αίτημα.",
    -  linkAlert: "Κοινοποίησε τα μπλοκ σου με αυτόν τον σύνδεσμο:\n\n%1",
    -  hashError: "Λυπάμαι, το «%1» δεν αντιστοιχεί σε κανένα αποθηκευμένο πρόγραμμα.",
    -  xmlError: "Δεν μπορώ να φορτώσω το αποθηκευμένο αρχείο σου.  Μήπως δημιουργήθηκε από μία παλιότερη έκδοση του Blockly;",
    -  badXml: "Σφάλμα ανάλυσης XML:\n%1\n\nΕπίλεξε «Εντάξει» για να εγκαταλείψεις τις αλλαγές σου ή «Ακύρωση» για να επεξεργαστείς το XML κι άλλο."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/en.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/en.js
    deleted file mode 100644
    index 8432b75..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/en.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Code",
    -  blocks: "Blocks",
    -  linkTooltip: "Save and link to blocks.",
    -  runTooltip: "Run the program defined by the blocks in the workspace.",
    -  badCode: "Program error:\n%1",
    -  timeout: "Maximum execution iterations exceeded.",
    -  discard: "Delete all %1 blocks?",
    -  trashTooltip: "Discard all blocks.",
    -  catLogic: "Logic",
    -  catLoops: "Loops",
    -  catMath: "Math",
    -  catText: "Text",
    -  catLists: "Lists",
    -  catColour: "Colour",
    -  catVariables: "Variables",
    -  catFunctions: "Functions",
    -  listVariable: "list",
    -  textVariable: "text",
    -  httpRequestError: "There was a problem with the request.",
    -  linkAlert: "Share your blocks with this link:\n\n%1",
    -  hashError: "Sorry, '%1' doesn't correspond with any saved program.",
    -  xmlError: "Could not load your saved file. Perhaps it was created with a different version of Blockly?",
    -  badXml: "Error parsing XML:\n%1\n\nSelect 'OK' to abandon your changes or 'Cancel' to further edit the XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/es.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/es.js
    deleted file mode 100644
    index 8d60c31..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/es.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Código",
    -  blocks: "Bloques",
    -  linkTooltip: "Guarda conexión a los bloques.",
    -  runTooltip: "Ejecute el programa definido por los bloques en el área de trabajo.",
    -  badCode: "Error del programa:\n%1",
    -  timeout: "Se excedio el máximo de iteraciones ejecutadas permitidas.",
    -  discard: "¿Eliminar todos los bloques %1?",
    -  trashTooltip: "Descartar todos los bloques.",
    -  catLogic: "Lógica",
    -  catLoops: "Secuencias",
    -  catMath: "Matemáticas",
    -  catText: "Texto",
    -  catLists: "Listas",
    -  catColour: "Color",
    -  catVariables: "Variables",
    -  catFunctions: "Funciones",
    -  listVariable: "lista",
    -  textVariable: "texto",
    -  httpRequestError: "Hubo un problema con la petición.",
    -  linkAlert: "Comparte tus bloques con este enlace:\n\n%1",
    -  hashError: "«%1» no corresponde con ningún programa guardado.",
    -  xmlError: "No se pudo cargar el archivo guardado.  ¿Quizá fue creado con otra versión de Blockly?",
    -  badXml: "Error de análisis XML:\n%1\n\nSelecciona OK para abandonar tus cambios o Cancelar para seguir editando el XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/fa.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/fa.js
    deleted file mode 100644
    index f604e9f..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/fa.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "کد",
    -  blocks: "بلوک‌ها",
    -  linkTooltip: "ذخیره و پیوند به بلوک‌ها.",
    -  runTooltip: "اجرای برنامهٔ تعریف‌شده توسط بلوک‌ها در فضای کار.",
    -  badCode: "خطای برنامه:\n%1",
    -  timeout: "حداکثر تکرارهای اجرا رد شده‌است.",
    -  discard: "حذف همهٔ بلاک‌های %1؟",
    -  trashTooltip: "دورریختن همهٔ بلوک‌ها.",
    -  catLogic: "منطق",
    -  catLoops: "حلقه‌ها",
    -  catMath: "ریاضی",
    -  catText: "متن",
    -  catLists: "فهرست‌ها",
    -  catColour: "رنگ",
    -  catVariables: "متغییرها",
    -  catFunctions: "توابع",
    -  listVariable: "فهرست",
    -  textVariable: "متن",
    -  httpRequestError: "مشکلی با درخواست وجود داشت.",
    -  linkAlert: "اشتراک‌گذاری بلاک‌هایتان با این پیوند:\n\n%1",
    -  hashError: "شرمنده، «%1» با هیچ برنامهٔ ذخیره‌شده‌ای تطبیق پیدا نکرد.",
    -  xmlError: "نتوانست پروندهٔ ذخیرهٔ شما بارگیری شود.  احتمالاً با نسخهٔ متفاوتی از بلوکی درست شده‌است؟",
    -  badXml: "خطای تجزیهٔ اکس‌ام‌ال:\n%1\n\n«باشد» را برای ذخیره و «فسخ» را برای ویرایش بیشتر اکس‌ام‌ال انتخاب کنید."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/fr.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/fr.js
    deleted file mode 100644
    index 17e9147..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/fr.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Code",
    -  blocks: "Blocs",
    -  linkTooltip: "Sauvegarder et lier aux blocs.",
    -  runTooltip: "Lancer le programme défini par les blocs dans l’espace de travail.",
    -  badCode: "Erreur du programme :\n%1",
    -  timeout: "Nombre maximum d’itérations d’exécution dépassé.",
    -  discard: "Supprimer tous les %1 blocs ?",
    -  trashTooltip: "Jeter tous les blocs.",
    -  catLogic: "Logique",
    -  catLoops: "Boucles",
    -  catMath: "Math",
    -  catText: "Texte",
    -  catLists: "Listes",
    -  catColour: "Couleur",
    -  catVariables: "Variables",
    -  catFunctions: "Fonctions",
    -  listVariable: "liste",
    -  textVariable: "texte",
    -  httpRequestError: "Il y a eu un problème avec la demande.",
    -  linkAlert: "Partagez vos blocs grâce à ce lien:\n\n%1",
    -  hashError: "Désolé, '%1' ne correspond à aucun programme sauvegardé.",
    -  xmlError: "Impossible de charger le fichier de sauvegarde.  Peut être a t-il été créé avec une autre version de Blockly?",
    -  badXml: "Erreur d’analyse du XML :\n%1\n\nSélectionner 'OK' pour abandonner vos modifications ou 'Annuler' pour continuer à modifier le XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/he.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/he.js
    deleted file mode 100644
    index d11982c..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/he.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "קוד",
    -  blocks: "קטעי קוד",
    -  linkTooltip: "שמירה וקישור לקטעי קוד.",
    -  runTooltip: "הרצת התכנית שהוגדרה על ידי קטעי הקוד שבמרחב העבודה.",
    -  badCode: "שגיאה בתכנית: %1",
    -  timeout: "חריגה ממספר פעולות חוזרות אפשריות.",
    -  discard: "האם למחוק את כל %1 קטעי הקוד?",
    -  trashTooltip: "השלך את כל קטעי הקוד.",
    -  catLogic: "לוגיקה",
    -  catLoops: "לולאות",
    -  catMath: "מתמטיקה",
    -  catText: "טקסט",
    -  catLists: "רשימות",
    -  catColour: "צבע",
    -  catVariables: "משתנים",
    -  catFunctions: "פונקציות",
    -  listVariable: "רשימה",
    -  textVariable: "טקסט",
    -  httpRequestError: "הבקשה נכשלה.",
    -  linkAlert: "ניתן לשתף את קטעי הקוד שלך באמצעות קישור זה:\n\n%1",
    -  hashError: "לצערנו, '%1' איננו מתאים לאף אחת מהתוכניות השמורות",
    -  xmlError: "נסיון הטעינה של הקובץ השמור שלך נכשל. האם ייתכן שהוא נוצר בגרסא שונה של בלוקלי?",
    -  badXml: "תקלה בפענוח XML:\n\n%1\n\nנא לבחור 'אישור' כדי לנטוש את השינויים שלך או 'ביטול' כדי להמשיך ולערוך את ה־XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/hrx.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/hrx.js
    deleted file mode 100644
    index 11f790c..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/hrx.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Code",
    -  blocks: "Bausten",
    -  linkTooltip: "Speichre und auf Bausten verlinke.",
    -  runTooltip: "Das Programm ausfüahre, das von den Bausten im Oorweitsbereich definiert ist.",
    -  badCode: "Programmfehler:\n%1",
    -  timeout: "Die maximale Ausführungswiederholunge woore üwerschritt.",
    -  discard: "All %1 Bausten lösche?",
    -  trashTooltip: "All Bausten verwerfe.",
    -  catLogic: "Logik",
    -  catLoops: "Schleife",
    -  catMath: "Mathematik",
    -  catText: "Text",
    -  catLists: "Liste",
    -  catColour: "Farreb",
    -  catVariables: "Variable",
    -  catFunctions: "Funktione",
    -  listVariable: "List",
    -  textVariable: "Text",
    -  httpRequestError: "Mit der Oonfroch hots en Problem geb.",
    -  linkAlert: "Tel von dein Bausten mit dem Link:\n\n%1",
    -  hashError: "„%1“ stimmt leider mit kenem üweren gespeicherte Programm.",
    -  xmlError: "Dein gespeicherte Datei könnt net gelood sin. Vielleicht woard se mit ener annre Version von Blockly erstellt.",
    -  badXml: "Fehler beim Parse von XML:\n%1\n\nWähle 'OK' zum Verwerfe von deiner Ändrunge orrer 'Abbreche' zum XML weiter beoorbeite."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/hu.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/hu.js
    deleted file mode 100644
    index a2f2c50..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/hu.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Kódszerkesztő",
    -  blocks: "Blokkok",
    -  linkTooltip: "Hivatkozás létrehozása",
    -  runTooltip: "Program futtatása.",
    -  badCode: "Program hiba:\n%1",
    -  timeout: "A program elérte a maximális végrehajtási időt.",
    -  discard: "Az összes %1 blokk törlése?",
    -  trashTooltip: "Összes blokk törlése.",
    -  catLogic: "Logikai műveletek",
    -  catLoops: "Ciklusok",
    -  catMath: "Matematikai műveletek",
    -  catText: "Sztring műveletek",
    -  catLists: "Listakezelés",
    -  catColour: "Színek",
    -  catVariables: "Változók",
    -  catFunctions: "Eljárások",
    -  listVariable: "lista",
    -  textVariable: "szöveg",
    -  httpRequestError: "A kéréssel kapcsolatban probléma merült fel.",
    -  linkAlert: "Ezzel a hivatkozással tudod megosztani a programodat:\n\n%1",
    -  hashError: "Sajnos a '%1' hivatkozás nem tartozik egyetlen programhoz sem.",
    -  xmlError: "A programodat nem lehet betölteni.  Elképzelhető, hogy a Blockly egy másik verziójában készült?",
    -  badXml: "Hiba az XML feldolgozásakor:\n%1\n\nVáltozások elvetése?"
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ia.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ia.js
    deleted file mode 100644
    index a5557c2..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ia.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Codice",
    -  blocks: "Blocos",
    -  linkTooltip: "Salveguardar e ligar a blocos.",
    -  runTooltip: "Executar le programma definite per le blocos in le spatio de travalio.",
    -  badCode: "Error del programma:\n%1",
    -  timeout: "Le numero de iterationes executate ha excedite le maximo.",
    -  discard: "Deler tote le %1 blocos?",
    -  trashTooltip: "Abandonar tote le blocos.",
    -  catLogic: "Logica",
    -  catLoops: "Buclas",
    -  catMath: "Mathematica",
    -  catText: "Texto",
    -  catLists: "Listas",
    -  catColour: "Color",
    -  catVariables: "Variabiles",
    -  catFunctions: "Functiones",
    -  listVariable: "lista",
    -  textVariable: "texto",
    -  httpRequestError: "Il habeva un problema con le requesta.",
    -  linkAlert: "Divide tu blocos con iste ligamine:\n\n%1",
    -  hashError: "Infelicemente, '%1' non corresponde a alcun programma salveguardate.",
    -  xmlError: "Impossibile cargar le file salveguardate. Pote esser que illo ha essite create con un altere version de Blockly?",
    -  badXml: "Error de analyse del XML:\n%1\n\nSelige 'OK' pro abandonar le modificationes o 'Cancellar' pro continuar a modificar le codice XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/is.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/is.js
    deleted file mode 100644
    index b1035b1..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/is.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Kóði",
    -  blocks: "Kubbar",
    -  linkTooltip: "Vista og tengja við kubba.",
    -  runTooltip: "Keyra forritið sem kubbarnir á vinnusvæðinu mynda.",
    -  badCode: "Villa í forriti:\n%1",
    -  timeout: "Forritið hefur endurtekið sig of oft.",
    -  discard: "Eyða öllum %1 kubbunum?",
    -  trashTooltip: "Fleygja öllum kubbum.",
    -  catLogic: "Rökvísi",
    -  catLoops: "Lykkjur",
    -  catMath: "Reikningur",
    -  catText: "Texti",
    -  catLists: "Listar",
    -  catColour: "Litir",
    -  catVariables: "Breytur",
    -  catFunctions: "Stefjur",
    -  listVariable: "listi",
    -  textVariable: "texti",
    -  httpRequestError: "Það kom upp vandamál með beiðnina.",
    -  linkAlert: "Deildu kubbunum þínum með þessari krækju:",
    -  hashError: "Því miður, '%1' passar ekki við neitt vistað forrit.",
    -  xmlError: "Gat ekki hlaðið vistuðu skrána þína. Var hún kannske búin til í annarri útgáfu af Blockly?",
    -  badXml: "Villa við úrvinnslu XML:\n%1\n\nVeldu 'Í lagi' til að sleppa breytingum eða 'Hætta við' til að halda áfram með XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/it.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/it.js
    deleted file mode 100644
    index 6fba649..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/it.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Codice",
    -  blocks: "Blocchi",
    -  linkTooltip: "Salva e collega ai blocchi.",
    -  runTooltip: "Esegui il programma definito dai blocchi nell'area di lavoro.",
    -  badCode: "Errore programma:\n%1",
    -  timeout: "È stato superato il numero massimo consentito di interazioni eseguite.",
    -  discard: "Cancellare tutti i %1 blocchi?",
    -  trashTooltip: "Elimina tutti i blocchi.",
    -  catLogic: "Logica",
    -  catLoops: "Cicli",
    -  catMath: "Matematica",
    -  catText: "Testo",
    -  catLists: "Elenchi",
    -  catColour: "Colore",
    -  catVariables: "Variabili",
    -  catFunctions: "Funzioni",
    -  listVariable: "elenco",
    -  textVariable: "testo",
    -  httpRequestError: "La richiesta non è stata soddisfatta.",
    -  linkAlert: "Condividi i tuoi blocchi con questo collegamento:\n\n%1",
    -  hashError: "Mi spiace, '%1' non corrisponde ad alcun programma salvato.",
    -  xmlError: "Non è stato possibile caricare il documento.  Forse è stato creato con una versione diversa di Blockly?",
    -  badXml: "Errore durante l'analisi XML:\n%1\n\nSeleziona 'OK' per abbandonare le modifiche o 'Annulla' per continuare a modificare l'XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ja.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ja.js
    deleted file mode 100644
    index 9ff356c..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ja.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "コード",
    -  blocks: "ブロック",
    -  linkTooltip: "ブロックの状態を保存してリンクを取得します。",
    -  runTooltip: "ブロックで作成したプログラムを実行します。",
    -  badCode: "プログラムのエラー:\n%1",
    -  timeout: "命令の実行回数が制限値を超えました。",
    -  discard: "%1 個すべてのブロックを消しますか?",
    -  trashTooltip: "すべてのブロックを消します。",
    -  catLogic: "論理",
    -  catLoops: "繰り返し",
    -  catMath: "数学",
    -  catText: "テキスト",
    -  catLists: "リスト",
    -  catColour: "色",
    -  catVariables: "変数",
    -  catFunctions: "関数",
    -  listVariable: "リスト",
    -  textVariable: "テキスト",
    -  httpRequestError: "ネットワーク接続のエラーです。",
    -  linkAlert: "ブロックの状態をこのリンクで共有できます:\n\n%1",
    -  hashError: "すみません。「%1」という名前のプログラムは保存されていません。",
    -  xmlError: "保存されたファイルを読み込めませんでした。別のバージョンのブロックリーで作成された可能性があります。",
    -  badXml: "XML のエラーです:\n%1\n\nXML の変更をやめるには「OK」、編集を続けるには「キャンセル」を選んでください。"
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ko.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ko.js
    deleted file mode 100644
    index 24edd7d..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ko.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "코드",
    -  blocks: "블록",
    -  linkTooltip: "블록을 저장하고 링크를 가져옵니다.",
    -  runTooltip: "작업 공간에서 블록으로 정의된 프로그램을 실행합니다.",
    -  badCode: "프로그램 오류:\n%1",
    -  timeout: "최대 실행 반복을 초과했습니다.",
    -  discard: "모든 블록 %1개를 삭제하겠습니까?",
    -  trashTooltip: "모든 블록을 버립니다.",
    -  catLogic: "논리",
    -  catLoops: "반복",
    -  catMath: "수학",
    -  catText: "텍스트",
    -  catLists: "목록",
    -  catColour: "색",
    -  catVariables: "변수",
    -  catFunctions: "기능",
    -  listVariable: "목록",
    -  textVariable: "텍스트",
    -  httpRequestError: "요청에 문제가 있습니다.",
    -  linkAlert: "다음 링크로 블록을 공유하세요:\n\n%1",
    -  hashError: "죄송하지만 '%1'은 어떤 저장된 프로그램으로 일치하지 않습니다.",
    -  xmlError: "저장된 파일을 불러올 수 없습니다. 혹시 블록리의 다른 버전으로 만들었습니까?",
    -  badXml: "XML 구문 분석 오류:\n%1\n\n바뀜을 포기하려면 '확인'을 선택하고 XML을 더 편집하려면 '취소'를 선택하세요."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/mk.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/mk.js
    deleted file mode 100644
    index f1c58af..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/mk.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Код",
    -  blocks: "Блокчиња",
    -  linkTooltip: "Зачувај и стави врска до блокчињата.",
    -  runTooltip: "Пушти го програмот определен од блокчињата во работниот простор.",
    -  badCode: "Грешка во програмот:\n%1",
    -  timeout: "Го надминавте допуштениот број на повторувања во извршувањето.",
    -  discard: "Да ги избришам сите %1 блокчиња?",
    -  trashTooltip: "Отстрани ги сите блокчиња.",
    -  catLogic: "Логика",
    -  catLoops: "Јамки",
    -  catMath: "Математика",
    -  catText: "Текст",
    -  catLists: "Списоци",
    -  catColour: "Боја",
    -  catVariables: "Променливи",
    -  catFunctions: "Функции",
    -  listVariable: "список",
    -  textVariable: "текст",
    -  httpRequestError: "Се појави проблем во барањето.",
    -  linkAlert: "Споделете ги вашите блокчиња со оваа врска:\n\n%1",
    -  hashError: "„%1“ не одговара на ниеден зачуван програм.",
    -  xmlError: "Не можев да ја вчитам зачуваната податотека. Да не сте ја создале со друга верзија на Blockly?",
    -  badXml: "Грешка при расчленувањето на XML:\n%1\n\nСтиснете на „ОК“ за да ги напуштите промените или на „Откажи“ ако сакате уште да ја уредувате XML-податотеката."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ms.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ms.js
    deleted file mode 100644
    index f08c1ca..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ms.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Kod",
    -  blocks: "Blok",
    -  linkTooltip: "Simpan dan pautkan kepada blok.",
    -  runTooltip: "Jalankan aturcara yang ditetapkan oleh blok-blok di dalam ruang kerja.",
    -  badCode: "Ralat atur cara:\n%1",
    -  timeout: "Takat maksimum lelaran pelaksanaan dicecah.",
    -  discard: "Hapuskan kesemua %1 blok?",
    -  trashTooltip: "Buang semua blok.",
    -  catLogic: "Logik",
    -  catLoops: "Gelung",
    -  catMath: "Matematik",
    -  catText: "Teks",
    -  catLists: "Senarai",
    -  catColour: "Warna",
    -  catVariables: "Pemboleh ubah",
    -  catFunctions: "Fungsi",
    -  listVariable: "senarai",
    -  textVariable: "teks",
    -  httpRequestError: "Permintaan itu terdapat masalah.",
    -  linkAlert: "Kongsikan blok-blok anda dengan pautan ini:\n\n%1",
    -  hashError: "Maaf, '%1' tidak berpadanan dengan sebarang aturcara yang disimpan.",
    -  xmlError: "Fail simpanan anda tidak dapat dimuatkan. Jangan-jangan ia dicipta dengan versi Blockly yang berlainan?",
    -  badXml: "Ralat ketika menghuraian XML:\n%1\n\nPilih 'OK' untuk melucutkan suntingan anda atau 'Batal' untuk bersambung menyunting XML-nya."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/nb.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/nb.js
    deleted file mode 100644
    index 409fe08..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/nb.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Kode",
    -  blocks: "Blokker",
    -  linkTooltip: "Lagre og lenke til blokker.",
    -  runTooltip: "Kjør programmet definert av blokken i arbeidsområdet.",
    -  badCode: "Programfeil:\n%1",
    -  timeout: "Det maksimale antallet utførte looper er oversteget.",
    -  discard: "Slett alle %1 blokker?",
    -  trashTooltip: "Fjern alle blokker",
    -  catLogic: "Logikk",
    -  catLoops: "Looper",
    -  catMath: "Matte",
    -  catText: "Tekst",
    -  catLists: "Lister",
    -  catColour: "Farge",
    -  catVariables: "Variabler",
    -  catFunctions: "Funksjoner",
    -  listVariable: "Liste",
    -  textVariable: "Tekst",
    -  httpRequestError: "Det oppsto et problem med forespørselen din",
    -  linkAlert: "Del dine blokker med denne lenken:\n\n%1",
    -  hashError: "Beklager, '%1' samsvarer ikke med noe lagret program.",
    -  xmlError: "Kunne ikke laste inn filen. Kanskje den ble laget med en annen versjon av Blockly?",
    -  badXml: "Feil ved parsering av XML:\n%1\n\nVelg 'OK' for å avbryte endringene eller 'Cancel' for å fortsette å redigere XML-koden."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/nl.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/nl.js
    deleted file mode 100644
    index c9c394c..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/nl.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Code",
    -  blocks: "Blokken",
    -  linkTooltip: "Opslaan en koppelen naar blokken.",
    -  runTooltip: "Voer het programma uit dat met de blokken in de werkruimte is gemaakt.",
    -  badCode: "Programmafout:\n%1",
    -  timeout: "Het maximale aantal iteraties is overschreden.",
    -  discard: "Alle %1 blokken verwijderen?",
    -  trashTooltip: "Alle blokken verwijderen",
    -  catLogic: "Logica",
    -  catLoops: "Lussen",
    -  catMath: "Formules",
    -  catText: "Tekst",
    -  catLists: "Lijsten",
    -  catColour: "Kleur",
    -  catVariables: "Variabelen",
    -  catFunctions: "Functies",
    -  listVariable: "lijst",
    -  textVariable: "tekst",
    -  httpRequestError: "Er is een probleem opgetreden tijdens het verwerken van het verzoek.",
    -  linkAlert: "Deel uw blokken via deze koppeling:\n\n%1",
    -  hashError: "\"%1\" komt helaas niet overeen met een opgeslagen bestand.",
    -  xmlError: "Uw opgeslagen bestand kan niet geladen worden. Is het misschien gemaakt met een andere versie van Blockly?",
    -  badXml: "Fout tijdens het verwerken van de XML:\n%1\n\nSelecteer \"OK\" om uw wijzigingen te negeren of \"Annuleren\" om de XML verder te bewerken."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/oc.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/oc.js
    deleted file mode 100644
    index 29d29d9..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/oc.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Còde",
    -  blocks: "Blòts",
    -  linkTooltip: "Salva e liga als blòts.",
    -  runTooltip: "Aviar lo programa definit pels blòts dins l’espaci de trabalh.",
    -  badCode: "Error del programa :\n%1",
    -  timeout: "Nombre maximum d’iteracions d’execucion depassat.",
    -  discard: "Suprimir totes los %1 blòts ?",
    -  trashTooltip: "Getar totes los blòts.",
    -  catLogic: "Logic",
    -  catLoops: "Boclas",
    -  catMath: "Math",
    -  catText: "Tèxte",
    -  catLists: "Listas",
    -  catColour: "Color",
    -  catVariables: "Variablas",
    -  catFunctions: "Foncions",
    -  listVariable: "lista",
    -  textVariable: "tèxte",
    -  httpRequestError: "I a agut un problèma amb la demanda.",
    -  linkAlert: "Partejatz vòstres blòts gràcia a aqueste ligam :\n\n%1",
    -  hashError: "O planhèm, '%1' correspond pas a un fichièr Blockly salvament.",
    -  xmlError: "Impossible de cargar lo fichièr de salvament.  Benlèu qu'es estat creat amb una autra version de Blockly ?",
    -  badXml: "Error d’analisi del XML :\n%1\n\nSeleccionar 'D'acòrdi' per abandonar vòstras modificacions o 'Anullar' per modificar encara lo XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/pl.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/pl.js
    deleted file mode 100644
    index c8ca562..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/pl.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Kod",
    -  blocks: "Bloki",
    -  linkTooltip: "Zapisz i podlinkuj do bloków",
    -  runTooltip: "Uruchom program zdefinowany przez bloki w obszarze roboczym",
    -  badCode: "Błąd programu:\n%1",
    -  timeout: "Maksymalna liczba iteracji wykonywań przekroczona",
    -  discard: "Usunąć wszystkie %1 bloki?",
    -  trashTooltip: "Odrzuć wszystkie bloki.",
    -  catLogic: "Logika",
    -  catLoops: "Pętle",
    -  catMath: "Matematyka",
    -  catText: "Tekst",
    -  catLists: "Listy",
    -  catColour: "Kolor",
    -  catVariables: "Zmienne",
    -  catFunctions: "Funkcje",
    -  listVariable: "lista",
    -  textVariable: "tekst",
    -  httpRequestError: "Wystąpił problem z żądaniem.",
    -  linkAlert: "Udpostępnij swoje bloki korzystając z poniższego linku : \n\n\n%1",
    -  hashError: "Przepraszamy, \"%1\" nie odpowiada żadnemu zapisanemu programowi.",
    -  xmlError: "Nie można załadować zapisanego pliku. Być może został utworzony za pomocą innej wersji Blockly?",
    -  badXml: "Błąd parsowania XML : \n%1\n\nZaznacz 'OK' aby odrzucić twoje zmiany lub 'Cancel', żeby w przyszłości edytować XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/pms.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/pms.js
    deleted file mode 100644
    index 27edbc8..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/pms.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Còdes",
    -  blocks: "Blòch",
    -  linkTooltip: "Argistré e lijé ai blòch.",
    -  runTooltip: "Fé andé ël programa definì dai blòch ant lë spassi ëd travaj.",
    -  badCode: "Eror dël programa:\n%1",
    -  timeout: "Nùmer màssim d'arpetission d'esecussion sorpassà.",
    -  discard: "Scancelé tuti ij %1 blòch?",
    -  trashTooltip: "Scarté tuti ij blòch.",
    -  catLogic: "Lògica",
    -  catLoops: "Liasse",
    -  catMath: "Matemàtica",
    -  catText: "Test",
    -  catLists: "Liste",
    -  catColour: "Color",
    -  catVariables: "Variàbij",
    -  catFunctions: "Fonsion",
    -  listVariable: "lista",
    -  textVariable: "test",
    -  httpRequestError: "A-i é staje un problema con l'arcesta.",
    -  linkAlert: "Ch'a partagia ij sò blòch grassie a sta liura: %1",
    -  hashError: "An dëspias, '%1 a corëspond a gnun programa salvà.",
    -  xmlError: "A l'é nen podusse carié so archivi salvà. Miraco a l'é stàit creà con na version diferenta ëd Blockly?",
    -  badXml: "Eror d'anàlisi dl'XML:\n%1\n\nSelessioné 'Va bin' për lassé perde toe modìfiche o 'Anulé' për modifiché ancora l'XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/pt-br.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/pt-br.js
    deleted file mode 100644
    index 4707617..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/pt-br.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Código",
    -  blocks: "Blocos",
    -  linkTooltip: "Salvar e ligar aos blocos.",
    -  runTooltip: "Execute o programa definido pelos blocos na área de trabalho.",
    -  badCode: "Erro no programa:\n%1",
    -  timeout: "Máximo de iterações de execução excedido.",
    -  discard: "Apagar todos os %1 blocos?",
    -  trashTooltip: "Descartar todos os blocos.",
    -  catLogic: "Lógica",
    -  catLoops: "Laços",
    -  catMath: "Matemática",
    -  catText: "Texto",
    -  catLists: "Listas",
    -  catColour: "Cor",
    -  catVariables: "Variáveis",
    -  catFunctions: "Funções",
    -  listVariable: "lista",
    -  textVariable: "texto",
    -  httpRequestError: "Houve um problema com a requisição.",
    -  linkAlert: "Compartilhe seus blocos com este link:\n\n%1",
    -  hashError: "Desculpe, '%1' não corresponde a um programa salvo.",
    -  xmlError: "Não foi possível carregar seu arquivo salvo. Talvez ele tenha sido criado com uma versão diferente do Blockly?",
    -  badXml: "Erro de análise XML:\n%1\n\nSelecione 'OK' para abandonar suas mudanças ou 'Cancelar' para editar o XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ro.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ro.js
    deleted file mode 100644
    index 7ffe7b4..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ro.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Cod",
    -  blocks: "Blocuri",
    -  linkTooltip: "Salvează și adaugă la blocuri.",
    -  runTooltip: "Execută programul definit de către blocuri în spațiul de lucru.",
    -  badCode: "Eroare de program:\n%1",
    -  timeout: "Numărul maxim de iterații a fost depășit.",
    -  discard: "Ștergi toate cele %1 (de) blocuri?",
    -  trashTooltip: "Șterge toate blocurile.",
    -  catLogic: "Logic",
    -  catLoops: "Bucle",
    -  catMath: "Matematică",
    -  catText: "Text",
    -  catLists: "Liste",
    -  catColour: "Culoare",
    -  catVariables: "Variabile",
    -  catFunctions: "Funcții",
    -  listVariable: "listă",
    -  textVariable: "text",
    -  httpRequestError: "A apărut o problemă la solicitare.",
    -  linkAlert: "Distribuie-ți blocurile folosind această legătură:\n\n%1",
    -  hashError: "Scuze, „%1” nu corespunde nici unui program salvat.",
    -  xmlError: "Sistemul nu a putut încărca fișierul salvat. Poate că a fost creat cu o altă versiune de Blockly?",
    -  badXml: "Eroare de parsare XML:\n%1\n\nAlege „OK” pentru a renunța la modificările efectuate sau „Revocare” pentru a modifica în continuare fișierul XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ru.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ru.js
    deleted file mode 100644
    index 0d97268..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/ru.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Код",
    -  blocks: "Блоки",
    -  linkTooltip: "Сохранить и показать ссылку на блоки.",
    -  runTooltip: "Запустить программу, заданную блоками в рабочей области.",
    -  badCode: "Ошибка программы:\n%1",
    -  timeout: "Превышено максимальное количество итераций.",
    -  discard: "Удалить все блоки (%1)?",
    -  trashTooltip: "Удалить все блоки.",
    -  catLogic: "Логические",
    -  catLoops: "Циклы",
    -  catMath: "Математика",
    -  catText: "Текст",
    -  catLists: "Списки",
    -  catColour: "Цвет",
    -  catVariables: "Переменные",
    -  catFunctions: "Функции",
    -  listVariable: "список",
    -  textVariable: "текст",
    -  httpRequestError: "Произошла проблема при запросе.",
    -  linkAlert: "Поделитесь своими блоками по этой ссылке:\n\n%1",
    -  hashError: "К сожалению, «%1» не соответствует ни одному сохраненному файлу Блокли.",
    -  xmlError: "Не удалось загрузить ваш сохраненный файл.  Возможно, он был создан в другой версии Блокли?",
    -  badXml: "Ошибка синтаксического анализа XML:\n%1\n\nВыберите 'ОК', чтобы отказаться от изменений или 'Cancel' для дальнейшего редактирования XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/sc.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/sc.js
    deleted file mode 100644
    index f0015a8..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/sc.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Còdixi",
    -  blocks: "Brocus",
    -  linkTooltip: "Sarva e alliòngia a is brocus.",
    -  runTooltip: "Arròllia su programa cumpostu de is brocus in s'àrea de traballu.",
    -  badCode: "Errori in su Programa:\n%1",
    -  timeout: "Giai lòmpius a su màssimu numeru de repicus.",
    -  discard: "Scancellu su %1 de is brocus?",
    -  trashTooltip: "Boganci totu is brocus.",
    -  catLogic: "Lògica",
    -  catLoops: "Lòrigas",
    -  catMath: "Matemàtica",
    -  catText: "Testu",
    -  catLists: "Lista",
    -  catColour: "Colori",
    -  catVariables: "Variabilis",
    -  catFunctions: "Funtzionis",
    -  listVariable: "lista",
    -  textVariable: "testu",
    -  httpRequestError: "Ddui fut unu problema cun sa pregunta",
    -  linkAlert: "Poni is brocus tuus in custu acàpiu:\n\n%1",
    -  hashError: "Mi dispraxit, '%1' non torrat a pari cun nimancu unu de is programas sarvaus.",
    -  xmlError: "Non potzu carrigai su file sarvau. Fortzis est stètiu fatu cun d-una versioni diferenti de Blockly?",
    -  badXml: "Errori in s'anàlisi XML:\n%1\n\nCraca 'OK' po perdi is mudàntzias 'Anudda' po sighì a scriri su XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/sk.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/sk.js
    deleted file mode 100644
    index 08282ac..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/sk.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Kód",
    -  blocks: "Bloky",
    -  linkTooltip: "Uložiť a zdieľať odkaz na tento program.",
    -  runTooltip: "Spustiť program, zložený z dielcov na pracovnej ploche.",
    -  badCode: "Chyba v programe:\n%1",
    -  timeout: "Bol prekročený maximálny počet opakovaní.",
    -  discard: "Zmazať všetkých %1 dielcov?",
    -  trashTooltip: "Zahodiť všetky dielce.",
    -  catLogic: "Logika",
    -  catLoops: "Cykly",
    -  catMath: "Matematické",
    -  catText: "Text",
    -  catLists: "Zoznamy",
    -  catColour: "Farby",
    -  catVariables: "Premenné",
    -  catFunctions: "Funkcie",
    -  listVariable: "zoznam",
    -  textVariable: "text",
    -  httpRequestError: "Problém so spracovaním požiadavky.",
    -  linkAlert: "Zdieľať tento program skopírovaním odkazu\n\n%1",
    -  hashError: "Prepáč, '%1' nie je meno žiadnemu uloženému programu.",
    -  xmlError: "Nebolo možné načítať uložený súbor. Možno bol vytvorený v inej verzii Blocky.",
    -  badXml: "Chyba pri parsovaní XML:\n%1\n\nStlačte 'OK' ak chcete zrušiť zmeny alebo 'Zrušiť' pre pokračovanie v úpravách XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/sr.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/sr.js
    deleted file mode 100644
    index cb29673..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/sr.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Кôд",
    -  blocks: "Блокови",
    -  linkTooltip: "Сачувајте и повежите са блоковима.",
    -  runTooltip: "Покрените програм заснован на блоковима у радном простору.",
    -  badCode: "Грешка у програму:\n%1",
    -  timeout: "Достигнут је максималан број понављања у извршавању.",
    -  discard: "Обрисати %1 блокова?",
    -  trashTooltip: "Одбаците све блокове.",
    -  catLogic: "Логика",
    -  catLoops: "Петље",
    -  catMath: "Математика",
    -  catText: "Текст",
    -  catLists: "Спискови",
    -  catColour: "Боја",
    -  catVariables: "Променљиве",
    -  catFunctions: "Процедуре",
    -  listVariable: "списак",
    -  textVariable: "текст",
    -  httpRequestError: "Дошло је до проблема у захтеву.",
    -  linkAlert: "Делите своје блокове овом везом:\n\n%1",
    -  hashError: "„%1“ не одговара ниједном сачуваном програму.",
    -  xmlError: "Не могу да учитам сачувану датотеку. Можда је направљена другом верзијом Blockly-ја.",
    -  badXml: "Грешка при рашчлањивању XML-а:\n%1\n\nПритисните „У реду“ да напустите измене или „Откажи“ да наставите са уређивањем XML датотеке."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/sv.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/sv.js
    deleted file mode 100644
    index d92e941..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/sv.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Kod",
    -  blocks: "Block",
    -  linkTooltip: "Spara och länka till block.",
    -  runTooltip: "Kör programmet som definierats av blocken i arbetsytan.",
    -  badCode: "Programfel:\n%1",
    -  timeout: "Det maximala antalet utförda loopar har överskridits.",
    -  discard: "Radera alla %1 block?",
    -  trashTooltip: "Släng alla block.",
    -  catLogic: "Logik",
    -  catLoops: "Loopar",
    -  catMath: "Matematik",
    -  catText: "Text",
    -  catLists: "Listor",
    -  catColour: "Färg",
    -  catVariables: "Variabler",
    -  catFunctions: "Funktioner",
    -  listVariable: "lista",
    -  textVariable: "text",
    -  httpRequestError: "Det uppstod ett problem med begäran.",
    -  linkAlert: "Dela dina block med denna länk: \n\n%1",
    -  hashError: "Tyvärr, '%1' överensstämmer inte med något sparat program.",
    -  xmlError: "Kunde inte läsa din sparade fil. Den skapades kanske med en annan version av Blockly?",
    -  badXml: "Fel vid parsning av XML:\n%1\n\nKlicka på 'OK' för att strunta i dina ändringar eller 'Avbryt' för att fortsätta redigera XML-koden."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/th.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/th.js
    deleted file mode 100644
    index c6c3c26..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/th.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "เขียนโปรแกรม",
    -  blocks: "บล็อก",
    -  linkTooltip: "บันทึกและสร้างลิงก์มายังบล็อกเหล่านี้",
    -  runTooltip: "เรียกใช้โปรแกรมตามที่กำหนดไว้ด้วยบล็อกที่อยู่ในพื้นที่ทำงาน",
    -  badCode: "โปรแกรมเกิดข้อผิดพลาด:\n%1",
    -  timeout: "โปรแกรมทำงานซ้ำคำสั่งเดิมมากเกินไป",
    -  discard: "ต้องการลบบล็อกทั้ง %1 บล็อกใช่หรือไม่?",
    -  trashTooltip: "ยกเลิกบล็อกทั้งหมด",
    -  catLogic: "ตรรกะ",
    -  catLoops: "การวนซ้ำ",
    -  catMath: "คณิตศาสตร์",
    -  catText: "ข้อความ",
    -  catLists: "รายการ",
    -  catColour: "สี",
    -  catVariables: "ตัวแปร",
    -  catFunctions: "ฟังก์ชัน",
    -  listVariable: "รายการ",
    -  textVariable: "ข้อความ",
    -  httpRequestError: "มีปัญหาเกี่ยวกับการร้องขอ",
    -  linkAlert: "แบ่งปันบล็อกของคุณด้วยลิงก์นี้:\n\n%1",
    -  hashError: "เสียใจด้วย '%1' ไม่ตรงกับโปรแกรมใดๆ ที่เคยบันทึกเอาไว้เลย",
    -  xmlError: "ไม่สามารถโหลดไฟล์ที่บันทึกไว้ของคุณได้ บางทีมันอาจจะถูกสร้างขึ้นด้วย Blockly รุ่นอื่นที่แตกต่างกัน?",
    -  badXml: "เกิดข้อผิดพลาดในการแยกวิเคราะห์ XML:\n%1\n\nเลือก 'ตกลง' เพื่อละทิ้งการเปลี่ยนแปลงต่างๆ ที่ทำไว้ หรือเลือก 'ยกเลิก' เพื่อแก้ไข XML ต่อไป"
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/tlh.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/tlh.js
    deleted file mode 100644
    index 6347575..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/tlh.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "ngoq",
    -  blocks: "ngoghmey",
    -  linkTooltip: "",
    -  runTooltip: "",
    -  badCode: "Qagh:\n%1",
    -  timeout: "tlhoy nI'qu' poH.",
    -  discard: "Hoch %1 ngoghmey Qaw'?",
    -  trashTooltip: "",
    -  catLogic: "meq",
    -  catLoops: "vIHtaHbogh ghomey",
    -  catMath: "mI'QeD",
    -  catText: "ghItlhHommey",
    -  catLists: "tetlhmey",
    -  catColour: "rItlh",
    -  catVariables: "lIwmey",
    -  catFunctions: "mIwmey",
    -  listVariable: "tetlh",
    -  textVariable: "ghItlhHom",
    -  httpRequestError: "Qapbe' tlhobmeH QIn.",
    -  linkAlert: "latlhvaD ngoghmeylIj DangeHmeH Quvvam yIlo':\n\n%1",
    -  hashError: "Do'Ha', ngogh nab pollu'pu'bogh 'oHbe'law' \"%1\"'e'.",
    -  xmlError: "ngogh nablIj pollu'pu'bogh chu'qa'laHbe' vay'.  chaq pollu'pu'DI' ghunmeH ngogh pIm lo'lu'pu'.",
    -  badXml: "XML yajchu'laHbe' vay':\n%1\n\nchoHmeylIj DalonmeH \"ruch\" yIwIv pagh XML DachoHqa'meH \"qIl\" yIwIv."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/tr.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/tr.js
    deleted file mode 100644
    index 2cf29b0..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/tr.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Kod",
    -  blocks: "Bloklar",
    -  linkTooltip: "Blokları ve bağlantı adresini kaydet.",
    -  runTooltip: "Çalışma alanında bloklar tarafından tanımlanan programını çalıştırın.",
    -  badCode: "Program hatası:\n %1",
    -  timeout: "Maksimum yürütme yinelemeleri aşıldı.",
    -  discard: "Tüm %1 blok silinsin mi?",
    -  trashTooltip: "Bütün blokları at.",
    -  catLogic: "Mantık",
    -  catLoops: "Döngüler",
    -  catMath: "Matematik",
    -  catText: "Metin",
    -  catLists: "Listeler",
    -  catColour: "Renk",
    -  catVariables: "Değişkenler",
    -  catFunctions: "İşlevler",
    -  listVariable: "liste",
    -  textVariable: "metin",
    -  httpRequestError: "İstek ile ilgili bir problem var.",
    -  linkAlert: "Bloklarını bu bağlantı ile paylaş:\n\n%1",
    -  hashError: "Üzgünüz, '%1' hiç bir kaydedilmiş program ile uyuşmuyor.",
    -  xmlError: "Kaydedilen dosyanız yüklenemiyor\nBlockly'nin önceki sürümü ile kaydedilmiş olabilir mi?",
    -  badXml: "XML ayrıştırma hatası:\n%1\n\nDeğişikliklerden vazgeçmek için 'Tamam'ı, düzenlemeye devam etmek için 'İptal' seçeneğini seçiniz."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/uk.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/uk.js
    deleted file mode 100644
    index 8e7d643..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/uk.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Код",
    -  blocks: "Блоки",
    -  linkTooltip: "Зберегти і пов'язати з блоками.",
    -  runTooltip: "Запустіть програму, визначену блоками у робочій області.",
    -  badCode: "Помилка програми:\n%1",
    -  timeout: "Максимальне виконання ітерацій перевищено.",
    -  discard: "Вилучити всі блоки %1?",
    -  trashTooltip: "Відкинути всі блоки.",
    -  catLogic: "Логіка",
    -  catLoops: "Петлі",
    -  catMath: "Математика",
    -  catText: "Текст",
    -  catLists: "Списки",
    -  catColour: "Колір",
    -  catVariables: "Змінні",
    -  catFunctions: "Функції",
    -  listVariable: "список",
    -  textVariable: "текст",
    -  httpRequestError: "Виникла проблема із запитом.",
    -  linkAlert: "Поділитися вашим блоками через посилання:\n\n%1",
    -  hashError: "На жаль, \"%1\" не відповідає жодній збереженій програмі.",
    -  xmlError: "Не вдалося завантажити ваш збережений файл.  Можливо, він був створений з іншої версії Blockly?",
    -  badXml: "Помилка синтаксичного аналізу XML:\n%1\n\nВиберіть \"Гаразд\", щоб відмовитися від змін або 'Скасувати' для подальшого редагування XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/vi.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/vi.js
    deleted file mode 100644
    index 38be4e5..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/vi.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "Chương trình",
    -  blocks: "Các mảnh",
    -  linkTooltip: "Lưu và lấy địa chỉ liên kết.",
    -  runTooltip: "Chạy chương trình.",
    -  badCode: "'Lỗi chương trình:\n%1",
    -  timeout: "Đã vượt quá số lần lặp cho phép.",
    -  discard: "Xóa hết %1 mảnh?",
    -  trashTooltip: "Xóa tất cả mọi mảnh.",
    -  catLogic: "Logic",
    -  catLoops: "Vòng lặp",
    -  catMath: "Công thức toán",
    -  catText: "Văn bản",
    -  catLists: "Danh sách",
    -  catColour: "Màu",
    -  catVariables: "Biến",
    -  catFunctions: "Hàm",
    -  listVariable: "danh sách",
    -  textVariable: "văn bản",
    -  httpRequestError: "Hoạt động bị trục trặc, không thực hiện được yêu cầu của bạn.",
    -  linkAlert: "Chia sẻ chương trình của bạn với liên kết sau:\n\n %1",
    -  hashError: "Không tìm thấy chương trình được lưu ở '%1'.",
    -  xmlError: "Không mở được chương trình của bạn.  Có thể nó nằm trong một phiên bản khác của Blockly?",
    -  badXml: "Lỗi sử lý XML:\n %1\n\nChọn 'OK' để từ bỏ các thay đổi hoặc 'Hủy' để tiếp tục chỉnh sửa các XML."
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/zh-hans.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/zh-hans.js
    deleted file mode 100644
    index 37aec45..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/zh-hans.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "代码",
    -  blocks: "块",
    -  linkTooltip: "保存模块并生成链接。",
    -  runTooltip: "于工作区中运行块所定义的程式。",
    -  badCode: "程序错误:\n%1",
    -  timeout: "超过最大执行行数。",
    -  discard: "删除所有%1块吗?",
    -  trashTooltip: "放弃所有块。",
    -  catLogic: "逻辑",
    -  catLoops: "循环",
    -  catMath: "数学",
    -  catText: "文本",
    -  catLists: "列表",
    -  catColour: "颜色",
    -  catVariables: "变量",
    -  catFunctions: "函数",
    -  listVariable: "列表",
    -  textVariable: "文本",
    -  httpRequestError: "请求存在问题。",
    -  linkAlert: "通过这个链接分享您的模块:\n\n%1",
    -  hashError: "对不起,没有任何已保存的程序对应'%1' 。",
    -  xmlError: "无法载入您保存的文件。您是否使用其他版本的Blockly创建该文件的?",
    -  badXml: "XML解析错误:\n%1\n\n选择“确定”以取消您对XML的修改,或选择“取消”以继续编辑XML。"
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/zh-hant.js b/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/zh-hant.js
    deleted file mode 100644
    index 1f72118..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/msg/zh-hant.js
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -var MSG = {
    -  title: "程式碼",
    -  blocks: "積木",
    -  linkTooltip: "儲存積木組並提供連結。",
    -  runTooltip: "於工作區中執行積木組所定義的程式。",
    -  badCode: "程式錯誤:\n%1",
    -  timeout: "超過最大執行數。",
    -  discard: "刪除共%1個積木?",
    -  trashTooltip: "捨棄所有積木。",
    -  catLogic: "邏輯",
    -  catLoops: "迴圈",
    -  catMath: "數學式",
    -  catText: "文字",
    -  catLists: "列表",
    -  catColour: "顏色",
    -  catVariables: "變量",
    -  catFunctions: "流程",
    -  listVariable: "列表",
    -  textVariable: "文字",
    -  httpRequestError: "命令出現錯誤。",
    -  linkAlert: "透過此連結分享您的積木組:\n\n%1",
    -  hashError: "對不起,「%1」並未對應任何已保存的程式。",
    -  xmlError: "未能載入您保存的檔案。或許它是由其他版本的Blockly創建?",
    -  badXml: "解析 XML 時出現錯誤:\n%1\n\n選擇'確定'以放棄您的更改,或選擇'取消'以進一步編輯 XML。"
    -};
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/code/style.css b/src/opsoro/apps/visual_programming/static/blockly/demos/code/style.css
    deleted file mode 100644
    index e05664f..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/code/style.css
    +++ /dev/null
    @@ -1,163 +0,0 @@
    -html, body {
    -  height: 100%;
    -}
    -
    -body {
    -  background-color: #fff;
    -  font-family: sans-serif;
    -  margin: 0;
    -  overflow: hidden;
    -}
    -
    -.farSide {
    -  text-align: right;
    -}
    -
    -html[dir="RTL"] .farSide {
    -  text-align: left;
    -}
    -
    -/* Buttons */
    -button {
    -  margin: 5px;
    -  padding: 10px;
    -  border-radius: 4px;
    -  border: 1px solid #ddd;
    -  font-size: large;
    -  background-color: #eee;
    -  color: #000;
    -}
    -button.primary {
    -  border: 1px solid #dd4b39;
    -  background-color: #dd4b39;
    -  color: #fff;
    -}
    -button.primary>img {
    -  opacity: 1;
    -}
    -button>img {
    -  opacity: 0.6;
    -  vertical-align: text-bottom;
    -}
    -button:hover>img {
    -  opacity: 1;
    -}
    -button:active {
    -  border: 1px solid #888 !important;
    -}
    -button:hover {
    -  box-shadow: 2px 2px 5px #888;
    -}
    -button.disabled:hover>img {
    -  opacity: 0.6;
    -}
    -button.disabled {
    -  display: none;
    -}
    -button.notext {
    -  font-size: 10%;
    -}
    -
    -h1 {
    -  font-weight: normal;
    -  font-size: 140%;
    -  margin-left: 5px;
    -  margin-right: 5px;
    -}
    -
    -/* Tabs */
    -#tabRow>td {
    -  border: 1px solid #ccc;
    -  border-bottom: none;
    -}
    -td.tabon {
    -  border-bottom-color: #ddd !important;
    -  background-color: #ddd;
    -  padding: 5px 19px;
    -}
    -td.taboff {
    -  cursor: pointer;
    -  padding: 5px 19px;
    -}
    -td.taboff:hover {
    -  background-color: #eee;
    -}
    -td.tabmin {
    -  border-top-style: none !important;
    -  border-left-style: none !important;
    -  border-right-style: none !important;
    -}
    -td.tabmax {
    -  border-top-style: none !important;
    -  border-left-style: none !important;
    -  border-right-style: none !important;
    -  width: 99%;
    -  padding-left: 10px;
    -  padding-right: 10px;
    -  text-align: right;
    -}
    -html[dir=rtl] td.tabmax {
    -  text-align: left;
    -}
    -
    -table {
    -  border-collapse: collapse;
    -  margin: 0;
    -  padding: 0;
    -  border: none;
    -}
    -td {
    -  padding: 0;
    -  vertical-align: top;
    -}
    -.content {
    -  visibility: hidden;
    -  margin: 0;
    -  padding: 1ex;
    -  position: absolute;
    -  direction: ltr;
    -}
    -pre.content {
    -  border: 1px solid #ccc;
    -  overflow: scroll;
    -}
    -#content_blocks {
    -  padding: 0;
    -}
    -.blocklySvg {
    -  border-top: none !important;
    -}
    -#content_xml {
    -  resize: none;
    -  outline: none;
    -  border: 1px solid #ccc;
    -  font-family: monospace;
    -  overflow: scroll;
    -}
    -#languageMenu {
    -  vertical-align: top;
    -  margin-top: 15px;
    -  margin-right: 15px;
    -}
    -
    -/* Buttons */
    -button {
    -  padding: 1px 10px;
    -  margin: 1px 5px;
    -}
    -
    -/* Sprited icons. */
    -.icon21 {
    -  height: 21px;
    -  width: 21px;
    -  background-image: url(icons.png);
    -}
    -.trash {
    -  background-position: 0px 0px;
    -}
    -.link {
    -  background-position: -21px 0px;
    -}
    -.run {
    -  background-position: -42px 0px;
    -}
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/fixed/icon.png b/src/opsoro/apps/visual_programming/static/blockly/demos/fixed/icon.png
    deleted file mode 100644
    index 1158acf..0000000
    Binary files a/src/opsoro/apps/visual_programming/static/blockly/demos/fixed/icon.png and /dev/null differ
    diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/fixed/index.html b/src/opsoro/apps/visual_programming/static/blockly/demos/fixed/index.html
    deleted file mode 100644
    index c3805be..0000000
    --- a/src/opsoro/apps/visual_programming/static/blockly/demos/fixed/index.html
    +++ /dev/null
    @@ -1,47 +0,0 @@
    -
    -
    -
    -  
    -  Blockly Demo: Fixed Blockly
    -  
    -  
    -  
    -  
    -
    -
    -  

    Blockly > - Demos > Fixed Blockly

    - -

    This is a simple demo of injecting Blockly into a fixed-sized 'div' element.

    - -

    → More info on injecting fixed-sized Blockly...

    - -
    - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/generator/icon.png b/src/opsoro/apps/visual_programming/static/blockly/demos/generator/icon.png deleted file mode 100644 index 132016e..0000000 Binary files a/src/opsoro/apps/visual_programming/static/blockly/demos/generator/icon.png and /dev/null differ diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/generator/index.html b/src/opsoro/apps/visual_programming/static/blockly/demos/generator/index.html deleted file mode 100644 index 593eb4b..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/generator/index.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - Blockly Demo: Generating JavaScript - - - - - - - -

    Blockly > - Demos > Generating JavaScript

    - -

    This is a simple demo of generating code from blocks.

    - -

    → More info on Code Generators...

    - -

    - - -

    - -
    - - - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/graph/icon.png b/src/opsoro/apps/visual_programming/static/blockly/demos/graph/icon.png deleted file mode 100644 index ad8b582..0000000 Binary files a/src/opsoro/apps/visual_programming/static/blockly/demos/graph/icon.png and /dev/null differ diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/graph/index.html b/src/opsoro/apps/visual_programming/static/blockly/demos/graph/index.html deleted file mode 100644 index daa318e..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/graph/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - Blockly Demo: Graph - - - - - - - - -

    Blockly > - Demos > Graph

    - -

    This is a demo of giving instant feedback as blocks are changed.

    - -

    → More info on Realtime generation...

    - - - - - - -
    -
    -
    -
    -
    - -
    - - ... -
    - - - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/headless/icon.png b/src/opsoro/apps/visual_programming/static/blockly/demos/headless/icon.png deleted file mode 100644 index af9ebe7..0000000 Binary files a/src/opsoro/apps/visual_programming/static/blockly/demos/headless/icon.png and /dev/null differ diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/headless/index.html b/src/opsoro/apps/visual_programming/static/blockly/demos/headless/index.html deleted file mode 100644 index c3bad9d..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/headless/index.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - Blockly Demo: Headless - - - - - - - -

    Blockly > - Demos > Headless

    - -

    This is a simple demo of generating Python code from XML with no graphics. - This might be useful for server-side code generation.

    - - - - - - - -
    - - - - -
    - -
    - -
    - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/index.html b/src/opsoro/apps/visual_programming/static/blockly/demos/index.html deleted file mode 100644 index 8af6006..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/index.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - Blockly Demos - - - -

    Blockly > Demos

    - -

    These demos are intended for developers who want to integrate Blockly with - their own applications.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - -
    Inject Blockly into a page as a fixed element.
    -
    - - - - - -
    Inject Blockly into a page as a resizable element.
    -
    - - - - - -
    Organize blocks into categories for the user.
    -
    - - - - - -
    Limit the total number of blocks allowed (for academic exercises).
    -
    - - - - - -
    Turn blocks into code and execute it.
    -
    - - - - - -
    Generate code from XML without graphics.
    -
    - - - - - -
    Step by step execution in JavaScript.
    -
    - - - - - -
    Instant updates when blocks are changed.
    -
    - - - - - -
    See what Blockly looks like in right-to-left mode (for Arabic and Hebrew).
    -
    - - - - - -
    Using Closure Templates to support 35 languages.
    -
    - - - - - -
    Save and load blocks with App Engine.
    -
    - - - - - -
    Export a Blockly program into JavaScript, Python, PHP, Dart or XML.
    -
    - - - - - -
    Build custom blocks using Blockly.
    -
    - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/interpreter/acorn_interpreter.js b/src/opsoro/apps/visual_programming/static/blockly/demos/interpreter/acorn_interpreter.js deleted file mode 100644 index b039ad3..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/interpreter/acorn_interpreter.js +++ /dev/null @@ -1,130 +0,0 @@ -var mod$$inline_58=function(a){function b(a){n=a||{};for(var b in Ua)Object.prototype.hasOwnProperty.call(n,b)||(n[b]=Ua[b]);wa=n.sourceFile||null}function c(a,b){var c=Ab(k,a);b+=" ("+c.line+":"+c.column+")";var e=new SyntaxError(b);e.pos=a;e.loc=c;e.raisedAt=g;throw e;}function d(a){function b(a){if(1==a.length)return c+="return str === "+JSON.stringify(a[0])+";";c+="switch(str){";for(var va=0;vaa)++g;else if(47===a)if(a=k.charCodeAt(g+1),42===a){var a=n.onComment&&n.locations&&new f,b=g,e=k.indexOf("*/",g+=2);-1===e&&c(g-2,"Unterminated comment"); -g=e+2;if(n.locations){Y.lastIndex=b;for(var d=void 0;(d=Y.exec(k))&&d.index=a?a=P(!0):(++g,a=e(xa)),a;case 40:return++g,e(J);case 41:return++g,e(F);case 59:return++g,e(K);case 44:return++g,e(L);case 91:return++g,e(ja); -case 93:return++g,e(ka);case 123:return++g,e(Z);case 125:return++g,e(T);case 58:return++g,e(aa);case 63:return++g,e(ya);case 48:if(a=k.charCodeAt(g+1),120===a||88===a)return g+=2,a=l(16),null==a&&c(y+2,"Expected hexadecimal number"),la(k.charCodeAt(g))&&c(g,"Identifier directly after number"),a=e(ba,a);case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return P(!1);case 34:case 39:a:{g++;for(var b="";;){g>=S&&c(y,"Unterminated string constant");var f=k.charCodeAt(g);if(f===a){++g; -a=e(da,b);break a}if(92===f){var f=k.charCodeAt(++g),d=/^[0-7]+/.exec(k.slice(g,g+3));for(d&&(d=d[0]);d&&255=S)return e(pa);var b=k.charCodeAt(g);if(la(b)||92===b)return Ya();a=r(b);if(!1===a){b=String.fromCharCode(b);if("\\"===b||Za.test(b))return Ya();c(g,"Unexpected character '"+b+"'")}return a}function u(a,b){var c=k.slice(g,g+b);g+=b;e(a,c)}function D(){for(var a="",b,f,d=g;;){g>= -S&&c(d,"Unterminated regular expression");a=k.charAt(g);na.test(a)&&c(d,"Unterminated regular expression");if(b)b=!1;else{if("["===a)f=!0;else if("]"===a&&f)f=!1;else if("/"===a&&!f)break;b="\\"===a}++g}a=k.slice(d,g);++g;(b=$a())&&!/^[gmsiy]*$/.test(b)&&c(d,"Invalid regexp flag");return e(Ba,new RegExp(a,b))}function l(a,b){for(var c=g,f=0,e=0,d=null==b?Infinity:b;e=h?h-48:Infinity;if(h>=a)break;++g;f=f*a+h}return g===c||null!= -b&&g-c!==b?null:f}function P(a){var b=g,f=!1,d=48===k.charCodeAt(g);a||null!==l(10)||c(b,"Invalid number");46===k.charCodeAt(g)&&(++g,l(10),f=!0);a=k.charCodeAt(g);if(69===a||101===a)a=k.charCodeAt(++g),43!==a&&45!==a||++g,null===l(10)&&c(b,"Invalid number"),f=!0;la(k.charCodeAt(g))&&c(g,"Identifier directly after number");a=k.slice(b,g);var h;f?h=parseFloat(a):d&&1!==a.length?/[89]/.test(a)||C?c(b,"Invalid number"):h=parseInt(a,8):h=parseInt(a,10);return e(ba,h)}function ma(a){a=l(16,a);null===a&& -c(y,"Bad character escape sequence");return a}function $a(){ca=!1;for(var a,b=!0,f=g;;){var e=k.charCodeAt(g);if(ab(e))ca&&(a+=k.charAt(g)),++g;else if(92===e){ca||(a=k.slice(f,g));ca=!0;117!=k.charCodeAt(++g)&&c(g,"Expecting Unicode escape sequence \\uXXXX");++g;var e=ma(4),d=String.fromCharCode(e);d||c(g-1,"Invalid Unicode escape");(b?la(e):ab(e))||c(g-4,"Invalid Unicode escape");a+=d}else break;b=!1}return ca?a:k.slice(f,g)}function Ya(){var a=$a(),b=V;ca||(Lb(a)?b=Ca[a]:(n.forbidReserved&&(3=== -n.ecmaVersion?Mb:Nb)(a)||C&&bb(a))&&c(y,"The keyword '"+a+"' is reserved"));return e(b,a)}function t(){Da=y;M=X;Ea=ia;A()}function Fa(a){C=a;g=M;if(n.locations)for(;gb){var e=Q(a);e.left=a;e.operator=I;a=p;t();e.right=Ra(Sa(),f,c);f=q(e,a===Va||a===Wa?"LogicalExpression":"BinaryExpression");return Ra(f,b,c)}return a}function Sa(){if(p.prefix){var a=z(),b=p.isUpdate;a.operator=I;R=a.prefix=!0;t();a.argument= -Sa();b?ra(a.argument):C&&"delete"===a.operator&&"Identifier"===a.argument.type&&c(a.start,"Deleting local variable in strict mode");return q(a,b?"UpdateExpression":"UnaryExpression")}for(b=ha(ua());p.postfix&&!qa();)a=Q(b),a.operator=I,a.prefix=!1,a.argument=b,ra(b),t(),b=q(a,"UpdateExpression");return b}function ha(a,b){if(v(xa)){var c=Q(a);c.object=a;c.property=O(!0);c.computed=!1;return ha(q(c,"MemberExpression"),b)}return v(ja)?(c=Q(a),c.object=a,c.property=B(),c.computed=!0,w(ka),ha(q(c,"MemberExpression"), -b)):!b&&v(J)?(c=Q(a),c.callee=a,c.arguments=Ta(F,!1),ha(q(c,"CallExpression"),b)):a}function ua(){switch(p){case ub:var a=z();t();return q(a,"ThisExpression");case V:return O();case ba:case da:case Ba:return a=z(),a.value=I,a.raw=k.slice(y,X),t(),q(a,"Literal");case vb:case wb:case xb:return a=z(),a.value=p.atomValue,a.raw=p.keyword,t(),q(a,"Literal");case J:var a=oa,b=y;t();var f=B();f.start=b;f.end=X;n.locations&&(f.loc.start=a,f.loc.end=ia);n.ranges&&(f.range=[b,X]);w(F);return f;case ja:return a= -z(),t(),a.elements=Ta(ka,!0,!0),q(a,"ArrayExpression");case Z:a=z();b=!0;f=!1;a.properties=[];for(t();!v(T);){if(b)b=!1;else if(w(L),n.allowTrailingCommas&&v(T))break;var e={key:p===ba||p===da?ua():O(!0)},d=!1,h;v(aa)?(e.value=B(!0),h=e.kind="init"):5<=n.ecmaVersion&&"Identifier"===e.key.type&&("get"===e.key.name||"set"===e.key.name)?(d=f=!0,h=e.kind=e.key.name,e.key=p===ba||p===da?ua():O(!0),p!==J&&N(),e.value=Na(z(),!1)):N();if("Identifier"===e.key.type&&(C||f))for(var g=0;gf?a.id:a.params[f],(bb(e.name)||sa(e.name))&&c(e.start,"Defining '"+e.name+"' in strict mode"),0<=f)for(var d=0;da?36===a:91>a?!0:97>a?95===a:123>a?!0:170<=a&&Za.test(String.fromCharCode(a))},ab=a.isIdentifierChar=function(a){return 48>a?36===a:58>a?!0:65>a?!1:91>a?!0:97>a?95===a:123>a?!0:170<=a&&Pb.test(String.fromCharCode(a))},ca,Ia={kind:"loop"},Ob={kind:"switch"}}; -"object"==typeof exports&&"object"==typeof module?mod$$inline_58(exports):"function"==typeof define&&define.amd?define(["exports"],mod$$inline_58):mod$$inline_58(this.acorn||(this.acorn={})); -var Interpreter=function(a,b){this.initFunc_=b;this.UNDEFINED=this.createPrimitive(void 0);this.ast=acorn.parse(a);this.paused_=!1;var c=this.createScope(this.ast,null);this.stateStack=[{node:this.ast,scope:c,thisExpression:c}]};Interpreter.prototype.step=function(){if(!this.stateStack.length)return!1;if(this.paused_)return!0;var a=this.stateStack[0];this["step"+a.node.type]();return!0};Interpreter.prototype.run=function(){for(;!this.paused_&&this.step(););return this.paused_}; -Interpreter.prototype.initGlobalScope=function(a){this.setProperty(a,"Infinity",this.createPrimitive(Infinity),!0);this.setProperty(a,"NaN",this.createPrimitive(NaN),!0);this.setProperty(a,"undefined",this.UNDEFINED,!0);this.setProperty(a,"window",a,!0);this.setProperty(a,"self",a,!1);this.initFunction(a);this.initObject(a);a.parent=this.OBJECT;this.initArray(a);this.initNumber(a);this.initString(a);this.initBoolean(a);this.initDate(a);this.initMath(a);this.initRegExp(a);this.initJSON(a);var b=this, -c;c=function(a){a=a||b.UNDEFINED;return b.createPrimitive(isNaN(a.toNumber()))};this.setProperty(a,"isNaN",this.createNativeFunction(c));c=function(a){a=a||b.UNDEFINED;return b.createPrimitive(isFinite(a.toNumber()))};this.setProperty(a,"isFinite",this.createNativeFunction(c));c=function(a){a=a||b.UNDEFINED;return b.createPrimitive(parseFloat(a.toNumber()))};this.setProperty(a,"parseFloat",this.createNativeFunction(c));c=function(a,c){a=a||b.UNDEFINED;c=c||b.UNDEFINED;return b.createPrimitive(parseInt(a.toString(), -c.toNumber()))};this.setProperty(a,"parseInt",this.createNativeFunction(c));c=this.createObject(this.FUNCTION);c.eval=!0;this.setProperty(c,"length",this.createPrimitive(1),!0);this.setProperty(a,"eval",c);for(var d="escape unescape decodeURI decodeURIComponent encodeURI encodeURIComponent".split(" "),f=0;fa?Math.max(this.length+a,0):Math.min(a,this.length);e=c(e,Infinity);e=Math.min(e,this.length-a);for(var m=b.createObject(b.ARRAY),r=a;r=a;r--)this.properties[r+arguments.length-2]=this.properties[r];this.length+=arguments.length-2;for(r=2;rm&&(m=this.length+m);var m= -Math.max(0,Math.min(m,this.length)),r=c(e,this.length);0>r&&(r=this.length+r);for(var r=Math.max(0,Math.min(r,this.length)),A=0;mh&&(h=this.length+h);for(h=Math.max(0,Math.min(h, -this.length));hh&&(h=this.length+h);for(h=Math.max(0,Math.min(h,this.length));0<=h;h--){var m=b.getProperty(this,h);if(0==b.comp(m,a))return b.createPrimitive(h)}return b.createPrimitive(-1)};this.setProperty(this.ARRAY.properties.prototype, -"lastIndexOf",this.createNativeFunction(d),!1,!0);d=function(){for(var a=[],c=0;cb?1:0};Interpreter.prototype.arrayIndex=function(a){a=Number(a);return!isFinite(a)||a!=Math.floor(a)||0>a?NaN:a}; -Interpreter.prototype.createPrimitive=function(a){if(void 0===a&&this.UNDEFINED)return this.UNDEFINED;if(a instanceof RegExp)return this.createRegExp(this.createObject(this.REGEXP),a);var b=typeof a;a={data:a,isPrimitive:!0,type:b,toBoolean:function(){return Boolean(this.data)},toNumber:function(){return Number(this.data)},toString:function(){return String(this.data)},valueOf:function(){return this.data}};"number"==b?a.parent=this.NUMBER:"string"==b?a.parent=this.STRING:"boolean"==b&&(a.parent=this.BOOLEAN); -return a}; -Interpreter.prototype.createObject=function(a){a={isPrimitive:!1,type:"object",parent:a,fixed:Object.create(null),nonenumerable:Object.create(null),properties:Object.create(null),toBoolean:function(){return!0},toNumber:function(){return 0},toString:function(){return"["+this.type+"]"},valueOf:function(){return this}};this.isa(a,this.FUNCTION)&&(a.type="function",this.setProperty(a,"prototype",this.createObject(this.OBJECT||null)));this.isa(a,this.ARRAY)&&(a.length=0,a.toString=function(){for(var a=[], -c=0;c>="==b.operator)b=f>>e;else if(">>>="==b.operator)b=f>>>e;else if("&="==b.operator)b=f&e;else if("^="==b.operator)b=f^e;else if("|="==b.operator)b=f|e;else throw"Unknown assignment expression: "+b.operator;b=this.createPrimitive(b)}this.setValue(c,b);this.stateStack[0].value=b}else a.doneRight=!0,a.leftSide=a.value,this.stateStack.unshift({node:b.right});else a.doneLeft=!0,this.stateStack.unshift({node:b.left,components:!0})}; -Interpreter.prototype.stepBinaryExpression=function(){var a=this.stateStack[0],b=a.node;if(a.doneLeft)if(a.doneRight){this.stateStack.shift();var c=a.leftValue,a=a.value,d=this.comp(c,a);if("=="==b.operator||"!="==b.operator)c=c.isPrimitive&&a.isPrimitive?c.data==a.data:0===d,"!="==b.operator&&(c=!c);else if("==="==b.operator||"!=="==b.operator)c=c.isPrimitive&&a.isPrimitive?c.data===a.data:c===a,"!=="==b.operator&&(c=!c);else if(">"==b.operator)c=1==d;else if(">="==b.operator)c=1==d||0===d;else if("<"== -b.operator)c=-1==d;else if("<="==b.operator)c=-1==d||0===d;else if("+"==b.operator)"string"==c.type||"string"==a.type?(c=c.toString(),a=a.toString()):(c=c.toNumber(),a=a.toNumber()),c+=a;else if("in"==b.operator)c=this.hasProperty(a,c);else if(c=c.toNumber(),a=a.toNumber(),"-"==b.operator)c-=a;else if("*"==b.operator)c*=a;else if("/"==b.operator)c/=a;else if("%"==b.operator)c%=a;else if("&"==b.operator)c&=a;else if("|"==b.operator)c|=a;else if("^"==b.operator)c^=a;else if("<<"==b.operator)c<<=a;else if(">>"== -b.operator)c>>=a;else if(">>>"==b.operator)c>>>=a;else throw"Unknown binary operator: "+b.operator;this.stateStack[0].value=this.createPrimitive(c)}else a.doneRight=!0,a.leftValue=a.value,this.stateStack.unshift({node:b.right});else a.doneLeft=!0,this.stateStack.unshift({node:b.left})}; -Interpreter.prototype.stepBreakStatement=function(){var a=this.stateStack.shift(),a=a.node,b=null;a.label&&(b=a.label.name);for(a=this.stateStack.shift();a&&"callExpression"!=a.node.type;){if(b?b==a.label:a.isLoop||a.isSwitch)return;a=this.stateStack.shift()}throw new SyntaxError("Illegal break statement");};Interpreter.prototype.stepBlockStatement=function(){var a=this.stateStack[0],b=a.node,c=a.n_||0;b.body[c]?(a.n_=c+1,this.stateStack.unshift({node:b.body[c]})):this.stateStack.shift()}; -Interpreter.prototype.stepCallExpression=function(){var a=this.stateStack[0],b=a.node;if(a.doneCallee_){if(a.func_)c=a.n_,a.arguments.length!=b.arguments.length&&(a.arguments[c-1]=a.value);else{if("function"==a.value.type)a.func_=a.value;else if(a.member_=a.value[0],a.func_=this.getValue(a.value),!a.func_||"function"!=a.func_.type)throw new TypeError((a.func_&&a.func_.type)+" is not a function");"NewExpression"==a.node.type?(a.funcThis_=this.createObject(a.func_),a.isConstructor_=!0):a.funcThis_= -a.value.length?a.value[0]:this.stateStack[this.stateStack.length-1].thisExpression;a.arguments=[];var c=0}if(b.arguments[c])a.n_=c+1,this.stateStack.unshift({node:b.arguments[c]});else if(a.doneExec)this.stateStack.shift(),this.stateStack[0].value=a.isConstructor_?a.funcThis_:a.value;else{a.doneExec=!0;if(a.func_.node&&("FunctionApply_"==a.func_.node.type||"FunctionCall_"==a.func_.node.type)){a.funcThis_=a.arguments.shift();if("FunctionApply_"==a.func_.node.type){var d=a.arguments.shift();if(d&&this.isa(d, -this.ARRAY))for(a.arguments=[],b=0;bb?a.arguments[b]:this.UNDEFINED;this.setProperty(c,d,f)}d=this.createObject(this.ARRAY);for(b=0;b - - - - Blockly Demo: JS Interpreter - - - - - - - - -

    Blockly > - Demos > JS Interpreter

    - -

    This is a simple demo of executing code with a sandboxed JavaScript interpreter.

    - -

    → More info on JS Interpreter...

    - -

    - - -

    - -
    - - - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/maxBlocks/icon.png b/src/opsoro/apps/visual_programming/static/blockly/demos/maxBlocks/icon.png deleted file mode 100644 index 13bf65a..0000000 Binary files a/src/opsoro/apps/visual_programming/static/blockly/demos/maxBlocks/icon.png and /dev/null differ diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/maxBlocks/index.html b/src/opsoro/apps/visual_programming/static/blockly/demos/maxBlocks/index.html deleted file mode 100644 index 4b9134e..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/maxBlocks/index.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - Blockly Demo: Maximum Block Limit - - - - - - -

    Blockly > - Demos > Maximum Block Limit

    - -

    This is a demo of Blockly which has been restricted to a maximum of five blocks.

    - -

    You have block(s) left.

    - -
    - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/README.txt b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/README.txt deleted file mode 100644 index 6da3fa6..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/README.txt +++ /dev/null @@ -1,26 +0,0 @@ -This Blockly demo uses Closure Templates to create a multilingual application. -Any changes to the template.soy file require a recompile. Here is the command -to generate a quick English version for debugging: - -java -jar soy/SoyToJsSrcCompiler.jar --outputPathFormat generated/en.js --srcs template.soy - -To generate a full set of language translations, first extract all the strings -from template.soy using this command: - -java -jar soy/SoyMsgExtractor.jar --outputFile xlf/extracted_msgs.xlf template.soy - -This generates xlf/extracted_msgs.xlf, which may then be used by any -XLIFF-compatible translation console to generate a set of files with the -translated strings. These should be placed in the xlf directory. - -Finally, generate all the language versions wih this command: - -java -jar soy/SoyToJsSrcCompiler.jar --locales ar,be-tarask,br,ca,da,de,el,en,es,fa,fr,he,hrx,hu,ia,is,it,ja,ko,ms,nb,nl,pl,pms,pt-br,ro,ru,sc,sv,th,tr,uk,vi,zh-hans,zh-hant --messageFilePathFormat xlf/translated_msgs_{LOCALE}.xlf --outputPathFormat "generated/{LOCALE}.js" template.soy - -This is the process that Google uses for maintaining Blockly Games in 40+ -languages. The XLIFF fromat is simple enough that it is trival to write a -Python script to reformat it into some other format (such as JSON) for -compatability with other translation consoles. - -For more information, see message translation for Closure Templates: -https://developers.google.com/closure/templates/docs/translation diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/blocks.js b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/blocks.js deleted file mode 100644 index 18be29c..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/blocks.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Blockly Demos: Plane Seat Calculator Blocks - * - * Copyright 2013 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Blocks for Blockly's Plane Seat Calculator application. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -Blockly.Blocks['plane_set_seats'] = { - // Block seat variable setter. - init: function() { - this.setHelpUrl(Blockly.Msg.VARIABLES_SET_HELPURL); - this.setColour(330); - this.appendValueInput('VALUE') - .appendField(Plane.getMsg('Plane_setSeats')); - this.setTooltip(Blockly.Msg.VARIABLES_SET_TOOLTIP); - this.setDeletable(false); - } -}; - -Blockly.JavaScript['plane_set_seats'] = function(block) { - // Generate JavaScript for seat variable setter. - var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_ASSIGNMENT) || 'NaN'; - return argument0 + ';'; -}; - -Blockly.Blocks['plane_get_rows'] = { - // Block for row variable getter. - init: function() { - this.setHelpUrl(Blockly.Msg.VARIABLES_GET_HELPURL); - this.setColour(330); - this.appendDummyInput() - .appendField(Plane.getMsg('Plane_getRows'), 'title'); - this.setOutput(true, 'Number'); - }, - customUpdate: function() { - this.setFieldValue( - Plane.getMsg('Plane_getRows').replace('%1', Plane.rows1st), 'title'); - } -}; - -Blockly.JavaScript['plane_get_rows'] = function(block) { - // Generate JavaScript for row variable getter. - return ['Plane.rows1st', Blockly.JavaScript.ORDER_MEMBER]; -}; - -Blockly.Blocks['plane_get_rows1st'] = { - // Block for first class row variable getter. - init: function() { - this.setHelpUrl(Blockly.Msg.VARIABLES_GET_HELPURL); - this.setColour(330); - this.appendDummyInput() - .appendField(Plane.getMsg('Plane_getRows1'), 'title'); - this.setOutput(true, 'Number'); - }, - customUpdate: function() { - this.setFieldValue( - Plane.getMsg('Plane_getRows1').replace('%1', Plane.rows1st), 'title'); - } -}; - -Blockly.JavaScript['plane_get_rows1st'] = function(block) { - // Generate JavaScript for first class row variable getter. - return ['Plane.rows1st', Blockly.JavaScript.ORDER_MEMBER]; -}; - -Blockly.Blocks['plane_get_rows2nd'] = { - // Block for second class row variable getter. - init: function() { - this.setHelpUrl(Blockly.Msg.VARIABLES_GET_HELPURL); - this.setColour(330); - this.appendDummyInput() - .appendField(Plane.getMsg('Plane_getRows2'), 'title'); - this.setOutput(true, 'Number'); - }, - customUpdate: function() { - this.setFieldValue( - Plane.getMsg('Plane_getRows2').replace('%1', Plane.rows2nd), 'title'); - } -}; - -Blockly.JavaScript['plane_get_rows2nd'] = function(block) { - // Generate JavaScript for second class row variable getter. - return ['Plane.rows2nd', Blockly.JavaScript.ORDER_MEMBER]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/generated/ar.js b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/generated/ar.js deleted file mode 100644 index 7b3031c..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/generated/ar.js +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated from template.soy. -// Please don't edit this file by hand. - -if (typeof planepage == 'undefined') { var planepage = {}; } - - -planepage.messages = function(opt_data, opt_ignored, opt_ijData) { - return '
    الصفوف: %1الصفوف (%1)صفوف الطبقة الأولى: %1صفوف الطبقة الأولى (%1)صفوف الفئة الثانية: %1صفوف الفئة الثانية: (%1)المقاعد: %1؟المقاعد =
    '; -}; - - -planepage.start = function(opt_data, opt_ignored, opt_ijData) { - var output = planepage.messages(null, null, opt_ijData) + '

    Blockly‏ > Demos‏ > آلة حاسبة لمقعد الطائرة   '; - var iLimit37 = opt_ijData.maxLevel + 1; - for (var i37 = 1; i37 < iLimit37; i37++) { - output += ' ' + ((i37 == opt_ijData.level) ? '' + soy.$$escapeHtml(i37) + '' : (i37 < opt_ijData.level) ? '' : '' + soy.$$escapeHtml(i37) + ''); - } - output += '

    - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/plane.js b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/plane.js deleted file mode 100644 index c931c68..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/plane.js +++ /dev/null @@ -1,443 +0,0 @@ -/** - * Blockly Demos: Plane Seat Calculator - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview JavaScript for Blockly's Plane Seat Calculator demo. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * Create a namespace for the application. - */ -var Plane = {}; - -/** - * Lookup for names of supported languages. Keys should be in ISO 639 format. - */ -Plane.LANGUAGE_NAME = { - 'ar': 'العربية', - 'be-tarask': 'Taraškievica', - 'br': 'Brezhoneg', - 'ca': 'Català', - 'da': 'Dansk', - 'de': 'Deutsch', - 'el': 'Ελληνικά', - 'en': 'English', - 'es': 'Español', - 'fa': 'فارسی', - 'fr': 'Français', - 'he': 'עברית', - 'hrx': 'Hunsrik', - 'hu': 'Magyar', - 'ia': 'Interlingua', - 'is': 'Íslenska', - 'it': 'Italiano', - 'ja': '日本語', - 'ko': '한국어', - 'ms': 'Bahasa Melayu', - 'nb': 'Norsk Bokmål', - 'nl': 'Nederlands, Vlaams', - 'pl': 'Polski', - 'pms': 'Piemontèis', - 'pt-br': 'Português Brasileiro', - 'ro': 'Română', - 'ru': 'Русский', - 'sc': 'Sardu', - 'sv': 'Svenska', - 'th': 'ภาษาไทย', - 'tr': 'Türkçe', - 'uk': 'Українська', - 'vi': 'Tiếng Việt', - 'zh-hans': '簡體中文', - 'zh-hant': '正體中文' -}; - -/** - * List of RTL languages. - */ -Plane.LANGUAGE_RTL = ['ar', 'fa', 'he']; - -/** - * Main Blockly workspace. - * @type {Blockly.WorkspaceSvg} - */ -Plane.workspace = null; - -/** - * Extracts a parameter from the URL. - * If the parameter is absent default_value is returned. - * @param {string} name The name of the parameter. - * @param {string} defaultValue Value to return if paramater not found. - * @return {string} The parameter value or the default value if not found. - */ -Plane.getStringParamFromUrl = function(name, defaultValue) { - var val = location.search.match(new RegExp('[?&]' + name + '=([^&]+)')); - return val ? decodeURIComponent(val[1].replace(/\+/g, '%20')) : defaultValue; -}; - -/** - * Extracts a numeric parameter from the URL. - * If the parameter is absent or less than min_value, min_value is - * returned. If it is greater than max_value, max_value is returned. - * @param {string} name The name of the parameter. - * @param {number} minValue The minimum legal value. - * @param {number} maxValue The maximum legal value. - * @return {number} A number in the range [min_value, max_value]. - */ -Plane.getNumberParamFromUrl = function(name, minValue, maxValue) { - var val = Number(Plane.getStringParamFromUrl(name, 'NaN')); - return isNaN(val) ? minValue : Math.min(Math.max(minValue, val), maxValue); -}; - -/** - * Get the language of this user from the URL. - * @return {string} User's language. - */ -Plane.getLang = function() { - var lang = Plane.getStringParamFromUrl('lang', ''); - if (Plane.LANGUAGE_NAME[lang] === undefined) { - // Default to English. - lang = 'en'; - } - return lang; -}; - -/** - * Is the current language (Plane.LANG) an RTL language? - * @return {boolean} True if RTL, false if LTR. - */ -Plane.isRtl = function() { - return Plane.LANGUAGE_RTL.indexOf(Plane.LANG) != -1; -}; - -/** - * Load blocks saved in session/local storage. - * @param {string} defaultXml Text representation of default blocks. - */ -Plane.loadBlocks = function(defaultXml) { - try { - var loadOnce = window.sessionStorage.loadOnceBlocks; - } catch(e) { - // Firefox sometimes throws a SecurityError when accessing sessionStorage. - // Restarting Firefox fixes this, so it looks like a bug. - var loadOnce = null; - } - if (loadOnce) { - // Language switching stores the blocks during the reload. - delete window.sessionStorage.loadOnceBlocks; - var xml = Blockly.Xml.textToDom(loadOnce); - Blockly.Xml.domToWorkspace(Plane.workspace, xml); - } else if (defaultXml) { - // Load the editor with default starting blocks. - var xml = Blockly.Xml.textToDom(defaultXml); - Blockly.Xml.domToWorkspace(Plane.workspace, xml); - } -}; - -/** - * Save the blocks and reload with a different language. - */ -Plane.changeLanguage = function() { - // Store the blocks for the duration of the reload. - // This should be skipped for the index page, which has no blocks and does - // not load Blockly. - // MSIE 11 does not support sessionStorage on file:// URLs. - if (typeof Blockly != 'undefined' && window.sessionStorage) { - var xml = Blockly.Xml.workspaceToDom(Plane.workspace); - var text = Blockly.Xml.domToText(xml); - window.sessionStorage.loadOnceBlocks = text; - } - - var languageMenu = document.getElementById('languageMenu'); - var newLang = encodeURIComponent( - languageMenu.options[languageMenu.selectedIndex].value); - var search = window.location.search; - if (search.length <= 1) { - search = '?lang=' + newLang; - } else if (search.match(/[?&]lang=[^&]*/)) { - search = search.replace(/([?&]lang=)[^&]*/, '$1' + newLang); - } else { - search = search.replace(/\?/, '?lang=' + newLang + '&'); - } - - window.location = window.location.protocol + '//' + - window.location.host + window.location.pathname + search; -}; - -/** - * Gets the message with the given key from the document. - * @param {string} key The key of the document element. - * @return {string} The textContent of the specified element, - * or an error message if the element was not found. - */ -Plane.getMsg = function(key) { - var element = document.getElementById(key); - if (element) { - var text = element.textContent; - // Convert newline sequences. - text = text.replace(/\\n/g, '\n'); - return text; - } else { - return '[Unknown message: ' + key + ']'; - } -}; - -/** - * User's language (e.g. "en"). - * @type {string} - */ -Plane.LANG = Plane.getLang(); - -Plane.MAX_LEVEL = 3; -Plane.LEVEL = Plane.getNumberParamFromUrl('level', 1, Plane.MAX_LEVEL); - -Plane.rows1st = 0; -Plane.rows2nd = 0; - -/** - * Redraw the rows when the slider has moved. - * @param {number} value New slider position. - */ -Plane.sliderChange = function(value) { - var newRows = Math.round(value * 410 / 20); - Plane.redraw(newRows); -}; - -/** - * Change the text of a label. - * @param {string} id ID of element to change. - * @param {string} text New text. - */ -Plane.setText = function(id, text) { - var el = document.getElementById(id); - while (el.firstChild) { - el.removeChild(el.firstChild); - } - el.appendChild(document.createTextNode(text)); -}; - -/** - * Display a checkmark or cross next to the answer. - * @param {?boolean} ok True for checkmark, false for cross, null for nothing. - */ -Plane.setCorrect = function(ok) { - var yes = document.getElementById('seatYes'); - var no = document.getElementById('seatNo'); - yes.style.display = 'none'; - no.style.display = 'none'; - if (ok === true) { - yes.style.display = 'block'; - } else if (ok === false) { - no.style.display = 'block'; - } -}; - -/** - * Initialize Blockly and the SVG plane. - */ -Plane.init = function() { - Plane.initLanguage(); - - // Fixes viewport for small screens. - var viewport = document.querySelector('meta[name="viewport"]'); - if (viewport && screen.availWidth < 725) { - viewport.setAttribute('content', - 'width=725, initial-scale=.35, user-scalable=no'); - } - - Plane.workspace = Blockly.inject('blockly', - {media: '../../media/', - rtl: Plane.isRtl(), - toolbox: document.getElementById('toolbox')}); - - var defaultXml = - '' + - ' ' + - ' ' + - ''; - Plane.loadBlocks(defaultXml); - - Plane.workspace.addChangeListener(Plane.recalculate); - - // Initialize the slider. - var svg = document.getElementById('plane'); - Plane.rowSlider = new Slider(60, 330, 425, svg, Plane.sliderChange); - Plane.rowSlider.setValue(0.225); - - // Draw five 1st class rows. - Plane.redraw(5); -}; - -/** - * Initialize the page language. - */ -Plane.initLanguage = function() { - // Set the page title with the content of the H1 title. - document.title += ' ' + document.getElementById('title').textContent; - - // Set the HTML's language and direction. - // document.dir fails in Mozilla, use document.body.parentNode.dir instead. - // https://bugzilla.mozilla.org/show_bug.cgi?id=151407 - var rtl = Plane.isRtl(); - document.head.parentElement.setAttribute('dir', rtl ? 'rtl' : 'ltr'); - document.head.parentElement.setAttribute('lang', Plane.LANG); - - // Sort languages alphabetically. - var languages = []; - for (var lang in Plane.LANGUAGE_NAME) { - languages.push([Plane.LANGUAGE_NAME[lang], lang]); - } - var comp = function(a, b) { - // Sort based on first argument ('English', 'Русский', '简体字', etc). - if (a[0] > b[0]) return 1; - if (a[0] < b[0]) return -1; - return 0; - }; - languages.sort(comp); - // Populate the language selection menu. - var languageMenu = document.getElementById('languageMenu'); - languageMenu.options.length = 0; - for (var i = 0; i < languages.length; i++) { - var tuple = languages[i]; - var lang = tuple[tuple.length - 1]; - var option = new Option(tuple[0], lang); - if (lang == Plane.LANG) { - option.selected = true; - } - languageMenu.options.add(option); - } - languageMenu.addEventListener('change', Plane.changeLanguage, true); -}; - -/** - * Use the blocks to calculate the number of seats. - * Display the calculated number. - */ -Plane.recalculate = function() { - // Find the 'set' block and use it as the formula root. - var rootBlock = null; - var blocks = Plane.workspace.getTopBlocks(false); - for (var i = 0, block; block = blocks[i]; i++) { - if (block.type == 'plane_set_seats') { - rootBlock = block; - } - } - var seats = NaN; - Blockly.JavaScript.init(Plane.workspace); - var code = Blockly.JavaScript.blockToCode(rootBlock); - try { - seats = eval(code); - } catch (e) { - // Allow seats to remain NaN. - } - Plane.setText('seatText', - Plane.getMsg('Plane_seats').replace( - '%1', isNaN(seats) ? '?' : seats)); - Plane.setCorrect(isNaN(seats) ? null : (Plane.answer() == seats)); - - // Update blocks to show values. - function updateBlocks(blocks) { - for (var i = 0, block; block = blocks[i]; i++) { - block.customUpdate && block.customUpdate(); - } - } - updateBlocks(Plane.workspace.getAllBlocks()); - updateBlocks(Plane.workspace.flyout_.workspace_.getAllBlocks()); -}; - -/** - * Calculate the correct answer. - * @return {number} Number of seats. - */ -Plane.answer = function() { - if (Plane.LEVEL == 1) { - return Plane.rows1st * 4; - } else if (Plane.LEVEL == 2) { - return 2 + (Plane.rows1st * 4); - } else if (Plane.LEVEL == 3) { - return 2 + (Plane.rows1st * 4) + (Plane.rows2nd * 5); - } - throw 'Unknown level.'; -}; - -/** - * Redraw the SVG to show a new number of rows. - * @param {number} newRows - */ -Plane.redraw = function(newRows) { - var rows1st = Plane.rows1st; - var rows2nd = Plane.rows2nd; - var svg = document.getElementById('plane'); - if (newRows != rows1st) { - while (newRows < rows1st) { - var row = document.getElementById('row1st' + rows1st); - row.parentNode.removeChild(row); - rows1st--; - } - while (newRows > rows1st) { - rows1st++; - var row = document.createElementNS('http://www.w3.org/2000/svg', 'use'); - row.setAttribute('id', 'row1st' + rows1st); - // Row of 4 seats. - row.setAttribute('x', (rows1st - 1) * 20); - row.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', '#row1st'); - svg.appendChild(row); - } - - if (Plane.LEVEL == 3) { - newRows = Math.floor((21 - newRows) * 1.11); - while (newRows < rows2nd) { - var row = document.getElementById('row2nd' + rows2nd); - row.parentNode.removeChild(row); - rows2nd--; - } - while (newRows > rows2nd) { - rows2nd++; - var row = document.createElementNS('http://www.w3.org/2000/svg', - 'use'); - row.setAttribute('id', 'row2nd' + rows2nd); - row.setAttribute('x', 400 - (rows2nd - 1) * 18); - row.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', '#row2nd'); - svg.appendChild(row); - } - } - - if (Plane.LEVEL < 3) { - Plane.setText('row1stText', - Plane.getMsg('Plane_rows').replace('%1', rows1st)); - } else { - Plane.setText('row1stText', - Plane.getMsg('Plane_rows1').replace('%1', rows1st)); - Plane.setText('row2ndText', - Plane.getMsg('Plane_rows2').replace('%1', rows2nd)); - } - - Plane.rows1st = rows1st; - Plane.rows2nd = rows2nd; - Plane.recalculate(); - } -}; - -window.addEventListener('load', Plane.init); - -// Load the user's language pack. -document.write('\n'); diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/slider.js b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/slider.js deleted file mode 100644 index 2df67b8..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/slider.js +++ /dev/null @@ -1,287 +0,0 @@ -/** - * Blockly Demos: SVG Slider - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview A slider control in SVG. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - - -/** - * Object representing a horizontal slider widget. - * @param {number} x The horizontal offset of the slider. - * @param {number} y The vertical offset of the slider. - * @param {number} width The total width of the slider. - * @param {!Element} svgParent The SVG element to append the slider to. - * @param {Function=} opt_changeFunc Optional callback function that will be - * called when the slider is moved. The current value is passed. - * @constructor - */ -var Slider = function(x, y, width, svgParent, opt_changeFunc) { - this.KNOB_Y_ = y - 12; - this.KNOB_MIN_X_ = x + 8; - this.KNOB_MAX_X_ = x + width - 8; - this.TARGET_OVERHANG_ = 20; - this.value_ = 0.5; - this.changeFunc_ = opt_changeFunc; - this.animationTasks_ = []; - - // Draw the slider. - /* - - - - - */ - var track = document.createElementNS(Slider.SVG_NS_, 'line'); - track.setAttribute('class', 'sliderTrack'); - track.setAttribute('x1', x); - track.setAttribute('y1', y); - track.setAttribute('x2', x + width); - track.setAttribute('y2', y); - svgParent.appendChild(track); - this.track_ = track; - var rect = document.createElementNS(Slider.SVG_NS_, 'rect'); - rect.setAttribute('style', 'opacity: 0'); - rect.setAttribute('x', x - this.TARGET_OVERHANG_); - rect.setAttribute('y', y - this.TARGET_OVERHANG_); - rect.setAttribute('width', width + 2 * this.TARGET_OVERHANG_); - rect.setAttribute('height', 2 * this.TARGET_OVERHANG_); - rect.setAttribute('rx', this.TARGET_OVERHANG_); - rect.setAttribute('ry', this.TARGET_OVERHANG_); - svgParent.appendChild(rect); - this.trackTarget_ = rect; - var knob = document.createElementNS(Slider.SVG_NS_, 'path'); - knob.setAttribute('class', 'sliderKnob'); - knob.setAttribute('d', 'm 0,0 l -8,8 v 12 h 16 v -12 z'); - svgParent.appendChild(knob); - this.knob_ = knob; - var circle = document.createElementNS(Slider.SVG_NS_, 'circle'); - circle.setAttribute('style', 'opacity: 0'); - circle.setAttribute('r', this.TARGET_OVERHANG_); - circle.setAttribute('cy', y); - svgParent.appendChild(circle); - this.knobTarget_ = circle; - this.setValue(0.5); - - // Find the root SVG object. - while (svgParent && svgParent.nodeName.toLowerCase() != 'svg') { - svgParent = svgParent.parentNode; - } - this.SVG_ = svgParent; - - // Bind the events to this slider. - Slider.bindEvent_(this.knobTarget_, 'mousedown', this, this.knobMouseDown_); - Slider.bindEvent_(this.knobTarget_, 'touchstart', this, this.knobMouseDown_); - Slider.bindEvent_(this.trackTarget_, 'mousedown', this, this.rectMouseDown_); - Slider.bindEvent_(this.SVG_, 'mouseup', null, Slider.knobMouseUp_); - Slider.bindEvent_(this.SVG_, 'touchend', null, Slider.knobMouseUp_); - Slider.bindEvent_(this.SVG_, 'mousemove', null, Slider.knobMouseMove_); - Slider.bindEvent_(this.SVG_, 'touchmove', null, Slider.knobMouseMove_); - Slider.bindEvent_(document, 'mouseover', null, Slider.mouseOver_); -}; - - -Slider.SVG_NS_ = 'http://www.w3.org/2000/svg'; - -Slider.activeSlider_ = null; -Slider.startMouseX_ = 0; -Slider.startKnobX_ = 0; - -/** - * Start a drag when clicking down on the knob. - * @param {!Event} e Mouse-down event. - * @private - */ -Slider.prototype.knobMouseDown_ = function(e) { - if (e.type == 'touchstart') { - if (e.changedTouches.length != 1) { - return; - } - Slider.touchToMouse_(e) - } - Slider.activeSlider_ = this; - Slider.startMouseX_ = this.mouseToSvg_(e).x; - Slider.startKnobX_ = 0; - var transform = this.knob_.getAttribute('transform'); - if (transform) { - var r = transform.match(/translate\(\s*([-\d.]+)/); - if (r) { - Slider.startKnobX_ = Number(r[1]); - } - } - // Stop browser from attempting to drag the knob or - // from scrolling/zooming the page. - e.preventDefault(); -}; - -/** - * Stop a drag when clicking up anywhere. - * @param {Event} e Mouse-up event. - * @private - */ -Slider.knobMouseUp_ = function(e) { - Slider.activeSlider_ = null; -}; - -/** - * Stop a drag when the mouse enters a node not part of the SVG. - * @param {Event} e Mouse-up event. - * @private - */ -Slider.mouseOver_ = function(e) { - if (!Slider.activeSlider_) { - return; - } - var node = e.target; - // Find the root SVG object. - do { - if (node == Slider.activeSlider_.SVG_) { - return; - } - } while (node = node.parentNode); - Slider.knobMouseUp_(e); -}; - -/** - * Drag the knob to follow the mouse. - * @param {!Event} e Mouse-move event. - * @private - */ -Slider.knobMouseMove_ = function(e) { - var thisSlider = Slider.activeSlider_; - if (!thisSlider) { - return; - } - if (e.type == 'touchmove') { - if (e.changedTouches.length != 1) { - return; - } - Slider.touchToMouse_(e) - } - var x = thisSlider.mouseToSvg_(e).x - Slider.startMouseX_ + - Slider.startKnobX_; - thisSlider.setValue((x - thisSlider.KNOB_MIN_X_) / - (thisSlider.KNOB_MAX_X_ - thisSlider.KNOB_MIN_X_)); -}; - -/** - * Jump to a new value when the track is clicked. - * @param {!Event} e Mouse-down event. - * @private - */ -Slider.prototype.rectMouseDown_ = function(e) { - if (e.type == 'touchstart') { - if (e.changedTouches.length != 1) { - return; - } - Slider.touchToMouse_(e) - } - var x = this.mouseToSvg_(e).x; - this.animateValue((x - this.KNOB_MIN_X_) / - (this.KNOB_MAX_X_ - this.KNOB_MIN_X_)); -}; - -/** - * Returns the slider's value (0.0 - 1.0). - * @return {number} Current value. - */ -Slider.prototype.getValue = function() { - return this.value_; -}; - -/** - * Animates the slider's value (0.0 - 1.0). - * @param {number} value New value. - */ -Slider.prototype.animateValue = function(value) { - // Clear any ongoing animations. - while (this.animationTasks_.length) { - clearTimeout(this.animationTasks_.pop()); - } - var duration = 200; // Milliseconds to animate for. - var steps = 10; // Number of steps to animate. - var oldValue = this.getValue(); - var thisSlider = this; - var stepFunc = function(i) { - return function() { - var newVal = i * (value - oldValue) / (steps - 1) + oldValue; - thisSlider.setValue(newVal); - }; - } - for (var i = 0; i < steps; i++) { - this.animationTasks_.push(setTimeout(stepFunc(i), i * duration / steps)); - } -}; - -/** - * Sets the slider's value (0.0 - 1.0). - * @param {number} value New value. - */ -Slider.prototype.setValue = function(value) { - this.value_ = Math.min(Math.max(value, 0), 1); - var x = this.KNOB_MIN_X_ + - (this.KNOB_MAX_X_ - this.KNOB_MIN_X_) * this.value_; - this.knob_.setAttribute('transform', - 'translate(' + x + ',' + this.KNOB_Y_ + ')'); - this.knobTarget_.setAttribute('cx', x); - this.changeFunc_ && this.changeFunc_(this.value_); -}; - -/** - * Convert the mouse coordinates into SVG coordinates. - * @param {!Object} e Object with x and y mouse coordinates. - * @return {!Object} Object with x and y properties in SVG coordinates. - * @private - */ -Slider.prototype.mouseToSvg_ = function(e) { - var svgPoint = this.SVG_.createSVGPoint(); - svgPoint.x = e.clientX; - svgPoint.y = e.clientY; - var matrix = this.SVG_.getScreenCTM().inverse(); - return svgPoint.matrixTransform(matrix); -}; - -/** - * Bind an event to a function call. - * @param {!Node} node Node upon which to listen. - * @param {string} name Event name to listen to (e.g. 'mousedown'). - * @param {Object} thisObject The value of 'this' in the function. - * @param {!Function} func Function to call when event is triggered. - * @private - */ -Slider.bindEvent_ = function(node, name, thisObject, func) { - var wrapFunc = function(e) { - func.apply(thisObject, arguments); - }; - node.addEventListener(name, wrapFunc, false); -}; - -/** - * Map the touch event's properties to be compatible with a mouse event. - * @param {TouchEvent} e Event to modify. - */ -Slider.touchToMouse_ = function(e) { - var touchPoint = e.changedTouches[0]; - e.clientX = touchPoint.clientX; - e.clientY = touchPoint.clientY; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/soy/COPYING b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/soy/COPYING deleted file mode 100644 index d645695..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/soy/COPYING +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/soy/README b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/soy/README deleted file mode 100644 index e3447f2..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/soy/README +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2009 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - - -Contents: - -+ SoyToJsSrcCompiler.jar - Executable jar that compiles template files into JavaScript files. - -+ SoyMsgExtractor.jar - Executable jar that extracts messages from template files into XLF files. - -+ soyutils.js - Helper utilities required by all JavaScript code that SoyToJsSrcCompiler - generates. Equivalent functionality to soyutils_usegoog.js, but this - version does not need Closure Library. - - -Instructions: - -+ A simple Hello World for JavaScript: - http://code.google.com/closure/templates/docs/helloworld_js.html - -+ Complete documentation: - http://code.google.com/closure/templates/ - -+ Closure Templates project on Google Code: - http://code.google.com/p/closure-templates/ - - -Notes: - -+ Closure Templates requires Java 6 or higher: - http://www.java.com/ diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/soy/SoyMsgExtractor.jar b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/soy/SoyMsgExtractor.jar deleted file mode 100644 index d7d2619..0000000 Binary files a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/soy/SoyMsgExtractor.jar and /dev/null differ diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/soy/SoyToJsSrcCompiler.jar b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/soy/SoyToJsSrcCompiler.jar deleted file mode 100644 index 540a070..0000000 Binary files a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/soy/SoyToJsSrcCompiler.jar and /dev/null differ diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/soy/soyutils.js b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/soy/soyutils.js deleted file mode 100644 index bde8e41..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/soy/soyutils.js +++ /dev/null @@ -1,2767 +0,0 @@ -/* - * Copyright 2008 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview - * Utility functions and classes for Soy. - * - *

    - * The top portion of this file contains utilities for Soy users:

      - *
    • soy.StringBuilder: Compatible with the 'stringbuilder' code style. - *
    • soy.renderElement: Render template and set as innerHTML of an element. - *
    • soy.renderAsFragment: Render template and return as HTML fragment. - *
    - * - *

    - * The bottom portion of this file contains utilities that should only be called - * by Soy-generated JS code. Please do not use these functions directly from - * your hand-writen code. Their names all start with '$$'. - * - * @author Garrett Boyer - * @author Mike Samuel - * @author Kai Huang - * @author Aharon Lanin - */ - - -// COPIED FROM nogoog_shim.js - -// Create closure namespaces. -var goog = goog || {}; - - -goog.DEBUG = false; - - -goog.inherits = function(childCtor, parentCtor) { - /** @constructor */ - function tempCtor() {} - tempCtor.prototype = parentCtor.prototype; - childCtor.superClass_ = parentCtor.prototype; - childCtor.prototype = new tempCtor(); - childCtor.prototype.constructor = childCtor; -}; - - -// Just enough browser detection for this file. -if (!goog.userAgent) { - goog.userAgent = (function() { - var userAgent = ""; - if ("undefined" !== typeof navigator && navigator - && "string" == typeof navigator.userAgent) { - userAgent = navigator.userAgent; - } - var isOpera = userAgent.indexOf('Opera') == 0; - return { - jscript: { - /** - * @type {boolean} - */ - HAS_JSCRIPT: 'ScriptEngine' in this - }, - /** - * @type {boolean} - */ - OPERA: isOpera, - /** - * @type {boolean} - */ - IE: !isOpera && userAgent.indexOf('MSIE') != -1, - /** - * @type {boolean} - */ - WEBKIT: !isOpera && userAgent.indexOf('WebKit') != -1 - }; - })(); -} - -if (!goog.asserts) { - goog.asserts = { - /** - * @param {*} condition Condition to check. - */ - assert: function (condition) { - if (!condition) { - throw Error('Assertion error'); - } - }, - /** - * @param {...*} var_args - */ - fail: function (var_args) {} - }; -} - - -// Stub out the document wrapper used by renderAs*. -if (!goog.dom) { - goog.dom = {}; - /** - * @param {Document=} d - * @constructor - */ - goog.dom.DomHelper = function(d) { - this.document_ = d || document; - }; - /** - * @return {!Document} - */ - goog.dom.DomHelper.prototype.getDocument = function() { - return this.document_; - }; - /** - * Creates a new element. - * @param {string} name Tag name. - * @return {!Element} - */ - goog.dom.DomHelper.prototype.createElement = function(name) { - return this.document_.createElement(name); - }; - /** - * Creates a new document fragment. - * @return {!DocumentFragment} - */ - goog.dom.DomHelper.prototype.createDocumentFragment = function() { - return this.document_.createDocumentFragment(); - }; -} - - -if (!goog.format) { - goog.format = { - insertWordBreaks: function(str, maxCharsBetweenWordBreaks) { - str = String(str); - - var resultArr = []; - var resultArrLen = 0; - - // These variables keep track of important state inside str. - var isInTag = false; // whether we're inside an HTML tag - var isMaybeInEntity = false; // whether we might be inside an HTML entity - var numCharsWithoutBreak = 0; // number of chars since last word break - var flushIndex = 0; // index of first char not yet flushed to resultArr - - for (var i = 0, n = str.length; i < n; ++i) { - var charCode = str.charCodeAt(i); - - // If hit maxCharsBetweenWordBreaks, and not space next, then add . - if (numCharsWithoutBreak >= maxCharsBetweenWordBreaks && - // space - charCode != 32) { - resultArr[resultArrLen++] = str.substring(flushIndex, i); - flushIndex = i; - resultArr[resultArrLen++] = goog.format.WORD_BREAK; - numCharsWithoutBreak = 0; - } - - if (isInTag) { - // If inside an HTML tag and we see '>', it's the end of the tag. - if (charCode == 62) { - isInTag = false; - } - - } else if (isMaybeInEntity) { - switch (charCode) { - // Inside an entity, a ';' is the end of the entity. - // The entity that just ended counts as one char, so increment - // numCharsWithoutBreak. - case 59: // ';' - isMaybeInEntity = false; - ++numCharsWithoutBreak; - break; - // If maybe inside an entity and we see '<', we weren't actually in - // an entity. But now we're inside and HTML tag. - case 60: // '<' - isMaybeInEntity = false; - isInTag = true; - break; - // If maybe inside an entity and we see ' ', we weren't actually in - // an entity. Just correct the state and reset the - // numCharsWithoutBreak since we just saw a space. - case 32: // ' ' - isMaybeInEntity = false; - numCharsWithoutBreak = 0; - break; - } - - } else { // !isInTag && !isInEntity - switch (charCode) { - // When not within a tag or an entity and we see '<', we're now - // inside an HTML tag. - case 60: // '<' - isInTag = true; - break; - // When not within a tag or an entity and we see '&', we might be - // inside an entity. - case 38: // '&' - isMaybeInEntity = true; - break; - // When we see a space, reset the numCharsWithoutBreak count. - case 32: // ' ' - numCharsWithoutBreak = 0; - break; - // When we see a non-space, increment the numCharsWithoutBreak. - default: - ++numCharsWithoutBreak; - break; - } - } - } - - // Flush the remaining chars at the end of the string. - resultArr[resultArrLen++] = str.substring(flushIndex); - - return resultArr.join(''); - }, - /** - * String inserted as a word break by insertWordBreaks(). Safari requires - * , Opera needs the 'shy' entity, though this will give a - * visible hyphen at breaks. Other browsers just use . - * @type {string} - * @private - */ - WORD_BREAK: goog.userAgent.WEBKIT - ? '' : goog.userAgent.OPERA ? '­' : '' - }; -} - - -if (!goog.i18n) { - goog.i18n = { - bidi: { - /** - * Check the directionality of a piece of text, return true if the piece - * of text should be laid out in RTL direction. - * @param {string} text The piece of text that need to be detected. - * @param {boolean=} opt_isHtml Whether {@code text} is HTML/HTML-escaped. - * Default: false. - * @return {boolean} - * @private - */ - detectRtlDirectionality: function(text, opt_isHtml) { - text = soyshim.$$bidiStripHtmlIfNecessary_(text, opt_isHtml); - return soyshim.$$bidiRtlWordRatio_(text) - > soyshim.$$bidiRtlDetectionThreshold_; - } - } - }; -} - -/** - * Directionality enum. - * @enum {number} - */ -goog.i18n.bidi.Dir = { - RTL: -1, - UNKNOWN: 0, - LTR: 1 -}; - - -/** - * Convert a directionality given in various formats to a goog.i18n.bidi.Dir - * constant. Useful for interaction with different standards of directionality - * representation. - * - * @param {goog.i18n.bidi.Dir|number|boolean} givenDir Directionality given in - * one of the following formats: - * 1. A goog.i18n.bidi.Dir constant. - * 2. A number (positive = LRT, negative = RTL, 0 = unknown). - * 3. A boolean (true = RTL, false = LTR). - * @return {goog.i18n.bidi.Dir} A goog.i18n.bidi.Dir constant matching the given - * directionality. - */ -goog.i18n.bidi.toDir = function(givenDir) { - if (typeof givenDir == 'number') { - return givenDir > 0 ? goog.i18n.bidi.Dir.LTR : - givenDir < 0 ? goog.i18n.bidi.Dir.RTL : goog.i18n.bidi.Dir.UNKNOWN; - } else { - return givenDir ? goog.i18n.bidi.Dir.RTL : goog.i18n.bidi.Dir.LTR; - } -}; - - -/** - * Utility class for formatting text for display in a potentially - * opposite-directionality context without garbling. Provides the following - * functionality: - * - * @param {goog.i18n.bidi.Dir|number|boolean} dir The context - * directionality as a number - * (positive = LRT, negative = RTL, 0 = unknown). - * @constructor - */ -goog.i18n.BidiFormatter = function(dir) { - this.dir_ = goog.i18n.bidi.toDir(dir); -}; - - -/** - * Returns 'dir="ltr"' or 'dir="rtl"', depending on {@code text}'s estimated - * directionality, if it is not the same as the context directionality. - * Otherwise, returns the empty string. - * - * @param {string} text Text whose directionality is to be estimated. - * @param {boolean=} opt_isHtml Whether {@code text} is HTML / HTML-escaped. - * Default: false. - * @return {string} 'dir="rtl"' for RTL text in non-RTL context; 'dir="ltr"' for - * LTR text in non-LTR context; else, the empty string. - */ -goog.i18n.BidiFormatter.prototype.dirAttr = function (text, opt_isHtml) { - var dir = soy.$$bidiTextDir(text, opt_isHtml); - return dir && dir != this.dir_ ? dir < 0 ? 'dir="rtl"' : 'dir="ltr"' : ''; -}; - -/** - * Returns the trailing horizontal edge, i.e. "right" or "left", depending on - * the global bidi directionality. - * @return {string} "left" for RTL context and "right" otherwise. - */ -goog.i18n.BidiFormatter.prototype.endEdge = function () { - return this.dir_ < 0 ? 'left' : 'right'; -}; - -/** - * Returns the Unicode BiDi mark matching the context directionality (LRM for - * LTR context directionality, RLM for RTL context directionality), or the - * empty string for neutral / unknown context directionality. - * - * @return {string} LRM for LTR context directionality and RLM for RTL context - * directionality. - */ -goog.i18n.BidiFormatter.prototype.mark = function () { - return ( - (this.dir_ > 0) ? '\u200E' /*LRM*/ : - (this.dir_ < 0) ? '\u200F' /*RLM*/ : - ''); -}; - -/** - * Returns a Unicode BiDi mark matching the context directionality (LRM or RLM) - * if the directionality or the exit directionality of {@code text} are opposite - * to the context directionality. Otherwise returns the empty string. - * - * @param {string} text The input text. - * @param {boolean=} opt_isHtml Whether {@code text} is HTML / HTML-escaped. - * Default: false. - * @return {string} A Unicode bidi mark matching the global directionality or - * the empty string. - */ -goog.i18n.BidiFormatter.prototype.markAfter = function (text, opt_isHtml) { - var dir = soy.$$bidiTextDir(text, opt_isHtml); - return soyshim.$$bidiMarkAfterKnownDir_(this.dir_, dir, text, opt_isHtml); -}; - -/** - * Formats a string of unknown directionality for use in HTML output of the - * context directionality, so an opposite-directionality string is neither - * garbled nor garbles what follows it. - * - * @param {string} str The input text. - * @param {boolean=} placeholder This argument exists for consistency with the - * Closure Library. Specifying it has no effect. - * @return {string} Input text after applying the above processing. - */ -goog.i18n.BidiFormatter.prototype.spanWrap = function(str, placeholder) { - str = String(str); - var textDir = soy.$$bidiTextDir(str, true); - var reset = soyshim.$$bidiMarkAfterKnownDir_(this.dir_, textDir, str, true); - if (textDir > 0 && this.dir_ <= 0) { - str = '' + str + ''; - } else if (textDir < 0 && this.dir_ >= 0) { - str = '' + str + ''; - } - return str + reset; -}; - -/** - * Returns the leading horizontal edge, i.e. "left" or "right", depending on - * the global bidi directionality. - * @return {string} "right" for RTL context and "left" otherwise. - */ -goog.i18n.BidiFormatter.prototype.startEdge = function () { - return this.dir_ < 0 ? 'right' : 'left'; -}; - -/** - * Formats a string of unknown directionality for use in plain-text output of - * the context directionality, so an opposite-directionality string is neither - * garbled nor garbles what follows it. - * As opposed to {@link #spanWrap}, this makes use of unicode BiDi formatting - * characters. In HTML, its *only* valid use is inside of elements that do not - * allow mark-up, e.g. an 'option' tag. - * - * @param {string} str The input text. - * @param {boolean=} placeholder This argument exists for consistency with the - * Closure Library. Specifying it has no effect. - * @return {string} Input text after applying the above processing. - */ -goog.i18n.BidiFormatter.prototype.unicodeWrap = function(str, placeholder) { - str = String(str); - var textDir = soy.$$bidiTextDir(str, true); - var reset = soyshim.$$bidiMarkAfterKnownDir_(this.dir_, textDir, str, true); - if (textDir > 0 && this.dir_ <= 0) { - str = '\u202A' + str + '\u202C'; - } else if (textDir < 0 && this.dir_ >= 0) { - str = '\u202B' + str + '\u202C'; - } - return str + reset; -}; - - -if (!goog.string) { - goog.string = { - /** - * Converts \r\n, \r, and \n to
    s - * @param {*} str The string in which to convert newlines. - * @param {boolean=} opt_xml Whether to use XML compatible tags. - * @return {string} A copy of {@code str} with converted newlines. - */ - newLineToBr: function(str, opt_xml) { - - str = String(str); - - // This quick test helps in the case when there are no chars to replace, - // in the worst case this makes barely a difference to the time taken. - if (!goog.string.NEWLINE_TO_BR_RE_.test(str)) { - return str; - } - - return str.replace(/(\r\n|\r|\n)/g, opt_xml ? '
    ' : '
    '); - }, - urlEncode: encodeURIComponent, - /** - * Regular expression used within newlineToBr(). - * @type {RegExp} - * @private - */ - NEWLINE_TO_BR_RE_: /[\r\n]/ - }; -} - -/** - * Utility class to facilitate much faster string concatenation in IE, - * using Array.join() rather than the '+' operator. For other browsers - * we simply use the '+' operator. - * - * @param {Object|number|string|boolean=} opt_a1 Optional first initial item - * to append. - * @param {...Object|number|string|boolean} var_args Other initial items to - * append, e.g., new goog.string.StringBuffer('foo', 'bar'). - * @constructor - */ -goog.string.StringBuffer = function(opt_a1, var_args) { - /** - * Internal buffer for the string to be concatenated. - * @type {string|Array} - * @private - */ - this.buffer_ = goog.userAgent.jscript.HAS_JSCRIPT ? [] : ''; - - if (opt_a1 != null) { - this.append.apply(this, arguments); - } -}; - - -/** - * Length of internal buffer (faster than calling buffer_.length). - * Only used for IE. - * @type {number} - * @private - */ -goog.string.StringBuffer.prototype.bufferLength_ = 0; - -/** - * Appends one or more items to the string. - * - * Calling this with null, undefined, or empty arguments is an error. - * - * @param {Object|number|string|boolean} a1 Required first string. - * @param {Object|number|string|boolean=} opt_a2 Optional second string. - * @param {...Object|number|string|boolean} var_args Other items to append, - * e.g., sb.append('foo', 'bar', 'baz'). - * @return {goog.string.StringBuffer} This same StringBuilder object. - */ -goog.string.StringBuffer.prototype.append = function(a1, opt_a2, var_args) { - - if (goog.userAgent.jscript.HAS_JSCRIPT) { - if (opt_a2 == null) { // no second argument (note: undefined == null) - // Array assignment is 2x faster than Array push. Also, use a1 - // directly to avoid arguments instantiation, another 2x improvement. - this.buffer_[this.bufferLength_++] = a1; - } else { - var arr = /**@type {Array.}*/(this.buffer_); - arr.push.apply(arr, arguments); - this.bufferLength_ = this.buffer_.length; - } - - } else { - - // Use a1 directly to avoid arguments instantiation for single-arg case. - this.buffer_ += a1; - if (opt_a2 != null) { // no second argument (note: undefined == null) - for (var i = 1; i < arguments.length; i++) { - this.buffer_ += arguments[i]; - } - } - } - - return this; -}; - - -/** - * Clears the string. - */ -goog.string.StringBuffer.prototype.clear = function() { - - if (goog.userAgent.jscript.HAS_JSCRIPT) { - this.buffer_.length = 0; // reuse array to avoid creating new object - this.bufferLength_ = 0; - - } else { - this.buffer_ = ''; - } -}; - - -/** - * Returns the concatenated string. - * - * @return {string} The concatenated string. - */ -goog.string.StringBuffer.prototype.toString = function() { - - if (goog.userAgent.jscript.HAS_JSCRIPT) { - var str = this.buffer_.join(''); - // Given a string with the entire contents, simplify the StringBuilder by - // setting its contents to only be this string, rather than many fragments. - this.clear(); - if (str) { - this.append(str); - } - return str; - - } else { - return /** @type {string} */ (this.buffer_); - } -}; - - -if (!goog.soy) goog.soy = { - /** - * Helper function to render a Soy template and then set the - * output string as the innerHTML of an element. It is recommended - * to use this helper function instead of directly setting - * innerHTML in your hand-written code, so that it will be easier - * to audit the code for cross-site scripting vulnerabilities. - * - * @param {Function} template The Soy template defining element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Object=} opt_injectedData The injected data for the template. - * @param {(goog.dom.DomHelper|Document)=} opt_dom The context in which DOM - * nodes will be created. - */ - renderAsElement: function( - template, opt_templateData, opt_injectedData, opt_dom) { - return /** @type {!Element} */ (soyshim.$$renderWithWrapper_( - template, opt_templateData, opt_dom, true /* asElement */, - opt_injectedData)); - }, - /** - * Helper function to render a Soy template into a single node or - * a document fragment. If the rendered HTML string represents a - * single node, then that node is returned (note that this is - * *not* a fragment, despite them name of the method). Otherwise a - * document fragment is returned containing the rendered nodes. - * - * @param {Function} template The Soy template defining element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Object=} opt_injectedData The injected data for the template. - * @param {(goog.dom.DomHelper|Document)=} opt_dom The context in which DOM - * nodes will be created. - * @return {!Node} The resulting node or document fragment. - */ - renderAsFragment: function( - template, opt_templateData, opt_injectedData, opt_dom) { - return soyshim.$$renderWithWrapper_( - template, opt_templateData, opt_dom, false /* asElement */, - opt_injectedData); - }, - /** - * Helper function to render a Soy template and then set the output string as - * the innerHTML of an element. It is recommended to use this helper function - * instead of directly setting innerHTML in your hand-written code, so that it - * will be easier to audit the code for cross-site scripting vulnerabilities. - * - * NOTE: New code should consider using goog.soy.renderElement instead. - * - * @param {Element} element The element whose content we are rendering. - * @param {Function} template The Soy template defining the element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Object=} opt_injectedData The injected data for the template. - */ - renderElement: function( - element, template, opt_templateData, opt_injectedData) { - element.innerHTML = template(opt_templateData, null, opt_injectedData); - }, - data: {} -}; - - -/** - * A type of textual content. - * - * This is an enum of type Object so that these values are unforgeable. - * - * @enum {!Object} - */ -goog.soy.data.SanitizedContentKind = { - - /** - * A snippet of HTML that does not start or end inside a tag, comment, entity, - * or DOCTYPE; and that does not contain any executable code - * (JS, {@code }s, etc.) from a different trust domain. - */ - HTML: {}, - - /** - * Executable Javascript code or expression, safe for insertion in a - * script-tag or event handler context, known to be free of any - * attacker-controlled scripts. This can either be side-effect-free - * Javascript (such as JSON) or Javascript that entirely under Google's - * control. - */ - JS: goog.DEBUG ? {sanitizedContentJsStrChars: true} : {}, - - /** - * A sequence of code units that can appear between quotes (either kind) in a - * JS program without causing a parse error, and without causing any side - * effects. - *

    - * The content should not contain unescaped quotes, newlines, or anything else - * that would cause parsing to fail or to cause a JS parser to finish the - * string its parsing inside the content. - *

    - * The content must also not end inside an escape sequence ; no partial octal - * escape sequences or odd number of '{@code \}'s at the end. - */ - JS_STR_CHARS: {}, - - /** A properly encoded portion of a URI. */ - URI: {}, - - /** - * Repeated attribute names and values. For example, - * {@code dir="ltr" foo="bar" onclick="trustedFunction()" checked}. - */ - ATTRIBUTES: goog.DEBUG ? {sanitizedContentHtmlAttribute: true} : {}, - - // TODO: Consider separating rules, declarations, and values into - // separate types, but for simplicity, we'll treat explicitly blessed - // SanitizedContent as allowed in all of these contexts. - /** - * A CSS3 declaration, property, value or group of semicolon separated - * declarations. - */ - CSS: {}, - - /** - * Unsanitized plain-text content. - * - * This is effectively the "null" entry of this enum, and is sometimes used - * to explicitly mark content that should never be used unescaped. Since any - * string is safe to use as text, being of ContentKind.TEXT makes no - * guarantees about its safety in any other context such as HTML. - */ - TEXT: {} -}; - - - -/** - * A string-like object that carries a content-type. - * - * IMPORTANT! Do not create these directly, nor instantiate the subclasses. - * Instead, use a trusted, centrally reviewed library as endorsed by your team - * to generate these objects. Otherwise, you risk accidentally creating - * SanitizedContent that is attacker-controlled and gets evaluated unescaped in - * templates. - * - * @constructor - */ -goog.soy.data.SanitizedContent = function() { - throw Error('Do not instantiate directly'); -}; - - -/** - * The context in which this content is safe from XSS attacks. - * @type {goog.soy.data.SanitizedContentKind} - */ -goog.soy.data.SanitizedContent.prototype.contentKind; - - -/** - * The already-safe content. - * @type {string} - */ -goog.soy.data.SanitizedContent.prototype.content; - - -/** @override */ -goog.soy.data.SanitizedContent.prototype.toString = function() { - return this.content; -}; - - -var soy = { esc: {} }; -var soydata = {}; -soydata.VERY_UNSAFE = {}; -var soyshim = { $$DEFAULT_TEMPLATE_DATA_: {} }; -/** - * Helper function to render a Soy template into a single node or a document - * fragment. If the rendered HTML string represents a single node, then that - * node is returned. Otherwise a document fragment is created and returned - * (wrapped in a DIV element if #opt_singleNode is true). - * - * @param {Function} template The Soy template defining the element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {(goog.dom.DomHelper|Document)=} opt_dom The context in which DOM - * nodes will be created. - * @param {boolean=} opt_asElement Whether to wrap the fragment in an - * element if the template does not render a single element. If true, - * result is always an Element. - * @param {Object=} opt_injectedData The injected data for the template. - * @return {!Node} The resulting node or document fragment. - * @private - */ -soyshim.$$renderWithWrapper_ = function( - template, opt_templateData, opt_dom, opt_asElement, opt_injectedData) { - - var dom = opt_dom || document; - var wrapper = dom.createElement('div'); - wrapper.innerHTML = template( - opt_templateData || soyshim.$$DEFAULT_TEMPLATE_DATA_, undefined, - opt_injectedData); - - // If the template renders as a single element, return it. - if (wrapper.childNodes.length == 1) { - var firstChild = wrapper.firstChild; - if (!opt_asElement || firstChild.nodeType == 1 /* Element */) { - return /** @type {!Node} */ (firstChild); - } - } - - // If we're forcing it to be a single element, return the wrapper DIV. - if (opt_asElement) { - return wrapper; - } - - // Otherwise, create and return a fragment. - var fragment = dom.createDocumentFragment(); - while (wrapper.firstChild) { - fragment.appendChild(wrapper.firstChild); - } - return fragment; -}; - - -/** - * Returns a Unicode BiDi mark matching bidiGlobalDir (LRM or RLM) if the - * directionality or the exit directionality of text are opposite to - * bidiGlobalDir. Otherwise returns the empty string. - * If opt_isHtml, makes sure to ignore the LTR nature of the mark-up and escapes - * in text, making the logic suitable for HTML and HTML-escaped text. - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @param {number} dir text's directionality: 1 if ltr, -1 if rtl, 0 if unknown. - * @param {string} text The text whose directionality is to be estimated. - * @param {boolean=} opt_isHtml Whether text is HTML/HTML-escaped. - * Default: false. - * @return {string} A Unicode bidi mark matching bidiGlobalDir, or - * the empty string when text's overall and exit directionalities both match - * bidiGlobalDir, or bidiGlobalDir is 0 (unknown). - * @private - */ -soyshim.$$bidiMarkAfterKnownDir_ = function( - bidiGlobalDir, dir, text, opt_isHtml) { - return ( - bidiGlobalDir > 0 && (dir < 0 || - soyshim.$$bidiIsRtlExitText_(text, opt_isHtml)) ? '\u200E' : // LRM - bidiGlobalDir < 0 && (dir > 0 || - soyshim.$$bidiIsLtrExitText_(text, opt_isHtml)) ? '\u200F' : // RLM - ''); -}; - - -/** - * Strips str of any HTML mark-up and escapes. Imprecise in several ways, but - * precision is not very important, since the result is only meant to be used - * for directionality detection. - * @param {string} str The string to be stripped. - * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped. - * Default: false. - * @return {string} The stripped string. - * @private - */ -soyshim.$$bidiStripHtmlIfNecessary_ = function(str, opt_isHtml) { - return opt_isHtml ? str.replace(soyshim.$$BIDI_HTML_SKIP_RE_, ' ') : str; -}; - - -/** - * Simplified regular expression for am HTML tag (opening or closing) or an HTML - * escape - the things we want to skip over in order to ignore their ltr - * characters. - * @type {RegExp} - * @private - */ -soyshim.$$BIDI_HTML_SKIP_RE_ = /<[^>]*>|&[^;]+;/g; - - -/** - * A practical pattern to identify strong LTR character. This pattern is not - * theoretically correct according to unicode standard. It is simplified for - * performance and small code size. - * @type {string} - * @private - */ -soyshim.$$bidiLtrChars_ = - 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF' + - '\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF'; - - -/** - * A practical pattern to identify strong neutral and weak character. This - * pattern is not theoretically correct according to unicode standard. It is - * simplified for performance and small code size. - * @type {string} - * @private - */ -soyshim.$$bidiNeutralChars_ = - '\u0000-\u0020!-@[-`{-\u00BF\u00D7\u00F7\u02B9-\u02FF\u2000-\u2BFF'; - - -/** - * A practical pattern to identify strong RTL character. This pattern is not - * theoretically correct according to unicode standard. It is simplified for - * performance and small code size. - * @type {string} - * @private - */ -soyshim.$$bidiRtlChars_ = '\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC'; - - -/** - * Regular expressions to check if a piece of text is of RTL directionality - * on first character with strong directionality. - * @type {RegExp} - * @private - */ -soyshim.$$bidiRtlDirCheckRe_ = new RegExp( - '^[^' + soyshim.$$bidiLtrChars_ + ']*[' + soyshim.$$bidiRtlChars_ + ']'); - - -/** - * Regular expressions to check if a piece of text is of neutral directionality. - * Url are considered as neutral. - * @type {RegExp} - * @private - */ -soyshim.$$bidiNeutralDirCheckRe_ = new RegExp( - '^[' + soyshim.$$bidiNeutralChars_ + ']*$|^http://'); - - -/** - * Check the directionality of the a piece of text based on the first character - * with strong directionality. - * @param {string} str string being checked. - * @return {boolean} return true if rtl directionality is being detected. - * @private - */ -soyshim.$$bidiIsRtlText_ = function(str) { - return soyshim.$$bidiRtlDirCheckRe_.test(str); -}; - - -/** - * Check the directionality of the a piece of text based on the first character - * with strong directionality. - * @param {string} str string being checked. - * @return {boolean} true if all characters have neutral directionality. - * @private - */ -soyshim.$$bidiIsNeutralText_ = function(str) { - return soyshim.$$bidiNeutralDirCheckRe_.test(str); -}; - - -/** - * This constant controls threshold of rtl directionality. - * @type {number} - * @private - */ -soyshim.$$bidiRtlDetectionThreshold_ = 0.40; - - -/** - * Returns the RTL ratio based on word count. - * @param {string} str the string that need to be checked. - * @return {number} the ratio of RTL words among all words with directionality. - * @private - */ -soyshim.$$bidiRtlWordRatio_ = function(str) { - var rtlCount = 0; - var totalCount = 0; - var tokens = str.split(' '); - for (var i = 0; i < tokens.length; i++) { - if (soyshim.$$bidiIsRtlText_(tokens[i])) { - rtlCount++; - totalCount++; - } else if (!soyshim.$$bidiIsNeutralText_(tokens[i])) { - totalCount++; - } - } - - return totalCount == 0 ? 0 : rtlCount / totalCount; -}; - - -/** - * Regular expressions to check if the last strongly-directional character in a - * piece of text is LTR. - * @type {RegExp} - * @private - */ -soyshim.$$bidiLtrExitDirCheckRe_ = new RegExp( - '[' + soyshim.$$bidiLtrChars_ + '][^' + soyshim.$$bidiRtlChars_ + ']*$'); - - -/** - * Regular expressions to check if the last strongly-directional character in a - * piece of text is RTL. - * @type {RegExp} - * @private - */ -soyshim.$$bidiRtlExitDirCheckRe_ = new RegExp( - '[' + soyshim.$$bidiRtlChars_ + '][^' + soyshim.$$bidiLtrChars_ + ']*$'); - - -/** - * Check if the exit directionality a piece of text is LTR, i.e. if the last - * strongly-directional character in the string is LTR. - * @param {string} str string being checked. - * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped. - * Default: false. - * @return {boolean} Whether LTR exit directionality was detected. - * @private - */ -soyshim.$$bidiIsLtrExitText_ = function(str, opt_isHtml) { - str = soyshim.$$bidiStripHtmlIfNecessary_(str, opt_isHtml); - return soyshim.$$bidiLtrExitDirCheckRe_.test(str); -}; - - -/** - * Check if the exit directionality a piece of text is RTL, i.e. if the last - * strongly-directional character in the string is RTL. - * @param {string} str string being checked. - * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped. - * Default: false. - * @return {boolean} Whether RTL exit directionality was detected. - * @private - */ -soyshim.$$bidiIsRtlExitText_ = function(str, opt_isHtml) { - str = soyshim.$$bidiStripHtmlIfNecessary_(str, opt_isHtml); - return soyshim.$$bidiRtlExitDirCheckRe_.test(str); -}; - - -// ============================================================================= -// COPIED FROM soyutils_usegoog.js - - -// ----------------------------------------------------------------------------- -// StringBuilder (compatible with the 'stringbuilder' code style). - - -/** - * Utility class to facilitate much faster string concatenation in IE, - * using Array.join() rather than the '+' operator. For other browsers - * we simply use the '+' operator. - * - * @param {Object} var_args Initial items to append, - * e.g., new soy.StringBuilder('foo', 'bar'). - * @constructor - */ -soy.StringBuilder = goog.string.StringBuffer; - - -// ----------------------------------------------------------------------------- -// soydata: Defines typed strings, e.g. an HTML string {@code "ac"} is -// semantically distinct from the plain text string {@code "ac"} and smart -// templates can take that distinction into account. - -/** - * A type of textual content. - * - * This is an enum of type Object so that these values are unforgeable. - * - * @enum {!Object} - */ -soydata.SanitizedContentKind = goog.soy.data.SanitizedContentKind; - - -/** - * Content of type {@link soydata.SanitizedContentKind.HTML}. - * - * The content is a string of HTML that can safely be embedded in a PCDATA - * context in your app. If you would be surprised to find that an HTML - * sanitizer produced {@code s} (e.g. it runs code or fetches bad URLs) and - * you wouldn't write a template that produces {@code s} on security or privacy - * grounds, then don't pass {@code s} here. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedHtml = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedHtml, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedHtml.prototype.contentKind = soydata.SanitizedContentKind.HTML; - - -/** - * Content of type {@link soydata.SanitizedContentKind.JS}. - * - * The content is Javascript source that when evaluated does not execute any - * attacker-controlled scripts. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedJs = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedJs, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedJs.prototype.contentKind = - soydata.SanitizedContentKind.JS; - - -/** - * Content of type {@link soydata.SanitizedContentKind.JS_STR_CHARS}. - * - * The content can be safely inserted as part of a single- or double-quoted - * string without terminating the string. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedJsStrChars = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedJsStrChars, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedJsStrChars.prototype.contentKind = - soydata.SanitizedContentKind.JS_STR_CHARS; - - -/** - * Content of type {@link soydata.SanitizedContentKind.URI}. - * - * The content is a URI chunk that the caller knows is safe to emit in a - * template. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedUri = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedUri, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedUri.prototype.contentKind = soydata.SanitizedContentKind.URI; - - -/** - * Content of type {@link soydata.SanitizedContentKind.ATTRIBUTES}. - * - * The content should be safely embeddable within an open tag, such as a - * key="value" pair. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedHtmlAttribute = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedHtmlAttribute, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedHtmlAttribute.prototype.contentKind = - soydata.SanitizedContentKind.ATTRIBUTES; - - -/** - * Content of type {@link soydata.SanitizedContentKind.CSS}. - * - * The content is non-attacker-exploitable CSS, such as {@code color:#c3d9ff}. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedCss = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedCss, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedCss.prototype.contentKind = - soydata.SanitizedContentKind.CSS; - - -/** - * Unsanitized plain text string. - * - * While all strings are effectively safe to use as a plain text, there are no - * guarantees about safety in any other context such as HTML. This is - * sometimes used to mark that should never be used unescaped. - * - * @param {*} content Plain text with no guarantees. - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.UnsanitizedText = function(content) { - /** @override */ - this.content = String(content); -}; -goog.inherits(soydata.UnsanitizedText, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.UnsanitizedText.prototype.contentKind = - soydata.SanitizedContentKind.TEXT; - - -/** - * Creates a factory for SanitizedContent types. - * - * This is a hack so that the soydata.VERY_UNSAFE.ordainSanitized* can - * instantiate Sanitized* classes, without making the Sanitized* constructors - * publicly usable. Requiring all construction to use the VERY_UNSAFE names - * helps callers and their reviewers easily tell that creating SanitizedContent - * is not always safe and calls for careful review. - * - * @param {function(new: T, string)} ctor A constructor. - * @return {!function(*): T} A factory that takes content and returns a - * new instance. - * @template T - * @private - */ -soydata.$$makeSanitizedContentFactory_ = function(ctor) { - /** @constructor */ - function InstantiableCtor() {} - InstantiableCtor.prototype = ctor.prototype; - return function(content) { - var result = new InstantiableCtor(); - result.content = String(content); - return result; - }; -}; - - -// ----------------------------------------------------------------------------- -// Sanitized content ordainers. Please use these with extreme caution (with the -// exception of markUnsanitizedText). A good recommendation is to limit usage -// of these to just a handful of files in your source tree where usages can be -// carefully audited. - - -/** - * Protects a string from being used in an noAutoescaped context. - * - * This is useful for content where there is significant risk of accidental - * unescaped usage in a Soy template. A great case is for user-controlled - * data that has historically been a source of vulernabilities. - * - * @param {*} content Text to protect. - * @return {!soydata.UnsanitizedText} A wrapper that is rejected by the - * Soy noAutoescape print directive. - */ -soydata.markUnsanitizedText = function(content) { - return new soydata.UnsanitizedText(content); -}; - - -/** - * Takes a leap of faith that the provided content is "safe" HTML. - * - * @param {*} content A string of HTML that can safely be embedded in - * a PCDATA context in your app. If you would be surprised to find that an - * HTML sanitizer produced {@code s} (e.g. it runs code or fetches bad URLs) - * and you wouldn't write a template that produces {@code s} on security or - * privacy grounds, then don't pass {@code s} here. - * @return {!soydata.SanitizedHtml} Sanitized content wrapper that - * indicates to Soy not to escape when printed as HTML. - */ -soydata.VERY_UNSAFE.ordainSanitizedHtml = - soydata.$$makeSanitizedContentFactory_(soydata.SanitizedHtml); - - -/** - * Takes a leap of faith that the provided content is "safe" (non-attacker- - * controlled, XSS-free) Javascript. - * - * @param {*} content Javascript source that when evaluated does not - * execute any attacker-controlled scripts. - * @return {!soydata.SanitizedJs} Sanitized content wrapper that indicates to - * Soy not to escape when printed as Javascript source. - */ -soydata.VERY_UNSAFE.ordainSanitizedJs = - soydata.$$makeSanitizedContentFactory_(soydata.SanitizedJs); - - -// TODO: This function is probably necessary, either externally or internally -// as an implementation detail. Generally, plain text will always work here, -// as there's no harm to unescaping the string and then re-escaping when -// finally printed. -/** - * Takes a leap of faith that the provided content can be safely embedded in - * a Javascript string without re-esacping. - * - * @param {*} content Content that can be safely inserted as part of a - * single- or double-quoted string without terminating the string. - * @return {!soydata.SanitizedJsStrChars} Sanitized content wrapper that - * indicates to Soy not to escape when printed in a JS string. - */ -soydata.VERY_UNSAFE.ordainSanitizedJsStrChars = - soydata.$$makeSanitizedContentFactory_(soydata.SanitizedJsStrChars); - - -/** - * Takes a leap of faith that the provided content is "safe" to use as a URI - * in a Soy template. - * - * This creates a Soy SanitizedContent object which indicates to Soy there is - * no need to escape it when printed as a URI (e.g. in an href or src - * attribute), such as if it's already been encoded or if it's a Javascript: - * URI. - * - * @param {*} content A chunk of URI that the caller knows is safe to - * emit in a template. - * @return {!soydata.SanitizedUri} Sanitized content wrapper that indicates to - * Soy not to escape or filter when printed in URI context. - */ -soydata.VERY_UNSAFE.ordainSanitizedUri = - soydata.$$makeSanitizedContentFactory_(soydata.SanitizedUri); - - -/** - * Takes a leap of faith that the provided content is "safe" to use as an - * HTML attribute. - * - * @param {*} content An attribute name and value, such as - * {@code dir="ltr"}. - * @return {!soydata.SanitizedHtmlAttribute} Sanitized content wrapper that - * indicates to Soy not to escape when printed as an HTML attribute. - */ -soydata.VERY_UNSAFE.ordainSanitizedHtmlAttribute = - soydata.$$makeSanitizedContentFactory_(soydata.SanitizedHtmlAttribute); - - -/** - * Takes a leap of faith that the provided content is "safe" to use as CSS - * in a style attribute or block. - * - * @param {*} content CSS, such as {@code color:#c3d9ff}. - * @return {!soydata.SanitizedCss} Sanitized CSS wrapper that indicates to - * Soy there is no need to escape or filter when printed in CSS context. - */ -soydata.VERY_UNSAFE.ordainSanitizedCss = - soydata.$$makeSanitizedContentFactory_(soydata.SanitizedCss); - - -// ----------------------------------------------------------------------------- -// Public utilities. - - -/** - * Helper function to render a Soy template and then set the output string as - * the innerHTML of an element. It is recommended to use this helper function - * instead of directly setting innerHTML in your hand-written code, so that it - * will be easier to audit the code for cross-site scripting vulnerabilities. - * - * NOTE: New code should consider using goog.soy.renderElement instead. - * - * @param {Element} element The element whose content we are rendering. - * @param {Function} template The Soy template defining the element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Object=} opt_injectedData The injected data for the template. - */ -soy.renderElement = goog.soy.renderElement; - - -/** - * Helper function to render a Soy template into a single node or a document - * fragment. If the rendered HTML string represents a single node, then that - * node is returned (note that this is *not* a fragment, despite them name of - * the method). Otherwise a document fragment is returned containing the - * rendered nodes. - * - * NOTE: New code should consider using goog.soy.renderAsFragment - * instead (note that the arguments are different). - * - * @param {Function} template The Soy template defining the element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Document=} opt_document The document used to create DOM nodes. If not - * specified, global document object is used. - * @param {Object=} opt_injectedData The injected data for the template. - * @return {!Node} The resulting node or document fragment. - */ -soy.renderAsFragment = function( - template, opt_templateData, opt_document, opt_injectedData) { - return goog.soy.renderAsFragment( - template, opt_templateData, opt_injectedData, - new goog.dom.DomHelper(opt_document)); -}; - - -/** - * Helper function to render a Soy template into a single node. If the rendered - * HTML string represents a single node, then that node is returned. Otherwise, - * a DIV element is returned containing the rendered nodes. - * - * NOTE: New code should consider using goog.soy.renderAsElement - * instead (note that the arguments are different). - * - * @param {Function} template The Soy template defining the element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Document=} opt_document The document used to create DOM nodes. If not - * specified, global document object is used. - * @param {Object=} opt_injectedData The injected data for the template. - * @return {!Element} Rendered template contents, wrapped in a parent DIV - * element if necessary. - */ -soy.renderAsElement = function( - template, opt_templateData, opt_document, opt_injectedData) { - return goog.soy.renderAsElement( - template, opt_templateData, opt_injectedData, - new goog.dom.DomHelper(opt_document)); -}; - - -// ----------------------------------------------------------------------------- -// Below are private utilities to be used by Soy-generated code only. - - -/** - * Builds an augmented map. The returned map will contain mappings from both - * the base map and the additional map. If the same key appears in both, then - * the value from the additional map will be visible, while the value from the - * base map will be hidden. The base map will be used, but not modified. - * - * @param {!Object} baseMap The original map to augment. - * @param {!Object} additionalMap A map containing the additional mappings. - * @return {!Object} An augmented map containing both the original and - * additional mappings. - */ -soy.$$augmentMap = function(baseMap, additionalMap) { - - // Create a new map whose '__proto__' field is set to baseMap. - /** @constructor */ - function TempCtor() {} - TempCtor.prototype = baseMap; - var augmentedMap = new TempCtor(); - - // Add the additional mappings to the new map. - for (var key in additionalMap) { - augmentedMap[key] = additionalMap[key]; - } - - return augmentedMap; -}; - - -/** - * Checks that the given map key is a string. - * @param {*} key Key to check. - * @return {string} The given key. - */ -soy.$$checkMapKey = function(key) { - if ((typeof key) != 'string') { - throw Error( - 'Map literal\'s key expression must evaluate to string' + - ' (encountered type "' + (typeof key) + '").'); - } - return key; -}; - - -/** - * Gets the keys in a map as an array. There are no guarantees on the order. - * @param {Object} map The map to get the keys of. - * @return {Array.} The array of keys in the given map. - */ -soy.$$getMapKeys = function(map) { - var mapKeys = []; - for (var key in map) { - mapKeys.push(key); - } - return mapKeys; -}; - - -/** - * Gets a consistent unique id for the given delegate template name. Two calls - * to this function will return the same id if and only if the input names are - * the same. - * - *

    Important: This function must always be called with a string constant. - * - *

    If Closure Compiler is not being used, then this is just this identity - * function. If Closure Compiler is being used, then each call to this function - * will be replaced with a short string constant, which will be consistent per - * input name. - * - * @param {string} delTemplateName The delegate template name for which to get a - * consistent unique id. - * @return {string} A unique id that is consistent per input name. - * - * @consistentIdGenerator - */ -soy.$$getDelTemplateId = function(delTemplateName) { - return delTemplateName; -}; - - -/** - * Map from registered delegate template key to the priority of the - * implementation. - * @type {Object} - * @private - */ -soy.$$DELEGATE_REGISTRY_PRIORITIES_ = {}; - -/** - * Map from registered delegate template key to the implementation function. - * @type {Object} - * @private - */ -soy.$$DELEGATE_REGISTRY_FUNCTIONS_ = {}; - - -/** - * Registers a delegate implementation. If the same delegate template key (id - * and variant) has been registered previously, then priority values are - * compared and only the higher priority implementation is stored (if - * priorities are equal, an error is thrown). - * - * @param {string} delTemplateId The delegate template id. - * @param {string} delTemplateVariant The delegate template variant (can be - * empty string). - * @param {number} delPriority The implementation's priority value. - * @param {Function} delFn The implementation function. - */ -soy.$$registerDelegateFn = function( - delTemplateId, delTemplateVariant, delPriority, delFn) { - - var mapKey = 'key_' + delTemplateId + ':' + delTemplateVariant; - var currPriority = soy.$$DELEGATE_REGISTRY_PRIORITIES_[mapKey]; - if (currPriority === undefined || delPriority > currPriority) { - // Registering new or higher-priority function: replace registry entry. - soy.$$DELEGATE_REGISTRY_PRIORITIES_[mapKey] = delPriority; - soy.$$DELEGATE_REGISTRY_FUNCTIONS_[mapKey] = delFn; - } else if (delPriority == currPriority) { - // Registering same-priority function: error. - throw Error( - 'Encountered two active delegates with the same priority ("' + - delTemplateId + ':' + delTemplateVariant + '").'); - } else { - // Registering lower-priority function: do nothing. - } -}; - - -/** - * Retrieves the (highest-priority) implementation that has been registered for - * a given delegate template key (id and variant). If no implementation has - * been registered for the key, then the fallback is the same id with empty - * variant. If the fallback is also not registered, and allowsEmptyDefault is - * true, then returns an implementation that is equivalent to an empty template - * (i.e. rendered output would be empty string). - * - * @param {string} delTemplateId The delegate template id. - * @param {string} delTemplateVariant The delegate template variant (can be - * empty string). - * @param {boolean} allowsEmptyDefault Whether to default to the empty template - * function if there's no active implementation. - * @return {Function} The retrieved implementation function. - */ -soy.$$getDelegateFn = function( - delTemplateId, delTemplateVariant, allowsEmptyDefault) { - - var delFn = soy.$$DELEGATE_REGISTRY_FUNCTIONS_[ - 'key_' + delTemplateId + ':' + delTemplateVariant]; - if (! delFn && delTemplateVariant != '') { - // Fallback to empty variant. - delFn = soy.$$DELEGATE_REGISTRY_FUNCTIONS_['key_' + delTemplateId + ':']; - } - - if (delFn) { - return delFn; - } else if (allowsEmptyDefault) { - return soy.$$EMPTY_TEMPLATE_FN_; - } else { - throw Error( - 'Found no active impl for delegate call to "' + delTemplateId + ':' + - delTemplateVariant + '" (and not allowemptydefault="true").'); - } -}; - - -/** - * Private helper soy.$$getDelegateFn(). This is the empty template function - * that is returned whenever there's no delegate implementation found. - * - * @param {Object.=} opt_data - * @param {soy.StringBuilder=} opt_sb - * @param {Object.=} opt_ijData - * @return {string} - * @private - */ -soy.$$EMPTY_TEMPLATE_FN_ = function(opt_data, opt_sb, opt_ijData) { - return ''; -}; - - -// ----------------------------------------------------------------------------- -// Escape/filter/normalize. - - -/** - * Escapes HTML special characters in a string. Escapes double quote '"' in - * addition to '&', '<', and '>' so that a string can be included in an HTML - * tag attribute value within double quotes. - * Will emit known safe HTML as-is. - * - * @param {*} value The string-like value to be escaped. May not be a string, - * but the value will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeHtml = function(value) { - // TODO: Perhaps we should just ignore the contentKind property and instead - // look only at the constructor. - if (value && value.contentKind && - value.contentKind === goog.soy.data.SanitizedContentKind.HTML) { - goog.asserts.assert( - value.constructor === soydata.SanitizedHtml); - return value.content; - } - return soy.esc.$$escapeHtmlHelper(value); -}; - - -/** - * Strips unsafe tags to convert a string of untrusted HTML into HTML that - * is safe to embed. - * - * @param {*} value The string-like value to be escaped. May not be a string, - * but the value will be coerced to a string. - * @return {string} A sanitized and normalized version of value. - */ -soy.$$cleanHtml = function(value) { - if (value && value.contentKind && - value.contentKind === goog.soy.data.SanitizedContentKind.HTML) { - goog.asserts.assert( - value.constructor === soydata.SanitizedHtml); - return value.content; - } - return soy.$$stripHtmlTags(value, soy.esc.$$SAFE_TAG_WHITELIST_); -}; - - -/** - * Escapes HTML special characters in a string so that it can be embedded in - * RCDATA. - *

    - * Escapes HTML special characters so that the value will not prematurely end - * the body of a tag like {@code }. - *

    - * Will normalize known safe HTML to make sure that sanitized HTML (which could - * contain an innocuous {@code } don't prematurely end an RCDATA - * element. - * - * @param {*} value The string-like value to be escaped. May not be a string, - * but the value will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeHtmlRcdata = function(value) { - if (value && value.contentKind && - value.contentKind === goog.soy.data.SanitizedContentKind.HTML) { - goog.asserts.assert( - value.constructor === soydata.SanitizedHtml); - return soy.esc.$$normalizeHtmlHelper(value.content); - } - return soy.esc.$$escapeHtmlHelper(value); -}; - - -/** - * Matches any/only HTML5 void elements' start tags. - * See http://www.w3.org/TR/html-markup/syntax.html#syntax-elements - * @type {RegExp} - * @private - */ -soy.$$HTML5_VOID_ELEMENTS_ = new RegExp( - '^<(?:area|base|br|col|command|embed|hr|img|input' + - '|keygen|link|meta|param|source|track|wbr)\\b'); - - -/** - * Removes HTML tags from a string of known safe HTML. - * If opt_tagWhitelist is not specified or is empty, then - * the result can be used as an attribute value. - * - * @param {*} value The HTML to be escaped. May not be a string, but the - * value will be coerced to a string. - * @param {Object.=} opt_tagWhitelist Has an own property whose - * name is a lower-case tag name and whose value is {@code 1} for - * each element that is allowed in the output. - * @return {string} A representation of value without disallowed tags, - * HTML comments, or other non-text content. - */ -soy.$$stripHtmlTags = function(value, opt_tagWhitelist) { - if (!opt_tagWhitelist) { - // If we have no white-list, then use a fast track which elides all tags. - return String(value).replace(soy.esc.$$HTML_TAG_REGEX_, '') - // This is just paranoia since callers should normalize the result - // anyway, but if they didn't, it would be necessary to ensure that - // after the first replace non-tag uses of < do not recombine into - // tags as in "<script>alert(1337)script>". - .replace(soy.esc.$$LT_REGEX_, '<'); - } - - // Escapes '[' so that we can use [123] below to mark places where tags - // have been removed. - var html = String(value).replace(/\[/g, '['); - - // Consider all uses of '<' and replace whitelisted tags with markers like - // [1] which are indices into a list of approved tag names. - // Replace all other uses of < and > with entities. - var tags = []; - html = html.replace( - soy.esc.$$HTML_TAG_REGEX_, - function(tok, tagName) { - if (tagName) { - tagName = tagName.toLowerCase(); - if (opt_tagWhitelist.hasOwnProperty(tagName) && - opt_tagWhitelist[tagName]) { - var start = tok.charAt(1) === '/' ? ''; - return '[' + index + ']'; - } - } - return ''; - }); - - // Escape HTML special characters. Now there are no '<' in html that could - // start a tag. - html = soy.esc.$$normalizeHtmlHelper(html); - - var finalCloseTags = soy.$$balanceTags_(tags); - - // Now html contains no tags or less-than characters that could become - // part of a tag via a replacement operation and tags only contains - // approved tags. - // Reinsert the white-listed tags. - html = html.replace( - /\[(\d+)\]/g, function(_, index) { return tags[index]; }); - - // Close any still open tags. - // This prevents unclosed formatting elements like

      and from - // breaking the layout of containing HTML. - return html + finalCloseTags; -}; - - -/** - * Throw out any close tags that don't correspond to start tags. - * If {@code
      } is used for formatting, embedded HTML shouldn't be able - * to use a mismatched {@code
      } to break page layout. - * - * @param {Array.} tags an array of tags that will be modified in place - * include tags, the empty string, or concatenations of empty tags. - * @return {string} zero or more closed tags that close all elements that are - * opened in tags but not closed. - * @private - */ -soy.$$balanceTags_ = function(tags) { - var open = []; - for (var i = 0, n = tags.length; i < n; ++i) { - var tag = tags[i]; - if (tag.charAt(1) === '/') { - var openTagIndex = open.length - 1; - // NOTE: This is essentially lastIndexOf, but it's not supported in IE. - while (openTagIndex >= 0 && open[openTagIndex] != tag) { - openTagIndex--; - } - if (openTagIndex < 0) { - tags[i] = ''; // Drop close tag. - } else { - tags[i] = open.slice(openTagIndex).reverse().join(''); - open.length = openTagIndex; - } - } else if (!soy.$$HTML5_VOID_ELEMENTS_.test(tag)) { - open.push('Hello World - return soy.esc.$$filterHtmlElementNameHelper(value); -}; - - -/** - * Escapes characters in the value to make it valid content for a JS string - * literal. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - * @deprecated - */ -soy.$$escapeJs = function(value) { - return soy.$$escapeJsString(value); -}; - - -/** - * Escapes characters in the value to make it valid content for a JS string - * literal. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeJsString = function(value) { - if (value && - value.contentKind === goog.soy.data.SanitizedContentKind.JS_STR_CHARS) { - // TODO: It might still be worthwhile to normalize it to remove - // unescaped quotes, null, etc: replace(/(?:^|[^\])['"]/g, '\\$ - goog.asserts.assert(value.constructor === - soydata.SanitizedJsStrChars); - return value.content; - } - return soy.esc.$$escapeJsStringHelper(value); -}; - - -/** - * Encodes a value as a JavaScript literal. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} A JavaScript code representation of the input. - */ -soy.$$escapeJsValue = function(value) { - // We surround values with spaces so that they can't be interpolated into - // identifiers by accident. - // We could use parentheses but those might be interpreted as a function call. - if (value == null) { // Intentionally matches undefined. - // Java returns null from maps where there is no corresponding key while - // JS returns undefined. - // We always output null for compatibility with Java which does not have a - // distinct undefined value. - return ' null '; - } - if (value.contentKind == goog.soy.data.SanitizedContentKind.JS) { - goog.asserts.assert(value.constructor === - soydata.SanitizedJs); - return value.content; - } - switch (typeof value) { - case 'boolean': case 'number': - return ' ' + value + ' '; - default: - return "'" + soy.esc.$$escapeJsStringHelper(String(value)) + "'"; - } -}; - - -/** - * Escapes characters in the string to make it valid content for a JS regular - * expression literal. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeJsRegex = function(value) { - return soy.esc.$$escapeJsRegexHelper(value); -}; - - -/** - * Matches all URI mark characters that conflict with HTML attribute delimiters - * or that cannot appear in a CSS uri. - * From G.2: CSS grammar - *
      - *     url        ([!#$%&*-~]|{nonascii}|{escape})*
      - * 
      - * - * @type {RegExp} - * @private - */ -soy.$$problematicUriMarks_ = /['()]/g; - -/** - * @param {string} ch A single character in {@link soy.$$problematicUriMarks_}. - * @return {string} - * @private - */ -soy.$$pctEncode_ = function(ch) { - return '%' + ch.charCodeAt(0).toString(16); -}; - -/** - * Escapes a string so that it can be safely included in a URI. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeUri = function(value) { - if (value && value.contentKind === goog.soy.data.SanitizedContentKind.URI) { - goog.asserts.assert(value.constructor === - soydata.SanitizedUri); - return soy.$$normalizeUri(value); - } - // Apostophes and parentheses are not matched by encodeURIComponent. - // They are technically special in URIs, but only appear in the obsolete mark - // production in Appendix D.2 of RFC 3986, so can be encoded without changing - // semantics. - var encoded = soy.esc.$$escapeUriHelper(value); - soy.$$problematicUriMarks_.lastIndex = 0; - if (soy.$$problematicUriMarks_.test(encoded)) { - return encoded.replace(soy.$$problematicUriMarks_, soy.$$pctEncode_); - } - return encoded; -}; - - -/** - * Removes rough edges from a URI by escaping any raw HTML/JS string delimiters. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$normalizeUri = function(value) { - return soy.esc.$$normalizeUriHelper(value); -}; - - -/** - * Vets a URI's protocol and removes rough edges from a URI by escaping - * any raw HTML/JS string delimiters. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$filterNormalizeUri = function(value) { - if (value && value.contentKind == goog.soy.data.SanitizedContentKind.URI) { - goog.asserts.assert(value.constructor === - soydata.SanitizedUri); - return soy.$$normalizeUri(value); - } - return soy.esc.$$filterNormalizeUriHelper(value); -}; - - -/** - * Escapes a string so it can safely be included inside a quoted CSS string. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeCssString = function(value) { - return soy.esc.$$escapeCssStringHelper(value); -}; - - -/** - * Encodes a value as a CSS identifier part, keyword, or quantity. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} A safe CSS identifier part, keyword, or quanitity. - */ -soy.$$filterCssValue = function(value) { - if (value && value.contentKind === goog.soy.data.SanitizedContentKind.CSS) { - goog.asserts.assert(value.constructor === - soydata.SanitizedCss); - return value.content; - } - // Uses == to intentionally match null and undefined for Java compatibility. - if (value == null) { - return ''; - } - return soy.esc.$$filterCssValueHelper(value); -}; - - -/** - * Sanity-checks noAutoescape input for explicitly tainted content. - * - * SanitizedContentKind.TEXT is used to explicitly mark input that was never - * meant to be used unescaped. - * - * @param {*} value The value to filter. - * @return {string} The value, that we dearly hope will not cause an attack. - */ -soy.$$filterNoAutoescape = function(value) { - if (value && value.contentKind === goog.soy.data.SanitizedContentKind.TEXT) { - // Fail in development mode. - goog.asserts.fail( - 'Tainted SanitizedContentKind.TEXT for |noAutoescape: `%s`', - [value.content]); - // Return innocuous data in production. - return 'zSoyz'; - } - return String(value); -}; - - -// ----------------------------------------------------------------------------- -// Basic directives/functions. - - -/** - * Converts \r\n, \r, and \n to
      s - * @param {*} str The string in which to convert newlines. - * @return {string} A copy of {@code str} with converted newlines. - */ -soy.$$changeNewlineToBr = function(str) { - return goog.string.newLineToBr(String(str), false); -}; - - -/** - * Inserts word breaks ('wbr' tags) into a HTML string at a given interval. The - * counter is reset if a space is encountered. Word breaks aren't inserted into - * HTML tags or entities. Entites count towards the character count; HTML tags - * do not. - * - * @param {*} str The HTML string to insert word breaks into. Can be other - * types, but the value will be coerced to a string. - * @param {number} maxCharsBetweenWordBreaks Maximum number of non-space - * characters to allow before adding a word break. - * @return {string} The string including word breaks. - */ -soy.$$insertWordBreaks = function(str, maxCharsBetweenWordBreaks) { - return goog.format.insertWordBreaks(String(str), maxCharsBetweenWordBreaks); -}; - - -/** - * Truncates a string to a given max length (if it's currently longer), - * optionally adding ellipsis at the end. - * - * @param {*} str The string to truncate. Can be other types, but the value will - * be coerced to a string. - * @param {number} maxLen The maximum length of the string after truncation - * (including ellipsis, if applicable). - * @param {boolean} doAddEllipsis Whether to add ellipsis if the string needs - * truncation. - * @return {string} The string after truncation. - */ -soy.$$truncate = function(str, maxLen, doAddEllipsis) { - - str = String(str); - if (str.length <= maxLen) { - return str; // no need to truncate - } - - // If doAddEllipsis, either reduce maxLen to compensate, or else if maxLen is - // too small, just turn off doAddEllipsis. - if (doAddEllipsis) { - if (maxLen > 3) { - maxLen -= 3; - } else { - doAddEllipsis = false; - } - } - - // Make sure truncating at maxLen doesn't cut up a unicode surrogate pair. - if (soy.$$isHighSurrogate_(str.charAt(maxLen - 1)) && - soy.$$isLowSurrogate_(str.charAt(maxLen))) { - maxLen -= 1; - } - - // Truncate. - str = str.substring(0, maxLen); - - // Add ellipsis. - if (doAddEllipsis) { - str += '...'; - } - - return str; -}; - -/** - * Private helper for $$truncate() to check whether a char is a high surrogate. - * @param {string} ch The char to check. - * @return {boolean} Whether the given char is a unicode high surrogate. - * @private - */ -soy.$$isHighSurrogate_ = function(ch) { - return 0xD800 <= ch && ch <= 0xDBFF; -}; - -/** - * Private helper for $$truncate() to check whether a char is a low surrogate. - * @param {string} ch The char to check. - * @return {boolean} Whether the given char is a unicode low surrogate. - * @private - */ -soy.$$isLowSurrogate_ = function(ch) { - return 0xDC00 <= ch && ch <= 0xDFFF; -}; - - -// ----------------------------------------------------------------------------- -// Bidi directives/functions. - - -/** - * Cache of bidi formatter by context directionality, so we don't keep on - * creating new objects. - * @type {!Object.} - * @private - */ -soy.$$bidiFormatterCache_ = {}; - - -/** - * Returns cached bidi formatter for bidiGlobalDir, or creates a new one. - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @return {goog.i18n.BidiFormatter} A formatter for bidiGlobalDir. - * @private - */ -soy.$$getBidiFormatterInstance_ = function(bidiGlobalDir) { - return soy.$$bidiFormatterCache_[bidiGlobalDir] || - (soy.$$bidiFormatterCache_[bidiGlobalDir] = - new goog.i18n.BidiFormatter(bidiGlobalDir)); -}; - - -/** - * Estimate the overall directionality of text. If opt_isHtml, makes sure to - * ignore the LTR nature of the mark-up and escapes in text, making the logic - * suitable for HTML and HTML-escaped text. - * @param {string} text The text whose directionality is to be estimated. - * @param {boolean=} opt_isHtml Whether text is HTML/HTML-escaped. - * Default: false. - * @return {number} 1 if text is LTR, -1 if it is RTL, and 0 if it is neutral. - */ -soy.$$bidiTextDir = function(text, opt_isHtml) { - if (!text) { - return 0; - } - return goog.i18n.bidi.detectRtlDirectionality(text, opt_isHtml) ? -1 : 1; -}; - - -/** - * Returns 'dir="ltr"' or 'dir="rtl"', depending on text's estimated - * directionality, if it is not the same as bidiGlobalDir. - * Otherwise, returns the empty string. - * If opt_isHtml, makes sure to ignore the LTR nature of the mark-up and escapes - * in text, making the logic suitable for HTML and HTML-escaped text. - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @param {string} text The text whose directionality is to be estimated. - * @param {boolean=} opt_isHtml Whether text is HTML/HTML-escaped. - * Default: false. - * @return {soydata.SanitizedHtmlAttribute} 'dir="rtl"' for RTL text in non-RTL - * context; 'dir="ltr"' for LTR text in non-LTR context; - * else, the empty string. - */ -soy.$$bidiDirAttr = function(bidiGlobalDir, text, opt_isHtml) { - return soydata.VERY_UNSAFE.ordainSanitizedHtmlAttribute( - soy.$$getBidiFormatterInstance_(bidiGlobalDir).dirAttr(text, opt_isHtml)); -}; - - -/** - * Returns a Unicode BiDi mark matching bidiGlobalDir (LRM or RLM) if the - * directionality or the exit directionality of text are opposite to - * bidiGlobalDir. Otherwise returns the empty string. - * If opt_isHtml, makes sure to ignore the LTR nature of the mark-up and escapes - * in text, making the logic suitable for HTML and HTML-escaped text. - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @param {string} text The text whose directionality is to be estimated. - * @param {boolean=} opt_isHtml Whether text is HTML/HTML-escaped. - * Default: false. - * @return {string} A Unicode bidi mark matching bidiGlobalDir, or the empty - * string when text's overall and exit directionalities both match - * bidiGlobalDir, or bidiGlobalDir is 0 (unknown). - */ -soy.$$bidiMarkAfter = function(bidiGlobalDir, text, opt_isHtml) { - var formatter = soy.$$getBidiFormatterInstance_(bidiGlobalDir); - return formatter.markAfter(text, opt_isHtml); -}; - - -/** - * Returns str wrapped in a according to its directionality - * - but only if that is neither neutral nor the same as the global context. - * Otherwise, returns str unchanged. - * Always treats str as HTML/HTML-escaped, i.e. ignores mark-up and escapes when - * estimating str's directionality. - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @param {*} str The string to be wrapped. Can be other types, but the value - * will be coerced to a string. - * @return {string} The wrapped string. - */ -soy.$$bidiSpanWrap = function(bidiGlobalDir, str) { - var formatter = soy.$$getBidiFormatterInstance_(bidiGlobalDir); - return formatter.spanWrap(str + '', true); -}; - - -/** - * Returns str wrapped in Unicode BiDi formatting characters according to its - * directionality, i.e. either LRE or RLE at the beginning and PDF at the end - - * but only if str's directionality is neither neutral nor the same as the - * global context. Otherwise, returns str unchanged. - * Always treats str as HTML/HTML-escaped, i.e. ignores mark-up and escapes when - * estimating str's directionality. - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @param {*} str The string to be wrapped. Can be other types, but the value - * will be coerced to a string. - * @return {string} The wrapped string. - */ -soy.$$bidiUnicodeWrap = function(bidiGlobalDir, str) { - var formatter = soy.$$getBidiFormatterInstance_(bidiGlobalDir); - return formatter.unicodeWrap(str + '', true); -}; - - -// ----------------------------------------------------------------------------- -// Generated code. - - - - -// START GENERATED CODE FOR ESCAPERS. - -/** - * @type {function (*) : string} - */ -soy.esc.$$escapeUriHelper = function(v) { - return encodeURIComponent(String(v)); -}; - -/** - * Maps charcters to the escaped versions for the named escape directives. - * @type {Object.} - * @private - */ -soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_ = { - '\x00': '\x26#0;', - '\x22': '\x26quot;', - '\x26': '\x26amp;', - '\x27': '\x26#39;', - '\x3c': '\x26lt;', - '\x3e': '\x26gt;', - '\x09': '\x26#9;', - '\x0a': '\x26#10;', - '\x0b': '\x26#11;', - '\x0c': '\x26#12;', - '\x0d': '\x26#13;', - ' ': '\x26#32;', - '-': '\x26#45;', - '\/': '\x26#47;', - '\x3d': '\x26#61;', - '`': '\x26#96;', - '\x85': '\x26#133;', - '\xa0': '\x26#160;', - '\u2028': '\x26#8232;', - '\u2029': '\x26#8233;' -}; - -/** - * A function that can be used with String.replace.. - * @param {string} ch A single character matched by a compatible matcher. - * @return {string} A token in the output language. - * @private - */ -soy.esc.$$REPLACER_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_ = function(ch) { - return soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_[ch]; -}; - -/** - * Maps charcters to the escaped versions for the named escape directives. - * @type {Object.} - * @private - */ -soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_JS_STRING__AND__ESCAPE_JS_REGEX_ = { - '\x00': '\\x00', - '\x08': '\\x08', - '\x09': '\\t', - '\x0a': '\\n', - '\x0b': '\\x0b', - '\x0c': '\\f', - '\x0d': '\\r', - '\x22': '\\x22', - '\x26': '\\x26', - '\x27': '\\x27', - '\/': '\\\/', - '\x3c': '\\x3c', - '\x3d': '\\x3d', - '\x3e': '\\x3e', - '\\': '\\\\', - '\x85': '\\x85', - '\u2028': '\\u2028', - '\u2029': '\\u2029', - '$': '\\x24', - '(': '\\x28', - ')': '\\x29', - '*': '\\x2a', - '+': '\\x2b', - ',': '\\x2c', - '-': '\\x2d', - '.': '\\x2e', - ':': '\\x3a', - '?': '\\x3f', - '[': '\\x5b', - ']': '\\x5d', - '^': '\\x5e', - '{': '\\x7b', - '|': '\\x7c', - '}': '\\x7d' -}; - -/** - * A function that can be used with String.replace.. - * @param {string} ch A single character matched by a compatible matcher. - * @return {string} A token in the output language. - * @private - */ -soy.esc.$$REPLACER_FOR_ESCAPE_JS_STRING__AND__ESCAPE_JS_REGEX_ = function(ch) { - return soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_JS_STRING__AND__ESCAPE_JS_REGEX_[ch]; -}; - -/** - * Maps charcters to the escaped versions for the named escape directives. - * @type {Object.} - * @private - */ -soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_CSS_STRING_ = { - '\x00': '\\0 ', - '\x08': '\\8 ', - '\x09': '\\9 ', - '\x0a': '\\a ', - '\x0b': '\\b ', - '\x0c': '\\c ', - '\x0d': '\\d ', - '\x22': '\\22 ', - '\x26': '\\26 ', - '\x27': '\\27 ', - '(': '\\28 ', - ')': '\\29 ', - '*': '\\2a ', - '\/': '\\2f ', - ':': '\\3a ', - ';': '\\3b ', - '\x3c': '\\3c ', - '\x3d': '\\3d ', - '\x3e': '\\3e ', - '@': '\\40 ', - '\\': '\\5c ', - '{': '\\7b ', - '}': '\\7d ', - '\x85': '\\85 ', - '\xa0': '\\a0 ', - '\u2028': '\\2028 ', - '\u2029': '\\2029 ' -}; - -/** - * A function that can be used with String.replace.. - * @param {string} ch A single character matched by a compatible matcher. - * @return {string} A token in the output language. - * @private - */ -soy.esc.$$REPLACER_FOR_ESCAPE_CSS_STRING_ = function(ch) { - return soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_CSS_STRING_[ch]; -}; - -/** - * Maps charcters to the escaped versions for the named escape directives. - * @type {Object.} - * @private - */ -soy.esc.$$ESCAPE_MAP_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_ = { - '\x00': '%00', - '\x01': '%01', - '\x02': '%02', - '\x03': '%03', - '\x04': '%04', - '\x05': '%05', - '\x06': '%06', - '\x07': '%07', - '\x08': '%08', - '\x09': '%09', - '\x0a': '%0A', - '\x0b': '%0B', - '\x0c': '%0C', - '\x0d': '%0D', - '\x0e': '%0E', - '\x0f': '%0F', - '\x10': '%10', - '\x11': '%11', - '\x12': '%12', - '\x13': '%13', - '\x14': '%14', - '\x15': '%15', - '\x16': '%16', - '\x17': '%17', - '\x18': '%18', - '\x19': '%19', - '\x1a': '%1A', - '\x1b': '%1B', - '\x1c': '%1C', - '\x1d': '%1D', - '\x1e': '%1E', - '\x1f': '%1F', - ' ': '%20', - '\x22': '%22', - '\x27': '%27', - '(': '%28', - ')': '%29', - '\x3c': '%3C', - '\x3e': '%3E', - '\\': '%5C', - '{': '%7B', - '}': '%7D', - '\x7f': '%7F', - '\x85': '%C2%85', - '\xa0': '%C2%A0', - '\u2028': '%E2%80%A8', - '\u2029': '%E2%80%A9', - '\uff01': '%EF%BC%81', - '\uff03': '%EF%BC%83', - '\uff04': '%EF%BC%84', - '\uff06': '%EF%BC%86', - '\uff07': '%EF%BC%87', - '\uff08': '%EF%BC%88', - '\uff09': '%EF%BC%89', - '\uff0a': '%EF%BC%8A', - '\uff0b': '%EF%BC%8B', - '\uff0c': '%EF%BC%8C', - '\uff0f': '%EF%BC%8F', - '\uff1a': '%EF%BC%9A', - '\uff1b': '%EF%BC%9B', - '\uff1d': '%EF%BC%9D', - '\uff1f': '%EF%BC%9F', - '\uff20': '%EF%BC%A0', - '\uff3b': '%EF%BC%BB', - '\uff3d': '%EF%BC%BD' -}; - -/** - * A function that can be used with String.replace.. - * @param {string} ch A single character matched by a compatible matcher. - * @return {string} A token in the output language. - * @private - */ -soy.esc.$$REPLACER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_ = function(ch) { - return soy.esc.$$ESCAPE_MAP_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_[ch]; -}; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_ESCAPE_HTML_ = /[\x00\x22\x26\x27\x3c\x3e]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_NORMALIZE_HTML_ = /[\x00\x22\x27\x3c\x3e]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_ESCAPE_HTML_NOSPACE_ = /[\x00\x09-\x0d \x22\x26\x27\x2d\/\x3c-\x3e`\x85\xa0\u2028\u2029]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_NORMALIZE_HTML_NOSPACE_ = /[\x00\x09-\x0d \x22\x27\x2d\/\x3c-\x3e`\x85\xa0\u2028\u2029]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_ESCAPE_JS_STRING_ = /[\x00\x08-\x0d\x22\x26\x27\/\x3c-\x3e\\\x85\u2028\u2029]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_ESCAPE_JS_REGEX_ = /[\x00\x08-\x0d\x22\x24\x26-\/\x3a\x3c-\x3f\x5b-\x5e\x7b-\x7d\x85\u2028\u2029]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_ESCAPE_CSS_STRING_ = /[\x00\x08-\x0d\x22\x26-\x2a\/\x3a-\x3e@\\\x7b\x7d\x85\xa0\u2028\u2029]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_ = /[\x00- \x22\x27-\x29\x3c\x3e\\\x7b\x7d\x7f\x85\xa0\u2028\u2029\uff01\uff03\uff04\uff06-\uff0c\uff0f\uff1a\uff1b\uff1d\uff1f\uff20\uff3b\uff3d]/g; - -/** - * A pattern that vets values produced by the named directives. - * @type RegExp - * @private - */ -soy.esc.$$FILTER_FOR_FILTER_CSS_VALUE_ = /^(?!-*(?:expression|(?:moz-)?binding))(?:[.#]?-?(?:[_a-z0-9-]+)(?:-[_a-z0-9-]+)*-?|-?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[a-z]{1,2}|%)?|!important|)$/i; - -/** - * A pattern that vets values produced by the named directives. - * @type RegExp - * @private - */ -soy.esc.$$FILTER_FOR_FILTER_NORMALIZE_URI_ = /^(?:(?:https?|mailto):|[^&:\/?#]*(?:[\/?#]|$))/i; - -/** - * A pattern that vets values produced by the named directives. - * @type RegExp - * @private - */ -soy.esc.$$FILTER_FOR_FILTER_HTML_ATTRIBUTES_ = /^(?!style|on|action|archive|background|cite|classid|codebase|data|dsync|href|longdesc|src|usemap)(?:[a-z0-9_$:-]*)$/i; - -/** - * A pattern that vets values produced by the named directives. - * @type RegExp - * @private - */ -soy.esc.$$FILTER_FOR_FILTER_HTML_ELEMENT_NAME_ = /^(?!script|style|title|textarea|xmp|no)[a-z0-9_$:-]*$/i; - -/** - * A helper for the Soy directive |escapeHtml - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$escapeHtmlHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_ESCAPE_HTML_, - soy.esc.$$REPLACER_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_); -}; - -/** - * A helper for the Soy directive |normalizeHtml - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$normalizeHtmlHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_NORMALIZE_HTML_, - soy.esc.$$REPLACER_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_); -}; - -/** - * A helper for the Soy directive |escapeHtmlNospace - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$escapeHtmlNospaceHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_ESCAPE_HTML_NOSPACE_, - soy.esc.$$REPLACER_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_); -}; - -/** - * A helper for the Soy directive |normalizeHtmlNospace - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$normalizeHtmlNospaceHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_NORMALIZE_HTML_NOSPACE_, - soy.esc.$$REPLACER_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_); -}; - -/** - * A helper for the Soy directive |escapeJsString - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$escapeJsStringHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_ESCAPE_JS_STRING_, - soy.esc.$$REPLACER_FOR_ESCAPE_JS_STRING__AND__ESCAPE_JS_REGEX_); -}; - -/** - * A helper for the Soy directive |escapeJsRegex - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$escapeJsRegexHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_ESCAPE_JS_REGEX_, - soy.esc.$$REPLACER_FOR_ESCAPE_JS_STRING__AND__ESCAPE_JS_REGEX_); -}; - -/** - * A helper for the Soy directive |escapeCssString - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$escapeCssStringHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_ESCAPE_CSS_STRING_, - soy.esc.$$REPLACER_FOR_ESCAPE_CSS_STRING_); -}; - -/** - * A helper for the Soy directive |filterCssValue - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$filterCssValueHelper = function(value) { - var str = String(value); - if (!soy.esc.$$FILTER_FOR_FILTER_CSS_VALUE_.test(str)) { - return 'zSoyz'; - } - return str; -}; - -/** - * A helper for the Soy directive |normalizeUri - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$normalizeUriHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_, - soy.esc.$$REPLACER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_); -}; - -/** - * A helper for the Soy directive |filterNormalizeUri - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$filterNormalizeUriHelper = function(value) { - var str = String(value); - if (!soy.esc.$$FILTER_FOR_FILTER_NORMALIZE_URI_.test(str)) { - return '#zSoyz'; - } - return str.replace( - soy.esc.$$MATCHER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_, - soy.esc.$$REPLACER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_); -}; - -/** - * A helper for the Soy directive |filterHtmlAttributes - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$filterHtmlAttributesHelper = function(value) { - var str = String(value); - if (!soy.esc.$$FILTER_FOR_FILTER_HTML_ATTRIBUTES_.test(str)) { - return 'zSoyz'; - } - return str; -}; - -/** - * A helper for the Soy directive |filterHtmlElementName - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$filterHtmlElementNameHelper = function(value) { - var str = String(value); - if (!soy.esc.$$FILTER_FOR_FILTER_HTML_ELEMENT_NAME_.test(str)) { - return 'zSoyz'; - } - return str; -}; - -/** - * Matches all tags, HTML comments, and DOCTYPEs in tag soup HTML. - * By removing these, and replacing any '<' or '>' characters with - * entities we guarantee that the result can be embedded into a - * an attribute without introducing a tag boundary. - * - * @type {RegExp} - * @private - */ -soy.esc.$$HTML_TAG_REGEX_ = /<(?:!|\/?([a-zA-Z][a-zA-Z0-9:\-]*))(?:[^>'"]|"[^"]*"|'[^']*')*>/g; - -/** - * Matches all occurrences of '<'. - * - * @type {RegExp} - * @private - */ -soy.esc.$$LT_REGEX_ = /} - * @private - */ -soy.esc.$$SAFE_TAG_WHITELIST_ = {'b': 1, 'br': 1, 'em': 1, 'i': 1, 's': 1, 'sub': 1, 'sup': 1, 'u': 1}; - -// END GENERATED CODE diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/style.css b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/style.css deleted file mode 100644 index 0db0c02..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/style.css +++ /dev/null @@ -1,104 +0,0 @@ -body { - background-color: #fff; - font-family: sans-serif; - margin-top: 0; -} -h1 { - font-weight: normal; - font-size: 140%; -} -.farSide { - text-align: right; -} -html[dir="RTL"] .farSide { - text-align: left; -} -.tab { - padding: 6px 12px; - text-decoration: none; - color: #000; -} -#selected { - font-weight: bold; - background-color: #ddd; - border-radius: 20px; -} - -/* Pulse the language menu once to draw attention to it. */ -#languageBorder { - border-radius: 4px; - animation: pulse 2s ease-in-out forwards; - -webkit-animation: pulse 2s ease-in-out forwards; - animation-delay: 2s; - -webkit-animation-delay: 2s; -} -@keyframes pulse { - 0% { background-color: #fff } - 50% { background-color: #f00 } - 100% { background-color: #fff } -} -@-webkit-keyframes pulse { - 0% { background-color: #fff } - 50% { background-color: #f00 } - 100% { background-color: #fff } -} - -#blockly { - height: 300px; - width: 100%; - border-style: solid; - border-color: #ddd; - border-width: 0 1px 1px 0; -} - -/* SVG Plane. */ -#plane { - overflow: hidden; -} -#fuselage { - fill: #fff; - stroke: #000; -} -#wing, #tail { - fill: #ddd; - stroke: #444; -} -.crew { - fill: #f44; - stroke: #000; -} -.seat1st { - fill: #88f; - stroke: #000; -} -.seat2nd { - fill: #8b8; - stroke: #000; -} -#seatYes, #seatNo { - font-size: 40pt; -} -text { - font-family: sans-serif; - font-size: 20pt; - fill: #444; -} -html[dir="RTL"] #plane text { - text-anchor: end; -} - -/* Slider. */ -.sliderTrack { - stroke: #aaa; - stroke-width: 6px; - stroke-linecap: round; -} -.sliderKnob { - fill: #ddd; - stroke: #bbc; - stroke-width: 1px; - stroke-linejoin: round; -} -.sliderKnob:hover { - fill: #eee; -} diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/template.soy b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/template.soy deleted file mode 100644 index 1d58a97..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/template.soy +++ /dev/null @@ -1,204 +0,0 @@ -{namespace planepage} - -/** - * This is a Closure Template. - * - * See the README.txt for details. - */ - -/** - * Translated messages for use in JavaScript. - */ -{template .messages} -
      - {msg meaning="Plane.rows" desc="page text - Total number of rows of seats on an airplane.\n\nParameters:\n* %1 - number of rows of seats on an airplane. It is always an integer greater than or equal to zero."}Rows: %1{/msg} - {msg meaning="Plane.getRows" desc="block text - The number of rows on the airplane, to be used in a mathematical equation, such as: 'seats = 4 x '''rows (5)''''.\n\nParameters:\n* %1 - number of rows of seats on an airplane. It is always an integer greater than or equal to zero."}rows (%1){/msg} - {msg meaning="Plane.rows1" desc="page text - The number of rows of first-class seats on the airplane. You can see the block at [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of first-class seats on an airplane. It is always an integer greater than or equal to zero."}1st class rows: %1{/msg} - {msg meaning="Plane.getRows1" desc="block text - The number of rows of first-class seats on the, to be used in a mathematical equation. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of first-class seats on an airplane. It is always an integer greater than or equal to zero."}1st class rows (%1){/msg} - {msg meaning="Plane.rows2" desc="page text - The number of rows of second-class seats on the airplane. %1 is an integer greater or equal to zero. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of second-class seats on an airplane. It is always an integer greater than or equal to zero."}2nd class rows: %1{/msg} - {msg meaning="Plane.getRows2" desc="block text - The number of rows of second-class (also called 'economy class') seats on the airplane, to be used in a mathematical expression.\n\nParameters:\n* %1 - number of rows of second-class seats on an airplane. It is always an integer greater than or equal to zero."}2nd class rows (%1){/msg} - {msg meaning="Plane.seats" desc="page text - The total number of seats on the airplane.\n\nParameters:\n* %1 - number of seats on an airplane. It is always either the next message or an integer greater than or equal to zero."}Seats: %1{/msg} - {msg meaning="Plane.placeholder" desc="page text - A word or symbol indicating that this numeric value has not yet been determined."}?{/msg} - {msg meaning="Plane.setSeats" desc="block text - The first half of a mathematical equation determining the number of seats in an airplane, such as: ''''seats =''' 4 x rows'."}seats ={/msg} -
      -{/template} - -/** - * Web page structure. - */ -{template .start} - {call .messages /} - - - - - -
      -

      Blockly‏ >{sp} - Demos‏ >{sp} - - {msg meaning="Plane.plane" desc="title - Specifies that this is Blockly's '''Plane''' (airplane) tutorial. The word 'plane' was chosen over 'airplane' in English because it is shorter and less formal."} - Plane Seat Calculator - {/msg} - - {sp} {sp} - {for $i in range(1, $ij.maxLevel + 1)} - {sp} - {if $i == $ij.level} - {$i} - {else} - {if $i < $ij.level} - - {else} - {$i} - {/if} - {/if} - {/for} -

      -
      - - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {if $ij.level > 1} - - - {/if} - - -

      - {switch $ij.level} - {case 1} - {msg meaning="Plane.description1" desc="instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=1 this level], there is only one type of seat on the plane."}An airplane has a number of rows of passenger seats. Each row contains four seats.{/msg} - {case 2} - {msg meaning="Plane.description2" desc="instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=2 this level], there are two types of seats on this plane."}An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats.{/msg} - {case 3} - {msg meaning="Plane.description3" desc="instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3 this level], there are three types of seats on this plane. Be sure to use the same terms for '1st class' and '2nd class' as you did for the earlier messages."}An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats.{/msg} - {/switch} -

      -

      - {msg meaning="Plane.instructions" desc="page text - This text appears below the airplane graphic and above the space for the user to create the formula. The number of rows an the graphic may be changed by the user with a slider. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=1] for a picture."}Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above).{/msg} -

      - - - - - - - {call .toolbox /} -
      -{/template} - -/** - * Toolboxes for each level. - */ -{template .toolbox} - -{/template} diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/extracted_msgs.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/extracted_msgs.xlf deleted file mode 100644 index 6a4fd44..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/extracted_msgs.xlf +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - Rows: %1 - page text - Total number of rows of seats on an airplane.\n\nParameters:\n* %1 - number of rows of seats on an airplane. It is always an integer greater than or equal to zero. - Plane.rows - - - seats = - block text - The first half of a mathematical equation determining the number of seats in an airplane, such as: ''''seats =''' 4 x rows'. - Plane.setSeats - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3 this level], there are three types of seats on this plane. Be sure to use the same terms for '1st class' and '2nd class' as you did for the earlier messages. - Plane.description3 - - - ? - page text - A word or symbol indicating that this numeric value has not yet been determined. - Plane.placeholder - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - page text - This text appears below the airplane graphic and above the space for the user to create the formula. The number of rows an the graphic may be changed by the user with a slider. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=1] for a picture. - Plane.instructions - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=2 this level], there are two types of seats on this plane. - Plane.description2 - - - 1st class rows (%1) - block text - The number of rows of first-class seats on the, to be used in a mathematical equation. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of first-class seats on an airplane. It is always an integer greater than or equal to zero. - Plane.getRows1 - - - 2nd class rows: %1 - page text - The number of rows of second-class seats on the airplane. %1 is an integer greater or equal to zero. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of second-class seats on an airplane. It is always an integer greater than or equal to zero. - Plane.rows2 - - - Seats: %1 - page text - The total number of seats on the airplane.\n\nParameters:\n* %1 - number of seats on an airplane. It is always either the next message or an integer greater than or equal to zero. - Plane.seats - - - Plane Seat Calculator - title - Specifies that this is Blockly's '''Plane''' (airplane) tutorial. The word 'plane' was chosen over 'airplane' in English because it is shorter and less formal. - Plane.plane - - - rows (%1) - block text - The number of rows on the airplane, to be used in a mathematical equation, such as: 'seats = 4 x '''rows (5)''''.\n\nParameters:\n* %1 - number of rows of seats on an airplane. It is always an integer greater than or equal to zero. - Plane.getRows - - - 1st class rows: %1 - page text - The number of rows of first-class seats on the airplane. You can see the block at [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of first-class seats on an airplane. It is always an integer greater than or equal to zero. - Plane.rows1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=1 this level], there is only one type of seat on the plane. - Plane.description1 - - - 2nd class rows (%1) - block text - The number of rows of second-class (also called 'economy class') seats on the airplane, to be used in a mathematical expression.\n\nParameters:\n* %1 - number of rows of second-class seats on an airplane. It is always an integer greater than or equal to zero. - Plane.getRows2 - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ar.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ar.xlf deleted file mode 100644 index c9b8e16..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ar.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - الصفوف: %1 - - - seats = - المقاعد = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - طائرة بمقعدين في مقطورة الطيّار (للطيار ومساعده) وعدد من المقاعد في صفوف الدرجة الأولى والثانية. كل صف من صفوف الدرجة الأولى يحتوي على أربعة مقاعد. ويحتوي كل صف في الدرجة الثانية على خمسة مقاعد. - - - ? - ؟ - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - لبناء صيغة (أدناه) تقوم بحساب إجمالي عدد المقاعد في الطائرة عند تغيير الصفوف (أعلاه). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - طائرة بمقعدين في مقطورة الطيّار (للطيار ومساعده) وعدد من الصفوف يحتوي كل صف على أربعة مقاعد. - - - 1st class rows (%1) - صفوف الطبقة الأولى (%1) - - - 2nd class rows: %1 - صفوف الفئة الثانية: %1 - - - Seats: %1 - المقاعد: %1 - - - Plane Seat Calculator - آلة حاسبة لمقعد الطائرة - - - rows (%1) - الصفوف (%1) - - - 1st class rows: %1 - صفوف الطبقة الأولى: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - هنالك طائرة تحتوي على عدد من صفوف مقاعد الركاب. كل صف يحتوي على أربعة مقاعد. - - - 2nd class rows (%1) - صفوف الفئة الثانية: (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_be-tarask.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_be-tarask.xlf deleted file mode 100644 index 4580b5f..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_be-tarask.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Радкоў: %1 - - - seats = - месцаў = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Самалёт мае два месцы ў кабіне экіпажа (пілот і другі пілот), і некалькі пасажырскіх шэрагаў месцаў 1-га кляса і 2-га кляса. Кожны шэраг 1-га кляса утрымлівае чатыры месцы. Кожны шэраг 2-га кляса ўтрымлівае пяць месцаў. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Пабудаваць формулу (ніжэй), якая падлічвае агульную колькасьць месцаў у самалёце пры зьмене радоў (гл. вышэй). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Самалёт мае два месцы ў кабіне экіпажа (пілот і другі пілот), і некалькі шэрагаў пасажырскіх сядзеньняў. Кожны шэраг утрымлівае чатыры месцы. - - - 1st class rows (%1) - радкі першага клясу (%1) - - - 2nd class rows: %1 - Радкі другога клясу: %1 - - - Seats: %1 - Месцаў: %1 - - - Plane Seat Calculator - Калькулятар месцаў у самалёце - - - rows (%1) - радкоў (%1) - - - 1st class rows: %1 - Радкі першага клясу: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Самалёт мае некалькі шэрагаў пасажырскіх сядзеньняў. Кожная шэраг утрымлівае чатыры месцы. - - - 2nd class rows (%1) - радкі другога клясу (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_br.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_br.xlf deleted file mode 100644 index 4a7fc0c..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_br.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Renkennadoù : %1 - - - seats = - azezennoù = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - En un nijerez ez eus div azezenn el logell leviañ(evit al loman hag an eil loman), hag un toullad renkennadoù azezennoù tremenidi kentañ hag eil klas. Peder azezenn zo e pep renkennad kentañ klas. Pemp azezenn zo e pemp renkennad eil klas. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Sevel ur formulenn (amañ dindan) evit jediñ an niver a azezennoù en holl en nijerez pa vez kemmet an niver a renkennadoù (amañ a-us). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - En un nijerez ez eus div azezenn el logell leviañ(evit al loman hag an eil loman), hag ur toullad renkennadoù azezennoù evit an dremenidi. Peder azezenn zo e pep renkennad. - - - 1st class rows (%1) - Renkennadoù kentañ klas (%1) - - - 2nd class rows: %1 - Renkennadoù eil klas : %1 - - - Seats: %1 - Azezennoù : %1 - - - Plane Seat Calculator - Jederez azezenn nijerez - - - rows (%1) - renkennadoù (%1) - - - 1st class rows: %1 - Renkennadoù kentañ klas : %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un nijerez he deus un toullad renkennadoù azezennoù evit ar veajourien. Peder azezenn a zo e pep renkennad. - - - 2nd class rows (%1) - Renkennadoù eil klas (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ca.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ca.xlf deleted file mode 100644 index 17dfe65..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ca.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Files: %1 - - - seats = - seients = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un avió té dos seients en la cabina de vol (pel pilot i copilot) i un nombre de files per seients de passatgers de primera classe i de segona classe. Cada fila de primera classe conté quatre seients. Cada fila de segona classe conté cinc seients. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Construïu una fórmula (a sota) que calculi el nombre total de seients de l'avió a mida que canviïn les files (a dalt). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un avió té dos seients en la cabina de vol (pel pilot i pel copilot) i un nombre de files de seients de passatgers. Cada fila conté quatre seients. - - - 1st class rows (%1) - files de primera classe (%1) - - - 2nd class rows: %1 - files de segona classe: %1 - - - Seats: %1 - Seients: %1 - - - Plane Seat Calculator - Calculadora de seients d'avió - - - rows (%1) - files (%1) - - - 1st class rows: %1 - files de primera classe: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un avió té un nombre de files de seients de passatgers. Cada fila conté quatre seients. - - - 2nd class rows (%1) - files de segona classe (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_da.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_da.xlf deleted file mode 100644 index 752fe24..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_da.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rækker: %1 - - - seats = - sæder = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Et fly har to pladser i cockpittet (til pilot og med-pilot), og et antal rækker af 1. klasses og 2. klasses passagersæder. Hver 1. klasses række indeholder fire sæder. Hver 2. klasses række indeholder fem sæder. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Opbyg en formel (nedenfor), der beregner det samlede antal pladser på flyet, hvis antal rækker ændres (ovenfor). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Et fly har to pladser i cockpittet (til pilot og med-pilot), og et antal rækker af passagersæder. Hver række indeholder fire sæder. - - - 1st class rows (%1) - 1. klasse rækker (%1) - - - 2nd class rows: %1 - 2. klasse rækker: %1 - - - Seats: %1 - Sæder: %1 - - - Plane Seat Calculator - Flysædelommeregner - - - rows (%1) - rækker (%1) - - - 1st class rows: %1 - 1. klasse rækker: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Et fly har et antal rækker af passagersæder. Hver række indeholder fire sæder. - - - 2nd class rows (%1) - 2. klasse rækker (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_de.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_de.xlf deleted file mode 100644 index f06bc77..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_de.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Reihen: %1 - - - seats = - Sitze = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Ein Flugzeug hat zwei Sitze im Pilotenstand (für den Piloten und Co-Piloten) und eine Anzahl an Reihen mit Passagiersitzen der 1. und 2. Klasse. Jede 1.-Klasse-Reihe enthält vier Sitze. Jede 2.-Klasse-Reihe enthält fünf Sitze. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Erstelle eine Formel (unten), die die gesamte Anzahl an Sitzen im Flugzeug berechnet, wenn die Reihen (oben) geändert werden. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Ein Flugzeug hat zwei Sitze im Pilotenstand (für den Piloten und Co-Piloten) und eine Anzahl an Reihen mit Passagiersitzen. Jede Reihe enthält vier Sitze. - - - 1st class rows (%1) - Reihen der 1. Klasse (%1) - - - 2nd class rows: %1 - Reihen der 2. Klasse: %1 - - - Seats: %1 - Sitze: %1 - - - Plane Seat Calculator - Flugzeugsitzrechner - - - rows (%1) - Reihen (%1) - - - 1st class rows: %1 - Reihen der 1. Klasse: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Ein Flugzeug hat eine Anzahl an Reihen mit Passagiersitzen. Jede Reihe enthält vier Sitze. - - - 2nd class rows (%1) - Reihen der 2. Klasse (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_el.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_el.xlf deleted file mode 100644 index 5acb291..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_el.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Σειρές: %1 - - - seats = - καθίσματα = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Ένα αεροπλάνο έχει δύο καθίσματα στον θάλαμο διακυβέρνησης (για τον κυβερνήτη και τον συγκυβερνήτη), καθώς και έναν αριθμό σειρών καθισμάτων για την 1η και 2η θέση. Κάθε σειρά της 1ης θέσης έχει τέσσερα καθίσματα και κάθε σειρά της 2ης θέσης έχει πέντε καθίσματα. - - - ? - ; - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Φτιάξε έναν τύπο (κάτω) που θα υπολογίζει τον συνολικό αριθμό καθισμάτων του αεροπλάνου καθώς αλλάζουν οι σειρές (πάνω). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Ένα αεροπλάνο έχει δύο καθίσματα στον θάλαμο διακυβέρνησης (για τον κυβερνήτη και τον συγκυβερνήτη), καθώς και έναν αριθμό από σειρές καθισμάτων επιβατών. Κάθε σειρά έχει τέσσερα καθίσματα. - - - 1st class rows (%1) - Σειρές 1ης θέσης (%1) - - - 2nd class rows: %1 - Σειρές 2ης θέσης: %1 - - - Seats: %1 - Καθίσματα: %1 - - - Plane Seat Calculator - Υπολογισμός Θέσεων Σε Αεροπλάνο - - - rows (%1) - σειρές (%1) - - - 1st class rows: %1 - Σειρές 1ης θέσης: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Ένα αεροπλάνο έχει έναν συγκεκριμένο αριθμό σειρών καθισμάτων επιβατών. Κάθε σειρά έχει τέσσερα καθίσματα. - - - 2nd class rows (%1) - Σειρές 2ης θέσης (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_en.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_en.xlf deleted file mode 100644 index e471a00..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_en.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rows: %1 - - - seats = - seats = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - - - 1st class rows (%1) - 1st class rows (%1) - - - 2nd class rows: %1 - 2nd class rows: %1 - - - Seats: %1 - Seats: %1 - - - Plane Seat Calculator - Plane Seat Calculator - - - rows (%1) - rows (%1) - - - 1st class rows: %1 - 1st class rows: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - An airplane has a number of rows of passenger seats. Each row contains four seats. - - - 2nd class rows (%1) - 2nd class rows (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_es.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_es.xlf deleted file mode 100644 index e2022b5..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_es.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Filas: %1 - - - seats = - asientos = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un avión tiene dos asientos en la cabina de vuelo (para el piloto y co-piloto), y un número de filas de asientos para pasajeros de primera y segunda clase. Cada fila de la primera clase contiene cuatro asientos. Cada fila de la segunda clase contiene cinco asientos. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Construir una fórmula (abajo) que calcule el número total de asientos en el avión cuando las filas sean cambiadas (arriba). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un avión tiene dos asientos en la cabina de vuelo (para el piloto y co-piloto), y un número de filas de asientos de pasajeros. Cada fila contiene cuatro asientos. - - - 1st class rows (%1) - Filas de primera clase: (%1) - - - 2nd class rows: %1 - Filas de segunda clase: %1 - - - Seats: %1 - Asientos: %1 - - - Plane Seat Calculator - Calculadora de asientos de avión - - - rows (%1) - filas (%1) - - - 1st class rows: %1 - Filas de primera clase: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un avión  tiene un número de filas de asientos de pasajeros. Cada fila contiene cuatro asientos. - - - 2nd class rows (%1) - Filas de segunda clase: (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_fa.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_fa.xlf deleted file mode 100644 index 264ec31..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_fa.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - ردیف: %1 - - - seats = - صندلی‌ها = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - یک هواپیما دو صندلی در کابین خلبان دارد (برای خلبان و کمک خلبان) و تهداد از صندلی‌ها مسافرین درجه یک و درجه دو. هر ردیف درجه یک شامل چهار صندلی است. هر ردیف درجه دو شامل پنج صندلی است. - - - ? - ؟ - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - یک فرمول بسازید (پایین) که تعداد کل صندلی‌های هواپیما با تغییر ردیف را حساب کند (بالا). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - یک هواپیما دو صندلی در عرشهٔ پرواز دارد (برای خلبان و کمک خلبان) و تعدادی صندلی مسافرین. هر ردیف شامل چهار صندلی است. - - - 1st class rows (%1) - اولین کلاس ردیف‌ها (%1) - - - 2nd class rows: %1 - دومین کلاس ردیف: %1 - - - Seats: %1 - صندلی‌ها: %1 - - - Plane Seat Calculator - محاسبه‌گر صندلی‌های هواپیما - - - rows (%1) - ردیف‌ها (%1) - - - 1st class rows: %1 - اولین ردیف کلاس: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - یک هواپیما تعداد از صندلی‌های مسافرین را دارد. هر ردیف شمال چهار صندلی است. - - - 2nd class rows (%1) - دومین کلاس ردیف‌ها (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_fr.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_fr.xlf deleted file mode 100644 index 9485da2..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_fr.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rangées : %1 - - - seats = - sièges = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un avion a deux sièges dans la cabine de pilotage (pour le pilote et le copilote), et un certain nombre de rangées de sièges passager de première et seconde classes. Chaque rangée de première classe contient quatre sièges. Chaque rangée de seconde classe contient cinq sièges. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Construire une formule (ci-dessous) qui calcule le nombre total de sièges dans l’avion quand le nombre de rangées est modifié (ci-dessus). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un avion a deux sièges dans le poste de pilotage (pour le pilote et le copilote), et un certain nombre de rangées de sièges passager. Chaque rangée contient quatre sièges. - - - 1st class rows (%1) - rangées de première classe (%1) - - - 2nd class rows: %1 - rangées de seconde classe : %1 - - - Seats: %1 - Sièges : %1 - - - Plane Seat Calculator - Calculateur de sièges d’avion - - - rows (%1) - rangées (%1) - - - 1st class rows: %1 - rangées de première classe : %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un avion a un nombre de rangées de sièges passager. Chaque rangée contient quatre sièges. - - - 2nd class rows (%1) - rangées de seconde classe (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_he.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_he.xlf deleted file mode 100644 index 55ac148..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_he.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - שורות: %1 - - - seats = - מושבים = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - במטוס יש שני מושבים עבור הצוות (בשביל הטייס וטייס המשנה), ומספר שורות מושבים במחלקת הנוסעים הראשונה ובמחלקת הנוסעים השנייה. כל שורה במחלקה הראשונה מכילה ארבעה מושבים. כל שורה במחלקה השנייה מכילה חמישה מושבים. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - בנה נוסחה (למטה) אשר תחשב את סך כל המושבים במטוס בהתאם לשינוי מספר השורות (למעלה). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - במטוס יש שני מושבים עבור הצוות (בשביל הטייס וטייס המשנה), ומספר שורות עם מושבי נוסעים. בכל שורה יש ארבעה מושבים. - - - 1st class rows (%1) - שורות במחלקה ראשונה (%1) - - - 2nd class rows: %1 - שורות במחלקה שנייה: %1 - - - Seats: %1 - מושבים: %1 - - - Plane Seat Calculator - מחשבון מושב במטוס - - - rows (%1) - שורות (%1) - - - 1st class rows: %1 - שורות במחלקה ראשונה: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - במטוס יש מספר שורות עם מושבי נוסעים. בכל שורה יש ארבעה מושבים. - - - 2nd class rows (%1) - שורות במחלקה שנייה: (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_hrx.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_hrx.xlf deleted file mode 100644 index 263d305..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_hrx.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Reihe: %1 - - - seats = - Sitze = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - En Fluchzeich hot zwooi Sitze im Pilotstand (für den Pilot und Co-Pilot) und en Oonzohl an Reihe mit Passagiersitze der 1. und 2. Klasse. Jede 1.-Klasse-Reih enthält vier Sitze. Jede 2.-Klasse-Reih enthält fünf Sitze. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Erstell en Formel (unne), die die gesamte Oonzohl an Sitze im Fluchzeich berechnet, wenn die Reihe (uwe) geännert sin. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - En Fluchzeich hot zwooi Sitze im Pilotestand (für den Pilot und Co-Pilot) und en Oonzohl an Reihe mit Passagiersitze. Jede Reih enthält vier Sitze. - - - 1st class rows (%1) - Reihe von der 1. Klasse (%1) - - - 2nd class rows: %1 - Reihe von der 2. Klasse: %1 - - - Seats: %1 - Sitz: %1 - - - Plane Seat Calculator - Fluchzeichsitzrechner - - - rows (%1) - Reihe (%1) - - - 1st class rows: %1 - Reihe von der 1. Klasse: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - En Fluchzeich hot en Oonzohl an Reihe mit Passagiersitze. Jede Reih enthält vier Sitze. - - - 2nd class rows (%1) - Reihe von der 2. Klasse (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_hu.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_hu.xlf deleted file mode 100644 index c44d1aa..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_hu.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Sorok száma: %1 - - - seats = - Ülések száma = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Egy repülőgépnek 2 ülése van a pilótafülkében (a pilótának és a másodpilótának), az utasok 1. és 2. osztályon utazhatnak. Az 1. osztályon négy szék van egy sorban. A 2. osztályon öt szék van egy sorban. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Készítsd el a képletet (lent) amivel kiszámolható, hogy hány ülés van összesen a repülőgépen annak függvényében, ahogy (fent) állítod a sorok számát. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Egy repülőgépnek 2 ülése van a pilótafülkében (a pilótának és a másodpilótának), az utasok több sorban ülnek az utastérben. Az utastér minden sorában négy szék van. - - - 1st class rows (%1) - 1. osztály sorai (%1) - - - 2nd class rows: %1 - 2. osztály: %1 sor - - - Seats: %1 - Ülések száma összesen: %1 - - - Plane Seat Calculator - Repülőgép alkalmazás - - - rows (%1) - Sorok száma (%1) - - - 1st class rows: %1 - 1. osztály: %1 sor - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Egy repülőgépen az utasok több sorban ülnek az utastérben. Az utastér minden sorában négy szék van. - - - 2nd class rows (%1) - 2. osztály sorai (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ia.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ia.xlf deleted file mode 100644 index 83ae2c6..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ia.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Filas: %1 - - - seats = - sedes = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un avion ha duo sedes in le cabina (pro le pilota e le copilota) e un numero de filas de sedes pro passageros del prime classe e del secunde classes. Cata fila del prime classe contine quatro sedes. Cata fila del secunde classe contine cinque sedes. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Construe un formula (ci infra) que calcula le numero total de sedes in le avion quando le numero de filas es cambiate (ci supra). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un avion ha duo sedes in le cabina (pro le pilota e le copilota) e un numero de filas de sedes pro passageros. Cata fila contine quatro sedes. - - - 1st class rows (%1) - filas de prime classe (%1) - - - 2nd class rows: %1 - Filas de secunde classe: %1 - - - Seats: %1 - Sedes: %1 - - - Plane Seat Calculator - Calculator de sedias de avion - - - rows (%1) - filas (%1) - - - 1st class rows: %1 - Filas de prime classe: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un avion ha un numero de filas de sedes pro passageros. Cata fila contine quatro sedes. - - - 2nd class rows (%1) - filas de secunde classe (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_is.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_is.xlf deleted file mode 100644 index 3810f4b..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_is.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Raðir: %1 - - - seats = - sæti = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Flugvél er með tvö sæti í stjórnklefa (fyrir flugmanninn og aðstoðarflugmanninn) og einhvern fjölda sætaraða fyrir farþega á 1. og 2. farrými. Hver sætaröð á 1. farrými hefur fjögur sæti. Hver sætaröð á 2. farrými hefur fimm sæti. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Búðu til formúlu (hér fyrir neðan) sem reiknar heildarfjölda sæta í flugvélinni eftir því sem röðunum er breytt (hér fyrir ofan). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Flugvél er með tvö sæti í stjórnklefa (fyrir flugmanninn og aðstoðarflugmanninn) og einhvern fjölda sætaraða fyrir farþega. Hver sætaröð hefur fjögur sæti. - - - 1st class rows (%1) - raðir 1. farrými (%1) - - - 2nd class rows: %1 - Raðir 2. farrými: %1 - - - Seats: %1 - Sæti: %1 - - - Plane Seat Calculator - Flugsætareiknir - - - rows (%1) - raðir (%1) - - - 1st class rows: %1 - Raðir 1. farrými: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Flugvél er með einhvern fjölda sætaraða fyrir farþega. Í hverri röð eru fjögur sæti. - - - 2nd class rows (%1) - raðir 2. farrými (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_it.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_it.xlf deleted file mode 100644 index 27bad0d..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_it.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - File: %1 - - - seats = - sedili = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un aereo ha due posti nella cabina di pilotaggio (per il pilota e il co-pilota), e un numero di file in prima e seconda classe, con i posti a sedere dei passeggeri. Ogni fila della prima classe contiene quattro posti. Quelle invece della seconda classe, ne contengono cinque. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Costruisci una formula (sotto) che calcola il numero totale di posti a sedere su un aeroplano, così come cambiano le file di posti (sopra). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un aeroplano ha due posti a sedere nella cabina di pilotaggio (per il pilota e co-pilota), e un numero di file con i posti a sedere dei passeggeri. Ogni fila contiene quattro posti. - - - 1st class rows (%1) - file 1ª classe (%1) - - - 2nd class rows: %1 - File 2ª classe: %1 - - - Seats: %1 - Sedili: %1 - - - Plane Seat Calculator - Calcolo posti aereo - - - rows (%1) - file (%1) - - - 1st class rows: %1 - File 1ª classe: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un aeroplano ha un numero di file contenenti i posti a sedere dei passeggeri. Ogni fila, contiene quattro posti a sedere. - - - 2nd class rows (%1) - File 2ª classe (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ja.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ja.xlf deleted file mode 100644 index b04624a..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ja.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - 列の数: %1 - - - seats = - 座席の数 = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - 飛行機には、操縦室の 2 つの座席 (操縦士と副操縦士) と、ファーストクラスとセカンドクラスの乗客の座席の列があります。それぞれの列に、ファーストクラスでは 4 つの座席、セカンドクラスでは 5 つの座席があります。 - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - 飛行機の座席の数を計算する式を、上で列の数を変更しても正しくなるように、下に入力してください。 - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - 飛行機には、操縦室の 2 つの座席 (操縦士と副操縦士) と、乗客の座席の列があります。それぞれの列に 4 つの座席があります。 - - - 1st class rows (%1) - ファーストクラスの列数 (%1) - - - 2nd class rows: %1 - セカンドクラスの列数: %1 - - - Seats: %1 - 座席の数: %1 - - - Plane Seat Calculator - 飛行機座席計算機 - - - rows (%1) - 列の数 (%1) - - - 1st class rows: %1 - ファーストクラスの列数: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - 飛行機に乗客の座席の列があります。それぞれの列に 4 つの座席があります。 - - - 2nd class rows (%1) - セカンドクラスの列数 (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ko.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ko.xlf deleted file mode 100644 index 07e2328..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ko.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - 행 수: %1 - - - seats = - 좌석수 = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - 비행기는 비행 갑판(조종사와 부조종사용)에서 좌석 두 개가 있고, 1등석과 2등석 승객 좌석의 행 수가 있습니다. 각 1등석 행에는 시트 네 개가 포함되어 있습니다. 각 2등석 행에는 시트 다섯 개가 포함되어 있습니다. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - 행이 바뀐(위) 비행기에 좌석의 총 수를 계산하는 공식(아래)을 구축하세요. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - 비행기는 비행 갑판(조종사와 부조종사용)에서 좌석 두 개가 있고, 승객 좌석의 행 수가 있습니다. 각 행에는 시트 네 개가 포함되어 있습니다. - - - 1st class rows (%1) - 1등석 행 수 (%1) - - - 2nd class rows: %1 - 2등석 행 수: %1 - - - Seats: %1 - 좌석 수: %1 - - - Plane Seat Calculator - 비행기 좌석 계산기 - - - rows (%1) - 행 수 (%1) - - - 1st class rows: %1 - 1등석 행 수: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - 비행기는 승객 좌석의 행 수가 있습니다. 각 행에는 시트 네 개가 포함되어 있습니다. - - - 2nd class rows (%1) - 2등석 행 수 (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ms.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ms.xlf deleted file mode 100644 index 4c993a9..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ms.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Baris: %1 - - - seats = - tempat duduk = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Sebuah kapal terbnag mempunyai tempat duduk di kokpit (untuk juruterbang dan pembantunya) dan sebilangan baris tempat duduk penumpang kelas pertama dan kelas kedua. Setiap baris kelas pertama mengandungi empat tempat duduk. Setiap baris kelas pertama mengandungi lima tempat duduk. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Wujudkan formula (di bawah) yang mengira jumlah tempat duduk di dalam kapal terbang sedangkan baris-barisnya diubah (di atas). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Sebuah kapal terbnag mempunyai tempat duduk di kokpit (untuk juruterbang dan pembantunya) dan sebilangan baris tempat duduk penumpang. Setiap baris mengandungi empat tempat duduk. - - - 1st class rows (%1) - baris kelas pertama (%1) - - - 2nd class rows: %1 - Baris kelas ke-2: %1 - - - Seats: %1 - Tempat duduk: %1 - - - Plane Seat Calculator - Pengira Tempat Duduk Kapal Terbang - - - rows (%1) - baris (%1) - - - 1st class rows: %1 - Baris kelas pertama: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Sebuah kapal terbang mempunyai sebilangan baris tempat duduk penumpang. Setiap baris mengandungi empat tempat duduk. - - - 2nd class rows (%1) - baris kelas ke-2 (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_nb.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_nb.xlf deleted file mode 100644 index 99c9c6a..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_nb.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rader: %1 - - - seats = - seter = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Et fly har to seter i cockpit (for piloten og andrepiloten), og et antall rader med passasjerseter på første og andre klasse. Hver av radene på første klasse har fire seter. Hver av radene på andre klasse har fem seter. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Bygg en formel (under) som beregner det totale antall seter på flyet etter hvert som radene endres (over). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Et fly har to seter i cockpit (for piloten og andrepiloten), og et antall rader med passasjerseter. Hver rad inneholder fire seter. - - - 1st class rows (%1) - Rader i første klasse (%1) - - - 2nd class rows: %1 - Rader i andre klasse: %1 - - - Seats: %1 - Seter: %1 - - - Plane Seat Calculator - Flysetekalkulator - - - rows (%1) - rader (%1) - - - 1st class rows: %1 - Rader i første klasse: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Et fly har et antall rader med passasjerseter. Hver rad inneholder fire seter. - - - 2nd class rows (%1) - Rader i andre klasse (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_nl.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_nl.xlf deleted file mode 100644 index 6f36fa0..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_nl.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rijen: %1 - - - seats = - stoelen= - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Een vliegtuig heeft twee stoelen in de cockpit (voor de piloot en de copiloot) en een aantal rijen voor 1e klasse en 2e klasse passagiers. Iedere rij in de 1e klasse heeft vier stoelen. Iedere rij in de 2e klasse heeft vijf stoelen. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Maak hieronder een formule die het totale aantal stoelen in het vliegtuig berekent als het aantal rijen hierboven wordt aangepast. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Een vliegtuig heeft twee stoelen in de cockpit (voor de piloot en de copiloot) en een aantal rijen met stoelen voor passagiers. Iedere rij bevat vier stoelen. - - - 1st class rows (%1) - Rijen 1e klas (%1) - - - 2nd class rows: %1 - Rijen 2e klas: %1 - - - Seats: %1 - Zitplaatsen: %1 - - - Plane Seat Calculator - Vliegtuigstoelencalculator - - - rows (%1) - rijen (%1) - - - 1st class rows: %1 - Rijen 1e klas: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Een vliegtuig heeft een aantal rijen met stoelen. Iedere rij heeft vier stoelen. - - - 2nd class rows (%1) - Rijen 2e klas (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_pl.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_pl.xlf deleted file mode 100644 index 4c8b044..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_pl.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rzędów: %1 - - - seats = - siedzeń = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Samolot ma dwa miejsca w kabinie pilotów (dla pierwszego i drugiego pilota) oraz rzędy siedzeń dla pasażerów pierwszej i drugiej klasy. Każdy rząd pierwszej klasy składa się z czterech siedzeń. Każdy rząd drugiej klasy składa się z pięciu siedzeń. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Zbuduj wzór (poniżej), który pozwala obliczyć łączną liczbę siedzeń w samolocie w funkcji zmieniającej się liczby rzędów (powyżej). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Samolot ma dwa miejsca w kabinie pilotów (dla pierwszego i drugiego pilota) oraz rzędy siedzeń dla pasażerów. Każdy taki rząd składa się z czterech siedzeń. - - - 1st class rows (%1) - Rzędów w pierwszej klasie (%1) - - - 2nd class rows: %1 - Rzędów w drugiej klasie: %1 - - - Seats: %1 - Siedzeń: %1 - - - Plane Seat Calculator - Kalkulator miejsc w samolocie. - - - rows (%1) - rzędów (%1) - - - 1st class rows: %1 - Rzędów w pierwszej klasie: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Samolot ma kilka rzędów siedzeń pasażerów. Każdy rząd zawiera cztery miejsca. - - - 2nd class rows (%1) - Rzędów w drugiej klasie (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_pms.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_pms.xlf deleted file mode 100644 index 0fef912..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_pms.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Linie: %1 - - - seats = - sedij = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - N'avion a l'ha doi sedij ant la cabin-a ëd pilotage (për ël pilòta e ël cò-pilòta) e un chèich nùmer ëd file ëd sedij pr'ij passagé ëd prima e sconda classa. Minca fila ëd prima classa a conten quatr sedij. Minca fila ëd seconda classa a conten sinch sedij. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Fabriché na fórmola (sì-sota) ch'a fa 'l cont dël nùmer total ëd sedij ant l'avion cand che ël nùmer dle file a cangia (sì-dzora). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - N'avion a l'ha doi sedij ant la cabin-a ëd pilotage (për ël pilòta e ël cò-pilòta), e un chèich nùmer ëd file ëd sedij pr'ij passagé. Minca fila a conten quatr sedij. - - - 1st class rows (%1) - linie ëd prima classa (%1) - - - 2nd class rows: %1 - linie ëd seconda classa: %1 - - - Seats: %1 - Sedij: %1 - - - Plane Seat Calculator - Calcolator ëd sedij d'avion - - - rows (%1) - linie (%1) - - - 1st class rows: %1 - linie ëd prima classa: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - N'avion a l'ha un nùmer ëd file ëd sedij da passëgé. Minca fila a l'ha quatr sedij. - - - 2nd class rows (%1) - linie ëd seconda classa (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_pt-br.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_pt-br.xlf deleted file mode 100644 index 7bdd9cc..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_pt-br.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Filas: %1 - - - seats = - assentos = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Um avião tem dois assentos na cabine de comando (para o piloto e o copiloto) e um número de filas de assentos na primeira e na segunda classe. Cada fila da primeira classe contém quatro assentos. Cada fila da segunda classe contém cinco assentos. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Elabore uma fórmula (abaixo) que calcule o número total de assentos no avião a medida que as filas são alteradas (acima). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Um avião tem dois assentos na cabine de comando (para o piloto e o copiloto) e um número de filas de assentos para os passageiros. Cada fila contém quatro assentos. - - - 1st class rows (%1) - filas na primeira classe (%1) - - - 2nd class rows: %1 - filas na segunda classe: %1 - - - Seats: %1 - Assentos: %1 - - - Plane Seat Calculator - Calculadora de Assentos em Avião - - - rows (%1) - filas (%1) - - - 1st class rows: %1 - filas na primeira classe: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Um avião tem um número de filas de assentos para os passageiros. Cada fila contém quatro assentos. - - - 2nd class rows (%1) - filas na segunda classe (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ro.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ro.xlf deleted file mode 100644 index 614a3bd..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ro.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rânduri: %1 - - - seats = - scaune = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un avion are două scaune în carlingă (pentru pilot și copilot) și un număr de rânduri cu scaune de clasa I și clasa a II-a pentru pasageri. Fiecare rând de clasa I conține patru scaune. Fiecare rând de clasa a II-a conține cinci scaune. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Construiește o formulă (mai jos) care calculează numărul total de locuri dintr-un avion în timp ce rândurile se schimbă (mai sus). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un avion are două scaune în carlingă (pentru pilot și copilot) și un număr de rânduri cu scaune pentru pasageri. Fiecare rând conține patru scaune. - - - 1st class rows (%1) - rânduri de clasa I (%1) - - - 2nd class rows: %1 - rânduri de clasa a II-a: %1 - - - Seats: %1 - Scaune: %1 - - - Plane Seat Calculator - Calculator pentru locurile dintr-un avion - - - rows (%1) - rânduri (%1) - - - 1st class rows: %1 - rânduri de clasa I: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un avion are un număr de rânduri cu scaune pentru pasageri. Fiecare rând conține patru scaune. - - - 2nd class rows (%1) - rânduri de clasa a II-a (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ru.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ru.xlf deleted file mode 100644 index d25b254..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_ru.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Рядов: %1 - - - seats = - места = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - В самолёте 2 места для пилота и его помощника, несколько рядов с пассажирскими местами первого класса, а также несколько рядов с пассажирскими местами второго класса. В каждом ряду первого класса 4 места. В каждом ряду второго класса 5 мест. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Постройте формулу в области ниже, которая поможет рассчитать общее количество мест в самолёте (как на рисунке выше). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - В самолёте 2 места для пилота и его помощника, а также несколько рядов с пассажирскими местами. В каждом ряду 4 места. - - - 1st class rows (%1) - ряды 1-го класса (%1) - - - 2nd class rows: %1 - Рядов 2-го класса: %1 - - - Seats: %1 - Мест: %1 - - - Plane Seat Calculator - Калькулятор посадочных мест в самолёте - - - rows (%1) - ряды (%1) - - - 1st class rows: %1 - Рядов 1-го класса: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - В самолёте несколько рядов с пассажирскими местами. В каждом ряду 4 места. - - - 2nd class rows (%1) - ряды 2-го класса (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_sc.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_sc.xlf deleted file mode 100644 index 6328123..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_sc.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Fileras: %1 - - - seats = - cadironis = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Unu aparèchiu tenit duus cadironis in sa cabina de cumandu (po su pilota e su co-pilota), e unas cantu fileras de cadironis po passigeris de prima classi e de segunda classi. Dònnia filera de prima classi tenit cuatru cadironis. Dònnia filera de segunda classi tenit cincu cadironis. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Cuncorda una formula (innoi asuta) chi cumpudit su numeru totali de postus a setzi in s'aparechiu, a segunda de comenti mudant is fileras de postus (innoi in susu) - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Unu aparèchiu tenit duus cadironis in sa cabina de cumandu (po su pilota e su co-pilota), e unas cantu fileras de cadironis po passigeris. Dònnia filera tenit cuatru cadironis. - - - 1st class rows (%1) - fileras de primu classi (%1) - - - 2nd class rows: %1 - fileras de segunda classi: %1 - - - Seats: %1 - Cadironis: %1 - - - Plane Seat Calculator - Fai su contu de is cadironis de unu aparèchiu - - - rows (%1) - fileras (%1) - - - 1st class rows: %1 - fileras de primu classi: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Unu aparèchiu tenit unas cantu fileras de cadironis po passigeris. Dònnia filera tenit cuatru cadironis. - - - 2nd class rows (%1) - fileras de segunda classi (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_sv.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_sv.xlf deleted file mode 100644 index f3d836f..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_sv.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rader: %1 - - - seats = - säten = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Ett flygplan har två säten i cockpiten (ett för piloten och ett för andrepiloten) och ett antal rader med passagerarsäten i första och andra klass. Varje rad i första klass innehåller fyra säten. Varje rad i andra klass innehåller fem säten. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Bygg en formel (nedan) som beräknar det totala antalet säten på flygplanet när raderna ändras (ovan). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Ett flygplan har två säten i cockpiten (ett för piloten och ett för andrepiloten) och ett antal rader med passagerarsäten. Varje rad innehåller fyra säten. - - - 1st class rows (%1) - Rader i första klass (%1) - - - 2nd class rows: %1 - Rader i andra klass: %1 - - - Seats: %1 - Säten: %1 - - - Plane Seat Calculator - Plansäteskalkylator - - - rows (%1) - rader (%1) - - - 1st class rows: %1 - Rader i första klass: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Ett flygplan har ett antal rader med passagerarsäten. Varje rad innehåller fyra säten. - - - 2nd class rows (%1) - Rader i andra klass (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_th.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_th.xlf deleted file mode 100644 index 0967d4d..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_th.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - %1 แถว - - - seats = - จำนวนที่นั่ง = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - ภายในเครื่องบินจะมีที่นั่งนักบินอยู่ 2 ที่ (สำหรับนักบิน และผู้ช่วยนักบิน) และจะมีแถวที่นั่งสำหรับผู้โดยสาร "ชั้นเฟิร์สคลาส" และ "ชั้นธุรกิจ" อยู่จำนวนหนึ่ง โดยในชั้นเฟิร์สคลาสจะมีแถวละ 4 ที่นั่ง ส่วนในชั้นธุรกิจจะมีแถวละ 5 ที่นั่ง - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - สร้างสูตรคำนวณ (ด้านล่าง) เพื่อคำนวณหาจำนวนที่นั่งทั้งหมดบนเครื่องบิน ตามจำนวนแถวที่เปลี่ยนไป (ด้านบน) - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - ภายในเครื่องบินจะมีที่นั่งนักบินอยู่ 2 ที่ (สำหรับนักบิน และผู้ช่วยนักบิน) และมีแถวที่นั่งผู้โดยสารอยู่จำนวนหนึ่ง ในแต่ละแถวจะมี 4 ที่นั่ง - - - 1st class rows (%1) - จำนวนแถวชั้นเฟิร์สคลาส (%1) - - - 2nd class rows: %1 - ชั้นธุรกิจ %1 แถว - - - Seats: %1 - คำนวณได้ทั้งหมด %1 ที่นั่ง - - - Plane Seat Calculator - ระบบคำนวณที่นั่งบนเครื่องบิน - - - rows (%1) - จำนวนแถว (%1) - - - 1st class rows: %1 - ชั้นเฟิร์สคลาส %1 แถว - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - ภายในเครื่องบินประกอบไปด้วยแถวของที่นั่งผู้โดยสาร ในแต่ละแถวจะมี 4 ที่นั่ง - - - 2nd class rows (%1) - จำนวนแถวชั้นธุรกิจ (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_tr.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_tr.xlf deleted file mode 100644 index 678541a..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_tr.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Sıralar: %1 - - - seats = - koltuklar = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Bir uçağın uçuş güvertesinde iki koltuğu (pilot ve yardımcı pilot için), ve belirli sayıda birinci sınıf ve ikinci sınıf yolcu koltuğu sırası vardır. Her birinci sınıf sıra dört koltuk içerir. Her ikinci sınıf sıra beş koltuk içerir. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Sıralar(üstte) değiştikçe uçaktaki toplam koltuk sayısını hesaplayan bir formül(altta) oluşturun. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Bir uçağın uçuş güvertesinde iki koltuğu (pilot ve yardımcı pilot için), ve belirli sayıda koltuk sırası vardır. Her sıra dört koltuk içerir. - - - 1st class rows (%1) - Birinci sınıf sıralar (%1) - - - 2nd class rows: %1 - İkinci sınıf sıralar: %1 - - - Seats: %1 - Koltuklar: %1 - - - Plane Seat Calculator - Uçak Koltuğu Hesaplayıcı - - - rows (%1) - sıralar (%1) - - - 1st class rows: %1 - Birinci sınıf sıralar: (%1) - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Bir uçağın belirli sayıda koltuk sırası vardır. Her sıra dört koltuk içerir. - - - 2nd class rows (%1) - İkinci sınıf sıralar (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_uk.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_uk.xlf deleted file mode 100644 index d5e7682..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_uk.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Рядки: %1 - - - seats = - місць= - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Літак має два місця в кабіні екіпажу (пілот і другий пілот), і кілька рядів 1-го класу 2-го класу пасажирських місць. Кожний ряд 1-го класу містить чотири місця. Кожен ряд 2-го класу містить п'ять місць. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Побудувати формулу (нижче), яка обчислює кількість місць на літаку при зміні рядків (див. вище). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Літак має два місця в кабіні екіпажу (пілот і другий пілот), і кілька рядів пасажирських сидінь. Кожен рядок містить чотири місця. - - - 1st class rows (%1) - рядів 1-го класу (%1) - - - 2nd class rows: %1 - рядів 2-го класу: %1 - - - Seats: %1 - Місць: %1 - - - Plane Seat Calculator - Калькулятор місць у літаку - - - rows (%1) - рядки (%1) - - - 1st class rows: %1 - рядів 1-го класу: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Літак має кілька рядів пасажирських сидінь. Кожен ряд містить чотири місця. - - - 2nd class rows (%1) - рядів 2-го класу (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_vi.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_vi.xlf deleted file mode 100644 index 1f4ef6f..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_vi.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Số hàng ghế: %1 - - - seats = - Tính số chỗ ngồi = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Một chiếc máy bay này có hai chỗ ngồi ở sàn (cho phi công trưởng và phi công phó), và một số hàng ghế hạng 1 và hạng 2. Mỗi hàng hạng 1 có bốn chỗ ngồi. Mỗi hàng hạng 2 có năm chỗ ngồi. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Dưới đây hãy tạo công thức tính số chỗ ngồi trên máy bay để nó thay đổi tùy theo số lượng hàng ghế (hình trên). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Một máy bay có hai ghế trong buồng lái (dành cho phi công trưởng và phi công phụ), và một loạt hàng ghế cho hành khách. Mỗi hàng có bốn ghế (bốn chỗ ngồi). - - - 1st class rows (%1) - số hàng hạng nhất (%1) - - - 2nd class rows: %1 - Hàng hạng hai: %1 - - - Seats: %1 - Số chỗ ngồi: %1 - - - Plane Seat Calculator - Máy bay ghế máy tính - - - rows (%1) - đếm số hàng ghế (%1) - - - 1st class rows: %1 - Hàng hạng nhất: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Máy bay có một số hàng ghế hành khách. Mỗi hàng có bốn chỗ ngồi. - - - 2nd class rows (%1) - số hàng hạng hai (%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_zh-hans.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_zh-hans.xlf deleted file mode 100644 index 2cbb7e8..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_zh-hans.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - 行:%1 - - - seats = - 座位= - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - 一架飞机除了有两个座位供正副驾驶员,还有一定量行数的头等及经济乘客座位。头等每行共四座,经济每行共五座。 - - - ? - - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - 于下方写出一条公式以计算飞机上的座位总数。 - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - 一架飞机除了有两个座位供正副驾驶员,还有一定量行数的乘客座位。每行共四座。 - - - 1st class rows (%1) - 头等行(%1) - - - 2nd class rows: %1 - 经济等行:%1 - - - Seats: %1 - 座位:%1 - - - Plane Seat Calculator - 飞机座位计算器 - - - rows (%1) - 行 (%1) - - - 1st class rows: %1 - 头等行:%1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - 一架飞机有一定量行数的乘客座位,每行共四座。 - - - 2nd class rows (%1) - 经济等行(%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_zh-hant.xlf b/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_zh-hant.xlf deleted file mode 100644 index 2dadf6d..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/plane/xlf/translated_msgs_zh-hant.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - 排:%1 - - - seats = - 座位= - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - 一架飛機除了有兩個座位供正副機師,還有一定量行數的頭等及經濟乘客座位。頭等艙每排都包含四個席位,經濟艙每排都包含五個席位。。 - - - ? - - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - 於下方寫出一條公式以計算飛機上的座位總數。 - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - 一架飛機除了有兩個座位供正副機師,還有一定量行數的乘客座位。每排都包含四個席位。 - - - 1st class rows (%1) - 頭等艙(%1) - - - 2nd class rows: %1 - 經濟艙:%1 排 - - - Seats: %1 - 座位:%1 - - - Plane Seat Calculator - 飛機座位計算器 - - - rows (%1) - 排(%1) - - - 1st class rows: %1 - 頭等艙:%1 排 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - 一架飛機有一定量行數的乘客座位,每排都包含四個席位。 - - - 2nd class rows (%1) - 經濟艙(%1) - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/prettify.css b/src/opsoro/apps/visual_programming/static/blockly/demos/prettify.css deleted file mode 100644 index d44b3a2..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/prettify.js b/src/opsoro/apps/visual_programming/static/blockly/demos/prettify.js deleted file mode 100644 index 7b99049..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/prettify.js +++ /dev/null @@ -1,30 +0,0 @@ -!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; -(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),e=[],a= -b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;ah[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.length;c=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, -q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d.push(["com", -/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+"]|\\x5C"+ -s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/, -q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b(a,c){var d= -c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], -"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"], -O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], -Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/, -V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-", -/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/], -["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:R}), -["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);p(v({keywords:Q, -hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]); -p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="
      "+a+"
      ";b=b.firstChild;g&&J(b,g,!0);K({h:d,j:g,c:b,i:1}); -return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i - - - - Blockly Demo: Realtime Collaboration - - - - - - - -

      Blockly > - Demos > Realtime Collaboration

      - -

      This is a simple demo of realtime collaboration in Blockly.

      - -

      → More info on - - realtime collaboration in Blockly...

      - -
      -
      -
      - - - -

      Test realtime collaboration by opening - - this link in a separate browser window or tab and they will be - synchronized. You can even share the link with a friend!.

      - -
      -
      - - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/resizable/icon.png b/src/opsoro/apps/visual_programming/static/blockly/demos/resizable/icon.png deleted file mode 100644 index 4355275..0000000 Binary files a/src/opsoro/apps/visual_programming/static/blockly/demos/resizable/icon.png and /dev/null differ diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/resizable/index.html b/src/opsoro/apps/visual_programming/static/blockly/demos/resizable/index.html deleted file mode 100644 index f326e1b..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/resizable/index.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Blockly Demo: Resizable Blockly (Part 1) - - - - - - - - - - -
      -

      Blockly > - Demos > Resizable Blockly (Part 1)

      - -

      The first step in creating a resizable Blockly workspace is to use - CSS or tables to create an area for it. - Next, inject Blockly over that area.

      - -

      → More info on injecting resizable Blockly...

      -
      - Blockly will be positioned here. -
      - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/resizable/overlay.html b/src/opsoro/apps/visual_programming/static/blockly/demos/resizable/overlay.html deleted file mode 100644 index 68487a0..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/resizable/overlay.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - Blockly Demo: Resizable Blockly (Part 2) - - - - - - - - - - - - - -
      -

      Blockly > - Demos > Resizable Blockly (Part 2)

      - -

      - Once an area is defined, Blockly can be - injected and positioned over the area. - A resize handler keeps it in position as the page changes. -

      - -

      → More info on injecting resizable Blockly...

      -
      -
      - -
      - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/rtl/icon.png b/src/opsoro/apps/visual_programming/static/blockly/demos/rtl/icon.png deleted file mode 100644 index e177e32..0000000 Binary files a/src/opsoro/apps/visual_programming/static/blockly/demos/rtl/icon.png and /dev/null differ diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/rtl/index.html b/src/opsoro/apps/visual_programming/static/blockly/demos/rtl/index.html deleted file mode 100644 index a880261..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/rtl/index.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - Blockly Demo: RTL - - - - - - - -

      Blockly > - Demos > Right-to-Left

      - -
      - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/storage/icon.png b/src/opsoro/apps/visual_programming/static/blockly/demos/storage/icon.png deleted file mode 100644 index b8c50b2..0000000 Binary files a/src/opsoro/apps/visual_programming/static/blockly/demos/storage/icon.png and /dev/null differ diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/storage/index.html b/src/opsoro/apps/visual_programming/static/blockly/demos/storage/index.html deleted file mode 100644 index f21a48b..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/storage/index.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - Blockly Demo: Cloud Storage - - - - - - - -

      Blockly > - Demos > Cloud Storage

      - -

      This is a simple demo of cloud storage using App Engine.

      - - - -

      → More info on Cloud Storage...

      - -

      - -

      - -
      - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/toolbox/icon.png b/src/opsoro/apps/visual_programming/static/blockly/demos/toolbox/icon.png deleted file mode 100644 index 336f390..0000000 Binary files a/src/opsoro/apps/visual_programming/static/blockly/demos/toolbox/icon.png and /dev/null differ diff --git a/src/opsoro/apps/visual_programming/static/blockly/demos/toolbox/index.html b/src/opsoro/apps/visual_programming/static/blockly/demos/toolbox/index.html deleted file mode 100644 index ef737d0..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/demos/toolbox/index.html +++ /dev/null @@ -1,350 +0,0 @@ - - - - - Blockly Demo: Toolbox - - - - - - -

      Blockly > - Demos > Toolbox

      - -

      This is a demo of a complex category structure for the toolbox.

      - -

      → More info on the Toolbox...

      - -
      - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/dart.js b/src/opsoro/apps/visual_programming/static/blockly/generators/dart.js deleted file mode 100644 index f4faec2..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/dart.js +++ /dev/null @@ -1,193 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Helper functions for generating Dart for blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Dart'); - -goog.require('Blockly.Generator'); - - -/** - * Dart code generator. - * @type {!Blockly.Generator} - */ -Blockly.Dart = new Blockly.Generator('Dart'); - -/** - * List of illegal variable names. - * This is not intended to be a security feature. Blockly is 100% client-side, - * so bypassing this list is trivial. This is intended to prevent users from - * accidentally clobbering a built-in object or function. - * @private - */ -Blockly.Dart.addReservedWords( - // https://www.dartlang.org/docs/spec/latest/dart-language-specification.pdf - // Section 16.1.1 - 'assert,break,case,catch,class,const,continue,default,do,else,enum,extends,false,final,finally,for,if,in,is,new,null,rethrow,return,super,switch,this,throw,true,try,var,void,while,with,' + - // https://api.dartlang.org/dart_core.html - 'print,identityHashCode,identical,BidirectionalIterator,Comparable,double,Function,int,Invocation,Iterable,Iterator,List,Map,Match,num,Pattern,RegExp,Set,StackTrace,String,StringSink,Type,bool,DateTime,Deprecated,Duration,Expando,Null,Object,RuneIterator,Runes,Stopwatch,StringBuffer,Symbol,Uri,Comparator,AbstractClassInstantiationError,ArgumentError,AssertionError,CastError,ConcurrentModificationError,CyclicInitializationError,Error,Exception,FallThroughError,FormatException,IntegerDivisionByZeroException,NoSuchMethodError,NullThrownError,OutOfMemoryError,RangeError,StackOverflowError,StateError,TypeError,UnimplementedError,UnsupportedError'); - -/** - * Order of operation ENUMs. - * https://www.dartlang.org/docs/dart-up-and-running/ch02.html#operator_table - */ -Blockly.Dart.ORDER_ATOMIC = 0; // 0 "" ... -Blockly.Dart.ORDER_UNARY_POSTFIX = 1; // expr++ expr-- () [] . -Blockly.Dart.ORDER_UNARY_PREFIX = 2; // -expr !expr ~expr ++expr --expr -Blockly.Dart.ORDER_MULTIPLICATIVE = 3; // * / % ~/ -Blockly.Dart.ORDER_ADDITIVE = 4; // + - -Blockly.Dart.ORDER_SHIFT = 5; // << >> -Blockly.Dart.ORDER_BITWISE_AND = 6; // & -Blockly.Dart.ORDER_BITWISE_XOR = 7; // ^ -Blockly.Dart.ORDER_BITWISE_OR = 8; // | -Blockly.Dart.ORDER_RELATIONAL = 9; // >= > <= < as is is! -Blockly.Dart.ORDER_EQUALITY = 10; // == != -Blockly.Dart.ORDER_LOGICAL_AND = 11; // && -Blockly.Dart.ORDER_LOGICAL_OR = 12; // || -Blockly.Dart.ORDER_CONDITIONAL = 13; // expr ? expr : expr -Blockly.Dart.ORDER_CASCADE = 14; // .. -Blockly.Dart.ORDER_ASSIGNMENT = 15; // = *= /= ~/= %= += -= <<= >>= &= ^= |= -Blockly.Dart.ORDER_NONE = 99; // (...) - -/** - * Initialise the database of variable names. - * @param {!Blockly.Workspace} workspace Workspace to generate code from. - */ -Blockly.Dart.init = function(workspace) { - // Create a dictionary of definitions to be printed before the code. - Blockly.Dart.definitions_ = Object.create(null); - // Create a dictionary mapping desired function names in definitions_ - // to actual function names (to avoid collisions with user functions). - Blockly.Dart.functionNames_ = Object.create(null); - - if (!Blockly.Dart.variableDB_) { - Blockly.Dart.variableDB_ = - new Blockly.Names(Blockly.Dart.RESERVED_WORDS_); - } else { - Blockly.Dart.variableDB_.reset(); - } - - var defvars = []; - var variables = Blockly.Variables.allVariables(workspace); - for (var i = 0; i < variables.length; i++) { - defvars[i] = 'var ' + - Blockly.Dart.variableDB_.getName(variables[i], - Blockly.Variables.NAME_TYPE) + ';'; - } - Blockly.Dart.definitions_['variables'] = defvars.join('\n'); -}; - -/** - * Prepend the generated code with the variable definitions. - * @param {string} code Generated code. - * @return {string} Completed code. - */ -Blockly.Dart.finish = function(code) { - // Indent every line. - if (code) { - code = Blockly.Dart.prefixLines(code, Blockly.Dart.INDENT); - } - code = 'main() {\n' + code + '}'; - - // Convert the definitions dictionary into a list. - var imports = []; - var definitions = []; - for (var name in Blockly.Dart.definitions_) { - var def = Blockly.Dart.definitions_[name]; - if (def.match(/^import\s/)) { - imports.push(def); - } else { - definitions.push(def); - } - } - // Clean up temporary data. - delete Blockly.Dart.definitions_; - delete Blockly.Dart.functionNames_; - Blockly.Dart.variableDB_.reset(); - var allDefs = imports.join('\n') + '\n\n' + definitions.join('\n\n'); - return allDefs.replace(/\n\n+/g, '\n\n').replace(/\n*$/, '\n\n\n') + code; -}; - -/** - * Naked values are top-level blocks with outputs that aren't plugged into - * anything. A trailing semicolon is needed to make this legal. - * @param {string} line Line of generated code. - * @return {string} Legal line of code. - */ -Blockly.Dart.scrubNakedValue = function(line) { - return line + ';\n'; -}; - -/** - * Encode a string as a properly escaped Dart string, complete with quotes. - * @param {string} string Text to encode. - * @return {string} Dart string. - * @private - */ -Blockly.Dart.quote_ = function(string) { - // TODO: This is a quick hack. Replace with goog.string.quote - string = string.replace(/\\/g, '\\\\') - .replace(/\n/g, '\\\n') - .replace(/\$/g, '\\$') - .replace(/'/g, '\\\''); - return '\'' + string + '\''; -}; - -/** - * Common tasks for generating Dart from blocks. - * Handles comments for the specified block and any connected value blocks. - * Calls any statements following this block. - * @param {!Blockly.Block} block The current block. - * @param {string} code The Dart code created for this block. - * @return {string} Dart code with comments and subsequent blocks added. - * @private - */ -Blockly.Dart.scrub_ = function(block, code) { - var commentCode = ''; - // Only collect comments for blocks that aren't inline. - if (!block.outputConnection || !block.outputConnection.targetConnection) { - // Collect comment for this block. - var comment = block.getCommentText(); - if (comment) { - commentCode += Blockly.Dart.prefixLines(comment, '// ') + '\n'; - } - // Collect comments for all value arguments. - // Don't collect comments for nested statements. - for (var x = 0; x < block.inputList.length; x++) { - if (block.inputList[x].type == Blockly.INPUT_VALUE) { - var childBlock = block.inputList[x].connection.targetBlock(); - if (childBlock) { - var comment = Blockly.Dart.allNestedComments(childBlock); - if (comment) { - commentCode += Blockly.Dart.prefixLines(comment, '// '); - } - } - } - } - } - var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); - var nextCode = Blockly.Dart.blockToCode(nextBlock); - return commentCode + code + nextCode; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/dart/colour.js b/src/opsoro/apps/visual_programming/static/blockly/generators/dart/colour.js deleted file mode 100644 index d734155..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/dart/colour.js +++ /dev/null @@ -1,128 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Dart for colour blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Dart.colour'); - -goog.require('Blockly.Dart'); - - -Blockly.Dart.addReservedWords('Math'); - -Blockly.Dart['colour_picker'] = function(block) { - // Colour picker. - var code = '\'' + block.getFieldValue('COLOUR') + '\''; - return [code, Blockly.Dart.ORDER_ATOMIC]; -}; - -Blockly.Dart['colour_random'] = function(block) { - // Generate a random colour. - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'colour_random', - [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '() {', - ' String hex = \'0123456789abcdef\';', - ' var rnd = new Math.Random();', - ' return \'#${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}\'', - ' \'${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}\'', - ' \'${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}\';', - '}']); - var code = functionName + '()'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['colour_rgb'] = function(block) { - // Compose a colour from RGB components expressed as percentages. - var red = Blockly.Dart.valueToCode(block, 'RED', - Blockly.Dart.ORDER_NONE) || 0; - var green = Blockly.Dart.valueToCode(block, 'GREEN', - Blockly.Dart.ORDER_NONE) || 0; - var blue = Blockly.Dart.valueToCode(block, 'BLUE', - Blockly.Dart.ORDER_NONE) || 0; - - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'colour_rgb', - [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(num r, num g, num b) {', - ' num rn = (Math.max(Math.min(r, 1), 0) * 255).round();', - ' String rs = rn.toInt().toRadixString(16);', - ' rs = \'0$rs\';', - ' rs = rs.substring(rs.length - 2);', - ' num gn = (Math.max(Math.min(g, 1), 0) * 255).round();', - ' String gs = gn.toInt().toRadixString(16);', - ' gs = \'0$gs\';', - ' gs = gs.substring(gs.length - 2);', - ' num bn = (Math.max(Math.min(b, 1), 0) * 255).round();', - ' String bs = bn.toInt().toRadixString(16);', - ' bs = \'0$bs\';', - ' bs = bs.substring(bs.length - 2);', - ' return \'#$rs$gs$bs\';', - '}']); - var code = functionName + '(' + red + ', ' + green + ', ' + blue + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['colour_blend'] = function(block) { - // Blend two colours together. - var c1 = Blockly.Dart.valueToCode(block, 'COLOUR1', - Blockly.Dart.ORDER_NONE) || '\'#000000\''; - var c2 = Blockly.Dart.valueToCode(block, 'COLOUR2', - Blockly.Dart.ORDER_NONE) || '\'#000000\''; - var ratio = Blockly.Dart.valueToCode(block, 'RATIO', - Blockly.Dart.ORDER_NONE) || 0.5; - - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'colour_blend', - [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(String c1, String c2, num ratio) {', - ' ratio = Math.max(Math.min(ratio, 1), 0);', - ' int r1 = int.parse(\'0x${c1.substring(1, 3)}\');', - ' int g1 = int.parse(\'0x${c1.substring(3, 5)}\');', - ' int b1 = int.parse(\'0x${c1.substring(5, 7)}\');', - ' int r2 = int.parse(\'0x${c2.substring(1, 3)}\');', - ' int g2 = int.parse(\'0x${c2.substring(3, 5)}\');', - ' int b2 = int.parse(\'0x${c2.substring(5, 7)}\');', - ' num rn = (r1 * (1 - ratio) + r2 * ratio).round();', - ' String rs = rn.toInt().toRadixString(16);', - ' num gn = (g1 * (1 - ratio) + g2 * ratio).round();', - ' String gs = gn.toInt().toRadixString(16);', - ' num bn = (b1 * (1 - ratio) + b2 * ratio).round();', - ' String bs = bn.toInt().toRadixString(16);', - ' rs = \'0$rs\';', - ' rs = rs.substring(rs.length - 2);', - ' gs = \'0$gs\';', - ' gs = gs.substring(gs.length - 2);', - ' bs = \'0$bs\';', - ' bs = bs.substring(bs.length - 2);', - ' return \'#$rs$gs$bs\';', - '}']); - var code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/dart/lists.js b/src/opsoro/apps/visual_programming/static/blockly/generators/dart/lists.js deleted file mode 100644 index 57ac4dd..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/dart/lists.js +++ /dev/null @@ -1,335 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Dart for list blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Dart.lists'); - -goog.require('Blockly.Dart'); - - -Blockly.Dart.addReservedWords('Math'); - -Blockly.Dart['lists_create_empty'] = function(block) { - // Create an empty list. - return ['[]', Blockly.Dart.ORDER_ATOMIC]; -}; - -Blockly.Dart['lists_create_with'] = function(block) { - // Create a list with any number of elements of any type. - var code = new Array(block.itemCount_); - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.Dart.valueToCode(block, 'ADD' + n, - Blockly.Dart.ORDER_NONE) || 'null'; - } - code = '[' + code.join(', ') + ']'; - return [code, Blockly.Dart.ORDER_ATOMIC]; -}; - -Blockly.Dart['lists_repeat'] = function(block) { - // Create a list with one element repeated. - var argument0 = Blockly.Dart.valueToCode(block, 'ITEM', - Blockly.Dart.ORDER_NONE) || 'null'; - var argument1 = Blockly.Dart.valueToCode(block, 'NUM', - Blockly.Dart.ORDER_NONE) || '0'; - var code = 'new List.filled(' + argument1 + ', ' + argument0 + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['lists_length'] = function(block) { - // String or array length. - var argument0 = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; - return [argument0 + '.length', Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['lists_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; - return [argument0 + '.isEmpty', Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['lists_indexOf'] = function(block) { - // Find an item in the list. - var operator = block.getFieldValue('END') == 'FIRST' ? - 'indexOf' : 'lastIndexOf'; - var argument0 = Blockly.Dart.valueToCode(block, 'FIND', - Blockly.Dart.ORDER_NONE) || '\'\''; - var argument1 = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; - var code = argument1 + '.' + operator + '(' + argument0 + ') + 1'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['lists_getIndex'] = function(block) { - // Get element at index. - // Note: Until January 2013 this block did not have MODE or WHERE inputs. - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.Dart.valueToCode(block, 'AT', - Blockly.Dart.ORDER_UNARY_PREFIX) || '1'; - var list = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; - - if (where == 'FIRST') { - if (mode == 'GET') { - var code = list + '.first'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'GET_REMOVE') { - var code = list + '.removeAt(0)'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'REMOVE') { - return list + '.removeAt(0);\n'; - } - } else if (where == 'LAST') { - if (mode == 'GET') { - var code = list + '.last'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'GET_REMOVE') { - var code = list + '.removeLast()'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'REMOVE') { - return list + '.removeLast();\n'; - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseInt(at, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - if (mode == 'GET') { - var code = list + '[' + at + ']'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'GET_REMOVE') { - var code = list + '.removeAt(' + at + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'REMOVE') { - return list + '.removeAt(' + at + ');\n'; - } - } else if (where == 'FROM_END') { - if (mode == 'GET') { - var functionName = Blockly.Dart.provideFunction_( - 'lists_get_from_end', - [ 'dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList, num x) {', - ' x = myList.length - x;', - ' return myList.removeAt(x);', - '}']); - code = functionName + '(' + list + ', ' + at + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') { - var functionName = Blockly.Dart.provideFunction_( - 'lists_remove_from_end', - [ 'dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList, num x) {', - ' x = myList.length - x;', - ' return myList.removeAt(x);', - '}']); - code = functionName + '(' + list + ', ' + at + ')'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'REMOVE') { - return code + ';\n'; - } - } - } else if (where == 'RANDOM') { - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'lists_get_random_item', - [ 'dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList, bool remove) {', - ' int x = new Math.Random().nextInt(myList.length);', - ' if (remove) {', - ' return myList.removeAt(x);', - ' } else {', - ' return myList[x];', - ' }', - '}']); - code = functionName + '(' + list + ', ' + (mode != 'GET') + ')'; - if (mode == 'GET' || mode == 'GET_REMOVE') { - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'REMOVE') { - return code + ';\n'; - } - } - throw 'Unhandled combination (lists_getIndex).'; -}; - -Blockly.Dart['lists_setIndex'] = function(block) { - // Set element at index. - // Note: Until February 2013 this block did not have MODE or WHERE inputs. - var list = Blockly.Dart.valueToCode(block, 'LIST', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.Dart.valueToCode(block, 'AT', - Blockly.Dart.ORDER_ADDITIVE) || '1'; - var value = Blockly.Dart.valueToCode(block, 'TO', - Blockly.Dart.ORDER_ASSIGNMENT) || 'null'; - // Cache non-trivial values to variables to prevent repeated look-ups. - // Closure, which accesses and modifies 'list'. - function cacheList() { - if (list.match(/^\w+$/)) { - return ''; - } - var listVar = Blockly.Dart.variableDB_.getDistinctName( - 'tmp_list', Blockly.Variables.NAME_TYPE); - var code = 'List ' + listVar + ' = ' + list + ';\n'; - list = listVar; - return code; - } - if (where == 'FIRST') { - if (mode == 'SET') { - return list + '[0] = ' + value + ';\n'; - } else if (mode == 'INSERT') { - return list + '.insert(0, ' + value + ');\n'; - } - } else if (where == 'LAST') { - if (mode == 'SET') { - var code = cacheList(); - code += list + '[' + list + '.length - 1] = ' + value + ';\n'; - return code; - } else if (mode == 'INSERT') { - return list + '.add(' + value + ');\n'; - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseInt(at, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - if (mode == 'SET') { - return list + '[' + at + '] = ' + value + ';\n'; - } else if (mode == 'INSERT') { - return list + '.insert(' + at + ', ' + value + ');\n'; - } - } else if (where == 'FROM_END') { - var code = cacheList(); - if (mode == 'SET') { - code += list + '[' + list + '.length - ' + at + '] = ' + value + ';\n'; - return code; - } else if (mode == 'INSERT') { - code += list + '.insert(' + list + '.length - ' + at + ', ' + - value + ');\n'; - return code; - } - } else if (where == 'RANDOM') { - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var code = cacheList(); - var xVar = Blockly.Dart.variableDB_.getDistinctName( - 'tmp_x', Blockly.Variables.NAME_TYPE); - code += 'int ' + xVar + - ' = new Math.Random().nextInt(' + list + '.length);'; - if (mode == 'SET') { - code += list + '[' + xVar + '] = ' + value + ';\n'; - return code; - } else if (mode == 'INSERT') { - code += list + '.insert(' + xVar + ', ' + value + ');\n'; - return code; - } - } - throw 'Unhandled combination (lists_setIndex).'; -}; - -Blockly.Dart['lists_getSublist'] = function(block) { - // Get sublist. - var list = Blockly.Dart.valueToCode(block, 'LIST', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.Dart.valueToCode(block, 'AT1', - Blockly.Dart.ORDER_NONE) || '1'; - var at2 = Blockly.Dart.valueToCode(block, 'AT2', - Blockly.Dart.ORDER_NONE) || '1'; - if ((where1 == 'FIRST' || where1 == 'FROM_START' && Blockly.isNumber(at1)) && - (where2 == 'LAST' || where2 == 'FROM_START' && Blockly.isNumber(at2))) { - // Simple case that can be done inline. - at1 = where1 == 'FIRST' ? 0 : parseInt(at1, 10) - 1; - if (where2 == 'LAST') { - code = list + '.sublist(' + at1 + ')'; - } else { - at2 = parseInt(at2, 10); - code = list + '.sublist(' + at1 + ', ' + at2 + ')'; - } - } else { - var functionName = Blockly.Dart.provideFunction_( - 'lists_get_sublist', - [ 'List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(list, where1, at1, where2, at2) {', - ' int getAt(where, at) {', - ' if (where == \'FROM_START\') {', - ' at--;', - ' } else if (where == \'FROM_END\') {', - ' at = list.length - at;', - ' } else if (where == \'FIRST\') {', - ' at = 0;', - ' } else if (where == \'LAST\') {', - ' at = list.length - 1;', - ' } else {', - ' throw \'Unhandled option (lists_getSublist).\';', - ' }', - ' return at;', - ' }', - ' at1 = getAt(where1, at1);', - ' at2 = getAt(where2, at2) + 1;', - ' return list.sublist(at1, at2);', - '}']); - var code = functionName + '(' + list + ', \'' + - where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; - } - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['lists_split'] = function(block) { - // Block for splitting text into a list, or joining a list into text. - var value_input = Blockly.Dart.valueToCode(block, 'INPUT', - Blockly.Dart.ORDER_UNARY_POSTFIX); - var value_delim = Blockly.Dart.valueToCode(block, 'DELIM', - Blockly.Dart.ORDER_NONE) || '\'\''; - var mode = block.getFieldValue('MODE'); - if (mode == 'SPLIT') { - if (!value_input) { - value_input = '\'\''; - } - var functionName = 'split'; - } else if (mode == 'JOIN') { - if (!value_input) { - value_input = '[]'; - } - var functionName = 'join'; - } else { - throw 'Unknown mode: ' + mode; - } - var code = value_input + '.' + functionName + '(' + value_delim + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/dart/logic.js b/src/opsoro/apps/visual_programming/static/blockly/generators/dart/logic.js deleted file mode 100644 index 13f4e0a..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/dart/logic.js +++ /dev/null @@ -1,125 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Dart for logic blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Dart.logic'); - -goog.require('Blockly.Dart'); - - -Blockly.Dart['controls_if'] = function(block) { - // If/elseif/else condition. - var n = 0; - var argument = Blockly.Dart.valueToCode(block, 'IF' + n, - Blockly.Dart.ORDER_NONE) || 'false'; - var branch = Blockly.Dart.statementToCode(block, 'DO' + n); - var code = 'if (' + argument + ') {\n' + branch + '}'; - for (n = 1; n <= block.elseifCount_; n++) { - argument = Blockly.Dart.valueToCode(block, 'IF' + n, - Blockly.Dart.ORDER_NONE) || 'false'; - branch = Blockly.Dart.statementToCode(block, 'DO' + n); - code += ' else if (' + argument + ') {\n' + branch + '}'; - } - if (block.elseCount_) { - branch = Blockly.Dart.statementToCode(block, 'ELSE'); - code += ' else {\n' + branch + '}'; - } - return code + '\n'; -}; - -Blockly.Dart['logic_compare'] = function(block) { - // Comparison operator. - var OPERATORS = { - 'EQ': '==', - 'NEQ': '!=', - 'LT': '<', - 'LTE': '<=', - 'GT': '>', - 'GTE': '>=' - }; - var operator = OPERATORS[block.getFieldValue('OP')]; - var order = (operator == '==' || operator == '!=') ? - Blockly.Dart.ORDER_EQUALITY : Blockly.Dart.ORDER_RELATIONAL; - var argument0 = Blockly.Dart.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.Dart.valueToCode(block, 'B', order) || '0'; - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.Dart['logic_operation'] = function(block) { - // Operations 'and', 'or'. - var operator = (block.getFieldValue('OP') == 'AND') ? '&&' : '||'; - var order = (operator == '&&') ? Blockly.Dart.ORDER_LOGICAL_AND : - Blockly.Dart.ORDER_LOGICAL_OR; - var argument0 = Blockly.Dart.valueToCode(block, 'A', order); - var argument1 = Blockly.Dart.valueToCode(block, 'B', order); - if (!argument0 && !argument1) { - // If there are no arguments, then the return value is false. - argument0 = 'false'; - argument1 = 'false'; - } else { - // Single missing arguments have no effect on the return value. - var defaultArgument = (operator == '&&') ? 'true' : 'false'; - if (!argument0) { - argument0 = defaultArgument; - } - if (!argument1) { - argument1 = defaultArgument; - } - } - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.Dart['logic_negate'] = function(block) { - // Negation. - var order = Blockly.Dart.ORDER_UNARY_PREFIX; - var argument0 = Blockly.Dart.valueToCode(block, 'BOOL', order) || 'true'; - var code = '!' + argument0; - return [code, order]; -}; - -Blockly.Dart['logic_boolean'] = function(block) { - // Boolean values true and false. - var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'true' : 'false'; - return [code, Blockly.Dart.ORDER_ATOMIC]; -}; - -Blockly.Dart['logic_null'] = function(block) { - // Null data type. - return ['null', Blockly.Dart.ORDER_ATOMIC]; -}; - -Blockly.Dart['logic_ternary'] = function(block) { - // Ternary operator. - var value_if = Blockly.Dart.valueToCode(block, 'IF', - Blockly.Dart.ORDER_CONDITIONAL) || 'false'; - var value_then = Blockly.Dart.valueToCode(block, 'THEN', - Blockly.Dart.ORDER_CONDITIONAL) || 'null'; - var value_else = Blockly.Dart.valueToCode(block, 'ELSE', - Blockly.Dart.ORDER_CONDITIONAL) || 'null'; - var code = value_if + ' ? ' + value_then + ' : ' + value_else; - return [code, Blockly.Dart.ORDER_CONDITIONAL]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/dart/loops.js b/src/opsoro/apps/visual_programming/static/blockly/generators/dart/loops.js deleted file mode 100644 index d95c955..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/dart/loops.js +++ /dev/null @@ -1,163 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Dart for loop blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Dart.loops'); - -goog.require('Blockly.Dart'); - - -Blockly.Dart['controls_repeat_ext'] = function(block) { - // Repeat n times. - if (block.getField('TIMES')) { - // Internal number. - var repeats = String(Number(block.getFieldValue('TIMES'))); - } else { - // External number. - var repeats = Blockly.Dart.valueToCode(block, 'TIMES', - Blockly.Dart.ORDER_ASSIGNMENT) || '0'; - } - var branch = Blockly.Dart.statementToCode(block, 'DO'); - branch = Blockly.Dart.addLoopTrap(branch, block.id); - var code = ''; - var loopVar = Blockly.Dart.variableDB_.getDistinctName( - 'count', Blockly.Variables.NAME_TYPE); - var endVar = repeats; - if (!repeats.match(/^\w+$/) && !Blockly.isNumber(repeats)) { - var endVar = Blockly.Dart.variableDB_.getDistinctName( - 'repeat_end', Blockly.Variables.NAME_TYPE); - code += 'var ' + endVar + ' = ' + repeats + ';\n'; - } - code += 'for (int ' + loopVar + ' = 0; ' + - loopVar + ' < ' + endVar + '; ' + - loopVar + '++) {\n' + - branch + '}\n'; - return code; -}; - -Blockly.Dart['controls_repeat'] = Blockly.Dart['controls_repeat_ext']; - -Blockly.Dart['controls_whileUntil'] = function(block) { - // Do while/until loop. - var until = block.getFieldValue('MODE') == 'UNTIL'; - var argument0 = Blockly.Dart.valueToCode(block, 'BOOL', - until ? Blockly.Dart.ORDER_UNARY_PREFIX : - Blockly.Dart.ORDER_NONE) || 'false'; - var branch = Blockly.Dart.statementToCode(block, 'DO'); - branch = Blockly.Dart.addLoopTrap(branch, block.id); - if (until) { - argument0 = '!' + argument0; - } - return 'while (' + argument0 + ') {\n' + branch + '}\n'; -}; - -Blockly.Dart['controls_for'] = function(block) { - // For loop. - var variable0 = Blockly.Dart.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.Dart.valueToCode(block, 'FROM', - Blockly.Dart.ORDER_ASSIGNMENT) || '0'; - var argument1 = Blockly.Dart.valueToCode(block, 'TO', - Blockly.Dart.ORDER_ASSIGNMENT) || '0'; - var increment = Blockly.Dart.valueToCode(block, 'BY', - Blockly.Dart.ORDER_ASSIGNMENT) || '1'; - var branch = Blockly.Dart.statementToCode(block, 'DO'); - branch = Blockly.Dart.addLoopTrap(branch, block.id); - var code; - if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && - Blockly.isNumber(increment)) { - // All arguments are simple numbers. - var up = parseFloat(argument0) <= parseFloat(argument1); - code = 'for (' + variable0 + ' = ' + argument0 + '; ' + - variable0 + (up ? ' <= ' : ' >= ') + argument1 + '; ' + - variable0; - var step = Math.abs(parseFloat(increment)); - if (step == 1) { - code += up ? '++' : '--'; - } else { - code += (up ? ' += ' : ' -= ') + step; - } - code += ') {\n' + branch + '}\n'; - } else { - code = ''; - // Cache non-trivial values to variables to prevent repeated look-ups. - var startVar = argument0; - if (!argument0.match(/^\w+$/) && !Blockly.isNumber(argument0)) { - var startVar = Blockly.Dart.variableDB_.getDistinctName( - variable0 + '_start', Blockly.Variables.NAME_TYPE); - code += 'var ' + startVar + ' = ' + argument0 + ';\n'; - } - var endVar = argument1; - if (!argument1.match(/^\w+$/) && !Blockly.isNumber(argument1)) { - var endVar = Blockly.Dart.variableDB_.getDistinctName( - variable0 + '_end', Blockly.Variables.NAME_TYPE); - code += 'var ' + endVar + ' = ' + argument1 + ';\n'; - } - // Determine loop direction at start, in case one of the bounds - // changes during loop execution. - var incVar = Blockly.Dart.variableDB_.getDistinctName( - variable0 + '_inc', Blockly.Variables.NAME_TYPE); - code += 'num ' + incVar + ' = '; - if (Blockly.isNumber(increment)) { - code += Math.abs(increment) + ';\n'; - } else { - code += '(' + increment + ').abs();\n'; - } - code += 'if (' + startVar + ' > ' + endVar + ') {\n'; - code += Blockly.Dart.INDENT + incVar + ' = -' + incVar + ';\n'; - code += '}\n'; - code += 'for (' + variable0 + ' = ' + startVar + ';\n' + - ' ' + incVar + ' >= 0 ? ' + - variable0 + ' <= ' + endVar + ' : ' + - variable0 + ' >= ' + endVar + ';\n' + - ' ' + variable0 + ' += ' + incVar + ') {\n' + - branch + '}\n'; - } - return code; -}; - -Blockly.Dart['controls_forEach'] = function(block) { - // For each loop. - var variable0 = Blockly.Dart.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.Dart.valueToCode(block, 'LIST', - Blockly.Dart.ORDER_ASSIGNMENT) || '[]'; - var branch = Blockly.Dart.statementToCode(block, 'DO'); - branch = Blockly.Dart.addLoopTrap(branch, block.id); - var code = 'for (var ' + variable0 + ' in ' + argument0 + ') {\n' + - branch + '}\n'; - return code; -}; - -Blockly.Dart['controls_flow_statements'] = function(block) { - // Flow statements: continue, break. - switch (block.getFieldValue('FLOW')) { - case 'BREAK': - return 'break;\n'; - case 'CONTINUE': - return 'continue;\n'; - } - throw 'Unknown flow statement.'; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/dart/math.js b/src/opsoro/apps/visual_programming/static/blockly/generators/dart/math.js deleted file mode 100644 index 5eb327e..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/dart/math.js +++ /dev/null @@ -1,478 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Dart for math blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Dart.math'); - -goog.require('Blockly.Dart'); - - -Blockly.Dart.addReservedWords('Math'); - -Blockly.Dart['math_number'] = function(block) { - // Numeric value. - var code = window.parseFloat(block.getFieldValue('NUM')); - // -4.abs() returns -4 in Dart due to strange order of operation choices. - // -4 is actually an operator and a number. Reflect this in the order. - var order = code < 0 ? - Blockly.Dart.ORDER_UNARY_PREFIX : Blockly.Dart.ORDER_ATOMIC; - return [code, order]; -}; - -Blockly.Dart['math_arithmetic'] = function(block) { - // Basic arithmetic operators, and power. - var OPERATORS = { - 'ADD': [' + ', Blockly.Dart.ORDER_ADDITIVE], - 'MINUS': [' - ', Blockly.Dart.ORDER_ADDITIVE], - 'MULTIPLY': [' * ', Blockly.Dart.ORDER_MULTIPLICATIVE], - 'DIVIDE': [' / ', Blockly.Dart.ORDER_MULTIPLICATIVE], - 'POWER': [null, Blockly.Dart.ORDER_NONE] // Handle power separately. - }; - var tuple = OPERATORS[block.getFieldValue('OP')]; - var operator = tuple[0]; - var order = tuple[1]; - var argument0 = Blockly.Dart.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.Dart.valueToCode(block, 'B', order) || '0'; - var code; - // Power in Dart requires a special case since it has no operator. - if (!operator) { - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - code = 'Math.pow(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } - code = argument0 + operator + argument1; - return [code, order]; -}; - -Blockly.Dart['math_single'] = function(block) { - // Math operators with single operand. - var operator = block.getFieldValue('OP'); - var code; - var arg; - if (operator == 'NEG') { - // Negation is a special case given its different operator precedence. - arg = Blockly.Dart.valueToCode(block, 'NUM', - Blockly.Dart.ORDER_UNARY_PREFIX) || '0'; - if (arg[0] == '-') { - // --3 is not legal in Dart. - arg = ' ' + arg; - } - code = '-' + arg; - return [code, Blockly.Dart.ORDER_UNARY_PREFIX]; - } - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - if (operator == 'ABS' || operator.substring(0, 5) == 'ROUND') { - arg = Blockly.Dart.valueToCode(block, 'NUM', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '0'; - } else if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') { - arg = Blockly.Dart.valueToCode(block, 'NUM', - Blockly.Dart.ORDER_MULTIPLICATIVE) || '0'; - } else { - arg = Blockly.Dart.valueToCode(block, 'NUM', - Blockly.Dart.ORDER_NONE) || '0'; - } - // First, handle cases which generate values that don't need parentheses - // wrapping the code. - switch (operator) { - case 'ABS': - code = arg + '.abs()'; - break; - case 'ROOT': - code = 'Math.sqrt(' + arg + ')'; - break; - case 'LN': - code = 'Math.log(' + arg + ')'; - break; - case 'EXP': - code = 'Math.exp(' + arg + ')'; - break; - case 'POW10': - code = 'Math.pow(10,' + arg + ')'; - break; - case 'ROUND': - code = arg + '.round()'; - break; - case 'ROUNDUP': - code = arg + '.ceil()'; - break; - case 'ROUNDDOWN': - code = arg + '.floor()'; - break; - case 'SIN': - code = 'Math.sin(' + arg + ' / 180 * Math.PI)'; - break; - case 'COS': - code = 'Math.cos(' + arg + ' / 180 * Math.PI)'; - break; - case 'TAN': - code = 'Math.tan(' + arg + ' / 180 * Math.PI)'; - break; - } - if (code) { - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } - // Second, handle cases which generate values that may need parentheses - // wrapping the code. - switch (operator) { - case 'LOG10': - code = 'Math.log(' + arg + ') / Math.log(10)'; - break; - case 'ASIN': - code = 'Math.asin(' + arg + ') / Math.PI * 180'; - break; - case 'ACOS': - code = 'Math.acos(' + arg + ') / Math.PI * 180'; - break; - case 'ATAN': - code = 'Math.atan(' + arg + ') / Math.PI * 180'; - break; - default: - throw 'Unknown math operator: ' + operator; - } - return [code, Blockly.Dart.ORDER_MULTIPLICATIVE]; -}; - -Blockly.Dart['math_constant'] = function(block) { - // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. - var CONSTANTS = { - 'PI': ['Math.PI', Blockly.Dart.ORDER_UNARY_POSTFIX], - 'E': ['Math.E', Blockly.Dart.ORDER_UNARY_POSTFIX], - 'GOLDEN_RATIO': - ['(1 + Math.sqrt(5)) / 2', Blockly.Dart.ORDER_MULTIPLICATIVE], - 'SQRT2': ['Math.SQRT2', Blockly.Dart.ORDER_UNARY_POSTFIX], - 'SQRT1_2': ['Math.SQRT1_2', Blockly.Dart.ORDER_UNARY_POSTFIX], - 'INFINITY': ['double.INFINITY', Blockly.Dart.ORDER_ATOMIC] - }; - var constant = block.getFieldValue('CONSTANT'); - if (constant != 'INFINITY') { - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - } - return CONSTANTS[constant]; -}; - -Blockly.Dart['math_number_property'] = function(block) { - // Check if a number is even, odd, prime, whole, positive, or negative - // or if it is divisible by certain number. Returns true or false. - var number_to_check = Blockly.Dart.valueToCode(block, 'NUMBER_TO_CHECK', - Blockly.Dart.ORDER_MULTIPLICATIVE); - if (!number_to_check) { - return ['false', Blockly.Python.ORDER_ATOMIC]; - } - var dropdown_property = block.getFieldValue('PROPERTY'); - var code; - if (dropdown_property == 'PRIME') { - // Prime is a special case as it is not a one-liner test. - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'math_isPrime', - [ 'bool ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '(n) {', - ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods', - ' if (n == 2 || n == 3) {', - ' return true;', - ' }', - ' // False if n is null, negative, is 1, or not whole.', - ' // And false if n is divisible by 2 or 3.', - ' if (n == null || n <= 1 || n % 1 != 0 || n % 2 == 0 ||' + - ' n % 3 == 0) {', - ' return false;', - ' }', - ' // Check all the numbers of form 6k +/- 1, up to sqrt(n).', - ' for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {', - ' if (n % (x - 1) == 0 || n % (x + 1) == 0) {', - ' return false;', - ' }', - ' }', - ' return true;', - '}']); - code = functionName + '(' + number_to_check + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } - switch (dropdown_property) { - case 'EVEN': - code = number_to_check + ' % 2 == 0'; - break; - case 'ODD': - code = number_to_check + ' % 2 == 1'; - break; - case 'WHOLE': - code = number_to_check + ' % 1 == 0'; - break; - case 'POSITIVE': - code = number_to_check + ' > 0'; - break; - case 'NEGATIVE': - code = number_to_check + ' < 0'; - break; - case 'DIVISIBLE_BY': - var divisor = Blockly.Dart.valueToCode(block, 'DIVISOR', - Blockly.Dart.ORDER_MULTIPLICATIVE); - if (!divisor) { - return ['false', Blockly.Python.ORDER_ATOMIC]; - } - code = number_to_check + ' % ' + divisor + ' == 0'; - break; - } - return [code, Blockly.Dart.ORDER_EQUALITY]; -}; - -Blockly.Dart['math_change'] = function(block) { - // Add to a variable in place. - var argument0 = Blockly.Dart.valueToCode(block, 'DELTA', - Blockly.Dart.ORDER_ADDITIVE) || '0'; - var varName = Blockly.Dart.variableDB_.getName(block.getFieldValue('VAR'), - Blockly.Variables.NAME_TYPE); - return varName + ' = (' + varName + ' is num ? ' + varName + ' : 0) + ' + - argument0 + ';\n'; -}; - -// Rounding functions have a single operand. -Blockly.Dart['math_round'] = Blockly.Dart['math_single']; -// Trigonometry functions have a single operand. -Blockly.Dart['math_trig'] = Blockly.Dart['math_single']; - -Blockly.Dart['math_on_list'] = function(block) { - // Math functions for lists. - var func = block.getFieldValue('OP'); - var list = Blockly.Dart.valueToCode(block, 'LIST', - Blockly.Dart.ORDER_NONE) || '[]'; - var code; - switch (func) { - case 'SUM': - var functionName = Blockly.Dart.provideFunction_( - 'math_sum', - [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList) {', - ' num sumVal = 0;', - ' myList.forEach((num entry) {sumVal += entry;});', - ' return sumVal;', - '}']); - code = functionName + '(' + list + ')'; - break; - case 'MIN': - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'math_min', - [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList) {', - ' if (myList.isEmpty) return null;', - ' num minVal = myList[0];', - ' myList.forEach((num entry) ' + - '{minVal = Math.min(minVal, entry);});', - ' return minVal;', - '}']); - code = functionName + '(' + list + ')'; - break; - case 'MAX': - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'math_max', - [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList) {', - ' if (myList.isEmpty) return null;', - ' num maxVal = myList[0];', - ' myList.forEach((num entry) ' + - '{maxVal = Math.max(maxVal, entry);});', - ' return maxVal;', - '}']); - code = functionName + '(' + list + ')'; - break; - case 'AVERAGE': - // This operation exclude null and values that are not int or float: - // math_mean([null,null,"aString",1,9]) == 5.0. - var functionName = Blockly.Dart.provideFunction_( - 'math_average', - [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList) {', - ' // First filter list for numbers only.', - ' List localList = new List.from(myList);', - ' localList.removeMatching((a) => a is! num);', - ' if (localList.isEmpty) return null;', - ' num sumVal = 0;', - ' localList.forEach((num entry) {sumVal += entry;});', - ' return sumVal / localList.length;', - '}']); - code = functionName + '(' + list + ')'; - break; - case 'MEDIAN': - var functionName = Blockly.Dart.provideFunction_( - 'math_median', - [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList) {', - ' // First filter list for numbers only, then sort, ' + - 'then return middle value', - ' // or the average of two middle values if list has an ' + - 'even number of elements.', - ' List localList = new List.from(myList);', - ' localList.removeMatching((a) => a is! num);', - ' if (localList.isEmpty) return null;', - ' localList.sort((a, b) => (a - b));', - ' int index = localList.length ~/ 2;', - ' if (localList.length % 2 == 1) {', - ' return localList[index];', - ' } else {', - ' return (localList[index - 1] + localList[index]) / 2;', - ' }', - '}']); - code = functionName + '(' + list + ')'; - break; - case 'MODE': - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - // As a list of numbers can contain more than one mode, - // the returned result is provided as an array. - // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]. - var functionName = Blockly.Dart.provideFunction_( - 'math_modes', - [ 'List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List values) {', - ' List modes = [];', - ' List counts = [];', - ' int maxCount = 0;', - ' for (int i = 0; i < values.length; i++) {', - ' var value = values[i];', - ' bool found = false;', - ' int thisCount;', - ' for (int j = 0; j < counts.length; j++) {', - ' if (counts[j][0] == value) {', - ' thisCount = ++counts[j][1];', - ' found = true;', - ' break;', - ' }', - ' }', - ' if (!found) {', - ' counts.add([value, 1]);', - ' thisCount = 1;', - ' }', - ' maxCount = Math.max(thisCount, maxCount);', - ' }', - ' for (int j = 0; j < counts.length; j++) {', - ' if (counts[j][1] == maxCount) {', - ' modes.add(counts[j][0]);', - ' }', - ' }', - ' return modes;', - '}']); - code = functionName + '(' + list + ')'; - break; - case 'STD_DEV': - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'math_standard_deviation', - [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList) {', - ' // First filter list for numbers only.', - ' List numbers = new List.from(myList);', - ' numbers.removeMatching((a) => a is! num);', - ' if (numbers.isEmpty) return null;', - ' num n = numbers.length;', - ' num sum = 0;', - ' numbers.forEach((x) => sum += x);', - ' num mean = sum / n;', - ' num sumSquare = 0;', - ' numbers.forEach((x) => sumSquare += ' + - 'Math.pow(x - mean, 2));', - ' return Math.sqrt(sumSquare / n);', - '}']); - code = functionName + '(' + list + ')'; - break; - case 'RANDOM': - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'math_random_item', - [ 'dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList) {', - ' int x = new Math.Random().nextInt(myList.length);', - ' return myList[x];', - '}']); - code = functionName + '(' + list + ')'; - break; - default: - throw 'Unknown operator: ' + func; - } - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['math_modulo'] = function(block) { - // Remainder computation. - var argument0 = Blockly.Dart.valueToCode(block, 'DIVIDEND', - Blockly.Dart.ORDER_MULTIPLICATIVE) || '0'; - var argument1 = Blockly.Dart.valueToCode(block, 'DIVISOR', - Blockly.Dart.ORDER_MULTIPLICATIVE) || '0'; - var code = argument0 + ' % ' + argument1; - return [code, Blockly.Dart.ORDER_MULTIPLICATIVE]; -}; - -Blockly.Dart['math_constrain'] = function(block) { - // Constrain a number between two limits. - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var argument0 = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_NONE) || '0'; - var argument1 = Blockly.Dart.valueToCode(block, 'LOW', - Blockly.Dart.ORDER_NONE) || '0'; - var argument2 = Blockly.Dart.valueToCode(block, 'HIGH', - Blockly.Dart.ORDER_NONE) || 'double.INFINITY'; - var code = 'Math.min(Math.max(' + argument0 + ', ' + argument1 + '), ' + - argument2 + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['math_random_int'] = function(block) { - // Random integer between [X] and [Y]. - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var argument0 = Blockly.Dart.valueToCode(block, 'FROM', - Blockly.Dart.ORDER_NONE) || '0'; - var argument1 = Blockly.Dart.valueToCode(block, 'TO', - Blockly.Dart.ORDER_NONE) || '0'; - var functionName = Blockly.Dart.provideFunction_( - 'math_random_int', - [ 'int ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '(num a, num b) {', - ' if (a > b) {', - ' // Swap a and b to ensure a is smaller.', - ' num c = a;', - ' a = b;', - ' b = c;', - ' }', - ' return new Math.Random().nextInt(b - a + 1) + a;', - '}']); - var code = functionName + '(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['math_random_float'] = function(block) { - // Random fraction between 0 and 1. - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - return ['new Math.Random().nextDouble()', Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/dart/procedures.js b/src/opsoro/apps/visual_programming/static/blockly/generators/dart/procedures.js deleted file mode 100644 index 4f1b978..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/dart/procedures.js +++ /dev/null @@ -1,108 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Dart for procedure blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Dart.procedures'); - -goog.require('Blockly.Dart'); - - -Blockly.Dart['procedures_defreturn'] = function(block) { - // Define a procedure with a return value. - var funcName = Blockly.Dart.variableDB_.getName(block.getFieldValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var branch = Blockly.Dart.statementToCode(block, 'STACK'); - if (Blockly.Dart.STATEMENT_PREFIX) { - branch = Blockly.Dart.prefixLines( - Blockly.Dart.STATEMENT_PREFIX.replace(/%1/g, - '\'' + block.id + '\''), Blockly.Dart.INDENT) + branch; - } - if (Blockly.Dart.INFINITE_LOOP_TRAP) { - branch = Blockly.Dart.INFINITE_LOOP_TRAP.replace(/%1/g, - '\'' + block.id + '\'') + branch; - } - var returnValue = Blockly.Dart.valueToCode(block, 'RETURN', - Blockly.Dart.ORDER_NONE) || ''; - if (returnValue) { - returnValue = ' return ' + returnValue + ';\n'; - } - var returnType = returnValue ? 'dynamic' : 'void'; - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.Dart.variableDB_.getName(block.arguments_[x], - Blockly.Variables.NAME_TYPE); - } - var code = returnType + ' ' + funcName + '(' + args.join(', ') + ') {\n' + - branch + returnValue + '}'; - code = Blockly.Dart.scrub_(block, code); - Blockly.Dart.definitions_[funcName] = code; - return null; -}; - -// Defining a procedure without a return value uses the same generator as -// a procedure with a return value. -Blockly.Dart['procedures_defnoreturn'] = Blockly.Dart['procedures_defreturn']; - -Blockly.Dart['procedures_callreturn'] = function(block) { - // Call a procedure with a return value. - var funcName = Blockly.Dart.variableDB_.getName(block.getFieldValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.Dart.valueToCode(block, 'ARG' + x, - Blockly.Dart.ORDER_NONE) || 'null'; - } - var code = funcName + '(' + args.join(', ') + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['procedures_callnoreturn'] = function(block) { - // Call a procedure with no return value. - var funcName = Blockly.Dart.variableDB_.getName(block.getFieldValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.Dart.valueToCode(block, 'ARG' + x, - Blockly.Dart.ORDER_NONE) || 'null'; - } - var code = funcName + '(' + args.join(', ') + ');\n'; - return code; -}; - -Blockly.Dart['procedures_ifreturn'] = function(block) { - // Conditionally return value from a procedure. - var condition = Blockly.Dart.valueToCode(block, 'CONDITION', - Blockly.Dart.ORDER_NONE) || 'false'; - var code = 'if (' + condition + ') {\n'; - if (block.hasReturnValue_) { - var value = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_NONE) || 'null'; - code += ' return ' + value + ';\n'; - } else { - code += ' return;\n'; - } - code += '}\n'; - return code; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/dart/text.js b/src/opsoro/apps/visual_programming/static/blockly/generators/dart/text.js deleted file mode 100644 index 6a06c82..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/dart/text.js +++ /dev/null @@ -1,270 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Dart for text blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Dart.texts'); - -goog.require('Blockly.Dart'); - - -Blockly.Dart.addReservedWords('Html,Math'); - -Blockly.Dart['text'] = function(block) { - // Text value. - var code = Blockly.Dart.quote_(block.getFieldValue('TEXT')); - return [code, Blockly.Dart.ORDER_ATOMIC]; -}; - -Blockly.Dart['text_join'] = function(block) { - // Create a string made up of any number of elements of any type. - var code; - if (block.itemCount_ == 0) { - return ['\'\'', Blockly.Dart.ORDER_ATOMIC]; - } else if (block.itemCount_ == 1) { - var argument0 = Blockly.Dart.valueToCode(block, 'ADD0', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - code = argument0 + '.toString()'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else { - code = new Array(block.itemCount_); - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.Dart.valueToCode(block, 'ADD' + n, - Blockly.Dart.ORDER_NONE) || '\'\''; - } - code = '[' + code.join(',') + '].join()'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } -}; - -Blockly.Dart['text_append'] = function(block) { - // Append to a variable in place. - var varName = Blockly.Dart.variableDB_.getName(block.getFieldValue('VAR'), - Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.Dart.valueToCode(block, 'TEXT', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - return varName + ' = [' + varName + ', ' + argument0 + '].join();\n'; -}; - -Blockly.Dart['text_length'] = function(block) { - // String or array length. - var argument0 = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - return [argument0 + '.length', Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['text_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - return [argument0 + '.isEmpty', Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['text_indexOf'] = function(block) { - // Search the text for a substring. - var operator = block.getFieldValue('END') == 'FIRST' ? - 'indexOf' : 'lastIndexOf'; - var argument0 = Blockly.Dart.valueToCode(block, 'FIND', - Blockly.Dart.ORDER_NONE) || '\'\''; - var argument1 = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - var code = argument1 + '.' + operator + '(' + argument0 + ') + 1'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['text_charAt'] = function(block) { - // Get letter at index. - // Note: Until January 2013 this block did not have the WHERE input. - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.Dart.valueToCode(block, 'AT', - Blockly.Dart.ORDER_NONE) || '1'; - var text = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - switch (where) { - case 'FIRST': - var code = text + '[0]'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - case 'FROM_START': - // Blockly uses one-based indicies. - if (at.match(/^-?\d+$/)) { - // If the index is a naked number, decrement it right now. - at = parseInt(at, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - var code = text + '[' + at + ']'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - case 'LAST': - at = 1; - // Fall through. - case 'FROM_END': - var functionName = Blockly.Dart.provideFunction_( - 'text_get_from_end', - [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(String text, num x) {', - ' return text[text.length - x];', - '}']); - code = functionName + '(' + text + ', ' + at + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - case 'RANDOM': - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'text_random_letter', - [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(String text) {', - ' int x = new Math.Random().nextInt(text.length);', - ' return text[x];', - '}']); - code = functionName + '(' + text + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } - throw 'Unhandled option (text_charAt).'; -}; - -Blockly.Dart['text_getSubstring'] = function(block) { - // Get substring. - var text = Blockly.Dart.valueToCode(block, 'STRING', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.Dart.valueToCode(block, 'AT1', - Blockly.Dart.ORDER_NONE) || '1'; - var at2 = Blockly.Dart.valueToCode(block, 'AT2', - Blockly.Dart.ORDER_NONE) || '1'; - if (where1 == 'FIRST' && where2 == 'LAST') { - var code = text; - } else { - var functionName = Blockly.Dart.provideFunction_( - 'text_get_substring', - [ 'function ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(text, where1, at1, where2, at2) {', - ' function getAt(where, at) {', - ' if (where == \'FROM_START\') {', - ' at--;', - ' } else if (where == \'FROM_END\') {', - ' at = text.length - at;', - ' } else if (where == \'FIRST\') {', - ' at = 0;', - ' } else if (where == \'LAST\') {', - ' at = text.length - 1;', - ' } else {', - ' throw \'Unhandled option (text_getSubstring).\';', - ' }', - ' return at;', - ' }', - ' at1 = getAt(where1, at1);', - ' at2 = getAt(where2, at2) + 1;', - ' return text.substring(at1, at2);', - '}']); - var code = functionName + '(' + text + ', \'' + - where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; - } - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['text_changeCase'] = function(block) { - // Change capitalization. - var OPERATORS = { - 'UPPERCASE': '.toUpperCase()', - 'LOWERCASE': '.toLowerCase()', - 'TITLECASE': null - }; - var operator = OPERATORS[block.getFieldValue('CASE')]; - var code; - if (operator) { - // Upper and lower case are functions built into Dart. - var argument0 = Blockly.Dart.valueToCode(block, 'TEXT', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - code = argument0 + operator; - } else { - // Title case is not a native Dart function. Define one. - var functionName = Blockly.Dart.provideFunction_( - 'text_toTitleCase', - [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(String str) {', - ' RegExp exp = new RegExp(r\'\\b\');', - ' List list = str.split(exp);', - ' final title = new StringBuffer();', - ' for (String part in list) {', - ' if (part.length > 0) {', - ' title.write(part[0].toUpperCase());', - ' if (part.length > 0) {', - ' title.write(part.substring(1).toLowerCase());', - ' }', - ' }', - ' }', - ' return title.toString();', - '}']); - var argument0 = Blockly.Dart.valueToCode(block, 'TEXT', - Blockly.Dart.ORDER_NONE) || '\'\''; - code = functionName + '(' + argument0 + ')'; - } - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['text_trim'] = function(block) { - // Trim spaces. - var OPERATORS = { - 'LEFT': '.replaceFirst(new RegExp(r\'^\\s+\'), \'\')', - 'RIGHT': '.replaceFirst(new RegExp(r\'\\s+$\'), \'\')', - 'BOTH': '.trim()' - }; - var operator = OPERATORS[block.getFieldValue('MODE')]; - var argument0 = Blockly.Dart.valueToCode(block, 'TEXT', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - return [argument0 + operator, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['text_print'] = function(block) { - // Print statement. - var argument0 = Blockly.Dart.valueToCode(block, 'TEXT', - Blockly.Dart.ORDER_NONE) || '\'\''; - return 'print(' + argument0 + ');\n'; -}; - -Blockly.Dart['text_prompt_ext'] = function(block) { - // Prompt function. - Blockly.Dart.definitions_['import_dart_html'] = - 'import \'dart:html\' as Html;'; - if (block.getField('TEXT')) { - // Internal message. - var msg = Blockly.Dart.quote_(block.getFieldValue('TEXT')); - } else { - // External message. - var msg = Blockly.Dart.valueToCode(block, 'TEXT', - Blockly.Dart.ORDER_NONE) || '\'\''; - } - var code = 'Html.window.prompt(' + msg + ', \'\')'; - var toNumber = block.getFieldValue('TYPE') == 'NUMBER'; - if (toNumber) { - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - code = 'Math.parseDouble(' + code + ')'; - } - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['text_prompt'] = Blockly.Dart['text_prompt_ext']; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript.js b/src/opsoro/apps/visual_programming/static/blockly/generators/javascript.js deleted file mode 100644 index baa398a..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript.js +++ /dev/null @@ -1,212 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Helper functions for generating JavaScript for blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.JavaScript'); - -goog.require('Blockly.Generator'); - - -/** - * JavaScript code generator. - * @type {!Blockly.Generator} - */ -Blockly.JavaScript = new Blockly.Generator('JavaScript'); - -/** - * List of illegal variable names. - * This is not intended to be a security feature. Blockly is 100% client-side, - * so bypassing this list is trivial. This is intended to prevent users from - * accidentally clobbering a built-in object or function. - * @private - */ -Blockly.JavaScript.addReservedWords( - 'Blockly,' + // In case JS is evaled in the current window. - // https://developer.mozilla.org/en/JavaScript/Reference/Reserved_Words - 'break,case,catch,continue,debugger,default,delete,do,else,finally,for,function,if,in,instanceof,new,return,switch,this,throw,try,typeof,var,void,while,with,' + - 'class,enum,export,extends,import,super,implements,interface,let,package,private,protected,public,static,yield,' + - 'const,null,true,false,' + - // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects - 'Array,ArrayBuffer,Boolean,Date,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Error,eval,EvalError,Float32Array,Float64Array,Function,Infinity,Int16Array,Int32Array,Int8Array,isFinite,isNaN,Iterator,JSON,Math,NaN,Number,Object,parseFloat,parseInt,RangeError,ReferenceError,RegExp,StopIteration,String,SyntaxError,TypeError,Uint16Array,Uint32Array,Uint8Array,Uint8ClampedArray,undefined,uneval,URIError,' + - // https://developer.mozilla.org/en/DOM/window - 'applicationCache,closed,Components,content,_content,controllers,crypto,defaultStatus,dialogArguments,directories,document,frameElement,frames,fullScreen,globalStorage,history,innerHeight,innerWidth,length,location,locationbar,localStorage,menubar,messageManager,mozAnimationStartTime,mozInnerScreenX,mozInnerScreenY,mozPaintCount,name,navigator,opener,outerHeight,outerWidth,pageXOffset,pageYOffset,parent,performance,personalbar,pkcs11,returnValue,screen,screenX,screenY,scrollbars,scrollMaxX,scrollMaxY,scrollX,scrollY,self,sessionStorage,sidebar,status,statusbar,toolbar,top,URL,window,' + - 'addEventListener,alert,atob,back,blur,btoa,captureEvents,clearImmediate,clearInterval,clearTimeout,close,confirm,disableExternalCapture,dispatchEvent,dump,enableExternalCapture,escape,find,focus,forward,GeckoActiveXObject,getAttention,getAttentionWithCycleCount,getComputedStyle,getSelection,home,matchMedia,maximize,minimize,moveBy,moveTo,mozRequestAnimationFrame,open,openDialog,postMessage,print,prompt,QueryInterface,releaseEvents,removeEventListener,resizeBy,resizeTo,restore,routeEvent,scroll,scrollBy,scrollByLines,scrollByPages,scrollTo,setCursor,setImmediate,setInterval,setResizable,setTimeout,showModalDialog,sizeToContent,stop,unescape,updateCommands,XPCNativeWrapper,XPCSafeJSObjectWrapper,' + - 'onabort,onbeforeunload,onblur,onchange,onclick,onclose,oncontextmenu,ondevicemotion,ondeviceorientation,ondragdrop,onerror,onfocus,onhashchange,onkeydown,onkeypress,onkeyup,onload,onmousedown,onmousemove,onmouseout,onmouseover,onmouseup,onmozbeforepaint,onpaint,onpopstate,onreset,onresize,onscroll,onselect,onsubmit,onunload,onpageshow,onpagehide,' + - 'Image,Option,Worker,' + - // https://developer.mozilla.org/en/Gecko_DOM_Reference - 'Event,Range,File,FileReader,Blob,BlobBuilder,' + - 'Attr,CDATASection,CharacterData,Comment,console,DocumentFragment,DocumentType,DomConfiguration,DOMError,DOMErrorHandler,DOMException,DOMImplementation,DOMImplementationList,DOMImplementationRegistry,DOMImplementationSource,DOMLocator,DOMObject,DOMString,DOMStringList,DOMTimeStamp,DOMUserData,Entity,EntityReference,MediaQueryList,MediaQueryListListener,NameList,NamedNodeMap,Node,NodeFilter,NodeIterator,NodeList,Notation,Plugin,PluginArray,ProcessingInstruction,SharedWorker,Text,TimeRanges,Treewalker,TypeInfo,UserDataHandler,Worker,WorkerGlobalScope,' + - 'HTMLDocument,HTMLElement,HTMLAnchorElement,HTMLAppletElement,HTMLAudioElement,HTMLAreaElement,HTMLBaseElement,HTMLBaseFontElement,HTMLBodyElement,HTMLBRElement,HTMLButtonElement,HTMLCanvasElement,HTMLDirectoryElement,HTMLDivElement,HTMLDListElement,HTMLEmbedElement,HTMLFieldSetElement,HTMLFontElement,HTMLFormElement,HTMLFrameElement,HTMLFrameSetElement,HTMLHeadElement,HTMLHeadingElement,HTMLHtmlElement,HTMLHRElement,HTMLIFrameElement,HTMLImageElement,HTMLInputElement,HTMLKeygenElement,HTMLLabelElement,HTMLLIElement,HTMLLinkElement,HTMLMapElement,HTMLMenuElement,HTMLMetaElement,HTMLModElement,HTMLObjectElement,HTMLOListElement,HTMLOptGroupElement,HTMLOptionElement,HTMLOutputElement,HTMLParagraphElement,HTMLParamElement,HTMLPreElement,HTMLQuoteElement,HTMLScriptElement,HTMLSelectElement,HTMLSourceElement,HTMLSpanElement,HTMLStyleElement,HTMLTableElement,HTMLTableCaptionElement,HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement,HTMLTableColElement,HTMLTableRowElement,HTMLTableSectionElement,HTMLTextAreaElement,HTMLTimeElement,HTMLTitleElement,HTMLTrackElement,HTMLUListElement,HTMLUnknownElement,HTMLVideoElement,' + - 'HTMLCanvasElement,CanvasRenderingContext2D,CanvasGradient,CanvasPattern,TextMetrics,ImageData,CanvasPixelArray,HTMLAudioElement,HTMLVideoElement,NotifyAudioAvailableEvent,HTMLCollection,HTMLAllCollection,HTMLFormControlsCollection,HTMLOptionsCollection,HTMLPropertiesCollection,DOMTokenList,DOMSettableTokenList,DOMStringMap,RadioNodeList,' + - 'SVGDocument,SVGElement,SVGAElement,SVGAltGlyphElement,SVGAltGlyphDefElement,SVGAltGlyphItemElement,SVGAnimationElement,SVGAnimateElement,SVGAnimateColorElement,SVGAnimateMotionElement,SVGAnimateTransformElement,SVGSetElement,SVGCircleElement,SVGClipPathElement,SVGColorProfileElement,SVGCursorElement,SVGDefsElement,SVGDescElement,SVGEllipseElement,SVGFilterElement,SVGFilterPrimitiveStandardAttributes,SVGFEBlendElement,SVGFEColorMatrixElement,SVGFEComponentTransferElement,SVGFECompositeElement,SVGFEConvolveMatrixElement,SVGFEDiffuseLightingElement,SVGFEDisplacementMapElement,SVGFEDistantLightElement,SVGFEFloodElement,SVGFEGaussianBlurElement,SVGFEImageElement,SVGFEMergeElement,SVGFEMergeNodeElement,SVGFEMorphologyElement,SVGFEOffsetElement,SVGFEPointLightElement,SVGFESpecularLightingElement,SVGFESpotLightElement,SVGFETileElement,SVGFETurbulenceElement,SVGComponentTransferFunctionElement,SVGFEFuncRElement,SVGFEFuncGElement,SVGFEFuncBElement,SVGFEFuncAElement,SVGFontElement,SVGFontFaceElement,SVGFontFaceFormatElement,SVGFontFaceNameElement,SVGFontFaceSrcElement,SVGFontFaceUriElement,SVGForeignObjectElement,SVGGElement,SVGGlyphElement,SVGGlyphRefElement,SVGGradientElement,SVGLinearGradientElement,SVGRadialGradientElement,SVGHKernElement,SVGImageElement,SVGLineElement,SVGMarkerElement,SVGMaskElement,SVGMetadataElement,SVGMissingGlyphElement,SVGMPathElement,SVGPathElement,SVGPatternElement,SVGPolylineElement,SVGPolygonElement,SVGRectElement,SVGScriptElement,SVGStopElement,SVGStyleElement,SVGSVGElement,SVGSwitchElement,SVGSymbolElement,SVGTextElement,SVGTextPathElement,SVGTitleElement,SVGTRefElement,SVGTSpanElement,SVGUseElement,SVGViewElement,SVGVKernElement,' + - 'SVGAngle,SVGColor,SVGICCColor,SVGElementInstance,SVGElementInstanceList,SVGLength,SVGLengthList,SVGMatrix,SVGNumber,SVGNumberList,SVGPaint,SVGPoint,SVGPointList,SVGPreserveAspectRatio,SVGRect,SVGStringList,SVGTransform,SVGTransformList,' + - 'SVGAnimatedAngle,SVGAnimatedBoolean,SVGAnimatedEnumeration,SVGAnimatedInteger,SVGAnimatedLength,SVGAnimatedLengthList,SVGAnimatedNumber,SVGAnimatedNumberList,SVGAnimatedPreserveAspectRatio,SVGAnimatedRect,SVGAnimatedString,SVGAnimatedTransformList,' + - 'SVGPathSegList,SVGPathSeg,SVGPathSegArcAbs,SVGPathSegArcRel,SVGPathSegClosePath,SVGPathSegCurvetoCubicAbs,SVGPathSegCurvetoCubicRel,SVGPathSegCurvetoCubicSmoothAbs,SVGPathSegCurvetoCubicSmoothRel,SVGPathSegCurvetoQuadraticAbs,SVGPathSegCurvetoQuadraticRel,SVGPathSegCurvetoQuadraticSmoothAbs,SVGPathSegCurvetoQuadraticSmoothRel,SVGPathSegLinetoAbs,SVGPathSegLinetoHorizontalAbs,SVGPathSegLinetoHorizontalRel,SVGPathSegLinetoRel,SVGPathSegLinetoVerticalAbs,SVGPathSegLinetoVerticalRel,SVGPathSegMovetoAbs,SVGPathSegMovetoRel,ElementTimeControl,TimeEvent,SVGAnimatedPathData,' + - 'SVGAnimatedPoints,SVGColorProfileRule,SVGCSSRule,SVGExternalResourcesRequired,SVGFitToViewBox,SVGLangSpace,SVGLocatable,SVGRenderingIntent,SVGStylable,SVGTests,SVGTextContentElement,SVGTextPositioningElement,SVGTransformable,SVGUnitTypes,SVGURIReference,SVGViewSpec,SVGZoomAndPan'); - -/** - * Order of operation ENUMs. - * https://developer.mozilla.org/en/JavaScript/Reference/Operators/Operator_Precedence - */ -Blockly.JavaScript.ORDER_ATOMIC = 0; // 0 "" ... -Blockly.JavaScript.ORDER_MEMBER = 1; // . [] -Blockly.JavaScript.ORDER_NEW = 1; // new -Blockly.JavaScript.ORDER_FUNCTION_CALL = 2; // () -Blockly.JavaScript.ORDER_INCREMENT = 3; // ++ -Blockly.JavaScript.ORDER_DECREMENT = 3; // -- -Blockly.JavaScript.ORDER_LOGICAL_NOT = 4; // ! -Blockly.JavaScript.ORDER_BITWISE_NOT = 4; // ~ -Blockly.JavaScript.ORDER_UNARY_PLUS = 4; // + -Blockly.JavaScript.ORDER_UNARY_NEGATION = 4; // - -Blockly.JavaScript.ORDER_TYPEOF = 4; // typeof -Blockly.JavaScript.ORDER_VOID = 4; // void -Blockly.JavaScript.ORDER_DELETE = 4; // delete -Blockly.JavaScript.ORDER_MULTIPLICATION = 5; // * -Blockly.JavaScript.ORDER_DIVISION = 5; // / -Blockly.JavaScript.ORDER_MODULUS = 5; // % -Blockly.JavaScript.ORDER_ADDITION = 6; // + -Blockly.JavaScript.ORDER_SUBTRACTION = 6; // - -Blockly.JavaScript.ORDER_BITWISE_SHIFT = 7; // << >> >>> -Blockly.JavaScript.ORDER_RELATIONAL = 8; // < <= > >= -Blockly.JavaScript.ORDER_IN = 8; // in -Blockly.JavaScript.ORDER_INSTANCEOF = 8; // instanceof -Blockly.JavaScript.ORDER_EQUALITY = 9; // == != === !== -Blockly.JavaScript.ORDER_BITWISE_AND = 10; // & -Blockly.JavaScript.ORDER_BITWISE_XOR = 11; // ^ -Blockly.JavaScript.ORDER_BITWISE_OR = 12; // | -Blockly.JavaScript.ORDER_LOGICAL_AND = 13; // && -Blockly.JavaScript.ORDER_LOGICAL_OR = 14; // || -Blockly.JavaScript.ORDER_CONDITIONAL = 15; // ?: -Blockly.JavaScript.ORDER_ASSIGNMENT = 16; // = += -= *= /= %= <<= >>= ... -Blockly.JavaScript.ORDER_COMMA = 17; // , -Blockly.JavaScript.ORDER_NONE = 99; // (...) - -/** - * Initialise the database of variable names. - * @param {!Blockly.Workspace} workspace Workspace to generate code from. - */ -Blockly.JavaScript.init = function(workspace) { - // Create a dictionary of definitions to be printed before the code. - Blockly.JavaScript.definitions_ = Object.create(null); - // Create a dictionary mapping desired function names in definitions_ - // to actual function names (to avoid collisions with user functions). - Blockly.JavaScript.functionNames_ = Object.create(null); - - if (!Blockly.JavaScript.variableDB_) { - Blockly.JavaScript.variableDB_ = - new Blockly.Names(Blockly.JavaScript.RESERVED_WORDS_); - } else { - Blockly.JavaScript.variableDB_.reset(); - } - - var defvars = []; - var variables = Blockly.Variables.allVariables(workspace); - for (var i = 0; i < variables.length; i++) { - defvars[i] = 'var ' + - Blockly.JavaScript.variableDB_.getName(variables[i], - Blockly.Variables.NAME_TYPE) + ';'; - } - Blockly.JavaScript.definitions_['variables'] = defvars.join('\n'); -}; - -/** - * Prepend the generated code with the variable definitions. - * @param {string} code Generated code. - * @return {string} Completed code. - */ -Blockly.JavaScript.finish = function(code) { - // Convert the definitions dictionary into a list. - var definitions = []; - for (var name in Blockly.JavaScript.definitions_) { - definitions.push(Blockly.JavaScript.definitions_[name]); - } - // Clean up temporary data. - delete Blockly.JavaScript.definitions_; - delete Blockly.JavaScript.functionNames_; - Blockly.JavaScript.variableDB_.reset(); - return definitions.join('\n\n') + '\n\n\n' + code; -}; - -/** - * Naked values are top-level blocks with outputs that aren't plugged into - * anything. A trailing semicolon is needed to make this legal. - * @param {string} line Line of generated code. - * @return {string} Legal line of code. - */ -Blockly.JavaScript.scrubNakedValue = function(line) { - return line + ';\n'; -}; - -/** - * Encode a string as a properly escaped JavaScript string, complete with - * quotes. - * @param {string} string Text to encode. - * @return {string} JavaScript string. - * @private - */ -Blockly.JavaScript.quote_ = function(string) { - // TODO: This is a quick hack. Replace with goog.string.quote - string = string.replace(/\\/g, '\\\\') - .replace(/\n/g, '\\\n') - .replace(/'/g, '\\\''); - return '\'' + string + '\''; -}; - -/** - * Common tasks for generating JavaScript from blocks. - * Handles comments for the specified block and any connected value blocks. - * Calls any statements following this block. - * @param {!Blockly.Block} block The current block. - * @param {string} code The JavaScript code created for this block. - * @return {string} JavaScript code with comments and subsequent blocks added. - * @private - */ -Blockly.JavaScript.scrub_ = function(block, code) { - var commentCode = ''; - // Only collect comments for blocks that aren't inline. - if (!block.outputConnection || !block.outputConnection.targetConnection) { - // Collect comment for this block. - var comment = block.getCommentText(); - if (comment) { - commentCode += Blockly.JavaScript.prefixLines(comment, '// ') + '\n'; - } - // Collect comments for all value arguments. - // Don't collect comments for nested statements. - for (var x = 0; x < block.inputList.length; x++) { - if (block.inputList[x].type == Blockly.INPUT_VALUE) { - var childBlock = block.inputList[x].connection.targetBlock(); - if (childBlock) { - var comment = Blockly.JavaScript.allNestedComments(childBlock); - if (comment) { - commentCode += Blockly.JavaScript.prefixLines(comment, '// '); - } - } - } - } - } - var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); - var nextCode = Blockly.JavaScript.blockToCode(nextBlock); - return commentCode + code + nextCode; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/colour.js b/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/colour.js deleted file mode 100644 index 205bbf2..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/colour.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating JavaScript for colour blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.JavaScript.colour'); - -goog.require('Blockly.JavaScript'); - - -Blockly.JavaScript['colour_picker'] = function(block) { - // Colour picker. - var code = '\'' + block.getFieldValue('COLOUR') + '\''; - return [code, Blockly.JavaScript.ORDER_ATOMIC]; -}; - -Blockly.JavaScript['colour_random'] = function(block) { - // Generate a random colour. - var functionName = Blockly.JavaScript.provideFunction_( - 'colour_random', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '() {', - ' var num = Math.floor(Math.random() * Math.pow(2, 24));', - ' return \'#\' + (\'00000\' + num.toString(16)).substr(-6);', - '}']); - var code = functionName + '()'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['colour_rgb'] = function(block) { - // Compose a colour from RGB components expressed as percentages. - var red = Blockly.JavaScript.valueToCode(block, 'RED', - Blockly.JavaScript.ORDER_COMMA) || 0; - var green = Blockly.JavaScript.valueToCode(block, 'GREEN', - Blockly.JavaScript.ORDER_COMMA) || 0; - var blue = Blockly.JavaScript.valueToCode(block, 'BLUE', - Blockly.JavaScript.ORDER_COMMA) || 0; - var functionName = Blockly.JavaScript.provideFunction_( - 'colour_rgb', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(r, g, b) {', - ' r = Math.max(Math.min(Number(r), 100), 0) * 2.55;', - ' g = Math.max(Math.min(Number(g), 100), 0) * 2.55;', - ' b = Math.max(Math.min(Number(b), 100), 0) * 2.55;', - ' r = (\'0\' + (Math.round(r) || 0).toString(16)).slice(-2);', - ' g = (\'0\' + (Math.round(g) || 0).toString(16)).slice(-2);', - ' b = (\'0\' + (Math.round(b) || 0).toString(16)).slice(-2);', - ' return \'#\' + r + g + b;', - '}']); - var code = functionName + '(' + red + ', ' + green + ', ' + blue + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['colour_blend'] = function(block) { - // Blend two colours together. - var c1 = Blockly.JavaScript.valueToCode(block, 'COLOUR1', - Blockly.JavaScript.ORDER_COMMA) || '\'#000000\''; - var c2 = Blockly.JavaScript.valueToCode(block, 'COLOUR2', - Blockly.JavaScript.ORDER_COMMA) || '\'#000000\''; - var ratio = Blockly.JavaScript.valueToCode(block, 'RATIO', - Blockly.JavaScript.ORDER_COMMA) || 0.5; - var functionName = Blockly.JavaScript.provideFunction_( - 'colour_blend', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(c1, c2, ratio) {', - ' ratio = Math.max(Math.min(Number(ratio), 1), 0);', - ' var r1 = parseInt(c1.substring(1, 3), 16);', - ' var g1 = parseInt(c1.substring(3, 5), 16);', - ' var b1 = parseInt(c1.substring(5, 7), 16);', - ' var r2 = parseInt(c2.substring(1, 3), 16);', - ' var g2 = parseInt(c2.substring(3, 5), 16);', - ' var b2 = parseInt(c2.substring(5, 7), 16);', - ' var r = Math.round(r1 * (1 - ratio) + r2 * ratio);', - ' var g = Math.round(g1 * (1 - ratio) + g2 * ratio);', - ' var b = Math.round(b1 * (1 - ratio) + b2 * ratio);', - ' r = (\'0\' + (r || 0).toString(16)).slice(-2);', - ' g = (\'0\' + (g || 0).toString(16)).slice(-2);', - ' b = (\'0\' + (b || 0).toString(16)).slice(-2);', - ' return \'#\' + r + g + b;', - '}']); - var code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/lists.js b/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/lists.js deleted file mode 100644 index a309a28..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/lists.js +++ /dev/null @@ -1,324 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating JavaScript for list blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.JavaScript.lists'); - -goog.require('Blockly.JavaScript'); - - -Blockly.JavaScript['lists_create_empty'] = function(block) { - // Create an empty list. - return ['[]', Blockly.JavaScript.ORDER_ATOMIC]; -}; - -Blockly.JavaScript['lists_create_with'] = function(block) { - // Create a list with any number of elements of any type. - var code = new Array(block.itemCount_); - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.JavaScript.valueToCode(block, 'ADD' + n, - Blockly.JavaScript.ORDER_COMMA) || 'null'; - } - code = '[' + code.join(', ') + ']'; - return [code, Blockly.JavaScript.ORDER_ATOMIC]; -}; - -Blockly.JavaScript['lists_repeat'] = function(block) { - // Create a list with one element repeated. - var functionName = Blockly.JavaScript.provideFunction_( - 'lists_repeat', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(value, n) {', - ' var array = [];', - ' for (var i = 0; i < n; i++) {', - ' array[i] = value;', - ' }', - ' return array;', - '}']); - var argument0 = Blockly.JavaScript.valueToCode(block, 'ITEM', - Blockly.JavaScript.ORDER_COMMA) || 'null'; - var argument1 = Blockly.JavaScript.valueToCode(block, 'NUM', - Blockly.JavaScript.ORDER_COMMA) || '0'; - var code = functionName + '(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['lists_length'] = function(block) { - // String or array length. - var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_FUNCTION_CALL) || '[]'; - return [argument0 + '.length', Blockly.JavaScript.ORDER_MEMBER]; -}; - -Blockly.JavaScript['lists_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_MEMBER) || '[]'; - return ['!' + argument0 + '.length', Blockly.JavaScript.ORDER_LOGICAL_NOT]; -}; - -Blockly.JavaScript['lists_indexOf'] = function(block) { - // Find an item in the list. - var operator = block.getFieldValue('END') == 'FIRST' ? - 'indexOf' : 'lastIndexOf'; - var argument0 = Blockly.JavaScript.valueToCode(block, 'FIND', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - var argument1 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_MEMBER) || '[]'; - var code = argument1 + '.' + operator + '(' + argument0 + ') + 1'; - return [code, Blockly.JavaScript.ORDER_MEMBER]; -}; - -Blockly.JavaScript['lists_getIndex'] = function(block) { - // Get element at index. - // Note: Until January 2013 this block did not have MODE or WHERE inputs. - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.JavaScript.valueToCode(block, 'AT', - Blockly.JavaScript.ORDER_UNARY_NEGATION) || '1'; - var list = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_MEMBER) || '[]'; - - if (where == 'FIRST') { - if (mode == 'GET') { - var code = list + '[0]'; - return [code, Blockly.JavaScript.ORDER_MEMBER]; - } else if (mode == 'GET_REMOVE') { - var code = list + '.shift()'; - return [code, Blockly.JavaScript.ORDER_MEMBER]; - } else if (mode == 'REMOVE') { - return list + '.shift();\n'; - } - } else if (where == 'LAST') { - if (mode == 'GET') { - var code = list + '.slice(-1)[0]'; - return [code, Blockly.JavaScript.ORDER_MEMBER]; - } else if (mode == 'GET_REMOVE') { - var code = list + '.pop()'; - return [code, Blockly.JavaScript.ORDER_MEMBER]; - } else if (mode == 'REMOVE') { - return list + '.pop();\n'; - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseFloat(at) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - if (mode == 'GET') { - var code = list + '[' + at + ']'; - return [code, Blockly.JavaScript.ORDER_MEMBER]; - } else if (mode == 'GET_REMOVE') { - var code = list + '.splice(' + at + ', 1)[0]'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return list + '.splice(' + at + ', 1);\n'; - } - } else if (where == 'FROM_END') { - if (mode == 'GET') { - var code = list + '.slice(-' + at + ')[0]'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') { - var functionName = Blockly.JavaScript.provideFunction_( - 'lists_remove_from_end', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(list, x) {', - ' x = list.length - x;', - ' return list.splice(x, 1)[0];', - '}']); - code = functionName + '(' + list + ', ' + at + ')'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + ';\n'; - } - } - } else if (where == 'RANDOM') { - var functionName = Blockly.JavaScript.provideFunction_( - 'lists_get_random_item', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(list, remove) {', - ' var x = Math.floor(Math.random() * list.length);', - ' if (remove) {', - ' return list.splice(x, 1)[0];', - ' } else {', - ' return list[x];', - ' }', - '}']); - code = functionName + '(' + list + ', ' + (mode != 'GET') + ')'; - if (mode == 'GET' || mode == 'GET_REMOVE') { - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + ';\n'; - } - } - throw 'Unhandled combination (lists_getIndex).'; -}; - -Blockly.JavaScript['lists_setIndex'] = function(block) { - // Set element at index. - // Note: Until February 2013 this block did not have MODE or WHERE inputs. - var list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_MEMBER) || '[]'; - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.JavaScript.valueToCode(block, 'AT', - Blockly.JavaScript.ORDER_NONE) || '1'; - var value = Blockly.JavaScript.valueToCode(block, 'TO', - Blockly.JavaScript.ORDER_ASSIGNMENT) || 'null'; - // Cache non-trivial values to variables to prevent repeated look-ups. - // Closure, which accesses and modifies 'list'. - function cacheList() { - if (list.match(/^\w+$/)) { - return ''; - } - var listVar = Blockly.JavaScript.variableDB_.getDistinctName( - 'tmp_list', Blockly.Variables.NAME_TYPE); - var code = 'var ' + listVar + ' = ' + list + ';\n'; - list = listVar; - return code; - } - if (where == 'FIRST') { - if (mode == 'SET') { - return list + '[0] = ' + value + ';\n'; - } else if (mode == 'INSERT') { - return list + '.unshift(' + value + ');\n'; - } - } else if (where == 'LAST') { - if (mode == 'SET') { - var code = cacheList(); - code += list + '[' + list + '.length - 1] = ' + value + ';\n'; - return code; - } else if (mode == 'INSERT') { - return list + '.push(' + value + ');\n'; - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseFloat(at) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - if (mode == 'SET') { - return list + '[' + at + '] = ' + value + ';\n'; - } else if (mode == 'INSERT') { - return list + '.splice(' + at + ', 0, ' + value + ');\n'; - } - } else if (where == 'FROM_END') { - var code = cacheList(); - if (mode == 'SET') { - code += list + '[' + list + '.length - ' + at + '] = ' + value + ';\n'; - return code; - } else if (mode == 'INSERT') { - code += list + '.splice(' + list + '.length - ' + at + ', 0, ' + value + - ');\n'; - return code; - } - } else if (where == 'RANDOM') { - var code = cacheList(); - var xVar = Blockly.JavaScript.variableDB_.getDistinctName( - 'tmp_x', Blockly.Variables.NAME_TYPE); - code += 'var ' + xVar + ' = Math.floor(Math.random() * ' + list + - '.length);\n'; - if (mode == 'SET') { - code += list + '[' + xVar + '] = ' + value + ';\n'; - return code; - } else if (mode == 'INSERT') { - code += list + '.splice(' + xVar + ', 0, ' + value + ');\n'; - return code; - } - } - throw 'Unhandled combination (lists_setIndex).'; -}; - -Blockly.JavaScript['lists_getSublist'] = function(block) { - // Get sublist. - var list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_MEMBER) || '[]'; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.JavaScript.valueToCode(block, 'AT1', - Blockly.JavaScript.ORDER_NONE) || '1'; - var at2 = Blockly.JavaScript.valueToCode(block, 'AT2', - Blockly.JavaScript.ORDER_NONE) || '1'; - if (where1 == 'FIRST' && where2 == 'LAST') { - var code = list + '.concat()'; - } else { - var functionName = Blockly.JavaScript.provideFunction_( - 'lists_get_sublist', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(list, where1, at1, where2, at2) {', - ' function getAt(where, at) {', - ' if (where == \'FROM_START\') {', - ' at--;', - ' } else if (where == \'FROM_END\') {', - ' at = list.length - at;', - ' } else if (where == \'FIRST\') {', - ' at = 0;', - ' } else if (where == \'LAST\') {', - ' at = list.length - 1;', - ' } else {', - ' throw \'Unhandled option (lists_getSublist).\';', - ' }', - ' return at;', - ' }', - ' at1 = getAt(where1, at1);', - ' at2 = getAt(where2, at2) + 1;', - ' return list.slice(at1, at2);', - '}']); - var code = functionName + '(' + list + ', \'' + - where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; - } - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['lists_split'] = function(block) { - // Block for splitting text into a list, or joining a list into text. - var value_input = Blockly.JavaScript.valueToCode(block, 'INPUT', - Blockly.JavaScript.ORDER_MEMBER); - var value_delim = Blockly.JavaScript.valueToCode(block, 'DELIM', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - var mode = block.getFieldValue('MODE'); - if (mode == 'SPLIT') { - if (!value_input) { - value_input = '\'\''; - } - var functionName = 'split'; - } else if (mode == 'JOIN') { - if (!value_input) { - value_input = '[]'; - } - var functionName = 'join'; - } else { - throw 'Unknown mode: ' + mode; - } - var code = value_input + '.' + functionName + '(' + value_delim + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/logic.js b/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/logic.js deleted file mode 100644 index 07ee35b..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/logic.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating JavaScript for logic blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.JavaScript.logic'); - -goog.require('Blockly.JavaScript'); - - -Blockly.JavaScript['controls_if'] = function(block) { - // If/elseif/else condition. - var n = 0; - var argument = Blockly.JavaScript.valueToCode(block, 'IF' + n, - Blockly.JavaScript.ORDER_NONE) || 'false'; - var branch = Blockly.JavaScript.statementToCode(block, 'DO' + n); - var code = 'if (' + argument + ') {\n' + branch + '}'; - for (n = 1; n <= block.elseifCount_; n++) { - argument = Blockly.JavaScript.valueToCode(block, 'IF' + n, - Blockly.JavaScript.ORDER_NONE) || 'false'; - branch = Blockly.JavaScript.statementToCode(block, 'DO' + n); - code += ' else if (' + argument + ') {\n' + branch + '}'; - } - if (block.elseCount_) { - branch = Blockly.JavaScript.statementToCode(block, 'ELSE'); - code += ' else {\n' + branch + '}'; - } - return code + '\n'; -}; - -Blockly.JavaScript['logic_compare'] = function(block) { - // Comparison operator. - var OPERATORS = { - 'EQ': '==', - 'NEQ': '!=', - 'LT': '<', - 'LTE': '<=', - 'GT': '>', - 'GTE': '>=' - }; - var operator = OPERATORS[block.getFieldValue('OP')]; - var order = (operator == '==' || operator == '!=') ? - Blockly.JavaScript.ORDER_EQUALITY : Blockly.JavaScript.ORDER_RELATIONAL; - var argument0 = Blockly.JavaScript.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.JavaScript.valueToCode(block, 'B', order) || '0'; - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.JavaScript['logic_operation'] = function(block) { - // Operations 'and', 'or'. - var operator = (block.getFieldValue('OP') == 'AND') ? '&&' : '||'; - var order = (operator == '&&') ? Blockly.JavaScript.ORDER_LOGICAL_AND : - Blockly.JavaScript.ORDER_LOGICAL_OR; - var argument0 = Blockly.JavaScript.valueToCode(block, 'A', order); - var argument1 = Blockly.JavaScript.valueToCode(block, 'B', order); - if (!argument0 && !argument1) { - // If there are no arguments, then the return value is false. - argument0 = 'false'; - argument1 = 'false'; - } else { - // Single missing arguments have no effect on the return value. - var defaultArgument = (operator == '&&') ? 'true' : 'false'; - if (!argument0) { - argument0 = defaultArgument; - } - if (!argument1) { - argument1 = defaultArgument; - } - } - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.JavaScript['logic_negate'] = function(block) { - // Negation. - var order = Blockly.JavaScript.ORDER_LOGICAL_NOT; - var argument0 = Blockly.JavaScript.valueToCode(block, 'BOOL', order) || - 'true'; - var code = '!' + argument0; - return [code, order]; -}; - -Blockly.JavaScript['logic_boolean'] = function(block) { - // Boolean values true and false. - var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'true' : 'false'; - return [code, Blockly.JavaScript.ORDER_ATOMIC]; -}; - -Blockly.JavaScript['logic_null'] = function(block) { - // Null data type. - return ['null', Blockly.JavaScript.ORDER_ATOMIC]; -}; - -Blockly.JavaScript['logic_ternary'] = function(block) { - // Ternary operator. - var value_if = Blockly.JavaScript.valueToCode(block, 'IF', - Blockly.JavaScript.ORDER_CONDITIONAL) || 'false'; - var value_then = Blockly.JavaScript.valueToCode(block, 'THEN', - Blockly.JavaScript.ORDER_CONDITIONAL) || 'null'; - var value_else = Blockly.JavaScript.valueToCode(block, 'ELSE', - Blockly.JavaScript.ORDER_CONDITIONAL) || 'null'; - var code = value_if + ' ? ' + value_then + ' : ' + value_else; - return [code, Blockly.JavaScript.ORDER_CONDITIONAL]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/loops.js b/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/loops.js deleted file mode 100644 index 9445804..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/loops.js +++ /dev/null @@ -1,175 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating JavaScript for loop blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.JavaScript.loops'); - -goog.require('Blockly.JavaScript'); - - -Blockly.JavaScript['controls_repeat_ext'] = function(block) { - // Repeat n times. - if (block.getField('TIMES')) { - // Internal number. - var repeats = String(Number(block.getFieldValue('TIMES'))); - } else { - // External number. - var repeats = Blockly.JavaScript.valueToCode(block, 'TIMES', - Blockly.JavaScript.ORDER_ASSIGNMENT) || '0'; - } - var branch = Blockly.JavaScript.statementToCode(block, 'DO'); - branch = Blockly.JavaScript.addLoopTrap(branch, block.id); - var code = ''; - var loopVar = Blockly.JavaScript.variableDB_.getDistinctName( - 'count', Blockly.Variables.NAME_TYPE); - var endVar = repeats; - if (!repeats.match(/^\w+$/) && !Blockly.isNumber(repeats)) { - var endVar = Blockly.JavaScript.variableDB_.getDistinctName( - 'repeat_end', Blockly.Variables.NAME_TYPE); - code += 'var ' + endVar + ' = ' + repeats + ';\n'; - } - code += 'for (var ' + loopVar + ' = 0; ' + - loopVar + ' < ' + endVar + '; ' + - loopVar + '++) {\n' + - branch + '}\n'; - return code; -}; - -Blockly.JavaScript['controls_repeat'] = - Blockly.JavaScript['controls_repeat_ext']; - -Blockly.JavaScript['controls_whileUntil'] = function(block) { - // Do while/until loop. - var until = block.getFieldValue('MODE') == 'UNTIL'; - var argument0 = Blockly.JavaScript.valueToCode(block, 'BOOL', - until ? Blockly.JavaScript.ORDER_LOGICAL_NOT : - Blockly.JavaScript.ORDER_NONE) || 'false'; - var branch = Blockly.JavaScript.statementToCode(block, 'DO'); - branch = Blockly.JavaScript.addLoopTrap(branch, block.id); - if (until) { - argument0 = '!' + argument0; - } - return 'while (' + argument0 + ') {\n' + branch + '}\n'; -}; - -Blockly.JavaScript['controls_for'] = function(block) { - // For loop. - var variable0 = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.JavaScript.valueToCode(block, 'FROM', - Blockly.JavaScript.ORDER_ASSIGNMENT) || '0'; - var argument1 = Blockly.JavaScript.valueToCode(block, 'TO', - Blockly.JavaScript.ORDER_ASSIGNMENT) || '0'; - var increment = Blockly.JavaScript.valueToCode(block, 'BY', - Blockly.JavaScript.ORDER_ASSIGNMENT) || '1'; - var branch = Blockly.JavaScript.statementToCode(block, 'DO'); - branch = Blockly.JavaScript.addLoopTrap(branch, block.id); - var code; - if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && - Blockly.isNumber(increment)) { - // All arguments are simple numbers. - var up = parseFloat(argument0) <= parseFloat(argument1); - code = 'for (' + variable0 + ' = ' + argument0 + '; ' + - variable0 + (up ? ' <= ' : ' >= ') + argument1 + '; ' + - variable0; - var step = Math.abs(parseFloat(increment)); - if (step == 1) { - code += up ? '++' : '--'; - } else { - code += (up ? ' += ' : ' -= ') + step; - } - code += ') {\n' + branch + '}\n'; - } else { - code = ''; - // Cache non-trivial values to variables to prevent repeated look-ups. - var startVar = argument0; - if (!argument0.match(/^\w+$/) && !Blockly.isNumber(argument0)) { - startVar = Blockly.JavaScript.variableDB_.getDistinctName( - variable0 + '_start', Blockly.Variables.NAME_TYPE); - code += 'var ' + startVar + ' = ' + argument0 + ';\n'; - } - var endVar = argument1; - if (!argument1.match(/^\w+$/) && !Blockly.isNumber(argument1)) { - var endVar = Blockly.JavaScript.variableDB_.getDistinctName( - variable0 + '_end', Blockly.Variables.NAME_TYPE); - code += 'var ' + endVar + ' = ' + argument1 + ';\n'; - } - // Determine loop direction at start, in case one of the bounds - // changes during loop execution. - var incVar = Blockly.JavaScript.variableDB_.getDistinctName( - variable0 + '_inc', Blockly.Variables.NAME_TYPE); - code += 'var ' + incVar + ' = '; - if (Blockly.isNumber(increment)) { - code += Math.abs(increment) + ';\n'; - } else { - code += 'Math.abs(' + increment + ');\n'; - } - code += 'if (' + startVar + ' > ' + endVar + ') {\n'; - code += Blockly.JavaScript.INDENT + incVar + ' = -' + incVar + ';\n'; - code += '}\n'; - code += 'for (' + variable0 + ' = ' + startVar + ';\n' + - ' ' + incVar + ' >= 0 ? ' + - variable0 + ' <= ' + endVar + ' : ' + - variable0 + ' >= ' + endVar + ';\n' + - ' ' + variable0 + ' += ' + incVar + ') {\n' + - branch + '}\n'; - } - return code; -}; - -Blockly.JavaScript['controls_forEach'] = function(block) { - // For each loop. - var variable0 = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_ASSIGNMENT) || '[]'; - var branch = Blockly.JavaScript.statementToCode(block, 'DO'); - branch = Blockly.JavaScript.addLoopTrap(branch, block.id); - var code = ''; - // Cache non-trivial values to variables to prevent repeated look-ups. - var listVar = argument0; - if (!argument0.match(/^\w+$/)) { - listVar = Blockly.JavaScript.variableDB_.getDistinctName( - variable0 + '_list', Blockly.Variables.NAME_TYPE); - code += 'var ' + listVar + ' = ' + argument0 + ';\n'; - } - var indexVar = Blockly.JavaScript.variableDB_.getDistinctName( - variable0 + '_index', Blockly.Variables.NAME_TYPE); - branch = Blockly.JavaScript.INDENT + variable0 + ' = ' + - listVar + '[' + indexVar + '];\n' + branch; - code += 'for (var ' + indexVar + ' in ' + listVar + ') {\n' + branch + '}\n'; - return code; -}; - -Blockly.JavaScript['controls_flow_statements'] = function(block) { - // Flow statements: continue, break. - switch (block.getFieldValue('FLOW')) { - case 'BREAK': - return 'break;\n'; - case 'CONTINUE': - return 'continue;\n'; - } - throw 'Unknown flow statement.'; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/math.js b/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/math.js deleted file mode 100644 index f0ecc62..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/math.js +++ /dev/null @@ -1,411 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating JavaScript for math blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.JavaScript.math'); - -goog.require('Blockly.JavaScript'); - - -Blockly.JavaScript['math_number'] = function(block) { - // Numeric value. - var code = parseFloat(block.getFieldValue('NUM')); - return [code, Blockly.JavaScript.ORDER_ATOMIC]; -}; - -Blockly.JavaScript['math_arithmetic'] = function(block) { - // Basic arithmetic operators, and power. - var OPERATORS = { - 'ADD': [' + ', Blockly.JavaScript.ORDER_ADDITION], - 'MINUS': [' - ', Blockly.JavaScript.ORDER_SUBTRACTION], - 'MULTIPLY': [' * ', Blockly.JavaScript.ORDER_MULTIPLICATION], - 'DIVIDE': [' / ', Blockly.JavaScript.ORDER_DIVISION], - 'POWER': [null, Blockly.JavaScript.ORDER_COMMA] // Handle power separately. - }; - var tuple = OPERATORS[block.getFieldValue('OP')]; - var operator = tuple[0]; - var order = tuple[1]; - var argument0 = Blockly.JavaScript.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.JavaScript.valueToCode(block, 'B', order) || '0'; - var code; - // Power in JavaScript requires a special case since it has no operator. - if (!operator) { - code = 'Math.pow(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } - code = argument0 + operator + argument1; - return [code, order]; -}; - -Blockly.JavaScript['math_single'] = function(block) { - // Math operators with single operand. - var operator = block.getFieldValue('OP'); - var code; - var arg; - if (operator == 'NEG') { - // Negation is a special case given its different operator precedence. - arg = Blockly.JavaScript.valueToCode(block, 'NUM', - Blockly.JavaScript.ORDER_UNARY_NEGATION) || '0'; - if (arg[0] == '-') { - // --3 is not legal in JS. - arg = ' ' + arg; - } - code = '-' + arg; - return [code, Blockly.JavaScript.ORDER_UNARY_NEGATION]; - } - if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') { - arg = Blockly.JavaScript.valueToCode(block, 'NUM', - Blockly.JavaScript.ORDER_DIVISION) || '0'; - } else { - arg = Blockly.JavaScript.valueToCode(block, 'NUM', - Blockly.JavaScript.ORDER_NONE) || '0'; - } - // First, handle cases which generate values that don't need parentheses - // wrapping the code. - switch (operator) { - case 'ABS': - code = 'Math.abs(' + arg + ')'; - break; - case 'ROOT': - code = 'Math.sqrt(' + arg + ')'; - break; - case 'LN': - code = 'Math.log(' + arg + ')'; - break; - case 'EXP': - code = 'Math.exp(' + arg + ')'; - break; - case 'POW10': - code = 'Math.pow(10,' + arg + ')'; - break; - case 'ROUND': - code = 'Math.round(' + arg + ')'; - break; - case 'ROUNDUP': - code = 'Math.ceil(' + arg + ')'; - break; - case 'ROUNDDOWN': - code = 'Math.floor(' + arg + ')'; - break; - case 'SIN': - code = 'Math.sin(' + arg + ' / 180 * Math.PI)'; - break; - case 'COS': - code = 'Math.cos(' + arg + ' / 180 * Math.PI)'; - break; - case 'TAN': - code = 'Math.tan(' + arg + ' / 180 * Math.PI)'; - break; - } - if (code) { - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } - // Second, handle cases which generate values that may need parentheses - // wrapping the code. - switch (operator) { - case 'LOG10': - code = 'Math.log(' + arg + ') / Math.log(10)'; - break; - case 'ASIN': - code = 'Math.asin(' + arg + ') / Math.PI * 180'; - break; - case 'ACOS': - code = 'Math.acos(' + arg + ') / Math.PI * 180'; - break; - case 'ATAN': - code = 'Math.atan(' + arg + ') / Math.PI * 180'; - break; - default: - throw 'Unknown math operator: ' + operator; - } - return [code, Blockly.JavaScript.ORDER_DIVISION]; -}; - -Blockly.JavaScript['math_constant'] = function(block) { - // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. - var CONSTANTS = { - 'PI': ['Math.PI', Blockly.JavaScript.ORDER_MEMBER], - 'E': ['Math.E', Blockly.JavaScript.ORDER_MEMBER], - 'GOLDEN_RATIO': - ['(1 + Math.sqrt(5)) / 2', Blockly.JavaScript.ORDER_DIVISION], - 'SQRT2': ['Math.SQRT2', Blockly.JavaScript.ORDER_MEMBER], - 'SQRT1_2': ['Math.SQRT1_2', Blockly.JavaScript.ORDER_MEMBER], - 'INFINITY': ['Infinity', Blockly.JavaScript.ORDER_ATOMIC] - }; - return CONSTANTS[block.getFieldValue('CONSTANT')]; -}; - -Blockly.JavaScript['math_number_property'] = function(block) { - // Check if a number is even, odd, prime, whole, positive, or negative - // or if it is divisible by certain number. Returns true or false. - var number_to_check = Blockly.JavaScript.valueToCode(block, 'NUMBER_TO_CHECK', - Blockly.JavaScript.ORDER_MODULUS) || '0'; - var dropdown_property = block.getFieldValue('PROPERTY'); - var code; - if (dropdown_property == 'PRIME') { - // Prime is a special case as it is not a one-liner test. - var functionName = Blockly.JavaScript.provideFunction_( - 'math_isPrime', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '(n) {', - ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods', - ' if (n == 2 || n == 3) {', - ' return true;', - ' }', - ' // False if n is NaN, negative, is 1, or not whole.', - ' // And false if n is divisible by 2 or 3.', - ' if (isNaN(n) || n <= 1 || n % 1 != 0 || n % 2 == 0 ||' + - ' n % 3 == 0) {', - ' return false;', - ' }', - ' // Check all the numbers of form 6k +/- 1, up to sqrt(n).', - ' for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {', - ' if (n % (x - 1) == 0 || n % (x + 1) == 0) {', - ' return false;', - ' }', - ' }', - ' return true;', - '}']); - code = functionName + '(' + number_to_check + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } - switch (dropdown_property) { - case 'EVEN': - code = number_to_check + ' % 2 == 0'; - break; - case 'ODD': - code = number_to_check + ' % 2 == 1'; - break; - case 'WHOLE': - code = number_to_check + ' % 1 == 0'; - break; - case 'POSITIVE': - code = number_to_check + ' > 0'; - break; - case 'NEGATIVE': - code = number_to_check + ' < 0'; - break; - case 'DIVISIBLE_BY': - var divisor = Blockly.JavaScript.valueToCode(block, 'DIVISOR', - Blockly.JavaScript.ORDER_MODULUS) || '0'; - code = number_to_check + ' % ' + divisor + ' == 0'; - break; - } - return [code, Blockly.JavaScript.ORDER_EQUALITY]; -}; - -Blockly.JavaScript['math_change'] = function(block) { - // Add to a variable in place. - var argument0 = Blockly.JavaScript.valueToCode(block, 'DELTA', - Blockly.JavaScript.ORDER_ADDITION) || '0'; - var varName = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - return varName + ' = (typeof ' + varName + ' == \'number\' ? ' + varName + - ' : 0) + ' + argument0 + ';\n'; -}; - -// Rounding functions have a single operand. -Blockly.JavaScript['math_round'] = Blockly.JavaScript['math_single']; -// Trigonometry functions have a single operand. -Blockly.JavaScript['math_trig'] = Blockly.JavaScript['math_single']; - -Blockly.JavaScript['math_on_list'] = function(block) { - // Math functions for lists. - var func = block.getFieldValue('OP'); - var list, code; - switch (func) { - case 'SUM': - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_MEMBER) || '[]'; - code = list + '.reduce(function(x, y) {return x + y;})'; - break; - case 'MIN': - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_COMMA) || '[]'; - code = 'Math.min.apply(null, ' + list + ')'; - break; - case 'MAX': - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_COMMA) || '[]'; - code = 'Math.max.apply(null, ' + list + ')'; - break; - case 'AVERAGE': - // math_median([null,null,1,3]) == 2.0. - var functionName = Blockly.JavaScript.provideFunction_( - 'math_mean', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(myList) {', - ' return myList.reduce(function(x, y) {return x + y;}) / ' + - 'myList.length;', - '}']); - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - case 'MEDIAN': - // math_median([null,null,1,3]) == 2.0. - var functionName = Blockly.JavaScript.provideFunction_( - 'math_median', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(myList) {', - ' var localList = myList.filter(function (x) ' + - '{return typeof x == \'number\';});', - ' if (!localList.length) return null;', - ' localList.sort(function(a, b) {return b - a;});', - ' if (localList.length % 2 == 0) {', - ' return (localList[localList.length / 2 - 1] + ' + - 'localList[localList.length / 2]) / 2;', - ' } else {', - ' return localList[(localList.length - 1) / 2];', - ' }', - '}']); - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - case 'MODE': - // As a list of numbers can contain more than one mode, - // the returned result is provided as an array. - // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]. - var functionName = Blockly.JavaScript.provideFunction_( - 'math_modes', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(values) {', - ' var modes = [];', - ' var counts = [];', - ' var maxCount = 0;', - ' for (var i = 0; i < values.length; i++) {', - ' var value = values[i];', - ' var found = false;', - ' var thisCount;', - ' for (var j = 0; j < counts.length; j++) {', - ' if (counts[j][0] === value) {', - ' thisCount = ++counts[j][1];', - ' found = true;', - ' break;', - ' }', - ' }', - ' if (!found) {', - ' counts.push([value, 1]);', - ' thisCount = 1;', - ' }', - ' maxCount = Math.max(thisCount, maxCount);', - ' }', - ' for (var j = 0; j < counts.length; j++) {', - ' if (counts[j][1] == maxCount) {', - ' modes.push(counts[j][0]);', - ' }', - ' }', - ' return modes;', - '}']); - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - case 'STD_DEV': - var functionName = Blockly.JavaScript.provideFunction_( - 'math_standard_deviation', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(numbers) {', - ' var n = numbers.length;', - ' if (!n) return null;', - ' var mean = numbers.reduce(function(x, y) {return x + y;}) / n;', - ' var variance = 0;', - ' for (var j = 0; j < n; j++) {', - ' variance += Math.pow(numbers[j] - mean, 2);', - ' }', - ' variance = variance / n;', - ' return Math.sqrt(variance);', - '}']); - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - case 'RANDOM': - var functionName = Blockly.JavaScript.provideFunction_( - 'math_random_list', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(list) {', - ' var x = Math.floor(Math.random() * list.length);', - ' return list[x];', - '}']); - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - default: - throw 'Unknown operator: ' + func; - } - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['math_modulo'] = function(block) { - // Remainder computation. - var argument0 = Blockly.JavaScript.valueToCode(block, 'DIVIDEND', - Blockly.JavaScript.ORDER_MODULUS) || '0'; - var argument1 = Blockly.JavaScript.valueToCode(block, 'DIVISOR', - Blockly.JavaScript.ORDER_MODULUS) || '0'; - var code = argument0 + ' % ' + argument1; - return [code, Blockly.JavaScript.ORDER_MODULUS]; -}; - -Blockly.JavaScript['math_constrain'] = function(block) { - // Constrain a number between two limits. - var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_COMMA) || '0'; - var argument1 = Blockly.JavaScript.valueToCode(block, 'LOW', - Blockly.JavaScript.ORDER_COMMA) || '0'; - var argument2 = Blockly.JavaScript.valueToCode(block, 'HIGH', - Blockly.JavaScript.ORDER_COMMA) || 'Infinity'; - var code = 'Math.min(Math.max(' + argument0 + ', ' + argument1 + '), ' + - argument2 + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['math_random_int'] = function(block) { - // Random integer between [X] and [Y]. - var argument0 = Blockly.JavaScript.valueToCode(block, 'FROM', - Blockly.JavaScript.ORDER_COMMA) || '0'; - var argument1 = Blockly.JavaScript.valueToCode(block, 'TO', - Blockly.JavaScript.ORDER_COMMA) || '0'; - var functionName = Blockly.JavaScript.provideFunction_( - 'math_random_int', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(a, b) {', - ' if (a > b) {', - ' // Swap a and b to ensure a is smaller.', - ' var c = a;', - ' a = b;', - ' b = c;', - ' }', - ' return Math.floor(Math.random() * (b - a + 1) + a);', - '}']); - var code = functionName + '(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['math_random_float'] = function(block) { - // Random fraction between 0 and 1. - return ['Math.random()', Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/procedures.js b/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/procedures.js deleted file mode 100644 index f2ca15a..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/procedures.js +++ /dev/null @@ -1,108 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating JavaScript for procedure blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.JavaScript.procedures'); - -goog.require('Blockly.JavaScript'); - - -Blockly.JavaScript['procedures_defreturn'] = function(block) { - // Define a procedure with a return value. - var funcName = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var branch = Blockly.JavaScript.statementToCode(block, 'STACK'); - if (Blockly.JavaScript.STATEMENT_PREFIX) { - branch = Blockly.JavaScript.prefixLines( - Blockly.JavaScript.STATEMENT_PREFIX.replace(/%1/g, - '\'' + block.id + '\''), Blockly.JavaScript.INDENT) + branch; - } - if (Blockly.JavaScript.INFINITE_LOOP_TRAP) { - branch = Blockly.JavaScript.INFINITE_LOOP_TRAP.replace(/%1/g, - '\'' + block.id + '\'') + branch; - } - var returnValue = Blockly.JavaScript.valueToCode(block, 'RETURN', - Blockly.JavaScript.ORDER_NONE) || ''; - if (returnValue) { - returnValue = ' return ' + returnValue + ';\n'; - } - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.JavaScript.variableDB_.getName(block.arguments_[x], - Blockly.Variables.NAME_TYPE); - } - var code = 'function ' + funcName + '(' + args.join(', ') + ') {\n' + - branch + returnValue + '}'; - code = Blockly.JavaScript.scrub_(block, code); - Blockly.JavaScript.definitions_[funcName] = code; - return null; -}; - -// Defining a procedure without a return value uses the same generator as -// a procedure with a return value. -Blockly.JavaScript['procedures_defnoreturn'] = - Blockly.JavaScript['procedures_defreturn']; - -Blockly.JavaScript['procedures_callreturn'] = function(block) { - // Call a procedure with a return value. - var funcName = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.JavaScript.valueToCode(block, 'ARG' + x, - Blockly.JavaScript.ORDER_COMMA) || 'null'; - } - var code = funcName + '(' + args.join(', ') + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['procedures_callnoreturn'] = function(block) { - // Call a procedure with no return value. - var funcName = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.JavaScript.valueToCode(block, 'ARG' + x, - Blockly.JavaScript.ORDER_COMMA) || 'null'; - } - var code = funcName + '(' + args.join(', ') + ');\n'; - return code; -}; - -Blockly.JavaScript['procedures_ifreturn'] = function(block) { - // Conditionally return value from a procedure. - var condition = Blockly.JavaScript.valueToCode(block, 'CONDITION', - Blockly.JavaScript.ORDER_NONE) || 'false'; - var code = 'if (' + condition + ') {\n'; - if (block.hasReturnValue_) { - var value = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_NONE) || 'null'; - code += ' return ' + value + ';\n'; - } else { - code += ' return;\n'; - } - code += '}\n'; - return code; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/text.js b/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/text.js deleted file mode 100644 index 481aed4..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/javascript/text.js +++ /dev/null @@ -1,254 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating JavaScript for text blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.JavaScript.texts'); - -goog.require('Blockly.JavaScript'); - - -Blockly.JavaScript['text'] = function(block) { - // Text value. - var code = Blockly.JavaScript.quote_(block.getFieldValue('TEXT')); - return [code, Blockly.JavaScript.ORDER_ATOMIC]; -}; - -Blockly.JavaScript['text_join'] = function(block) { - // Create a string made up of any number of elements of any type. - var code; - if (block.itemCount_ == 0) { - return ['\'\'', Blockly.JavaScript.ORDER_ATOMIC]; - } else if (block.itemCount_ == 1) { - var argument0 = Blockly.JavaScript.valueToCode(block, 'ADD0', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - code = 'String(' + argument0 + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } else if (block.itemCount_ == 2) { - var argument0 = Blockly.JavaScript.valueToCode(block, 'ADD0', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - var argument1 = Blockly.JavaScript.valueToCode(block, 'ADD1', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - code = 'String(' + argument0 + ') + String(' + argument1 + ')'; - return [code, Blockly.JavaScript.ORDER_ADDITION]; - } else { - code = new Array(block.itemCount_); - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.JavaScript.valueToCode(block, 'ADD' + n, - Blockly.JavaScript.ORDER_COMMA) || '\'\''; - } - code = '[' + code.join(',') + '].join(\'\')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } -}; - -Blockly.JavaScript['text_append'] = function(block) { - // Append to a variable in place. - var varName = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.JavaScript.valueToCode(block, 'TEXT', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - return varName + ' = String(' + varName + ') + String(' + argument0 + ');\n'; -}; - -Blockly.JavaScript['text_length'] = function(block) { - // String or array length. - var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_FUNCTION_CALL) || '\'\''; - return [argument0 + '.length', Blockly.JavaScript.ORDER_MEMBER]; -}; - -Blockly.JavaScript['text_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_MEMBER) || '\'\''; - return ['!' + argument0 + '.length', Blockly.JavaScript.ORDER_LOGICAL_NOT]; -}; - -Blockly.JavaScript['text_indexOf'] = function(block) { - // Search the text for a substring. - var operator = block.getFieldValue('END') == 'FIRST' ? - 'indexOf' : 'lastIndexOf'; - var argument0 = Blockly.JavaScript.valueToCode(block, 'FIND', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - var argument1 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_MEMBER) || '\'\''; - var code = argument1 + '.' + operator + '(' + argument0 + ') + 1'; - return [code, Blockly.JavaScript.ORDER_MEMBER]; -}; - -Blockly.JavaScript['text_charAt'] = function(block) { - // Get letter at index. - // Note: Until January 2013 this block did not have the WHERE input. - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.JavaScript.valueToCode(block, 'AT', - Blockly.JavaScript.ORDER_UNARY_NEGATION) || '1'; - var text = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_MEMBER) || '\'\''; - switch (where) { - case 'FIRST': - var code = text + '.charAt(0)'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - case 'LAST': - var code = text + '.slice(-1)'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - case 'FROM_START': - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseFloat(at) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - var code = text + '.charAt(' + at + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - case 'FROM_END': - var code = text + '.slice(-' + at + ').charAt(0)'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - case 'RANDOM': - var functionName = Blockly.JavaScript.provideFunction_( - 'text_random_letter', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(text) {', - ' var x = Math.floor(Math.random() * text.length);', - ' return text[x];', - '}']); - code = functionName + '(' + text + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } - throw 'Unhandled option (text_charAt).'; -}; - -Blockly.JavaScript['text_getSubstring'] = function(block) { - // Get substring. - var text = Blockly.JavaScript.valueToCode(block, 'STRING', - Blockly.JavaScript.ORDER_MEMBER) || '\'\''; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.JavaScript.valueToCode(block, 'AT1', - Blockly.JavaScript.ORDER_NONE) || '1'; - var at2 = Blockly.JavaScript.valueToCode(block, 'AT2', - Blockly.JavaScript.ORDER_NONE) || '1'; - if (where1 == 'FIRST' && where2 == 'LAST') { - var code = text; - } else { - var functionName = Blockly.JavaScript.provideFunction_( - 'text_get_substring', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(text, where1, at1, where2, at2) {', - ' function getAt(where, at) {', - ' if (where == \'FROM_START\') {', - ' at--;', - ' } else if (where == \'FROM_END\') {', - ' at = text.length - at;', - ' } else if (where == \'FIRST\') {', - ' at = 0;', - ' } else if (where == \'LAST\') {', - ' at = text.length - 1;', - ' } else {', - ' throw \'Unhandled option (text_getSubstring).\';', - ' }', - ' return at;', - ' }', - ' at1 = getAt(where1, at1);', - ' at2 = getAt(where2, at2) + 1;', - ' return text.slice(at1, at2);', - '}']); - var code = functionName + '(' + text + ', \'' + - where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; - } - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['text_changeCase'] = function(block) { - // Change capitalization. - var OPERATORS = { - 'UPPERCASE': '.toUpperCase()', - 'LOWERCASE': '.toLowerCase()', - 'TITLECASE': null - }; - var operator = OPERATORS[block.getFieldValue('CASE')]; - var code; - if (operator) { - // Upper and lower case are functions built into JavaScript. - var argument0 = Blockly.JavaScript.valueToCode(block, 'TEXT', - Blockly.JavaScript.ORDER_MEMBER) || '\'\''; - code = argument0 + operator; - } else { - // Title case is not a native JavaScript function. Define one. - var functionName = Blockly.JavaScript.provideFunction_( - 'text_toTitleCase', - [ 'function ' + - Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '(str) {', - ' return str.replace(/\\S+/g,', - ' function(txt) {return txt[0].toUpperCase() + ' + - 'txt.substring(1).toLowerCase();});', - '}']); - var argument0 = Blockly.JavaScript.valueToCode(block, 'TEXT', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - code = functionName + '(' + argument0 + ')'; - } - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['text_trim'] = function(block) { - // Trim spaces. - var OPERATORS = { - 'LEFT': ".replace(/^[\\s\\xa0]+/, '')", - 'RIGHT': ".replace(/[\\s\\xa0]+$/, '')", - 'BOTH': '.trim()' - }; - var operator = OPERATORS[block.getFieldValue('MODE')]; - var argument0 = Blockly.JavaScript.valueToCode(block, 'TEXT', - Blockly.JavaScript.ORDER_MEMBER) || '\'\''; - return [argument0 + operator, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['text_print'] = function(block) { - // Print statement. - var argument0 = Blockly.JavaScript.valueToCode(block, 'TEXT', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - return 'window.alert(' + argument0 + ');\n'; -}; - -Blockly.JavaScript['text_prompt_ext'] = function(block) { - // Prompt function. - if (block.getField('TEXT')) { - // Internal message. - var msg = Blockly.JavaScript.quote_(block.getFieldValue('TEXT')); - } else { - // External message. - var msg = Blockly.JavaScript.valueToCode(block, 'TEXT', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - } - var code = 'window.prompt(' + msg + ')'; - var toNumber = block.getFieldValue('TYPE') == 'NUMBER'; - if (toNumber) { - code = 'parseFloat(' + code + ')'; - } - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['text_prompt'] = Blockly.JavaScript['text_prompt_ext']; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/lua.js b/src/opsoro/apps/visual_programming/static/blockly/generators/lua.js deleted file mode 100644 index 78b59e6..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/lua.js +++ /dev/null @@ -1,268 +0,0 @@ -/** - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * http://blockly.googlecode.com/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Helper functions for generating Lua for blocks. - * @author ellen.spertus@gmail.com (Ellen Spertus) - */ -'use strict'; - -goog.provide('Blockly.Lua'); - -goog.require('Blockly.Generator'); - - -Blockly.Lua = new Blockly.Generator('Lua'); - -/** - * Note: ComputerCraft uses Lua 5.1, so that's what we use - * [http://www.computercraft.info/forums2/index.php?/topic/15305-lua-52/]. - */ - -/** - * List of illegal variable names. - * This is not intended to be a security feature. Blockly is 100% client-side, - * so bypassing this list is trivial. This is intended to prevent users from - * accidentally clobbering a built-in object or function. - * @private - */ -Blockly.Lua.addReservedWords( - // Special character - '_' + - // From theoriginalbit's script: - // https://github.com/espertus/blockly-lua/issues/6 - '__inext,assert,bit,colors,colours,coroutine,disk,dofile,error,fs,' + - 'fetfenv,getmetatable,gps,help,io,ipairs,keys,loadfile,loadstring,math,' + - 'native,next,os,paintutils,pairs,parallel,pcall,peripheral,print,' + - 'printError,rawequal,rawget,rawset,read,rednet,redstone,rs,select,' + - 'setfenv,setmetatable,sleep,string,table,term,textutils,tonumber,' + - 'tostring,turtle,type,unpack,vector,write,xpcall,_VERSION,__indext,' + - // Not included in the script, probably because it wasn't enabled: - 'HTTP,' + - // Keywords (http://www.lua.org/pil/1.3.html). - 'and,break,do,else,elseif,end,false,for,function,if,in,local,nil,not,or,' + - 'repeat,return,then,true,until,while,' + - // Metamethods (http://www.lua.org/manual/5.2/manual.html). - 'add,sub,mul,div,mod,pow,unm,concat,len,eq,lt,le,index,newindex,call,' + - // Basic functions (http://www.lua.org/manual/5.2/manual.html, section 6.1). - 'assert,collectgarbage,dofile,error,_G,getmetatable,inpairs,load,' + - 'loadfile,next,pairs,pcall,print,rawequal,rawget,rawlen,rawset,select,' + - 'setmetatable,tonumber,tostring,type,_VERSION,xpcall,' + - // Modules (http://www.lua.org/manual/5.2/manual.html, section 6.3). - 'require,package,string,table,math,bit32,io,file,os,debug' -); - -/** - * Order of operation ENUMs. - * http://www.lua.org/manual/5.1/manual.html#2.5.6 - */ -Blockly.Lua.ORDER_ATOMIC = 0; // literals -// The next level was not explicit in documentation and inferred by Ellen. -Blockly.Lua.ORDER_HIGH = 1; // Function calls, tables[] -Blockly.Lua.ORDER_EXPONENTIATION = 2; // ^ -Blockly.Lua.ORDER_UNARY = 3; // not # - () -Blockly.Lua.ORDER_MULTIPLICATIVE = 4; // * / % -Blockly.Lua.ORDER_ADDITIVE = 5; // + - -Blockly.Lua.CONCATENATION = 6; // .. -Blockly.Lua.ORDER_RELATIONAL = 7; // < > <= >= ~= == -Blockly.Lua.ORDER_AND = 8; // and -Blockly.Lua.ORDER_OR = 9; // or -Blockly.Lua.ORDER_NONE = 10; - -/** - * Arbitrary code to inject into locations that risk causing infinite loops. - * Any instances of '%1' will be replaced by the block ID that failed. - * E.g. ' checkTimeout(%1)\n' - * @type ?string - */ -Blockly.Lua.INFINITE_LOOP_TRAP = null; - -/** - * This is used as a placeholder in functions defined using - * Blockly.Lua.provideFunction_. It must not be legal code that could - * legitimately appear in a function definition (or comment), and it must - * not confuse the regular expression parser. - */ -Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ = '{{{}}}'; -Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_REGEXP_ = - new RegExp(Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_, 'g'); - -// Change the default prefix from '$_' to 'var'. -// A prefix is needed to prevent variables from starting with 'lua_' -// or 'LUA_'. -Blockly.Names.PREFIX_ = 'var'; - -/** - * Initialise the database of variable names. - */ -Blockly.Lua.init = function() { - // Create a dictionary of definitions to be printed before the code. - Blockly.Lua.definitions_ = {}; - // Create a dictionary mapping desired function names in definitions_ - // to actual function names (to avoid collisions with user functions). - Blockly.Lua.functionNames_ = {}; - - if (Blockly.Variables) { - if (!Blockly.Lua.variableDB_) { - Blockly.Lua.variableDB_ = - new Blockly.Names(Blockly.Lua.RESERVED_WORDS_); - } else { - Blockly.Lua.variableDB_.reset(); - } - - /* - var variables = Blockly.Variables.allVariables(); - for (var x = 0; x < variables.length; x++) { - defvars[x] = Blockly.Lua.variableDB_.getName(variables[x], - Blockly.Variables.NAME_TYPE) + ' = nil'; - } - Blockly.Lua.definitions_['variables'] = defvars.join('\n'); - */ - } -}; - -Blockly.Lua.SENSOR_REGEXP_ = /\Wsensor\./; - -/** - * Prepend the generated code with the function definitions. - * @param {string} code Generated code. - * @return {string} Completed code. - */ -Blockly.Lua.finish = function(code) { - var definitions = []; - for (var name in Blockly.Lua.definitions_) { - definitions.push(Blockly.Lua.definitions_[name]); - } - var prefix = definitions.join('\n\n'); -/* - if (Blockly.Lua.SENSOR_REGEXP_.test(code) || - Blockly.Lua.SENSOR_REGEXP_.test(prefix)) { - prefix += '\n\n' + - 'function getSensor()\n' + - ' if peripheral and peripheral.getType("right") == "peripheral" then\n' + - ' local per = peripheral.wrap("right")\n' + - ' if per and per.detectBlock and per.detectBlockUp then\n' + - ' return per\n' + - ' end\n' + - ' end\n' + - ' return false\n' + - 'end\n\n' + - 'sensor = getSensor()\n' + - 'if not sensor then\n' + - ' error("Sensor not found")\n' + - 'end\n'; - } -*/ - return prefix.replace(/\n\n+/g, '\n\n').replace(/\n*$/, '\n\n\n') + code; -}; - -/** - * Naked values are top-level blocks with outputs that aren't plugged into - * anything. - * @param {string} line Line of generated code. - * @return {string} Legal line of code. - */ -Blockly.Lua.scrubNakedValue = function(line) { - return line + '\n'; -}; - -/** - * Encode a string as a properly escaped Lua string, complete with quotes. - * @param {string} string Text to encode. - * @return {string} Lua string. - * @private - */ -Blockly.Lua.quote_ = function(string) { - // TODO: This is a quick hack. Replace with goog.string.quote - string = string.replace(/\\/g, '\\\\') - .replace(/\n/g, '\\\n') - .replace(/\%/g, '\\%') - .replace(/'/g, '\\\''); - return '\'' + string + '\''; -}; - -/** - * Common tasks for generating Lua from blocks. - * Handles comments for the specified block and any connected value blocks. - * Calls any statements following this block. - * @param {!Blockly.Block} block The current block. - * @param {string} code The Lua code created for this block. - * @return {string} Lua code with comments and subsequent blocks added. - * @this {Blockly.CodeGenerator} - * @private - */ -Blockly.Lua.scrub_ = function(block, code) { - if (code === null) { - // Block has handled code generation itself. - return ''; - } - var commentCode = ''; - // Only collect comments for blocks that aren't inline. - if (!block.outputConnection || !block.outputConnection.targetConnection) { - // Collect comment for this block. - var comment = block.getCommentText(); - if (comment) { - commentCode += this.prefixLines(comment, '# ') + '\n'; - } - // Collect comments for all value arguments. - // Don't collect comments for nested statements. - for (var x = 0; x < block.inputList.length; x++) { - if (block.inputList[x].type == Blockly.INPUT_VALUE) { - var childBlock = block.inputList[x].connection.targetBlock(); - if (childBlock) { - var comment = this.allNestedComments(childBlock); - if (comment) { - commentCode += this.prefixLines(comment, '# '); - } - } - } - } - } - var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); - var nextCode = this.blockToCode(nextBlock); - return commentCode + code + nextCode; -}; - -/** - * Define a function to be included in the generated code. - * The first time this is called with a given desiredName, the code is - * saved and an actual name is generated. Subsequent calls with the - * same desiredName have no effect but have the same return value. - * - * It is up to the caller to make sure the same desiredName is not - * used for different code values. - * - * The code gets output when Blockly.Lua.finish() is called. - * - * @param {string} desiredName The desired name of the function (e.g., isPrime). - * @param {code} A list of Lua statements. - * @return {string} The actual name of the new function. This may differ - * from desiredName if the former has already been taken by the user. - * @private - */ -Blockly.Lua.provideFunction_ = function(desiredName, code) { - if (!Blockly.Lua.definitions_[desiredName]) { - var functionName = Blockly.Lua.variableDB_.getDistinctName( - desiredName, Blockly.Generator.NAME_TYPE); - Blockly.Lua.functionNames_[desiredName] = functionName; - Blockly.Lua.definitions_[desiredName] = code.join('\n').replace( - Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_REGEXP_, functionName); - } - return Blockly.Lua.functionNames_[desiredName]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/colour.js b/src/opsoro/apps/visual_programming/static/blockly/generators/lua/colour.js deleted file mode 100644 index d83ab69..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/colour.js +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * http://blockly.googlecode.com/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Lua for colour blocks. - * @author ellen.spertus@gmail.com (Ellen Spertus) - */ -'use strict'; - -goog.provide('Blockly.Lua.colour'); - -goog.require('Blockly.Lua'); - - -Blockly.Lua['colour_picker'] = function(block) { - // Colour picker. - var code = '\'' + block.getTitleValue('COLOUR') + '\''; - return [code, Blockly.Lua.ORDER_ATOMIC]; -}; - -Blockly.Lua['colour_random'] = function(block) { - // Generate a random colour. - var code = 'string.format("#%06x", math.random(0, 2^24 - 1))'; - return [code, Blockly.Lua.ORDER_HIGH]; -}; - -Blockly.Lua['colour_rgb'] = function(block) { - // Compose a colour from RGB components. - var functionName = Blockly.Lua.provideFunction_( - 'colour_rgb', - [ 'function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(r, g, b)', - ' r = math.floor(math.min(100, math.max(0, r)) * 2.55 + .5)', - ' g = math.floor(math.min(100, math.max(0, g)) * 2.55 + .5)', - ' b = math.floor(math.min(100, math.max(0, b)) * 2.55 + .5)', - ' return string.format("#%02x%02x%02x", (r, g, b)', - 'end']); - var r = Blockly.Lua.valueToCode(block, 'RED', - Blockly.Lua.ORDER_NONE) || 0; - var g = Blockly.Lua.valueToCode(block, 'GREEN', - Blockly.Lua.ORDER_NONE) || 0; - var b = Blockly.Lua.valueToCode(block, 'BLUE', - Blockly.Lua.ORDER_NONE) || 0; - var code = functionName + '(' + r + ', ' + g + ', ' + b + ')'; - return [code, Blockly.Lua.ORDER_HIGH]; -}; - -Blockly.Lua['colour_blend'] = function(block) { - // Blend two colours together. - var functionName = Blockly.Lua.provideFunction_( - 'colour_blend', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + - '(colour1, colour2, ratio)', - ' local r1 = tonumber(string.sub(colour1, 2, 3), 16)', - ' local r2 = tonumber(string.sub(colour2, 2, 3), 16)', - ' local g1 = tonumber(string.sub(colour1, 4, 5), 16)', - ' local g2 = tonumber(string.sub(colour2, 4, 5), 16)', - ' local b1 = tonumber(string.sub(colour1, 6, 7), 16)', - ' local b2 = tonumber(string.sub(colour2, 6, 7), 16)', - ' local ratio = math.min(1, math.max(0, ratio))', - ' local r = math.floor(r1 * (1 - ratio) + r2 * ratio + .5)', - ' local g = math.floor(g1 * (1 - ratio) + g2 * ratio + .5)', - ' local b = math.floor(b1 * (1 - ratio) + b2 * ratio + .5)', - ' return string.format("#%02x%02x%02x", r, g, b)', - 'end']); - var colour1 = Blockly.Lua.valueToCode(block, 'COLOUR1', - Blockly.Lua.ORDER_NONE) || '\'#000000\''; - var colour2 = Blockly.Lua.valueToCode(block, 'COLOUR2', - Blockly.Lua.ORDER_NONE) || '\'#000000\''; - var ratio = Blockly.Lua.valueToCode(block, 'RATIO', - Blockly.Lua.ORDER_NONE) || 0; - var code = functionName + '(' + colour1 + ', ' + colour2 + ', ' + ratio + ')'; - return [code, Blockly.Lua.ORDER_HIGH]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/lists.js b/src/opsoro/apps/visual_programming/static/blockly/generators/lua/lists.js deleted file mode 100644 index 2391682..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/lists.js +++ /dev/null @@ -1,317 +0,0 @@ -/** - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * http://blockly.googlecode.com/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Lua for list blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Lua.lists'); - -goog.require('Blockly.Lua'); - - -Blockly.Lua['lists_create_empty'] = function(block) { - // Create an empty list. - // List literals must be parenthesized before indexing into. - return ['({})', Blockly.Lua.ORDER_ATOMIC]; -}; - -Blockly.Lua['lists_create_with'] = function(block) { - // Create a list with any number of elements of any type. - var code = new Array(block.itemCount_); - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.Lua.valueToCode(block, 'ADD' + n, - Blockly.Lua.ORDER_NONE) || 'None'; - } - // List literals must be parenthesized before indexing into. - code = '({' + code.join(', ') + '})'; - return [code, Blockly.Lua.ORDER_ATOMIC]; -}; - -Blockly.Lua['lists_repeat'] = function(block) { - // Create a list with one element repeated. - var argument0 = Blockly.Lua.valueToCode(block, 'ITEM', - Blockly.Lua.ORDER_NONE) || 'None'; - var argument1 = Blockly.Lua.valueToCode(block, 'NUM', - Blockly.Lua.ORDER_MULTIPLICATIVE) || '0'; - var functionName = Blockly.Lua.provideFunction_( - 'create_list_repeated', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(item, count)', - ' local t = {}', - ' for i = 1, count do', - ' table.insert(t, item)', - ' end', - ' return t', - 'end']); - var code = functionName + '(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.Lua.ORDER_ATOMIC]; -}; - -Blockly.Lua['lists_length'] = function(block) { - // List length. - var argument0 = Blockly.Lua.valueToCode(block, 'VALUE', - Blockly.Lua.ORDER_NONE) || '[]'; - return ['#' + argument0, Blockly.Lua.ORDER_HIGH]; -}; - -Blockly.Lua['lists_isEmpty'] = function(block) { - // Is the list empty? - var argument0 = Blockly.Lua.valueToCode(block, 'VALUE', - Blockly.Lua.ORDER_NONE) || '[]'; - var code = '#' + argument0 + ' == 0'; - return [code, Blockly.Lua.ORDER_RELATIONAL]; -}; - -Blockly.Lua['lists_indexOf'] = function(block) { - // Find an item in the list. - var argument0 = Blockly.Lua.valueToCode(block, 'FIND', - Blockly.Lua.ORDER_NONE) || '[]'; - var argument1 = Blockly.Lua.valueToCode(block, 'VALUE', - Blockly.Lua.ORDER_HIGH) || '\'\''; - var code; - if (block.getTitleValue('END') == 'FIRST') { - var functionName = Blockly.Lua.provideFunction_( - 'first_index', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t, elem)', - ' for k, v in ipairs(t) do', - ' if v == elem then', - ' return k', - ' end', - ' end', - ' return 0', - 'end']); - code = functionName + '(' + argument1 + ', ' + argument0 + ')'; - return [code, Blockly.Lua.ORDER_HIGH]; - } else { - var functionName = Blockly.Lua.provideFunction_( - 'last_index', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t, elem)', - ' for i = #t, 1, -1 do', - ' if t[i] == elem then', - ' return i', - ' end', - ' end', - ' return 0', - 'end']); - code = functionName + '(' + argument1 + ', ' + argument0 + ')'; - return [code, Blockly.Lua.ORDER_HIGH]; - } -}; - -var getIndex_ = function(listname, where, at) { - if (where == 'FIRST') { - return 1; - } else if (where == 'FROM_END') { - // TODO, check precedence of at. - return '#' + listname + ' + 1 - (' + at + ')'; - } else if (where == 'LAST') { - return '#' + listname; - } else if (where == 'RANDOM') { - return 'math.random(#' + listname + ')'; - } else { - return at; - } -}; - -var gensym_counter_ = 0; - -var gensym_ = function() { - return 'G' + gensym_counter_ ++; -}; - -Blockly.Lua['lists_getIndex'] = function(block) { - // Get element at index. - // Note: Until January 2013 this block did not have MODE or WHERE inputs. - var mode = block.getTitleValue('MODE') || 'GET'; - var where = block.getTitleValue('WHERE') || 'FROM_START'; - var at = Blockly.Lua.valueToCode(block, 'AT', - Blockly.Lua.ORDER_ADDITIVE) || '1'; // for getIndex_ - var list = Blockly.Lua.valueToCode(block, 'VALUE', - Blockly.Lua.ORDER_NONE) || 'nil'; - - // If the list would not to be evaluated more than once (which is the - // case for LAST, FROM_END, and RANDOM) and is non-trivial, make sure - // to access it only once. - if ((where == 'LAST' || where == 'FROM_END' || where == 'RANDOM') && - !list.match(/^\w+$/)) { - // List is an expression, so we may not evaluate it more than once. - if (mode == 'REMOVE') { - // We can use multiple statements. - var listVar = Blockly.Lua.variableDB_.getDistinctName( - 'tmp_list', Blockly.Variables.NAME_TYPE); - var code = listVar + ' = ' + list + '\n' + - 'table.remove(' + listVar + ', ' + getIndex_(listVar, where, at) + - ')\n'; - return code; - } else { - // We need to create a procedure to avoid reevaluating values. - if (mode == 'GET') { - // Note that getIndex_() ignores at when where == 'LAST' or 'RANDOM', - // so we only need one procedure for each of those 'where' values. - // The value for 'FROM_END' depends on 'at', so we will generate a - // unique procedure (name) each time. - var functionName = Blockly.Lua.provideFunction_( - 'list_get_' + where.toLowerCase() + - (where == 'FROM_END' ? '_' + gensym_() : ''), - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', - ' return t[' + getIndex_('t', where, at) + ']', - 'end']); - } else { // mode == 'GET_REMOVE' - // We need to create a procedure. - var functionName = Blockly.Lua.provideFunction_( - 'list_remove_' + where.toLowerCase() + - (where == 'FROM_END' ? '_' + gensym_() : ''), - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', - ' return table.remove(t, ' + getIndex_('t', where, at) + ')', - 'end']); - } - var code = functionName + '(' + list + ')'; - return [code, Blockly.Lua.ORDER_HIGH]; - } - } else { - // Either list is a simple variable, or we only need to refer to list once. - if (mode == 'GET') { - var code = list + '[' + getIndex_(list, where, at) + ']'; - return [code, Blockly.Lua.ORDER_HIGH]; - } else { - var code = 'table.remove(' + list + ', ' + getIndex_(list, where, at) + - ')'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.Lua.ORDER_HIGH]; - } else { // mode == 'REMOVE' - return code + '\n'; - } - } - } -}; - -Blockly.Lua['lists_setIndex'] = function(block) { - // Set element at index. - // Note: Until February 2013 this block did not have MODE or WHERE inputs. - var list = Blockly.Lua.valueToCode(block, 'LIST', - Blockly.Lua.ORDER_HIGH) || '[]'; - var mode = block.getTitleValue('MODE') || 'GET'; - var where = block.getTitleValue('WHERE') || 'FROM_START'; - var at = Blockly.Lua.valueToCode(block, 'AT', - Blockly.Lua.ORDER_NONE) || '1'; - var value = Blockly.Lua.valueToCode(block, 'TO', - Blockly.Lua.ORDER_NONE) || 'None'; - - // If the list would need to be evaluated more than once (which is the - // case for LAST, FROM_END, and RANDOM) and is non-trivial, make sure - // to access it only once. - if ((where == 'LAST' || where == 'FROM_END' || where == 'RANDOM') && - !list.match(/^\w+$/)) { - // List is an expression, so we may not evaluate it more than once. - if (where == 'RANDOM' || where == 'LAST') { - // In these cases, 'at' is implicit. getIndex_() ignores its value. - if (mode == 'SET') { - var functionName = Blockly.Lua.provideFunction_( - 'list_set_' + where.toLowerCase(), - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t, val)', - ' t[' + getIndex_('t', where, at) + '] = val', - 'end']); - } else { // mode == 'INSERT' - var functionName = Blockly.Lua.provideFunction_( - 'list_insert_' + where.toLowerCase(), - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t, val)', - ' table.insert(t, ' + - // LAST is a special case, because we want to insert - // *after* not *before*, the existing last element. - getIndex_('t', where, at) + (where == 'LAST' ? ' + 1' : '') + - ', val)', - 'end']); - } - var code = functionName + '(' + list + ', ' + value + ');\n'; - return code; - } else { // where = FROM_END - if (mode == 'SET') { - var functionName = Blockly.Lua.provideFunction_( - 'list_set_from_end', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + - '(t, index, val)', - ' t[#t + 1 - index] = val', - 'end']); - } else { // mode == 'INSERT' - var functionName = Blockly.Lua.provideFunction_( - 'list_insert_from_end', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + - '(t, index, val)', - ' table.insert(t, #t + 1 - index, val)', - 'end']); - } - var code = functionName + '(' + list + ', ' + at + ', ' + value + ');\n'; - return code; - } - } else { - // It's okay to have multiple references to the list. - if (mode == 'SET') { - var code = list + '[' + getIndex_(list, where, at) + '] = ' + value; - } else { // mode == 'INSERT' - // LAST is a special case, because we want to insert - // *after* not *before*, the existing last element. - var code = 'table.insert(' + list + ', ' + - (getIndex_(list, where, at) + (where == 'LAST' ? ' + 1' : '')) + - ', ' + value + ')'; - } - return code + '\n'; - } -}; - -Blockly.Lua['lists_add'] = function(block) { - // Add element to start or end. - var varName = Blockly.Lua.variableDB_.getName(block.getTitleValue('VAR'), - Blockly.Variables.NAME_TYPE); - var element = Blockly.Lua.valueToCode(block, 'ELEMENT', - Blockly.Lua.ORDER_NONE) || 'null'; - var location = block.getTitleValue('LOCATION'); - if (location == 'START') { - return 'table.insert(' + varName + ', 1, ' + element + ')\n'; - } else { - return 'table.insert(' + varName + ', ' + element + ')\n'; - } -}; - -Blockly.Lua['lists_getSublist'] = function(block) { - // Get sublist. - var list = Blockly.Lua.valueToCode(block, 'LIST', - Blockly.Lua.ORDER_HIGH) || '[]'; - var where1 = block.getTitleValue('WHERE1'); - var where2 = block.getTitleValue('WHERE2'); - var at1 = Blockly.Lua.valueToCode(block, 'AT1', - Blockly.Lua.ORDER_ADDITIVE) || '1'; - var at2 = Blockly.Lua.valueToCode(block, 'AT2', - Blockly.Lua.ORDER_ADDITIVE) || '1'; - - var functionName = Blockly.Lua.provideFunction_( - 'list_sublist_' + gensym_(), - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(source)', - ' local t = {}', - ' local start = ' + getIndex_('source', where1, at1), - ' local finish = ' + getIndex_('source', where2, at2), - ' for i = start, finish do', - ' table.insert(t, source[i])', - ' end', - ' return t', - 'end']); - var code = functionName + '(' + list + ')'; - return [code, Blockly.Lua.ORDER_HIGH]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/logic.js b/src/opsoro/apps/visual_programming/static/blockly/generators/lua/logic.js deleted file mode 100644 index fdd3c30..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/logic.js +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * http://blockly.googlecode.com/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Lua for logic blocks. - * @author ellen.spertus@gmail.com (Ellen Spertus) - */ -'use strict'; - -goog.provide('Blockly.Lua.logic'); - -goog.require('Blockly.Lua'); - - -Blockly.Lua['controls_if'] = function(block) { - // If/elseif/else condition. - var n = 0; - var argument = Blockly.Lua.valueToCode(block, 'IF' + n, - Blockly.Lua.ORDER_NONE) || 'False'; - var branch = Blockly.Lua.statementToCode(block, 'DO' + n) || ''; - var code = 'if ' + argument + ' then\n' + branch; - for (n = 1; n <= block.elseifCount_; n++) { - argument = Blockly.Lua.valueToCode(block, 'IF' + n, - Blockly.Lua.ORDER_NONE) || 'False'; - branch = Blockly.Lua.statementToCode(block, 'DO' + n) || ''; - code += 'elseif ' + argument + ' then\n' + branch; - } - if (block.elseCount_) { - branch = Blockly.Lua.statementToCode(block, 'ELSE') || ' pass\n'; - code += 'else\n' + branch; - } - code += 'end\n'; - return code; -}; - -Blockly.Lua['logic_compare'] = function(block) { - // Comparison operator. - var OPERATORS = { - EQ: '==', - NEQ: '~=', - LT: '<', - LTE: '<=', - GT: '>', - GTE: '>=' - }; - var operator = OPERATORS[block.getTitleValue('OP')]; - var order = Blockly.Lua.ORDER_RELATIONAL; - var argument0 = Blockly.Lua.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.Lua.valueToCode(block, 'B', order) || '0'; - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.Lua['logic_operation'] = function(block) { - // Operations 'and', 'or'. - var operator = (block.getTitleValue('OP') == 'AND') ? 'and' : 'or'; - var order = (operator == 'and') ? Blockly.Lua.ORDER_AND : - Blockly.Lua.ORDER_OR; - var argument0 = Blockly.Lua.valueToCode(block, 'A', order); - var argument1 = Blockly.Lua.valueToCode(block, 'B', order); - if (!argument0 && !argument1) { - // If there are no arguments, then the return value is false. - argument0 = 'false'; - argument1 = 'false'; - } else { - // Single missing arguments have no effect on the return value. - var defaultArgument = (operator == 'and') ? 'true' : 'false'; - if (!argument0) { - argument0 = defaultArgument; - } - if (!argument1) { - argument1 = defaultArgument; - } - } - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.Lua['logic_negate'] = function(block) { - // Negation. - var argument0 = Blockly.Lua.valueToCode(block, 'BOOL', - Blockly.Lua.ORDER_UNARY) || 'true'; - var code = 'not ' + argument0; - return [code, Blockly.Lua.ORDER_UNARY]; -}; - -Blockly.Lua['logic_boolean'] = function(block) { - // Boolean values true and false. - var code = (block.getTitleValue('BOOL') == 'TRUE') ? 'true' : 'false'; - return [code, Blockly.Lua.ORDER_ATOMIC]; -}; - -Blockly.Lua['logic_null'] = function(block) { - // Null data type. - return ['nil', Blockly.Lua.ORDER_ATOMIC]; -}; - -Blockly.Lua['logic_ternary'] = function(block) { - // Ternary operator. - var value_if = Blockly.Lua.valueToCode(block, 'IF', - Blockly.Lua.ORDER_AND) || 'false'; - var value_then = Blockly.Lua.valueToCode(block, 'THEN', - Blockly.Lua.ORDER_OR) || 'nil'; - var value_else = Blockly.Lua.valueToCode(block, 'ELSE', - Blockly.Lua.ORDER_OR) || 'nil'; - var code = value_if + ' and ' + value_then + ' or ' + value_else; - return [code, Blockly.Lua.ORDER_OR]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/loops.js b/src/opsoro/apps/visual_programming/static/blockly/generators/lua/loops.js deleted file mode 100644 index 2de1819..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/loops.js +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * http://blockly.googlecode.com/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Lua for loop blocks. - * @author ellen.spertus@gmail.com (Ellen Spertus) - */ -'use strict'; - -goog.provide('Blockly.Lua.loops'); - -goog.require('Blockly.Lua'); - - -Blockly.Lua['controls_repeat'] = function(block) { - // Repeat n times (internal number). - var repeats = parseInt(block.getTitleValue('TIMES'), 10); - var branch = Blockly.Lua.statementToCode(block, 'DO') || ''; - var loopVar = Blockly.Lua.variableDB_.getDistinctName( - 'count', Blockly.Variables.NAME_TYPE); - var code = 'for ' + loopVar + '= 1, ' + repeats + ' do\n' + branch + 'end'; - return code; -}; - -Blockly.Lua['controls_repeat_ext'] = function(block) { - // Repeat n times (external number). - var repeats = Blockly.Lua.valueToCode(block, 'TIMES', - Blockly.Lua.ORDER_NONE) || '0'; - if (Blockly.isNumber(repeats)) { - repeats = parseInt(repeats, 10); - } else { - repeats = 'math.floor(' + repeats + ')'; - } - var branch = Blockly.Lua.statementToCode(block, 'DO') || '\n'; - var loopVar = Blockly.Lua.variableDB_.getDistinctName( - 'count', Blockly.Variables.NAME_TYPE); - var code = 'for ' + loopVar + ' = 1, ' + repeats + ' do\n' + - branch + 'end\n'; - return code; -}; - -Blockly.Lua['controls_whileUntil'] = function(block) { - // Do while/until loop. - var until = block.getTitleValue('MODE') == 'UNTIL'; - var argument0 = Blockly.Lua.valueToCode(block, 'BOOL', - until ? Blockly.Lua.ORDER_UNARY : - Blockly.Lua.ORDER_NONE) || 'False'; - var branch = Blockly.Lua.statementToCode(block, 'DO') || '\n'; - if (block.getTitleValue('MODE') == 'UNTIL') { - if (!argument0.match(/^\w+$/)) { - argument0 = '(' + argument0 + ')'; - } - argument0 = 'not ' + argument0; - } - return 'while ' + argument0 + ' do\n' + branch + 'end\n'; -}; - -Blockly.Lua['controls_for'] = function(block) { - // For loop. - var variable0 = Blockly.Lua.variableDB_.getName( - block.getTitleValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.Lua.valueToCode(block, 'FROM', - Blockly.Lua.ORDER_NONE) || '0'; - var argument1 = Blockly.Lua.valueToCode(block, 'TO', - Blockly.Lua.ORDER_NONE) || '0'; - var increment = Blockly.Lua.valueToCode(block, 'BY', - Blockly.Lua.ORDER_NONE) || '1'; - var branch = Blockly.Lua.statementToCode(block, 'DO') || '\n'; - - var code = 'for ' + variable0 + ' = ' + argument0 + ', ' + argument1; - // Increment amount may be omitted if 1. - if (!Blockly.isNumber(increment) || Math.abs(parseFloat(increment)) != 1) { - code += ', ' + increment; - } - code += ' do\n' + branch + 'end\n'; - return code; -}; - -Blockly.Lua['controls_forEach'] = function(block) { - // For each loop. - var variable0 = Blockly.Lua.variableDB_.getName( - block.getTitleValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.Lua.valueToCode(block, 'LIST', - Blockly.Lua.ORDER_RELATIONAL) || '[]'; - var branch = Blockly.Lua.statementToCode(block, 'DO') || '\n'; - var code = 'for _, ' + variable0 + ' in ipairs(' + argument0 + ') do \n' + - branch + 'end\n'; - return code; -}; - -Blockly.Lua['controls_flow_statements'] = function(block) { - // break; we eliminated "continue" - return 'break\n'; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/math.js b/src/opsoro/apps/visual_programming/static/blockly/generators/lua/math.js deleted file mode 100644 index 2b35fd7..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/math.js +++ /dev/null @@ -1,413 +0,0 @@ -/** - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * http://blockly.googlecode.com/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Lua for math blocks. - * @author ellen.spertus@gmail.com (Ellen Spertus) - */ -'use strict'; - -goog.provide('Blockly.Lua.math'); - -goog.require('Blockly.Lua'); - -Blockly.Lua['math_number'] = function(block) { - // Numeric value. - var code = parseFloat(block.getTitleValue('NUM')); - var order = code < 0 ? Blockly.Lua.ORDER_UNARY : - Blockly.Lua.ORDER_ATOMIC; - return [code, order]; -}; - -Blockly.Lua['math_arithmetic'] = function(block) { - // Basic arithmetic operators, and power. - var OPERATORS = { - ADD: [' + ', Blockly.Lua.ORDER_ADDITIVE], - MINUS: [' - ', Blockly.Lua.ORDER_ADDITIVE], - MULTIPLY: [' * ', Blockly.Lua.ORDER_MULTIPLICATIVE], - DIVIDE: [' / ', Blockly.Lua.ORDER_MULTIPLICATIVE], - POWER: [' ^ ', Blockly.Lua.ORDER_EXPONENTIATION] - }; - var tuple = OPERATORS[block.getTitleValue('OP')]; - var operator = tuple[0]; - var order = tuple[1]; - var argument0 = Blockly.Lua.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.Lua.valueToCode(block, 'B', order) || '0'; - var code = argument0 + operator + argument1; - return [code, order]; -}; - -Blockly.Lua['math_single'] = function(block) { - // Math operators with single operand. - var operator = block.getTitleValue('OP'); - var code; - var arg; - if (operator == 'NEG') { - // Negation is a special case given its different operator precedence. - var code = Blockly.Lua.valueToCode(block, 'NUM', - Blockly.Lua.ORDER_UNARY) || '0'; - return ['-' + code, Blockly.Lua.ORDER_UNARY]; - } - if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') { - arg = Blockly.Lua.valueToCode(block, 'NUM', - Blockly.Lua.ORDER_MULTIPLICATIVE) || '0'; - } else { - arg = Blockly.Lua.valueToCode(block, 'NUM', - Blockly.Lua.ORDER_NONE) || '0'; - } - // First, handle cases which generate values that don't need parentheses - // wrapping the code. - switch (operator) { - case 'ABS': - code = 'math.abs(' + arg + ')'; - break; - case 'ROOT': - code = 'math.sqrt(' + arg + ')'; - break; - case 'LN': - code = 'math.log(' + arg + ')'; - break; - case 'LOG10': - code = 'math.log10(' + arg + ')'; - break; - case 'EXP': - code = 'math.exp(' + arg + ')'; - break; - case 'POW10': - code = 'math.pow(10,' + arg + ')'; - break; - case 'ROUND': - // This rounds up. Blockly does not specify rounding direction. - code = 'math.floor(' + arg + ' + .5)'; - break; - case 'ROUNDUP': - code = 'math.ceil(' + arg + ')'; - break; - case 'ROUNDDOWN': - code = 'math.floor(' + arg + ')'; - break; - case 'SIN': - code = 'math.sin(math.rad(' + arg + '))'; - break; - case 'COS': - code = 'math.cos(math.rad(' + arg + '))'; - break; - case 'TAN': - code = 'math.tan(math.rad(' + arg + '))'; - break; - case 'ASIN': - code = 'math.deg(math.asin(' + arg + '))'; - break; - case 'ACOS': - code = 'math.deg(math.acos(' + arg + '))'; - break; - case 'ATAN': - code = 'math.deg(math.atan(' + arg + '))'; - break; - default: - throw 'Unknown math operator: ' + operator; - } - if (code) { - return [code, Blockly.Lua.ORDER_HIGH]; - } -}; - -Blockly.Lua['math_constant'] = function(block) { - // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. - var CONSTANTS = { - PI: ['math.pi', Blockly.Lua.ORDER_HIGH], - E: ['math.exp(1)', Blockly.Lua.ORDER_HIGH], - GOLDEN_RATIO: ['(1 + math.sqrt(5)) / 2', Blockly.Lua.ORDER_MULTIPLICATIVE], - SQRT2: ['math.sqrt(2)', Blockly.Lua.ORDER_HIGH], - SQRT1_2: ['math.sqrt(1 / 2)', Blockly.Lua.ORDER_HIGH], - INFINITY: ['math.huge', Blockly.Lua.ORDER_HIGH] - }; - var constant = block.getTitleValue('CONSTANT'); - return CONSTANTS[constant]; -}; - -Blockly.Lua['math_number_property'] = function(block) { - // Check if a number is even, odd, prime, whole, positive, or negative - // or if it is divisible by certain number. Returns true or false. - var number_to_check = Blockly.Lua.valueToCode(block, 'NUMBER_TO_CHECK', - Blockly.Lua.ORDER_MULTIPLICATIVE) || '0'; - var dropdown_property = block.getTitleValue('PROPERTY'); - var code; - if (dropdown_property == 'PRIME') { - var functionName = Blockly.Lua.provideFunction_( - 'isPrime', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(x)', - ' -- http://stackoverflow.com/questions/11571752/lua-prime-number-checker', - ' if x < 2 then', - ' return false', - ' end', - ' -- Assume all numbers are prime until proven not-prime.', - ' local prime = {}', - ' prime[1] = false', - ' for i = 2, x do', - ' prime[i] = true', - ' end', - ' -- For each prime we find, mark all multiples as not-prime.', - ' for i = 2, math.sqrt(x) do', - ' if prime[i] then', - ' for j = i*i, x, i do', - ' prime[j] = false', - ' end', - ' end', - ' end', - ' return prime[x]', - 'end']); - code = functionName + '(' + number_to_check + ')'; - return [code, Blockly.Lua.ORDER_HIGH]; - } - switch (dropdown_property) { - case 'EVEN': - code = number_to_check + ' % 2 == 0'; - break; - case 'ODD': - code = number_to_check + ' % 2 == 1'; - break; - case 'WHOLE': - code = number_to_check + ' % 1 == 0'; - break; - case 'POSITIVE': - code = number_to_check + ' > 0'; - break; - case 'NEGATIVE': - code = number_to_check + ' < 0'; - break; - case 'DIVISIBLE_BY': - var divisor = Blockly.Lua.valueToCode(block, 'DIVISOR', - Blockly.Lua.ORDER_MULTIPLICATIVE); - // If 'divisor' is some code that evals to 0, Lua will produce a nan. - // Let's produce nil if we can determine this at compile-time. - if (!divisor || divisor == '0') { - return ['nil', Blockly.Lua.ORDER_ATOMIC]; - } - // The normal trick to implement ?: with and/or doesn't work here: - // divisor == 0 and nil or number_to_check % divisor == 0 - // because nil is false, so allow a runtime failure. :-( - code = number_to_check + ' % ' + divisor + ' == 0'; - break; - } - return [code, Blockly.Lua.ORDER_RELATIONAL]; -}; - -Blockly.Lua['math_change'] = function(block) { - // Add to a variable in place. - var argument0 = Blockly.Lua.valueToCode(block, 'DELTA', - Blockly.Lua.ORDER_ADDITIVE) || '0'; - var varName = Blockly.Lua.variableDB_.getName(block.getTitleValue('VAR'), - Blockly.Variables.NAME_TYPE); - return varName + ' = ' + varName + ' + ' + argument0 + '\n'; -}; - -// Rounding functions have a single operand. -Blockly.Lua['math_round'] = Blockly.Lua['math_single']; -// Trigonometry functions have a single operand. -Blockly.Lua['math_trig'] = Blockly.Lua['math_single']; - -Blockly.Lua['math_on_list'] = function(block) { - // Math functions for lists. - var func = block.getTitleValue('OP'); - var list = Blockly.Lua.valueToCode(block, 'LIST', - Blockly.Lua.ORDER_NONE) || '{}'; - var code; - - // Functions needed in more than one case. - function provideSum() { - return Blockly.Lua.provideFunction_( - 'sum', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', - ' local result = 0', - ' for k,v in ipairs(t) do', - ' result = result + v', - ' end', - ' return result', - 'end']); - } - - switch (func) { - // The first two cases return from the function. - case 'RANDOM': - return ['#' + list + ' == 0 and nil or ' + - list + '[math.random(#' + list + ')]', - Blockly.Lua.ORDER_HIGH]; - break; - - case 'AVERAGE': - // Returns 0 for the empty list. - return ['#' + list + ' == 0 and 0 or ' + provideSum() + '(' + list + - ') / #' + list, - Blockly.Lua.ORDER_HIGH]; - break; - - // The returns for the remaining cases are after the switch statement. - case 'SUM': - functionName = provideSum(); - break; - - case 'MIN': - // Returns 0 for the empty list. - var functionName = Blockly.Lua.provideFunction_( - 'min', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', - ' local result = math.huge', - ' for k,v in ipairs(t) do', - ' if v < result then', - ' result = v', - ' end', - ' end', - ' return result', - 'end']) - break; - - case 'MAX': - // Returns 0 for the empty list. - var functionName = Blockly.Lua.provideFunction_( - 'max', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', - ' local result = 0', - ' for k,v in ipairs(t) do', - ' if v > result then', - ' result = v', - ' end', - ' end', - ' return result', - 'end']) - break; - - case 'MEDIAN': - var functionName = Blockly.Lua.provideFunction_( - 'math_median', - // This operation excludes non-numbers. - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', - ' -- Source: http://lua-users.org/wiki/SimpleStats', - ' local temp={}', - ' for k,v in ipairs(t) do', - ' if type(v) == "number" then', - ' table.insert( temp, v )', - ' end', - ' end', - ' table.sort( temp )', - ' if math.fmod(#temp,2) == 0 then', - ' return ( temp[#temp/2] + temp[(#temp/2)+1] ) / 2', - ' else', - ' return temp[math.ceil(#temp/2)]', - ' end', - 'end']) - break; - - case 'MODE': - var functionName = Blockly.Lua.provideFunction_( - 'math_modes', - // As a list of numbers can contain more than one mode, - // the returned result is provided as an array. - // The Lua version includes non-numbers. - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', - ' -- Source: http://lua-users.org/wiki/SimpleStats', - ' local counts={}', - ' for k, v in ipairs( t ) do', - ' if counts[v] == nil then', - ' counts[v] = 1', - ' else', - ' counts[v] = counts[v] + 1', - ' end', - ' end', - ' local biggestCount = 0', - ' for k, v in ipairs( counts ) do', - ' if v > biggestCount then', - ' biggestCount = v', - ' end', - ' end', - ' local temp={}', - ' for k,v in ipairs( counts ) do', - ' if v == biggestCount then', - ' table.insert( temp, k )', - ' end', - ' end', - ' return temp', - 'end']); - break; - - case 'STD_DEV': - var functionName = Blockly.Lua.provideFunction_( - 'math_standard_deviation', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', - ' local m', - ' local vm', - ' local total = 0', - ' local count = 0', - ' local result', - ' m = #t == 0 and 0 or ' + provideSum() + '(t) / #t', - ' for k,v in ipairs(t) do', - " if type(v) == 'number' then", - ' vm = v - m', - ' total = total + (vm * vm)', - ' count = count + 1', - ' end', - ' end', - ' result = math.sqrt(total / (count-1))', - ' return result', - 'end']) - break; - - default: - throw 'Unknown operator: ' + func; - } - return [functionName + '(' + list + ')', Blockly.Lua.ORDER_HIGH]; -}; - -Blockly.Lua['math_modulo'] = function(block) { - // Remainder computation. - var argument0 = Blockly.Lua.valueToCode(block, 'DIVIDEND', - Blockly.Lua.ORDER_MULTIPLICATIVE) || '0'; - var argument1 = Blockly.Lua.valueToCode(block, 'DIVISOR', - Blockly.Lua.ORDER_MULTIPLICATIVE) || '0'; - var code = argument0 + ' % ' + argument1; - return [code, Blockly.Lua.ORDER_MULTIPLICATIVE]; -}; - -Blockly.Lua['math_constrain'] = function(block) { - // Constrain a number between two limits. - var argument0 = Blockly.Lua.valueToCode(block, 'VALUE', - Blockly.Lua.ORDER_NONE) || '0'; - var argument1 = Blockly.Lua.valueToCode(block, 'LOW', - Blockly.Lua.ORDER_NONE) || '0'; - var argument2 = Blockly.Lua.valueToCode(block, 'HIGH', - Blockly.Lua.ORDER_NONE) || 'math.huge'; - var code = 'math.min(math.max(' + argument0 + ', ' + argument1 + '), ' + - argument2 + ')'; - return [code, Blockly.Lua.ORDER_HIGH]; -}; - -Blockly.Lua['math_random_int'] = function(block) { - // Random integer between [X] and [Y]. - var argument0 = Blockly.Lua.valueToCode(block, 'FROM', - Blockly.Lua.ORDER_NONE) || '0'; - var argument1 = Blockly.Lua.valueToCode(block, 'TO', - Blockly.Lua.ORDER_NONE) || '0'; - var code = 'math.random(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.Lua.ORDER_HIGH]; -}; - -Blockly.Lua['math_random_float'] = function(block) { - // Random fraction between 0 and 1. - return ['math.random()', Blockly.Lua.ORDER_HIGH]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/procedures.js b/src/opsoro/apps/visual_programming/static/blockly/generators/lua/procedures.js deleted file mode 100644 index 9da1f9b..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/procedures.js +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * http://blockly.googlecode.com/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Lua for procedure blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Lua.procedures'); - -goog.require('Blockly.Lua'); - - -Blockly.Lua['procedures_defreturn'] = function(block) { - // Define a procedure with a return value. - var funcName = Blockly.Lua.variableDB_.getName(block.getTitleValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var branch = Blockly.Lua.statementToCode(block, 'STACK'); - if (Blockly.Lua.INFINITE_LOOP_TRAP) { - branch = Blockly.Lua.INFINITE_LOOP_TRAP.replace(/%1/g, - '"' + block.id + '"') + branch; - } - var returnValue = Blockly.Lua.valueToCode(block, 'RETURN', - Blockly.Lua.ORDER_NONE) || ''; - if (returnValue) { - returnValue = ' return ' + returnValue + '\n'; - } else if (!branch) { - branch = ''; - } - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.Lua.variableDB_.getName(block.arguments_[x], - Blockly.Variables.NAME_TYPE); - } - var code = 'function ' + funcName + '(' + args.join(', ') + ')\n' + - branch + returnValue + 'end\n'; - code = Blockly.Lua.scrub_(block, code); - Blockly.Lua.definitions_[funcName] = code; - return null; -}; - -// Defining a procedure without a return value uses the same generator as -// a procedure with a return value. -Blockly.Lua['procedures_defnoreturn'] = - Blockly.Lua['procedures_defreturn']; - -Blockly.Lua['procedures_callreturn'] = function(block) { - // Call a procedure with a return value. - var funcName = Blockly.Lua.variableDB_.getName(block.getTitleValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.Lua.valueToCode(block, 'ARG' + x, - Blockly.Lua.ORDER_NONE) || 'None'; - } - var code = funcName + '(' + args.join(', ') + ')'; - return [code, Blockly.Lua.ORDER_HIGH]; -}; - -Blockly.Lua['procedures_callnoreturn'] = function(block) { - // Call a procedure with no return value. - var funcName = Blockly.Lua.variableDB_.getName(block.getTitleValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.Lua.valueToCode(block, 'ARG' + x, - Blockly.Lua.ORDER_NONE) || 'None'; - } - var code = funcName + '(' + args.join(', ') + ')\n'; - return code; -}; - -Blockly.Lua['procedures_ifreturn'] = function(block) { - // Conditionally return value from a procedure. - var condition = Blockly.Lua.valueToCode(block, 'CONDITION', - Blockly.Lua.ORDER_NONE) || 'False'; - var code = 'if ' + condition + ' then\n'; - if (block.hasReturnValue_) { - var value = Blockly.Lua.valueToCode(block, 'VALUE', - Blockly.Lua.ORDER_NONE) || 'None'; - code += ' return ' + value + '\n'; - } else { - code += ' return\n'; - } - code += 'end\n'; - return code; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/text.js b/src/opsoro/apps/visual_programming/static/blockly/generators/lua/text.js deleted file mode 100644 index 70d8184..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/text.js +++ /dev/null @@ -1,264 +0,0 @@ -/** - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * http://blockly.googlecode.com/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Lua for text blocks. - * @author ellen.spertus@gmail.com (Ellen Spertus) - */ -'use strict'; - -goog.provide('Blockly.Lua.text'); - -goog.require('Blockly.Lua'); - - -Blockly.Lua['text'] = function(block) { - // Text value. - var code = Blockly.Lua.quote_(block.getTitleValue('TEXT')); - return [code, Blockly.Lua.ORDER_ATOMIC]; -}; - -Blockly.Lua['text_join'] = function(block) { - // Create a string made up of any number of elements of any type. - var code; - if (block.itemCount_ == 0) { - return ['\'\'', Blockly.Lua.ORDER_ATOMIC]; - } else if (block.itemCount_ == 1) { - var argument0 = Blockly.Lua.valueToCode(block, 'ADD0', - Blockly.Lua.ORDER_NONE) || '\'\''; - code = argument0; - return [code, Blockly.Lua.ORDER_HIGH]; - } else if (block.itemCount_ == 2) { - var argument0 = Blockly.Lua.valueToCode(block, 'ADD0', - Blockly.Lua.ORDER_NONE) || '\'\''; - var argument1 = Blockly.Lua.valueToCode(block, 'ADD1', - Blockly.Lua.ORDER_NONE) || '\'\''; - var code = argument0 + ' .. ' + argument1; - return [code, Blockly.Lua.ORDER_UNARY]; - } else { - var code = []; - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.Lua.valueToCode(block, 'ADD' + n, - Blockly.Lua.ORDER_NONE) || '\'\''; - } - code = 'table.concat({' + code.join(', ') + '})'; - return [code, Blockly.Lua.ORDER_HIGH]; - } -}; - -Blockly.Lua['text_append'] = function(block) { - // Append to a variable in place. - var varName = Blockly.Lua.variableDB_.getName(block.getTitleValue('VAR'), - Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.Lua.valueToCode(block, 'TEXT', - Blockly.Lua.ORDER_NONE) || '\'\''; - return varName + ' = ' + varName + ' .. ' + argument0 + '\n'; -}; - -Blockly.Lua['text_length'] = function(block) { - // String length. - var argument0 = Blockly.Lua.valueToCode(block, 'VALUE', - Blockly.Lua.ORDER_NONE) || '\'\''; - return ['string.len(' + argument0 + ')', Blockly.Lua.ORDER_HIGH]; -}; - -Blockly.Lua['text_isEmpty'] = function(block) { - // Is the string null? - var argument0 = Blockly.Lua.valueToCode(block, 'VALUE', - Blockly.Lua.ORDER_NONE) || '\'\''; - var code = 'string.len(' + argument0 + ') == 0'; - return [code, Blockly.Lua.ORDER_RELATIONAL]; -}; - -Blockly.Lua['text_indexOf'] = function(block) { - // Search the text for a substring (case-sensitive). - var substr = Blockly.Lua.valueToCode(block, 'FIND', - Blockly.Lua.ORDER_NONE) || '\'\''; - var str = Blockly.Lua.valueToCode(block, 'VALUE', - Blockly.Lua.ORDER_HIGH) || '\'\''; - if (block.getTitleValue('END') == 'FIRST') { - var functionName = Blockly.Lua.provideFunction_( - 'firstIndexOf', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(str, substr) ', - ' local i = string.find(str, substr, 1, true)', - ' if i == nil then', - ' return 0', - ' else', - ' return i', - ' end', - 'end']); - } else { - var functionName = Blockly.Lua.provideFunction_( - 'lastIndexOf', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(str, substr)', - ' for i = string.len(str) - string.len(substr) + 1, 1, -1 do', - ' if string.find(str, substr, i, true) then', - ' return i', - ' end', - ' end', - ' return 0', - 'end']) - } - var code = functionName + '(' + str + ', ' + substr + ')'; - return [code, Blockly.Lua.ORDER_HIGH]; -}; - -Blockly.Lua['text_charAt'] = function(block) { - // Get letter at index. - // Note: Until January 2013 this block did not have the WHERE input. - var where = block.getTitleValue('WHERE') || 'FROM_START'; - var text = Blockly.Lua.valueToCode(block, 'VALUE', - Blockly.Lua.ORDER_HIGH) || '\'\''; - if (where == 'RANDOM') { - var functionName = Blockly.Lua.provideFunction_( - 'text_random_letter', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(str)', - ' local index = math.random(string.len(str))', - ' return string.sub(index, index)', - 'end']); - code = functionName + '(' + text + ')'; - } else { - if (where == 'FIRST') { - var start = 1; - } else if (where == 'LAST') { - var start = -1; - } else { - var at = Blockly.Lua.valueToCode(block, 'AT', - Blockly.Lua.ORDER_UNARY) || '1'; - if (where == 'FROM_START') { - var start = at; - } else if (where == 'FROM_END') { - var start = '-' + at; - } else { - throw 'Unhandled option (text_charAt).'; - } - } - var code = 'string.sub(' + text + ', ' + start + ', ' + start + ')'; - } - return [code, Blockly.Lua.ORDER_HIGH]; -}; - -Blockly.Lua['text_getSubstring'] = function(block) { - // Get substring. - var text = Blockly.Lua.valueToCode(block, 'STRING', - Blockly.Lua.ORDER_HIGH) || '\'\''; - - // Get start index. - var where1 = block.getTitleValue('WHERE1'); - var at1 = Blockly.Lua.valueToCode(block, 'AT1', - Blockly.Lua.ORDER_ADDITIVE) || '1'; - if (where1 == 'FIRST') { - var start = 1; - } else if (where1 == 'FROM_START') { - var start = at1; - } else if (where1 == 'FROM_END') { - var start = '-' + at1; - } else { - throw 'Unhandled option (text_getSubstring)'; - } - - // Get end index. - var where2 = block.getTitleValue('WHERE2'); - var at2 = Blockly.Lua.valueToCode(block, 'AT2', - Blockly.Lua.ORDER_ADDITIVE) || '1'; - if (where2 == 'LAST') { - var end = -1; - } else if (where2 == 'FROM_START') { - var end = at2; - } else if (where2 == 'FROM_END') { - var end = '-' + at2; - } else { - throw 'Unhandled option (text_getSubstring)'; - } - var code = 'string.sub(' + text + ', ' + start + ', ' + end + ')'; - return [code, Blockly.Lua.ORDER_HIGH]; -}; - -Blockly.Lua['text_changeCase'] = function(block) { - // Change capitalization. - var operator = block.getTitleValue('CASE'); - var argument0 = Blockly.Lua.valueToCode(block, 'TEXT', - Blockly.Lua.ORDER_HIGH) || '\'\''; - if (operator == 'UPPERCASE') { - var functionName = 'string.upper'; - } else if (operator == 'LOWERCASE') { - var functionName = 'string.lower'; - } else if (operator == 'TITLECASE') { - var functionName = Blockly.Lua.provideFunction_( - 'text_titlecase', - // There are shorter versions at - // http://lua-users.org/wiki/SciteTitleCase - // that do not preserve whitespace. - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(str)', - ' local buf = {}', - ' local inWord = false', - ' for i = 1, #str do', - ' local c = string.sub(str, i, i)', - ' if inWord then', - ' table.insert(buf, string.lower(c))', - ' if string.find(c, "%s") then', - ' inWord = false', - ' end', - ' else', - ' table.insert(buf, string.upper(c))', - ' inWord = true', - ' end', - ' end', - ' return table.concat(buf)', - 'end']) - } - var code = functionName + '(' + argument0 + ')'; - return [code, Blockly.Lua.ORDER_HIGH]; -}; - -Blockly.Lua['text_trim'] = function(block) { - // Trim spaces. - var OPERATORS = { - LEFT: '^%s*(,-)', - RIGHT: '(.-)%s*$', - BOTH: '^%s*(.-)%s*$' - }; - var operator = OPERATORS[block.getTitleValue('MODE')]; - var text = Blockly.Lua.valueToCode(block, 'TEXT', - Blockly.Lua.ORDER_HIGH) || '\'\''; - var code = 'string.gsub(' + text + ', "' + operator + '", "%1")'; - return [code, Blockly.Lua.ORDER_HIGH]; -}; - -Blockly.Lua['text_print'] = function(block) { - // Print statement. - var argument0 = Blockly.Lua.valueToCode(block, 'TEXT', - Blockly.Lua.ORDER_NONE) || '\'\''; - return 'print(' + argument0 + ')\n'; -}; - -Blockly.Lua['text_prompt'] = function(block) { - // Prompt function. - var functionName = Blockly.Lua.provideFunction_( - 'text_prompt', - - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(msg)', - ' io.write(msg)', - ' io.flush()', - ' return io.read()', - 'end']); - var msg = Blockly.Lua.quote_(block.getTitleValue('TEXT')); - var code = functionName + '(' + msg + ')'; - return [code, Blockly.Lua.ORDER_HIGH]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/variables.js b/src/opsoro/apps/visual_programming/static/blockly/generators/lua/variables.js deleted file mode 100644 index e4716d6..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/lua/variables.js +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * http://blockly.googlecode.com/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Lua for variable blocks. - * - * This is unchanged from the Python version, except for replacing "Python" - * with "Lua" wherever it appeared. - * - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Lua.variables'); - -goog.require('Blockly.Lua'); - - -Blockly.Lua['variables_get'] = function(block) { - // Variable getter. - var code = Blockly.Lua.variableDB_.getName(block.getTitleValue('VAR'), - Blockly.Variables.NAME_TYPE); - return [code, Blockly.Lua.ORDER_ATOMIC]; -}; - -Blockly.Lua['variables_set'] = function(block) { - // Variable setter. - var argument0 = Blockly.Lua.valueToCode(block, 'VALUE', - Blockly.Lua.ORDER_NONE) || '0'; - var varName = Blockly.Lua.variableDB_.getName(block.getTitleValue('VAR'), - Blockly.Variables.NAME_TYPE); - return varName + ' = ' + argument0 + '\n'; -}; - -Blockly.Lua['variables_set_two'] = function(block) { - // Set two variables to a function's return value. - // If the input is not a procedure returning mulltiple values, the - // user will have been warned both when the connection was made and when - // changing to the Lua tab. - var value = Blockly.Lua.valueToCode(block, 'VALUE', - Blockly.Lua.ORDER_NONE) || 'nil, nil'; - var varName1 = Blockly.Lua.variableDB_.getName(block.getTitleValue('VAR1'), - Blockly.Variables.NAME_TYPE); - var varName2 = Blockly.Lua.variableDB_.getName(block.getTitleValue('VAR2'), - Blockly.Variables.NAME_TYPE); - return varName1 + ', ' + varName2 + ' = ' + value + '\n'; -}; - -Blockly.Lua['variables_set_three'] = function(block) { - // Set three variables to a function's return value. - // If the input is not a procedure returning at least three values, the - // user will have been warned both when the connection was made and when - // changing to the Lua tab. - var value = Blockly.Lua.valueToCode(block, 'VALUE', - Blockly.Lua.ORDER_NONE) || 'nil, nil, nil'; - var varName1 = Blockly.Lua.variableDB_.getName(block.getTitleValue('VAR1'), - Blockly.Variables.NAME_TYPE); - var varName2 = Blockly.Lua.variableDB_.getName(block.getTitleValue('VAR2'), - Blockly.Variables.NAME_TYPE); - var varName3 = Blockly.Lua.variableDB_.getName(block.getTitleValue('VAR3'), - Blockly.Variables.NAME_TYPE); - return varName1 + ', ' + varName2 + ', ' + varName3 + ' = ' + value + '\n'; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/php.js b/src/opsoro/apps/visual_programming/static/blockly/generators/php.js deleted file mode 100644 index 85af77d..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/php.js +++ /dev/null @@ -1,191 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Helper functions for generating PHP for blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP'); - -goog.require('Blockly.Generator'); - - -/** - * PHP code generator. - * @type {!Blockly.Generator} - */ -Blockly.PHP = new Blockly.Generator('PHP'); - -/** - * List of illegal variable names. - * This is not intended to be a security feature. Blockly is 100% client-side, - * so bypassing this list is trivial. This is intended to prevent users from - * accidentally clobbering a built-in object or function. - * @private - */ -Blockly.PHP.addReservedWords( - // http://php.net/manual/en/reserved.keywords.php - '__halt_compiler,abstract,and,array,as,break,callable,case,catch,class,clone,const,continue,declare,default,die,do,echo,else,elseif,empty,enddeclare,endfor,endforeach,endif,endswitch,endwhile,eval,exit,extends,final,for,foreach,function,global,goto,if,implements,include,include_once,instanceof,insteadof,interface,isset,list,namespace,new,or,print,private,protected,public,require,require_once,return,static,switch,throw,trait,try,unset,use,var,while,xor,' + - // http://php.net/manual/en/reserved.constants.php - 'PHP_VERSION,PHP_MAJOR_VERSION,PHP_MINOR_VERSION,PHP_RELEASE_VERSION,PHP_VERSION_ID,PHP_EXTRA_VERSION,PHP_ZTS,PHP_DEBUG,PHP_MAXPATHLEN,PHP_OS,PHP_SAPI,PHP_EOL,PHP_INT_MAX,PHP_INT_SIZE,DEFAULT_INCLUDE_PATH,PEAR_INSTALL_DIR,PEAR_EXTENSION_DIR,PHP_EXTENSION_DIR,PHP_PREFIX,PHP_BINDIR,PHP_BINARY,PHP_MANDIR,PHP_LIBDIR,PHP_DATADIR,PHP_SYSCONFDIR,PHP_LOCALSTATEDIR,PHP_CONFIG_FILE_PATH,PHP_CONFIG_FILE_SCAN_DIR,PHP_SHLIB_SUFFIX,E_ERROR,E_WARNING,E_PARSE,E_NOTICE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE,E_DEPRECATED,E_USER_DEPRECATED,E_ALL,E_STRICT,__COMPILER_HALT_OFFSET__,TRUE,FALSE,NULL,__CLASS__,__DIR__,__FILE__,__FUNCTION__,__LINE__,__METHOD__,__NAMESPACE__,__TRAIT__'); - -/** - * Order of operation ENUMs. - * http://php.net/manual/en/language.operators.precedence.php - */ -Blockly.PHP.ORDER_ATOMIC = 0; // 0 "" ... -Blockly.PHP.ORDER_CLONE = 1; // clone -Blockly.PHP.ORDER_NEW = 1; // new -Blockly.PHP.ORDER_MEMBER = 2; // () -Blockly.PHP.ORDER_FUNCTION_CALL = 2; // () -Blockly.PHP.ORDER_INCREMENT = 3; // ++ -Blockly.PHP.ORDER_DECREMENT = 3; // -- -Blockly.PHP.ORDER_LOGICAL_NOT = 4; // ! -Blockly.PHP.ORDER_BITWISE_NOT = 4; // ~ -Blockly.PHP.ORDER_UNARY_PLUS = 4; // + -Blockly.PHP.ORDER_UNARY_NEGATION = 4; // - -Blockly.PHP.ORDER_MULTIPLICATION = 5; // * -Blockly.PHP.ORDER_DIVISION = 5; // / -Blockly.PHP.ORDER_MODULUS = 5; // % -Blockly.PHP.ORDER_ADDITION = 6; // + -Blockly.PHP.ORDER_SUBTRACTION = 6; // - -Blockly.PHP.ORDER_BITWISE_SHIFT = 7; // << >> >>> -Blockly.PHP.ORDER_RELATIONAL = 8; // < <= > >= -Blockly.PHP.ORDER_IN = 8; // in -Blockly.PHP.ORDER_INSTANCEOF = 8; // instanceof -Blockly.PHP.ORDER_EQUALITY = 9; // == != === !== -Blockly.PHP.ORDER_BITWISE_AND = 10; // & -Blockly.PHP.ORDER_BITWISE_XOR = 11; // ^ -Blockly.PHP.ORDER_BITWISE_OR = 12; // | -Blockly.PHP.ORDER_CONDITIONAL = 13; // ?: -Blockly.PHP.ORDER_ASSIGNMENT = 14; // = += -= *= /= %= <<= >>= ... -Blockly.PHP.ORDER_LOGICAL_AND = 15; // && -Blockly.PHP.ORDER_LOGICAL_OR = 16; // || -Blockly.PHP.ORDER_COMMA = 17; // , -Blockly.PHP.ORDER_NONE = 99; // (...) - -/** - * Initialise the database of variable names. - * @param {!Blockly.Workspace} workspace Workspace to generate code from. - */ -Blockly.PHP.init = function(workspace) { - // Create a dictionary of definitions to be printed before the code. - Blockly.PHP.definitions_ = Object.create(null); - // Create a dictionary mapping desired function names in definitions_ - // to actual function names (to avoid collisions with user functions). - Blockly.PHP.functionNames_ = Object.create(null); - - if (!Blockly.PHP.variableDB_) { - Blockly.PHP.variableDB_ = - new Blockly.Names(Blockly.PHP.RESERVED_WORDS_, '$'); - } else { - Blockly.PHP.variableDB_.reset(); - } - - var defvars = []; - var variables = Blockly.Variables.allVariables(workspace); - for (var i = 0; i < variables.length; i++) { - defvars[i] = Blockly.PHP.variableDB_.getName(variables[i], - Blockly.Variables.NAME_TYPE) + ';'; - } - Blockly.PHP.definitions_['variables'] = defvars.join('\n'); -}; - -/** - * Prepend the generated code with the variable definitions. - * @param {string} code Generated code. - * @return {string} Completed code. - */ -Blockly.PHP.finish = function(code) { - // Convert the definitions dictionary into a list. - var definitions = []; - for (var name in Blockly.PHP.definitions_) { - definitions.push(Blockly.PHP.definitions_[name]); - } - // Clean up temporary data. - delete Blockly.PHP.definitions_; - delete Blockly.PHP.functionNames_; - Blockly.PHP.variableDB_.reset(); - return definitions.join('\n\n') + '\n\n\n' + code; -}; - -/** - * Naked values are top-level blocks with outputs that aren't plugged into - * anything. A trailing semicolon is needed to make this legal. - * @param {string} line Line of generated code. - * @return {string} Legal line of code. - */ -Blockly.PHP.scrubNakedValue = function(line) { - return line + ';\n'; -}; - -/** - * Encode a string as a properly escaped PHP string, complete with - * quotes. - * @param {string} string Text to encode. - * @return {string} PHP string. - * @private - */ -Blockly.PHP.quote_ = function(string) { - // TODO: This is a quick hack. Replace with goog.string.quote - string = string.replace(/\\/g, '\\\\') - .replace(/\n/g, '\\\n') - .replace(/'/g, '\\\''); - return '\'' + string + '\''; -}; - -/** - * Common tasks for generating PHP from blocks. - * Handles comments for the specified block and any connected value blocks. - * Calls any statements following this block. - * @param {!Blockly.Block} block The current block. - * @param {string} code The PHP code created for this block. - * @return {string} PHP code with comments and subsequent blocks added. - * @private - */ -Blockly.PHP.scrub_ = function(block, code) { - var commentCode = ''; - // Only collect comments for blocks that aren't inline. - if (!block.outputConnection || !block.outputConnection.targetConnection) { - // Collect comment for this block. - var comment = block.getCommentText(); - if (comment) { - commentCode += Blockly.PHP.prefixLines(comment, '// ') + '\n'; - } - // Collect comments for all value arguments. - // Don't collect comments for nested statements. - for (var x = 0; x < block.inputList.length; x++) { - if (block.inputList[x].type == Blockly.INPUT_VALUE) { - var childBlock = block.inputList[x].connection.targetBlock(); - if (childBlock) { - var comment = Blockly.PHP.allNestedComments(childBlock); - if (comment) { - commentCode += Blockly.PHP.prefixLines(comment, '// '); - } - } - } - } - } - var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); - var nextCode = Blockly.PHP.blockToCode(nextBlock); - return commentCode + code + nextCode; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/php/colour.js b/src/opsoro/apps/visual_programming/static/blockly/generators/php/colour.js deleted file mode 100644 index bc1789c..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/php/colour.js +++ /dev/null @@ -1,105 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating PHP for colour blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.colour'); - -goog.require('Blockly.PHP'); - - -Blockly.PHP['colour_picker'] = function(block) { - // Colour picker. - var code = '\'' + block.getFieldValue('COLOUR') + '\''; - return [code, Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['colour_random'] = function(block) { - // Generate a random colour. - var functionName = Blockly.PHP.provideFunction_( - 'colour_random', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '() {', - ' return \'#\' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), ' + - '6, \'0\', STR_PAD_LEFT);', - '}']); - var code = functionName + '()'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['colour_rgb'] = function(block) { - // Compose a colour from RGB components expressed as percentages. - var red = Blockly.PHP.valueToCode(block, 'RED', - Blockly.PHP.ORDER_COMMA) || 0; - var green = Blockly.PHP.valueToCode(block, 'GREEN', - Blockly.PHP.ORDER_COMMA) || 0; - var blue = Blockly.PHP.valueToCode(block, 'BLUE', - Blockly.PHP.ORDER_COMMA) || 0; - var functionName = Blockly.PHP.provideFunction_( - 'colour_rgb', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($r, $g, $b) {', - ' $r = round(max(min($r, 100), 0) * 2.55);', - ' $g = round(max(min($g, 100), 0) * 2.55);', - ' $b = round(max(min($b, 100), 0) * 2.55);', - ' $hex = "#";', - ' $hex .= str_pad(dechex($r), 2, "0", STR_PAD_LEFT);', - ' $hex .= str_pad(dechex($g), 2, "0", STR_PAD_LEFT);', - ' $hex .= str_pad(dechex($b), 2, "0", STR_PAD_LEFT);', - ' return $hex;', - '}']); - var code = functionName + '(' + red + ', ' + green + ', ' + blue + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['colour_blend'] = function(block) { - // Blend two colours together. - var c1 = Blockly.PHP.valueToCode(block, 'COLOUR1', - Blockly.PHP.ORDER_COMMA) || '\'#000000\''; - var c2 = Blockly.PHP.valueToCode(block, 'COLOUR2', - Blockly.PHP.ORDER_COMMA) || '\'#000000\''; - var ratio = Blockly.PHP.valueToCode(block, 'RATIO', - Blockly.PHP.ORDER_COMMA) || 0.5; - var functionName = Blockly.PHP.provideFunction_( - 'colour_blend', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($c1, $c2, $ratio) {', - ' $ratio = max(min($ratio, 1), 0);', - ' $r1 = hexdec(substr($c1, 1, 2));', - ' $g1 = hexdec(substr($c1, 3, 2));', - ' $b1 = hexdec(substr($c1, 5, 2));', - ' $r2 = hexdec(substr($c2, 1, 2));', - ' $g2 = hexdec(substr($c2, 3, 2));', - ' $b2 = hexdec(substr($c2, 5, 2));', - ' $r = round($r1 * (1 - $ratio) + $r2 * $ratio);', - ' $g = round($g1 * (1 - $ratio) + $g2 * $ratio);', - ' $b = round($b1 * (1 - $ratio) + $b2 * $ratio);', - ' $hex = "#";', - ' $hex .= str_pad(dechex($r), 2, "0", STR_PAD_LEFT);', - ' $hex .= str_pad(dechex($g), 2, "0", STR_PAD_LEFT);', - ' $hex .= str_pad(dechex($b), 2, "0", STR_PAD_LEFT);', - ' return $hex;', - '}']); - var code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/php/lists.js b/src/opsoro/apps/visual_programming/static/blockly/generators/php/lists.js deleted file mode 100644 index 1173da5..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/php/lists.js +++ /dev/null @@ -1,381 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating PHP for list blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.lists'); - -goog.require('Blockly.PHP'); - - -Blockly.PHP['lists_create_empty'] = function(block) { - // Create an empty list. - return ['array()', Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['lists_create_with'] = function(block) { - // Create a list with any number of elements of any type. - var code = new Array(block.itemCount_); - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.PHP.valueToCode(block, 'ADD' + n, - Blockly.PHP.ORDER_COMMA) || 'null'; - } - code = 'array(' + code.join(', ') + ')'; - return [code, Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['lists_repeat'] = function(block) { - // Create a list with one element repeated. - var functionName = Blockly.PHP.provideFunction_( - 'lists_repeat', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($value, $count) {', - ' $array = array();', - ' for ($index = 0; $index < $count; $index++) {', - ' $array[] = $value;', - ' }', - ' return $array;', - '}']); - var argument0 = Blockly.PHP.valueToCode(block, 'ITEM', - Blockly.PHP.ORDER_COMMA) || 'null'; - var argument1 = Blockly.PHP.valueToCode(block, 'NUM', - Blockly.PHP.ORDER_COMMA) || '0'; - var code = functionName + '(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['lists_length'] = function(block) { - // String or array length. - var functionName = Blockly.PHP.provideFunction_( - 'length', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($value) {', - ' if (is_string($value)) {', - ' return strlen($value);', - ' } else {', - ' return count($value);', - ' }', - '}']); - var argument0 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - return [functionName + '(' + argument0 + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['lists_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_FUNCTION_CALL) || 'array()'; - return ['empty(' + argument0 + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['lists_indexOf'] = function(block) { - // Find an item in the list. - var operator = block.getFieldValue('END') == 'FIRST' ? - 'indexOf' : 'lastIndexOf'; - var argument0 = Blockly.PHP.valueToCode(block, 'FIND', - Blockly.PHP.ORDER_NONE) || '\'\''; - var argument1 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_MEMBER) || '[]'; - var functionName; - if (block.getFieldValue('END') == 'FIRST'){ - // indexOf - functionName = Blockly.PHP.provideFunction_( - 'indexOf', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($haystack, $needle) {', - ' for ($index = 0; $index < count($haystack); $index++) {', - ' if ($haystack[$index] == $needle) return $index+1;', - ' }', - ' return 0;', - '}']); - } else { - // lastIndexOf - functionName = Blockly.PHP.provideFunction_( - 'lastIndexOf', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($haystack, $needle) {', - ' $last = 0;', - ' for ($index = 0; $index < count($haystack); $index++) {', - ' if ($haystack[$index] == $needle) $last = $index+1;', - ' }', - ' return $last;', - '}']); - } - - var code = functionName + '(' + argument1 + ', ' + argument0 + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['lists_getIndex'] = function(block) { - // Get element at index. - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.PHP.valueToCode(block, 'AT', - Blockly.PHP.ORDER_UNARY_NEGATION) || '1'; - var list = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_FUNCTION_CALL) || 'array()'; - - if (where == 'FIRST') { - if (mode == 'GET') { - var code = list + '[0]'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'GET_REMOVE') { - var code = 'array_shift(' + list + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return 'array_shift(' + list + ');\n'; - } - } else if (where == 'LAST') { - if (mode == 'GET') { - var code = 'end(' + list + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'GET_REMOVE') { - var code = 'array_pop(' + list + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return 'array_pop(' + list + ');\n'; - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseFloat(at) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - if (mode == 'GET') { - var code = list + '[' + at + ']'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'GET_REMOVE') { - var code = 'array_splice(' + list + ', ' + at + ', 1)[0]'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return 'array_splice(' + list + ', ' + at + ', 1);\n'; - } - } else if (where == 'FROM_END') { - if (mode == 'GET') { - var code = 'array_slice(' + list + ', -' + at + ', 1)[0]'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') { - code = 'array_splice(' + list + - ', count(' + list + ') - ' + at + ', 1)[0]'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + ';\n'; - } - } - } else if (where == 'RANDOM') { - if (mode == 'GET'){ - var functionName = Blockly.PHP.provideFunction_( - 'lists_get_random_item', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($list) {', - ' return $list[rand(0,count($list)-1)];', - '}']); - code = functionName + '(' + list + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'GET_REMOVE'){ - var functionName = Blockly.PHP.provideFunction_( - 'lists_get_remove_random_item', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '(&$list) {', - ' $x = rand(0,count($list)-1);', - ' unset($list[$x]);', - ' return array_values($list);', - '}']); - code = functionName + '(' + list + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - var functionName = Blockly.PHP.provideFunction_( - 'lists_remove_random_item', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '(&$list) {', - ' unset($list[rand(0,count($list)-1)]);', - '}']); - return functionName + '(' + list + ');\n'; - } - } - throw 'Unhandled combination (lists_getIndex).'; -}; - -Blockly.PHP['lists_setIndex'] = function(block) { - // Set element at index. - // Note: Until February 2013 this block did not have MODE or WHERE inputs. - var list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_MEMBER) || 'array()'; - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.PHP.valueToCode(block, 'AT', - Blockly.PHP.ORDER_NONE) || '1'; - var value = Blockly.PHP.valueToCode(block, 'TO', - Blockly.PHP.ORDER_ASSIGNMENT) || 'null'; - // Cache non-trivial values to variables to prevent repeated look-ups. - // Closure, which accesses and modifies 'list'. - function cacheList() { - if (list.match(/^\w+$/)) { - return ''; - } - var listVar = Blockly.PHP.variableDB_.getDistinctName( - 'tmp_list', Blockly.Variables.NAME_TYPE); - var code = listVar + ' = &' + list + ';\n'; - list = listVar; - return code; - } - if (where == 'FIRST') { - if (mode == 'SET') { - return list + '[0] = ' + value + ';\n'; - } else if (mode == 'INSERT') { - return 'array_unshift(' + list + ', ' + value + ');\n'; - } - } else if (where == 'LAST') { - if (mode == 'SET') { - var functionName = Blockly.PHP.provideFunction_( - 'lists_set_last_item', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '(&$list, $value) {', - ' $list[count($list) - 1] = $value;', - '}']); - return functionName + '(' + list + ', ' + value + ');\n'; - } else if (mode == 'INSERT') { - return 'array_push(' + list + ', ' + value + ');\n'; - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseFloat(at) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - if (mode == 'SET') { - return list + '[' + at + '] = ' + value + ';\n'; - } else if (mode == 'INSERT') { - return 'array_splice(' + list + ', ' + at + ', 0, ' + value + ');\n'; - } - } else if (where == 'FROM_END') { - if (mode == 'SET') { - var functionName = Blockly.PHP.provideFunction_( - 'lists_set_from_end', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '(&$list, $at, $value) {', - ' $list[count($list) - $at] = $value;', - '}']); - return functionName + '(' + list + ', ' + at + ', ' + value + ');\n'; - } else if (mode == 'INSERT') { - var functionName = Blockly.PHP.provideFunction_( - 'lists_insert_from_end', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '(&$list, $at, $value) {', - ' return array_splice($list, count($list) - $at, 0, $value);', - '}']); - return functionName + '(' + list + ', ' + at + ', ' + value + ');\n'; - } - } else if (where == 'RANDOM') { - var code = cacheList(); - var xVar = Blockly.PHP.variableDB_.getDistinctName( - 'tmp_x', Blockly.Variables.NAME_TYPE); - code += xVar + ' = rand(0, count(' + list + ')-1);\n'; - if (mode == 'SET') { - code += list + '[' + xVar + '] = ' + value + ';\n'; - return code; - } else if (mode == 'INSERT') { - code += 'array_splice(' + list + ', ' + xVar + ', 0, ' + value + ');\n'; - return code; - } - } - throw 'Unhandled combination (lists_setIndex).'; -}; - -Blockly.PHP['lists_getSublist'] = function(block) { - // Get sublist. - var list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_MEMBER) || 'array()'; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.PHP.valueToCode(block, 'AT1', - Blockly.PHP.ORDER_NONE) || '1'; - var at2 = Blockly.PHP.valueToCode(block, 'AT2', - Blockly.PHP.ORDER_NONE) || '1'; - if (where1 == 'FIRST' && where2 == 'LAST') { - var code = list; - } else { - var functionName = Blockly.PHP.provideFunction_( - 'lists_get_sublist', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($list, $where1, $at1, $where2, $at2) {', - ' if ($where2 == \'FROM_START\') {', - ' $at2--;', - ' } else if ($where2 == \'FROM_END\') {', - ' $at2 = $at2 - $at1;', - ' } else if ($where2 == \'FIRST\') {', - ' $at2 = 0;', - ' } else if ($where2 == \'LAST\') {', - ' $at2 = count($list);', - ' } else {', - ' throw \'Unhandled option (lists_getSublist).\';', - ' }', - ' if ($where1 == \'FROM_START\') {', - ' $at1--;', - ' } else if ($where1 == \'FROM_END\') {', - ' $at1 = count($list) - $at1;', - ' } else if ($where1 == \'FIRST\') {', - ' $at1 = 0;', - ' } else if ($where1 == \'LAST\') {', - ' $at1 = count($list) - 1;', - ' } else {', - ' throw \'Unhandled option (lists_getSublist).\';', - ' }', - ' return array_slice($list, $at1, $at2);', - '}']); - var code = functionName + '(' + list + ', \'' + - where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; - } - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['lists_split'] = function(block) { - // Block for splitting text into a list, or joining a list into text. - var value_input = Blockly.PHP.valueToCode(block, 'INPUT', - Blockly.PHP.ORDER_MEMBER); - var value_delim = Blockly.PHP.valueToCode(block, 'DELIM', - Blockly.PHP.ORDER_NONE) || '\'\''; - var mode = block.getFieldValue('MODE'); - if (mode == 'SPLIT') { - if (!value_input) { - value_input = '\'\''; - } - var functionName = 'explode'; - } else if (mode == 'JOIN') { - if (!value_input) { - value_input = 'array()'; - } - var functionName = 'implode'; - } else { - throw 'Unknown mode: ' + mode; - } - var code = functionName + '(' + value_delim + ', ' + value_input + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/php/logic.js b/src/opsoro/apps/visual_programming/static/blockly/generators/php/logic.js deleted file mode 100644 index 5938923..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/php/logic.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating PHP for logic blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.logic'); - -goog.require('Blockly.PHP'); - - -Blockly.PHP['controls_if'] = function(block) { - // If/elseif/else condition. - var n = 0; - var argument = Blockly.PHP.valueToCode(block, 'IF' + n, - Blockly.PHP.ORDER_NONE) || 'false'; - var branch = Blockly.PHP.statementToCode(block, 'DO' + n); - var code = 'if (' + argument + ') {\n' + branch + '}'; - for (n = 1; n <= block.elseifCount_; n++) { - argument = Blockly.PHP.valueToCode(block, 'IF' + n, - Blockly.PHP.ORDER_NONE) || 'false'; - branch = Blockly.PHP.statementToCode(block, 'DO' + n); - code += ' else if (' + argument + ') {\n' + branch + '}'; - } - if (block.elseCount_) { - branch = Blockly.PHP.statementToCode(block, 'ELSE'); - code += ' else {\n' + branch + '}'; - } - return code + '\n'; -}; - -Blockly.PHP['logic_compare'] = function(block) { - // Comparison operator. - var OPERATORS = { - 'EQ': '==', - 'NEQ': '!=', - 'LT': '<', - 'LTE': '<=', - 'GT': '>', - 'GTE': '>=' - }; - var operator = OPERATORS[block.getFieldValue('OP')]; - var order = (operator == '==' || operator == '!=') ? - Blockly.PHP.ORDER_EQUALITY : Blockly.PHP.ORDER_RELATIONAL; - var argument0 = Blockly.PHP.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.PHP.valueToCode(block, 'B', order) || '0'; - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.PHP['logic_operation'] = function(block) { - // Operations 'and', 'or'. - var operator = (block.getFieldValue('OP') == 'AND') ? '&&' : '||'; - var order = (operator == '&&') ? Blockly.PHP.ORDER_LOGICAL_AND : - Blockly.PHP.ORDER_LOGICAL_OR; - var argument0 = Blockly.PHP.valueToCode(block, 'A', order); - var argument1 = Blockly.PHP.valueToCode(block, 'B', order); - if (!argument0 && !argument1) { - // If there are no arguments, then the return value is false. - argument0 = 'false'; - argument1 = 'false'; - } else { - // Single missing arguments have no effect on the return value. - var defaultArgument = (operator == '&&') ? 'true' : 'false'; - if (!argument0) { - argument0 = defaultArgument; - } - if (!argument1) { - argument1 = defaultArgument; - } - } - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.PHP['logic_negate'] = function(block) { - // Negation. - var order = Blockly.PHP.ORDER_LOGICAL_NOT; - var argument0 = Blockly.PHP.valueToCode(block, 'BOOL', order) || - 'true'; - var code = '!' + argument0; - return [code, order]; -}; - -Blockly.PHP['logic_boolean'] = function(block) { - // Boolean values true and false. - var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'true' : 'false'; - return [code, Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['logic_null'] = function(block) { - // Null data type. - return ['null', Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['logic_ternary'] = function(block) { - // Ternary operator. - var value_if = Blockly.PHP.valueToCode(block, 'IF', - Blockly.PHP.ORDER_CONDITIONAL) || 'false'; - var value_then = Blockly.PHP.valueToCode(block, 'THEN', - Blockly.PHP.ORDER_CONDITIONAL) || 'null'; - var value_else = Blockly.PHP.valueToCode(block, 'ELSE', - Blockly.PHP.ORDER_CONDITIONAL) || 'null'; - var code = value_if + ' ? ' + value_then + ' : ' + value_else; - return [code, Blockly.PHP.ORDER_CONDITIONAL]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/php/loops.js b/src/opsoro/apps/visual_programming/static/blockly/generators/php/loops.js deleted file mode 100644 index 4a905b4..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/php/loops.js +++ /dev/null @@ -1,164 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating PHP for loop blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.loops'); - -goog.require('Blockly.PHP'); - - -Blockly.PHP['controls_repeat_ext'] = function(block) { - // Repeat n times. - if (block.getField('TIMES')) { - // Internal number. - var repeats = String(Number(block.getFieldValue('TIMES'))); - } else { - // External number. - var repeats = Blockly.PHP.valueToCode(block, 'TIMES', - Blockly.PHP.ORDER_ASSIGNMENT) || '0'; - } - var branch = Blockly.PHP.statementToCode(block, 'DO'); - branch = Blockly.PHP.addLoopTrap(branch, block.id); - var code = ''; - var loopVar = Blockly.PHP.variableDB_.getDistinctName( - 'count', Blockly.Variables.NAME_TYPE); - var endVar = repeats; - if (!repeats.match(/^\w+$/) && !Blockly.isNumber(repeats)) { - var endVar = Blockly.PHP.variableDB_.getDistinctName( - 'repeat_end', Blockly.Variables.NAME_TYPE); - code += endVar + ' = ' + repeats + ';\n'; - } - code += 'for (' + loopVar + ' = 0; ' + - loopVar + ' < ' + endVar + '; ' + - loopVar + '++) {\n' + - branch + '}\n'; - return code; -}; - -Blockly.PHP['controls_repeat'] = Blockly.PHP['controls_repeat_ext']; - -Blockly.PHP['controls_whileUntil'] = function(block) { - // Do while/until loop. - var until = block.getFieldValue('MODE') == 'UNTIL'; - var argument0 = Blockly.PHP.valueToCode(block, 'BOOL', - until ? Blockly.PHP.ORDER_LOGICAL_NOT : - Blockly.PHP.ORDER_NONE) || 'false'; - var branch = Blockly.PHP.statementToCode(block, 'DO'); - branch = Blockly.PHP.addLoopTrap(branch, block.id); - if (until) { - argument0 = '!' + argument0; - } - return 'while (' + argument0 + ') {\n' + branch + '}\n'; -}; - -Blockly.PHP['controls_for'] = function(block) { - // For loop. - var variable0 = Blockly.PHP.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.PHP.valueToCode(block, 'FROM', - Blockly.PHP.ORDER_ASSIGNMENT) || '0'; - var argument1 = Blockly.PHP.valueToCode(block, 'TO', - Blockly.PHP.ORDER_ASSIGNMENT) || '0'; - var increment = Blockly.PHP.valueToCode(block, 'BY', - Blockly.PHP.ORDER_ASSIGNMENT) || '1'; - var branch = Blockly.PHP.statementToCode(block, 'DO'); - branch = Blockly.PHP.addLoopTrap(branch, block.id); - var code; - if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && - Blockly.isNumber(increment)) { - // All arguments are simple numbers. - var up = parseFloat(argument0) <= parseFloat(argument1); - code = 'for (' + variable0 + ' = ' + argument0 + '; ' + - variable0 + (up ? ' <= ' : ' >= ') + argument1 + '; ' + - variable0; - var step = Math.abs(parseFloat(increment)); - if (step == 1) { - code += up ? '++' : '--'; - } else { - code += (up ? ' += ' : ' -= ') + step; - } - code += ') {\n' + branch + '}\n'; - } else { - code = ''; - // Cache non-trivial values to variables to prevent repeated look-ups. - var startVar = argument0; - if (!argument0.match(/^\w+$/) && !Blockly.isNumber(argument0)) { - startVar = Blockly.PHP.variableDB_.getDistinctName( - variable0 + '_start', Blockly.Variables.NAME_TYPE); - code += startVar + ' = ' + argument0 + ';\n'; - } - var endVar = argument1; - if (!argument1.match(/^\w+$/) && !Blockly.isNumber(argument1)) { - var endVar = Blockly.PHP.variableDB_.getDistinctName( - variable0 + '_end', Blockly.Variables.NAME_TYPE); - code += endVar + ' = ' + argument1 + ';\n'; - } - // Determine loop direction at start, in case one of the bounds - // changes during loop execution. - var incVar = Blockly.PHP.variableDB_.getDistinctName( - variable0 + '_inc', Blockly.Variables.NAME_TYPE); - code += incVar + ' = '; - if (Blockly.isNumber(increment)) { - code += Math.abs(increment) + ';\n'; - } else { - code += 'abs(' + increment + ');\n'; - } - code += 'if (' + startVar + ' > ' + endVar + ') {\n'; - code += Blockly.PHP.INDENT + incVar + ' = -' + incVar + ';\n'; - code += '}\n'; - code += 'for (' + variable0 + ' = ' + startVar + ';\n' + - ' ' + incVar + ' >= 0 ? ' + - variable0 + ' <= ' + endVar + ' : ' + - variable0 + ' >= ' + endVar + ';\n' + - ' ' + variable0 + ' += ' + incVar + ') {\n' + - branch + '}\n'; - } - return code; -}; - -Blockly.PHP['controls_forEach'] = function(block) { - // For each loop. - var variable0 = Blockly.PHP.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_ASSIGNMENT) || '[]'; - var branch = Blockly.PHP.statementToCode(block, 'DO'); - branch = Blockly.PHP.addLoopTrap(branch, block.id); - var code = ''; - code += 'foreach (' + argument0 + ' as ' + variable0 + - ') {\n' + branch + '}\n'; - return code; -}; - -Blockly.PHP['controls_flow_statements'] = function(block) { - // Flow statements: continue, break. - switch (block.getFieldValue('FLOW')) { - case 'BREAK': - return 'break;\n'; - case 'CONTINUE': - return 'continue;\n'; - } - throw 'Unknown flow statement.'; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/php/math.js b/src/opsoro/apps/visual_programming/static/blockly/generators/php/math.js deleted file mode 100644 index 0f52996..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/php/math.js +++ /dev/null @@ -1,370 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating PHP for math blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.math'); - -goog.require('Blockly.PHP'); - - -Blockly.PHP['math_number'] = function(block) { - // Numeric value. - var code = parseFloat(block.getFieldValue('NUM')); - return [code, Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['math_arithmetic'] = function(block) { - // Basic arithmetic operators, and power. - var OPERATORS = { - 'ADD': [' + ', Blockly.PHP.ORDER_ADDITION], - 'MINUS': [' - ', Blockly.PHP.ORDER_SUBTRACTION], - 'MULTIPLY': [' * ', Blockly.PHP.ORDER_MULTIPLICATION], - 'DIVIDE': [' / ', Blockly.PHP.ORDER_DIVISION], - 'POWER': [null, Blockly.PHP.ORDER_COMMA] // Handle power separately. - }; - var tuple = OPERATORS[block.getFieldValue('OP')]; - var operator = tuple[0]; - var order = tuple[1]; - var argument0 = Blockly.PHP.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.PHP.valueToCode(block, 'B', order) || '0'; - var code; - // Power in PHP requires a special case since it has no operator. - if (!operator) { - code = 'pow(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } - code = argument0 + operator + argument1; - return [code, order]; -}; - -Blockly.PHP['math_single'] = function(block) { - // Math operators with single operand. - var operator = block.getFieldValue('OP'); - var code; - var arg; - if (operator == 'NEG') { - // Negation is a special case given its different operator precedence. - arg = Blockly.PHP.valueToCode(block, 'NUM', - Blockly.PHP.ORDER_UNARY_NEGATION) || '0'; - if (arg[0] == '-') { - // --3 is not legal in JS. - arg = ' ' + arg; - } - code = '-' + arg; - return [code, Blockly.PHP.ORDER_UNARY_NEGATION]; - } - if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') { - arg = Blockly.PHP.valueToCode(block, 'NUM', - Blockly.PHP.ORDER_DIVISION) || '0'; - } else { - arg = Blockly.PHP.valueToCode(block, 'NUM', - Blockly.PHP.ORDER_NONE) || '0'; - } - // First, handle cases which generate values that don't need parentheses - // wrapping the code. - switch (operator) { - case 'ABS': - code = 'abs(' + arg + ')'; - break; - case 'ROOT': - code = 'sqrt(' + arg + ')'; - break; - case 'LN': - code = 'log(' + arg + ')'; - break; - case 'EXP': - code = 'exp(' + arg + ')'; - break; - case 'POW10': - code = 'pow(10,' + arg + ')'; - break; - case 'ROUND': - code = 'round(' + arg + ')'; - break; - case 'ROUNDUP': - code = 'ceil(' + arg + ')'; - break; - case 'ROUNDDOWN': - code = 'floor(' + arg + ')'; - break; - case 'SIN': - code = 'sin(' + arg + ' / 180 * pi())'; - break; - case 'COS': - code = 'cos(' + arg + ' / 180 * pi())'; - break; - case 'TAN': - code = 'tan(' + arg + ' / 180 * pi())'; - break; - } - if (code) { - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } - // Second, handle cases which generate values that may need parentheses - // wrapping the code. - switch (operator) { - case 'LOG10': - code = 'log(' + arg + ') / log(10)'; - break; - case 'ASIN': - code = 'asin(' + arg + ') / pi() * 180'; - break; - case 'ACOS': - code = 'acos(' + arg + ') / pi() * 180'; - break; - case 'ATAN': - code = 'atan(' + arg + ') / pi() * 180'; - break; - default: - throw 'Unknown math operator: ' + operator; - } - return [code, Blockly.PHP.ORDER_DIVISION]; -}; - -Blockly.PHP['math_constant'] = function(block) { - // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. - var CONSTANTS = { - 'PI': ['M_PI', Blockly.PHP.ORDER_ATOMIC], - 'E': ['M_E', Blockly.PHP.ORDER_ATOMIC], - 'GOLDEN_RATIO': ['(1 + sqrt(5)) / 2', Blockly.PHP.ORDER_DIVISION], - 'SQRT2': ['M_SQRT2', Blockly.PHP.ORDER_ATOMIC], - 'SQRT1_2': ['M_SQRT1_2', Blockly.PHP.ORDER_ATOMIC], - 'INFINITY': ['INF', Blockly.PHP.ORDER_ATOMIC] - }; - return CONSTANTS[block.getFieldValue('CONSTANT')]; -}; - -Blockly.PHP['math_number_property'] = function(block) { - // Check if a number is even, odd, prime, whole, positive, or negative - // or if it is divisible by certain number. Returns true or false. - var number_to_check = Blockly.PHP.valueToCode(block, 'NUMBER_TO_CHECK', - Blockly.PHP.ORDER_MODULUS) || '0'; - var dropdown_property = block.getFieldValue('PROPERTY'); - var code; - if (dropdown_property == 'PRIME') { - // Prime is a special case as it is not a one-liner test. - var functionName = Blockly.PHP.provideFunction_( - 'math_isPrime', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($n) {', - ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods', - ' if ($n == 2 || $n == 3) {', - ' return true;', - ' }', - ' // False if n is NaN, negative, is 1, or not whole.', - ' // And false if n is divisible by 2 or 3.', - ' if (!is_numeric($n) || $n <= 1 || $n % 1 != 0 || $n % 2 == 0 ||' + - ' $n % 3 == 0) {', - ' return false;', - ' }', - ' // Check all the numbers of form 6k +/- 1, up to sqrt(n).', - ' for ($x = 6; $x <= sqrt($n) + 1; $x += 6) {', - ' if ($n % ($x - 1) == 0 || $n % ($x + 1) == 0) {', - ' return false;', - ' }', - ' }', - ' return true;', - '}']); - code = functionName + '(' + number_to_check + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } - switch (dropdown_property) { - case 'EVEN': - code = number_to_check + ' % 2 == 0'; - break; - case 'ODD': - code = number_to_check + ' % 2 == 1'; - break; - case 'WHOLE': - code = 'is_int(' + number_to_check + ')'; - break; - case 'POSITIVE': - code = number_to_check + ' > 0'; - break; - case 'NEGATIVE': - code = number_to_check + ' < 0'; - break; - case 'DIVISIBLE_BY': - var divisor = Blockly.PHP.valueToCode(block, 'DIVISOR', - Blockly.PHP.ORDER_MODULUS) || '0'; - code = number_to_check + ' % ' + divisor + ' == 0'; - break; - } - return [code, Blockly.PHP.ORDER_EQUALITY]; -}; - -Blockly.PHP['math_change'] = function(block) { - // Add to a variable in place. - var argument0 = Blockly.PHP.valueToCode(block, 'DELTA', - Blockly.PHP.ORDER_ADDITION) || '0'; - var varName = Blockly.PHP.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - return varName + ' += ' + argument0 + ';\n'; -}; - -// Rounding functions have a single operand. -Blockly.PHP['math_round'] = Blockly.PHP['math_single']; -// Trigonometry functions have a single operand. -Blockly.PHP['math_trig'] = Blockly.PHP['math_single']; - -Blockly.PHP['math_on_list'] = function(block) { - // Math functions for lists. - var func = block.getFieldValue('OP'); - var list, code; - switch (func) { - case 'SUM': - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_FUNCTION_CALL) || 'array()'; - code = 'array_sum(' + list + ')'; - break; - case 'MIN': - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_FUNCTION_CALL) || 'array()'; - code = 'min(' + list + ')'; - break; - case 'MAX': - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_FUNCTION_CALL) || 'array()'; - code = 'max(' + list + ')'; - break; - case 'AVERAGE': - var functionName = Blockly.PHP.provideFunction_( - 'math_mean', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($myList) {', - ' return array_sum($myList) / count($myList);', - '}']); - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_NONE) || 'array()'; - code = functionName + '(' + list + ')'; - break; - case 'MEDIAN': - var functionName = Blockly.PHP.provideFunction_( - 'math_median', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($arr) {', - ' sort($arr,SORT_NUMERIC);', - ' return (count($arr) % 2) ? $arr[floor(count($arr)/2)] : ', - ' ($arr[floor(count($arr)/2)] + $arr[floor(count($arr)/2) - 1]) / 2;', - '}']); - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - case 'MODE': - // As a list of numbers can contain more than one mode, - // the returned result is provided as an array. - // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]. - var functionName = Blockly.PHP.provideFunction_( - 'math_modes', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($values) {', - ' $v = array_count_values($values);', - ' arsort($v);', - ' foreach($v as $k => $v){$total = $k; break;}', - ' return array($total);', - '}']); - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - case 'STD_DEV': - var functionName = Blockly.PHP.provideFunction_( - 'math_standard_deviation', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($numbers) {', - ' $n = count($numbers);', - ' if (!$n) return null;', - ' $mean = array_sum($numbers) / count($numbers);', - ' foreach($numbers as $key => $num) $devs[$key] = pow($num - $mean, 2);', - ' return sqrt(array_sum($devs) / (count($devs) - 1));', - '}']); - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - case 'RANDOM': - var functionName = Blockly.PHP.provideFunction_( - 'math_random_list', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($list) {', - ' $x = rand(0, count($list)-1);', - ' return $list[$x];', - '}']); - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - default: - throw 'Unknown operator: ' + func; - } - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['math_modulo'] = function(block) { - // Remainder computation. - var argument0 = Blockly.PHP.valueToCode(block, 'DIVIDEND', - Blockly.PHP.ORDER_MODULUS) || '0'; - var argument1 = Blockly.PHP.valueToCode(block, 'DIVISOR', - Blockly.PHP.ORDER_MODULUS) || '0'; - var code = argument0 + ' % ' + argument1; - return [code, Blockly.PHP.ORDER_MODULUS]; -}; - -Blockly.PHP['math_constrain'] = function(block) { - // Constrain a number between two limits. - var argument0 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_COMMA) || '0'; - var argument1 = Blockly.PHP.valueToCode(block, 'LOW', - Blockly.PHP.ORDER_COMMA) || '0'; - var argument2 = Blockly.PHP.valueToCode(block, 'HIGH', - Blockly.PHP.ORDER_COMMA) || 'Infinity'; - var code = 'min(max(' + argument0 + ', ' + argument1 + '), ' + - argument2 + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['math_random_int'] = function(block) { - // Random integer between [X] and [Y]. - var argument0 = Blockly.PHP.valueToCode(block, 'FROM', - Blockly.PHP.ORDER_COMMA) || '0'; - var argument1 = Blockly.PHP.valueToCode(block, 'TO', - Blockly.PHP.ORDER_COMMA) || '0'; - var functionName = Blockly.PHP.provideFunction_( - 'math_random_int', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($a, $b) {', - ' if ($a > $b) {', - ' return rand($b, $a);', - ' }', - ' return rand($a, $b);', - '}']); - var code = functionName + '(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['math_random_float'] = function(block) { - // Random fraction between 0 and 1. - return ['(float)rand()/(float)getrandmax()', Blockly.PHP.ORDER_FUNCTION_CALL]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/php/procedures.js b/src/opsoro/apps/visual_programming/static/blockly/generators/php/procedures.js deleted file mode 100644 index 75903e3..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/php/procedures.js +++ /dev/null @@ -1,122 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating PHP for procedure blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.procedures'); - -goog.require('Blockly.PHP'); - -Blockly.PHP['procedures_defreturn'] = function(block) { - // Define a procedure with a return value. - // First, add a 'global' statement for every variable that is assigned. - var globals = Blockly.Variables.allVariables(block); - for (var i = globals.length - 1; i >= 0; i--) { - var varName = globals[i]; - if (block.arguments_.indexOf(varName) == -1) { - globals[i] = Blockly.PHP.variableDB_.getName(varName, - Blockly.Variables.NAME_TYPE); - } else { - // This variable is actually a parameter name. Do not include it in - // the list of globals, thus allowing it be of local scope. - globals.splice(i, 1); - } - } - globals = globals.length ? ' global ' + globals.join(', ') + ';\n' : ''; - - var funcName = Blockly.PHP.variableDB_.getName( - block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var branch = Blockly.PHP.statementToCode(block, 'STACK'); - if (Blockly.PHP.STATEMENT_PREFIX) { - branch = Blockly.PHP.prefixLines( - Blockly.PHP.STATEMENT_PREFIX.replace(/%1/g, - '\'' + block.id + '\''), Blockly.PHP.INDENT) + branch; - } - if (Blockly.PHP.INFINITE_LOOP_TRAP) { - branch = Blockly.PHP.INFINITE_LOOP_TRAP.replace(/%1/g, - '\'' + block.id + '\'') + branch; - } - var returnValue = Blockly.PHP.valueToCode(block, 'RETURN', - Blockly.PHP.ORDER_NONE) || ''; - if (returnValue) { - returnValue = ' return ' + returnValue + ';\n'; - } - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.PHP.variableDB_.getName(block.arguments_[x], - Blockly.Variables.NAME_TYPE); - } - var code = 'function ' + funcName + '(' + args.join(', ') + ') {\n' + - globals + branch + returnValue + '}'; - code = Blockly.PHP.scrub_(block, code); - Blockly.PHP.definitions_[funcName] = code; - return null; -}; - -// Defining a procedure without a return value uses the same generator as -// a procedure with a return value. -Blockly.PHP['procedures_defnoreturn'] = - Blockly.PHP['procedures_defreturn']; - -Blockly.PHP['procedures_callreturn'] = function(block) { - // Call a procedure with a return value. - var funcName = Blockly.PHP.variableDB_.getName( - block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.PHP.valueToCode(block, 'ARG' + x, - Blockly.PHP.ORDER_COMMA) || 'null'; - } - var code = funcName + '(' + args.join(', ') + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['procedures_callnoreturn'] = function(block) { - // Call a procedure with no return value. - var funcName = Blockly.PHP.variableDB_.getName( - block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.PHP.valueToCode(block, 'ARG' + x, - Blockly.PHP.ORDER_COMMA) || 'null'; - } - var code = funcName + '(' + args.join(', ') + ');\n'; - return code; -}; - -Blockly.PHP['procedures_ifreturn'] = function(block) { - // Conditionally return value from a procedure. - var condition = Blockly.PHP.valueToCode(block, 'CONDITION', - Blockly.PHP.ORDER_NONE) || 'false'; - var code = 'if (' + condition + ') {\n'; - if (block.hasReturnValue_) { - var value = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_NONE) || 'null'; - code += ' return ' + value + ';\n'; - } else { - code += ' return;\n'; - } - code += '}\n'; - return code; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/php/text.js b/src/opsoro/apps/visual_programming/static/blockly/generators/php/text.js deleted file mode 100644 index 561b499..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/php/text.js +++ /dev/null @@ -1,260 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating PHP for text blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.texts'); - -goog.require('Blockly.PHP'); - - -Blockly.PHP['text'] = function(block) { - // Text value. - var code = Blockly.PHP.quote_(block.getFieldValue('TEXT')); - return [code, Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['text_join'] = function(block) { - // Create a string made up of any number of elements of any type. - var code; - if (block.itemCount_ == 0) { - return ['\'\'', Blockly.PHP.ORDER_ATOMIC]; - } else if (block.itemCount_ == 1) { - var argument0 = Blockly.PHP.valueToCode(block, 'ADD0', - Blockly.PHP.ORDER_NONE) || '\'\''; - code = argument0; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (block.itemCount_ == 2) { - var argument0 = Blockly.PHP.valueToCode(block, 'ADD0', - Blockly.PHP.ORDER_NONE) || '\'\''; - var argument1 = Blockly.PHP.valueToCode(block, 'ADD1', - Blockly.PHP.ORDER_NONE) || '\'\''; - code = argument0 + ' . ' + argument1; - return [code, Blockly.PHP.ORDER_ADDITION]; - } else { - code = new Array(block.itemCount_); - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.PHP.valueToCode(block, 'ADD' + n, - Blockly.PHP.ORDER_COMMA) || '\'\''; - } - code = 'implode(\'\', array(' + code.join(',') + '))'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } -}; - -Blockly.PHP['text_append'] = function(block) { - // Append to a variable in place. - var varName = Blockly.PHP.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.PHP.valueToCode(block, 'TEXT', - Blockly.PHP.ORDER_NONE) || '\'\''; - return varName + ' .= ' + argument0 + ';\n'; -}; - -Blockly.PHP['text_length'] = function(block) { - // String or array length. - var functionName = Blockly.PHP.provideFunction_( - 'length', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($value) {', - ' if (is_string($value)) {', - ' return strlen($value);', - ' } else {', - ' return count($value);', - ' }', - '}']); - var argument0 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - return [functionName + '(' + argument0 + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['text_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - return ['empty(' + argument0 + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['text_indexOf'] = function(block) { - // Search the text for a substring. - var operator = block.getFieldValue('END') == 'FIRST' ? - 'strpos' : 'strrpos'; - var argument0 = Blockly.PHP.valueToCode(block, 'FIND', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - var argument1 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - var code = operator + '(' + argument1 + ', ' + argument0 + ') + 1'; - - var functionName = Blockly.PHP.provideFunction_( - block.getFieldValue('END') == 'FIRST' ? - 'text_indexOf' : 'text_lastIndexOf', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($text, $search) {', - ' $pos = ' + operator + '($text, $search);', - ' return $pos === false ? 0 : $pos + 1;', - '}']); - code = functionName + '(' + argument1 + ', ' + argument0 + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['text_charAt'] = function(block) { - // Get letter at index. - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.PHP.valueToCode(block, 'AT', - Blockly.PHP.ORDER_FUNCTION_CALL) || '0'; - var text = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - switch (where) { - case 'FIRST': - var code = text + '[0]'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - case 'LAST': - var code = 'substr(' + text + ', -1, 1)'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - case 'FROM_START': - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseFloat(at) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - var code = 'substr(' + text + ', ' + at + ', 1)'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - case 'FROM_END': - var code = 'substr(' + text + ', -' + at + ', 1)'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - case 'RANDOM': - var functionName = Blockly.PHP.provideFunction_( - 'text_random_letter', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($text) {', - ' return $text[rand(0, strlen($text) - 1)];', - '}']); - code = functionName + '(' + text + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } - throw 'Unhandled option (text_charAt).'; -}; - -Blockly.PHP['text_getSubstring'] = function(block) { - // Get substring. - var text = Blockly.PHP.valueToCode(block, 'STRING', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.PHP.valueToCode(block, 'AT1', - Blockly.PHP.ORDER_FUNCTION_CALL) || '0'; - var at2 = Blockly.PHP.valueToCode(block, 'AT2', - Blockly.PHP.ORDER_FUNCTION_CALL) || '0'; - if (where1 == 'FIRST' && where2 == 'LAST') { - var code = text; - } else { - var functionName = Blockly.PHP.provideFunction_( - 'text_get_substring', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($text, $where1, $at1, $where2, $at2) {', - ' if ($where2 == \'FROM_START\') {', - ' $at2--;', - ' } else if ($where2 == \'FROM_END\') {', - ' $at2 = $at2 - $at1;', - ' } else if ($where2 == \'FIRST\') {', - ' $at2 = 0;', - ' } else if ($where2 == \'LAST\') {', - ' $at2 = strlen($text);', - ' } else { $at2 = 0; }', - ' if ($where1 == \'FROM_START\') {', - ' $at1--;', - ' } else if ($where1 == \'FROM_END\') {', - ' $at1 = strlen($text) - $at1;', - ' } else if ($where1 == \'FIRST\') {', - ' $at1 = 0;', - ' } else if ($where1 == \'LAST\') {', - ' $at1 = strlen($text) - 1;', - ' } else { $at1 = 0; }', - ' return substr($text, $at1, $at2);', - '}']); - var code = functionName + '(' + text + ', \'' + - where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; - } - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['text_changeCase'] = function(block) { - // Change capitalization. - var code; - if (block.getFieldValue('CASE') == 'UPPERCASE') { - var argument0 = Blockly.PHP.valueToCode(block, 'TEXT', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - code = 'strtoupper(' + argument0 + ')'; - } else if (block.getFieldValue('CASE') == 'LOWERCASE') { - var argument0 = Blockly.PHP.valueToCode(block, 'TEXT', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - code = 'strtolower(' + argument0 + ')'; - } else if (block.getFieldValue('CASE') == 'TITLECASE') { - var argument0 = Blockly.PHP.valueToCode(block, 'TEXT', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - code = 'ucwords(strtolower(' + argument0 + '))'; - } - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['text_trim'] = function(block) { - // Trim spaces. - var OPERATORS = { - 'LEFT': 'ltrim', - 'RIGHT': 'rtrim', - 'BOTH': 'trim' - }; - var operator = OPERATORS[block.getFieldValue('MODE')]; - var argument0 = Blockly.PHP.valueToCode(block, 'TEXT', - Blockly.PHP.ORDER_NONE) || '\'\''; - return [ operator + '(' + argument0 + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['text_print'] = function(block) { - // Print statement. - var argument0 = Blockly.PHP.valueToCode(block, 'TEXT', - Blockly.PHP.ORDER_NONE) || '\'\''; - return 'print(' + argument0 + ');\n'; -}; - -Blockly.PHP['text_prompt_ext'] = function(block) { - // Prompt function. - if (block.getField('TEXT')) { - // Internal message. - var msg = Blockly.PHP.quote_(block.getFieldValue('TEXT')); - } else { - // External message. - var msg = Blockly.PHP.valueToCode(block, 'TEXT', - Blockly.PHP.ORDER_NONE) || '\'\''; - } - var code = 'readline(' + msg + ')'; - var toNumber = block.getFieldValue('TYPE') == 'NUMBER'; - if (toNumber) { - code = 'floatval(' + code + ')'; - } - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['text_prompt'] = Blockly.PHP['text_prompt_ext']; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/php/variables.js b/src/opsoro/apps/visual_programming/static/blockly/generators/php/variables.js deleted file mode 100644 index dd68f4e..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/php/variables.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating PHP for variable blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.variables'); - -goog.require('Blockly.PHP'); - - -Blockly.PHP['variables_get'] = function(block) { - // Variable getter. - var code = Blockly.PHP.variableDB_.getName(block.getFieldValue('VAR'), - Blockly.Variables.NAME_TYPE); - return [code, Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['variables_set'] = function(block) { - // Variable setter. - var argument0 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_ASSIGNMENT) || '0'; - var varName = Blockly.PHP.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - return varName + ' = ' + argument0 + ';\n'; -}; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/python.js b/src/opsoro/apps/visual_programming/static/blockly/generators/python.js deleted file mode 100644 index 9a227b2..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/python.js +++ /dev/null @@ -1,199 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Helper functions for generating Python for blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Python'); - -goog.require('Blockly.Generator'); - - -/** - * Python code generator. - * @type {!Blockly.Generator} - */ -Blockly.Python = new Blockly.Generator('Python'); - -/** - * List of illegal variable names. - * This is not intended to be a security feature. Blockly is 100% client-side, - * so bypassing this list is trivial. This is intended to prevent users from - * accidentally clobbering a built-in object or function. - * @private - */ -Blockly.Python.addReservedWords( - // import keyword - // print ','.join(keyword.kwlist) - // http://docs.python.org/reference/lexical_analysis.html#keywords - 'and,as,assert,break,class,continue,def,del,elif,else,except,exec,finally,for,from,global,if,import,in,is,lambda,not,or,pass,print,raise,return,try,while,with,yield,' + - //http://docs.python.org/library/constants.html - 'True,False,None,NotImplemented,Ellipsis,__debug__,quit,exit,copyright,license,credits,' + - // http://docs.python.org/library/functions.html - 'abs,divmod,input,open,staticmethod,all,enumerate,int,ord,str,any,eval,isinstance,pow,sum,basestring,execfile,issubclass,print,super,bin,file,iter,property,tuple,bool,filter,len,range,type,bytearray,float,list,raw_input,unichr,callable,format,locals,reduce,unicode,chr,frozenset,long,reload,vars,classmethod,getattr,map,repr,xrange,cmp,globals,max,reversed,zip,compile,hasattr,memoryview,round,__import__,complex,hash,min,set,apply,delattr,help,next,setattr,buffer,dict,hex,object,slice,coerce,dir,id,oct,sorted,intern'); - -/** - * Order of operation ENUMs. - * http://docs.python.org/reference/expressions.html#summary - */ -Blockly.Python.ORDER_ATOMIC = 0; // 0 "" ... -Blockly.Python.ORDER_COLLECTION = 1; // tuples, lists, dictionaries -Blockly.Python.ORDER_STRING_CONVERSION = 1; // `expression...` -Blockly.Python.ORDER_MEMBER = 2; // . [] -Blockly.Python.ORDER_FUNCTION_CALL = 2; // () -Blockly.Python.ORDER_EXPONENTIATION = 3; // ** -Blockly.Python.ORDER_UNARY_SIGN = 4; // + - -Blockly.Python.ORDER_BITWISE_NOT = 4; // ~ -Blockly.Python.ORDER_MULTIPLICATIVE = 5; // * / // % -Blockly.Python.ORDER_ADDITIVE = 6; // + - -Blockly.Python.ORDER_BITWISE_SHIFT = 7; // << >> -Blockly.Python.ORDER_BITWISE_AND = 8; // & -Blockly.Python.ORDER_BITWISE_XOR = 9; // ^ -Blockly.Python.ORDER_BITWISE_OR = 10; // | -Blockly.Python.ORDER_RELATIONAL = 11; // in, not in, is, is not, - // <, <=, >, >=, <>, !=, == -Blockly.Python.ORDER_LOGICAL_NOT = 12; // not -Blockly.Python.ORDER_LOGICAL_AND = 13; // and -Blockly.Python.ORDER_LOGICAL_OR = 14; // or -Blockly.Python.ORDER_CONDITIONAL = 15; // if else -Blockly.Python.ORDER_LAMBDA = 16; // lambda -Blockly.Python.ORDER_NONE = 99; // (...) - -/** - * Empty loops or conditionals are not allowed in Python. - */ -Blockly.Python.PASS = ' pass\n'; - -/** - * Initialise the database of variable names. - * @param {!Blockly.Workspace} workspace Workspace to generate code from. - */ -Blockly.Python.init = function(workspace) { - // Create a dictionary of definitions to be printed before the code. - Blockly.Python.definitions_ = Object.create(null); - // Create a dictionary mapping desired function names in definitions_ - // to actual function names (to avoid collisions with user functions). - Blockly.Python.functionNames_ = Object.create(null); - - if (!Blockly.Python.variableDB_) { - Blockly.Python.variableDB_ = - new Blockly.Names(Blockly.Python.RESERVED_WORDS_); - } else { - Blockly.Python.variableDB_.reset(); - } - - var defvars = []; - var variables = Blockly.Variables.allVariables(workspace); - for (var i = 0; i < variables.length; i++) { - defvars[i] = Blockly.Python.variableDB_.getName(variables[i], - Blockly.Variables.NAME_TYPE) + ' = None'; - } - Blockly.Python.definitions_['variables'] = defvars.join('\n'); -}; - -/** - * Prepend the generated code with the variable definitions. - * @param {string} code Generated code. - * @return {string} Completed code. - */ -Blockly.Python.finish = function(code) { - // Convert the definitions dictionary into a list. - var imports = []; - var definitions = []; - for (var name in Blockly.Python.definitions_) { - var def = Blockly.Python.definitions_[name]; - if (def.match(/^(from\s+\S+\s+)?import\s+\S+/)) { - imports.push(def); - } else { - definitions.push(def); - } - } - // Clean up temporary data. - delete Blockly.Python.definitions_; - delete Blockly.Python.functionNames_; - Blockly.Python.variableDB_.reset(); - var allDefs = imports.join('\n') + '\n\n' + definitions.join('\n\n'); - return allDefs.replace(/\n\n+/g, '\n\n').replace(/\n*$/, '\n\n\n') + code; -}; - -/** - * Naked values are top-level blocks with outputs that aren't plugged into - * anything. - * @param {string} line Line of generated code. - * @return {string} Legal line of code. - */ -Blockly.Python.scrubNakedValue = function(line) { - return line + '\n'; -}; - -/** - * Encode a string as a properly escaped Python string, complete with quotes. - * @param {string} string Text to encode. - * @return {string} Python string. - * @private - */ -Blockly.Python.quote_ = function(string) { - // TODO: This is a quick hack. Replace with goog.string.quote - string = string.replace(/\\/g, '\\\\') - .replace(/\n/g, '\\\n') - .replace(/\%/g, '\\%') - .replace(/'/g, '\\\''); - return '\'' + string + '\''; -}; - -/** - * Common tasks for generating Python from blocks. - * Handles comments for the specified block and any connected value blocks. - * Calls any statements following this block. - * @param {!Blockly.Block} block The current block. - * @param {string} code The Python code created for this block. - * @return {string} Python code with comments and subsequent blocks added. - * @private - */ -Blockly.Python.scrub_ = function(block, code) { - var commentCode = ''; - // Only collect comments for blocks that aren't inline. - if (!block.outputConnection || !block.outputConnection.targetConnection) { - // Collect comment for this block. - var comment = block.getCommentText(); - if (comment) { - commentCode += Blockly.Python.prefixLines(comment, '# ') + '\n'; - } - // Collect comments for all value arguments. - // Don't collect comments for nested statements. - for (var x = 0; x < block.inputList.length; x++) { - if (block.inputList[x].type == Blockly.INPUT_VALUE) { - var childBlock = block.inputList[x].connection.targetBlock(); - if (childBlock) { - var comment = Blockly.Python.allNestedComments(childBlock); - if (comment) { - commentCode += Blockly.Python.prefixLines(comment, '# '); - } - } - } - } - } - var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); - var nextCode = Blockly.Python.blockToCode(nextBlock); - return commentCode + code + nextCode; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/python/colour.js b/src/opsoro/apps/visual_programming/static/blockly/generators/python/colour.js deleted file mode 100644 index 49505ac..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/python/colour.js +++ /dev/null @@ -1,86 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Python for colour blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Python.colour'); - -goog.require('Blockly.Python'); - - -Blockly.Python['colour_picker'] = function(block) { - // Colour picker. - var code = '\'' + block.getFieldValue('COLOUR') + '\''; - return [code, Blockly.Python.ORDER_ATOMIC]; -}; - -Blockly.Python['colour_random'] = function(block) { - // Generate a random colour. - Blockly.Python.definitions_['import_random'] = 'import random'; - var code = '\'#%06x\' % random.randint(0, 2**24 - 1)'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['colour_rgb'] = function(block) { - // Compose a colour from RGB components expressed as percentages. - var functionName = Blockly.Python.provideFunction_( - 'colour_rgb', - [ 'def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(r, g, b):', - ' r = round(min(100, max(0, r)) * 2.55)', - ' g = round(min(100, max(0, g)) * 2.55)', - ' b = round(min(100, max(0, b)) * 2.55)', - ' return \'#%02x%02x%02x\' % (r, g, b)']); - var r = Blockly.Python.valueToCode(block, 'RED', - Blockly.Python.ORDER_NONE) || 0; - var g = Blockly.Python.valueToCode(block, 'GREEN', - Blockly.Python.ORDER_NONE) || 0; - var b = Blockly.Python.valueToCode(block, 'BLUE', - Blockly.Python.ORDER_NONE) || 0; - var code = functionName + '(' + r + ', ' + g + ', ' + b + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['colour_blend'] = function(block) { - // Blend two colours together. - var functionName = Blockly.Python.provideFunction_( - 'colour_blend', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + - '(colour1, colour2, ratio):', - ' r1, r2 = int(colour1[1:3], 16), int(colour2[1:3], 16)', - ' g1, g2 = int(colour1[3:5], 16), int(colour2[3:5], 16)', - ' b1, b2 = int(colour1[5:7], 16), int(colour2[5:7], 16)', - ' ratio = min(1, max(0, ratio))', - ' r = round(r1 * (1 - ratio) + r2 * ratio)', - ' g = round(g1 * (1 - ratio) + g2 * ratio)', - ' b = round(b1 * (1 - ratio) + b2 * ratio)', - ' return \'#%02x%02x%02x\' % (r, g, b)']); - var colour1 = Blockly.Python.valueToCode(block, 'COLOUR1', - Blockly.Python.ORDER_NONE) || '\'#000000\''; - var colour2 = Blockly.Python.valueToCode(block, 'COLOUR2', - Blockly.Python.ORDER_NONE) || '\'#000000\''; - var ratio = Blockly.Python.valueToCode(block, 'RATIO', - Blockly.Python.ORDER_NONE) || 0; - var code = functionName + '(' + colour1 + ', ' + colour2 + ', ' + ratio + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/python/lists.js b/src/opsoro/apps/visual_programming/static/blockly/generators/python/lists.js deleted file mode 100644 index 05ed4d2..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/python/lists.js +++ /dev/null @@ -1,334 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Python for list blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Python.lists'); - -goog.require('Blockly.Python'); - - -Blockly.Python['lists_create_empty'] = function(block) { - // Create an empty list. - return ['[]', Blockly.Python.ORDER_ATOMIC]; -}; - -Blockly.Python['lists_create_with'] = function(block) { - // Create a list with any number of elements of any type. - var code = new Array(block.itemCount_); - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.Python.valueToCode(block, 'ADD' + n, - Blockly.Python.ORDER_NONE) || 'None'; - } - code = '[' + code.join(', ') + ']'; - return [code, Blockly.Python.ORDER_ATOMIC]; -}; - -Blockly.Python['lists_repeat'] = function(block) { - // Create a list with one element repeated. - var argument0 = Blockly.Python.valueToCode(block, 'ITEM', - Blockly.Python.ORDER_NONE) || 'None'; - var argument1 = Blockly.Python.valueToCode(block, 'NUM', - Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; - var code = '[' + argument0 + '] * ' + argument1; - return [code, Blockly.Python.ORDER_MULTIPLICATIVE]; -}; - -Blockly.Python['lists_length'] = function(block) { - // String or array length. - var argument0 = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_NONE) || '[]'; - return ['len(' + argument0 + ')', Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['lists_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_NONE) || '[]'; - var code = 'not len(' + argument0 + ')'; - return [code, Blockly.Python.ORDER_LOGICAL_NOT]; -}; - -Blockly.Python['lists_indexOf'] = function(block) { - // Find an item in the list. - var argument0 = Blockly.Python.valueToCode(block, 'FIND', - Blockly.Python.ORDER_NONE) || '[]'; - var argument1 = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_MEMBER) || '\'\''; - var code; - if (block.getFieldValue('END') == 'FIRST') { - var functionName = Blockly.Python.provideFunction_( - 'first_index', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList, elem):', - ' try: theIndex = myList.index(elem) + 1', - ' except: theIndex = 0', - ' return theIndex']); - code = functionName + '(' + argument1 + ', ' + argument0 + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else { - var functionName = Blockly.Python.provideFunction_( - 'last_index', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList, elem):', - ' try: theIndex = len(myList) - myList[::-1].index(elem)', - ' except: theIndex = 0', - ' return theIndex']); - code = functionName + '(' + argument1 + ', ' + argument0 + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } -}; - -Blockly.Python['lists_getIndex'] = function(block) { - // Get element at index. - // Note: Until January 2013 this block did not have MODE or WHERE inputs. - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.Python.valueToCode(block, 'AT', - Blockly.Python.ORDER_UNARY_SIGN) || '1'; - var list = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_MEMBER) || '[]'; - - if (where == 'FIRST') { - if (mode == 'GET') { - var code = list + '[0]'; - return [code, Blockly.Python.ORDER_MEMBER]; - } else { - var code = list + '.pop(0)'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + '\n'; - } - } - } else if (where == 'LAST') { - if (mode == 'GET') { - var code = list + '[-1]'; - return [code, Blockly.Python.ORDER_MEMBER]; - } else { - var code = list + '.pop()'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + '\n'; - } - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseInt(at, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at = 'int(' + at + ' - 1)'; - } - if (mode == 'GET') { - var code = list + '[' + at + ']'; - return [code, Blockly.Python.ORDER_MEMBER]; - } else { - var code = list + '.pop(' + at + ')'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + '\n'; - } - } - } else if (where == 'FROM_END') { - if (mode == 'GET') { - var code = list + '[-' + at + ']'; - return [code, Blockly.Python.ORDER_MEMBER]; - } else { - var code = list + '.pop(-' + at + ')'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + '\n'; - } - } - } else if (where == 'RANDOM') { - Blockly.Python.definitions_['import_random'] = 'import random'; - if (mode == 'GET') { - code = 'random.choice(' + list + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else { - var functionName = Blockly.Python.provideFunction_( - 'lists_remove_random_item', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList):', - ' x = int(random.random() * len(myList))', - ' return myList.pop(x)']); - code = functionName + '(' + list + ')'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + '\n'; - } - } - } - throw 'Unhandled combination (lists_getIndex).'; -}; - -Blockly.Python['lists_setIndex'] = function(block) { - // Set element at index. - // Note: Until February 2013 this block did not have MODE or WHERE inputs. - var list = Blockly.Python.valueToCode(block, 'LIST', - Blockly.Python.ORDER_MEMBER) || '[]'; - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.Python.valueToCode(block, 'AT', - Blockly.Python.ORDER_NONE) || '1'; - var value = Blockly.Python.valueToCode(block, 'TO', - Blockly.Python.ORDER_NONE) || 'None'; - // Cache non-trivial values to variables to prevent repeated look-ups. - // Closure, which accesses and modifies 'list'. - function cacheList() { - if (list.match(/^\w+$/)) { - return ''; - } - var listVar = Blockly.Python.variableDB_.getDistinctName( - 'tmp_list', Blockly.Variables.NAME_TYPE); - var code = listVar + ' = ' + list + '\n'; - list = listVar; - return code; - } - if (where == 'FIRST') { - if (mode == 'SET') { - return list + '[0] = ' + value + '\n'; - } else if (mode == 'INSERT') { - return list + '.insert(0, ' + value + ')\n'; - } - } else if (where == 'LAST') { - if (mode == 'SET') { - return list + '[-1] = ' + value + '\n'; - } else if (mode == 'INSERT') { - return list + '.append(' + value + ')\n'; - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseInt(at, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at = 'int(' + at + ' - 1)'; - } - if (mode == 'SET') { - return list + '[' + at + '] = ' + value + '\n'; - } else if (mode == 'INSERT') { - return list + '.insert(' + at + ', ' + value + ')\n'; - } - } else if (where == 'FROM_END') { - if (mode == 'SET') { - return list + '[-' + at + '] = ' + value + '\n'; - } else if (mode == 'INSERT') { - return list + '.insert(-' + at + ', ' + value + ')\n'; - } - } else if (where == 'RANDOM') { - Blockly.Python.definitions_['import_random'] = 'import random'; - var code = cacheList(); - var xVar = Blockly.Python.variableDB_.getDistinctName( - 'tmp_x', Blockly.Variables.NAME_TYPE); - code += xVar + ' = int(random.random() * len(' + list + '))\n'; - if (mode == 'SET') { - code += list + '[' + xVar + '] = ' + value + '\n'; - return code; - } else if (mode == 'INSERT') { - code += list + '.insert(' + xVar + ', ' + value + ')\n'; - return code; - } - } - throw 'Unhandled combination (lists_setIndex).'; -}; - -Blockly.Python['lists_getSublist'] = function(block) { - // Get sublist. - var list = Blockly.Python.valueToCode(block, 'LIST', - Blockly.Python.ORDER_MEMBER) || '[]'; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.Python.valueToCode(block, 'AT1', - Blockly.Python.ORDER_ADDITIVE) || '1'; - var at2 = Blockly.Python.valueToCode(block, 'AT2', - Blockly.Python.ORDER_ADDITIVE) || '1'; - if (where1 == 'FIRST' || (where1 == 'FROM_START' && at1 == '1')) { - at1 = ''; - } else if (where1 == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at1)) { - // If the index is a naked number, decrement it right now. - at1 = parseInt(at1, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at1 = 'int(' + at1 + ' - 1)'; - } - } else if (where1 == 'FROM_END') { - if (Blockly.isNumber(at1)) { - at1 = -parseInt(at1, 10); - } else { - at1 = '-int(' + at1 + ')'; - } - } - if (where2 == 'LAST' || (where2 == 'FROM_END' && at2 == '1')) { - at2 = ''; - } else if (where1 == 'FROM_START') { - if (Blockly.isNumber(at2)) { - at2 = parseInt(at2, 10); - } else { - at2 = 'int(' + at2 + ')'; - } - } else if (where1 == 'FROM_END') { - if (Blockly.isNumber(at2)) { - // If the index is a naked number, increment it right now. - // Add special case for -0. - at2 = 1 - parseInt(at2, 10); - if (at2 == 0) { - at2 = ''; - } - } else { - // If the index is dynamic, increment it in code. - Blockly.Python.definitions_['import_sys'] = 'import sys'; - at2 = 'int(1 - ' + at2 + ') or sys.maxsize'; - } - } - var code = list + '[' + at1 + ' : ' + at2 + ']'; - return [code, Blockly.Python.ORDER_MEMBER]; -}; - -Blockly.Python['lists_split'] = function(block) { - // Block for splitting text into a list, or joining a list into text. - var mode = block.getFieldValue('MODE'); - if (mode == 'SPLIT') { - var value_input = Blockly.Python.valueToCode(block, 'INPUT', - Blockly.Python.ORDER_MEMBER) || '\'\''; - var value_delim = Blockly.Python.valueToCode(block, 'DELIM', - Blockly.Python.ORDER_NONE); - var code = value_input + '.split(' + value_delim + ')'; - } else if (mode == 'JOIN') { - var value_input = Blockly.Python.valueToCode(block, 'INPUT', - Blockly.Python.ORDER_NONE) || '[]'; - var value_delim = Blockly.Python.valueToCode(block, 'DELIM', - Blockly.Python.ORDER_MEMBER) || '\'\''; - var code = value_delim + '.join(' + value_input + ')'; - } else { - throw 'Unknown mode: ' + mode; - } - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/python/logic.js b/src/opsoro/apps/visual_programming/static/blockly/generators/python/logic.js deleted file mode 100644 index a485e5c..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/python/logic.js +++ /dev/null @@ -1,127 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Python for logic blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Python.logic'); - -goog.require('Blockly.Python'); - - -Blockly.Python['controls_if'] = function(block) { - // If/elseif/else condition. - var n = 0; - var argument = Blockly.Python.valueToCode(block, 'IF' + n, - Blockly.Python.ORDER_NONE) || 'False'; - var branch = Blockly.Python.statementToCode(block, 'DO' + n) || - Blockly.Python.PASS; - var code = 'if ' + argument + ':\n' + branch; - for (n = 1; n <= block.elseifCount_; n++) { - argument = Blockly.Python.valueToCode(block, 'IF' + n, - Blockly.Python.ORDER_NONE) || 'False'; - branch = Blockly.Python.statementToCode(block, 'DO' + n) || - Blockly.Python.PASS; - code += 'elif ' + argument + ':\n' + branch; - } - if (block.elseCount_) { - branch = Blockly.Python.statementToCode(block, 'ELSE') || - Blockly.Python.PASS; - code += 'else:\n' + branch; - } - return code; -}; - -Blockly.Python['logic_compare'] = function(block) { - // Comparison operator. - var OPERATORS = { - 'EQ': '==', - 'NEQ': '!=', - 'LT': '<', - 'LTE': '<=', - 'GT': '>', - 'GTE': '>=' - }; - var operator = OPERATORS[block.getFieldValue('OP')]; - var order = Blockly.Python.ORDER_RELATIONAL; - var argument0 = Blockly.Python.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.Python.valueToCode(block, 'B', order) || '0'; - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.Python['logic_operation'] = function(block) { - // Operations 'and', 'or'. - var operator = (block.getFieldValue('OP') == 'AND') ? 'and' : 'or'; - var order = (operator == 'and') ? Blockly.Python.ORDER_LOGICAL_AND : - Blockly.Python.ORDER_LOGICAL_OR; - var argument0 = Blockly.Python.valueToCode(block, 'A', order); - var argument1 = Blockly.Python.valueToCode(block, 'B', order); - if (!argument0 && !argument1) { - // If there are no arguments, then the return value is false. - argument0 = 'False'; - argument1 = 'False'; - } else { - // Single missing arguments have no effect on the return value. - var defaultArgument = (operator == 'and') ? 'True' : 'False'; - if (!argument0) { - argument0 = defaultArgument; - } - if (!argument1) { - argument1 = defaultArgument; - } - } - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.Python['logic_negate'] = function(block) { - // Negation. - var argument0 = Blockly.Python.valueToCode(block, 'BOOL', - Blockly.Python.ORDER_LOGICAL_NOT) || 'True'; - var code = 'not ' + argument0; - return [code, Blockly.Python.ORDER_LOGICAL_NOT]; -}; - -Blockly.Python['logic_boolean'] = function(block) { - // Boolean values true and false. - var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'True' : 'False'; - return [code, Blockly.Python.ORDER_ATOMIC]; -}; - -Blockly.Python['logic_null'] = function(block) { - // Null data type. - return ['None', Blockly.Python.ORDER_ATOMIC]; -}; - -Blockly.Python['logic_ternary'] = function(block) { - // Ternary operator. - var value_if = Blockly.Python.valueToCode(block, 'IF', - Blockly.Python.ORDER_CONDITIONAL) || 'False'; - var value_then = Blockly.Python.valueToCode(block, 'THEN', - Blockly.Python.ORDER_CONDITIONAL) || 'None'; - var value_else = Blockly.Python.valueToCode(block, 'ELSE', - Blockly.Python.ORDER_CONDITIONAL) || 'None'; - var code = value_then + ' if ' + value_if + ' else ' + value_else; - return [code, Blockly.Python.ORDER_CONDITIONAL]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/python/math.js b/src/opsoro/apps/visual_programming/static/blockly/generators/python/math.js deleted file mode 100644 index bcc1406..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/python/math.js +++ /dev/null @@ -1,372 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Python for math blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Python.math'); - -goog.require('Blockly.Python'); - - -// If any new block imports any library, add that library name here. -Blockly.Python.addReservedWords('math,random'); - -Blockly.Python['math_number'] = function(block) { - // Numeric value. - var code = parseFloat(block.getFieldValue('NUM')); - var order = code < 0 ? Blockly.Python.ORDER_UNARY_SIGN : - Blockly.Python.ORDER_ATOMIC; - return [code, order]; -}; - -Blockly.Python['math_arithmetic'] = function(block) { - // Basic arithmetic operators, and power. - var OPERATORS = { - 'ADD': [' + ', Blockly.Python.ORDER_ADDITIVE], - 'MINUS': [' - ', Blockly.Python.ORDER_ADDITIVE], - 'MULTIPLY': [' * ', Blockly.Python.ORDER_MULTIPLICATIVE], - 'DIVIDE': [' / ', Blockly.Python.ORDER_MULTIPLICATIVE], - 'POWER': [' ** ', Blockly.Python.ORDER_EXPONENTIATION] - }; - var tuple = OPERATORS[block.getFieldValue('OP')]; - var operator = tuple[0]; - var order = tuple[1]; - var argument0 = Blockly.Python.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.Python.valueToCode(block, 'B', order) || '0'; - var code = argument0 + operator + argument1; - return [code, order]; - // In case of 'DIVIDE', division between integers returns different results - // in Python 2 and 3. However, is not an issue since Blockly does not - // guarantee identical results in all languages. To do otherwise would - // require every operator to be wrapped in a function call. This would kill - // legibility of the generated code. -}; - -Blockly.Python['math_single'] = function(block) { - // Math operators with single operand. - var operator = block.getFieldValue('OP'); - var code; - var arg; - if (operator == 'NEG') { - // Negation is a special case given its different operator precedence. - var code = Blockly.Python.valueToCode(block, 'NUM', - Blockly.Python.ORDER_UNARY_SIGN) || '0'; - return ['-' + code, Blockly.Python.ORDER_UNARY_SIGN]; - } - Blockly.Python.definitions_['import_math'] = 'import math'; - if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') { - arg = Blockly.Python.valueToCode(block, 'NUM', - Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; - } else { - arg = Blockly.Python.valueToCode(block, 'NUM', - Blockly.Python.ORDER_NONE) || '0'; - } - // First, handle cases which generate values that don't need parentheses - // wrapping the code. - switch (operator) { - case 'ABS': - code = 'math.fabs(' + arg + ')'; - break; - case 'ROOT': - code = 'math.sqrt(' + arg + ')'; - break; - case 'LN': - code = 'math.log(' + arg + ')'; - break; - case 'LOG10': - code = 'math.log10(' + arg + ')'; - break; - case 'EXP': - code = 'math.exp(' + arg + ')'; - break; - case 'POW10': - code = 'math.pow(10,' + arg + ')'; - break; - case 'ROUND': - code = 'round(' + arg + ')'; - break; - case 'ROUNDUP': - code = 'math.ceil(' + arg + ')'; - break; - case 'ROUNDDOWN': - code = 'math.floor(' + arg + ')'; - break; - case 'SIN': - code = 'math.sin(' + arg + ' / 180.0 * math.pi)'; - break; - case 'COS': - code = 'math.cos(' + arg + ' / 180.0 * math.pi)'; - break; - case 'TAN': - code = 'math.tan(' + arg + ' / 180.0 * math.pi)'; - break; - } - if (code) { - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } - // Second, handle cases which generate values that may need parentheses - // wrapping the code. - switch (operator) { - case 'ASIN': - code = 'math.asin(' + arg + ') / math.pi * 180'; - break; - case 'ACOS': - code = 'math.acos(' + arg + ') / math.pi * 180'; - break; - case 'ATAN': - code = 'math.atan(' + arg + ') / math.pi * 180'; - break; - default: - throw 'Unknown math operator: ' + operator; - } - return [code, Blockly.Python.ORDER_MULTIPLICATIVE]; -}; - -Blockly.Python['math_constant'] = function(block) { - // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. - var CONSTANTS = { - 'PI': ['math.pi', Blockly.Python.ORDER_MEMBER], - 'E': ['math.e', Blockly.Python.ORDER_MEMBER], - 'GOLDEN_RATIO': ['(1 + math.sqrt(5)) / 2', - Blockly.Python.ORDER_MULTIPLICATIVE], - 'SQRT2': ['math.sqrt(2)', Blockly.Python.ORDER_MEMBER], - 'SQRT1_2': ['math.sqrt(1.0 / 2)', Blockly.Python.ORDER_MEMBER], - 'INFINITY': ['float(\'inf\')', Blockly.Python.ORDER_ATOMIC] - }; - var constant = block.getFieldValue('CONSTANT'); - if (constant != 'INFINITY') { - Blockly.Python.definitions_['import_math'] = 'import math'; - } - return CONSTANTS[constant]; -}; - -Blockly.Python['math_number_property'] = function(block) { - // Check if a number is even, odd, prime, whole, positive, or negative - // or if it is divisible by certain number. Returns true or false. - var number_to_check = Blockly.Python.valueToCode(block, 'NUMBER_TO_CHECK', - Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; - var dropdown_property = block.getFieldValue('PROPERTY'); - var code; - if (dropdown_property == 'PRIME') { - Blockly.Python.definitions_['import_math'] = 'import math'; - var functionName = Blockly.Python.provideFunction_( - 'math_isPrime', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(n):', - ' # https://en.wikipedia.org/wiki/Primality_test#Naive_methods', - ' # If n is not a number but a string, try parsing it.', - ' if type(n) not in (int, float, long):', - ' try:', - ' n = float(n)', - ' except:', - ' return False', - ' if n == 2 or n == 3:', - ' return True', - ' # False if n is negative, is 1, or not whole,' + - ' or if n is divisible by 2 or 3.', - ' if n <= 1 or n % 1 != 0 or n % 2 == 0 or n % 3 == 0:', - ' return False', - ' # Check all the numbers of form 6k +/- 1, up to sqrt(n).', - ' for x in range(6, int(math.sqrt(n)) + 2, 6):', - ' if n % (x - 1) == 0 or n % (x + 1) == 0:', - ' return False', - ' return True']); - code = functionName + '(' + number_to_check + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } - switch (dropdown_property) { - case 'EVEN': - code = number_to_check + ' % 2 == 0'; - break; - case 'ODD': - code = number_to_check + ' % 2 == 1'; - break; - case 'WHOLE': - code = number_to_check + ' % 1 == 0'; - break; - case 'POSITIVE': - code = number_to_check + ' > 0'; - break; - case 'NEGATIVE': - code = number_to_check + ' < 0'; - break; - case 'DIVISIBLE_BY': - var divisor = Blockly.Python.valueToCode(block, 'DIVISOR', - Blockly.Python.ORDER_MULTIPLICATIVE); - // If 'divisor' is some code that evals to 0, Python will raise an error. - if (!divisor || divisor == '0') { - return ['False', Blockly.Python.ORDER_ATOMIC]; - } - code = number_to_check + ' % ' + divisor + ' == 0'; - break; - } - return [code, Blockly.Python.ORDER_RELATIONAL]; -}; - -Blockly.Python['math_change'] = function(block) { - // Add to a variable in place. - var argument0 = Blockly.Python.valueToCode(block, 'DELTA', - Blockly.Python.ORDER_ADDITIVE) || '0'; - var varName = Blockly.Python.variableDB_.getName(block.getFieldValue('VAR'), - Blockly.Variables.NAME_TYPE); - return varName + ' = (' + varName + ' if type(' + varName + - ') in (int, float, long) else 0) + ' + argument0 + '\n'; -}; - -// Rounding functions have a single operand. -Blockly.Python['math_round'] = Blockly.Python['math_single']; -// Trigonometry functions have a single operand. -Blockly.Python['math_trig'] = Blockly.Python['math_single']; - -Blockly.Python['math_on_list'] = function(block) { - // Math functions for lists. - var func = block.getFieldValue('OP'); - var list = Blockly.Python.valueToCode(block, 'LIST', - Blockly.Python.ORDER_NONE) || '[]'; - var code; - switch (func) { - case 'SUM': - code = 'sum(' + list + ')'; - break; - case 'MIN': - code = 'min(' + list + ')'; - break; - case 'MAX': - code = 'max(' + list + ')'; - break; - case 'AVERAGE': - var functionName = Blockly.Python.provideFunction_( - 'math_mean', - // This operation excludes null and values that aren't int or float:', - // math_mean([null, null, "aString", 1, 9]) == 5.0.', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList):', - ' localList = [e for e in myList if type(e) in (int, float, long)]', - ' if not localList: return', - ' return float(sum(localList)) / len(localList)']); - code = functionName + '(' + list + ')'; - break; - case 'MEDIAN': - var functionName = Blockly.Python.provideFunction_( - 'math_median', - // This operation excludes null values: - // math_median([null, null, 1, 3]) == 2.0. - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList):', - ' localList = sorted([e for e in myList ' + - 'if type(e) in (int, float, long)])', - ' if not localList: return', - ' if len(localList) % 2 == 0:', - ' return (localList[len(localList) / 2 - 1] + ' + - 'localList[len(localList) / 2]) / 2.0', - ' else:', - ' return localList[(len(localList) - 1) / 2]']); - code = functionName + '(' + list + ')'; - break; - case 'MODE': - var functionName = Blockly.Python.provideFunction_( - 'math_modes', - // As a list of numbers can contain more than one mode, - // the returned result is provided as an array. - // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]. - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(some_list):', - ' modes = []', - ' # Using a lists of [item, count] to keep count rather than dict', - ' # to avoid "unhashable" errors when the counted item is ' + - 'itself a list or dict.', - ' counts = []', - ' maxCount = 1', - ' for item in some_list:', - ' found = False', - ' for count in counts:', - ' if count[0] == item:', - ' count[1] += 1', - ' maxCount = max(maxCount, count[1])', - ' found = True', - ' if not found:', - ' counts.append([item, 1])', - ' for counted_item, item_count in counts:', - ' if item_count == maxCount:', - ' modes.append(counted_item)', - ' return modes']); - code = functionName + '(' + list + ')'; - break; - case 'STD_DEV': - Blockly.Python.definitions_['import_math'] = 'import math'; - var functionName = Blockly.Python.provideFunction_( - 'math_standard_deviation', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(numbers):', - ' n = len(numbers)', - ' if n == 0: return', - ' mean = float(sum(numbers)) / n', - ' variance = sum((x - mean) ** 2 for x in numbers) / n', - ' return math.sqrt(variance)']); - code = functionName + '(' + list + ')'; - break; - case 'RANDOM': - Blockly.Python.definitions_['import_random'] = 'import random'; - code = 'random.choice(' + list + ')'; - break; - default: - throw 'Unknown operator: ' + func; - } - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['math_modulo'] = function(block) { - // Remainder computation. - var argument0 = Blockly.Python.valueToCode(block, 'DIVIDEND', - Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; - var argument1 = Blockly.Python.valueToCode(block, 'DIVISOR', - Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; - var code = argument0 + ' % ' + argument1; - return [code, Blockly.Python.ORDER_MULTIPLICATIVE]; -}; - -Blockly.Python['math_constrain'] = function(block) { - // Constrain a number between two limits. - var argument0 = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_NONE) || '0'; - var argument1 = Blockly.Python.valueToCode(block, 'LOW', - Blockly.Python.ORDER_NONE) || '0'; - var argument2 = Blockly.Python.valueToCode(block, 'HIGH', - Blockly.Python.ORDER_NONE) || 'float(\'inf\')'; - var code = 'min(max(' + argument0 + ', ' + argument1 + '), ' + - argument2 + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['math_random_int'] = function(block) { - // Random integer between [X] and [Y]. - Blockly.Python.definitions_['import_random'] = 'import random'; - var argument0 = Blockly.Python.valueToCode(block, 'FROM', - Blockly.Python.ORDER_NONE) || '0'; - var argument1 = Blockly.Python.valueToCode(block, 'TO', - Blockly.Python.ORDER_NONE) || '0'; - var code = 'random.randint(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['math_random_float'] = function(block) { - // Random fraction between 0 and 1. - Blockly.Python.definitions_['import_random'] = 'import random'; - return ['random.random()', Blockly.Python.ORDER_FUNCTION_CALL]; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/python/procedures.js b/src/opsoro/apps/visual_programming/static/blockly/generators/python/procedures.js deleted file mode 100644 index 6d11df8..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/python/procedures.js +++ /dev/null @@ -1,123 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Python for procedure blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Python.procedures'); - -goog.require('Blockly.Python'); - - -Blockly.Python['procedures_defreturn'] = function(block) { - // Define a procedure with a return value. - // First, add a 'global' statement for every variable that is assigned. - var globals = Blockly.Variables.allVariables(block); - for (var i = globals.length - 1; i >= 0; i--) { - var varName = globals[i]; - if (block.arguments_.indexOf(varName) == -1) { - globals[i] = Blockly.Python.variableDB_.getName(varName, - Blockly.Variables.NAME_TYPE); - } else { - // This variable is actually a parameter name. Do not include it in - // the list of globals, thus allowing it be of local scope. - globals.splice(i, 1); - } - } - globals = globals.length ? ' global ' + globals.join(', ') + '\n' : ''; - var funcName = Blockly.Python.variableDB_.getName(block.getFieldValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var branch = Blockly.Python.statementToCode(block, 'STACK'); - if (Blockly.Python.STATEMENT_PREFIX) { - branch = Blockly.Python.prefixLines( - Blockly.Python.STATEMENT_PREFIX.replace(/%1/g, - '\'' + block.id + '\''), Blockly.Python.INDENT) + branch; - } - if (Blockly.Python.INFINITE_LOOP_TRAP) { - branch = Blockly.Python.INFINITE_LOOP_TRAP.replace(/%1/g, - '"' + block.id + '"') + branch; - } - var returnValue = Blockly.Python.valueToCode(block, 'RETURN', - Blockly.Python.ORDER_NONE) || ''; - if (returnValue) { - returnValue = ' return ' + returnValue + '\n'; - } else if (!branch) { - branch = Blockly.Python.PASS; - } - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.Python.variableDB_.getName(block.arguments_[x], - Blockly.Variables.NAME_TYPE); - } - var code = 'def ' + funcName + '(' + args.join(', ') + '):\n' + - globals + branch + returnValue; - code = Blockly.Python.scrub_(block, code); - Blockly.Python.definitions_[funcName] = code; - return null; -}; - -// Defining a procedure without a return value uses the same generator as -// a procedure with a return value. -Blockly.Python['procedures_defnoreturn'] = - Blockly.Python['procedures_defreturn']; - -Blockly.Python['procedures_callreturn'] = function(block) { - // Call a procedure with a return value. - var funcName = Blockly.Python.variableDB_.getName(block.getFieldValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.Python.valueToCode(block, 'ARG' + x, - Blockly.Python.ORDER_NONE) || 'None'; - } - var code = funcName + '(' + args.join(', ') + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['procedures_callnoreturn'] = function(block) { - // Call a procedure with no return value. - var funcName = Blockly.Python.variableDB_.getName(block.getFieldValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.Python.valueToCode(block, 'ARG' + x, - Blockly.Python.ORDER_NONE) || 'None'; - } - var code = funcName + '(' + args.join(', ') + ')\n'; - return code; -}; - -Blockly.Python['procedures_ifreturn'] = function(block) { - // Conditionally return value from a procedure. - var condition = Blockly.Python.valueToCode(block, 'CONDITION', - Blockly.Python.ORDER_NONE) || 'False'; - var code = 'if ' + condition + ':\n'; - if (block.hasReturnValue_) { - var value = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_NONE) || 'None'; - code += ' return ' + value + '\n'; - } else { - code += ' return\n'; - } - return code; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/python/text.js b/src/opsoro/apps/visual_programming/static/blockly/generators/python/text.js deleted file mode 100644 index 7d3797b..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/generators/python/text.js +++ /dev/null @@ -1,262 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Python for text blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Python.texts'); - -goog.require('Blockly.Python'); - - -Blockly.Python['text'] = function(block) { - // Text value. - var code = Blockly.Python.quote_(block.getFieldValue('TEXT')); - return [code, Blockly.Python.ORDER_ATOMIC]; -}; - -Blockly.Python['text_join'] = function(block) { - // Create a string made up of any number of elements of any type. - //Should we allow joining by '-' or ',' or any other characters? - var code; - if (block.itemCount_ == 0) { - return ['\'\'', Blockly.Python.ORDER_ATOMIC]; - } else if (block.itemCount_ == 1) { - var argument0 = Blockly.Python.valueToCode(block, 'ADD0', - Blockly.Python.ORDER_NONE) || '\'\''; - code = 'str(' + argument0 + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else if (block.itemCount_ == 2) { - var argument0 = Blockly.Python.valueToCode(block, 'ADD0', - Blockly.Python.ORDER_NONE) || '\'\''; - var argument1 = Blockly.Python.valueToCode(block, 'ADD1', - Blockly.Python.ORDER_NONE) || '\'\''; - var code = 'str(' + argument0 + ') + str(' + argument1 + ')'; - return [code, Blockly.Python.ORDER_UNARY_SIGN]; - } else { - var code = []; - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.Python.valueToCode(block, 'ADD' + n, - Blockly.Python.ORDER_NONE) || '\'\''; - } - var tempVar = Blockly.Python.variableDB_.getDistinctName('temp_value', - Blockly.Variables.NAME_TYPE); - code = '\'\'.join([str(' + tempVar + ') for ' + tempVar + ' in [' + - code.join(', ') + ']])'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } -}; - -Blockly.Python['text_append'] = function(block) { - // Append to a variable in place. - var varName = Blockly.Python.variableDB_.getName(block.getFieldValue('VAR'), - Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.Python.valueToCode(block, 'TEXT', - Blockly.Python.ORDER_NONE) || '\'\''; - return varName + ' = str(' + varName + ') + str(' + argument0 + ')\n'; -}; - -Blockly.Python['text_length'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_NONE) || '\'\''; - return ['len(' + argument0 + ')', Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['text_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_NONE) || '\'\''; - var code = 'not len(' + argument0 + ')'; - return [code, Blockly.Python.ORDER_LOGICAL_NOT]; -}; - -Blockly.Python['text_indexOf'] = function(block) { - // Search the text for a substring. - // Should we allow for non-case sensitive??? - var operator = block.getFieldValue('END') == 'FIRST' ? 'find' : 'rfind'; - var argument0 = Blockly.Python.valueToCode(block, 'FIND', - Blockly.Python.ORDER_NONE) || '\'\''; - var argument1 = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_MEMBER) || '\'\''; - var code = argument1 + '.' + operator + '(' + argument0 + ') + 1'; - return [code, Blockly.Python.ORDER_MEMBER]; -}; - -Blockly.Python['text_charAt'] = function(block) { - // Get letter at index. - // Note: Until January 2013 this block did not have the WHERE input. - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.Python.valueToCode(block, 'AT', - Blockly.Python.ORDER_UNARY_SIGN) || '1'; - var text = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_MEMBER) || '\'\''; - switch (where) { - case 'FIRST': - var code = text + '[0]'; - return [code, Blockly.Python.ORDER_MEMBER]; - case 'LAST': - var code = text + '[-1]'; - return [code, Blockly.Python.ORDER_MEMBER]; - case 'FROM_START': - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseInt(at, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at = 'int(' + at + ' - 1)'; - } - var code = text + '[' + at + ']'; - return [code, Blockly.Python.ORDER_MEMBER]; - case 'FROM_END': - var code = text + '[-' + at + ']'; - return [code, Blockly.Python.ORDER_MEMBER]; - case 'RANDOM': - Blockly.Python.definitions_['import_random'] = 'import random'; - var functionName = Blockly.Python.provideFunction_( - 'text_random_letter', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(text):', - ' x = int(random.random() * len(text))', - ' return text[x];']); - code = functionName + '(' + text + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } - throw 'Unhandled option (text_charAt).'; -}; - -Blockly.Python['text_getSubstring'] = function(block) { - // Get substring. - var text = Blockly.Python.valueToCode(block, 'STRING', - Blockly.Python.ORDER_MEMBER) || '\'\''; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.Python.valueToCode(block, 'AT1', - Blockly.Python.ORDER_ADDITIVE) || '1'; - var at2 = Blockly.Python.valueToCode(block, 'AT2', - Blockly.Python.ORDER_ADDITIVE) || '1'; - if (where1 == 'FIRST' || (where1 == 'FROM_START' && at1 == '1')) { - at1 = ''; - } else if (where1 == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at1)) { - // If the index is a naked number, decrement it right now. - at1 = parseInt(at1, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at1 = 'int(' + at1 + ' - 1)'; - } - } else if (where1 == 'FROM_END') { - if (Blockly.isNumber(at1)) { - at1 = -parseInt(at1, 10); - } else { - at1 = '-int(' + at1 + ')'; - } - } - if (where2 == 'LAST' || (where2 == 'FROM_END' && at2 == '1')) { - at2 = ''; - } else if (where1 == 'FROM_START') { - if (Blockly.isNumber(at2)) { - at2 = parseInt(at2, 10); - } else { - at2 = 'int(' + at2 + ')'; - } - } else if (where1 == 'FROM_END') { - if (Blockly.isNumber(at2)) { - // If the index is a naked number, increment it right now. - at2 = 1 - parseInt(at2, 10); - if (at2 == 0) { - at2 = ''; - } - } else { - // If the index is dynamic, increment it in code. - // Add special case for -0. - Blockly.Python.definitions_['import_sys'] = 'import sys'; - at2 = 'int(1 - ' + at2 + ') or sys.maxsize'; - } - } - var code = text + '[' + at1 + ' : ' + at2 + ']'; - return [code, Blockly.Python.ORDER_MEMBER]; -}; - -Blockly.Python['text_changeCase'] = function(block) { - // Change capitalization. - var OPERATORS = { - 'UPPERCASE': '.upper()', - 'LOWERCASE': '.lower()', - 'TITLECASE': '.title()' - }; - var operator = OPERATORS[block.getFieldValue('CASE')]; - var argument0 = Blockly.Python.valueToCode(block, 'TEXT', - Blockly.Python.ORDER_MEMBER) || '\'\''; - var code = argument0 + operator; - return [code, Blockly.Python.ORDER_MEMBER]; -}; - -Blockly.Python['text_trim'] = function(block) { - // Trim spaces. - var OPERATORS = { - 'LEFT': '.lstrip()', - 'RIGHT': '.rstrip()', - 'BOTH': '.strip()' - }; - var operator = OPERATORS[block.getFieldValue('MODE')]; - var argument0 = Blockly.Python.valueToCode(block, 'TEXT', - Blockly.Python.ORDER_MEMBER) || '\'\''; - var code = argument0 + operator; - return [code, Blockly.Python.ORDER_MEMBER]; -}; - -Blockly.Python['text_print'] = function(block) { - // Print statement. - var argument0 = Blockly.Python.valueToCode(block, 'TEXT', - Blockly.Python.ORDER_NONE) || '\'\''; - return 'print(' + argument0 + ')\n'; -}; - -Blockly.Python['text_prompt_ext'] = function(block) { - // Prompt function. - var functionName = Blockly.Python.provideFunction_( - 'text_prompt', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(msg):', - ' try:', - ' return raw_input(msg)', - ' except NameError:', - ' return input(msg)']); - if (block.getField('TEXT')) { - // Internal message. - var msg = Blockly.Python.quote_(block.getFieldValue('TEXT')); - } else { - // External message. - var msg = Blockly.Python.valueToCode(block, 'TEXT', - Blockly.Python.ORDER_NONE) || '\'\''; - } - var code = functionName + '(' + msg + ')'; - var toNumber = block.getFieldValue('TYPE') == 'NUMBER'; - if (toNumber) { - code = 'float(' + code + ')'; - } - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['text_prompt'] = Blockly.Python['text_prompt_ext']; diff --git a/src/opsoro/apps/visual_programming/static/blockly/javascript_compressed.js b/src/opsoro/apps/visual_programming/static/blockly/javascript_compressed.js deleted file mode 100644 index d1b51ae..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/javascript_compressed.js +++ /dev/null @@ -1,81 +0,0 @@ -// Do not edit this file; automatically generated by build.py. -'use strict'; - - -// Copyright 2012 Google Inc. Apache License 2.0 -Blockly.JavaScript=new Blockly.Generator("JavaScript");Blockly.JavaScript.addReservedWords("Blockly,break,case,catch,continue,debugger,default,delete,do,else,finally,for,function,if,in,instanceof,new,return,switch,this,throw,try,typeof,var,void,while,with,class,enum,export,extends,import,super,implements,interface,let,package,private,protected,public,static,yield,const,null,true,false,Array,ArrayBuffer,Boolean,Date,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Error,eval,EvalError,Float32Array,Float64Array,Function,Infinity,Int16Array,Int32Array,Int8Array,isFinite,isNaN,Iterator,JSON,Math,NaN,Number,Object,parseFloat,parseInt,RangeError,ReferenceError,RegExp,StopIteration,String,SyntaxError,TypeError,Uint16Array,Uint32Array,Uint8Array,Uint8ClampedArray,undefined,uneval,URIError,applicationCache,closed,Components,content,_content,controllers,crypto,defaultStatus,dialogArguments,directories,document,frameElement,frames,fullScreen,globalStorage,history,innerHeight,innerWidth,length,location,locationbar,localStorage,menubar,messageManager,mozAnimationStartTime,mozInnerScreenX,mozInnerScreenY,mozPaintCount,name,navigator,opener,outerHeight,outerWidth,pageXOffset,pageYOffset,parent,performance,personalbar,pkcs11,returnValue,screen,screenX,screenY,scrollbars,scrollMaxX,scrollMaxY,scrollX,scrollY,self,sessionStorage,sidebar,status,statusbar,toolbar,top,URL,window,addEventListener,alert,atob,back,blur,btoa,captureEvents,clearImmediate,clearInterval,clearTimeout,close,confirm,disableExternalCapture,dispatchEvent,dump,enableExternalCapture,escape,find,focus,forward,GeckoActiveXObject,getAttention,getAttentionWithCycleCount,getComputedStyle,getSelection,home,matchMedia,maximize,minimize,moveBy,moveTo,mozRequestAnimationFrame,open,openDialog,postMessage,print,prompt,QueryInterface,releaseEvents,removeEventListener,resizeBy,resizeTo,restore,routeEvent,scroll,scrollBy,scrollByLines,scrollByPages,scrollTo,setCursor,setImmediate,setInterval,setResizable,setTimeout,showModalDialog,sizeToContent,stop,unescape,updateCommands,XPCNativeWrapper,XPCSafeJSObjectWrapper,onabort,onbeforeunload,onblur,onchange,onclick,onclose,oncontextmenu,ondevicemotion,ondeviceorientation,ondragdrop,onerror,onfocus,onhashchange,onkeydown,onkeypress,onkeyup,onload,onmousedown,onmousemove,onmouseout,onmouseover,onmouseup,onmozbeforepaint,onpaint,onpopstate,onreset,onresize,onscroll,onselect,onsubmit,onunload,onpageshow,onpagehide,Image,Option,Worker,Event,Range,File,FileReader,Blob,BlobBuilder,Attr,CDATASection,CharacterData,Comment,console,DocumentFragment,DocumentType,DomConfiguration,DOMError,DOMErrorHandler,DOMException,DOMImplementation,DOMImplementationList,DOMImplementationRegistry,DOMImplementationSource,DOMLocator,DOMObject,DOMString,DOMStringList,DOMTimeStamp,DOMUserData,Entity,EntityReference,MediaQueryList,MediaQueryListListener,NameList,NamedNodeMap,Node,NodeFilter,NodeIterator,NodeList,Notation,Plugin,PluginArray,ProcessingInstruction,SharedWorker,Text,TimeRanges,Treewalker,TypeInfo,UserDataHandler,Worker,WorkerGlobalScope,HTMLDocument,HTMLElement,HTMLAnchorElement,HTMLAppletElement,HTMLAudioElement,HTMLAreaElement,HTMLBaseElement,HTMLBaseFontElement,HTMLBodyElement,HTMLBRElement,HTMLButtonElement,HTMLCanvasElement,HTMLDirectoryElement,HTMLDivElement,HTMLDListElement,HTMLEmbedElement,HTMLFieldSetElement,HTMLFontElement,HTMLFormElement,HTMLFrameElement,HTMLFrameSetElement,HTMLHeadElement,HTMLHeadingElement,HTMLHtmlElement,HTMLHRElement,HTMLIFrameElement,HTMLImageElement,HTMLInputElement,HTMLKeygenElement,HTMLLabelElement,HTMLLIElement,HTMLLinkElement,HTMLMapElement,HTMLMenuElement,HTMLMetaElement,HTMLModElement,HTMLObjectElement,HTMLOListElement,HTMLOptGroupElement,HTMLOptionElement,HTMLOutputElement,HTMLParagraphElement,HTMLParamElement,HTMLPreElement,HTMLQuoteElement,HTMLScriptElement,HTMLSelectElement,HTMLSourceElement,HTMLSpanElement,HTMLStyleElement,HTMLTableElement,HTMLTableCaptionElement,HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement,HTMLTableColElement,HTMLTableRowElement,HTMLTableSectionElement,HTMLTextAreaElement,HTMLTimeElement,HTMLTitleElement,HTMLTrackElement,HTMLUListElement,HTMLUnknownElement,HTMLVideoElement,HTMLCanvasElement,CanvasRenderingContext2D,CanvasGradient,CanvasPattern,TextMetrics,ImageData,CanvasPixelArray,HTMLAudioElement,HTMLVideoElement,NotifyAudioAvailableEvent,HTMLCollection,HTMLAllCollection,HTMLFormControlsCollection,HTMLOptionsCollection,HTMLPropertiesCollection,DOMTokenList,DOMSettableTokenList,DOMStringMap,RadioNodeList,SVGDocument,SVGElement,SVGAElement,SVGAltGlyphElement,SVGAltGlyphDefElement,SVGAltGlyphItemElement,SVGAnimationElement,SVGAnimateElement,SVGAnimateColorElement,SVGAnimateMotionElement,SVGAnimateTransformElement,SVGSetElement,SVGCircleElement,SVGClipPathElement,SVGColorProfileElement,SVGCursorElement,SVGDefsElement,SVGDescElement,SVGEllipseElement,SVGFilterElement,SVGFilterPrimitiveStandardAttributes,SVGFEBlendElement,SVGFEColorMatrixElement,SVGFEComponentTransferElement,SVGFECompositeElement,SVGFEConvolveMatrixElement,SVGFEDiffuseLightingElement,SVGFEDisplacementMapElement,SVGFEDistantLightElement,SVGFEFloodElement,SVGFEGaussianBlurElement,SVGFEImageElement,SVGFEMergeElement,SVGFEMergeNodeElement,SVGFEMorphologyElement,SVGFEOffsetElement,SVGFEPointLightElement,SVGFESpecularLightingElement,SVGFESpotLightElement,SVGFETileElement,SVGFETurbulenceElement,SVGComponentTransferFunctionElement,SVGFEFuncRElement,SVGFEFuncGElement,SVGFEFuncBElement,SVGFEFuncAElement,SVGFontElement,SVGFontFaceElement,SVGFontFaceFormatElement,SVGFontFaceNameElement,SVGFontFaceSrcElement,SVGFontFaceUriElement,SVGForeignObjectElement,SVGGElement,SVGGlyphElement,SVGGlyphRefElement,SVGGradientElement,SVGLinearGradientElement,SVGRadialGradientElement,SVGHKernElement,SVGImageElement,SVGLineElement,SVGMarkerElement,SVGMaskElement,SVGMetadataElement,SVGMissingGlyphElement,SVGMPathElement,SVGPathElement,SVGPatternElement,SVGPolylineElement,SVGPolygonElement,SVGRectElement,SVGScriptElement,SVGStopElement,SVGStyleElement,SVGSVGElement,SVGSwitchElement,SVGSymbolElement,SVGTextElement,SVGTextPathElement,SVGTitleElement,SVGTRefElement,SVGTSpanElement,SVGUseElement,SVGViewElement,SVGVKernElement,SVGAngle,SVGColor,SVGICCColor,SVGElementInstance,SVGElementInstanceList,SVGLength,SVGLengthList,SVGMatrix,SVGNumber,SVGNumberList,SVGPaint,SVGPoint,SVGPointList,SVGPreserveAspectRatio,SVGRect,SVGStringList,SVGTransform,SVGTransformList,SVGAnimatedAngle,SVGAnimatedBoolean,SVGAnimatedEnumeration,SVGAnimatedInteger,SVGAnimatedLength,SVGAnimatedLengthList,SVGAnimatedNumber,SVGAnimatedNumberList,SVGAnimatedPreserveAspectRatio,SVGAnimatedRect,SVGAnimatedString,SVGAnimatedTransformList,SVGPathSegList,SVGPathSeg,SVGPathSegArcAbs,SVGPathSegArcRel,SVGPathSegClosePath,SVGPathSegCurvetoCubicAbs,SVGPathSegCurvetoCubicRel,SVGPathSegCurvetoCubicSmoothAbs,SVGPathSegCurvetoCubicSmoothRel,SVGPathSegCurvetoQuadraticAbs,SVGPathSegCurvetoQuadraticRel,SVGPathSegCurvetoQuadraticSmoothAbs,SVGPathSegCurvetoQuadraticSmoothRel,SVGPathSegLinetoAbs,SVGPathSegLinetoHorizontalAbs,SVGPathSegLinetoHorizontalRel,SVGPathSegLinetoRel,SVGPathSegLinetoVerticalAbs,SVGPathSegLinetoVerticalRel,SVGPathSegMovetoAbs,SVGPathSegMovetoRel,ElementTimeControl,TimeEvent,SVGAnimatedPathData,SVGAnimatedPoints,SVGColorProfileRule,SVGCSSRule,SVGExternalResourcesRequired,SVGFitToViewBox,SVGLangSpace,SVGLocatable,SVGRenderingIntent,SVGStylable,SVGTests,SVGTextContentElement,SVGTextPositioningElement,SVGTransformable,SVGUnitTypes,SVGURIReference,SVGViewSpec,SVGZoomAndPan"); -Blockly.JavaScript.ORDER_ATOMIC=0;Blockly.JavaScript.ORDER_MEMBER=1;Blockly.JavaScript.ORDER_NEW=1;Blockly.JavaScript.ORDER_FUNCTION_CALL=2;Blockly.JavaScript.ORDER_INCREMENT=3;Blockly.JavaScript.ORDER_DECREMENT=3;Blockly.JavaScript.ORDER_LOGICAL_NOT=4;Blockly.JavaScript.ORDER_BITWISE_NOT=4;Blockly.JavaScript.ORDER_UNARY_PLUS=4;Blockly.JavaScript.ORDER_UNARY_NEGATION=4;Blockly.JavaScript.ORDER_TYPEOF=4;Blockly.JavaScript.ORDER_VOID=4;Blockly.JavaScript.ORDER_DELETE=4; -Blockly.JavaScript.ORDER_MULTIPLICATION=5;Blockly.JavaScript.ORDER_DIVISION=5;Blockly.JavaScript.ORDER_MODULUS=5;Blockly.JavaScript.ORDER_ADDITION=6;Blockly.JavaScript.ORDER_SUBTRACTION=6;Blockly.JavaScript.ORDER_BITWISE_SHIFT=7;Blockly.JavaScript.ORDER_RELATIONAL=8;Blockly.JavaScript.ORDER_IN=8;Blockly.JavaScript.ORDER_INSTANCEOF=8;Blockly.JavaScript.ORDER_EQUALITY=9;Blockly.JavaScript.ORDER_BITWISE_AND=10;Blockly.JavaScript.ORDER_BITWISE_XOR=11;Blockly.JavaScript.ORDER_BITWISE_OR=12; -Blockly.JavaScript.ORDER_LOGICAL_AND=13;Blockly.JavaScript.ORDER_LOGICAL_OR=14;Blockly.JavaScript.ORDER_CONDITIONAL=15;Blockly.JavaScript.ORDER_ASSIGNMENT=16;Blockly.JavaScript.ORDER_COMMA=17;Blockly.JavaScript.ORDER_NONE=99; -Blockly.JavaScript.init=function(a){Blockly.JavaScript.definitions_=Object.create(null);Blockly.JavaScript.functionNames_=Object.create(null);Blockly.JavaScript.variableDB_?Blockly.JavaScript.variableDB_.reset():Blockly.JavaScript.variableDB_=new Blockly.Names(Blockly.JavaScript.RESERVED_WORDS_);var b=[];a=Blockly.Variables.allVariables(a);for(var c=0;c",GTE:">="}[a.getFieldValue("OP")],c="=="==b||"!="==b?Blockly.JavaScript.ORDER_EQUALITY:Blockly.JavaScript.ORDER_RELATIONAL,d=Blockly.JavaScript.valueToCode(a,"A",c)||"0";a=Blockly.JavaScript.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; -Blockly.JavaScript.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"&&":"||",c="&&"==b?Blockly.JavaScript.ORDER_LOGICAL_AND:Blockly.JavaScript.ORDER_LOGICAL_OR,d=Blockly.JavaScript.valueToCode(a,"A",c);a=Blockly.JavaScript.valueToCode(a,"B",c);if(d||a){var e="&&"==b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]}; -Blockly.JavaScript.logic_negate=function(a){var b=Blockly.JavaScript.ORDER_LOGICAL_NOT;return["!"+(Blockly.JavaScript.valueToCode(a,"BOOL",b)||"true"),b]};Blockly.JavaScript.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"true":"false",Blockly.JavaScript.ORDER_ATOMIC]};Blockly.JavaScript.logic_null=function(a){return["null",Blockly.JavaScript.ORDER_ATOMIC]}; -Blockly.JavaScript.logic_ternary=function(a){var b=Blockly.JavaScript.valueToCode(a,"IF",Blockly.JavaScript.ORDER_CONDITIONAL)||"false",c=Blockly.JavaScript.valueToCode(a,"THEN",Blockly.JavaScript.ORDER_CONDITIONAL)||"null";a=Blockly.JavaScript.valueToCode(a,"ELSE",Blockly.JavaScript.ORDER_CONDITIONAL)||"null";return[b+" ? "+c+" : "+a,Blockly.JavaScript.ORDER_CONDITIONAL]};Blockly.JavaScript.loops={}; -Blockly.JavaScript.controls_repeat_ext=function(a){var b=a.getField("TIMES")?String(Number(a.getFieldValue("TIMES"))):Blockly.JavaScript.valueToCode(a,"TIMES",Blockly.JavaScript.ORDER_ASSIGNMENT)||"0",c=Blockly.JavaScript.statementToCode(a,"DO"),c=Blockly.JavaScript.addLoopTrap(c,a.id);a="";var d=Blockly.JavaScript.variableDB_.getDistinctName("count",Blockly.Variables.NAME_TYPE),e=b;b.match(/^\w+$/)||Blockly.isNumber(b)||(e=Blockly.JavaScript.variableDB_.getDistinctName("repeat_end",Blockly.Variables.NAME_TYPE), -a+="var "+e+" = "+b+";\n");return a+("for (var "+d+" = 0; "+d+" < "+e+"; "+d+"++) {\n"+c+"}\n")};Blockly.JavaScript.controls_repeat=Blockly.JavaScript.controls_repeat_ext; -Blockly.JavaScript.controls_whileUntil=function(a){var b="UNTIL"==a.getFieldValue("MODE"),c=Blockly.JavaScript.valueToCode(a,"BOOL",b?Blockly.JavaScript.ORDER_LOGICAL_NOT:Blockly.JavaScript.ORDER_NONE)||"false",d=Blockly.JavaScript.statementToCode(a,"DO"),d=Blockly.JavaScript.addLoopTrap(d,a.id);b&&(c="!"+c);return"while ("+c+") {\n"+d+"}\n"}; -Blockly.JavaScript.controls_for=function(a){var b=Blockly.JavaScript.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.JavaScript.valueToCode(a,"FROM",Blockly.JavaScript.ORDER_ASSIGNMENT)||"0",d=Blockly.JavaScript.valueToCode(a,"TO",Blockly.JavaScript.ORDER_ASSIGNMENT)||"0",e=Blockly.JavaScript.valueToCode(a,"BY",Blockly.JavaScript.ORDER_ASSIGNMENT)||"1",f=Blockly.JavaScript.statementToCode(a,"DO"),f=Blockly.JavaScript.addLoopTrap(f,a.id);if(Blockly.isNumber(c)&&Blockly.isNumber(d)&& -Blockly.isNumber(e)){var g=parseFloat(c)<=parseFloat(d);a="for ("+b+" = "+c+"; "+b+(g?" <= ":" >= ")+d+"; "+b;b=Math.abs(parseFloat(e));a=(1==b?a+(g?"++":"--"):a+((g?" += ":" -= ")+b))+(") {\n"+f+"}\n")}else a="",g=c,c.match(/^\w+$/)||Blockly.isNumber(c)||(g=Blockly.JavaScript.variableDB_.getDistinctName(b+"_start",Blockly.Variables.NAME_TYPE),a+="var "+g+" = "+c+";\n"),c=d,d.match(/^\w+$/)||Blockly.isNumber(d)||(c=Blockly.JavaScript.variableDB_.getDistinctName(b+"_end",Blockly.Variables.NAME_TYPE), -a+="var "+c+" = "+d+";\n"),d=Blockly.JavaScript.variableDB_.getDistinctName(b+"_inc",Blockly.Variables.NAME_TYPE),a+="var "+d+" = ",a=Blockly.isNumber(e)?a+(Math.abs(e)+";\n"):a+("Math.abs("+e+");\n"),a+="if ("+g+" > "+c+") {\n",a+=Blockly.JavaScript.INDENT+d+" = -"+d+";\n",a+="}\n",a+="for ("+b+" = "+g+";\n "+d+" >= 0 ? "+b+" <= "+c+" : "+b+" >= "+c+";\n "+b+" += "+d+") {\n"+f+"}\n";return a}; -Blockly.JavaScript.controls_forEach=function(a){var b=Blockly.JavaScript.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_ASSIGNMENT)||"[]",d=Blockly.JavaScript.statementToCode(a,"DO"),d=Blockly.JavaScript.addLoopTrap(d,a.id);a="";var e=c;c.match(/^\w+$/)||(e=Blockly.JavaScript.variableDB_.getDistinctName(b+"_list",Blockly.Variables.NAME_TYPE),a+="var "+e+" = "+c+";\n");c=Blockly.JavaScript.variableDB_.getDistinctName(b+ -"_index",Blockly.Variables.NAME_TYPE);d=Blockly.JavaScript.INDENT+b+" = "+e+"["+c+"];\n"+d;return a+("for (var "+c+" in "+e+") {\n"+d+"}\n")};Blockly.JavaScript.controls_flow_statements=function(a){switch(a.getFieldValue("FLOW")){case "BREAK":return"break;\n";case "CONTINUE":return"continue;\n"}throw"Unknown flow statement.";};Blockly.JavaScript.math={};Blockly.JavaScript.math_number=function(a){return[parseFloat(a.getFieldValue("NUM")),Blockly.JavaScript.ORDER_ATOMIC]}; -Blockly.JavaScript.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.JavaScript.ORDER_ADDITION],MINUS:[" - ",Blockly.JavaScript.ORDER_SUBTRACTION],MULTIPLY:[" * ",Blockly.JavaScript.ORDER_MULTIPLICATION],DIVIDE:[" / ",Blockly.JavaScript.ORDER_DIVISION],POWER:[null,Blockly.JavaScript.ORDER_COMMA]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.JavaScript.valueToCode(a,"A",b)||"0";a=Blockly.JavaScript.valueToCode(a,"B",b)||"0";return c?[d+c+a,b]:["Math.pow("+d+", "+a+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; -Blockly.JavaScript.math_single=function(a){var b=a.getFieldValue("OP"),c;if("NEG"==b)return a=Blockly.JavaScript.valueToCode(a,"NUM",Blockly.JavaScript.ORDER_UNARY_NEGATION)||"0","-"==a[0]&&(a=" "+a),["-"+a,Blockly.JavaScript.ORDER_UNARY_NEGATION];a="SIN"==b||"COS"==b||"TAN"==b?Blockly.JavaScript.valueToCode(a,"NUM",Blockly.JavaScript.ORDER_DIVISION)||"0":Blockly.JavaScript.valueToCode(a,"NUM",Blockly.JavaScript.ORDER_NONE)||"0";switch(b){case "ABS":c="Math.abs("+a+")";break;case "ROOT":c="Math.sqrt("+ -a+")";break;case "LN":c="Math.log("+a+")";break;case "EXP":c="Math.exp("+a+")";break;case "POW10":c="Math.pow(10,"+a+")";break;case "ROUND":c="Math.round("+a+")";break;case "ROUNDUP":c="Math.ceil("+a+")";break;case "ROUNDDOWN":c="Math.floor("+a+")";break;case "SIN":c="Math.sin("+a+" / 180 * Math.PI)";break;case "COS":c="Math.cos("+a+" / 180 * Math.PI)";break;case "TAN":c="Math.tan("+a+" / 180 * Math.PI)"}if(c)return[c,Blockly.JavaScript.ORDER_FUNCTION_CALL];switch(b){case "LOG10":c="Math.log("+a+ -") / Math.log(10)";break;case "ASIN":c="Math.asin("+a+") / Math.PI * 180";break;case "ACOS":c="Math.acos("+a+") / Math.PI * 180";break;case "ATAN":c="Math.atan("+a+") / Math.PI * 180";break;default:throw"Unknown math operator: "+b;}return[c,Blockly.JavaScript.ORDER_DIVISION]}; -Blockly.JavaScript.math_constant=function(a){return{PI:["Math.PI",Blockly.JavaScript.ORDER_MEMBER],E:["Math.E",Blockly.JavaScript.ORDER_MEMBER],GOLDEN_RATIO:["(1 + Math.sqrt(5)) / 2",Blockly.JavaScript.ORDER_DIVISION],SQRT2:["Math.SQRT2",Blockly.JavaScript.ORDER_MEMBER],SQRT1_2:["Math.SQRT1_2",Blockly.JavaScript.ORDER_MEMBER],INFINITY:["Infinity",Blockly.JavaScript.ORDER_ATOMIC]}[a.getFieldValue("CONSTANT")]}; -Blockly.JavaScript.math_number_property=function(a){var b=Blockly.JavaScript.valueToCode(a,"NUMBER_TO_CHECK",Blockly.JavaScript.ORDER_MODULUS)||"0",c=a.getFieldValue("PROPERTY"),d;if("PRIME"==c)return d=Blockly.JavaScript.provideFunction_("math_isPrime",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(n) {"," // https://en.wikipedia.org/wiki/Primality_test#Naive_methods"," if (n == 2 || n == 3) {"," return true;"," }"," // False if n is NaN, negative, is 1, or not whole."," // And false if n is divisible by 2 or 3.", -" if (isNaN(n) || n <= 1 || n % 1 != 0 || n % 2 == 0 || n % 3 == 0) {"," return false;"," }"," // Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {"," if (n % (x - 1) == 0 || n % (x + 1) == 0) {"," return false;"," }"," }"," return true;","}"])+"("+b+")",[d,Blockly.JavaScript.ORDER_FUNCTION_CALL];switch(c){case "EVEN":d=b+" % 2 == 0";break;case "ODD":d=b+" % 2 == 1";break;case "WHOLE":d=b+" % 1 == 0";break;case "POSITIVE":d= -b+" > 0";break;case "NEGATIVE":d=b+" < 0";break;case "DIVISIBLE_BY":a=Blockly.JavaScript.valueToCode(a,"DIVISOR",Blockly.JavaScript.ORDER_MODULUS)||"0",d=b+" % "+a+" == 0"}return[d,Blockly.JavaScript.ORDER_EQUALITY]};Blockly.JavaScript.math_change=function(a){var b=Blockly.JavaScript.valueToCode(a,"DELTA",Blockly.JavaScript.ORDER_ADDITION)||"0";a=Blockly.JavaScript.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);return a+" = (typeof "+a+" == 'number' ? "+a+" : 0) + "+b+";\n"}; -Blockly.JavaScript.math_round=Blockly.JavaScript.math_single;Blockly.JavaScript.math_trig=Blockly.JavaScript.math_single; -Blockly.JavaScript.math_on_list=function(a){var b=a.getFieldValue("OP");switch(b){case "SUM":a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_MEMBER)||"[]";a+=".reduce(function(x, y) {return x + y;})";break;case "MIN":a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_COMMA)||"[]";a="Math.min.apply(null, "+a+")";break;case "MAX":a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_COMMA)||"[]";a="Math.max.apply(null, "+a+")";break;case "AVERAGE":b=Blockly.JavaScript.provideFunction_("math_mean", -["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(myList) {"," return myList.reduce(function(x, y) {return x + y;}) / myList.length;","}"]);a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "MEDIAN":b=Blockly.JavaScript.provideFunction_("math_median",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(myList) {"," var localList = myList.filter(function (x) {return typeof x == 'number';});"," if (!localList.length) return null;", -" localList.sort(function(a, b) {return b - a;});"," if (localList.length % 2 == 0) {"," return (localList[localList.length / 2 - 1] + localList[localList.length / 2]) / 2;"," } else {"," return localList[(localList.length - 1) / 2];"," }","}"]);a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "MODE":b=Blockly.JavaScript.provideFunction_("math_modes",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(values) {"," var modes = [];", -" var counts = [];"," var maxCount = 0;"," for (var i = 0; i < values.length; i++) {"," var value = values[i];"," var found = false;"," var thisCount;"," for (var j = 0; j < counts.length; j++) {"," if (counts[j][0] === value) {"," thisCount = ++counts[j][1];"," found = true;"," break;"," }"," }"," if (!found) {"," counts.push([value, 1]);"," thisCount = 1;"," }"," maxCount = Math.max(thisCount, maxCount);"," }"," for (var j = 0; j < counts.length; j++) {", -" if (counts[j][1] == maxCount) {"," modes.push(counts[j][0]);"," }"," }"," return modes;","}"]);a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "STD_DEV":b=Blockly.JavaScript.provideFunction_("math_standard_deviation",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(numbers) {"," var n = numbers.length;"," if (!n) return null;"," var mean = numbers.reduce(function(x, y) {return x + y;}) / n;"," var variance = 0;", -" for (var j = 0; j < n; j++) {"," variance += Math.pow(numbers[j] - mean, 2);"," }"," variance = variance / n;"," return Math.sqrt(variance);","}"]);a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "RANDOM":b=Blockly.JavaScript.provideFunction_("math_random_list",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(list) {"," var x = Math.floor(Math.random() * list.length);"," return list[x];","}"]);a=Blockly.JavaScript.valueToCode(a, -"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;default:throw"Unknown operator: "+b;}return[a,Blockly.JavaScript.ORDER_FUNCTION_CALL]};Blockly.JavaScript.math_modulo=function(a){var b=Blockly.JavaScript.valueToCode(a,"DIVIDEND",Blockly.JavaScript.ORDER_MODULUS)||"0";a=Blockly.JavaScript.valueToCode(a,"DIVISOR",Blockly.JavaScript.ORDER_MODULUS)||"0";return[b+" % "+a,Blockly.JavaScript.ORDER_MODULUS]}; -Blockly.JavaScript.math_constrain=function(a){var b=Blockly.JavaScript.valueToCode(a,"VALUE",Blockly.JavaScript.ORDER_COMMA)||"0",c=Blockly.JavaScript.valueToCode(a,"LOW",Blockly.JavaScript.ORDER_COMMA)||"0";a=Blockly.JavaScript.valueToCode(a,"HIGH",Blockly.JavaScript.ORDER_COMMA)||"Infinity";return["Math.min(Math.max("+b+", "+c+"), "+a+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; -Blockly.JavaScript.math_random_int=function(a){var b=Blockly.JavaScript.valueToCode(a,"FROM",Blockly.JavaScript.ORDER_COMMA)||"0";a=Blockly.JavaScript.valueToCode(a,"TO",Blockly.JavaScript.ORDER_COMMA)||"0";return[Blockly.JavaScript.provideFunction_("math_random_int",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(a, b) {"," if (a > b) {"," // Swap a and b to ensure a is smaller."," var c = a;"," a = b;"," b = c;"," }"," return Math.floor(Math.random() * (b - a + 1) + a);", -"}"])+"("+b+", "+a+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]};Blockly.JavaScript.math_random_float=function(a){return["Math.random()",Blockly.JavaScript.ORDER_FUNCTION_CALL]};Blockly.JavaScript.procedures={}; -Blockly.JavaScript.procedures_defreturn=function(a){var b=Blockly.JavaScript.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE),c=Blockly.JavaScript.statementToCode(a,"STACK");Blockly.JavaScript.STATEMENT_PREFIX&&(c=Blockly.JavaScript.prefixLines(Blockly.JavaScript.STATEMENT_PREFIX.replace(/%1/g,"'"+a.id+"'"),Blockly.JavaScript.INDENT)+c);Blockly.JavaScript.INFINITE_LOOP_TRAP&&(c=Blockly.JavaScript.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+a.id+"'")+c);var d=Blockly.JavaScript.valueToCode(a, -"RETURN",Blockly.JavaScript.ORDER_NONE)||"";d&&(d=" return "+d+";\n");for(var e=[],f=0;f",GTE:">="}[a.getTitleValue("OP")],c=Blockly.Lua.ORDER_RELATIONAL,d=Blockly.Lua.valueToCode(a,"A",c)||"0";a=Blockly.Lua.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; -Blockly.Lua.logic_operation=function(a){var b="AND"==a.getTitleValue("OP")?"and":"or",c="and"==b?Blockly.Lua.ORDER_AND:Blockly.Lua.ORDER_OR,d=Blockly.Lua.valueToCode(a,"A",c);a=Blockly.Lua.valueToCode(a,"B",c);if(d||a){var e="and"==b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]};Blockly.Lua.logic_negate=function(a){return["not "+(Blockly.Lua.valueToCode(a,"BOOL",Blockly.Lua.ORDER_UNARY)||"true"),Blockly.Lua.ORDER_UNARY]}; -Blockly.Lua.logic_boolean=function(a){return["TRUE"==a.getTitleValue("BOOL")?"true":"false",Blockly.Lua.ORDER_ATOMIC]};Blockly.Lua.logic_null=function(a){return["nil",Blockly.Lua.ORDER_ATOMIC]};Blockly.Lua.logic_ternary=function(a){var b=Blockly.Lua.valueToCode(a,"IF",Blockly.Lua.ORDER_AND)||"false",c=Blockly.Lua.valueToCode(a,"THEN",Blockly.Lua.ORDER_OR)||"nil";a=Blockly.Lua.valueToCode(a,"ELSE",Blockly.Lua.ORDER_OR)||"nil";return[b+" and "+c+" or "+a,Blockly.Lua.ORDER_OR]};Blockly.Lua.loops={};Blockly.Lua.controls_repeat=function(a){var b=parseInt(a.getTitleValue("TIMES"),10);a=Blockly.Lua.statementToCode(a,"DO")||"";return"for "+Blockly.Lua.variableDB_.getDistinctName("count",Blockly.Variables.NAME_TYPE)+"= 1, "+b+" do\n"+a+"end"}; -Blockly.Lua.controls_repeat_ext=function(a){var b=Blockly.Lua.valueToCode(a,"TIMES",Blockly.Lua.ORDER_NONE)||"0",b=Blockly.isNumber(b)?parseInt(b,10):"math.floor("+b+")";a=Blockly.Lua.statementToCode(a,"DO")||"\n";return"for "+Blockly.Lua.variableDB_.getDistinctName("count",Blockly.Variables.NAME_TYPE)+" = 1, "+b+" do\n"+a+"end\n"}; -Blockly.Lua.controls_whileUntil=function(a){var b="UNTIL"==a.getTitleValue("MODE"),b=Blockly.Lua.valueToCode(a,"BOOL",b?Blockly.Lua.ORDER_UNARY:Blockly.Lua.ORDER_NONE)||"False",c=Blockly.Lua.statementToCode(a,"DO")||"\n";"UNTIL"==a.getTitleValue("MODE")&&(b.match(/^\w+$/)||(b="("+b+")"),b="not "+b);return"while "+b+" do\n"+c+"end\n"}; -Blockly.Lua.controls_for=function(a){var b=Blockly.Lua.variableDB_.getName(a.getTitleValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.Lua.valueToCode(a,"FROM",Blockly.Lua.ORDER_NONE)||"0",d=Blockly.Lua.valueToCode(a,"TO",Blockly.Lua.ORDER_NONE)||"0",e=Blockly.Lua.valueToCode(a,"BY",Blockly.Lua.ORDER_NONE)||"1";a=Blockly.Lua.statementToCode(a,"DO")||"\n";b="for "+b+" = "+c+", "+d;Blockly.isNumber(e)&&1==Math.abs(parseFloat(e))||(b+=", "+e);return b+(" do\n"+a+"end\n")}; -Blockly.Lua.controls_forEach=function(a){var b=Blockly.Lua.variableDB_.getName(a.getTitleValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.Lua.valueToCode(a,"LIST",Blockly.Lua.ORDER_RELATIONAL)||"[]";a=Blockly.Lua.statementToCode(a,"DO")||"\n";return"for _, "+b+" in ipairs("+c+") do \n"+a+"end\n"};Blockly.Lua.controls_flow_statements=function(a){return"break\n"};Blockly.Lua.math={};Blockly.Lua.math_number=function(a){a=parseFloat(a.getTitleValue("NUM"));return[a,0>a?Blockly.Lua.ORDER_UNARY:Blockly.Lua.ORDER_ATOMIC]}; -Blockly.Lua.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.Lua.ORDER_ADDITIVE],MINUS:[" - ",Blockly.Lua.ORDER_ADDITIVE],MULTIPLY:[" * ",Blockly.Lua.ORDER_MULTIPLICATIVE],DIVIDE:[" / ",Blockly.Lua.ORDER_MULTIPLICATIVE],POWER:[" ^ ",Blockly.Lua.ORDER_EXPONENTIATION]}[a.getTitleValue("OP")],c=b[0],b=b[1],d=Blockly.Lua.valueToCode(a,"A",b)||"0";a=Blockly.Lua.valueToCode(a,"B",b)||"0";return[d+c+a,b]}; -Blockly.Lua.math_single=function(a){var b=a.getTitleValue("OP");if("NEG"==b)return b=Blockly.Lua.valueToCode(a,"NUM",Blockly.Lua.ORDER_UNARY)||"0",["-"+b,Blockly.Lua.ORDER_UNARY];a="SIN"==b||"COS"==b||"TAN"==b?Blockly.Lua.valueToCode(a,"NUM",Blockly.Lua.ORDER_MULTIPLICATIVE)||"0":Blockly.Lua.valueToCode(a,"NUM",Blockly.Lua.ORDER_NONE)||"0";switch(b){case "ABS":b="math.abs("+a+")";break;case "ROOT":b="math.sqrt("+a+")";break;case "LN":b="math.log("+a+")";break;case "LOG10":b="math.log10("+a+")";break; -case "EXP":b="math.exp("+a+")";break;case "POW10":b="math.pow(10,"+a+")";break;case "ROUND":b="math.floor("+a+" + .5)";break;case "ROUNDUP":b="math.ceil("+a+")";break;case "ROUNDDOWN":b="math.floor("+a+")";break;case "SIN":b="math.sin(math.rad("+a+"))";break;case "COS":b="math.cos(math.rad("+a+"))";break;case "TAN":b="math.tan(math.rad("+a+"))";break;case "ASIN":b="math.deg(math.asin("+a+"))";break;case "ACOS":b="math.deg(math.acos("+a+"))";break;case "ATAN":b="math.deg(math.atan("+a+"))";break;default:throw"Unknown math operator: "+ -b;}if(b)return[b,Blockly.Lua.ORDER_HIGH]};Blockly.Lua.math_constant=function(a){var b={PI:["math.pi",Blockly.Lua.ORDER_HIGH],E:["math.exp(1)",Blockly.Lua.ORDER_HIGH],GOLDEN_RATIO:["(1 + math.sqrt(5)) / 2",Blockly.Lua.ORDER_MULTIPLICATIVE],SQRT2:["math.sqrt(2)",Blockly.Lua.ORDER_HIGH],SQRT1_2:["math.sqrt(1 / 2)",Blockly.Lua.ORDER_HIGH],INFINITY:["math.huge",Blockly.Lua.ORDER_HIGH]};a=a.getTitleValue("CONSTANT");return b[a]}; -Blockly.Lua.math_number_property=function(a){var b=Blockly.Lua.valueToCode(a,"NUMBER_TO_CHECK",Blockly.Lua.ORDER_MULTIPLICATIVE)||"0",c=a.getTitleValue("PROPERTY"),d;if("PRIME"==c)return d=Blockly.Lua.provideFunction_("isPrime",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(x)"," -- http://stackoverflow.com/questions/11571752/lua-prime-number-checker"," if x < 2 then"," return false"," end"," -- Assume all numbers are prime until proven not-prime."," local prime = {}"," prime[1] = false", -" for i = 2, x do"," prime[i] = true"," end"," -- For each prime we find, mark all multiples as not-prime."," for i = 2, math.sqrt(x) do"," if prime[i] then"," for j = i*i, x, i do"," prime[j] = false"," end"," end"," end"," return prime[x]","end"])+"("+b+")",[d,Blockly.Lua.ORDER_HIGH];switch(c){case "EVEN":d=b+" % 2 == 0";break;case "ODD":d=b+" % 2 == 1";break;case "WHOLE":d=b+" % 1 == 0";break;case "POSITIVE":d=b+" > 0";break;case "NEGATIVE":d=b+" < 0";break;case "DIVISIBLE_BY":a= -Blockly.Lua.valueToCode(a,"DIVISOR",Blockly.Lua.ORDER_MULTIPLICATIVE);if(!a||"0"==a)return["nil",Blockly.Lua.ORDER_ATOMIC];d=b+" % "+a+" == 0"}return[d,Blockly.Lua.ORDER_RELATIONAL]};Blockly.Lua.math_change=function(a){var b=Blockly.Lua.valueToCode(a,"DELTA",Blockly.Lua.ORDER_ADDITIVE)||"0";a=Blockly.Lua.variableDB_.getName(a.getTitleValue("VAR"),Blockly.Variables.NAME_TYPE);return a+" = "+a+" + "+b+"\n"};Blockly.Lua.math_round=Blockly.Lua.math_single;Blockly.Lua.math_trig=Blockly.Lua.math_single; -Blockly.Lua.math_on_list=function(a){function b(){return Blockly.Lua.provideFunction_("sum",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," local result = 0"," for k,v in ipairs(t) do"," result = result + v"," end"," return result","end"])}var c=a.getTitleValue("OP");a=Blockly.Lua.valueToCode(a,"LIST",Blockly.Lua.ORDER_NONE)||"{}";switch(c){case "RANDOM":return["#"+a+" == 0 and nil or "+a+"[math.random(#"+a+")]",Blockly.Lua.ORDER_HIGH];case "AVERAGE":return["#"+a+" == 0 and 0 or "+ -b()+"("+a+") / #"+a,Blockly.Lua.ORDER_HIGH];case "SUM":c=b();break;case "MIN":c=Blockly.Lua.provideFunction_("min",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," local result = math.huge"," for k,v in ipairs(t) do"," if v < result then"," result = v"," end"," end"," return result","end"]);break;case "MAX":c=Blockly.Lua.provideFunction_("max",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," local result = 0"," for k,v in ipairs(t) do"," if v > result then", -" result = v"," end"," end"," return result","end"]);break;case "MEDIAN":c=Blockly.Lua.provideFunction_("math_median",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," -- Source: http://lua-users.org/wiki/SimpleStats"," local temp={}"," for k,v in ipairs(t) do",' if type(v) == "number" then'," table.insert( temp, v )"," end"," end"," table.sort( temp )"," if math.fmod(#temp,2) == 0 then"," return ( temp[#temp/2] + temp[(#temp/2)+1] ) / 2"," else"," return temp[math.ceil(#temp/2)]", -" end","end"]);break;case "MODE":c=Blockly.Lua.provideFunction_("math_modes",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," -- Source: http://lua-users.org/wiki/SimpleStats"," local counts={}"," for k, v in ipairs( t ) do"," if counts[v] == nil then"," counts[v] = 1"," else"," counts[v] = counts[v] + 1"," end"," end"," local biggestCount = 0"," for k, v in ipairs( counts ) do"," if v > biggestCount then"," biggestCount = v"," end"," end"," local temp={}", -" for k,v in ipairs( counts ) do"," if v == biggestCount then"," table.insert( temp, k )"," end"," end"," return temp","end"]);break;case "STD_DEV":c=Blockly.Lua.provideFunction_("math_standard_deviation",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," local m"," local vm"," local total = 0"," local count = 0"," local result"," m = #t == 0 and 0 or "+b()+"(t) / #t"," for k,v in ipairs(t) do"," if type(v) == 'number' then"," vm = v - m"," total = total + (vm * vm)", -" count = count + 1"," end"," end"," result = math.sqrt(total / (count-1))"," return result","end"]);break;default:throw"Unknown operator: "+c;}return[c+"("+a+")",Blockly.Lua.ORDER_HIGH]};Blockly.Lua.math_modulo=function(a){var b=Blockly.Lua.valueToCode(a,"DIVIDEND",Blockly.Lua.ORDER_MULTIPLICATIVE)||"0";a=Blockly.Lua.valueToCode(a,"DIVISOR",Blockly.Lua.ORDER_MULTIPLICATIVE)||"0";return[b+" % "+a,Blockly.Lua.ORDER_MULTIPLICATIVE]}; -Blockly.Lua.math_constrain=function(a){var b=Blockly.Lua.valueToCode(a,"VALUE",Blockly.Lua.ORDER_NONE)||"0",c=Blockly.Lua.valueToCode(a,"LOW",Blockly.Lua.ORDER_NONE)||"0";a=Blockly.Lua.valueToCode(a,"HIGH",Blockly.Lua.ORDER_NONE)||"math.huge";return["math.min(math.max("+b+", "+c+"), "+a+")",Blockly.Lua.ORDER_HIGH]}; -Blockly.Lua.math_random_int=function(a){var b=Blockly.Lua.valueToCode(a,"FROM",Blockly.Lua.ORDER_NONE)||"0";a=Blockly.Lua.valueToCode(a,"TO",Blockly.Lua.ORDER_NONE)||"0";return["math.random("+b+", "+a+")",Blockly.Lua.ORDER_HIGH]};Blockly.Lua.math_random_float=function(a){return["math.random()",Blockly.Lua.ORDER_HIGH]};Blockly.Lua.procedures={}; -Blockly.Lua.procedures_defreturn=function(a){var b=Blockly.Lua.variableDB_.getName(a.getTitleValue("NAME"),Blockly.Procedures.NAME_TYPE),c=Blockly.Lua.statementToCode(a,"STACK");Blockly.Lua.INFINITE_LOOP_TRAP&&(c=Blockly.Lua.INFINITE_LOOP_TRAP.replace(/%1/g,'"'+a.id+'"')+c);var d=Blockly.Lua.valueToCode(a,"RETURN",Blockly.Lua.ORDER_NONE)||"";d?d=" return "+d+"\n":c||(c="");for(var e=[],f=0;f - - - - - - - - ? - - - - - - - - ! - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/progress.gif b/src/opsoro/apps/visual_programming/static/blockly/media/progress.gif deleted file mode 100644 index e97adb8..0000000 Binary files a/src/opsoro/apps/visual_programming/static/blockly/media/progress.gif and /dev/null differ diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ar.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/ar.js deleted file mode 100644 index fb332b0..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ar.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.ar'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "اضافة تعليق"; -Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated -Blockly.Msg.CHANGE_VALUE_TITLE = "تغيير قيمة:"; -Blockly.Msg.CHAT = "دردش مع زملائك بالكتابة في هذا الصندوق!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "إخفاء القطع"; -Blockly.Msg.COLLAPSE_BLOCK = "إخفاء القطعة"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "اللون 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "اللون 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "نسبة"; -Blockly.Msg.COLOUR_BLEND_TITLE = "دمج"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "دمج لونين ببعضهما البعض بنسبة (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ar.wikipedia.org/wiki/Color"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "اختر لون من اللوحة."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "لون عشوائي"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "اختر لون بشكل عشوائي."; -Blockly.Msg.COLOUR_RGB_BLUE = "أزرق"; -Blockly.Msg.COLOUR_RGB_GREEN = "أخضر"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "أحمر"; -Blockly.Msg.COLOUR_RGB_TITLE = "لون مع"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "إنشئ لون بالكمية المحددة من الأحمر, الأخضر والأزرق. بحيث يجب تكون كافة القيم بين 0 و 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "اخرج من الحلقة"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "استمر ابتداءا من التكرار التالي من الحلقة"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "اخرج من الحلقة الحالية."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "تخط ما تبقى من هذه الحلقة، واستمر ابتداءا من التكرار التالي."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "تحذير: يمكن استخدام هذه القطعة فقط داخل حلقة."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "لكل عنصر %1 في قائمة %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "لكل عنصر في قائمة ما، عين المتغير '%1' لهذا الغنصر، ومن ثم نفذ بعض الأوامر."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "عد بـ %1 من %2 إلى %3 بمعدل %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "اجعل المتغير %1 يأخذ القيم من رقم البداية الى رقم النهاية، قم بالعد داخل المجال المحدد، وطبق أوامر القطع المحددة."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "إضف شرطا إلى القطعة الشرطية \"إذا\"."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "أضف شرط \"نهاية، إجمع\" إلى القطعة الشرطية \"إذا\"."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "أضف, إزل, أو أعد ترتيب المقاطع لإعادة تكوين القطعة الشرطية \"إذا\"."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "والا"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "وإﻻ إذا"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "إذا"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "إذا كانت قيمة ما تساوي صحيح, إذن قم بتنفيذ أمر ما."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "إذا كانت قيمة ما تساوي \"صحيح\"، إذن قم بتنفيذ أول قطعة من الأوامر. والا ،قم بتنفيذ القطعة الثانية من الأوامر."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "إذا كانت القيمة الأولى تساوي \"صحيح\", إذن قم بتنفيذ القطعة الأولى من الأوامر. والا, إذا كانت القيمة الثانية تساوي \"صحيح\", قم بتنفيذ القطعة الثانية من الأوامر."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "إذا كانت القيمة الأولى تساوي \"صحيح\", إذن قم بتنفيذ القطعة الأولى من الأوامر. والا , إذا كانت القيمة الثانية تساوي \"صحيح\", قم بتنفيذ القطعة الثانية من الأوامر. إذا لم تكن هناك أي قيمة تساوي صحيح, قم بتنفيذ آخر قطعة من الأوامر."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "نفّذ"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "كرر %1 مرات"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "نفّذ بعض الأوامر عدة مرات."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "اكرّر حتى"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "اكرّر طالما"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "بما ان القيمة خاطئة, نفّذ بعض الأوامر."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "بما ان القيمة صحيحة, نفّذ بعض الأوامر."; -Blockly.Msg.DELETE_BLOCK = "إحذف القطعة"; -Blockly.Msg.DELETE_X_BLOCKS = "إحذف قطع %1"; -Blockly.Msg.DISABLE_BLOCK = "عطّل القطعة"; -Blockly.Msg.DUPLICATE_BLOCK = "ادمج"; -Blockly.Msg.ENABLE_BLOCK = "أعد تفعيل القطعة"; -Blockly.Msg.EXPAND_ALL = "وسٌّع القطع"; -Blockly.Msg.EXPAND_BLOCK = "وسٌّع القطعة"; -Blockly.Msg.EXTERNAL_INPUTS = "ادخال خارجي"; -Blockly.Msg.HELP = "مساعدة"; -Blockly.Msg.INLINE_INPUTS = "ادخال خطي"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "إنشئ قائمة فارغة"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "تقوم بإرجاع قائمة، طولها 0, لا تحتوي على أية سجلات البيانات"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "قائمة"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "أضف, إزل, أو أعد ترتيب المقاطع لإعادة تكوين القطعة قائمة القطع التالية."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "أتشئ قائمة مع"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "أضف عنصرا إلى القائمة."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "أنشيء قائمة من أي عدد من العناصر."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "أول"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# من نهاية"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "احصل على"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "احصل على و ازل"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "أخير"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "عشوائي"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "ازل"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "يرجع العنصر الأول في قائمة ما."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "يقوم بإرجاع العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأخير."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "يقوم بإرجاع العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأول."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "يرجع العنصر الأخير في قائمة ما."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "يرجع عنصرا عشوائيا في قائمة."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "يزيل ويرجع العنصر الأول في قائمة."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "يزيل ويقوم بإرجاع العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأخير."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "يزيل ويقوم بإرجاع العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأول."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "يزيل ويرجع العنصر الأخير في قائمة ما."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "يزيل و يرجع عنصرا عشوائيا في قائمة ما."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "يزيل العنصر الأول في قائمة ما."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "يزيل العنصر الموجود في الموضع المحدد في قائمة ما. #1 هو العنصر الأخير."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "يزيل العنصر الموجود في الموضع المحدد في قائمة ما. #1 هو العنصر الأول."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "يزيل العنصر الأخير في قائمة ما."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "يزيل عنصرا عشوائيا في قائمة ما."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "إلى # من نهاية"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "إلى #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "إلى الأخير"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "احصل على قائمة فرعية من الأول"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "احصل على قائمة فرعية من # من نهاية"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "احصل على قائمة فرعية من #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "يقوم بإنشاء نسخة من الجزء المحدد من قائمة ما."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "ابحث على على التواجد الأول للعنصر"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "ابحث على التواجد الأخير للعنصر"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "تقوم بإرجاع مؤشر التواجد الأول/الأخير في القائمة. تقوم بإرجاع 0 إذا لم يتم العثور على النص."; -Blockly.Msg.LISTS_INLIST = "في قائمة"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 فارغ"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "يرجع \"صحيح\" إذا كانت القائمة فارغة."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "الطول من %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "تقوم بإرجاع طول قائمة."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "إنشئ قائمة مع العنصر %1 %2 مرات"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "انشئ قائمة تتألف من القيمة المعطاة متكررة لعدد محدد من المرات."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "مثل"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "أدخل في"; -Blockly.Msg.LISTS_SET_INDEX_SET = "تعيين"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "يقوم بإدراج هذا العنصر في بداية قائمة."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "يقوم بإدخال العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأخير."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "يقوم بإدخال العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأول."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "ألصق هذا العنصر بنهاية قائمة."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "ادخل العنصر عشوائياً في القائمة."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "يحدد العنصر الأول في قائمة."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "يحدد العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأخير."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "يحدد العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأول."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "يحدد العنصر الأخير في قائمة."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "يحدد عنصرا عشوائيا في قائمة."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "إعداد قائمة من النصوص"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "إعداد نص من القائمة"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "خاطئ"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "يرجع صحيح أو خاطئ."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "صحيح"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "يرجع صحيح إذا كان كلا المدخلات مساوية بعضها البعض."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "يرجع صحيح إذا كان الإدخال الأول أكبر من الإدخال الثاني."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "يرجع صحيح إذا كان الإدخال الأول أكبر من أو يساوي الإدخال الثاني."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "يرجع صحيح إذا كان الإدخال الأول أصغر من الإدخال الثاني."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "يرجع صحيح إذا كان الإدخال الأول أصغر من أو يساوي الإدخال الثاني."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "يرجع صحيح إذا كانت كلا المدخلات غير مساوية لبعضها البعض."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "ليس من %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "يرجع صحيح إذا كان الإدخال خاطئ . يرجع خاطئ إذا كان الإدخال صحيح."; -Blockly.Msg.LOGIC_NULL = "ملغى"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "ترجع ملغى."; -Blockly.Msg.LOGIC_OPERATION_AND = "و"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "أو"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "ترجع صحيح إذا كان كلا المٌدخلات صحيح."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "ترجع صحيح إذا كان واحد على الأقل من المدخلات صحيح."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "اختبار"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "إذا كانت العبارة خاطئة"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "إذا كانت العبارة صحيحة"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "تحقق الشرط في 'الاختبار'. إذا كان الشرط صحيح، يقوم بإرجاع قيمة 'اذا كانت العبارة صحيحة'؛ خلاف ذلك يرجع قيمة 'اذا كانت العبارة خاطئة'."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "يرجع مجموع الرقمين."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "يرجع حاصل قسمة الرقمين."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "يرجع الفرق بين الرقمين."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "يرجع حاصل ضرب الرقمين."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "يرجع الرقم الأول مرفوع إلى تربيع الرقم الثاني."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "غير %1 بـ %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "إضف رقم إلى متغير '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "ير جع واحد من الثوابت الشائعة : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "تقيد %1 منخفض %2 مرتفع %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "تقييد العددليكون بين الحدود المحددة (ضمناً)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "قابل للقسمة"; -Blockly.Msg.MATH_IS_EVEN = "هو زوجي"; -Blockly.Msg.MATH_IS_NEGATIVE = "هو سالب"; -Blockly.Msg.MATH_IS_ODD = "هو فرذي"; -Blockly.Msg.MATH_IS_POSITIVE = "هو موجب"; -Blockly.Msg.MATH_IS_PRIME = "هو أولي"; -Blockly.Msg.MATH_IS_TOOLTIP = "تحقق إذا كان عدد ما زوجيا، فرذيا, أوليا، صحيحا،موجبا أو سالبا، أو إذا كان قابلا للقسمة على عدد معين. يرجع صحيح أو خاطئ."; -Blockly.Msg.MATH_IS_WHOLE = "هو صحيح"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "باقي %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "يرجع الباقي من قسمة الرقمين."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "عدد ما."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "متوسط القائمة"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "الحد الأقصى لقائمة"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "متوسط القائمة"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "الحد الأدنى من قائمة"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "منوال القائمة"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "عنصر عشوائي من القائمة"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "الانحراف المعياري للقائمة"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "مجموع القائمة"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "يرجع المعدل (الوسط الحسابي) للقيم الرقمية في القائمة."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "يرجع أكبر عدد في القائمة."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "يرجع وسيط العدد في القائمة."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "يرجع أصغر رقم في القائمة."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "يرجع قائمة من العنصر أو العناصر الأكثر شيوعاً في القائمة."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "يرجع عنصر عشوائي من القائمة."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "يرجع الانحراف المعياري للقائمة."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "يرجع مجموع كافة الأرقام الموجودة في القائمة."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "كسر عشوائي"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "يرجع جزء عشوائي بين 0.0 (ضمنياً) و 1.0 (خارجيا)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = " عدد صحيح عشوائي من %1 إلى %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "يرجع عدد صحيح عشوائي بين حدين محددين, ضمنيا."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "تقريب"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "تقريب إلى اصغر عدد صحيح"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "تقريب الى اكبر عدد صحيح"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "تقريب الى اكبر عدد صحيح أو الى اصغر عدد صحيح."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "مطلق"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "الجذر التربيعي"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "يرجع القيمة المطلقة لرقم."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "يرجع e الذي هو الاس المرفوع للرقم."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "يرجع اللوغاريتم الطبيعي لرقم."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "يرجع لوغاريتم عدد معين للاساس 10."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "يرجع عدد سالب."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "يرجع مضروب الرقم 10 في نفسه ."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "يرجع الجذر التربيعي للرقم."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "acos"; -Blockly.Msg.MATH_TRIG_ASIN = "asin"; -Blockly.Msg.MATH_TRIG_ATAN = "atan"; -Blockly.Msg.MATH_TRIG_COS = "جيب تمام"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg.MATH_TRIG_SIN = "جيب"; -Blockly.Msg.MATH_TRIG_TAN = "ظل"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "يرجع قوس جيب التمام لرقم."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "يرجع قوس الجيب للرقم."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "يرجع قوس الظل للرقم."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "يرجع جيب التمام لدرجة (لا زواية نصف قطرية)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "يرجع جيب التمام لدرجة (لا زواية نصف قطرية)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "يرجع الظل لدرجة (لا دائرة نصف قطرية)."; -Blockly.Msg.ME = "Me"; // untranslated -Blockly.Msg.NEW_VARIABLE = "متغير جديد..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "اسم المتغير الجديد:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "مع:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "تشغيل الدالة المعرفة من قبل المستخدم '%1'."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "تشغيل الدالة المعرفة من قبل المستخدم %1 واستخدام مخرجاتها."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "مع:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "إنشئ '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "القيام بشيء ما"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "إلى"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "انشئ دالة بدون مخرجات ."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "يرجع"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "انشئ دالة مع المخرجات."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "تحذير: هذه الدالة تحتوي على معلمات مكررة."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "تسليط الضوء على تعريف الدالة"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "إذا كانت القيمة صحيحة ، اذان قم بارجاع القيمة الثانية."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "تحذير:هذه القطعة تستخدم فقط داخل تعريف دالة."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "اسم الإدخال:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "المدخلات"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated -Blockly.Msg.REMOVE_COMMENT = "ازل التعليق"; -Blockly.Msg.RENAME_VARIABLE = "إعادة تسمية المتغير..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "إعادة تسمية كافة المتغيرات '%1' إلى:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "إلصق نص"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "إلى"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "إلصق جزءا من النص إلى متغير '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "الى حروف صغيرة"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "الى حروف العنوان"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "الى حروف كبيرة"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "يرجع نسخة من النص في حالة مختلفة."; -Blockly.Msg.TEXT_CHARAT_FIRST = "احصل على الحرف الأول"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "الحصول على الحرف # من نهاية"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "الحصول على الحرف #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "في النص"; -Blockly.Msg.TEXT_CHARAT_LAST = "احصل على آخر حرف"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "الحصول على حرف عشوائي"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "يرجع حرف ما في الموضع المحدد."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "إضف عنصر إلى النص."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "الانضمام إلى"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "أضف, إحذف, أو أعد ترتيب المقاطع لإعادة تكوين النص من القطع التالية."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "إلى حرف # من نهاية"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "إلى حرف #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "إلى آخر حرف"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "في النص"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "الحصول على سلسلة فرعية من الحرف الأول"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "الحصول على سلسلة حروف فرعية من الحرف # من نهاية"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "الحصول على سلسلة حروف فرعية من الحرف #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "يرجع جزء معين من النص."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "في النص"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "ابحث عن التواجد الأول للنص"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "ابحث عن التواجد الأخير للنص"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "تقوم بإرجاع مؤشر التواجد الأول/الأخير للنص الأول في النص الثاني. تقوم بإرجاع 0 إذا لم يتم العثور على النص."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 فارغ"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "يرجع \"صحيح\" إذا كان النص المقدم فارغ."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "انشئ نص مع"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "أنشئ جزء من النص بالصاق أي عدد من العناصر ببعضها البعض."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "طول %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "تقوم بإرجاع عدد الاحرف (بما في ذلك الفراغات) في النص المقدم."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "اطبع %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "اطبع النص المحدد أو العدد أو قيمة أخرى."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "انتظر ادخال المستخذم لرقم ما."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "انتظر ادخال المستخدم لنص ما."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "انتظر ادخال المستخدم لرقم ما مع اظهار رسالة"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "انتظر ادخال المستخدم لنص ما مع اظهار رسالة"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "حرف أو كلمة أو سطر من النص."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "إزالة الفراغات من كلا الجانبين"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "إزالة الفراغات من الجانب الأيسر من"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "إزالة الفراغات من الجانب الأيمن من"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "يرجع نسخة من النص مع حذف من أحد أو كلا الفراغات من أطرافه."; -Blockly.Msg.TODAY = "Today"; // untranslated -Blockly.Msg.VARIABLES_DEFAULT_NAME = "البند"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "انشئ 'التعيين %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "يرجع قيمة هذا المتغير."; -Blockly.Msg.VARIABLES_SET = "تعيين %1 إلى %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "انشئ 'احصل على %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "تعيين هذا المتغير لتكون مساوية للقيمة المدخلة."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/be-tarask.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/be-tarask.js deleted file mode 100644 index 411d163..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/be-tarask.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.be.tarask'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Дадаць камэнтар"; -Blockly.Msg.AUTH = "Калі ласка, аўтарызуйце гэтае прыкладаньне, каб можна было захоўваць Вашую працу і мець магчымасьць дзяліцца ёю."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Зьмяніць значэньне:"; -Blockly.Msg.CHAT = "Стасуйцеся са сваім калегам, набіраючы тэкст у гэтым полі!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Згарнуць блёкі"; -Blockly.Msg.COLLAPSE_BLOCK = "Згарнуць блёк"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "колер 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "колер 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "дзеля"; -Blockly.Msg.COLOUR_BLEND_TITLE = "зьмяшаць"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Зьмешвае два колеры ў дадзенай прапорцыі (0.0 — 1.0)"; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://be-x-old.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D0%B5%D1%80"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Абярыце колер з палітры."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "выпадковы колер"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Абраць выпадковы колер."; -Blockly.Msg.COLOUR_RGB_BLUE = "сіняга"; -Blockly.Msg.COLOUR_RGB_GREEN = "зялёнага"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "чырвонага"; -Blockly.Msg.COLOUR_RGB_TITLE = "колер з"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Стварыць колер з абранымі прапорцыямі чырвонага, зялёнага і сіняга. Усе значэньні павінны быць ад 0 да 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "перарваць цыкль"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "працягнуць з наступнага кроку цыклю"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Спыніць гэты цыкль."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Прапусьціць рэшту цыклю і перайсьці да наступнага кроку."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Увага: гэты блёк можа быць выкарыстаны толькі ў цыклі."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "для кожнага элемэнта %1 у сьпісе %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Для кожнага элемэнту сьпісу прысвойвае зьменнай '%1' ягонае значэньне і выконвае пэўныя апэрацыі."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "лічыць з %1 ад %2 да %3 па %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Прысвойвае зьменнай \"%1\" значэньні ад пачатковага да канчатковага значэньня, улічваючы зададзены крок, і выконвае абраныя блёкі."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Дадаць умову да блёку «калі»."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Дадаць заключную ўмову для ўсіх астатніх варыянтаў блёку «калі»."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Дадаць, выдаліць ці пераставіць сэкцыі для пераканфігураваньня гэтага блёку «калі»."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "інакш"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "інакш, калі"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "калі"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Калі значэньне ісьціна, выканаць пэўныя апэрацыі."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Калі значэньне ісьціна, выканаць першы блёк апэрацыяў, інакш выканаць другі блёк."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Калі першае значэньне ісьціна, выканаць першы блёк апэрацыяў. Інакш, калі другое значэньне ісьціна, выканаць другі блёк апэрацыяў."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Калі першае значэньне ісьціна, выканаць першы блёк апэрацыяў. Інакш, калі другое значэньне ісьціна, выканаць другі блёк апэрацыяў. Калі ніводнае з значэньняў не сапраўднае, выканаць апошні блёк апэрацыяў."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "выканаць"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "паўтарыць %1 раз(ы)"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Выконвае апэрацыі некалькі разоў."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "паўтараць, пакуль не"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "паўтараць, пакуль"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Пакуль значэньне хлусьня, выконваць пэўныя апэрацыі."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Пакуль значэньне ісьціна, выконваць пэўныя апэрацыі."; -Blockly.Msg.DELETE_BLOCK = "Выдаліць блёк"; -Blockly.Msg.DELETE_X_BLOCKS = "Выдаліць %1 блёкі"; -Blockly.Msg.DISABLE_BLOCK = "Адключыць блёк"; -Blockly.Msg.DUPLICATE_BLOCK = "Капіяваць"; -Blockly.Msg.ENABLE_BLOCK = "Уключыць блёк"; -Blockly.Msg.EXPAND_ALL = "Разгарнуць блёкі"; -Blockly.Msg.EXPAND_BLOCK = "Разгарнуць блёк"; -Blockly.Msg.EXTERNAL_INPUTS = "Зьнешнія ўваходы"; -Blockly.Msg.HELP = "Дапамога"; -Blockly.Msg.INLINE_INPUTS = "Унутраныя ўваходы"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "стварыць пусты сьпіс"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Вяртае сьпіс даўжынёй 0, які ня ўтрымлівае запісаў зьвестак"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "сьпіс"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Дадаць, выдаліць ці пераставіць сэкцыі для пераканфігураваньня гэтага блёку."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "стварыць сьпіс з"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Дадаць элемэнт да сьпісу."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Ставарае сьпіс зь любой колькасьцю элемэнтаў."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "першы"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "№ з канца"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "атрымаць"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "атрымаць і выдаліць"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "апошні"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "выпадковы"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "выдаліць"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Вяртае першы элемэнт у сьпісе."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Вяртае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — апошні элемэнт."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Вяртае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Вяртае апошні элемэнт у сьпісе."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Вяртае выпадковы элемэнт у сьпісе."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Выдаляе і вяртае першы элемэнт у сьпісе."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Выдаляе і вяртае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — апошні элемэнт."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Выдаляе і вяртае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Выдаляе і вяртае апошні элемэнт у сьпісе."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Выдаляе і вяртае выпадковы элемэнт у сьпісе."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Выдаляе першы элемэнт у сьпісе."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Выдаляе элемэнт у пазначанай пазыцыі ў сьпісе. №1 — апошні элемэнт."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Выдаляе элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Выдаляе апошні элемэнт у сьпісе."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Выдаляе выпадковы элемэнт у сьпісе."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "па № з канца"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "да #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "да апошняга"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "атрымаць падсьпіс зь першага"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "атрымаць падсьпіс з № з канца"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "атрымаць падсьпіс з №"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Стварае копію пазначанай часткі сьпісу."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "знайсьці першае ўваходжаньне элемэнту"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "знайсьці апошняе ўваходжаньне элемэнту"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Вяртае індэкс першага/апошняга ўваходжаньня элемэнту ў сьпісе. Вяртае 0, калі тэкст ня знойдзены."; -Blockly.Msg.LISTS_INLIST = "у сьпісе"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 пусты"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Вяртае значэньне ісьціна, калі сьпіс пусты."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "даўжыня %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Вяртае даўжыню сьпісу."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "стварыць сьпіс з элемэнту %1, які паўтараецца %2 разоў"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Стварае сьпіс, які ўтрымлівае пададзеную колькасьць копіяў элемэнту."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "як"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "уставіць у"; -Blockly.Msg.LISTS_SET_INDEX_SET = "усталяваць"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Устаўляе элемэнт у пачатак сьпісу."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Устаўляе элемэнт у пазначанай пазыцыі ў сьпісе. №1 — апошні элемэнт."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Устаўляе элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Дадае элемэнт у канец сьпісу."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Выпадковым чынам устаўляе элемэнт у сьпіс."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Задае першы элемэнт у сьпісе."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Задае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — апошні элемэнт."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Задае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Задае апошні элемэнт у сьпісе."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Задае выпадковы элемэнт у сьпісе."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "стварыць сьпіс з тэксту"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "стварыць тэкст са сьпісу"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Аб’ядноўвае сьпіс тэкстаў у адзін тэкст па падзяляльніках."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Падзяліць тэкст у сьпіс тэкстаў, па падзяляльніках."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "з падзяляльнікам"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "хлусьня"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Вяртае «ісьціна» ці «хлусьня»."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "ісьціна"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://be-x-old.wikipedia.org/wiki/%D0%9D%D1%8F%D1%80%D0%BE%D1%9E%D0%BD%D0%B0%D1%81%D1%8C%D1%86%D1%8C"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Вяртае «ісьціна», калі абодва ўводы роўныя."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Вяртае «ісьціна», калі першы ўвод большы за другі."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Вяртае «ісьціна», калі першы ўвод большы ці роўны другому."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Вяртае «ісьціна», калі першы ўвод меншы за другі."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Вяртае «ісьціна», калі першы ўвод меншы ці роўны другому."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Вяртае «ісьціна», калі абодва ўводы ня роўныя."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "не %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Вяртае «ісьціна», калі ўвод непраўдзівы. Вяртае «хлусьня», калі ўвод праўдзівы."; -Blockly.Msg.LOGIC_NULL = "нічога"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Вяртае нічога."; -Blockly.Msg.LOGIC_OPERATION_AND = "і"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "ці"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Вяртае «ісьціна», калі абодва ўводы праўдзівыя."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Вяртае «ісьціна», калі прынамсі адзін з уводаў праўдзівы."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "тэст"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "калі хлусьня"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "калі ісьціна"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Праверыць умову ў 'тэст'. Калі ўмова праўдзівая, будзе вернутае значэньне «калі ісьціна»; інакш будзе вернутае «калі хлусьня»."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://be-x-old.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%82%D0%BC%D1%8D%D1%82%D1%8B%D0%BA%D0%B0"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Вяртае суму двух лікаў."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Вяртае дзель двух лікаў."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Вяртае рознасьць двух лікаў."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Вяртае здабытак двух лікаў."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Вяртае першы лік у ступені другога ліку."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "зьмяніць %1 на %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Дадае лічбу да зьменнай '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://be-x-old.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D1%8D%D0%BC%D0%B0%D1%82%D1%8B%D1%87%D0%BD%D0%B0%D1%8F_%D0%BA%D0%B0%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82%D0%B0"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Вяртае адну з агульных канстантаў: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0,707...) або ∞ (бясконцасьць)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "абмежаваць %1 зьнізу %2 зьверху %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Абмяжоўвае колькасьць ніжняй і верхняй межамі (уключна)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "дзяліць на"; -Blockly.Msg.MATH_IS_EVEN = "парная"; -Blockly.Msg.MATH_IS_NEGATIVE = "адмоўная"; -Blockly.Msg.MATH_IS_ODD = "няпарная"; -Blockly.Msg.MATH_IS_POSITIVE = "станоўчая"; -Blockly.Msg.MATH_IS_PRIME = "простая"; -Blockly.Msg.MATH_IS_TOOLTIP = "Правярае, ці зьяўляецца лік парным, няпарным, простым, станоўчым, адмоўным, ці ён дзеліцца на пэўны лік без астатку. Вяртае значэньне ісьціна або няпраўда."; -Blockly.Msg.MATH_IS_WHOLE = "цэлая"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "рэшта дзяленьня %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Вяртае рэшту дзяленьня двух лікаў."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://be-x-old.wikipedia.org/wiki/%D0%9B%D1%96%D0%BA"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Лік."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "сярэдняя ў сьпісе"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "мінімальная ў сьпісе"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "мэдыяна сьпісу"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "мінімальная ў сьпісе"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "рэжымы сьпісу"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "выпадковы элемэнт сьпісу"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "стандартнае адхіленьне сьпісу"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "Сума сьпісу"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Вяртае сярэднеарытмэтычнае значэньне лікавых значэньняў у сьпісе."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Вяртае найменшы лік у сьпісе."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Вяртае мэдыяну сьпісу."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Вяртае найменшы лік у сьпісе."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Вяртае сьпіс самых распаўсюджаных элемэнтаў у сьпісе."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Вяртае выпадковы элемэнт сьпісу."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Вяртае стандартнае адхіленьне сьпісу."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Вяртае суму ўсіх лікаў у сьпісе."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "выпадковая дроб"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Вяртае выпадковую дроб у дыяпазоне ад 0,0 (уключна) да 1,0."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "выпадковая цэлая з %1 для %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Вяртае выпадковы цэлы лік паміж двума зададзенымі абмежаваньнямі ўключна."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "акругліць"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "акругліць да меншага"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "акругліць да большага"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Акругленьне ліку да большага ці меншага."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://be-x-old.wikipedia.org/wiki/%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D1%8B_%D0%BA%D0%BE%D1%80%D0%B0%D0%BD%D1%8C"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "модуль"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "квадратны корань"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Вяртае модуль ліку."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Вяртае e ў ступені ліку."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Вяртае натуральны лягарытм ліку."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Вяртае дзесятковы лягарытм ліку."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Вяртае супрацьлеглы лік."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Вяртае 10 у ступені ліку."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Вяртае квадратны корань ліку."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://be-x-old.wikipedia.org/wiki/%D0%A2%D1%80%D1%8B%D0%B3%D0%B0%D0%BD%D0%B0%D0%BC%D1%8D%D1%82%D1%80%D1%8B%D1%8F#.D0.A2.D1.80.D1.8B.D0.B3.D0.B0.D0.BD.D0.B0.D0.BC.D1.8D.D1.82.D1.80.D1.8B.D1.87.D0.BD.D1.8B.D1.8F_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.8B.D1.96"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Вяртае арккосынус ліку."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Вяртае арксынус ліку."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Вяртае арктангэнс ліку."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Вяртае косынус кута ў градусах."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Вяртае сынус кута ў градусах."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Вяртае тангэнс кута ў градусах."; -Blockly.Msg.ME = "Я"; -Blockly.Msg.NEW_VARIABLE = "Новая зьменная…"; -Blockly.Msg.NEW_VARIABLE_TITLE = "Імя новай зьменнай:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "дазволіць зацьвярджэньне"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "з:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Запусьціць функцыю вызначаную карыстальнікам '%1'."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Запусьціць функцыю вызначаную карыстальнікам '%1' і выкарыстаць яе вынік."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "з:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Стварыць '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "зрабіць што-небудзь"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "да"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Стварае функцыю бяз выніку."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "вярнуць"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Стварае функцыю з вынікам."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Увага: гэтая функцыя мае парамэтры-дублікаты."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Падсьвяціць вызначэньне функцыі"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Калі значэньне ісьціна, вярнуць другое значэньне."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Папярэджаньне: гэты блёк можа выкарыстоўвацца толькі ў вызначанай функцыі."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "назва парамэтру:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Дадаць уваходныя парамэтры ў функцыю."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "парамэтры"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Дадаць, выдаліць ці запісаць чаргу ўваходных парамэтраў для гэтай функцыі."; -Blockly.Msg.REMOVE_COMMENT = "Выдаліць камэнтар"; -Blockly.Msg.RENAME_VARIABLE = "Перайменаваць зьменную…"; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Перайменаваць усе назвы зьменных '%1' на:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "дадаць тэкст"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "да"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Дадаць які-небудзь тэкст да зьменнай '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "да ніжняга рэгістру"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "Вялікія Першыя Літары"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "да ВЕРХНЯГА РЭГІСТРУ"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Вярнуць копію тэксту зь іншай велічынёй літар."; -Blockly.Msg.TEXT_CHARAT_FIRST = "узяць першую літару"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "узяць літару № з канца"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "узяць літару №"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "у тэксьце"; -Blockly.Msg.TEXT_CHARAT_LAST = "узяць апошнюю літару"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "узяць выпадковую літару"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Вяртае літару ў пазначанай пазыцыі."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Дадаць элемэнт да тэксту."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "далучыць"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Дадайце, выдаліце ці зьмяніце парадак разьдзелаў для перадачы тэкставага блёку."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "да літары № з канца"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "да літары №"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "да апошняй літары"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "у тэксьце"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "атрымаць падрадок зь першай літары"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "узяць падрадок зь літары № з канца"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "узяць падрадок зь літары №"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Вяртае пазначаную частку тэксту."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "у тэксьце"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "знайсьці першае ўваходжаньне тэксту"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "знайсьці апошняе ўваходжаньне тэксту"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Вяртае індэкс першага/апошняга ўваходжаньня першага тэксту ў другі тэкст. Вяртае 0, калі тэкст ня знойдзены."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 пусты"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Вяртае значэньне ісьціна, калі тэкст пусты."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "стварыць тэкст з"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Стварае фрагмэнт тэксту аб’яднаньнем любой колькасьці элемэнтаў."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "даўжыня %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Вяртае колькасьць літараў (у тым ліку прабелы) у пададзеным тэксьце."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "друкаваць %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Надрукаваць пазначаны тэкст, лічбу ці іншыя сымбалі."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Запытаць у карыстальніка лічбу."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Запытаць у карыстальніка тэкст."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "запытаць лічбу з падказкай"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "запытаць тэкст з падказкай"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Літара, слова ці радок тэксту."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "абрэзаць прабелы з абодвух бакоў"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "абрэзаць прабелы зь левага боку"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "абрэзаць прабелы з правага боку"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Вяртае копію тэксту з прабеламі, выдаленымі ад аднаго ці абодвух бакоў."; -Blockly.Msg.TODAY = "Сёньня"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "аб’ект"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Стварыць блёк «усталяваць %1»"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Вяртае значэньне гэтай зьменнай."; -Blockly.Msg.VARIABLES_SET = "усталяваць %1 да %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Стварыць блёк «атрымаць %1»"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Надаць гэтай зьменнай значэньне ўстаўкі."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/br.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/br.js deleted file mode 100644 index 29da613..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/br.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.br'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Ouzhpennañ un evezhiadenn"; -Blockly.Msg.AUTH = "Roit aotre, mar plij, d'an arload-mañ evit gallout saveteiñ ho labour ha reiñ aotre dezhañ da rannañ ho labour ganimp."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Kemmañ an dalvoudenn :"; -Blockly.Msg.CHAT = "Flapañ gant ho kenlabourer en ur skrivañ er voest-se !"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Bihanaat ar bloc'hoù"; -Blockly.Msg.COLLAPSE_BLOCK = "Bihanaat ar bloc'h"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "liv 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "liv 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "feur"; -Blockly.Msg.COLOUR_BLEND_TITLE = "meskañ"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "a gemmesk daou liv gant ur feur roet(0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "http://br.wikipedia.org/wiki/Liv"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Dibab ul liv diwar al livaoueg."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "liv dargouezhek"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Tennañ ul liv d'ar sord"; -Blockly.Msg.COLOUR_RGB_BLUE = "glas"; -Blockly.Msg.COLOUR_RGB_GREEN = "gwer"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "ruz"; -Blockly.Msg.COLOUR_RGB_TITLE = "liv gant"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Krouiñ ul liv gant ar c'hementad spisaet a ruz, a wer hag a c'hlas. Etre 0 ha 100 e tle bezañ an holl dalvoudoù."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "Mont e-maez an adlañsañ"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "Kenderc'hel gant iteradur nevez ar rodell"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Mont e-maez ar boukl engronnus."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Lammat ar rest eus ar rodell, ha kenderc'hel gant an iteradur war-lerc'h."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Diwallit : ne c'hall ar bloc'h-mañ bezañ implijet nemet e-barzh ur boukl."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "evit pep elfenn %1 er roll %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Evit pep elfenn en ur roll, reiñ talvoud an elfenn d'an argemmenn '%1', ha seveniñ urzhioù zo da c'houde."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "kontañ gant %1 eus %2 da %3 dre %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Ober e doare ma kemero an argemmenn \"%1\" an talvoudennoù adalek niverenn an deroù betek niverenn an dibenn, en ur inkremantiñ an esaouenn, ha seveniñ an urzhioù spisaet."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Ouzhpennañ un amplegad d'ar bloc'h ma."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Ouzhpennañ un amplegad dibenn lak-pep-tra d'ar bloc'h ma."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Ouzhpennañ, lemel pe adurzhiañ ar rannoù evit kefluniañ ar bloc'h ma."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "a-hend-all"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "mod all ma"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "ma"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Ma vez gwir un dalvoudenn, seveniñ urzhioù zo neuze."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Ma vez gwir un dalvoudenn, seveniñ ar c'henañ bloc'had urzhioù neuze. Anez seveniñ an eil bloc'had urzhioù."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Ma vez gwir an dalvoudenn gentañ, seveniñ ar c'hentañ bloc'had urzhioù neuze. Anez ma vez gwir an eil talvoudenn, seveniñ an eil bloc'had urzhioù."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Ma vez gwir an dalvoudenn gentañ, seveniñ ar c'hentañ bloc'had. Anez, ma vez gwir an eil talvoudenn, seveniñ an eil bloc'had urzhioù. Ma ne vez gwir talvoudenn ebet, seveniñ ar bloc'had diwezhañ a urzhioù."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "ober"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "adober %1 gwech"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Seveniñ urzhioù zo meur a wech"; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "adober betek"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "adober keit ha ma"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Keit ha ma vez faos un dalvoudenn,seveniñ urzhioù zo neuze."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Keit ha ma vez gwir un dalvoudenn, seveniñ urzhioù zo neuze."; -Blockly.Msg.DELETE_BLOCK = "Dilemel ar bloc'h"; -Blockly.Msg.DELETE_X_BLOCKS = "Dilemel %1 bloc'h"; -Blockly.Msg.DISABLE_BLOCK = "Diweredekaat ar bloc'h"; -Blockly.Msg.DUPLICATE_BLOCK = "Eiladuriñ"; -Blockly.Msg.ENABLE_BLOCK = "Gweredekaat ar bloc'h"; -Blockly.Msg.EXPAND_ALL = "Astenn ar bloc'hoù"; -Blockly.Msg.EXPAND_BLOCK = "Astenn ar bloc'h"; -Blockly.Msg.EXTERNAL_INPUTS = "Monedoù diavaez"; -Blockly.Msg.HELP = "Skoazell"; -Blockly.Msg.INLINE_INPUTS = "Monedoù enlinenn"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "krouiñ ur roll goullo"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Distreiñ ul listenn, 0 a hirder, n'eus enrolladenn ebet enni"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "roll"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Ouzhpennañ, lemel pe adurzhiañ ar rannoù evit kefluniañ ar bloc'h listenn-mañ."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "krouiñ ur roll gant"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Ouzhpennañ un elfenn d'ar roll"; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Krouiñ ur roll gant un niver bennak a elfennoù."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "kentañ"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# adalek ar fin"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "tapout"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "tapout ha lemel"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "diwezhañ"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "dre zegouezh"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "lemel"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Distreiñ an elfenn gentañ en ul listenn."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Distreiñ an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Distreiñ an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Distreiñ un elfenn diwezhañ en ul listenn."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Distreiñ un elfenn dre zegouezh en ul listenn."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Lemel ha distreiñ a ra an elfenn gentañ en ul listenn."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Lemel ha distreiñ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn ziwezhañ."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Lemel ha distreiñ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Lemel ha distreiñ a ra an elfenn diwezhañ en ul listenn."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Lemel ha distreiñ a ra an elfenn dre zegouezh en ul listenn."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Lemel a ra an elfenn gentañ en ul listenn."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Lemel a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn ziwezhañ."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Lemel a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Distreiñ a ra an elfenn diwezhañ en ul listenn."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Lemel a ra un elfenn dre zegouezh en ul listenn."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "betek # adalek an dibenn"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "da #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "betek ar fin"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "Kaout an islistenn adalek an deroù"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "Kaout an islistenn adalek # adalek an dibenn"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "Kaout an islistenn adalek #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Krouiñ un eilad eus lodenn spisaet ul listenn."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "kavout reveziadenn gentañ un elfenn"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "kavout reveziadenn diwezhañ un elfenn"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus an elfenn en ul listenn. Distreiñ 0 ma n'eo ket kavet an destenn."; -Blockly.Msg.LISTS_INLIST = "el listenn"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 zo goullo"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Distreiñ gwir m'eo goullo al listenn."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "hirder %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Distreiñ hirder ul listenn."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "Krouiñ ul listenn gant an elfenn %1 arreet div wech"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Krouiñ ul listenn a c'hoarvez eus an dalvoudenn roet arreet an niver a wech meneget"; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "evel"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "ensoc'hañ evel"; -Blockly.Msg.LISTS_SET_INDEX_SET = "termenañ"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Ensoc'hañ a ra an elfenn e deroù ul listenn."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Ensoc'hañ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Ensoc'hañ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Ouzhpennañ a ra an elfenn e fin al listenn."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Ensoc'hañ a ra an elfenn dre zegouezh en ul listenn."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Termenañ a ra an elfenn gentañ en ul listenn."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Termenañ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn diwezhañ."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Termenañ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn ziwezhañ."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Termenañ a ra an elfenn diwezhañ en ul listenn."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Termenañ a ra un elfenn dre zegouezh en ul listenn."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Krouiñ ul listenn diwar an destenn"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "Krouiñ un destenn diwar al listenn"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Bodañ ul listennad testennoù en ul listenn hepken, o tispartiañ anezho gant un dispartier."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Troc'hañ un destenn en ul listennad testennoù, o troc'hañ e pep dispartier."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "gant an dispartier"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "gaou"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Distreiñ pe gwir pe faos"; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "gwir"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Distreiñ gwir m'eo par an daou voned."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Distreiñ gwir m'eo brasoc'h ar moned kentañ eget an eil."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Distreiñ gwir m'eo brasoc'h ar moned kentañ eget an eil pe par dezhañ."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Distreiñ gwir m'eo bihanoc'h ar moned kentañ eget an eil."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Distreiñ gwir m'eo bihanoc'h ar moned kentañ eget an eil pe m'eo par dezhañ."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Distreiñ gwir ma n'eo ket par an daou voned."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "nann %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Distreiñ gwir m'eo faos ar moned. Distreiñ faos m'eo gwir ar moned."; -Blockly.Msg.LOGIC_NULL = "Null"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Distreiñ null."; -Blockly.Msg.LOGIC_OPERATION_AND = "ha(g)"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "pe"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Distreiñ gwir m'eo gwir an da daou voned."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Distreiñ gwir m'eo gwir unan eus an daou voned da nebeutañ."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "amprouad"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "m'eo gaou"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "m'eo gwir"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Gwiriañ an amplegad e 'prouad'. M'eo gwir an amplegad, distreiñ an dalvoudenn 'm'eo gwir'; anez distreiñ ar moned 'm'eo faos'."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://br.wikipedia.org/wiki/Aritmetik"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Distreiñ sammad daou niver."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Distreiñ rannad daou niver."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Distreiñ diforc'h daou niver"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Distreiñ liesad daou niver."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Distreiñ an niver kentañ lakaet dindan gallouter an eil niver."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "kemmañ %1 gant %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Ouzhpennañ un niver d'an argemm '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Distreiñ unan eus digemmennoù red : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (anvevenn)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "destrizhañ %1 etre %2 ha %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Destrizhañ un niver da vezañ etre ar bevennoù spisaet (enlakaet)"; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "a zo rannadus dre"; -Blockly.Msg.MATH_IS_EVEN = "zo par"; -Blockly.Msg.MATH_IS_NEGATIVE = "a zo negativel"; -Blockly.Msg.MATH_IS_ODD = "zo ampar"; -Blockly.Msg.MATH_IS_POSITIVE = "a zo pozitivel"; -Blockly.Msg.MATH_IS_PRIME = "zo kentañ"; -Blockly.Msg.MATH_IS_TOOLTIP = "Gwiriañ m'eo par, anpar, kentañ, muiel, leiel un niverenn pe ma c'haller rannañ anezhi dre un niver roet zo. Distreiñ gwir pe faos."; -Blockly.Msg.MATH_IS_WHOLE = "zo anterin"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "rest eus %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Distreiñ dilerc'h rannadur an div niver"; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://br.wikipedia.org/wiki/Niver"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un niver."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "Keitat al listenn"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "Uc'hegenn al listenn"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "Kreizad al listenn"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "Izegenn al listenn"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modoù stankañ el listenn"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "Elfennn eus al listenn tennet d'ar sord"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "forc'had standart eus al listenn"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "Sammad al listenn"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Distreiñ keitad (niveroniel) an talvoudennoù niverel el listenn."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Distreiñ an niver brasañ el listenn."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Distreiñ an niver kreiz el listenn"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Distreiñ an niver bihanañ el listenn"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Distreiñ ul listennad elfennoù stankoc'h el listenn."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Distreiñ un elfenn zargouezhek el listenn"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Distreiñ forc'had standart al listenn."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Distreiñ sammad an holl niveroù zo el listenn."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "Rann dargouezhek"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Distreiñ ur rann dargouezhek etre 0.0 (enkaelat) hag 1.0 (ezkaelat)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "anterin dargouezhek etre %1 ha %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Distreiñ un anterin dargouezhek etre an div vevenn spisaet, endalc'het."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "Rontaat"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "Rontaat dindan"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "Rontaat a-us"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Rontaat un niver dindan pe a-us"; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://br.wikipedia.org/wiki/Square_root"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "dizave"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "gwrizienn garrez"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Distreiñ talvoud dizave un niver."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Distreiñ galloudad un niver."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Distreiñ logaritm naturel un niver"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Distreiñ logaritm diazez 10 un niver"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Distreiñ enebad un niver"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Distreiñ 10 da c'halloudad un niver."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Distreiñ gwrizienn garrez un niver"; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://br.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Distreiñ ark kosinuz un niver"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Distreiñ ark sinuz un niver"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Distreiñ ark tangent un niver"; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Distreiñ kosinuz ur c'horn (ket e radianoù)"; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Distreiñ sinuz ur c'horn (ket e radianoù)"; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Distreiñ tangent ur c'horn (ket e radianoù)."; -Blockly.Msg.ME = "Me"; -Blockly.Msg.NEW_VARIABLE = "Argemmenn nevez..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Anv an argemmenn nevez :"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "aotren an disklêriadurioù"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "gant :"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Seveniñ an arc'hwel '%1' termenet gant an implijer."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Seveniñ an arc'hwel '%1' termenet gant an implijer hag implijout e zisoc'h."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "gant :"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Krouiñ '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "ober un dra bennak"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "da"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Krouiñ un arc'hwel hep mont er-maez."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "distreiñ"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Kouiñ un arc'hwel gant ur mont er-maez"; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Diwallit : an arc'hwel-mañ en deus arventennoù eiladet."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Dreislinennañ termenadur an arc'hwel"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Ma'z eo gwir un dalvoudenn, distreiñ un eil talvoudenn neuze."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Diwallit : Gallout a rafe ar bloc'h bezañ implijet e termenadur un arc'hwel hepken."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Anv ar moned"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Ouzhpennañ ur moned d'an arc'hwel."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Monedoù"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Ouzhpennañ, lemel, pe adkempenn monedoù an arc'hwel-mañ."; -Blockly.Msg.REMOVE_COMMENT = "Lemel an evezhiadenn kuit"; -Blockly.Msg.RENAME_VARIABLE = "Adenvel an argemmenn..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Adenvel an holl argemmennoù '%1' e :"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "ouzhpennañ an destenn"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "da"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Ouzhpennañ testenn d'an argemmenn'%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "e lizherennoù bihan"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "Gant Ur Bennlizherenn E Deroù Pep Ger"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "e PENNLIZHERENNOÙ"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Distreiñ un eilenn eus an eilenn en un direnneg all"; -Blockly.Msg.TEXT_CHARAT_FIRST = "tapout al lizherenn gentañ"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "Kaout al lizherenn # adalek an dibenn."; -Blockly.Msg.TEXT_CHARAT_FROM_START = "Kaout al lizherenn #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "en destenn"; -Blockly.Msg.TEXT_CHARAT_LAST = "tapout al lizherenn ziwezhañ"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "Kaout ul lizherenn dre zegouezh"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Distreiñ al lizherenn d'al lec'h spisaet."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Ouzhpennañ un elfenn d'an destenn."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "stagañ"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Ouzhpennañ, lemel pe adurzhiañ ar rannoù evit kefluniañ ar bloc'h testenn-mañ."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "Betek al lizherenn # adalek an dibenn."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "betek al lizherenn #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "d'al lizherenn diwezhañ"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "en destenn"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "Kaout an ischadenn adalek al lizherenn gentañ"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "Kaout an ischadenn adalek al lizherenn # betek an dibenn"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "Kaout an ischadenn adalek al lizherenn #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Distreiñ un tamm spisaet eus an destenn."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "en destenn"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "kavout reveziadenn gentañ an destenn"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "kavout reveziadenn diwezhañ an destenn"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus ar chadenn gentañ en eil chadenn. Distreiñ 0 ma n'eo ket kavet ar chadenn."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 zo goullo"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Adkas gwir m'eo goullo an destenn roet."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "krouiñ un destenn gant"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Krouit un tamm testenn en ur gevelstrollañ un niver bennak a elfennoù"; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "hirder %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Distreiñ an niver a lizherennoù(en ur gontañ an esaouennoù e-barzh) en destenn roet."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "moullañ %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Moullañ an destenn, an niverenn pe un dalvoudenn spisaet all"; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Goulenn un niver gant an implijer."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Goulenn un destenn gant an implijer."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "pedadenn evit un niver gant ur c'hemennad"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "pedadenn evit un destenn gant ur c'hemennad"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Ul lizherenn, ur ger pe ul linennad testenn."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "Lemel an esaouennoù en daou du"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "Lemel an esaouennoù eus an tu kleiz"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "Lemel an esaouennoù eus an tu dehou"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Distreiñ un eilenn eus an destenn gant an esaouennoù lamet eus un tu pe eus an daou du"; -Blockly.Msg.TODAY = "Hiziv"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "elfenn"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Krouiñ 'termenañ %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Distreiñ talvoud an argemm-mañ."; -Blockly.Msg.VARIABLES_SET = "termenañ %1 da %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Krouiñ 'kaout %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Termenañ a ra argemm-mañ evit ma vo par da dalvoudenn ar moned."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ca.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/ca.js deleted file mode 100644 index 7701eef..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ca.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.ca'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Afegeix un comentari"; -Blockly.Msg.AUTH = "Si us plau, autoritzeu que aquesta aplicació pugui desar la vostra feina i que la pugueu compartir."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Canvia valor:"; -Blockly.Msg.CHAT = "Xateja amb el teu col·laborador escrivint en aquest quadre!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Contraure blocs"; -Blockly.Msg.COLLAPSE_BLOCK = "Contraure bloc"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "color 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "color 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "proporció"; -Blockly.Msg.COLOUR_BLEND_TITLE = "barreja"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Barreja dos colors amb una proporció donada (0,0 - 1,0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ca.wikipedia.org/wiki/Color"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Escolliu un color de la paleta."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "color aleatori"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Escolliu un color a l'atzar."; -Blockly.Msg.COLOUR_RGB_BLUE = "blau"; -Blockly.Msg.COLOUR_RGB_GREEN = "verd"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "vermell"; -Blockly.Msg.COLOUR_RGB_TITLE = "color amb"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Crear un color amb les quantitats especificades de vermell, verd i blau. Tots els valors han de ser entre 0 i 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "sortir del bucle"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continuar amb la següent iteració del bucle"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Sortir del bucle interior."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Ometre la resta d'aquest bucle, i continuar amb la següent iteració."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Advertència: Aquest bloc només es pot utilitzar dins d'un bucle."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "per a cada element %1 en la llista %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Per a cada element en la llista, desar l'element dins la variable '%1', i llavors executar unes sentències."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "comptar amb %1 des de %2 fins a %3 en increments de %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Fer que la variable \"%1\" prengui els valors des del nombre inicial fins al nombre final, incrementant a cada pas l'interval indicat, i executar els blocs especificats."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Afegeix una condició al bloc 'si'."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Afegeix una condició final, que recull qualsevol altra possibilitat, al bloc 'si'."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Afegeix, esborra o reordena seccions per reconfigurar aquest bloc 'si'."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "si no"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "si no, si"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "si"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Si un valor és cert, llavors executar unes sentències."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Si un valor és cert, llavors executar el primer bloc de sentències. En cas contrari, executar el segon bloc de sentències."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Si el primer valor és cert, llavors executar el primer bloc de sentències. En cas contrari, si el segon valor és cert, executar el segon bloc de sentències."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Si el primer valor és cert, llavors executar el primer bloc de sentències. En cas contrari, si el segon valor és cert, executar el segon bloc de sentències. Si cap dels valors és cert, executar l'últim bloc de sentències."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://ca.wikipedia.org/wiki/Bucle_For"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "fer"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "repetir %1 vegades"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Executar unes sentències diverses vegades."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repetir fins que"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repetir mentre"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Mentre un valor sigui fals, llavors executar unes sentències."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Mentre un valor sigui cert, llavors executar unes sentències."; -Blockly.Msg.DELETE_BLOCK = "Esborra bloc"; -Blockly.Msg.DELETE_X_BLOCKS = "Esborra %1 blocs"; -Blockly.Msg.DISABLE_BLOCK = "Desactiva bloc"; -Blockly.Msg.DUPLICATE_BLOCK = "Duplica"; -Blockly.Msg.ENABLE_BLOCK = "Activa bloc"; -Blockly.Msg.EXPAND_ALL = "Expandir blocs"; -Blockly.Msg.EXPAND_BLOCK = "Expandir bloc"; -Blockly.Msg.EXTERNAL_INPUTS = "Entrades externes"; -Blockly.Msg.HELP = "Ajuda"; -Blockly.Msg.INLINE_INPUTS = "Entrades en línia"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "crear llista buida"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Retorna una llista, de longitud 0, que no conté cap dada."; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "llista"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Afegeix, esborra o reordena seccions per reconfigurar aquest bloc de llista."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "crear llista amb"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Afegeix un element a la llista."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Crea una llista amb qualsevol nombre d'elements."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "primer"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "núm.# des del final"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "recupera"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "recupera i esborra"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "últim"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "a l'atzar"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "esborra"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Retorna el primer element d'una llista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Retorna l'element de la posició especificada a la llista. #1 és l'últim element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Retorna l'element de la posició especificada a la llista. #1 és el primer element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Retorna l'últim element d'una llista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Retorna un element a l'atzar d'una llista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Esborra i retorna el primer element d'una llista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Esborra i retorna l'element de la posició especificada de la llista. #1 és l'últim element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Esborra i retorna l'element de la posició especificada de la llista. #1 és el primer element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Esborra i retorna l'últim element d'una llista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Esborra i retorna un element a l'atzar d'una llista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Esborra el primer element d'una llista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Esborra l'element de la posició especificada de la llista. #1 és l'últim element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Esborra l'element de la posició especificada de la llista. #1 és el primer element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Esborra l'últim element d'una llista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Esborra un element a l'atzar d'una llista."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "fins # des del final"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "fins #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "fins l'últim"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "recupera sub-llista des del principi"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "recupera sub-llista des de # des del final"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "recupera sub-llista des de #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crea una còpia de la part especificada d'una llista."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "buscar primera aparició d'un element"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "buscar última aparició d'un element"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna l'índex de la primera/última aparició d'un element a la llista. Retorna 0 si no s'hi troba el text."; -Blockly.Msg.LISTS_INLIST = "en la llista"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 és buida"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Retorna cert si la llista és buida."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "longitud de %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Retorna la longitud d'una llista."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "crea llista amb element %1 repetit %2 vegades"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Crea una llista formada pel valor donat, repetit tantes vegades com s'indiqui."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "com"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "insereix a"; -Blockly.Msg.LISTS_SET_INDEX_SET = "modifica"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Insereix l'element al principi d'una llista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Insereix l'element a la posició especificada d'una llista. #1 és l'últim element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Insereix l'element a la posició especificada d'una llista. #1 és el primer element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Afegeix l'element al final d'una llista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Insereix l'element en una posició a l'atzar d'una llista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Modifica el primer element d'una llista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Modifica l'element de la posició especificada d'una llista. #1 és l'últim element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Modifica l'element de la posició especificada d'una llista. #1 és el primer element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Modifica l'últim element d'una llista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Modifica un element a l'atzar d'una llista."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "fals"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Retorna o bé cert o bé fals."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "cert"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://ca.wikipedia.org/wiki/Inequaci%C3%B3"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Retorna cert si totes dues entrades són iguals."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Retorna cert si la primera entrada és més gran que la segona entrada."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Retorna cert si la primera entrada és més gran o igual a la segona entrada."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Retorna cert si la primera entrada és més petita que la segona entrada."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Retorna cert si la primera entra és més petita o igual a la segona entrada."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Retorna cert si totes dues entrades són diferents."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "no %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Retorna cert si l'entrada és falsa. Retorna fals si l'entrada és certa."; -Blockly.Msg.LOGIC_NULL = "nul"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Retorna nul."; -Blockly.Msg.LOGIC_OPERATION_AND = "i"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "o"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Retorna cer si totes dues entrades són certes."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Retorna cert si almenys una de les entrades és certa."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "condició"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "si és fals"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "si és cert"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Comprova la condició de 'condició'. Si la condició és certa, retorna el valor 'si és cert'; en cas contrari, retorna el valor 'si és fals'."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ca.wikipedia.org/wiki/Aritm%C3%A8tica"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Retorna la suma dels dos nombres."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Retorna el quocient dels dos nombres."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Retorna la diferència entre els dos nombres."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Retorna el producte del dos nombres."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Retorna el primer nombre elevat a la potència indicada pel segon nombre."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://ca.wikipedia.org/wiki/Suma"; -Blockly.Msg.MATH_CHANGE_TITLE = "canvia %1 per %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Afegeix un nombre a la variable '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://ca.wikipedia.org/wiki/Constant_matem%C3%A0tica"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Retorna una de les constants més habituals: π (3,141…), e (2,718…), φ (1,618…), sqrt(2) (1,414…), sqrt(½) (0,707…), o ∞ (infinit)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "limitar %1 entre %2 i %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Limita un nombre per tal que estigui entre els límits especificats (inclosos)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "és divisible per"; -Blockly.Msg.MATH_IS_EVEN = "és parell"; -Blockly.Msg.MATH_IS_NEGATIVE = "és negatiu"; -Blockly.Msg.MATH_IS_ODD = "és senar"; -Blockly.Msg.MATH_IS_POSITIVE = "és positiu"; -Blockly.Msg.MATH_IS_PRIME = "és primer"; -Blockly.Msg.MATH_IS_TOOLTIP = "Comprova si un nombre és parell, senar, enter, positium negatiu, o si és divisible per un cert nombre. Retorna cert o fals."; -Blockly.Msg.MATH_IS_WHOLE = "és enter"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://ca.wikipedia.org/wiki/Residu_%28aritm%C3%A8tica%29"; -Blockly.Msg.MATH_MODULO_TITLE = "residu de %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Retorna el residu de dividir els dos nombres."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://ca.wikipedia.org/wiki/Nombre"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un nombre."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "mitjana de llista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "màxim de llista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana de llista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "mínim de llista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "moda de llista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "element aleatori de llista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "desviació estàndard de llista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "suma de llista"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Retorna la mitjana (mitjana aritmètica) dels valors numèrics de la llista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Retorna el nombre més gran de la llista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Retorna la mediana de la llista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Retorna el nombre més petit de la llista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Retorna una llista dels elements que apareixen més vegades a la llista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Retorna un element aleatori de la lllista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Retorna la desviació estàndard de la llista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Retorna la suma de tots els nombres de la llista."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://ca.wikipedia.org/wiki/Generaci%C3%B3_de_nombres_aleatoris"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "fracció aleatòria"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Retorna una fracció aleatòria entre 0,0 (inclòs) i 1,0 (exclòs)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://ca.wikipedia.org/wiki/Generaci%C3%B3_de_nombres_aleatoris"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "nombre aleatori entre %1 i %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Retorna un nombre aleatori entre els dos límits especificats, inclosos."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://ca.wikipedia.org/wiki/Arrodoniment"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arrodonir"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arrodonir cap avall"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arrodonir cap amunt"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Arrodonir un nombre cap amunt o cap avall."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://ca.wikipedia.org/wiki/Arrel_quadrada"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolut"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "arrel quadrada"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Retorna el valor absolut d'un nombre."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Retorna ''e'' elevat a la potència del nombre indicat."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Retorna el logaritme natural d'un nombre."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Retorna el logaritme en base 10 d'un nombre."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Retorna l'oposat d'un nombre."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Retorna 10 elevat a la potència del nombre indicat."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Retorna l'arrel quadrada d'un nombre."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://ca.wikipedia.org/wiki/Funci%C3%B3_trigonom%C3%A8trica"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Retorna l'arccosinus d'un nombre."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Retorna l'arcsinus d'un nombre."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Retorna l'arctangent d'un nombre."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Retorna el cosinus d'un grau (no radiant)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Retorna el sinus d'un grau (no radiant)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Retorna la tangent d'un grau (no radiant)."; -Blockly.Msg.ME = "Jo"; -Blockly.Msg.NEW_VARIABLE = "Nova variable..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nou nom de variable:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "permetre declaracions"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "amb:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://ca.wikipedia.org/wiki/Procediment_%28Programació%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Executa la funció definida per usuari '%1'."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://ca.wikipedia.org/wiki/Procediment_%28Programació%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Executa la funció definida per l'usuari '%1' i utilitza la seva sortida."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "amb:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Crear '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "fes alguna cosa"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "a"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crea una funció sense sortida."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "retorna"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crea una funció amb una sortida."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Advertència: Aquesta funció té paràmetres duplicats."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Iluminar la definició de la funció"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Si el valor és cert, llavors retorna un segon valor."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Advertència: Aquest bloc només es pot utilitzar dins de la definició d'una funció."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nom d'entrada:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Afegir una entrada per la funció."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entrades"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Afegir, eliminar o canviar l'ordre de les entrades per aquesta funció."; -Blockly.Msg.REMOVE_COMMENT = "Elimina el comentari"; -Blockly.Msg.RENAME_VARIABLE = "Reanomena variable..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Reanomena totes les variables '%1' a:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "afegir text"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "a"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Afegir un text a la variable '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "a minúscules"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "a Text De Títol"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "a MAJÚSCULES"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Retorna una còpia del text amb diferents majúscules/minúscules."; -Blockly.Msg.TEXT_CHARAT_FIRST = "recupera la primera lletra"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "recupera la lletra núm.# des del final"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "recupera la lletra núm.#"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "en el text"; -Blockly.Msg.TEXT_CHARAT_LAST = "recupera l'última lletra"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "recupera una lletra a l'atzar"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Recupera la lletra de la posició especificada."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Afegeix un element al text."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "unir"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Afegeix, esborrar o reordenar seccions per reconfigurar aquest bloc de text."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "fins a la lletra núm.# des del final"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "fins a la lletra núm.#"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "fins a l'última lletra"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "en el text"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "recupera subcadena des de la primera lletra"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "recupera subcadena des de la lletra núm.# des del final"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "recupera subcadena des de la lletra núm.#"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Recupera una part especificada del text."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "en el text"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "trobar la primera aparició del text"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "trobar l'última aparició del text"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna l'índex de la primera/última aparició del primer text dins el segon. Retorna 0 si no es troba el text."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 està buit"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Retorna cert si el text proporcionat està buit."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "crear text amb"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Crea un tros de text per unió de qualsevol nombre d'elements."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "llargària de %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Retorna el nombre de lletres (espais inclosos) en el text proporcionat."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "imprimir %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Imprimir el text, el nombre o altre valor especificat."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Demana que l'usuari introdueixi un nombre."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Demana que l'usuari introdueixi un text."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "demanar un nombre amb el missatge"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "demanar text amb el missatge"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://ca.wikipedia.org/wiki/Cadena_%28inform%C3%A0tica%29"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Una lletra, paraula o línia de text."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "retalla espais de tots dos extrems de"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "retalla espais de l'esquerra de"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "retalla espais de la dreta de"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Retorna una còpia del text on s'han esborrat els espais d'un o dels dos extrems."; -Blockly.Msg.TODAY = "Today"; // untranslated -Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crea 'modifica %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Retorna el valor d'aquesta variable."; -Blockly.Msg.VARIABLES_SET = "modifica %1 a %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Crear 'recupera %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Modifica aquesta variable al valor introduït."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/cs.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/cs.js deleted file mode 100644 index e27e380..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/cs.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.cs'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Přidat komentář"; -Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated -Blockly.Msg.CHANGE_VALUE_TITLE = "Změna hodnoty:"; -Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!"; // untranslated -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Skrýt bloky"; -Blockly.Msg.COLLAPSE_BLOCK = "Skrýt blok"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "barva 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "barva 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "poměr"; -Blockly.Msg.COLOUR_BLEND_TITLE = "smíchat"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Smíchá dvě barvy v daném poměru (0.0–1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://cs.wikipedia.org/wiki/Barva"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Vyberte barvu z palety."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "náhodná barva"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Zvolte barvu náhodně."; -Blockly.Msg.COLOUR_RGB_BLUE = "modrá"; -Blockly.Msg.COLOUR_RGB_GREEN = "zelená"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "červená"; -Blockly.Msg.COLOUR_RGB_TITLE = "barva s"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Vytvoř barvu se zadaným množstvím červené, zelené a modré. Všechny hodnoty musí být mezi 0 a 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "vymanit se ze smyčky"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "pokračuj dalším opakováním smyčky"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Přeruš vnitřní smyčku."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Přeskoč zbytek této smyčky a pokračuj dalším opakováním."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Upozornění: Tento blok může být použit pouze uvnitř smyčky."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "pro každou položku %1 v seznamu %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Pro každou položku v seznamu nastavte do proměnné '%1' danou položku a proveďte nějaké operace."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "počítat s %1 od %2 do %3 po %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Nechá proměnnou \"%1\" nabývat hodnot od počátečního do koncového čísla po daném přírůstku a provádí s ní příslušné bloky."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Přidat podmínku do \"pokud\" bloku."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Přidej konečnou podmínku zahrnující ostatní případy do bloku pokud."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Přidej, odstraň či uspořádej sekce k přenastavení tohoto bloku pokud."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "jinak"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "nebo pokud"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "pokud"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Je-li hodnota pravda, proveď určité příkazy."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Je-li hodnota pravda, proveď první blok příkazů. V opačném případě proveď druhý blok příkazů."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Je-li první hodnota pravdivá, proveď první blok příkazů. V opačném případě, je-li pravdivá druhá hodnota, proveď druhý blok příkazů."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Je-li první hodnota pravda, proveď první blok příkazů. Je-li druhá hodnota pravda, proveď druhý blok příkazů. Pokud žádná hodnota není pravda, proveď poslední blok příkazů."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://cs.wikipedia.org/wiki/Cyklus_for"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "udělej"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "opakovat %1 krát"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Proveď určité příkazy několikrát."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "opakovat dokud"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "opakovat když"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Dokud je hodnota nepravdivá, prováděj určité příkazy."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Dokud je hodnota pravdivá, prováděj určité příkazy."; -Blockly.Msg.DELETE_BLOCK = "Odstranit blok"; -Blockly.Msg.DELETE_X_BLOCKS = "Odstranit %1 bloky"; -Blockly.Msg.DISABLE_BLOCK = "Zakázat blok"; -Blockly.Msg.DUPLICATE_BLOCK = "zdvojit"; -Blockly.Msg.ENABLE_BLOCK = "Povolit blok"; -Blockly.Msg.EXPAND_ALL = "Rozbalit bloky"; -Blockly.Msg.EXPAND_BLOCK = "Rozbalení bloku"; -Blockly.Msg.EXTERNAL_INPUTS = "vnější vstupy"; -Blockly.Msg.HELP = "Nápověda"; -Blockly.Msg.INLINE_INPUTS = "Vložené vstupy"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "vytvořit prázdný seznam"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Vrátí seznam nulové délky, který neobsahuje žádné datové záznamy"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "seznam"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Přidat, odebrat nebo změnit pořadí oddílů tohoto seznamu bloku."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "vytvořit seznam s"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Přidat položku do seznamu."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Vytvoř seznam s libovolným počtem položek."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "první"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# od konce"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "získat"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "získat a odstranit"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "poslední"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "náhodné"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "odstranit"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Vrátí první položku v seznamu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Vrátí položku z určené pozice v seznamu. #1 je poslední položka."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Vrátí položku z určené pozice v seznamu. #1 je první položka."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Vrátí poslední položku v seznamu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Vrátí náhodnou položku ze seznamu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Odstraní a vrátí první položku v seznamu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Odstraní a vrátí položku z určené pozice v seznamu. #1 je poslední položka."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Odstraní a vrátí položku z určené pozice v seznamu. #1 je první položka."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Odstraní a vrátí poslední položku v seznamu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Odstraní a vrátí náhodnou položku v seznamu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Odstraní první položku v seznamu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Odstraní položku na konkrétním místu v seznamu. #1 je poslední položka."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Odebere položku na konkrétním místě v seznamu. #1 je první položka."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Odstraní poslední položku v seznamu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Odstraní náhodou položku v seznamu."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "do # od konce"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "do #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "jako poslední"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "získat podseznam od první položky"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "získat podseznam od # od konce"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "získat podseznam od #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Vytvoří kopii určené části seznamu."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "najít první výskyt položky"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "najít poslední výskyt položky"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated -Blockly.Msg.LISTS_INLIST = "v seznamu"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 je prázdné"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Vrátí hodnotu pravda, pokud je seznam prázdný."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "délka %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Vrací počet položek v seznamu."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "vytvoř seznam s položkou %1 opakovanou %1 krát"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Vytváří seznam obsahující danou hodnotu n-krát."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "jako"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "vložit na"; -Blockly.Msg.LISTS_SET_INDEX_SET = "nastavit"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Vložit položku na začátek seznamu."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Vloží položku na určenou pozici v seznamu. #1 je poslední položka."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Vloží položku na určenou pozici v seznamu. #1 je první položka."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Připojí položku na konec seznamu."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Připojí položku náhodně do seznamu."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Nastaví první položku v seznamu."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Nastaví položku na konkrétní místo v seznamu. #1 je poslední položka."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Nastaví položku na konkrétní místo v seznamu. #1 je první položka."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Nastaví poslední položku v seznamu."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Nastaví náhodnou položku v seznamu."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "nepravda"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Vrací pravda nebo nepravda."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "pravda"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://cs.wikipedia.org/wiki/Nerovnost_(matematika)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Vrátí hodnotu pravda, pokud se oba vstupy rovnají jeden druhému."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Navrátí hodnotu pravda, pokud první vstup je větší než druhý vstup."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Navrátí hodnotu pravda, pokud je první vstup větší a nebo rovný druhému vstupu."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Navrátí hodnotu pravda, pokud je první vstup menší než druhý vstup."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Navrátí hodnotu pravda, pokud je první vstup menší a nebo rovný druhému vstupu."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Vrátí hodnotu pravda, pokud se oba vstupy nerovnají sobě navzájem."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "není %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Navrátí hodnotu pravda, pokud je vstup nepravda. Navrátí hodnotu nepravda, pokud je vstup pravda."; -Blockly.Msg.LOGIC_NULL = "nula"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Vrátí nulovou hodnotu"; -Blockly.Msg.LOGIC_OPERATION_AND = "a"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "nebo"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Vrátí hodnotu pravda, pokud oba dva vstupy jsou pravdivé."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Vrátí hodnotu pravda, pokud alespoň jeden ze vstupů má hodnotu pravda."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "je-li nepravda"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "je-li to pravda"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Zkontroluje podmínku v \"testu\". Když je podmínka pravda, vrátí hodnotu \"pokud pravda\"; v opačném případě vrátí hodnotu \"pokud nepravda\"."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://cs.wikipedia.org/wiki/Aritmetika"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Vrátí součet dvou čísel."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Vrátí podíl dvou čísel."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Vrátí rozdíl dvou čísel."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Vrátí součin dvou čísel."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Vrátí první číslo umocněné na druhé číslo."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://pt.wikipedia.org/wiki/Adi%C3%A7%C3%A3o"; -Blockly.Msg.MATH_CHANGE_TITLE = "změnit %1 od %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Přičti číslo k proměnné '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Vraťte jednu z následujících konstant: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "omez %1 na rozmezí od %2 do %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Omezí číslo tak, aby bylo ve stanovených mezích (včetně)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "je dělitelné"; -Blockly.Msg.MATH_IS_EVEN = "je sudé"; -Blockly.Msg.MATH_IS_NEGATIVE = "je záporné"; -Blockly.Msg.MATH_IS_ODD = "je liché"; -Blockly.Msg.MATH_IS_POSITIVE = "je kladné"; -Blockly.Msg.MATH_IS_PRIME = "je prvočíslo"; -Blockly.Msg.MATH_IS_TOOLTIP = "Kontrola, zda je číslo sudé, liché, prvočíslo, celé, kladné, záporné nebo zda je dělitelné daným číslem. Vrací pravdu nebo nepravdu."; -Blockly.Msg.MATH_IS_WHOLE = "je celé"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://cs.wikipedia.org/wiki/Modul%C3%A1rn%C3%AD_aritmetika"; -Blockly.Msg.MATH_MODULO_TITLE = "zbytek po dělení %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Vrátí zbytek po dělení dvou čísel."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://cs.wikipedia.org/wiki/Číslo"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Číslo."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "průměr v seznamu"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "největší v seznamu"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "medián v seznamu"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "nejmenší v seznamu"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modes of list"; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "náhodná položka seznamu"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "směrodatná odchylka ze seznamu"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "suma seznamu"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Vrátí průměr (aritmetický průměr) číselných hodnot v seznamu."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Vrátí největší číslo v seznamu."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Vrátí medián seznamu."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Vrátí nejmenší číslo v seznamu."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Vrátí seznam nejčastějších položek seznamu."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Vrátí náhodnou položku ze seznamu."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Vrátí směrodatnou odchylku seznamu."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Vrátí součet všech čísel v seznamu."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://cs.wikipedia.org/wiki/Gener%C3%A1tor_n%C3%A1hodn%C3%BDch_%C4%8D%C3%ADsel"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "náhodné číslo mezi 0 (včetně) do 1"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Vrátí náhodné číslo mezi 0,0 (včetně) až 1,0"; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://cs.wikipedia.org/wiki/Gener%C3%A1tor_n%C3%A1hodn%C3%BDch_%C4%8D%C3%ADsel"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "náhodné celé číslo od %1 do %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Vrací náhodné celé číslo mezi dvěma určenými mezemi, včetně mezních hodnot."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://cs.wikipedia.org/wiki/Zaokrouhlení"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "zaokrouhlit"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "zaokrouhlit dolu"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "zaokrouhlit nahoru"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Zaokrouhlit číslo nahoru nebo dolů."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://cs.wikipedia.org/wiki/Druhá_odmocnina"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolutní"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "druhá odmocnina"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Vrátí absolutní hodnotu čísla."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Vrátí mocninu čísla e."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Vrátí přirozený logaritmus čísla."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Vrátí desítkový logaritmus čísla."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Vrátí zápornou hodnotu čísla."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Vrátí mocninu čísla 10."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Vrátí druhou odmocninu čísla."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "acos"; -Blockly.Msg.MATH_TRIG_ASIN = "arcsin"; -Blockly.Msg.MATH_TRIG_ATAN = "arctan"; -Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://cs.wikipedia.org/wiki/Goniometrická_funkce"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; -Blockly.Msg.MATH_TRIG_TAN = "tan"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Vrátí arckosinus čísla."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Vrátí arcsinus čísla."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Vrátí arctangens čísla."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Vrátí kosinus úhlu ve stupních."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Vrátí sinus úhlu ve stupních."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Vrátí tangens úhlu ve stupních."; -Blockly.Msg.ME = "Me"; // untranslated -Blockly.Msg.NEW_VARIABLE = "Nová proměnná..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nový název proměnné:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "s:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://cs.wikipedia.org/wiki/Funkce_(programov%C3%A1n%C3%AD)"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Spustí uživatelem definovanou funkci '%1'."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://cs.wikipedia.org/wiki/Funkce_(programov%C3%A1n%C3%AD)"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Spustí uživatelem definovanou funkci '%1' a použije její výstup."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "s:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Vytvořit '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "proveď něco"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "k provedení"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Vytvořit funkci bez výstupu."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "navrátit"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Vytvořit funkci s výstupem."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Upozornění: Tato funkce má duplicitní parametry."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Zvýraznit definici funkce"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Je-li hodnota pravda, pak vrátí druhou hodnotu."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Varování: Tento blok může být použit pouze uvnitř definici funkce."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "vstupní jméno:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "vstupy"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated -Blockly.Msg.REMOVE_COMMENT = "Odstranit komentář"; -Blockly.Msg.RENAME_VARIABLE = "Přejmenovat proměnné..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Přejmenujte všechny proměnné '%1':"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "přidat text"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "do"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Přidá určitý text k proměnné '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "na malá písmena"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "na Počáteční Velká Písmena"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "na VELKÁ PÍSMENA"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Vrátí kopii textu s jinou velikostí písmen."; -Blockly.Msg.TEXT_CHARAT_FIRST = "získat první písmeno"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "získat # písmeno od konce"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "získat písmeno #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "v textu"; -Blockly.Msg.TEXT_CHARAT_LAST = "získat poslední písmeno"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "získat náhodné písmeno"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Získat písmeno na konkrétní pozici."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Přidat položku do textu."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "spojit"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Přidat, odebrat nebo změnit pořadí oddílů tohoto textového bloku."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "do # písmene od konce"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "do písmene #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "do posledního písmene"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "v textu"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "získat podřetězec od prvního písmene"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "získat podřetězec od písmene # od konce"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "získat podřetězec od písmene #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Získat zadanou část textu."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "v textu"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "najít první výskyt textu"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "najít poslední výskyt textu"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Vrátí index prvního/posledního výskytu prvního textu v druhém textu. Pokud text není nalezen, vrátí hodnotu 0."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 je prázdný"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Vrátí pravda pokud je zadaný text prázdný."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "vytvořit text s"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Vytvoří kousek textu spojením libovolného počtu položek."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "délka %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Vrátí počet písmen (včetně mezer) v zadaném textu."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "tisk %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Tisk zadaného textu, čísla nebo jiné hodnoty."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Výzva pro uživatele k zadání čísla."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Výzva pro uživatele k zadání nějakého textu."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "výzva k zadání čísla se zprávou"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "výzva k zadání textu se zprávou"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://cs.wikipedia.org/wiki/Textov%C3%BD_%C5%99et%C4%9Bzec"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Písmeno, slovo nebo řádek textu."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "odstranit mezery z obou stran"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "odstranit mezery z levé strany"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "odstranit mezery z pravé strany"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Vrátí kopii textu s odstraněnými mezerami z jednoho nebo obou konců."; -Blockly.Msg.TODAY = "Today"; // untranslated -Blockly.Msg.VARIABLES_DEFAULT_NAME = "položka"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Vytvořit \"nastavit %1\""; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Vrátí hodnotu této proměnné."; -Blockly.Msg.VARIABLES_SET = "nastavit %1 na %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Vytvořit \"získat %1\""; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Nastaví tuto proměnnou, aby se rovnala vstupu."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/da.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/da.js deleted file mode 100644 index 2cc0284..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/da.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.da'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Tilføj kommentar"; -Blockly.Msg.AUTH = "Tillad venligst at denne app muliggør at du kan gemme dit arbejde og at du kan dele det."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Skift værdi:"; -Blockly.Msg.CHAT = "Chat med din samarbejdspartner ved at skrive i denne boks!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Fold blokkene sammen"; -Blockly.Msg.COLLAPSE_BLOCK = "Fold blokken sammen"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "farve 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "farve 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "i forholdet"; -Blockly.Msg.COLOUR_BLEND_TITLE = "bland"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blander to farver sammen i et bestemt forhold (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://da.wikipedia.org/wiki/Farve"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Vælg en farve fra paletten."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "tilfældig farve"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Vælg en tilfældig farve."; -Blockly.Msg.COLOUR_RGB_BLUE = "blå"; -Blockly.Msg.COLOUR_RGB_GREEN = "grøn"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "rød"; -Blockly.Msg.COLOUR_RGB_TITLE = "farve med"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Lav en farve med den angivne mængde af rød, grøn og blå. Alle værdier skal være mellem 0 og 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "bryd ud af løkken"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "fortsæt med den næste gentagelse i løkken"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Bryd ud af den omgivende løkke."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Spring resten af denne løkke over, og fortsæt med den næste gentagelse."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Advarsel: Denne blok kan kun bruges i en løkke."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "for hvert element %1 i listen %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For hvert element i en liste, sæt variablen '%1' til elementet, og udfør derefter nogle kommandoer."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "tæl med %1 fra %2 til %3 med %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Få variablen \"%1\" til at have værdierne fra startværdien til slutværdien, mens der tælles med det angivne interval, og udfør de angivne blokke."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Tilføj en betingelse til denne \"hvis\" blok."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Tilføj en sidste fang-alt betingelse, til denne \"hvis\" blok."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Tilføj, fjern eller byt om på rækkefølgen af delene for at konfigurere denne \"hvis\" blok."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "ellers"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "ellers hvis"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "hvis"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Hvis en værdi er sand, så udfør nogle kommandoer."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Hvis en værdi er sand, så udfør den første blok af kommandoer. Ellers udfør den anden blok af kommandoer."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Hvis den første værdi er sand, så udfør den første blok af kommandoer. Ellers, hvis den anden værdi er sand, så udfør den anden blok af kommandoer."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Hvis den første værdi er sand, så udfør den første blok af kommandoer. Ellers, hvis den anden værdi er sand, så udfør den anden blok af kommandoer. Hvis ingen af værdierne er sande, så udfør den sidste blok af kommandoer."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://da.wikipedia.org/wiki/For-l%C3%B8kke"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "udfør"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "gentag %1 gange"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Udfør nogle kommandoer flere gange."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "gentag indtil"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "gentag sålænge"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Udfør nogle kommandoer, sålænge en værdi er falsk."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Udfør nogle kommandoer, sålænge en værdi er sand."; -Blockly.Msg.DELETE_BLOCK = "Slet blok"; -Blockly.Msg.DELETE_X_BLOCKS = "Slet %1 blokke"; -Blockly.Msg.DISABLE_BLOCK = "Deaktivér blok"; -Blockly.Msg.DUPLICATE_BLOCK = "Duplikér"; -Blockly.Msg.ENABLE_BLOCK = "Aktivér blok"; -Blockly.Msg.EXPAND_ALL = "Fold blokkene ud"; -Blockly.Msg.EXPAND_BLOCK = "Fold blokken ud"; -Blockly.Msg.EXTERNAL_INPUTS = "Udvendige inputs"; -Blockly.Msg.HELP = "Hjælp"; -Blockly.Msg.INLINE_INPUTS = "Indlejrede inputs"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "opret en tom liste"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returnerer en liste af længde 0, som ikke indeholder nogen data"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "liste"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Tilføj, fjern eller byt om på rækkefølgen af delene for at konfigurere denne blok."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "opret liste med"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Føj et element til listen."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Opret en liste med et vilkårligt antal elementer."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "første"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# fra slutningen"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "hent"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "hent og fjern"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "sidste"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "tilfældig"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "fjern"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returnerer det første element i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returnerer elementet på den angivne position på en liste. #1 er det sidste element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returnerer elementet på den angivne position på en liste. #1 er det første element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returnerer den sidste element i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returnerer et tilfældigt element i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Fjerner og returnerer det første element i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Fjerner og returnerer elementet på den angivne position på en liste. #1 er det sidste element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Fjerner og returnerer elementet på den angivne position på en liste. #1 er det første element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Fjerner og returnerer det sidste element i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Fjerner og returnerer et tilfældigt element i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Fjerner det første element i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Fjerner elementet på den angivne position på en liste. #1 er det sidste element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Fjerner elementet på den angivne position på en liste. #1 er det første element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Fjerner sidste element i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Fjerner et tilfældigt element i en liste."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "til # fra slutningen"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "til #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "til sidste"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "hent underliste fra første"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "hent underliste fra # fra slutningen"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "hent underliste fra #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Opretter en kopi af den angivne del af en liste."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "find første forekomst af elementet"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "find sidste forekomst af elementet"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returnerer indeks for første/sidste forekomst af elementet i listen. Returnerer 0, hvis teksten ikke er fundet."; -Blockly.Msg.LISTS_INLIST = "i listen"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 er tom"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returnerer sand, hvis listen er tom."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "længden af %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returnerer længden af en liste."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "opret liste med elementet %1 gentaget %2 gange"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Opretter en liste bestående af den givne værdi gentaget et bestemt antal gange."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "som"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "indsæt ved"; -Blockly.Msg.LISTS_SET_INDEX_SET = "sæt"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Indsætter elementet i starten af en liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Indsætter elementet på den angivne position i en liste. #1 er det sidste element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Indsætter elementet på den angivne position i en liste. #1 er det første element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Føj elementet til slutningen af en liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Indsætter elementet tilfældigt i en liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sætter det første element i en liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sætter elementet på den angivne position i en liste. #1 er det sidste element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sætter elementet på den angivne position i en liste. #1 er det første element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sætter det sidste element i en liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sætter et tilfældigt element i en liste."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "lav tekst til liste"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "lav liste til tekst"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Saml en liste af tekster til én tekst, der er adskilt af et skilletegn."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Bryd tekst op i en liste af tekster med brud ved hvert skilletegn."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "med skilletegn"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falsk"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returnerer enten sand eller falsk."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "sand"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://da.wikipedia.org/wiki/Ulighed_(matematik)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Returnere sand, hvis begge inputs er lig med hinanden."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Returnere sand, hvis det første input er større end det andet input."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Returnere sand, hvis det første input er større end eller lig med det andet input."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Returnere sand, hvis det første input er mindre end det andet input."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Returnere sand, hvis det første input er mindre end eller lig med det andet input."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Returnere sand, hvis begge inputs ikke er lig med hinanden."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "ikke %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returnerer sand, hvis input er falsk. Returnerer falsk, hvis input er sandt."; -Blockly.Msg.LOGIC_NULL = "null"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returnerer null."; -Blockly.Msg.LOGIC_OPERATION_AND = "og"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "eller"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Returnere sand, hvis begge inputs er sande."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Returnere sand, hvis mindst et af inputtene er sande."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "hvis falsk"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "hvis sand"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Kontrollér betingelsen i 'test'. Hvis betingelsen er sand, returnér \"hvis sand\" værdien; ellers returnér \"hvis falsk\" værdien."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://da.wikipedia.org/wiki/Aritmetik"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Returnere summen af de to tal."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Returnere kvotienten af de to tal."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Returnere forskellen mellem de to tal."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Returnere produktet af de to tal."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Returnere det første tal opløftet til potensen af det andet tal."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "skift %1 med %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Læg et tal til variablen '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://da.wikipedia.org/wiki/Matematisk_konstant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Returnere en af de ofte brugte konstanter: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(2) (1.414…), sqrt(½) (0.707…) eller ∞ (uendeligt)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "begræns %1 til mellem %2 og %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Begræns et tal til at være mellem de angivne grænser (inklusiv)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = ":"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "er deleligt med"; -Blockly.Msg.MATH_IS_EVEN = "er lige"; -Blockly.Msg.MATH_IS_NEGATIVE = "er negativt"; -Blockly.Msg.MATH_IS_ODD = "er ulige"; -Blockly.Msg.MATH_IS_POSITIVE = "er positivt"; -Blockly.Msg.MATH_IS_PRIME = "er et primtal"; -Blockly.Msg.MATH_IS_TOOLTIP = "Kontrollere, om et tal er lige, ulige, primtal, helt, positivt, negativt, eller om det er deleligt med bestemt tal. Returnere sandt eller falskt."; -Blockly.Msg.MATH_IS_WHOLE = "er helt"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://da.wikipedia.org/wiki/Modulo"; -Blockly.Msg.MATH_MODULO_TITLE = "resten af %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Returner resten fra at dividere de to tal."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://da.wikipedia.org/wiki/Tal"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Et tal."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "gennemsnit af listen"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "største tal i listen"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "listens median"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "mindste tal i listen"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "listens typetal"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "tilfældigt element fra listen"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standardafvigelsen for listen"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "summen af listen"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Returner gennemsnittet (middelværdien) af de numeriske værdier i listen."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Returner det største tal i listen."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Returner listens median."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Returner det mindste tal i listen."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Returner en liste over de mest almindelige elementer på listen."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Returner et tilfældigt element fra listen."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Returner standardafvigelsen for listen."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Returner summen af alle tal i listen."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://da.wikipedia.org/wiki/Tilfældighedsgenerator"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "tilfældigt decimaltal (mellem 0 og 1)"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Returner et tilfældigt decimaltal mellem 0,0 (inklusiv) og 1,0 (eksklusiv)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://da.wikipedia.org/wiki/Tilfældighedsgenerator"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "tilfældigt heltal mellem %1 og %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Returner et tilfældigt heltal mellem de to angivne grænser (inklusiv)."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://da.wikipedia.org/wiki/Afrunding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "afrund"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "rund ned"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "rund op"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Runde et tal op eller ned."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://da.wikipedia.org/wiki/Kvadratrod"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolut"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "kvadratrod"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Returnere den absolutte værdi af et tal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Returnere e til potensen af et tal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Returnere den naturlige logaritme af et tal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Returnere 10-talslogaritmen af et tal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Returnere negationen af et tal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Returnere 10 til potensen af et tal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Returnere kvadratroden af et tal."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://da.wikipedia.org/wiki/Trigonometrisk_funktion"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Returnere arcus cosinus af et tal."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Returnere arcus sinus af et tal."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Returnere arcus tangens af et tal."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Returnere cosinus af en vinkel (i grader)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Returnere sinus af en vinkel (i grader)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Returnere tangens af en vinkel (i grader)."; -Blockly.Msg.ME = "Mig"; -Blockly.Msg.NEW_VARIABLE = "Ny variabel..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Navn til den nye variabel:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "tillad erklæringer"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "med:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://da.wikipedia.org/wiki/Funktion_%28programmering%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Kør den brugerdefinerede funktion '%1'."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://da.wikipedia.org/wiki/Funktion_%28programmering%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Kør den brugerdefinerede funktion '%1' og brug dens returværdi."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "med:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Opret '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "gøre noget"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "for at"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Opretter en funktion der ikke har nogen returværdi."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "returnér"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Opretter en funktion der har en returværdi."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Advarsel: Denne funktion har dublerede parametre."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Markér funktionsdefinitionen"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Hvis en værdi er sand, så returnér en anden værdi."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Advarsel: Denne blok kan kun anvendes inden for en funktionsdefinition."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "parameternavn:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Tilføj en parameter til funktionen."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "parametre"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Tilføje, fjerne eller ændre rækkefølgen af parametre til denne funktion."; -Blockly.Msg.REMOVE_COMMENT = "Fjern kommentar"; -Blockly.Msg.RENAME_VARIABLE = "Omdøb variabel..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Omdøb alle '%1' variabler til:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "tilføj tekst"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "til"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Tilføj noget tekst til variablen '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "til små bogstaver"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "til Stort Begyndelsesbogstav"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "til STORE BOGSTAVER"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Returner en kopi af teksten hvor bogstaverne enten er udelukkende store eller små, eller hvor første bogstav i hvert ord er stort."; -Blockly.Msg.TEXT_CHARAT_FIRST = "hent første bogstav"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "hent bogstav # fra slutningen"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "hent bogstav #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "i teksten"; -Blockly.Msg.TEXT_CHARAT_LAST = "hent sidste bogstav"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "hent tilfældigt bogstav"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returnerer bogstavet på den angivne placering."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Føj et element til teksten."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "sammenføj"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Tilføj, fjern eller byt om på rækkefølgen af delene for at konfigurere denne tekstblok."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "til bogstav # fra slutningen"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "til bogstav #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "til sidste bogstav"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "i teksten"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "hent delstreng fra første bogstav"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "hent delstreng fra bogstav # fra slutningen"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "hent delstreng fra bogstav #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returnerer den angivne del af teksten."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "i teksten"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find første forekomst af teksten"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find sidste forekomst af teksten"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returnerer indeks for første/sidste forekomst af første tekst i den anden tekst. Returnerer 0, hvis teksten ikke kan findes."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 er tom"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returnerer sand, hvis den angivne tekst er tom."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "lav en tekst med"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Lav et stykke tekst ved at sætte et antal elementer sammen."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "længden af %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returnerer antallet af bogstaver (herunder mellemrum) i den angivne tekst."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "skriv %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Skriv den angivne tekst, tal eller anden værdi."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Spørg brugeren efter et tal"; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Spørg brugeren efter en tekst"; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "spørg efter et tal med meddelelsen"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "spørg efter tekst med meddelelsen"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://da.wikipedia.org/wiki/Tekststreng"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "En bogstav, et ord eller en linje med tekst."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "fjern mellemrum fra begge sider af"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "fjern mellemrum fra venstre side af"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "fjern mellemrum fra højre side af"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Returner en kopi af teksten med mellemrum fjernet fra den ene eller begge sider."; -Blockly.Msg.TODAY = "I dag"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Opret 'sæt %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returnerer værdien af denne variabel."; -Blockly.Msg.VARIABLES_SET = "sæt %1 til %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Opret 'hent %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sætter denne variabel til at være lig med input."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/de.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/de.js deleted file mode 100644 index 6a65248..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/de.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.de'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Kommentar hinzufügen"; -Blockly.Msg.AUTH = "Bitte autorisiere diese App zum Aktivieren der Speicherung deiner Arbeit und zum Teilen."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Wert ändern:"; -Blockly.Msg.CHAT = "Chatte mit unserem Mitarbeiter durch Eingeben von Text in diesen Kasten!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Alle Blöcke zusammenfalten"; -Blockly.Msg.COLLAPSE_BLOCK = "Block zusammenfalten"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "Farbe 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "mit Farbe 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "im Verhältnis"; -Blockly.Msg.COLOUR_BLEND_TITLE = "mische"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Vermische 2 Farben mit konfigurierbaren Farbverhältnis (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://de.wikipedia.org/wiki/Farbe"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Wähle eine Farbe aus der Palette."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "zufällige Farbe"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Wähle eine Farbe nach dem Zufallsprinzip."; -Blockly.Msg.COLOUR_RGB_BLUE = "blau"; -Blockly.Msg.COLOUR_RGB_GREEN = "grün"; -Blockly.Msg.COLOUR_RGB_HELPURL = "https://de.wikipedia.org/wiki/RGB-Farbraum"; -Blockly.Msg.COLOUR_RGB_RED = "rot"; -Blockly.Msg.COLOUR_RGB_TITLE = "Farbe mit"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Kreiere eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 100 liegen."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://de.wikipedia.org/wiki/Kontrollstruktur"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "Die Schleife abbrechen"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "mit der nächsten Iteration der Schleife fortfahren"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Die umgebende Schleife beenden."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Diese Anweisung abbrechen und mit der nächsten Schleifendurchlauf fortfahren."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warnung: Dieser Block sollte nur in einer Schleife verwendet werden."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://de.wikipedia.org/wiki/For-Schleife"; -Blockly.Msg.CONTROLS_FOREACH_TITLE = "Für Wert %1 aus der Liste %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Führe eine Anweisung für jeden Wert in der Liste aus und setzte dabei die Variable \"%1\" auf den aktuellen Listenwert."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://de.wikipedia.org/wiki/For-Schleif"; -Blockly.Msg.CONTROLS_FOR_TITLE = "Zähle %1 von %2 bis %3 mit %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Zähle die Variable \"%1\" von einem Startwert bis zu einem Zielwert und führe für jeden Wert eine Anweisung aus."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Eine weitere Bedingung hinzufügen."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Eine sonst-Bedingung hinzufügen, führt eine Anweisung aus falls keine Bedingung zutrifft."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Hinzufügen, entfernen oder sortieren von Sektionen"; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "sonst"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "sonst wenn"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "wenn"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Wenn eine Bedingung wahr (true) ist, dann führe eine Anweisung aus."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Wenn eine Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Ansonsten führe die zweite Anweisung aus."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus. Falls keine der beiden Bedingungen wahr (true) ist, dann führe die dritte Anweisung aus."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://de.wikipedia.org/wiki/For-Schleife"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "mache"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "wiederhole %1 mal"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Eine Anweisung mehrfach ausführen."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://de.wikipedia.org/wiki/Schleife_%28Programmierung%29"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "Wiederhole bis"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "Wiederhole solange"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Führe die Anweisung solange aus wie die Bedingung falsch (false) ist."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Führe die Anweisung solange aus wie die Bedingung wahr (true) ist."; -Blockly.Msg.DELETE_BLOCK = "Block löschen"; -Blockly.Msg.DELETE_X_BLOCKS = "Block %1 löschen"; -Blockly.Msg.DISABLE_BLOCK = "Block deaktivieren"; -Blockly.Msg.DUPLICATE_BLOCK = "Kopieren"; -Blockly.Msg.ENABLE_BLOCK = "Block aktivieren"; -Blockly.Msg.EXPAND_ALL = "Alle Blöcke entfalten"; -Blockly.Msg.EXPAND_BLOCK = "Block entfalten"; -Blockly.Msg.EXTERNAL_INPUTS = "externe Eingänge"; -Blockly.Msg.HELP = "Hilfe"; -Blockly.Msg.INLINE_INPUTS = "interne Eingänge"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "Erzeuge eine leere Liste"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Erzeugt eine leere Liste ohne Inhalt."; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "Liste"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Hinzufügen, entfernen und sortieren von Elementen."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "Erzeuge Liste mit"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Ein Element zur Liste hinzufügen."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Erzeugt eine List mit konfigurierten Elementen."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "erstes"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "#tes von hinten"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#tes"; -Blockly.Msg.LISTS_GET_INDEX_GET = "nimm"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "nimm und entferne"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "letztes"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "zufälliges"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "entferne"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Extrahiere das erste Element aus der Liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Extrahiere das #1te Element aus Ende der Liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Extrahiere das #1te Element aus der Liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Extrahiere das letzte Element aus der Liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Extrahiere ein zufälliges Element aus der Liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Extrahiere und entfernt das erste Element aus der Liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Extrahiere und entfernt das #1te Element aus Ende der Liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Extrahiere und entfernt das #1te Element aus der Liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Extrahiere und entfernt das letzte Element aus der Liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Extrahiere und entfernt ein zufälliges Element aus der Liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Entfernt das erste Element von der Liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Entfernt das #1te Element von Ende der Liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Entfernt das #1te Element von der Liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Entfernt das letzte Element von der Liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Entfernt ein zufälliges Element von der Liste."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "bis zu # von hinten"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "bis zu #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "bis zum Ende"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "erhalte Unterliste vom Anfang"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "erhalte Unterliste von # von hinten"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "erhalte Unterliste von #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Erstellt eine Kopie mit dem angegebenen Abschnitt der Liste."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "suche erstes Auftreten von"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; -Blockly.Msg.LISTS_INDEX_OF_LAST = "suche letztes Auftreten von"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Sucht die Position (index) eines Elementes in der Liste. Gibt 0 zurück wenn nichts gefunden wurde."; -Blockly.Msg.LISTS_INLIST = "von der Liste"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ist leer?"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Ist wahr (true), wenn die Liste leer ist."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "Länge von %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Die Anzahl von Elementen in der Liste."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; -Blockly.Msg.LISTS_REPEAT_TITLE = "Erzeuge Liste mit Element %1 wiederhole es %2 mal"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Erzeugt eine Liste mit einer variablen Anzahl von Elementen"; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "ein"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "füge"; -Blockly.Msg.LISTS_SET_INDEX_SET = "setze"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Fügt das Element an den Anfang der Liste an."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Fügt das Element an der angegebenen Position in der Liste ein. #1 ist das letzte Element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Fügt das Element an der angegebenen Position in der Liste ein. #1 ist die erste Element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Fügt das Element ans Ende der Liste an."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Fügt das Element zufällig in die Liste ein."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Setzt das erste Element in der Liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Setzt das Element an der angegebenen Position in der Liste. #1 ist das letzte Element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Setzte das Element an der angegebenen Position in der Liste. #1 ist das erste Element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Setzt das letzte Element in der Liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setzt ein zufälliges Element in der Liste."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Liste aus Text erstellen"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "Text aus Liste erstellen"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Liste mit Texten in einen Text vereinen, getrennt durch ein Trennzeichen."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Text in eine Liste mit Texten aufteilen, unterbrochen bei jedem Trennzeichen."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "mit Trennzeichen"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falsch"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Ist entweder wahr (true) oder falsch (false)"; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "wahr"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Ist wahr (true) wenn beide Werte gleich sind."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Ist wahr (true) wenn der erste Wert größer als der zweite Wert ist."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Ist wahr (true) wenn der erste Wert größer als oder gleich groß wie zweite Wert ist."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Ist wahr (true) wenn der erste Wert kleiner als der zweite Wert ist."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Ist wahr (true) wenn der erste Wert kleiner als oder gleich groß wie zweite Wert ist."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Ist wahr (true) wenn beide Werte unterschiedlich sind."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "nicht %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Ist wahr (true) wenn der Eingabewert falsch (false) ist. Ist falsch (false) wenn der Eingabewert wahr (true) ist."; -Blockly.Msg.LOGIC_NULL = "null"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://de.wikipedia.org/wiki/Nullwert"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Ist NULL."; -Blockly.Msg.LOGIC_OPERATION_AND = "und"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "oder"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Ist wahr (true) wenn beide Werte wahr (true) sind."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Ist wahr (true) wenn einer der beiden Werte wahr (true) ist."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "teste"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://de.wikipedia.org/wiki/%3F:#Auswahloperator"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "wenn falsch"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "wenn wahr"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Überprüft eine Bedingung \"teste\". Wenn die Bedingung wahr ist wird der \"wenn wahr\" Wert zurückgegeben, andernfalls der \"wenn falsch\" Wert"; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://de.wikipedia.org/wiki/Grundrechenart"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Ist die Summe zweier Werte."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Ist der Quotient zweier Werte."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Ist die Differenz zweier Werte."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Ist das Produkt zweier Werte."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Ist der erste Wert potenziert mit dem zweiten Wert."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://de.wikipedia.org/wiki/Inkrement_und_Dekrement"; -Blockly.Msg.MATH_CHANGE_TITLE = "erhöhe %1 um %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Addiert einen Wert zur Variable \"%1\" hinzu."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://de.wikipedia.org/wiki/Mathematische_Konstante"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Mathematische Konstanten wie: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) oder ∞ (unendlich)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "begrenze %1 von %2 bis %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Begrenzt den Wertebereich auf den \"von\"-Wert bis einschließlich zum \"bis\"-Wert. (inklusiv)"; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "ist teilbar durch"; -Blockly.Msg.MATH_IS_EVEN = "ist gerade"; -Blockly.Msg.MATH_IS_NEGATIVE = "ist negativ"; -Blockly.Msg.MATH_IS_ODD = "ist ungerade"; -Blockly.Msg.MATH_IS_POSITIVE = "ist positiv"; -Blockly.Msg.MATH_IS_PRIME = "ist eine Primzahl"; -Blockly.Msg.MATH_IS_TOOLTIP = "Überprüft ob eine Zahl gerade, ungerade, eine Primzahl, ganzzahlig, positiv, negativ oder durch eine zweite Zahl teilbar ist. Gibt wahr (true) oder falsch (false) zurück."; -Blockly.Msg.MATH_IS_WHOLE = "ist eine ganze Zahl"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://de.wikipedia.org/wiki/Modulo"; -Blockly.Msg.MATH_MODULO_TITLE = "Rest von %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Der Rest nach einer Division."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://de.wikipedia.org/wiki/Zahl"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Eine Zahl."; -Blockly.Msg.MATH_ONLIST_HELPURL = "http://www.sysplus.ch/einstieg.php?links=menu&seite=4125&grad=Crash&prog=Excel"; -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "Mittelwert einer Liste"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "Maximalwert einer Liste"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "Median einer Liste"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "Minimalwert einer Liste"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "Modulo / Restwert einer Liste"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "Zufallswert einer Liste"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "Standardabweichung einer Liste"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "Summe einer Liste"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Ist der Durchschnittswert aller Werte in einer Liste."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Ist der größte Wert in einer Liste."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Ist der Median aller Werte in einer Liste."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Ist der kleinste Wert in einer Liste."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Findet den am häufigsten vorkommenden Wert in einer Liste. Falls kein Wert öfter vorkommt als alle anderen, wird die originale Liste zurückgeben"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Gebe einen zufälligen Wert aus der Liste zurück."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Ist die standardisierte Standardabweichung aller Werte in der Liste"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Ist die Summe aller Werte in einer Liste."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://de.wikipedia.org/wiki/Zufallszahlen"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "Zufallszahl (0.0 -1.0)"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Erzeuge eine Zufallszahl zwischen 0.0 (inklusiv) und 1.0 (exklusiv)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://de.wikipedia.org/wiki/Zufallszahlen"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "ganzzahliger Zufallswert zwischen %1 bis %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Erzeuge einen ganzzahligen Zufallswert zwischen zwei Werten (inklusiv)."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://de.wikipedia.org/wiki/Runden"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "runden"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "abrunden"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "aufrunden"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Eine Zahl auf- oder abrunden."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://de.wikipedia.org/wiki/Quadratwurzel"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "Absolutwert"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "Quadratwurzel"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Ist der Absolutwert eines Wertes."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Ist Wert der Exponentialfunktion eines Wertes."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Ist der natürliche Logarithmus eines Wertes."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Ist der dekadische Logarithmus eines Wertes."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Negiert einen Wert."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Rechnet 10 hoch Eingabewert."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Ist die Quadratwurzel eines Wertes."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://de.wikipedia.org/wiki/Trigonometrie"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Ist der Arkuskosinus des Eingabewertes."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Ist der Arkussinus des Eingabewertes."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Ist der Arkustangens des Eingabewertes."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Ist der Kosinus des Winkels."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Ist der Sinus des Winkels."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Ist der Tangens des Winkels."; -Blockly.Msg.ME = "Ich"; -Blockly.Msg.NEW_VARIABLE = "Neue Variable..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Name der neuen Variable:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "Aussagen erlauben"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "mit:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Rufe einen Funktionsblock ohne Rückgabewert auf."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Rufe einen Funktionsblock mit Rückgabewert auf."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "mit:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Erzeuge \"Aufruf %1\""; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "Funktionsblock"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "zu"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Ein Funktionsblock ohne Rückgabewert."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "gebe zurück"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Ein Funktionsblock mit Rückgabewert."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warnung: dieser Funktionsblock hat zwei gleich benannte Parameter."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Markiere Funktionsblock"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Wenn der erste Wert wahr (true) ist, Gebe den zweiten Wert zurück."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warnung: Dieser Block darf nur innerhalb eines Funktionsblock genutzt werden."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Variable:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Eine Eingabe zur Funktion hinzufügen."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Parameter"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Die Eingaben zu dieser Funktion hinzufügen, entfernen oder neu anordnen."; -Blockly.Msg.REMOVE_COMMENT = "Kommentar entfernen"; -Blockly.Msg.RENAME_VARIABLE = "Variable umbenennen..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Alle \"%1\" Variablen umbenennen in:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "Text anhängen"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "An"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Text an die Variable \"%1\" anhängen."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "umwandeln in kleinbuchstaben"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "umwandeln in Substantive"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "umwandeln in GROSSBUCHSTABEN"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Wandelt Schreibweise von Texten um, in Großbuchstaben, Kleinbuchstaben oder den ersten Buchstaben jedes Wortes groß und die anderen klein."; -Blockly.Msg.TEXT_CHARAT_FIRST = "Nehme ersten Buchstaben"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "Nehme #ten Buchstaben von hinten"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "Nehme #ten Buchstaben"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "vom Text"; -Blockly.Msg.TEXT_CHARAT_LAST = "Nehme letzten Buchstaben"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "Nehme zufälligen Buchstaben"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Extrahiere einen Buchstaben von einer spezifizierten Position."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Ein Element zum Text hinzufügen."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "verbinden"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Hinzufügen, entfernen und sortieren von Elementen."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "bis zum #ten Buchstaben von hinten"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "bis zum #ten Buchstaben"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "bis zum letzten Buchstaben"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in Text"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "vom ersten Buchstaben"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "vom #ten Buchstaben von hinten"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "vom #ten Buchstaben"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Gibt die angegebenen Textabschnitt zurück."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "im Text"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "Suche erstes Auftreten des Begriffs"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "Suche letztes Auftreten des Begriffs"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs oder 0 zurück."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ist leer?"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Ist wahr (true), wenn der Text keine Zeichen enthält ist."; -Blockly.Msg.TEXT_JOIN_HELPURL = ""; -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "Erstelle Text aus"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Erstellt einen Text durch das Verbinden von mehreren Textelementen."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "Länge %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Die Anzahl von Zeichen in einem Text. (inkl. Leerzeichen)"; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "Ausgabe %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Gib den Inhalt einer Variable aus."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Fragt den Benutzer nach einer Zahl."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Fragt den Benutzer nach einem Text."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Fragt nach Zahl mit Hinweis"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Fragt nach Text mit Hinweis"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://de.wikipedia.org/wiki/Zeichenkette"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Ein Buchstabe, Text oder Satz."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "entferne Leerzeichen vom Anfang und vom Ende (links und rechts)"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "entferne Leerzeichen vom Anfang (links)"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "entferne Leerzeichen vom Ende (rechts)"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Entfernt Leerzeichen vom Anfang und / oder Ende eines Textes."; -Blockly.Msg.TODAY = "Heute"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "Element"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Erzeuge \"Schreibe %1\""; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29"; -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Gibt den Wert der Variable zurück."; -Blockly.Msg.VARIABLES_SET = "Schreibe %1 %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Erzeuge \"Lese %1\""; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29"; -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Setzt den Wert einer Variable."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/el.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/el.js deleted file mode 100644 index 532e5ed..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/el.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.el'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Πρόσθεσε Σχόλιο"; -Blockly.Msg.AUTH = "Παρακαλώ κάνε έγκριση της εφαρμογής για να επιτρέπεται η αποθήκευση και κοινοποίηση της εργασίας σου."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Άλλαξε την τιμή:"; -Blockly.Msg.CHAT = "Μπορείς να μιλήσεις με τον συνεργάτη σου πληκτρολογώντας σ'αυτό το πλαίσιο!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Σύμπτυξτε Όλα Τα Μπλοκ"; -Blockly.Msg.COLLAPSE_BLOCK = "Σύμπτυξε Το Μπλοκ"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "χρώμα 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "χρώμα 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "αναλογία"; -Blockly.Msg.COLOUR_BLEND_TITLE = "μείγμα"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Συνδυάζει δύο χρώματα μαζί με μια δεδομένη αναλογία (0.0 - 1,0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://el.wikipedia.org/wiki/%CE%A7%CF%81%CF%8E%CE%BC%CE%B1"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Επιτρέπει επιλογή χρώματος από την παλέτα."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "τυχαίο χρώμα"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Επιλέγει χρώμα τυχαία."; -Blockly.Msg.COLOUR_RGB_BLUE = "μπλε"; -Blockly.Msg.COLOUR_RGB_GREEN = "πράσινο"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "κόκκινο"; -Blockly.Msg.COLOUR_RGB_TITLE = "χρώμα με"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Δημιουργεί χρώμα με το συγκεκριμένο ποσό του κόκκινου, πράσινου και μπλε που ορίζεις. Όλες οι τιμές πρέπει να είναι μεταξύ 0 και 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "φεύγει από το μπλοκ επαναλήψεως"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "συνέχισε με την επόμενη επανάληψη του μπλοκ επαναλήψεως"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Ξεφεύγει (βγαίνει έξω) από την επανάληψη."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Παραλείπει το υπόλοιπο τμήμα αυτού του μπλοκ επαναλήψεως, και συνεχίζει με την επόμενη επανάληψη."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Προειδοποίηση: Αυτό το μπλοκ μπορεί να χρησιμοποιηθεί μόνο μέσα σε μια επανάληψη."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "για κάθε στοιχείο %1 στη λίστα %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Για κάθε στοιχείο σε μια λίστα, ορίζει τη μεταβλητή «%1» στο στοιχείο και, στη συνέχεια, εκτελεί κάποιες εντολές."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "Blockly"; -Blockly.Msg.CONTROLS_FOR_TITLE = "μέτρησε με %1 από το %2 έως το %3 ανά %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Η μεταβλητή «%1» παίρνει τιμές ξεκινώντας από τον αριθμό έναρξης μέχρι τον αριθμό τέλους αυξάνοντας κάθε φορά με το καθορισμένο βήμα και εκτελώντας το καθορισμένο μπλοκ."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Πρόσθετει μια κατάσταση/συνθήκη στο μπλοκ «εάν»."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Προσθέτει μια τελική κατάσταση/συνθήκη, που πιάνει όλες τις άλλες περιπτώσεις, στο μπλοκ «εάν»."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Προσθέτει, αφαιρεί ή αναδιατάσσει τα τμήματα για να αναδιαμορφώσει αυτό το μπλοκ «εάν»."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "αλλιώς"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "εναλλακτικά εάν"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "εάν"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Αν μια τιμή είναι αληθής, τότε εκτελεί κάποιες εντολές."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Αν μια τιμή είναι αληθής, τότε εκτελεί το πρώτο τμήμα εντολών. Διαφορετικά, εκτελεί το δεύτερο τμήμα εντολών."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Αν η πρώτη τιμή είναι αληθής, τότε εκτελεί το πρώτο τμήμα εντολών. Διαφορετικά, αν η δεύτερη τιμή είναι αληθής, εκτελεί το δεύτερο μπλοκ εντολών."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Αν η πρώτη τιμή είναι αληθής, τότε εκτελεί το πρώτο τμήμα εντολών. Διαφορετικά, αν η δεύτερη τιμή είναι αληθής, εκτελεί το δεύτερο τμήμα εντολών. Αν καμία από τις τιμές δεν είναι αληθής, εκτελεί το τελευταίο τμήμα εντολών."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "κάνε"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "επανάλαβε %1 φορές"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Εκτελεί κάποιες εντολές αρκετές φορές."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "επανάλαβε μέχρι"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "επανάλαβε ενώ"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Ενόσω μια τιμή είναι ψευδής, τότε εκτελεί κάποιες εντολές."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Ενόσω μια τιμή είναι αληθής, τότε εκτελεί κάποιες εντολές."; -Blockly.Msg.DELETE_BLOCK = "Διέγραψε Το Μπλοκ"; -Blockly.Msg.DELETE_X_BLOCKS = "Διέγραψε %1 Μπλοκ"; -Blockly.Msg.DISABLE_BLOCK = "Απενεργοποίησε Το Μπλοκ"; -Blockly.Msg.DUPLICATE_BLOCK = "Αντίγραφο"; -Blockly.Msg.ENABLE_BLOCK = "Ενεργοποίησε Το Μπλοκ"; -Blockly.Msg.EXPAND_ALL = "Επέκτεινε Όλα Τα Μπλοκ"; -Blockly.Msg.EXPAND_BLOCK = "Επέκτεινε Το Μπλοκ"; -Blockly.Msg.EXTERNAL_INPUTS = "Εξωτερικές Είσοδοι"; -Blockly.Msg.HELP = "Βοήθεια"; -Blockly.Msg.INLINE_INPUTS = "Εσωτερικές Είσοδοι"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "δημιούργησε κενή λίστα"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Επιστρέφει μια λίστα, με μήκος 0, η οποία δεν περιέχει εγγραφές δεδομένων"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "λίστα"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Προσθέτει, αφαιρεί ή αναδιατάσσει τα τμήματα για να αναδιαμορφώσει αυτό το μπλοκ λίστας."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "δημιούργησε λίστα με"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Προσθέτει αντικείμενο στη λίστα."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Δημιουργεί λίστα με οποιονδήποτε αριθμό αντικειμένων."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "πρώτο"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# από το τέλος"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "πάρε"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "πάρε και αφαίρεσε"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "τελευταίο"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "τυχαίο"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "αφαίρεσε"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Επιστρέφει το πρώτο στοιχείο σε μια λίστα."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το τελευταίο στοιχείο."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Επιστρέφει το τελευταίο στοιχείο σε μια λίστα."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Επιστρέφει ένα τυχαίο στοιχείο σε μια λίστα."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Καταργεί και επιστρέφει το πρώτο στοιχείο σε μια λίστα."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Καταργεί και επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το τελευταίο στοιχείο."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Καταργεί και επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Καταργεί και επιστρέφει το τελευταίο στοιχείο σε μια λίστα."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Καταργεί και επιστρέφει ένα τυχαίο στοιχείο σε μια λίστα."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Καταργεί το πρώτο στοιχείο σε μια λίστα."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Καταργεί το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το τελευταίο στοιχείο."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Καταργεί το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Καταργεί το τελευταίο στοιχείο σε μια λίστα."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Καταργεί ένα τυχαίο στοιχείο σε μια λίστα."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "έως # από το τέλος"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "έως #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "έως το τελευταίο"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "Blockly"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "πάρε υπολίστα από την αρχή"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "πάρε υπολίστα από # από το τέλος"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "πάρε υπολίστα από #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Δημιουργεί ένα αντίγραφο του καθορισμένου τμήματος μιας λίστας."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "βρες την πρώτη εμφάνιση του στοιχείου"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "Blockly"; -Blockly.Msg.LISTS_INDEX_OF_LAST = "βρες την τελευταία εμφάνιση του στοιχείου"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του στοιχείου στη λίστα. Επιστρέφει τιμή 0, αν το κείμενο δεν βρεθεί."; -Blockly.Msg.LISTS_INLIST = "στη λίστα"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "το %1 είναι κενό"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Επιστρέφει αληθής αν η λίστα είναι κενή."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "Blockly"; -Blockly.Msg.LISTS_LENGTH_TITLE = "το μήκος του %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Επιστρέφει το μήκος μιας λίστας."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "Blockly"; -Blockly.Msg.LISTS_REPEAT_TITLE = "δημιούργησε λίστα με το στοιχείο %1 να επαναλαμβάνεται %2 φορές"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Δημιουργεί μια λίστα που αποτελείται από την δεδομένη τιμή που επαναλαμβάνεται για συγκεκριμένο αριθμό επαναλήψεων."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "σε"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "είσαγε στο"; -Blockly.Msg.LISTS_SET_INDEX_SET = "όρισε"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Εισάγει το στοιχείο στην αρχή μιας λίστας."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Εισάγει το στοιχείο σε συγκεκριμένη θέση σε μια λίστα. Το #1 είναι το τελευταίο στοιχείο."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Εισάγει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Αναθέτει το στοιχείο στο τέλος μιας λίστας."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Εισάγει το στοιχείο τυχαία σε μια λίστα."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Ορίζει το πρώτο στοιχείο σε μια λίστα."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Ορίζει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το τελευταίο στοιχείο."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Ορίζει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Ορίζει το τελευταίο στοιχείο σε μια λίστα."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Ορίζει ένα τυχαίο στοιχείο σε μια λίστα."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "κάνετε λίστα από το κείμενο"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "κάνετε κείμενο από τη λίστα"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Ενώστε μια λίστα κειμένων σε ένα κείμενο, που χωρίζονται από ένα διαχωριστικό."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Διαίρεση του κειμένου σε μια λίστα κειμένων, με σπάσιμο σε κάθε διαχωριστικό."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "με διαχωριστικό"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "ψευδής"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Επιστρέφει είτε αληθής είτε ψευδής."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "αληθής"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Επιστρέφει αληθής αν και οι δύο είσοδοι είναι ίσες μεταξύ τους."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μεγαλύτερη από τη δεύτερη είσοδο."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μικρότερη ή ίση με τη δεύτερη είσοδο."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μικρότερη από τη δεύτερη είσοδο."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μικρότερη από ή ίση με τη δεύτερη είσοδο."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Επιστρέφει αληθής αν και οι δύο είσοδοι δεν είναι ίσες μεταξύ τους."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "όχι %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Επιστρέφει αληθής αν η είσοδος είναι ψευδής. Επιστρέφει ψευδής αν η είσοδος είναι αληθής."; -Blockly.Msg.LOGIC_NULL = "κενό"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Επιστρέφει κενό."; -Blockly.Msg.LOGIC_OPERATION_AND = "και"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "ή"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Επιστρέφει αληθής αν και οι δύο είσοδοι είναι αληθής."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Επιστρέφει αληθής αν τουλάχιστον μια από τις εισόδους είναι αληθής."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "έλεγχος"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "εάν είναι ψευδής"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "εάν είναι αληθής"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Ελέγχει την κατάσταση/συνθήκη στον «έλεγχο». Αν η κατάσταση/συνθήκη είναι αληθής, επιστρέφει την τιμή «εάν αληθής», διαφορετικά επιστρέφει την τιμή «εάν ψευδής»."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://el.wikipedia.org/wiki/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CE%B7%CF%84%CE%B9%CE%BA%CE%AE"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Επιστρέφει το άθροισμα των δύο αριθμών."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Επιστρέφει το πηλίκο των δύο αριθμών."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Επιστρέφει τη διαφορά των δύο αριθμών."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Επιστρέφει το γινόμενο των δύο αριθμών."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Επιστρέφει τον πρώτο αριθμό υψωμένο στη δύναμη του δεύτερου αριθμού."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://el.wikipedia.org/wiki/%CE%A0%CF%81%CF%8C%CF%83%CE%B8%CE%B5%CF%83%CE%B7"; -Blockly.Msg.MATH_CHANGE_TITLE = "άλλαξε %1 από %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Προσθέτει έναν αριθμό στη μεταβλητή «%1»."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Επιστρέφει μία από τις κοινές σταθερές: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...), ή ∞ (άπειρο)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "περιόρισε %1 χαμηλή %2 υψηλή %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Περιορίζει έναν αριθμό μεταξύ των προβλεπόμενων ορίων (χωρίς αποκλεισμούς)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "είναι διαιρετός από το"; -Blockly.Msg.MATH_IS_EVEN = "είναι άρτιος"; -Blockly.Msg.MATH_IS_NEGATIVE = "είναι αρνητικός"; -Blockly.Msg.MATH_IS_ODD = "είναι περιττός"; -Blockly.Msg.MATH_IS_POSITIVE = "είναι θετικός"; -Blockly.Msg.MATH_IS_PRIME = "είναι πρώτος"; -Blockly.Msg.MATH_IS_TOOLTIP = "Ελέγχει αν ένας αριθμός είναι άρτιος, περιττός, πρώτος, ακέραιος, θετικός, αρνητικός, ή αν είναι διαιρετός από έναν ορισμένο αριθμό. Επιστρέφει αληθής ή ψευδής."; -Blockly.Msg.MATH_IS_WHOLE = "είναι ακέραιος"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "υπόλοιπο της %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Επιστρέφει το υπόλοιπο της διαίρεσης των δύο αριθμών."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://el.wikipedia.org/wiki/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8C%CF%82"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Ένας αριθμός."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "μέσος όρος λίστας"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "μεγαλύτερος λίστας"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "διάμεσος λίστας"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "μικρότερος λίστας"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "μορφές λίστας"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "τυχαίο στοιχείο λίστας"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "τυπική απόκλιση λίστας"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "άθροισμα λίστας"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Επιστρέφει τον αριθμητικό μέσο όρο από τις αριθμητικές τιμές στη λίστα."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Επιστρέφει τον μεγαλύτερο αριθμό στη λίστα."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Επιστρέφει τον διάμεσο της λίστας."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Επιστρέφει τον μικρότερο αριθμό στη λίστα."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Επιστρέφει μια λίστα με τα πιο κοινά στοιχεία στη λίστα."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Επιστρέφει ένα τυχαίο στοιχείο από τη λίστα."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Επιστρέφει την τυπική απόκλιση της λίστας."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Επιστρέφει το άθροισμα όλων των αριθμών στη λίστα."; -Blockly.Msg.MATH_POWER_SYMBOL = "^ ύψωση σε δύναμη"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://el.wikipedia.org/wiki/%CE%93%CE%B5%CE%BD%CE%BD%CE%AE%CF%84%CF%81%CE%B9%CE%B1_%CE%A4%CF%85%CF%87%CE%B1%CE%AF%CF%89%CE%BD_%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8E%CE%BD"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "τυχαίο κλάσμα"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Επιστρέψει ένα τυχαία κλάσμα μεταξύ 0,0 (κλειστό) και 1,0 (ανοικτό)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "τυχαίος ακέραιος από το %1 έως το %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Επιστρέφει έναν τυχαίο ακέραιο αριθμό μεταξύ δύο συγκεκριμένων ορίων (εντός - συμπεριλαμβανομένων και των ακραίων τιμών)."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "στρογγυλοποίησε"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "στρογγυλοποίησε προς τα κάτω"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "στρογγυλοποίησε προς τα πάνω"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Στρογγυλοποιεί έναν αριθμό προς τα πάνω ή προς τα κάτω."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://el.wikipedia.org/wiki/%CE%A4%CE%B5%CF%84%CF%81%CE%B1%CE%B3%CF%89%CE%BD%CE%B9%CE%BA%CE%AE_%CF%81%CE%AF%CE%B6%CE%B1"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "απόλυτη"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "τετραγωνική ρίζα"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Επιστρέφει την απόλυτη τιμή ενός αριθμού."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Επιστρέφει το e υψωμένο στη δύναμη ενός αριθμού."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Επιστρέφει τον νεπέρειο λογάριθμο ενός αριθμού."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Επιστρέφει τον λογάριθμο με βάση το 10 ενός αριθμού."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Επιστρέφει την αρνητική ενός αριθμού."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Επιστρέφει το 10 υψωμένο στη δύναμη ενός αριθμού."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Επιστρέφει την τετραγωνική ρίζα ενός αριθμού."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "acos"; -Blockly.Msg.MATH_TRIG_ASIN = "asin"; -Blockly.Msg.MATH_TRIG_ATAN = "atan"; -Blockly.Msg.MATH_TRIG_COS = "συν"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://el.wikipedia.org/wiki/%CE%A4%CF%81%CE%B9%CE%B3%CF%89%CE%BD%CE%BF%CE%BC%CE%B5%CF%84%CF%81%CE%B9%CE%BA%CE%AE_%CF%83%CF%85%CE%BD%CE%AC%CF%81%CF%84%CE%B7%CF%83%CE%B7"; -Blockly.Msg.MATH_TRIG_SIN = "ημ"; -Blockly.Msg.MATH_TRIG_TAN = "εφ"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Επιστρέφει το τόξο συνημίτονου ενός αριθμού."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Επιστρέφει το τόξο ημίτονου ενός αριθμού."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Επιστρέφει το τόξο εφαπτομένης ενός αριθμού."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Επιστρέφει το συνημίτονο ενός βαθμού (όχι ακτινίου)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Επιστρέφει το ημίτονο ενός βαθμού (όχι ακτινίου)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Επιστρέφει την εφαπτομένη ενός βαθμού (όχι ακτινίου)."; -Blockly.Msg.ME = "Εγώ"; -Blockly.Msg.NEW_VARIABLE = "Νέα μεταβλητή..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Νέο όνομα μεταβλητής:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "με:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://el.wikipedia.org/wiki/%CE%94%CE%B9%CE%B1%CE%B4%CE%B9%CE%BA%CE%B1%CF%83%CE%AF%CE%B1_%28%CF%85%CF%80%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CF%83%CF%84%CE%AD%CF%82%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Εκτελεί την ορισμένη από τον χρήστη συνάρτηση «%1»."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://el.wikipedia.org/wiki/%CE%94%CE%B9%CE%B1%CE%B4%CE%B9%CE%BA%CE%B1%CF%83%CE%AF%CE%B1_%28%CF%85%CF%80%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CF%83%CF%84%CE%AD%CF%82%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Εκτελεί την ορισμένη από τον χρήστη συνάρτηση «%1» και χρησιμοποίησε την έξοδό της."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "με:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Δημιούργησε «%1»"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "κάνε κάτι"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "στο"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Δημιουργεί μια συνάρτηση χωρίς έξοδο."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "επέστρεψε"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Δημιουργεί μια συνάρτηση με μια έξοδο."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Προειδοποίηση: Αυτή η συνάρτηση έχει διπλότυπες παραμέτρους."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Επισημάνετε τον ορισμό συνάρτησης"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Αν μια τιμή είναι αληθής, τότε επιστρέφει τη δεύτερη τιμή."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Προειδοποίηση: Αυτό το μπλοκ μπορεί να χρησιμοποιηθεί μόνο στον ορισμό μιας συνάρτησης."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "όνομα εισόδου:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Πρόσθεσε μια είσοδος στη συνάρτηση"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "είσοδοι"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Προσθέτει, αφαιρεί ή αναδιατάσσει εισόδους σε αυτήν τη λειτουργία"; -Blockly.Msg.REMOVE_COMMENT = "Αφαίρεσε Το Σχόλιο"; -Blockly.Msg.RENAME_VARIABLE = "Μετονόμασε τη μεταβλητή..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Μετονόμασε όλες τις μεταβλητές «%1» σε:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "ανάθεσε κείμενο"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "έως"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Αναθέτει κείμενο στη μεταβλητή «%1»."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "σε πεζά"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "σε Λέξεις Με Πρώτα Κεφαλαία"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "σε ΚΕΦΑΛΑΙΑ"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Επιστρέφει ένα αντίγραφο του κειμένου σε διαφορετική μορφή γραμμάτων."; -Blockly.Msg.TEXT_CHARAT_FIRST = "πάρε το πρώτο γράμμα"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "πάρε το γράμμα # από το τέλος"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "πάρε το γράμμα #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "στο κείμενο"; -Blockly.Msg.TEXT_CHARAT_LAST = "πάρε το τελευταίο γράμμα"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "πάρε τυχαίο γράμμα"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Επιστρέφει το γράμμα στην καθορισμένη θέση."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Προσθέτει ένα στοιχείο στο κείμενο."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "ένωσε"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Προσθέτει, αφαιρεί ή αναδιατάσσει τους τομείς για να αναδιαμορφώσει αυτό το μπλοκ κειμένου."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "μέχρι το # γράμμα από το τέλος"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "μέχρι το # γράμμα"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "μέχρι το τελευταίο γράμμα"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "στο κείμενο"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "πάρε τη δευτερεύουσα συμβολοσειρά από το πρώτο γράμμα"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "πάρε τη δευτερεύουσα συμβολοσειρά από το # γράμμα από το τέλος"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "πάρε τη δευτερεύουσα συμβολοσειρά από το # γράμμα"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Επιστρέφει ένα συγκεκριμένο τμήμα του κειμένου."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "στο κείμενο"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "βρες την πρώτη εμφάνιση του κειμένου"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "βρες την τελευταία εμφάνιση του κειμένου"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του πρώτου κειμένου στο δεύτερο κείμενο. Επιστρέφει τιμή 0, αν δε βρει το κείμενο."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "το %1 είναι κενό"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Επιστρέφει αληθής αν το παρεχόμενο κείμενο είναι κενό."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "δημιούργησε κείμενο με"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Δημιουργεί ένα κομμάτι κειμένου ενώνοντας έναν απεριόριστο αριθμό αντικειμένων."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "το μήκος του %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Επιστρέφει το πλήθος των γραμμάτων (συμπεριλαμβανομένων και των κενών διαστημάτων) στο παρεχόμενο κείμενο."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "εκτύπωσε %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Εκτυπώνει το καθορισμένο κείμενο, αριθμό ή άλλη τιμή."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Δημιουργεί προτροπή για τον χρήστη για να δώσει ένα αριθμό."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Δημιουργεί προτροπή για το χρήστη για να δώσει κάποιο κείμενο."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "πρότρεψε με μήνυμα για να δοθεί αριθμός"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "πρότρεψε με μήνυμα για να δοθεί κείμενο"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://el.wikipedia.org/wiki/%CE%A3%CF%85%CE%BC%CE%B2%CE%BF%CE%BB%CE%BF%CF%83%CE%B5%CE%B9%CF%81%CE%AC"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Ένα γράμμα, μια λέξη ή μια γραμμή κειμένου."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "περίκοψε τα κενά και από τις δυο πλευρές του"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "περίκοψε τα κενά από την αριστερή πλευρά του"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "περίκοψε τα κενά από την δεξιά πλευρά του"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Επιστρέφει ένα αντίγραφο του κειμένου με αφαιρεμένα τα κενά από το ένα ή και τα δύο άκρα."; -Blockly.Msg.TODAY = "Σήμερα"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "αντικείμενο"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Δημιούργησε «όρισε %1»"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Επιστρέφει την τιμή αυτής της μεταβλητής."; -Blockly.Msg.VARIABLES_SET = "όρισε %1 μέχρι το %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Δημιούργησε «πάρε %1»"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Ορίζει αυτή τη μεταβλητή να είναι ίση με την είσοδο."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/en.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/en.js deleted file mode 100644 index afbf89b..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/en.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.en'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Add Comment"; -Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Change value:"; -Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; -Blockly.Msg.COLLAPSE_ALL = "Collapse Blocks"; -Blockly.Msg.COLLAPSE_BLOCK = "Collapse Block"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "colour 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "colour 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "ratio"; -Blockly.Msg.COLOUR_BLEND_TITLE = "blend"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blends two colours together with a given ratio (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Choose a colour from the palette."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; -Blockly.Msg.COLOUR_RANDOM_TITLE = "random colour"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Choose a colour at random."; -Blockly.Msg.COLOUR_RGB_BLUE = "blue"; -Blockly.Msg.COLOUR_RGB_GREEN = "green"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "red"; -Blockly.Msg.COLOUR_RGB_TITLE = "colour with"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "break out of loop"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continue with next iteration of loop"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Break out of the containing loop."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the rest of this loop, and continue with the next iteration."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warning: This block may only be used within a loop."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; -Blockly.Msg.CONTROLS_FOREACH_TITLE = "for each item %1 in list %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For each item in a list, set the variable '%1' to the item, and then do some statements."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; -Blockly.Msg.CONTROLS_FOR_TITLE = "count with %1 from %2 to %3 by %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Add, remove, or reorder sections to reconfigure this if block."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "else"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "else if"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "if"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "If a value is true, then do some statements."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "do"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "repeat %1 times"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Do some statements several times."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repeat until"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repeat while"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "While a value is false, then do some statements."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "While a value is true, then do some statements."; -Blockly.Msg.DELETE_BLOCK = "Delete Block"; -Blockly.Msg.DELETE_X_BLOCKS = "Delete %1 Blocks"; -Blockly.Msg.DISABLE_BLOCK = "Disable Block"; -Blockly.Msg.DUPLICATE_BLOCK = "Duplicate"; -Blockly.Msg.ENABLE_BLOCK = "Enable Block"; -Blockly.Msg.EXPAND_ALL = "Expand Blocks"; -Blockly.Msg.EXPAND_BLOCK = "Expand Block"; -Blockly.Msg.EXTERNAL_INPUTS = "External Inputs"; -Blockly.Msg.HELP = "Help"; -Blockly.Msg.INLINE_INPUTS = "Inline Inputs"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "create empty list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "list"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "create list with"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Add an item to the list."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "first"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# from end"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "get"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "get and remove"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "last"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "random"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "remove"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returns the item at the specified position in a list. #1 is the last item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returns the item at the specified position in a list. #1 is the first item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Removes and returns the item at the specified position in a list. #1 is the last item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Removes and returns the item at the specified position in a list. #1 is the first item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Removes the item at the specified position in a list. #1 is the last item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Removes the item at the specified position in a list. #1 is the first item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "to # from end"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "to #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "to last"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "get sub-list from first"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; -Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; -Blockly.Msg.LISTS_INLIST = "in list"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; -Blockly.Msg.LISTS_LENGTH_TITLE = "length of %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "as"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "insert at"; -Blockly.Msg.LISTS_SET_INDEX_SET = "set"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserts the item at the specified position in a list. #1 is the last item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserts the item at the specified position in a list. #1 is the first item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specified position in a list. #1 is the last item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "false"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returns either true or false."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "true"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Return true if both inputs equal each other."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Return true if the first input is greater than the second input."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Return true if the first input is greater than or equal to the second input."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Return true if the first input is smaller than the second input."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Return true if the first input is smaller than or equal to the second input."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Return true if both inputs are not equal to each other."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; -Blockly.Msg.LOGIC_NEGATE_TITLE = "not %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returns true if the input is false. Returns false if the input is true."; -Blockly.Msg.LOGIC_NULL = "null"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returns null."; -Blockly.Msg.LOGIC_OPERATION_AND = "and"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; -Blockly.Msg.LOGIC_OPERATION_OR = "or"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Return true if both inputs are true."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "if false"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "if true"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Return the sum of the two numbers."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Return the difference of the two numbers."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Return the product of the two numbers."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "change %1 by %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; -Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "is divisible by"; -Blockly.Msg.MATH_IS_EVEN = "is even"; -Blockly.Msg.MATH_IS_NEGATIVE = "is negative"; -Blockly.Msg.MATH_IS_ODD = "is odd"; -Blockly.Msg.MATH_IS_POSITIVE = "is positive"; -Blockly.Msg.MATH_IS_PRIME = "is prime"; -Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; -Blockly.Msg.MATH_IS_WHOLE = "is whole"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "remainder of %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Return the remainder from dividing the two numbers."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "A number."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "average of list"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "max of list"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "median of list"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "min of list"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modes of list"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "random item of list"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standard deviation of list"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "sum of list"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Return the average (arithmetic mean) of the numeric values in the list."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Return the largest number in the list."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Return the median number in the list."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Return the smallest number in the list."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Return a list of the most common item(s) in the list."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Return a random element from the list."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Return the sum of all the numbers in the list."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "random fraction"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "random integer from %1 to %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "round"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "round down"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "round up"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Round a number up or down."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolute"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "square root"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Return the natural logarithm of a number."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Return the base 10 logarithm of a number."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Return the negation of a number."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Return the square root of a number."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "acos"; -Blockly.Msg.MATH_TRIG_ASIN = "asin"; -Blockly.Msg.MATH_TRIG_ATAN = "atan"; -Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; -Blockly.Msg.MATH_TRIG_TAN = "tan"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; -Blockly.Msg.ME = "Me"; -Blockly.Msg.NEW_VARIABLE = "New variable..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "New variable name:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "with:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "with:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Create '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "do something"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "to"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "return"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; -Blockly.Msg.REMOVE_COMMENT = "Remove Comment"; -Blockly.Msg.RENAME_VARIABLE = "Rename variable..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Rename all '%1' variables to:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "append text"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; -Blockly.Msg.TEXT_APPEND_TO = "to"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "to lower case"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "to UPPER CASE"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; -Blockly.Msg.TEXT_CHARAT_FIRST = "get first letter"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "get letter # from end"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "get letter #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in text"; -Blockly.Msg.TEXT_CHARAT_LAST = "get last letter"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "join"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in text"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "create text with"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; -Blockly.Msg.TEXT_LENGTH_TITLE = "length of %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; -Blockly.Msg.TEXT_PRINT_TITLE = "print %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "trim spaces from both sides of"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; -Blockly.Msg.TODAY = "Today"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; -Blockly.Msg.VARIABLES_SET = "set %1 to %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/es.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/es.js deleted file mode 100644 index a27711d..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/es.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.es'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Añadir comentario"; -Blockly.Msg.AUTH = "Autoriza a esta aplicación para guardar tu trabajo y permitir que lo compartas."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Cambiar el valor:"; -Blockly.Msg.CHAT = "¡Chatea con tu colaborador escribiendo en este cuadro!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Contraer bloques"; -Blockly.Msg.COLLAPSE_BLOCK = "Contraer bloque"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "color 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "color 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "proporción"; -Blockly.Msg.COLOUR_BLEND_TITLE = "combinar"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Combina dos colores con una proporción determinada (0,0–1,0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://es.wikipedia.org/wiki/Color"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Elige un color de la paleta."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "color aleatorio"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Elige un color al azar."; -Blockly.Msg.COLOUR_RGB_BLUE = "azul"; -Blockly.Msg.COLOUR_RGB_GREEN = "verde"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "rojo"; -Blockly.Msg.COLOUR_RGB_TITLE = "colorear con"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Crea un color con cantidades específicas de rojo, verde y azul. Todos los valores deben encontrarse entre 0 y 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "romper el bucle"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continuar con la siguiente iteración del bucle"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Romper el bucle que lo contiene."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Saltar el resto de este bucle, y continuar con la siguiente iteración."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "ADVERTENCIA: Este bloque puede usarse sólo dentro de un bucle."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://es.wikipedia.org/wiki/Foreach"; -Blockly.Msg.CONTROLS_FOREACH_TITLE = "para cada elemento %1 en la lista %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Para cada elemento en una lista, establecer la variable '%1' al elemento y luego hacer algunas declaraciones."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "contar con %1 desde %2 hasta %3 de a %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Hacer que la variable \"%1\" tome los valores desde el número de inicio hasta el número final, contando con el intervalo especificado, y hacer los bloques especificados."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Agregar una condición a este bloque."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Agregar una condición general final a este bloque."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Agregar, eliminar o reordenar las secciones para reconfigurar este bloque."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "sino"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "sino si"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "si"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Si un valor es verdadero, entonces hacer algunas declaraciones."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Si un valor es verdadero, entonces hacer el primer bloque de declaraciones. De lo contrario, hacer el segundo bloque de declaraciones."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Si el primer valor es verdadero, entonces hacer el primer bloque de declaraciones. De lo contrario, si el segundo valor es verdadero, hacer el segundo bloque de declaraciones."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Si el primer valor es verdadero, entonces hacer el primer bloque de declaraciones. De lo contrario, si el segundo valor es verdadero, hacer el segundo bloque de declaraciones. Si ninguno de los valores son verdaderos, hacer el último bloque de declaraciones."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://es.wikipedia.org/wiki/Bucle_for"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "hacer"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "repetir %1 veces"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Hacer algunas declaraciones varias veces."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repetir hasta"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repetir mientras"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Mientras un valor sea falso, entonces hacer algunas declaraciones."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Mientras un valor sea verdadero, entonces hacer algunas declaraciones."; -Blockly.Msg.DELETE_BLOCK = "Eliminar bloque"; -Blockly.Msg.DELETE_X_BLOCKS = "Eliminar %1 bloques"; -Blockly.Msg.DISABLE_BLOCK = "Desactivar bloque"; -Blockly.Msg.DUPLICATE_BLOCK = "Duplicar"; -Blockly.Msg.ENABLE_BLOCK = "Activar bloque"; -Blockly.Msg.EXPAND_ALL = "Expandir bloques"; -Blockly.Msg.EXPAND_BLOCK = "Expandir bloque"; -Blockly.Msg.EXTERNAL_INPUTS = "Entradas externas"; -Blockly.Msg.HELP = "Ayuda"; -Blockly.Msg.INLINE_INPUTS = "Entradas en línea"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "crear lista vacía"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Devuelve una lista, de longitud 0, sin ningún dato"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Agregar, eliminar o reorganizar las secciones para reconfigurar este bloque de lista."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "crear lista con"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Agregar un elemento a la lista."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Crear una lista con cualquier número de elementos."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "primero"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# del final"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "obtener"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "obtener y eliminar"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "último"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aleatorio"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "eliminar"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Devuelve el primer elemento de una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Devuelve el elemento en la posición especificada en una lista. #1 es el último elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Devuelve el elemento en la posición especificada en la lista. #1 es el primer elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Devuelve el último elemento de una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Devuelve un elemento aleatorio en una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Elimina y devuelve el primer elemento de una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Elimina y devuelve el elemento en la posición especificada en la lista. #1 es el último elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Elimina y devuelve el elemento en la posición especificada en la lista. #1 es el primer elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Elimina y devuelve el último elemento de una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Elimina y devuelve un elemento aleatorio en una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Elimina el primer elemento de una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Elimina el elemento en la posición especificada en la lista. #1 es el último elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Elimina el elemento en la posición especificada en la lista. #1 es el primer elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Elimina el último elemento de una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Elimina un elemento aleatorio en una lista."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "hasta # del final"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "hasta #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "hasta el último"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "obtener sublista desde el primero"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "obtener sublista desde # del final"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "obtener sublista desde #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crea una copia de la parte especificada de una lista."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "encontrar la primera aparición del elemento"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "encontrar la última aparición del elemento"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Devuelve el índice de la primera/última aparición del elemento en la lista. Devuelve 0 si el texto no se encuentra."; -Blockly.Msg.LISTS_INLIST = "en la lista"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 está vacía"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Devuelve verdadero si la lista está vacía."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "longitud de %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Devuelve la longitud de una lista."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "crear lista con el elemento %1 repetido %2 veces"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Crea una lista que consta de un valor dado repetido el número de veces especificado."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "como"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "insertar en"; -Blockly.Msg.LISTS_SET_INDEX_SET = "establecer"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserta el elemento al inicio de una lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserta el elemento en la posición especificada en la lista. #1 es el último elemento."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserta el elemento en la posición especificada en la lista. #1 es el primer elemento."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Añade el elemento al final de una lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserta el elemento aleatoriamente en una lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Establece el primer elemento de una lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Establece el elemento en la posición especificada en una lista. #1 es el último elemento."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Establece el elemento en la posición especificada en una lista. #1 es el primer elemento."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Establece el último elemento de una lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Establece un elemento aleatorio en una lista."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "hacer lista a partir de texto"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "hacer texto a partir de lista"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Unir una lista de textos en un solo texto, separado por un delimitador."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Dividir el texto en una lista de textos, separando en cada delimitador."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "con delimitador"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falso"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Devuelve verdadero o falso."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "verdadero"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://es.wikipedia.org/wiki/Desigualdad_matemática"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Devuelve verdadero si ambas entradas son iguales."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Devuelve verdadero si la primera entrada es mayor que la segunda entrada."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Devuelve verdadero si la primera entrada es mayor o igual a la segunda entrada."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Devuelve verdadero si la primera entrada es menor que la segunda entrada."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Devuelve verdadero si la primera entrada es menor que o igual a la segunda entrada."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Devuelve verdadero si ambas entradas son distintas."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "no %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Devuelve verdadero si la entrada es falsa. Devuelve falso si la entrada es verdadera."; -Blockly.Msg.LOGIC_NULL = "nulo"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Devuelve nulo."; -Blockly.Msg.LOGIC_OPERATION_AND = "y"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "o"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Devuelve verdadero si ambas entradas son verdaderas."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Devuelve verdadero si al menos una de las entradas es verdadera."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "prueba"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "si es falso"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "si es verdadero"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Comprueba la condición en \"prueba\". Si la condición es verdadera, devuelve el valor \"si es verdadero\"; de lo contrario, devuelve el valor \"si es falso\"."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://es.wikipedia.org/wiki/Aritmética"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Devuelve la suma de ambos números."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Devuelve el cociente de ambos números."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Devuelve la diferencia de ambos números."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Devuelve el producto de ambos números."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Devuelve el primer número elevado a la potencia del segundo."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "cambiar %1 por %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Añadir un número a la variable «%1»."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://es.wikipedia.org/wiki/Anexo:Constantes_matemáticas"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Devuelve una de las constantes comunes: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) o ∞ (infinito)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "limitar %1 entre %2 y %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Limitar un número entre los límites especificados (inclusive)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "es divisible por"; -Blockly.Msg.MATH_IS_EVEN = "es par"; -Blockly.Msg.MATH_IS_NEGATIVE = "es negativo"; -Blockly.Msg.MATH_IS_ODD = "es impar"; -Blockly.Msg.MATH_IS_POSITIVE = "es positivo"; -Blockly.Msg.MATH_IS_PRIME = "es primo"; -Blockly.Msg.MATH_IS_TOOLTIP = "Comprueba si un número es par, impar, primo, entero, positivo, negativo, o si es divisible por un número determinado. Devuelve verdadero o falso."; -Blockly.Msg.MATH_IS_WHOLE = "es entero"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "resto de %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Devuelve el resto al dividir los dos números."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://es.wikipedia.org/wiki/Número"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un número."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "promedio de la lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "máximo de la lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana de la lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "mínimo de la lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modas de la lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "elemento aleatorio de la lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "desviación estándar de la lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "suma de la lista"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Devuelve el promedio (media aritmética) de los valores numéricos en la lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Devuelve el número más grande en la lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Devuelve la mediana en la lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Devuelve el número más pequeño en la lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Devuelve una lista de los elementos más comunes en la lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Devuelve un elemento aleatorio de la lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Devuelve la desviación estándar de la lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Devuelve la suma de todos los números en la lista."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://es.wikipedia.org/wiki/Generador_de_números_aleatorios"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "fracción aleatoria"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Devuelve una fracción aleatoria entre 0,0 (ambos inclusive) y 1.0 (exclusivo)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://es.wikipedia.org/wiki/Generador_de_números_aleatorios"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "entero aleatorio de %1 a %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Devuelve un entero aleatorio entre los dos límites especificados, inclusive."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://es.wikipedia.org/wiki/Redondeo"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "redondear"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "redondear hacia abajo"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "redondear hacia arriba"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Redondear un número hacia arriba o hacia abajo."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://es.wikipedia.org/wiki/Ra%C3%ADz_cuadrada"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absoluto"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "raíz cuadrada"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Devuelve el valor absoluto de un número."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Devuelve e a la potencia de un número."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Devuelve el logaritmo natural de un número."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Devuelve el logaritmo base 10 de un número."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Devuelve la negación de un número."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Devuelve 10 a la potencia de un número."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Devuelve la raíz cuadrada de un número."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://es.wikipedia.org/wiki/Función_trigonométrica"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Devuelve el arcocoseno de un número."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Devuelve el arcoseno de un número."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Devuelve el arcotangente de un número."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Devuelve el coseno de un grado (no radián)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Devuelve el seno de un grado (no radián)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Devuelve la tangente de un grado (no radián)."; -Blockly.Msg.ME = "Yo"; -Blockly.Msg.NEW_VARIABLE = "Variable nueva…"; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nombre de variable nueva:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "permitir declaraciones"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "con:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://es.wikipedia.org/wiki/Subrutina"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Ejecuta la función definida por el usuario '%1'."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://es.wikipedia.org/wiki/Subrutina"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Ejecuta la función definida por el usuario '%1' y usa su salida."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "con:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Crear '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "hacer algo"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "para"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crea una función sin salida."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "devuelve"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crea una función con una salida."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Advertencia: Esta función tiene parámetros duplicados."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Destacar definición de la función"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Si un valor es verdadero, entonces devuelve un segundo valor."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Advertencia: Este bloque solo puede ser utilizado dentro de la definición de una función."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nombre de entrada:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Añadir una entrada a la función."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entradas"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Añadir, eliminar o reordenar entradas para esta función."; -Blockly.Msg.REMOVE_COMMENT = "Eliminar comentario"; -Blockly.Msg.RENAME_VARIABLE = "Renombrar la variable…"; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Renombrar todas las variables «%1» a:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "añadir texto"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "a"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Añadir texto a la variable '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "a minúsculas"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "a Mayúsculas Cada Palabra"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "a MAYÚSCULAS"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Devuelve una copia del texto en un caso diferente."; -Blockly.Msg.TEXT_CHARAT_FIRST = "obtener la primera letra"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "obtener la letra # del final"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "obtener la letra #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "en el texto"; -Blockly.Msg.TEXT_CHARAT_LAST = "obtener la última letra"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "obtener letra aleatoria"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Devuelve la letra en la posición especificada."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Agregar un elemento al texto."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "unir"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Agregar, eliminar o reordenar las secciones para reconfigurar este bloque de texto."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "hasta la letra # del final"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "hasta la letra #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "hasta la última letra"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "en el texto"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "obtener subcadena desde la primera letra"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "obtener subcadena desde la letra # del final"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "obtener subcadena desde la letra #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Devuelve una porción determinada del texto."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "en el texto"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "encontrar la primera aparición del texto"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "encontrar la última aparición del texto"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Devuelve el índice de la primera/última aparición del primer texto en el segundo texto. Devuelve 0 si el texto no se encuentra."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 está vacío"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Devuelve verdadero si el texto proporcionado está vacío."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "crear texto con"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Crear un fragmento de texto al unir cualquier número de elementos."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "longitud de %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Devuelve el número de letras (incluyendo espacios) en el texto proporcionado."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "imprimir %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Imprimir el texto, número u otro valor especificado."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Solicitar al usuario un número."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Solicitar al usuario un texto."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "solicitar número con el mensaje"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "solicitar texto con el mensaje"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://es.wikipedia.org/wiki/Cadena_de_caracteres"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Una letra, palabra o línea de texto."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "quitar espacios de ambos lados de"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "quitar espacios iniciales de"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "quitar espacios finales de"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Devuelve una copia del texto sin los espacios de uno o ambos extremos."; -Blockly.Msg.TODAY = "Hoy"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "elemento"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crear 'establecer %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Devuelve el valor de esta variable."; -Blockly.Msg.VARIABLES_SET = "establecer %1 a %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Crear 'obtener %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Establece esta variable para que sea igual a la entrada."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/fa.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/fa.js deleted file mode 100644 index acb08e7..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/fa.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.fa'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "افزودن نظر"; -Blockly.Msg.AUTH = "لطفا این اپلیکیشن را ثبت کنید و آثارتان را فعال کنید تا ذخیره شود و اجازهٔ اشتراک‌گذاری توسط شما داده شود."; -Blockly.Msg.CHANGE_VALUE_TITLE = "تغییر مقدار:"; -Blockly.Msg.CHAT = "با همکارتان با نوشتن در این کادر چت کنید!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "فروپاشی بلوک‌ها"; -Blockly.Msg.COLLAPSE_BLOCK = "فروپاشی بلوک"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "رنگ ۱"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "رنگ ۲"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "نسبت"; -Blockly.Msg.COLOUR_BLEND_TITLE = "مخلوط"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "دو رنگ را با نسبت مشخص‌شده مخلوط می‌کند (۰٫۰ - ۱٫۰)"; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B1%D9%86%DA%AF"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "انتخاب یک رنگ از تخته‌رنگ."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "رنگ تصادفی"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "انتخاب یک رنگ به شکل تصادفی."; -Blockly.Msg.COLOUR_RGB_BLUE = "آبی"; -Blockly.Msg.COLOUR_RGB_GREEN = "سبز"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "قرمز"; -Blockly.Msg.COLOUR_RGB_TITLE = "رنگ با"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "ساخت یک رنگ با مقدار مشخص‌شده‌ای از قرمز، سبز و آبی. همهٔ مقادیر باید بین ۰ تا ۱۰۰ باشند."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "شکستن حلقه"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "ادامه با تکرار بعدی حلقه"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "شکستن حلقهٔ شامل."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "پریدن از بقیهٔ حلقه و ادامه با تکرار بعدی."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "اخطار: این بلوک ممکن است فقط داخل یک حلقه استفاده شود."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "برای هر مورد %1 در فهرست %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "برای هر مورد در این فهرست، تنظیم متغیر «%1» به مورد و انجام تعدادی عبارت."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "با تعداد %1 از %2 به %3 با گام‌های %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "متغیر %1 را در مقادیر شروع‌شده از عدد انتهای به عدد انتهایی را دارد، با فواصل مشخص‌شده می‌شمارد و این بلوک مشخص‌شده را انجام می‌دهد."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "افزودن یک شرط به بلوک اگر."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "اضافه‌کردن نهایی، گرفتن همهٔ شرایط به بلوک اگر."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "افزودن، حذف یا بازمرتب‌سازی قسمت‌ها برای پیکربندی دوبارهٔ این بلوک اگر."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "آنگاه"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "اگر آنگاه"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "اگر"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "اگر یک مقدار صحیح است، سپس چند عبارت را انجام بده."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "اگر یک مقدار صحیح است، اول بلوک اول عبارات را انجام بده. در غیر این صورت بلوک دوم عبارات انجام بده."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "اگر مقدار اول صحیح بود، از آن بلوک اول عبارات را انجام بده. در غیر این صورت، اگر مقدار دوم صحیح است، بلوک دوم عبارات را انجام بده."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "اگر مقدار اول درست است، بلوک اول عبارات را انجام بده. در غیر این صورت، اگر مقدار دوم درست باشد بلوک دوم عبارات را انجام بده. اگر هیچ از مقادیر درست نبود، آخرین بلوک عبارات را انجام بده."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://fa.wikipedia.org/wiki/%D8%AD%D9%84%D9%82%D9%87_%D9%81%D9%88%D8%B1"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "انحام"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1 بار تکرار"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "انجام چند عبارت چندین بار."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "تکرار تا زمانی که"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "تکرار در حالی که"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "تا زمانی که یک مقدار ناصحیح است، چند عبارت را انجام بده."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "تا زمانی که یک مقدار صحیح است، چند عبارت را انجام بده."; -Blockly.Msg.DELETE_BLOCK = "حذف بلوک"; -Blockly.Msg.DELETE_X_BLOCKS = "حذف بلوک‌های %1"; -Blockly.Msg.DISABLE_BLOCK = "غیرفعال‌سازی بلوک"; -Blockly.Msg.DUPLICATE_BLOCK = "تکراری"; -Blockly.Msg.ENABLE_BLOCK = "فعال‌سازی بلوک"; -Blockly.Msg.EXPAND_ALL = "گسترش بلوک‌ها"; -Blockly.Msg.EXPAND_BLOCK = "گسترش بلوک"; -Blockly.Msg.EXTERNAL_INPUTS = "ورودی‌های خارجی"; -Blockly.Msg.HELP = "راهنما"; -Blockly.Msg.INLINE_INPUTS = "ورودی‌های درون خطی"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "ایجاد فهرست خالی"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "فهرستی با طول صفر شامل هیچ رکورد داده‌ای بر می‌گرداند."; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "فهرست"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "اضافه‌کردن، حذف‌کردن یا ترتیب‌سازی مجدد بخش‌ها این بلوک فهرستی."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "ایجاد فهرست با"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "اضافه‌کردن یک مورد به فهرست."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "فهرستی از هر عددی از موارد می‌سازد."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "اولین"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# از انتها"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "گرفتن"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "گرفتن و حذف‌کردن"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "آخرین"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "تصادفی"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "حذف‌کردن"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "اولین مورد یک فهرست را بر می‌گرداند."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "موردی در محل مشخص در فهرست بر می‌گرداند. #1 آخرین مورد است."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "موردی در محل مشخص‌شده بر می‌گرداند. #1 اولین مورد است."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "آخرین مورد در یک فهرست را بر می‌گرداند."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "یک مورد تصادفی در یک فهرست بر می‌گرداند."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "اولین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند. #1 آخرین مورد است."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند. #1 اولین مورد است."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "آخرین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "مورد تصادفی‌ای را در فهرست حذف و بر می‌گرداند."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "اولین مورد را در یک فهرست حذف می‌کند."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند. #1 آخرین مورد است."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند. #1 اولین مورد است."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "آخرین مورد را در یک فهرست حذف می‌کند."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "یک مورد تصادفی را یک فهرست حذف می‌کند."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "به # از انتها"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "به #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "به آخرین"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "گرفتن زیرمجموعه‌ای از ابتدا"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "گرفتن زیرمجموعه‌ای از # از انتها"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "گرفتن زیرمجموعه‌ای از #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "کپی از قسمت مشخص‌شدهٔ لیست درست می‌کند."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "یافتن اولین رخ‌داد مورد"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "یافتن آخرین رخ‌داد مورد"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. ۰ بر می‌گرداند اگر متن موجود نبود."; -Blockly.Msg.LISTS_INLIST = "در فهرست"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 خالی است"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "اگر فهرست خالی است مقدار صجیج بر می‌گرداند."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "طول %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "طول یک فهرست را برمی‌گرداند."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "فهرستی با %1 تکرارشده به اندازهٔ %2 می‌سازد"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "فهرستی شامل مقادیر داده‌شدهٔ تکرار شده عدد مشخص‌شده می‌سازد."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "به عنوان"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "درج در"; -Blockly.Msg.LISTS_SET_INDEX_SET = "مجموعه"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "موردی به ته فهرست اضافه می‌کند."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند. #1 آخرین مورد است."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند. #1 اولین مورد است."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "موردی به ته فهرست الحاق می‌کند."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "مورد را به صورت تصادفی در یک فهرست می‌افزاید."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "اولین مورد در یک فهرست را تعیین می‌کند."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 آخرین مورد است."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 اولین مورد است."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "آخرین مورد در یک فهرست را تعیین می‌کند."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "یک مورد تصادفی در یک فهرست را تعیین می‌کند."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "ایجاد فهرست از متن"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "ایجاد متن از فهرست"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "همراه جداساز"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "ناصحیح"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "بازگرداندن یکی از صحیح یا ناصحیح."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "صحیح"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://fa.wikipedia.org/wiki/%D9%86%D8%A7%D8%A8%D8%B1%D8%A7%D8%A8%D8%B1%DB%8C"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "بازگشت صحیح اگر هر دو ورودی با یکدیگر برابر باشد."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "بازگرداندن صحیح اگر ورودی اول بزرگتر از ورودی دوم باشد."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "بازگرداندن صحیح اگر ورودی اول بزرگتر یا مساوی یا ورودی دوم باشد."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "بازگرداندن صحیح اگر ورودی اول کوچکتر از ورودی دوم باشد."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "بازگرداندن صحیح اگر ورودی اول کوچکتر یا مساوی با ورودی دوم باشد."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "برگرداندن صحیح اگر هر دو ورودی با یکدیگر برابر نباشند."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "نه %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "صجیج باز می‌گرداند اگر ورودی نا صحیح باشند. ناصحیح بازمی‌گرداند اگر ورودی صحیح باشد."; -Blockly.Msg.LOGIC_NULL = "تهی"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "تهی بازمی‌گرداند."; -Blockly.Msg.LOGIC_OPERATION_AND = "و"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "یا"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "بازگرداندن صحیح اگر هر دو ورودی صحیح باشد."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "بازگرداندن صحیح اگر یکی از دو ورودی صحیح باشد."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "آزمایش"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "اگر ناصحیح"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "اگر صحیح"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "بررسی وضعیت در «آزمایش». اگر وضعیت صحیح باشد، مقدار «اگر صحیح» را بر می‌گرداند در غیر اینصورت مقدار «اگر ناصحیح» را."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://fa.wikipedia.org/wiki/%D8%AD%D8%B3%D8%A7%D8%A8"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "بازگرداندن مقدار جمع دو عدد."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "بازگرداندن باقی‌ماندهٔ دو عدد."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "بازگرداندن تفاوت دو عدد."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "بازگرداندن حاصلضرب دو عدد."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "بازگرداندن اولین عددی که از توان عدد دوم حاصل شده باشد."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://fa.wikipedia.org/wiki/%D8%A7%D8%B5%D8%B7%D9%84%D8%A7%D8%AD_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%E2%80%8C%D9%86%D9%88%DB%8C%D8%B3%DB%8C#.D8.A7.D9.81.D8.B2.D8.A7.DB.8C.D8.B4_.D8.B4.D9.85.D8.A7.D8.B1.D9.86.D8.AF.D9.87"; -Blockly.Msg.MATH_CHANGE_TITLE = "تغییر %1 با %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "افزودن یک عدد به متغیر '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://fa.wikipedia.org/wiki/%D8%AB%D8%A7%D8%A8%D8%AA_%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "یکی از مقادیر مشترک را برمی‌گرداند: π (۳٫۱۴۱…)، e (۲٫۷۱۸...)، φ (۱٫۶۱۸)، sqrt(۲) (۱٫۴۱۴)، sqrt(۱/۲) (۰٫۷۰۷...) و یا ∞ (بی‌نهایت)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "محدودکردن %1 پایین %2 بالا %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "محدودکردن یک عدد بین محدودیت‌های مشخص‌شده (بسته)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "تقسیم شده بر"; -Blockly.Msg.MATH_IS_EVEN = "زوج است"; -Blockly.Msg.MATH_IS_NEGATIVE = "منفی است"; -Blockly.Msg.MATH_IS_ODD = "فرد است"; -Blockly.Msg.MATH_IS_POSITIVE = "مثبت است"; -Blockly.Msg.MATH_IS_PRIME = "عدد اول است"; -Blockly.Msg.MATH_IS_TOOLTIP = "بررسی می‌کند که آیا یک عدد زوج، فرد، اول، کامل، مثبت، منفی یا بخش‌پذیر عدد خاصی باشد را بررسی می‌کند. درست یا نادرست باز می‌گرداند."; -Blockly.Msg.MATH_IS_WHOLE = "کامل است"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B9%D9%85%D9%84%DB%8C%D8%A7%D8%AA_%D9%BE%DB%8C%D9%85%D8%A7%D9%86%D9%87"; -Blockly.Msg.MATH_MODULO_TITLE = "باقی‌ماندهٔ %1 + %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "باقی‌ماندهٔ تقسیم دو عدد را بر می‌گرداند."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B9%D8%AF%D8%AF"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "یک عدد."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "میانگین فهرست"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "بزرگ‌ترین فهرست"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "میانهٔ فهرست"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "کوچکترین فهرست"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "مد فهرست"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "مورد تصادفی از فهرست"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "انحراف معیار فهرست"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "جمع فهرست"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "میانگین (میانگین ریاضی) مقادیر عددی فهرست را بر می‌گرداند."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "بزرگ‌ترین عدد در فهرست را باز می‌گرداند."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "میانهٔ عدد در فهرست را بر می‌گرداند."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "کوچک‌ترین عدد در فهرست را باز می‌گرداند."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "شایع‌ترین قلم(های) در فهرست را بر می‌گرداند."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "موردی تصادفی از فهرست را بر می‌گرداند."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "انحراف معیار فهرست را بر می‌گرداند."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "جمع همهٔ عددهای فهرست را باز می‌گرداند."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://fa.wikipedia.org/wiki/%D8%AA%D9%88%D9%84%DB%8C%D8%AF_%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF_%D8%AA%D8%B5%D8%A7%D8%AF%D9%81%DB%8C"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "کسر تصادفی"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "بازگرداندن کسری تصادفی بین ۰٫۰ (بسته) تا ۱٫۰ (باز)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://fa.wikipedia.org/wiki/%D8%AA%D9%88%D9%84%DB%8C%D8%AF_%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF_%D8%AA%D8%B5%D8%A7%D8%AF%D9%81%DB%8C"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "عدد صحیح تصادفی بین %1 تا %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "یک عدد تصادفی بین دو مقدار مشخص‌شده به صورت بسته باز می‌گرداند."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "گردکردن"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "گرد به پایین"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "گرد به بالا"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "گردکردن یک عدد به بالا یا پایین."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B1%DB%8C%D8%B4%D9%87_%D8%AF%D9%88%D9%85"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "مطلق"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "ریشهٔ دوم"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "قدر مطلق یک عدد را بازمی‌گرداند."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "بازگرداندن توان e یک عدد."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "لوگاریتم طبیعی یک عدد را باز می‌گرداند."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "بازگرداندن لگاریتم بر پایهٔ ۱۰ یک عدد."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "منفی‌شدهٔ یک عدد را باز می‌گرداند."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "بازگرداندن توان ۱۰ یک عدد."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "ریشهٔ دوم یک عدد را باز می‌گرداند."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://fa.wikipedia.org/wiki/%D8%AA%D8%A7%D8%A8%D8%B9%E2%80%8C%D9%87%D8%A7%DB%8C_%D9%85%D8%AB%D9%84%D8%AB%D8%A7%D8%AA%DB%8C"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "بازگرداندن آرک‌کسینوس درجه (نه رادیان)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "بازگرداندن آرک‌سینوس درجه (نه رادیان)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "بازگرداندن آرک‌تانژانت درجه (نه رادیان)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "بازگرداندن کسینوس درجه (نه رادیان)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "بازگرداندن سینوس درجه (نه رادیان)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "بازگرداندن تانژانت یک درجه (نه رادیان)."; -Blockly.Msg.ME = "من"; -Blockly.Msg.NEW_VARIABLE = "متغیر تازه..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "نام متغیر تازه:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "اجازه اظهارات"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "با:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "اجرای تابع تعریف‌شده توسط کاربر «%1»."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "اجرای تابع تعریف‌شده توسط کاربر «%1» و استفاده از خروجی آن."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "با:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "ساختن «%1»"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "انجام چیزی"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "به"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "تابعی می‌سازد بدون هیچ خروجی."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "بازگشت"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "تابعی با یک خروجی می‌سازد."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "اخطار: این تابعی پارامتر تکراری دارد."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "برجسته‌سازی تعریف تابع"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "اگر یک مقدار صحیح است، مقدار دوم را برگردان."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "اخطار: این بلوک احتمالاً فقط داخل یک تابع استفاده می‌شود."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "نام ورودی:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "اضافه کردن ورودی به تابع."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "ورودی‌ها"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "افزودن، حذف یا دوباره مرتب‌کردن ورودی این تابع."; -Blockly.Msg.REMOVE_COMMENT = "حذف نظر"; -Blockly.Msg.RENAME_VARIABLE = "تغییر نام متغیر..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "تغییر نام همهٔ متغیرهای «%1» به:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "الحاق متن"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "به"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "الحاق متنی به متغیر «%1»."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "به حروف کوچک"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "به حروف بزرگ عنوان"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "به حروف بزرگ"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "بازگرداندن کپی متن در حالتی متفاوت."; -Blockly.Msg.TEXT_CHARAT_FIRST = "گرفتن اولین حرف"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "گرفتن حرف # از آخر"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "گرفتن حرف #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "در متن"; -Blockly.Msg.TEXT_CHARAT_LAST = "گرفتن آخرین حرف"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "گرفتن حرف تصادفی"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "حرفی در موقعیت مشخص‌شده بر می‌گرداند."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "افزودن یک مورد به متن."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "عضویت"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "اضافه‌کردن، حذف یا مرتب‌سازی بحش‌ها برای تنظیم مجدد این بلوک متنی."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "به حرف # از انتها"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "به حرف #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "به آخرین حرف"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "در متن"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "گرفتن زیرمتن از اولین حرف"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "گرفتن زیرمتن از حرف # به انتها"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "گرفتن زیرمتن از حرف #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "قسمت مشخصی‌شده‌ای از متن را بر می‌گرداند."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "در متن"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "اولین رخداد متن را بیاب"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "آخرین رخداد متن را بیاب"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد ۰ باز می‌گرداند."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 خالی است"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "اضافه‌کردن صحیح اگر متن فراهم‌شده خالی است."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "ایجاد متن با"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "یک تکه‌ای از متن را با چسپاندن همهٔ تعداد از موارد ایجاد می‌کند."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "طول %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "بازگرداندن عددی از حروف (شامل فاصله‌ها) در متن فراهم‌شده."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "چاپ %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "چاپ متن، عدد یا هر مقدار دیگر مشخص‌شده."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "اعلان برای کاربر با یک عدد."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "اعلان برای کاربر برای یک متن."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "اعلان برای عدد با پیام"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "اعلان برای متن با پیام"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B1%D8%B4%D8%AA%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "یک حرف، کلمه یا خطی از متن."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "تراشیدن فاصله‌ها از هر دو طرف"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "تراشیدن فاصله‌ها از طرف چپ"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "تراشیدن فاصله‌ها از طرف چپ"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "کپی از متن با فاصله‌های حذف‌شده از یک یا هر دو پایان باز می‌گرداند."; -Blockly.Msg.TODAY = "امروز"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "مورد"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "درست‌کردن «تنظیم %1»"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "مقدار این متغیر را بر می‌گرداند."; -Blockly.Msg.VARIABLES_SET = "مجموعه %1 به %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "درست‌کردن «گرفتن %1»"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "متغیر برابر با خروجی را مشخص می‌کند."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/fr.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/fr.js deleted file mode 100644 index 69f3184..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/fr.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.fr'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Ajouter un commentaire"; -Blockly.Msg.AUTH = "Veuillez autoriser cette application à permettre la sauvegarde de votre travail et à l’autoriser à la partager."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Modifier la valeur :"; -Blockly.Msg.CHAT = "Discuter avec votre collaborateur en tapant dans cette zone !"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Réduire les blocs"; -Blockly.Msg.COLLAPSE_BLOCK = "Réduire le bloc"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "couleur 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "couleur 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "ratio"; -Blockly.Msg.COLOUR_BLEND_TITLE = "mélanger"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mélange deux couleurs avec un ratio donné (de 0.0 à 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://fr.wikipedia.org/wiki/Couleur"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Choisir une couleur dans la palette"; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "couleur aléatoire"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Choisir une couleur au hasard."; -Blockly.Msg.COLOUR_RGB_BLUE = "bleu"; -Blockly.Msg.COLOUR_RGB_GREEN = "vert"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "rouge"; -Blockly.Msg.COLOUR_RGB_TITLE = "colorer avec"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Créer une couleur avec la quantité de rouge, vert et bleu. Les valeurs doivent être comprises entre 0 et 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "sortir de la boucle"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continuer avec la prochaine itération de la boucle"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Sortir de la boucle englobante."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Sauter le reste de cette boucle, et poursuivre avec l’itération suivante."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Attention : Ce bloc ne devrait être utilisé que dans une boucle."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "pour chaque élément %1 dans la liste %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Pour chaque élément dans une liste, donner la valeur de l’élément à la variable '%1', puis exécuter certains ordres."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "compter avec %1 de %2 à %3 par %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Faire en sorte que la variable « %1 » prenne les valeurs depuis le numéro de début jusqu’au numéro de fin, en s’incrémentant de l’intervalle spécifié, et exécuter les ordres spécifiés."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Ajouter une condition au bloc si."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Ajouter une condition finale fourre-tout au bloc si."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Ajouter, supprimer ou réordonner les sections pour reconfigurer ce bloc si."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "sinon"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "sinon si"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "si"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Si une valeur est vraie, alors exécuter certains ordres."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Si une valeur est vraie, alors exécuter le premier bloc d’ordres. Sinon, exécuter le second bloc d’ordres."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Si la première valeur est vraie, alors exécuter le premier bloc d’ordres. Sinon, si la seconde valeur est vraie, exécuter le second bloc d’ordres."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Si la première valeur est vraie, alors exécuter le premier bloc d’ordres. Sinon, si la seconde valeur est vraie, exécuter le second bloc d’ordres. Si aucune des valeurs n’est vraie, exécuter le dernier bloc d’ordres."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "http://fr.wikipedia.org/wiki/Boucle_for"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "faire"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "répéter %1 fois"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Exécuter certains ordres plusieurs fois."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "répéter jusqu’à"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "répéter tant que"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Tant qu’une valeur est fausse, alors exécuter certains ordres."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Tant qu’une valeur est vraie, alors exécuter certains ordres."; -Blockly.Msg.DELETE_BLOCK = "Supprimer le bloc"; -Blockly.Msg.DELETE_X_BLOCKS = "Supprimer %1 blocs"; -Blockly.Msg.DISABLE_BLOCK = "Désactiver le bloc"; -Blockly.Msg.DUPLICATE_BLOCK = "Dupliquer"; -Blockly.Msg.ENABLE_BLOCK = "Activer le bloc"; -Blockly.Msg.EXPAND_ALL = "Développer les blocs"; -Blockly.Msg.EXPAND_BLOCK = "Développer le bloc"; -Blockly.Msg.EXTERNAL_INPUTS = "Entrées externes"; -Blockly.Msg.HELP = "Aide"; -Blockly.Msg.INLINE_INPUTS = "Entrées en ligne"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "créer une liste vide"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Renvoyer une liste, de longueur 0, ne contenant aucun enregistrement"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "liste"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Ajouter, supprimer, ou réordonner les sections pour reconfigurer ce bloc de liste."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "créer une liste avec"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Ajouter un élément à la liste."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Créer une liste avec un nombre quelconque d’éléments."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "premier"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# depuis la fin"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "obtenir"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "obtenir et supprimer"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "dernier"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aléatoire"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "supprimer"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Renvoie le premier élément dans une liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Renvoie l’élément à la position indiquée dans une liste. #1 est le dernier élément."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Renvoie l’élément à la position indiquée dans une liste. #1 est le premier élément."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Renvoie le dernier élément dans une liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Renvoie un élément au hasard dans une liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Supprime et renvoie le premier élément dans une liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Supprime et renvoie l’élément à la position indiquée dans une liste. #1 est le dernier élément."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Supprime et renvoie l’élément à la position indiquée dans une liste. #1 est le premier élément."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Supprime et renvoie le dernier élément dans une liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Supprime et renvoie un élément au hasard dans une liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Supprime le premier élément dans une liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Supprime l’élément à la position indiquée dans une liste. #1 est le dernier élément."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Supprime l’élément à la position indiquée dans une liste. #1 est le premier élément."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Supprime le dernier élément dans une liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Supprime un élément au hasard dans une liste."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "jusqu’à # depuis la fin"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "jusqu’à #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "jusqu’à la fin"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "obtenir la sous-liste depuis le début"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "obtenir la sous-liste depuis # depuis la fin"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "obtenir la sous-liste depuis #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crée une copie de la partie spécifiée d’une liste."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "trouver la première occurrence de l’élément"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "trouver la dernière occurrence de l’élément"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Renvoie l’index de la première/dernière occurrence de l’élément dans la liste. Renvoie 0 si le texte n’est pas trouvé."; -Blockly.Msg.LISTS_INLIST = "dans la liste"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 est vide"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Renvoie vrai si la liste est vide."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "longueur de %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Renvoie la longueur d’une liste."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "créer une liste avec l’élément %1 répété %2 fois"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Crée une liste consistant en la valeur fournie répétée le nombre de fois indiqué."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "comme"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "insérer en"; -Blockly.Msg.LISTS_SET_INDEX_SET = "mettre"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Insère l’élément au début d’une liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Insère l’élément à la position indiquée dans une liste. #1 est le dernier élément."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Insère l’élément à la position indiquée dans une liste. #1 est le premier élément."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Ajouter l’élément à la fin d’une liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Insère l’élément au hasard dans une liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Fixe le premier élément dans une liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Fixe l’élément à la position indiquée dans une liste. #1 est le dernier élément."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Fixe l’élément à la position indiquée dans une liste. #1 est le premier élément."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Fixe le dernier élément dans une liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Fixe un élément au hasard dans une liste."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "créer une liste depuis le texte"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "créer un texte depuis la liste"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Réunir une liste de textes en un seul, en les séparant par un séparateur."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Couper un texte en une liste de textes, en coupant à chaque séparateur."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "avec le séparateur"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "faux"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Renvoie soit vrai soit faux."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "vrai"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Renvoyer vrai si les deux entrées sont égales."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Renvoyer vrai si la première entrée est plus grande que la seconde."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Renvoyer vrai si la première entrée est plus grande ou égale à la seconde."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Renvoyer vrai si la première entrée est plus petite que la seconde."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Renvoyer vrai si la première entrée est plus petite ou égale à la seconde."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Renvoyer vrai si les deux entrées ne sont pas égales."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "pas %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Renvoie vrai si l’entrée est fausse. Renvoie faux si l’entrée est vraie."; -Blockly.Msg.LOGIC_NULL = "nul"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Renvoie nul."; -Blockly.Msg.LOGIC_OPERATION_AND = "et"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "ou"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Renvoyer vrai si les deux entrées sont vraies."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Renvoyer vrai si au moins une des entrées est vraie."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "si faux"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "si vrai"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Vérifier la condition dans 'test'. Si elle est vraie, renvoie la valeur 'si vrai' ; sinon renvoie la valeur 'si faux'."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Renvoie la somme des deux nombres."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Renvoie le quotient des deux nombres."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Renvoie la différence des deux nombres."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Renvoie le produit des deux nombres."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Renvoie le premier nombre élevé à la puissance du second."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "incrémenter %1 de %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Ajouter un nombre à la variable '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Renvoie une des constantes courantes : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ou ∞ (infini)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "contraindre %1 entre %2 et %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Contraindre un nombre à être entre les limites spécifiées (incluses)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "est divisible par"; -Blockly.Msg.MATH_IS_EVEN = "est pair"; -Blockly.Msg.MATH_IS_NEGATIVE = "est négatif"; -Blockly.Msg.MATH_IS_ODD = "est impair"; -Blockly.Msg.MATH_IS_POSITIVE = "est positif"; -Blockly.Msg.MATH_IS_PRIME = "est premier"; -Blockly.Msg.MATH_IS_TOOLTIP = "Vérifier si un nombre est pair, impair, premier, entier, positif, négatif, ou s’il est divisible par un certain nombre. Renvoie vrai ou faux."; -Blockly.Msg.MATH_IS_WHOLE = "est entier"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "reste de %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Renvoyer le reste de la division des deux nombres."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un nombre."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "moyenne de la liste"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maximum de la liste"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "médiane de la liste"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimum de la liste"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "majoritaires de la liste"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "élément aléatoire de la liste"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "écart-type de la liste"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "somme de la liste"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Renvoyer la moyenne (arithmétique) des valeurs numériques dans la liste."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Renvoyer le plus grand nombre dans la liste."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Renvoyer le nombre médian dans la liste."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Renvoyer le plus petit nombre dans la liste."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Renvoyer une liste des élément(s) le(s) plus courant(s) dans la liste."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Renvoyer un élément dans la liste au hasard."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Renvoyer l’écart-type de la liste."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Renvoyer la somme de tous les nombres dans la liste."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "fraction aléatoire"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Renvoyer une fraction aléatoire entre 0.0 (inclus) et 1.0 (exclus)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "entier aléatoire entre %1 et %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Renvoyer un entier aléatoire entre les deux limites spécifiées, incluses."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arrondir"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arrondir à l’inférieur"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arrondir au supérieur"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Arrondir un nombre au-dessus ou au-dessous."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolu"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "racine carrée"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Renvoie la valeur absolue d’un nombre."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Renvoie e à la puissance d’un nombre."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Renvoie le logarithme naturel d’un nombre."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Renvoie le logarithme base 10 d’un nombre."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Renvoie l’opposé d’un nombre"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Renvoie 10 à la puissance d’un nombre."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Renvoie la racine carrée d’un nombre."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Renvoie l’arccosinus d’un nombre."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Renvoie l’arcsinus d’un nombre."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Renvoie l’arctangente d’un nombre."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Renvoie le cosinus d’un angle en degrés (pas en radians)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Renvoie le sinus d’un angle en degrés (pas en radians)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Renvoie la tangente d’un angle en degrés (pas en radians)."; -Blockly.Msg.ME = "Moi"; -Blockly.Msg.NEW_VARIABLE = "Nouvelle variable…"; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nom de la nouvelle variable :"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "autoriser les ordres"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "avec :"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "http://fr.wikipedia.org/wiki/Proc%C3%A9dure_%28informatique%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Exécuter la fonction '%1' définie par l’utilisateur."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Exécuter la fonction '%1' définie par l’utilisateur et utiliser son résultat."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "avec :"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Créer '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "faire quelque chose"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "à"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crée une fonction sans sortie."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "retour"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crée une fonction avec une sortie."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Attention : Cette fonction a des paramètres en double."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Surligner la définition de la fonction"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Si une valeur est vraie, alors renvoyer une seconde valeur."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Attention : Ce bloc pourrait n’être utilisé que dans une définition de fonction."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nom de l’entrée :"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Ajouter une entrée à la fonction."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entrées"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Ajouter, supprimer, ou réarranger les entrées de cette fonction."; -Blockly.Msg.REMOVE_COMMENT = "Supprimer un commentaire"; -Blockly.Msg.RENAME_VARIABLE = "Renommer la variable…"; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Renommer toutes les variables '%1' en :"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "ajouter le texte"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "à"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Ajouter du texte à la variable '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "en minuscules"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "en Majuscule Au Début De Chaque Mot"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "en MAJUSCULES"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Renvoyer une copie du texte dans une autre casse."; -Blockly.Msg.TEXT_CHARAT_FIRST = "obtenir la première lettre"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "obtenir la lettre # depuis la fin"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "obtenir la lettre #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "dans le texte"; -Blockly.Msg.TEXT_CHARAT_LAST = "obtenir la dernière lettre"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "obtenir une lettre au hasard"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Renvoie la lettre à la position indiquée."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Ajouter un élément au texte."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "joindre"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Ajouter, supprimer, ou réordonner des sections pour reconfigurer ce bloc de texte."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "jusqu’à la lettre # depuis la fin"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "jusqu’à la lettre #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "jusqu’à la dernière lettre"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "dans le texte"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "obtenir la sous-chaîne depuis la première lettre"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "obtenir la sous-chaîne depuis la lettre # depuis la fin"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "obtenir la sous-chaîne depuis la lettre #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Renvoie une partie indiquée du texte."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "dans le texte"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "trouver la première occurrence de la chaîne"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "trouver la dernière occurrence de la chaîne"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Renvoie l’index de la première/dernière occurrence de la première chaîne dans la seconde. Renvoie 0 si la chaîne n’est pas trouvée."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 est vide"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Renvoie vrai si le texte fourni est vide."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "créer le texte avec"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Créer un morceau de texte en agrégeant un nombre quelconque d’éléments."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "longueur de %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Renvoie le nombre de lettres (espaces compris) dans le texte fourni."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "afficher %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Afficher le texte, le nombre ou une autre valeur spécifié."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Demander un nombre à l’utilisateur."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Demander un texte à l’utilisateur."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "invite pour un nombre avec un message"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "invite pour un texte avec un message"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Une lettre, un mot ou une ligne de texte."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "supprimer les espaces des deux côtés"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "supprimer les espaces du côté gauche"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "supprimer les espaces du côté droit"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Renvoyer une copie du texte avec les espaces supprimés d’un bout ou des deux."; -Blockly.Msg.TODAY = "Aujourd'hui"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "élément"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Créer 'fixer %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Renvoie la valeur de cette variable."; -Blockly.Msg.VARIABLES_SET = "fixer %1 à %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Créer 'obtenir %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Fixe cette variable pour qu’elle soit égale à la valeur de l’entrée."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/he.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/he.js deleted file mode 100644 index b8673ca..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/he.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.he'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "הוסף תגובה"; -Blockly.Msg.AUTH = "בבקשה נא לאשר את היישום הזה כדי לאפשר לעבודה שלך להישמר וכדי לאפשר את השיתוף על ידיך."; -Blockly.Msg.CHANGE_VALUE_TITLE = "שנה ערך:"; -Blockly.Msg.CHAT = "שוחח עם משתף פעולה שלך על-ידי הקלדה בתיבה זו!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "צמצם קטעי קוד"; -Blockly.Msg.COLLAPSE_BLOCK = "צמצם קטע קוד"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "צבע 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "צבע 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "יחס"; -Blockly.Msg.COLOUR_BLEND_TITLE = "ערבב"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "מערבב שני צבעים יחד עם יחס נתון(0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "http://he.wikipedia.org/wiki/%D7%A6%D7%91%D7%A2"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "בחר צבע מן הצבעים."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "צבע אקראי"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "בחר צבא אקראי."; -Blockly.Msg.COLOUR_RGB_BLUE = "כחול"; -Blockly.Msg.COLOUR_RGB_GREEN = "ירוק"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "אדום"; -Blockly.Msg.COLOUR_RGB_TITLE = "צבע עם"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "צור צבע עם הסכום המצוין של אדום, ירוק וכחול. כל הערכים חייבים להיות בין 0 ל100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "צא מהלולאה"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "המשך עם האיטרציה הבאה של הלולאה"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "צא אל מחוץ ללולאה הכוללת."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "דלג על שאר הלולאה והמשך עם האיטרציה הבאה."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "אזהרה: בלוק זה עשוי לשמש רק בתוך לולאה."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "לכל פריט %1 ברשימה %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "לכל פריט ברשימה, להגדיר את המשתנה '%1' לפריט הזה, ולאחר מכן לעשות כמה פעולות."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "תספור עם %1 מ- %2 ל- %3 עד- %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; // untranslated -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "תוסיף תנאי לבלוק If."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "לסיום, כל התנאים תקפים לגבי בלוק If."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "תוסיף, תמחק, או תסדר מחדש כדי להגדיר מחדש את הבלוק If."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "אחרת"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "אחרת אם"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "אם"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "אם ערך נכון, לבצע כמה פעולות."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "אם הערך הוא אמת, לבצע את הבלוק הראשון של הפעולות. אחרת, לבצע את הבלוק השני של הפעולות."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "אם הערך הראשון הוא אמת, לבצע את הבלוק הראשון של הפעולות. אחרת, אם הערך השני הוא אמת, לבצע את הבלוק השני של הפעולות."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "אם הערך הראשון הוא אמת, לבצע את הבלוק הראשון של הפעולות. אחרת, אם הערך השני הוא אמת, לבצע את הבלוק השני של הפעולות. אם אף אחד מהם אינו נכון, לבצע את הבלוק האחרון של הפעולות."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; // untranslated -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "תעשה"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "חזור על הפעולה %1 פעמים"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "לעשות כמה פעולות מספר פעמים."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "חזור עד ש..."; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "חזור כל עוד"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "בזמן שהערך שווה לשגוי, תעשה מספר חישובים."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "כל עוד הערך הוא אמת, לעשות כמה פעולות."; -Blockly.Msg.DELETE_BLOCK = "מחק קטע קוד"; -Blockly.Msg.DELETE_X_BLOCKS = "מחק %1 קטעי קוד"; -Blockly.Msg.DISABLE_BLOCK = "נטרל קטע קוד"; -Blockly.Msg.DUPLICATE_BLOCK = "שכפל"; -Blockly.Msg.ENABLE_BLOCK = "הפעל קטע קוד"; -Blockly.Msg.EXPAND_ALL = "הרחב קטעי קוד"; -Blockly.Msg.EXPAND_BLOCK = "הרחב קטע קוד"; -Blockly.Msg.EXTERNAL_INPUTS = "קלטים חיצוניים"; -Blockly.Msg.HELP = "עזרה"; -Blockly.Msg.INLINE_INPUTS = "קלטים פנימיים"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "צור רשימה ריקה"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "החזר רשימה,באורך 0, המכילה רשומות נתונים"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "רשימה"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "תוסיף, תמחק, או תסדר מחדש כדי להגדיר מחדש את הבלוק If."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "צור רשימה עם"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "הוסף פריט לרשימה."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "צור רשימה עם כל מספר של פריטים."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "ראשון"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# מהסוף"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "לקבל"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "קבל ומחק"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "אחרון"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "אקראי"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "הסרה"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "מחזיר את הפריט הראשון ברשימה."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "מחזיר פריט במיקום שצוין ברשימה. #1 הוא הפריט האחרון."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "מחזיר פריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "מחזיר את הפריט האחרון ברשימה."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "מחזיר פריט אקראי מהרשימה."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "מסיר ומחזיר את הפריט הראשון ברשימה."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "מסיר ומחזיר את הפריט במיקום שצוין ברשימה. #1 הוא הפריט האחרון."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "מסיר ומחזיר את הפריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "מסיר ומחזיר את הפריט האחרון ברשימה."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "מחק והחזר פריט אקראי מהרשימה."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "הסר את הפריט הראשון ברשימה."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "מחזיר פריט במיקום שצוין ברשימה. #1 הוא הפריט האחרון."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "מחזיר פריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "הסר את הפריט הראשון ברשימה."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "הסר פריט אקראי ברשימה."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "ל # מהסוף"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "ל #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "לאחרון"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "לקבל חלק מהרשימה החל מהתחלה"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "לקבל חלק מהרשימה החל מ-# עד הסוף"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "לקבל חלק מהרשימה החל מ-#"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "יוצרת עותק של חלק מסוים מהרשימה."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "מחזירה את המיקום הראשון של פריט ברשימה"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "מחזירה את המיקום האחרון של פריט ברשימה"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "מחזירה את האינדקס של המופע ראשון/אחרון של הפריט ברשימה. מחזירה 0 אם טקסט אינו נמצא."; -Blockly.Msg.LISTS_INLIST = "ברשימה"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 הוא ריק"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "מחזיר אמת אם הרשימה ריקה."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "אורכו של %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "מחזירה את האורך של רשימה."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "ליצור רשימה עם הפריט %1 %2 פעמים"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "יוצר רשימה המורכבת מהערך נתון חוזר מספר פעמים שצוין."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "כמו"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "הכנס ב"; -Blockly.Msg.LISTS_SET_INDEX_SET = "הגדר"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "מכניס את הפריט בתחילת רשימה."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "מכניס את הפריט במיקום שצוין ברשימה. #1 הוא הפריט האחרון."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "מכניס את הפריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "מוסיף את הפריט בסוף רשימה."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "הוסף פריט באופן אקראי ברשימה."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "מגדיר את הפריט הראשון ברשימה."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "מגדיר את הפריט במיקום שצוין ברשימה. #1 הוא הפריט האחרון."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "מגדיר את הפריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "מגדיר את הפריט האחרון ברשימה."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "מגדיר פריט אקראי ברשימה."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "יצירת רשימה מטקסט"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "יצירת טקסט מרשימה"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "שגוי"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "תחזיר אם נכון או אם שגוי."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "נכון"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "תחזיר נכון אם שני הקלטים שווים אחד לשני."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "תחזיר נכון אם הקלט הראשון גדול יותר מהקלט השני."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "תחזיר נכון אם הקלט הראשון גדול יותר או שווה לכניסה השנייה."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "תחזיר אמת (true) אם הקלט הראשון הוא קטן יותר מאשר הקלט השני."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "תחזיר אמת אם הקלט הראשון הוא קטן יותר או שווה לקלט השני."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "תחזיר אמת אם שני הקלטים אינם שווים זה לזה."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "לא %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returns true if the input is false. Returns false if the input is true."; // untranslated -Blockly.Msg.LOGIC_NULL = "null"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "תחזיר ריק."; -Blockly.Msg.LOGIC_OPERATION_AND = "ו"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "או"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "תחזיר נכון אם שני הקלטים נכונים."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "תחזיר נכון אם מתקיים לפחות אחד מהקלטים נכונים."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "בדיקה"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "אם שגוי"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "אם נכון"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "בדוק את התנאי ב'מבחן'. אם התנאי נכון, תחזיר את הערך 'אם נכון'; אחרת תחזיר את הערך 'אם שגוי'."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://he.wikipedia.org/wiki/ארבע_פעולות_החשבון"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "תחזיר את סכום שני המספרים."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers."; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "החזרת ההפרש בין שני מספרים."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "החזרת תוצאת הכפל בין שני מספרים."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; // untranslated -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated -Blockly.Msg.MATH_CHANGE_TITLE = "change %1 by %2"; // untranslated -Blockly.Msg.MATH_CHANGE_TOOLTIP = "הוסף מספר למשתנה '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "מתחלק ב"; -Blockly.Msg.MATH_IS_EVEN = "זוגי"; -Blockly.Msg.MATH_IS_NEGATIVE = "שלילי"; -Blockly.Msg.MATH_IS_ODD = "אי-זוגי"; -Blockly.Msg.MATH_IS_POSITIVE = "חיובי"; -Blockly.Msg.MATH_IS_PRIME = "ראשוני"; -Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated -Blockly.Msg.MATH_IS_WHOLE = "שלם"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated -Blockly.Msg.MATH_MODULO_TITLE = "שארית החילוק %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "החזרת השארית מחלוקת שני המספרים."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; // untranslated -Blockly.Msg.MATH_NUMBER_TOOLTIP = "מספר."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "ממוצע של רשימה"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "מקסימום של רשימה"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "חציון של רשימה"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "מינימום של רשימה"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "שכיחי הרשימה"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "פריט אקראי מרשימה"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standard deviation of list"; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "סכום של רשימה"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Return the average (arithmetic mean) of the numeric values in the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "תחזיר את המספר הגדול ביותר ברשימה."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "תחזיר את המספר החיצוני ביותר ברשימה."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "תחזיר את המספר הקטן ביותר ברשימה."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Return a list of the most common item(s) in the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "תחזיר רכיב אקראי מרשימה."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Return the sum of all the numbers in the list."; // untranslated -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "שבר אקראי"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated -Blockly.Msg.MATH_RANDOM_INT_TITLE = "random integer from %1 to %2"; // untranslated -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; // untranslated -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; // untranslated -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "עיגול"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "עיגול למטה"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "עיגול למעלה"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "עיגול מספר למעלה או למטה."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; // untranslated -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "ערך מוחלט"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "שורש ריבועי"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "החזרת הערך המוחלט של מספר."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "החזרת הלוגריתם הטבעי של מספר."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Return the base 10 logarithm of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "החזרת הערך הנגדי של מספר."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Return the square root of a number."; // untranslated -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "acos"; -Blockly.Msg.MATH_TRIG_ASIN = "asin"; -Blockly.Msg.MATH_TRIG_ATAN = "atan"; -Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated -Blockly.Msg.MATH_TRIG_SIN = "sin"; -Blockly.Msg.MATH_TRIG_TAN = "tan"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated -Blockly.Msg.ME = "אותי"; -Blockly.Msg.NEW_VARIABLE = "משתנה חדש..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "שם המשתנה החדש:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "לאפשר פעולות"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "עם:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://he.wikipedia.org/wiki/שגרה_(תכנות)"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "להפעיל את הפונקציה המוגדרת על-ידי המשתמש '%1'."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://he.wikipedia.org/wiki/שגרה_(תכנות)"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "להפעיל את הפונקציה המוגדרת על-ידי המשתמש '%1' ולהשתמש הפלט שלה."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "עם:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "ליצור '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "לעשות משהו"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "לביצוע:"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "יצירת פונקציה ללא פלט."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "להחזיר"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "יצירת פונקציה עם פלט."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "אזהרה: לפונקציה זו יש פרמטרים כפולים."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "הדגש הגדרה של פונקציה"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "אם ערך נכון, אז להחזיר ערך שני."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "אזהרה: בלוק זה עשוי לשמש רק בתוך הגדרה של פונקציה."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "שם הקלט:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "הוסף קלט לפונקציה"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "מקורות קלט"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "הוסף, הסר או סדר מחדש קלטים לפונקציה זו"; -Blockly.Msg.REMOVE_COMMENT = "הסר הערה"; -Blockly.Msg.RENAME_VARIABLE = "שנה את שם המשתנה..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "שנה את שם כל '%1' המשתנים ל:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "הוספת טקסט"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "אל"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; // untranslated -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "לאותיות קטנות (עבור טקסט באנגלית)"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "לאותיות גדולות בתחילת כל מילה (עבור טקסט באנגלית)"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "לאותיות גדולות (עבור טקסט באנגלית)"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated -Blockly.Msg.TEXT_CHARAT_FIRST = "get first letter"; // untranslated -Blockly.Msg.TEXT_CHARAT_FROM_END = "get letter # from end"; // untranslated -Blockly.Msg.TEXT_CHARAT_FROM_START = "get letter #"; // untranslated -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in text"; // untranslated -Blockly.Msg.TEXT_CHARAT_LAST = "get last letter"; // untranslated -Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; // untranslated -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "צירוף"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; // untranslated -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "יצירת טקסט עם"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "length of %1"; // untranslated -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; // untranslated -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "הדפס %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "להדפיס טקסט, מספר או ערך אחר שצוין"; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "בקש מהמשתמש מספר."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "בקשה למשתמש להזין טקסט כלשהו."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "בקשה למספר עם הודעה"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "בקשה להזנת טקסט עם הודעה"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated -Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; // untranslated -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "למחוק רווחים משני הקצוות"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "למחוק רווחים מימין"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "למחוק רווחים משמאל"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "להחזיר עותק של הטקסט לאחר מחיקת רווחים מאחד או משני הקצוות."; -Blockly.Msg.TODAY = "היום"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "פריט"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "ליצור 'הגדר %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "להחזיר את הערך של משתנה זה."; -Blockly.Msg.VARIABLES_SET = "הגדר %1 ל- %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "ליצור 'קרא %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "מגדיר משתנה זה להיות שווה לקלט."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/hrx.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/hrx.js deleted file mode 100644 index 4aee762..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/hrx.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.hrx'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Kommentar hinzufüche"; -Blockly.Msg.AUTH = "Weart ännre:"; -Blockly.Msg.CHANGE_VALUE_TITLE = "Neie Variable..."; -Blockly.Msg.CHAT = "Sprech mit unsrem Mitoorweiter doorrich renschreiwe von Text hier in den Kaste!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Blocke zusammerfalte"; -Blockly.Msg.COLLAPSE_BLOCK = "Block zusammerfalte"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "Farreb 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "mit Farreb 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "im Verhältniss"; -Blockly.Msg.COLOUR_BLEND_TITLE = "misch"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Vermischt 2 Farwe mit konfigurierbare Farrebverhältniss (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://hrx.wikipedia.org/wiki/Farreb"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Wähl en Farreb von der Palett."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "zufälliche Farwe"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Wähl en Farreb noh dem Zufallsprinzip."; -Blockly.Msg.COLOUR_RGB_BLUE = "blau"; -Blockly.Msg.COLOUR_RGB_GREEN = "grün"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "rot"; -Blockly.Msg.COLOUR_RGB_TITLE = "Färreb mit"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Kreiere ene Farreb mit sellrbst definierte rot, grün und blau Wearte. All Wearte müsse zwischich 0 und 100 liehe."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "ausbreche aus der Schleif"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "mit der nächste Iteration fortfoohre aus der Schleifa"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Die umgebne Schleif beenne."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Die Oonweisung abbreche und mit der nächste Schleifiteration fortfoohre."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warnung: Die block sollt nuar in en Schleif verwennet sin."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "Für Weart %1 aus der List %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Füahr en Oonweisung für jede Weart in der List aus und setzt dabei die Variable \"%1\" uff den aktuelle List Weart."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "Zähl %1 von %2 bis %3 mit %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Zähl die Variable \"%1\" von enem Startweart bis zu enem Zielweart und füahrefür jede Weart en Oonweisung aus."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "En weitre Bedingung hinzufüche."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "En orrer Bedingung hinzufüche, füahrt en Oonweisung aus falls ken Bedingung zutrifft."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Hinzufüche, entferne orrer sortiere von Sektione"; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "orrer"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "orrer wenn"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "wenn"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Wenn en Bedingung woahr (true) ist, dann füahr en Oonweisung aus."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Wenn en Bedingung woahr (true) ist, dann füahr die earscht Oonweisung aus. Ansonscht füahr die zwooite Oonweisung aus."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Wenn der erschte Bedingung woahr (true) ist, dann füahr die erschte Oonweisung aus. Orrer wenn die zwooite Bedingung woahr (true) ist, dann füahr die zwooite Oonweisung aus."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Wenn der erscht Bedingung woahr (true) ist, dann füahr die erschte Oonweisung aus. Orrer wenn die zwooite Bedingung woahr (true) ist, dann füahr die zwooite Oonweisung aus. Falls ken der beide Bedingungen woahr (true) ist, dann füahr die dritte Oonweisung aus."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://hrx.wikipedia.org/wiki/For-Schleif"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "mach"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "wiederhol %1 mol"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "En Oonweisung meahrfach ausführe."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "Repetiere bis"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "Repetier solang"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Füahr die Oonweisung solang aus wie die Bedingung falsch (false) ist."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Füahr die Oonweisung solang aus wie die Bedingung woahr (true) ist."; -Blockly.Msg.DELETE_BLOCK = "Block lösche"; -Blockly.Msg.DELETE_X_BLOCKS = "Block %1 lösche"; -Blockly.Msg.DISABLE_BLOCK = "Block deaktivieren"; -Blockly.Msg.DUPLICATE_BLOCK = "Kopieren"; -Blockly.Msg.ENABLE_BLOCK = "Block aktivieren"; -Blockly.Msg.EXPAND_ALL = "Blocke expandiere"; -Blockly.Msg.EXPAND_BLOCK = "Block entfalte"; -Blockly.Msg.EXTERNAL_INPUTS = "External Inputsexterne Ingänge"; -Blockly.Msg.HELP = "Hellef"; -Blockly.Msg.INLINE_INPUTS = "interne Ingänge"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "Generier/erzeich en leear List"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Generier/erzeich en leear List ohne Inhalt."; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "List"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Hinzufüche, entferne und sortiere von Elemente."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "Erzeich List mit"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "En Element zur List hinzufüche."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Generier/erzeich en List mit konfigurierte Elemente."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "earste"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "#te von hinne"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "Nehm"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "Nehm und entfern"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "letzte"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "zufälliches"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "Entfern"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Extrahiert das earste Element von der List."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Extrahiert das #1te Element der List sei End."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Extrahiert das #1te Element von der List."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Extrahiert das letzte Element von der List."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Extrahiert en zufälliches Element von der List."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Extrahiert und entfernt das earste Element von der List."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Extrahiert und entfernt das #1te Element der List sei End."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Extrahiert und entfernt das #1te Element von der List."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Extrahiert und entfernt das letzte Element von der List."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Extrahiert und entfernt en zufälliches Element von der List."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Entfernt das earste Element von der List."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Entfernt das #1te Element der List sei End."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Entfernt das #1te Element von der List."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Entfernt das letzte Element von der List."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Entfernt en zufälliches Element von der List."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "zu # vom End"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "zu #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "zum Letzte"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "hol Unnerliste vom Earste"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "hol Unnerliste von # vom End"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "hol Unnerlist von #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Generiert en Kopie von en definierte Tel von en List."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "Such earstes Voarkommniss"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "Such letztes Voarkommniss"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Sucht die Position (index) von en Element in der List Gebt 0 zurück wenn nixs gefunn woard."; -Blockly.Msg.LISTS_INLIST = "in der List"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ist leear?"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Ist woahr (true), wenn die List leear ist."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "länge %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Die Oonzoohl von Elemente in der List."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "Erzich List mit Element %1 wiederhol das %2 mol"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Erzeicht en List mit en variable Oonzoohl von Elemente"; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "uff"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "tue ren setz an"; -Blockly.Msg.LISTS_SET_INDEX_SET = "setz"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Tut das Element an en Oonfang von en List ren setze."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Tut das Element ren setze an en definierte Position an en List. #1 ist das letzte Element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Tut das Element ren setze an en definierte Position an en List. #1 ist das earschte Element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Oonhängt das Element zu en List sei End."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Tut das Element zufällich an en List ren setze."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list.Setzt das earschte Element an en list."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Setzt das Element zu en definierte Position an en List. #1 ist das letzte Element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Setzt das Element zu en definierte Stell in en List. #1 ist das earschte Element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Setzt das letzte Element an en List."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setzt en zufälliches Element an en List."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falsch"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Ist entweder woahr (true) orrer falsch (false)"; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "woahr"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://hrx.wikipedia.org/wiki/Vergleich_%28Zahlen%29"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Ist woahr (true) wenn beide Wearte identisch sind."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Ist woahr (true) wenn der erschte Weart grösser als der zwooite Weart ist."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Ist woahr (true) wenn der erschte Weart grösser als orrer gleich gross wie zwooite Weart ist."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Ist woahr (true) wenn der earschte Weart klener als der zwooite Weart ist."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Ist woahr (true) wenn der earscht Weart klener als orrer gleich gross wie zwooite Weart ist."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Ist woahr (true) wenn beide Wearte unnerschiedlich sind."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "net %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Ist woahr (true) wenn der Ingäweweart falsch (false) ist. Ist falsch (false) wenn der Ingäweweart woahr (true) ist."; -Blockly.Msg.LOGIC_NULL = "null"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Is NULL."; -Blockly.Msg.LOGIC_OPERATION_AND = "und"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "orrer"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Ist woahr (true) wenn beide Wearte woahr (true) sind."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Ist woahr (true) wenn en von der beide Wearte woahr (true) ist."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "wenn falsch"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "wenn woahr"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Üwerprüft en Bedingung \"test\". Wenn die Bedingung woahr ist weerd der \"wenn woahr\" Weart zurückgeb, annerfalls der \"wenn falsch\" Weart"; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://hrx.wikipedia.org/wiki/Grundrechenoort"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Ist die Summe zwooier Wearte."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Ist der Quotient zwooier Wearte."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Ist die Differenz zwooier Wearte."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Ist das Produkt zwooier Wearte."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Ist der earschte Weart potenziert mit dem zoiten Weart."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://hrx.wikipedia.org/wiki/Inkrement_und_Dekrement"; -Blockly.Msg.MATH_CHANGE_TITLE = "mach höcher / erhöhe %1 um %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Addiert en Weart zur Variable \"%1\" hinzu."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://hrx.wikipedia.org/wiki/Mathematische_Konstante"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Mathematische Konstante wie: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) oder ∞ (unendlich)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "begrenze %1 von %2 bis %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Begrenzt den Weartebereich mittels von / bis Wearte. (inklusiv)"; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "ist telbar/kann getelt sin doorrich"; -Blockly.Msg.MATH_IS_EVEN = "ist grood"; -Blockly.Msg.MATH_IS_NEGATIVE = "ist negativ"; -Blockly.Msg.MATH_IS_ODD = "ist ungrood"; -Blockly.Msg.MATH_IS_POSITIVE = "ist positiv"; -Blockly.Msg.MATH_IS_PRIME = "ist en Primenzoohl"; -Blockly.Msg.MATH_IS_TOOLTIP = "Üwerprüft ob en Zoohl grood, ungrood, en Primenzoohl, ganzzoohlich, positiv, negativ orrer doorrich en zwooite Zoohl telbar ist. Gebt woahr (true) orrer falsch (false) zurück."; -Blockly.Msg.MATH_IS_WHOLE = "ganze Zoohl"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://hrx.wikipedia.org/wiki/Modulo"; -Blockly.Msg.MATH_MODULO_TITLE = "Rest von %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Der Rest noh en Division."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://hrx.wikipedia.org/wiki/Zoohl"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "En Zoohl."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "Mittelweart en List"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "Maximalweart en List"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "Median von en List"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "Minimalweart von en List"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "Restweart von en List"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "Zufallsweart von en List"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "Standart/Padrong Abweichung von en List"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "Summe von en List"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Ist der Doorrichschnittsweart von aller Wearte in en List."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Ist der grösste Weart in en List."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Ist der Zentralweart von aller Wearte in en List."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Ist der klenste Weart in en List."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Findt den am häifichste voarkommend Weart in en List. Falls ken Weart öftersch voarkomme als all annre, weard die originale List zurückgeche"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Geb en Zufallsweart aus der List zurück."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Ist die standartiesierte/padronisierte Standartabweichung/Padrongabweichung von aller Wearte in der List"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Ist die Summ aller Wearte in en List."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://hex.wikipedia.org/wiki/Zufallszoohle"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "Zufallszoohl (0.0 -1.0)"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Generier/erzeich en Zufallszoohl zwischich 0.0 (inklusiv) und 1.0 (exklusiv)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://hrx.wikipedia.org/wiki/Zufallszahlen"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "ganzoohlicher Zufallswearte zwischich %1 bis %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Generier/erzeich en ganzähliche Zufallsweart zwischich zwooi Wearte (inklusiv)."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://hrx.wikipedia.org/wiki/Runden"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "runde"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "ab runde"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "uff runde"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "En Zoohl uff orrer ab runde."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://hrx.wikipedia.org/wiki/Quadratwoorzel"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "Absolutweart"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "Quadratwoorzel"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Ist der Absolutweart von en Weart."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Ist Weart von der Exponentialfunktion von en Weart."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Ist der natüarliche Logarithmus von en Weart."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Ist der dekoodische Logarithmus von en Weart."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Negiert en Weart."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Rechnet 10 hoch Ingäbweart."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Ist die Qudratwoorzel von en Weart."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://hrx.wikipedia.org/wiki/Trigonometrie"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Ist der Arcuscosinus von en Ingabweart."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Ist der Arcussinus von en Ingäbweart."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Ist der Arcustangens von en Ingäbweart."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Ist der Cosinus von en Winkel."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Ist der Sinus von en Winkel."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Ist der Tangens von en Winkel."; -Blockly.Msg.ME = "Ich"; -Blockly.Msg.NEW_VARIABLE = "Neie Variable..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Die neie Variable sei Noome:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "mit:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://hrx.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Ruf en Funktionsblock ohne Rückgäweart uff."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://hrx.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Ruf en Funktionsblock mit Rückgäbweart uff."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "mit:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Generier/erzeich \"Uffruf %1\""; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "Funktionsblock"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "zu"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "En Funktionsblock ohne Rückgäbweart."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "geb zurück"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "En Funktionsblock mit Rückgäbweart."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warnung: die Funktionsblock hot doppelt Parameter."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Markiear Funktionsblock"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Wenn der earste Weart woahr (true) ist, Geb den zwooite Weart zurück."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warnung: Der Block därref nuar innich en Funktionsblock genutzt sin."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Markiear Funktionsblock"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Generier/erzeich \"Uffruf %1\""; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Parameter"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Variable:"; -Blockly.Msg.REMOVE_COMMENT = "Kommentar entferne"; -Blockly.Msg.RENAME_VARIABLE = "Die neie Variable sei Noome:"; -Blockly.Msg.RENAME_VARIABLE_TITLE = "All \"%1\" Variable umbenenne in:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "Text oonhänge"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "An"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Text an die Variable \"%1\" oonhänge."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "umwandle in klenbuchstoobe"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "umwandle in Wörter"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "umwandle in GROSSBUCHSTOOBE"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Wandelt Schreibweise von Texte um, in Grossbuchstoobe, Klenbuchstoobe orrer den earste Buchstoob von jedes Wort gross und die annre klen."; -Blockly.Msg.TEXT_CHARAT_FIRST = "hol earschte Buchstoob"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "hol Buchstoob # von End"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "hol Buchstoob #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in Text"; -Blockly.Msg.TEXT_CHARAT_LAST = "hol letztes Wort"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "hol zufälliches Buchstoob"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Extrahiear en Buchstoob von en spezifizierte Position."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "En Element zum Text hinzufüche."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "verbinne"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Hinzufüche, entfernne und sortiere von Elemente."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "bis #te Buchstoob von hinne"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "bis Buchstoob #te"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "bis letzte Buchstoob"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in Text"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "earschte Buchstoob"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "hol #te Buchstoob von hinne"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "hol substring Buchstoob #te"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Schickt en bestimmstes Tel von dem Text retuar."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "im Text"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "Such der Begriff sein earstes Voarkommniss"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "Suche der Begriff sein letztes Vorkommniss."; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Findt das earste / letzte Voarkommniss von en Suchbegriffes in enem Text. Gebt die Position von dem Begriff orrer 0 zurück."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ist leer?"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Ist woahr (true), wenn der Text leer ist."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "Erstell Text aus"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Erstellt en Text doorrich das verbinne von mehre Textelemente."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "läng %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Die Oonzoohl von Zeiche in enem Text. (inkl. Leerzeiche)"; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "Ausgäb %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Geb den Inhalt von en Variable aus."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Frocht den Benutzer noh en Zoohl."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Frocht den Benutzer noh enem Text."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Frächt noh Zoohl mit Hinweis"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Frocht noh Text mit Hinweis"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)https://hrx.wikipedia.org/wiki/Zeichenkette"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "En Buchstoob, Text orrer Satz."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "entfern Leerzeiche von Oonfang und End Seite"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "entferne Leerzeiche von Oonfang Seite"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "entferne Leerzeiche von End Seite von"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Entfernt Leerzeiche vom Oonfang und / orrer End von en Text."; -Blockly.Msg.TODAY = "Today"; // untranslated -Blockly.Msg.VARIABLES_DEFAULT_NAME = "Element"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Generier/erzeiche \"Schreibe %1\""; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Gebt der Variable sein Weart zurück."; -Blockly.Msg.VARIABLES_SET = "Schreib %1 zu %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Generier/erzeich \"Lese %1\""; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Setzt en Variable sei Weart."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/hu.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/hu.js deleted file mode 100644 index 89488fc..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/hu.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.hu'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Megjegyzés hozzáadása"; -Blockly.Msg.AUTH = "Kérjük, engedélyezd az alkalmazásnak munkád elmentését és megosztását."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Érték módosítása:"; -Blockly.Msg.CHAT = "Ebben a mezőben tudsz a közreműködőkkel beszélgetni!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Blokkok összecsukása"; -Blockly.Msg.COLLAPSE_BLOCK = "Blokk összecsukása"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "szín 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "szín 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "arány"; -Blockly.Msg.COLOUR_BLEND_TITLE = "színkeverés"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Két színt kever össze a megadott arányban (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://hu.wikipedia.org/wiki/Szín"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Válassz színt a palettáról."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "véletlen szín"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Véletlenszerűen kiválasztott szín."; -Blockly.Msg.COLOUR_RGB_BLUE = "kék"; -Blockly.Msg.COLOUR_RGB_GREEN = "zöld"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "vörös"; -Blockly.Msg.COLOUR_RGB_TITLE = "Szín"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Szín előállítása a megadott vörös, zöld, és kék értékekkel. Minden értéknek 0 és 100 közé kell esnie."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "befejezi az ismétlést"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "folytatja a következővel"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Megszakítja az utasítást tartalmazó ciklust."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Kihagyja a ciklus további részét, és elölről kezdi a következő elemmel."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Figyelem: Ez a blokk csak cikluson belül használható."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "minden %1 elemre a %2 listában"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "A '%1' változó minden lépésben megkapja a lista adott elemének értékét, és végrehajt vele néhány utasítást."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "számolj %1 értékével %2 és %3 között %4 lépésközzel"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "A(z) '%1' változó felveszi a kezdőérték és a végérték közötti értékeket a meghatározott lépésközzel. Eközben a meghatározott blokkokat hajtja végre."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Feltétel hozzáadása a ha blokkhoz."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Végső feltétel hozzáadása a ha blokkhoz."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "A ha blokk testreszabásához bővítsd, töröld vagy rendezd át a részeit."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "különben"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "különben ha"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "ha"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Ha a kifejezés igaz, akkor végrehajtja az utasításokat."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Ha a kifejezés igaz, akkor végrehajtja az első utasításblokkot. Különben a második utasításblokk kerül végrehajtásra."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Ha az első kifejezés igaz, akkor végrehajtja az első utasításblokkot. Különben, ha a második kifejezés igaz, akkor végrehajtja a második utasítás blokkot."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Ha az első kifejezés igaz, akkor végrehajtjuk az első utasítás blokkot. Ha a második kifejezés igaz, akkor végrehajtjuk a második utasítás blokkot. Amennyiben egyik kifejezés sem igaz, akkor az utolsó utasítás blokk kerül végrehajtásra."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://hu.wikipedia.org/wiki/Ciklus_(programoz%C3%A1s)#Sz.C3.A1ml.C3.A1l.C3.B3s_.28FOR.29_ciklus"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = ""; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "ismételd %1 alkalommal"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Megadott kódrészlet ismételt végrehajtása."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ismételd amíg nem"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ismételd amíg"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Amíg a feltétel hamis, végrehajtja az utasításokat."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Amíg a feltétel igaz, végrehajtja az utasításokat."; -Blockly.Msg.DELETE_BLOCK = "Blokk törlése"; -Blockly.Msg.DELETE_X_BLOCKS = "%1 blokk törlése"; -Blockly.Msg.DISABLE_BLOCK = "Blokk letiltása"; -Blockly.Msg.DUPLICATE_BLOCK = "Másolat"; -Blockly.Msg.ENABLE_BLOCK = "Blokk engedélyezése"; -Blockly.Msg.EXPAND_ALL = "Blokkok kibontása"; -Blockly.Msg.EXPAND_BLOCK = "Blokk kibontása"; -Blockly.Msg.EXTERNAL_INPUTS = "Külső kapcsolatok"; -Blockly.Msg.HELP = "Súgó"; -Blockly.Msg.INLINE_INPUTS = "Belső kapcsolatok"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "üres lista"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Elemeket nem tartalmazó üres listát ad eredményül"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "Lista készítés, elemek:"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Elem hozzáadása listához."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Listát készít a megadott elemekből."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "az első"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "a végétől számított"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "az elejétől számított"; -Blockly.Msg.LISTS_GET_INDEX_GET = "listából értéke"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "listából kivétele"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "az utolsó"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "bármely"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "listából törlése"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = "elemnek"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "A lista első elemét adja eredményül."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "A lista megadott sorszámú elemét adja eredményül. 1 az utolsó elemet jelenti."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "A lista megadott sorszámú elemét adja eredményül. 1 az első elemet jelenti."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "A lista utolsó elemét adja eredményül."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "A lista véletlenszerűen választott elemét adja eredményül."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Az első elem kivétele a listából."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "A megadott sorszámú elem kivétele a listából 1 az utolsó elemet jelenti."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "A megadott sorszámú elem kivétele a listából 1 az első elemet jelenti."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Az utolsó elem kivétele a listából."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Véletlenszerűen választott elem kivétele a listából."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Az első elem törlése a listából."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "A megadott sorszámú elem törlése a listából 1 az utolsó elemet jelenti."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "A megadott sorszámú elem törlése a listából 1 az első elemet jelenti."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Az utolsó elem törlése a listából."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Véletlenszerűen választott elem törlése a listából."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "és a végétől számított"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "és az elejétől számított"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "és az utolsó"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "részlistája az első"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "részlistája a végétől számított"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "részlistája az elejétől számított"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "elem között"; -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "A lista adott részéről másolat."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "listában első előfordulásaː"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "listában utolsó előfordulásaː"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "A megadtott elem eslő vagy utolsó előfordulásával tér vissza. 0 esetén nincs ilyen eleme a listának."; -Blockly.Msg.LISTS_INLIST = "A(z)"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 üres lista?"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Az eredmény igaz, ha a lista nem tartalmaz elemeket."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "%1 lista hossza"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "A lista elemszámát adja eredményül."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "Lista készítése %1 elemet %2 alkalommal hozzáadva"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "A megadtott elem felhasználásával n elemű listát készít"; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "elemkéntː"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "listába szúrd be"; -Blockly.Msg.LISTS_SET_INDEX_SET = "listába állítsd be"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Beszúrás a lista elejére."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Beszúrás a megadott sorszámú elem elé a listában. 1 az utolsó elemet jelenti."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Beszúrás a megadott sorszámú elem elé a listában. 1 az első elemet jelenti."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Beszúrás a lista végére."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Beszúrás véletlenszerűen választott elem elé a listában."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Az első elem cseréje a listában."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "A megadott sorszámú elem cseréje a listában. 1 az utolsó elemet jelenti."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "A megadott sorszámú elem cseréje a listában. 1 az első elemet jelenti."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Az utolsó elem cseréje a listában."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Véletlenszerűen választott elem cseréje a listában."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "lista készítése szövegből"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "sztring készítése listából"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "A lista elemeit összefűzi szöveggé a határoló karaktereket is felhasználva."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Listát készít a határoló karaktereknél törve a szöveget."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "határoló karakter"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "hamis"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Igaz, vagy hamis érték"; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "igaz"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://hu.wikipedia.org/wiki/Egyenl%C5%91tlens%C3%A9g"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Igaz, ha a kifejezés két oldala egyenlő."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Igaz, ha a bal oldali kifejezés nagyobb, mint a jobb oldali."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Igaz, ha a bal oldali kifejezés nagyobb vagy egyenlő, mint a jobb oldali."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Igaz, ha a bal oldali kifejezés kisebb, mint a jobb oldali."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Igaz, ha a bal oldali kifejezés kisebb vagy egyenlő, mint a jobb oldali."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Igaz, ha a kifejezés két oldala nem egyenlő.."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "nem %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Igaz, ha a kifejezés hamis. Hamis, ha a kifejezés igaz."; -Blockly.Msg.LOGIC_NULL = "null"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "null érték."; -Blockly.Msg.LOGIC_OPERATION_AND = "és"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "vagy"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Igaz, ha mindkét kifejezés igaz."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Igaz, ha legalább az egyik kifejezés igaz."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "vizsgáld meg:"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "érték, ha hamis:"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "érték, ha igaz:"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Kiértékeli a megvizsgálandó kifejezést. Ha a kifejezés igaz, visszatér az \"érték, ha igaz\" értékkel, különben az \"érték, ha hamis\" értékkel."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://hu.wikipedia.org/wiki/Matematikai_m%C5%B1velet"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Két szám összege."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Két szám hányadosa."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Két szám különbsége."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Két szám szorzata."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Az első számnak a második számmal megegyező hatványa."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://hu.wikipedia.org/wiki/JavaScript#Aritmetikai_oper.C3.A1torok"; -Blockly.Msg.MATH_CHANGE_TITLE = "növeld %1 értékét %2 -vel"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "A \"%1\" változó értékének növelése egy számmal."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://hu.wikipedia.org/wiki/Matematikai_konstans"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Ismert matematikai konstans: π (3.141…), e (2.718…), φ (1.618…), gyök(2) (1.414…), gyök(½) (0.707…), vagy ∞ (végtelen)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "korlátozd %1 -t %2 és %3 közé"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Egy változó értékének korlátozása a megadott zárt intervallumra."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "-nek osztója"; -Blockly.Msg.MATH_IS_EVEN = "páros"; -Blockly.Msg.MATH_IS_NEGATIVE = "negatív"; -Blockly.Msg.MATH_IS_ODD = "páratlan"; -Blockly.Msg.MATH_IS_POSITIVE = "pozitív"; -Blockly.Msg.MATH_IS_PRIME = "prím"; -Blockly.Msg.MATH_IS_TOOLTIP = "Ellenőrzi, hogy a szám páros, páratlan, prím, egész, pozitív vagy negatív-e, illetve osztható-e a másodikkal. Igaz, vagy hamis értéket ad eredményül."; -Blockly.Msg.MATH_IS_WHOLE = "egész"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://hu.wikipedia.org/wiki/Eg%C3%A9szr%C3%A9sz#Als.C3.B3_eg.C3.A9szr.C3.A9sz"; -Blockly.Msg.MATH_MODULO_TITLE = "%1 ÷ %2 maradéka"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Az egész osztás maradékát adja eredméynül."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://hu.wikipedia.org/wiki/Sz%C3%A1m"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Egy szám."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "lista elemeinek átlaga"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "lista legnagyobb eleme"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "lista mediánja"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "lista legkisebb eleme"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "lista módusza"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "lista véletlen eleme"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "lista elemeinek szórása"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "lista elemeinek összege"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "A lista elemeinek átlagát adja eredményül."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "A lista legnagyobb elemét adja vissza."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "A lista elemeinek mediánját adja eredményül."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "A lista legkisebb elemét adja vissza."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "A lista elemeinek móduszát adja eredményül."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "A lista egy véletlen elemét adja eredményül."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "A lista elemeinek szórását adja eredményül."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "A lista elemeinek összegét adja eredményül."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://hu.wikipedia.org/wiki/V%C3%A9letlen"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "véletlen tört"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Véletlen tört érték 0.0 és 1.0 között."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://hu.wikipedia.org/wiki/V%C3%A9letlen"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "véletlen egész szám %1 között %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Véletlen egész szám a megadott zárt intervallumon belül."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://hu.wikipedia.org/wiki/Eg%C3%A9szr%C3%A9sz#Kerek.C3.ADt.C3.A9s"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "kerekítsd"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "kerekítsd lefelé"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "kerekítsd felfelé"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Egy szám kerekítése felfelé vagy lefelé."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://hu.wikipedia.org/wiki/Gy%C3%B6kvon%C3%A1s"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "abszolútérték"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "négyzetgyök"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "A szám abszolútértéke."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Az e megadott számú hatványa."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "A szám természetes alapú logaritmusa."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "A szám 10-es alapú logaritmusa."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "A szám -1 szerese."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "A 10 megadott számú hatványa."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "A szám négyzetgyöke."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://hu.wikipedia.org/wiki/Sz%C3%B6gf%C3%BCggv%C3%A9nyek"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "A fokban megadott szög arkusz koszinusz értéke."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "A fokban megadott szög arkusz szinusz értéke."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "A fokban megadott szög arkusz tangens értéke."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "A fokban megadott szög koszinusz értéke."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "A fokban megadott szög szinusz értéke."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "A fokban megadott szög tangens értéke."; -Blockly.Msg.ME = "Én"; -Blockly.Msg.NEW_VARIABLE = "Új változó..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Az új változó neve:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "."; -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "utasítások engedélyezése"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "paraméterlistaː"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://hu.wikipedia.org/wiki/F%C3%BCggv%C3%A9ny_(programoz%C3%A1s)"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Végrehajtja az eljárást."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://hu.wikipedia.org/wiki/F%C3%BCggv%C3%A9ny_(programoz%C3%A1s)"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Meghívja a függvényt."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "paraméterlistaː"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Create \"do %1\""; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "név"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "Eljárás"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Eljárás (nem ad vissza eredményt)."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "eredménye"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Függvény eredménnyel."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Figyelem: Az eljárásban azonos elnevezésű paramétert adtál meg."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Függvénydefiníció kiemelése"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Ha az érték igaz, akkor visszatér a függvény értékével."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Figyelem: Ez a blokk csak függvénydefiníción belül használható."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "változó:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Bemenet hozzáadása a függvényhez."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "paraméterek"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Bemenetek hozzáadása, eltávolítása vagy átrendezése ehhez a függvényhez."; -Blockly.Msg.REMOVE_COMMENT = "Megjegyzés törlése"; -Blockly.Msg.RENAME_VARIABLE = "Változó átnevezése..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Minden \"%1\" változó átnevezése erre:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "szövegéhez fűzd hozzá"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "A"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Szöveget fűz a \"%1\" változó értékéhez."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "kisbetűs"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "Címként Formázott"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "NAGYBETŰS"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; -Blockly.Msg.TEXT_CHARAT_FIRST = "első"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "hátulról"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "elölről"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "A"; -Blockly.Msg.TEXT_CHARAT_LAST = "utolsó"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "véletlen"; -Blockly.Msg.TEXT_CHARAT_TAIL = "karaktere"; -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "A szöveg egy megadott karakterét adja eredményül."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Elem hozzáfűzése a szöveghez."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "fűzd össze"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Összefűzéssel, törléssel vagy rendezéssel kapcsolato sblokkok szöveg szerkesztéséhez."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "betűtől a hátulról számított"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "betűtől a(z)"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "betűtől az utolsó"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "a"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "szövegben válaszd ki az első"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "szövegben válaszd ki a hátulról a(z)"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "szövegben válaszd ki a(z)"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = "betűig tartó betűsort"; -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "A megadott szövegrészletet adja eredményül."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "A(z)"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "szövegben az első előfordulásának helye"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "szövegben az utolsó előfordulásának helye"; -Blockly.Msg.TEXT_INDEXOF_TAIL = "szövegnek"; -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "A keresett szöveg első vagy utolsó előfordulásával tér vissza. 0 esetén a szövegrészlet nem található."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 üres"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Igaz, ha a vizsgált szöveg hossza 0."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "fűzd össze"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Tetszőleges számú szövegrészletet fűz össze egybefüggő szöveggé."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "%1 hossza"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "A megadott szöveg karaktereinek számát adja eredményül (beleértve a szóközöket)."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "Üzenet %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Megejelníti a megadott kaakterláncot üzenetként a képernyőn."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Számot kér be a felhasználótól."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Szöveget kér be a felhasználótól."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Kérj be számot"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Kérj be szöveget"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://hu.wikipedia.org/wiki/String"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Egy betű, szó vagy szöveg egy sora."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "szóközök levágása mindkét végéről"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "szóközök levágása az elejéről"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "szóközök levágása a végéről"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Levágja a megadott szöveg végeiről a szóközöket."; -Blockly.Msg.TODAY = "Ma"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "változó"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Készíts \"%1=\""; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "A változó értékét adja eredményül."; -Blockly.Msg.VARIABLES_SET = "%1 %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Készíts \"%1\""; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "A változónak adhatunk értéket."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ia.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/ia.js deleted file mode 100644 index 2eccaf3..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ia.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.ia'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Adder commento"; -Blockly.Msg.AUTH = "Per favor autorisa iste application pro permitter de salveguardar tu travalio e pro permitter que tu lo divide con alteres."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Cambiar valor:"; -Blockly.Msg.CHAT = "Conversa con tu collaborator scribente in iste quadro!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Plicar blocos"; -Blockly.Msg.COLLAPSE_BLOCK = "Plicar bloco"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "color 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "color 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "ration"; -Blockly.Msg.COLOUR_BLEND_TITLE = "miscer"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Misce duo colores con un ration specificate (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ia.wikipedia.org/wiki/Color"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Elige un color del paletta."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "color aleatori"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Eliger un color al hasardo."; -Blockly.Msg.COLOUR_RGB_BLUE = "blau"; -Blockly.Msg.COLOUR_RGB_GREEN = "verde"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "rubie"; -Blockly.Msg.COLOUR_RGB_TITLE = "colorar con"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Crear un color con le quantitate specificate de rubie, verde e blau. Tote le valores debe esser inter 0 e 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "escappar del bucla"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continuar con le proxime iteration del bucla"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Escappar del bucla continente."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Saltar le resto de iste bucla e continuar con le proxime iteration."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Attention: Iste bloco pote solmente esser usate in un bucla."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "pro cata elemento %1 in lista %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Pro cata elemento in un lista, mitter lo in le variabile '%1' e exequer certe instructiones."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "contar con %1 de %2 a %3 per %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Mitter in le variabile \"%1\" le valores ab le numero initial usque al numero final, con passos secundo le intervallo specificate, e exequer le blocos specificate."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Adder un condition al bloco \"si\"."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Adder un condition final de reserva al bloco \"si\"."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Adde, remove o reordina sectiones pro reconfigurar iste bloco \"si\"."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "si non"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "si non si"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "si"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Si un valor es ver, exequer certe instructiones."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Si un valor es ver, exequer le prime bloco de instructiones. Si non, exequer le secunde bloco de instructiones."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Si le prime valor es ver, exequer le prime bloco de instructiones. Si non, si le secunde valor es ver, exequer le secunde bloco de instructiones."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Si le prime valor es ver, exequer le prime bloco de instructiones. Si non, si le secunde valor es ver, exequer le secunde bloco de instructiones. Si necun del valores es ver, exequer le ultime bloco de instructiones."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "face"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "repeter %1 vices"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Exequer certe instructiones plure vices."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repeter usque a"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repeter durante que"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Durante que un valor es false, exequer certe instructiones."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Durante que un valor es ver, exequer certe instructiones."; -Blockly.Msg.DELETE_BLOCK = "Deler bloco"; -Blockly.Msg.DELETE_X_BLOCKS = "Deler %1 blocos"; -Blockly.Msg.DISABLE_BLOCK = "Disactivar bloco"; -Blockly.Msg.DUPLICATE_BLOCK = "Duplicar"; -Blockly.Msg.ENABLE_BLOCK = "Activar bloco"; -Blockly.Msg.EXPAND_ALL = "Displicar blocos"; -Blockly.Msg.EXPAND_BLOCK = "Displicar bloco"; -Blockly.Msg.EXTERNAL_INPUTS = "Entrata externe"; -Blockly.Msg.HELP = "Adjuta"; -Blockly.Msg.INLINE_INPUTS = "Entrata interne"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "crear un lista vacue"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Retorna un lista, de longitude 0, sin datos."; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Adde, remove o reordina sectiones pro reconfigurar iste bloco de listas."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "crear lista con"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Adder un elemento al lista."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Crear un lista con un numero qualcunque de elementos."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "prime"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "№ ab fin"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "prender"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "prender e remover"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "ultime"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aleatori"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "remover"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Retorna le prime elemento in un lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Retorna le elemento presente al position specificate in un lista. № 1 es le ultime elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Retorna le elemento presente al position specificate in un lista. № 1 es le prime elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Retorna le ultime elemento in un lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Retorna un elemento aleatori in un lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Remove e retorna le prime elemento in un lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Remove e retorna le elemento presente al position specificate in un lista. № 1 es le ultime elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Remove e retorna le elemento presente al position specificate in un lista. № 1 es le prime elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Remove e retorna le ultime elemento in un lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Remove e retorna un elemento aleatori in un lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Remove le prime elemento in un lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Remove le elemento presente al position specificate in un lista. № 1 es le ultime elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Remove le elemento presente al position specificate in un lista. № 1 es le prime elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Remove le ultime elemento in un lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Remove un elemento aleatori in un lista."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "usque al № ab fin"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "usque al №"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "usque al ultime"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "prender sublista ab initio"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "prender sublista ab le fin ab №"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "prender sublista ab №"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crea un copia del parte specificate de un lista."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "cercar le prime occurrentia del elemento"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "cercar le ultime occurrentia del elemento"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna le indice del prime/ultime occurrentia del elemento in le lista. Retorna 0 si le texto non es trovate."; -Blockly.Msg.LISTS_INLIST = "in lista"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 es vacue"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Retorna ver si le lista es vacue."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "longitude de %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Retorna le longitude de un lista."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "crear lista con elemento %1 repetite %2 vices"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Crea un lista que contine le valor fornite, repetite le numero specificate de vices."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "a"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "inserer in"; -Blockly.Msg.LISTS_SET_INDEX_SET = "mitter"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Insere le elemento al initio de un lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Insere le elemento al position specificate in un lista. № 1 es le ultime elemento."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Insere le elemento al position specificate in un lista. № 1 es le prime elemento."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Adjunge le elemento al fin de un lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Insere le elemento a un position aleatori in un lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Defini le valor del prime elemento in un lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Defini le valor del elemento al position specificate in un lista. № 1 es le ultime elemento."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Defini le valor del elemento al position specificate in un lista. № 1 es le prime elemento."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Defini le valor del ultime elemento in un lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Defini le valor de un elemento aleatori in un lista."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "false"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Retorna o ver o false."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "ver"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Retornar ver si le duo entratas es equal."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Retornar ver si le prime entrata es major que le secunde."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Retornar ver si le prime entrata es major que o equal al secunde."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Retornar ver si le prime entrata es minor que le secunde."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Retornar ver si le prime entrata es minor que o equal al secunde."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Retornar ver si le duo entratas non es equal."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "non %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Retornar ver si le entrata es false. Retornar false si le entrata es ver."; -Blockly.Msg.LOGIC_NULL = "nulle"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Retorna nulle."; -Blockly.Msg.LOGIC_OPERATION_AND = "e"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "o"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Retornar ver si ambe entratas es ver."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Retornar ver si al minus un del entratas es ver."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "si false"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "si ver"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Verificar le condition in 'test'. Si le condition es ver, retorna le valor de 'si ver'; si non, retorna le valor de 'si false'."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ia.wikipedia.org/wiki/Arithmetica"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Retornar le summa del duo numeros."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Retornar le quotiente del duo numeros."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Retornar le differentia del duo numeros."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Retornar le producto del duo numeros."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Retornar le prime numero elevate al potentia del secunde numero."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated -Blockly.Msg.MATH_CHANGE_TITLE = "cambiar %1 per %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Adder un numero al variabile '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Retornar un del constantes commun: π (3,141…), e (2,718…), φ (1,618…), sqrt(2) (1,414…), sqrt(½) (0,707…) o ∞ (infinite)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "limitar %1 inter %2 e %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Limitar un numero a esser inter le limites specificate (incluse)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "es divisibile per"; -Blockly.Msg.MATH_IS_EVEN = "es par"; -Blockly.Msg.MATH_IS_NEGATIVE = "es negative"; -Blockly.Msg.MATH_IS_ODD = "es impare"; -Blockly.Msg.MATH_IS_POSITIVE = "es positive"; -Blockly.Msg.MATH_IS_PRIME = "es prime"; -Blockly.Msg.MATH_IS_TOOLTIP = "Verificar si un numero es par, impare, prime, integre, positive, negative, o divisibile per un certe numero. Retorna ver o false."; -Blockly.Msg.MATH_IS_WHOLE = "es integre"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated -Blockly.Msg.MATH_MODULO_TITLE = "resto de %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Retornar le resto del division del duo numeros."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://ia.wikipedia.org/wiki/Numero"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un numero."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "media del lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maximo del lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana del lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimo del lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modas del lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "elemento aleatori del lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "deviation standard del lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "summa del lista"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Retornar le media arithmetic del valores numeric in le lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Retornar le numero le plus grande in le lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Retornar le numero median del lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Retornar le numero le plus parve in le lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Retornar un lista del elemento(s) le plus commun in le lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Retornar un elemento aleatori del lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Retornar le deviation standard del lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Retornar le summa de tote le numeros in le lista."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "fraction aleatori"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Retornar un fraction aleatori inter 0.0 (incluse) e 1.0 (excluse)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated -Blockly.Msg.MATH_RANDOM_INT_TITLE = "numero integre aleatori inter %1 e %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Retornar un numero integre aleatori inter le duo limites specificate, incluse."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://ia.wikipedia.org/wiki/Rotundamento"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arrotundar"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arrotundar a infra"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arrotundar a supra"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Arrotundar un numero a supra o a infra."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://ia.wikipedia.org/wiki/Radice_quadrate"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolute"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "radice quadrate"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Retornar le valor absolute de un numero."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Retornar e elevate al potentia del numero."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Retornar le logarithmo natural de un numero."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Retornar le logarithmo in base 10 del numero."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Retornar le negation de un numero."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Retornar 10 elevate al potentia de un numero."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Retornar le radice quadrate de un numero."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Retornar le arcocosino de un numero."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Retornar le arcosino de un numero."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Retornar le arcotangente de un numero."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Retornar le cosino de un grado (non radiano)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Retornar le sino de un grado (non radiano)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Retornar le tangente de un grado (non radiano)."; -Blockly.Msg.ME = "Io"; -Blockly.Msg.NEW_VARIABLE = "Nove variabile..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nomine del nove variabile:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "permitter declarationes"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "con:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Executar le function '%1' definite per le usator."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Executar le function '%1' definite per le usator e usar su resultato."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "con:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Crear '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "facer qualcosa"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "pro"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crea un function que non retorna un valor."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "retornar"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crea un function que retorna un valor."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Attention: Iste function ha parametros duplicate."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Accentuar le definition del function"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Si un valor es ver, alora retornar un secunde valor."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Attention: Iste bloco pote solmente esser usate in le definition de un function."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nomine del entrata:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Adder un entrata al function."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entratas"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Adder, remover o reordinar le entratas pro iste function."; -Blockly.Msg.REMOVE_COMMENT = "Remover commento"; -Blockly.Msg.RENAME_VARIABLE = "Renominar variabile..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Renominar tote le variabiles '%1' a:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "adjunger texto"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "a"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Adjunger un texto al variabile '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "in minusculas"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "con Initiales Majuscule"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "in MAJUSCULAS"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Retornar un copia del texto con differente majusculas/minusculas."; -Blockly.Msg.TEXT_CHARAT_FIRST = "prender le prime littera"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "prender ab le fin le littera №"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "prender le littera №"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in le texto"; -Blockly.Msg.TEXT_CHARAT_LAST = "prender le ultime littera"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "prender un littera aleatori"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Retorna le littera presente al position specificate."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Adder un elemento al texto."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "unir"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Adde, remove o reordina sectiones pro reconfigurar iste bloco de texto."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "ab le fin usque al littera №"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "usque al littera №"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "usque al ultime littera"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in le texto"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "prender subcatena ab le prime littera"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "prender subcatena ab le fin ab le littera №"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "prender subcatena ab le littera №"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Retorna le parte specificate del texto."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in le texto"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "cercar le prime occurrentia del texto"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "cercar le ultime occurrentia del texto"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna le indice del prime/ultime occurrentia del prime texto in le secunde texto. Retorna 0 si le texto non es trovate."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 es vacue"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Retorna ver si le texto fornite es vacue."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "crear texto con"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Crear un pecia de texto uniente un certe numero de elementos."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "longitude de %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Retorna le numero de litteras (incluse spatios) in le texto fornite."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "scriber %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Scriber le texto, numero o altere valor specificate."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Peter un numero al usator."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Peter un texto al usator."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "peter un numero con le message"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "peter un texto con le message"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Un littera, parola o linea de texto."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "remover spatios de ambe lateres de"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "remover spatios del sinistre latere de"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "remover spatios del dextre latere de"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Retornar un copia del texto con spatios eliminate de un extremitate o ambes."; -Blockly.Msg.TODAY = "Today"; // untranslated -Blockly.Msg.VARIABLES_DEFAULT_NAME = "cosa"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crea 'mitter %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Retorna le valor de iste variabile."; -Blockly.Msg.VARIABLES_SET = "mitter %1 a %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Crear 'prender %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Mitte iste variabile al valor del entrata."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/id.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/id.js deleted file mode 100644 index 0505744..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/id.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.id'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Tambahkan sebuah comment"; -Blockly.Msg.AUTH = "Silakan mengotorisasi aplikasi ini untuk memungkinkan pekerjaan Anda dapat disimpan dan digunakan bersama."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Ubah nilai:"; -Blockly.Msg.CHAT = "Chatting dengan kolaborator anda dengan mengetikkan di kotak ini!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Ciutkan Blok"; -Blockly.Msg.COLLAPSE_BLOCK = "Ciutkan Blok"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "Warna 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "Warna 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "rasio"; -Blockly.Msg.COLOUR_BLEND_TITLE = "Tertutup"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "mencampur dua warna secara bersamaan dengan perbandingan (0.0-1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Pilih warna dari daftar warna."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "Warna acak"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Pilih warna secara acak."; -Blockly.Msg.COLOUR_RGB_BLUE = "biru"; -Blockly.Msg.COLOUR_RGB_GREEN = "hijau"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "merah"; -Blockly.Msg.COLOUR_RGB_TITLE = "Dengan warna"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Buatlah warna dengan jumlah yang ditentukan dari merah, hijau dan biru. Semua nilai harus antarai 0 sampai 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "Keluar dari perulangan"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "Lanjutkan dengan langkah penggulangan berikutnya"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Keluar sementara dari perulanggan."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Abaikan sisa dari loop ini, dan lanjutkan dengan iterasi berikutnya."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Peringatan: Blok ini hanya dapat digunakan dalam loop."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "untuk setiap item %1 di dalam list %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Untuk tiap-tiap item di dalam list, tetapkan variabel '%1' ke dalam item, selanjutnya kerjakan beberapa statement."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "Cacah dengan %1 dari %2 ke %3 dengan step / penambahan %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Menggunakan variabel \"%1\" dengan mengambil nilai dari batas awal hingga ke batas akhir, dengan interval tertentu, dan mengerjakan block tertentu."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "tambahkan prasyarat ke dalam blok IF."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Terakhir, tambahkan tangkap-semua kondisi kedalam blok jika (if)."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Menambahkan, menghapus, atau menyusun kembali bagian untuk mengkonfigurasi blok IF ini."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "else"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "else if"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "Jika"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "jika nilainya benar maka kerjakan perintah berikutnya."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "jika nilainya benar, maka kerjakan blok perintah yang pertama. Jika tidak, kerjakan blok perintah yang kedua."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Jika nilai pertama adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok pertama. Jika nilai kedua adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok kedua."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Jika blok pertama adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok pertama. Atau jika blok kedua adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok kedua."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "kerjakan"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "ulangi %1 kali"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Lakukan beberapa perintah beberapa kali."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "Ulangi sampai"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "Ulangi jika"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Jika sementara nilai tidak benar (false), maka lakukan beberapa perintah."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Jika sementara nilai benar (true), maka lakukan beberapa perintah."; -Blockly.Msg.DELETE_BLOCK = "Hapus Blok"; -Blockly.Msg.DELETE_X_BLOCKS = "Hapus %1 Blok"; -Blockly.Msg.DISABLE_BLOCK = "Nonaktifkan Blok"; -Blockly.Msg.DUPLICATE_BLOCK = "Duplikat"; -Blockly.Msg.ENABLE_BLOCK = "Aktifkan Blok"; -Blockly.Msg.EXPAND_ALL = "Kembangkan blok-blok"; -Blockly.Msg.EXPAND_BLOCK = "Kembangkan Blok"; -Blockly.Msg.EXTERNAL_INPUTS = "Input-input eksternal"; -Blockly.Msg.HELP = "Bantuan"; -Blockly.Msg.INLINE_INPUTS = "Input inline"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "buat list kosong"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Mengembalikan daftar, dengan panjang 0, tidak berisi data"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "list"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Tambahkan, hapus, atau susun ulang bagian untuk mengkonfigurasi blok LIST (daftar) ini."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "buat daftar (list) dengan"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Tambahkan sebuah item ke daftar (list)."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Buat sebuah daftar (list) dengan sejumlah item."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "pertama"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# dari akhir"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "dapatkan"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "dapatkan dan hapus"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "terakhir"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "acak"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "Hapus"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Kembalikan item pertama dalam daftar (list)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Sisipkan item ke dalam posisi yang telah ditentukan didalam list (daftar). Item pertama adalah item yang terakhir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Sisipkan item ke dalam posisi yang telah ditentukan didalam list (daftar). Item pertama adalah item terakhir (yg paling akhir)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Mengembalikan item pertama dalam list (daftar)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Mengembalikan item acak dalam list (daftar)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Menghilangkan dan mengembalikan item pertama dalam list (daftar)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Menghilangkan dan mengembalikan barang di posisi tertentu dalam list (daftar). #1 adalah item terakhir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Menghilangkan dan mengembalikan barang di posisi tertentu dalam list (daftar). #1 adalah item pertama."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Menghilangkan dan mengembalikan item terakhir dalam list (daftar)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Menghilangkan dan mengembalikan barang dengan acak dalam list (daftar)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Menghapus item pertama dalam daftar."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Menghapus item dengan posisi tertentu dalam daftar. Item pertama adalah item yang terakhir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Menghapus item dengan posisi tertentu dalam daftar. Item pertama adalah item yang terakhir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Menghapus item terakhir dalam daftar."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Menghapus sebuah item secara acak dalam list."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "ke # dari akhir"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "ke #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "ke yang paling akhir"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "Dapatkan bagian pertama dari list"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "Dapatkan bagian list nomor # dari akhir"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "Dapatkan bagian daftar dari #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Membuat salinan dari bagian tertentu dari list."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "cari kejadian pertama item"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "Cari kejadian terakhir item"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Mengembalikan indeks dari kejadian pertama/terakhir item dalam daftar. Menghasilkan 0 jika teks tidak ditemukan."; -Blockly.Msg.LISTS_INLIST = "dalam daftar"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 kosong"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Mengembalikan nilai benar (true) jika list kosong."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "panjang dari %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Mengembalikan panjang daftar."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "membuat daftar dengan item %1 diulang %2 kali"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Ciptakan daftar yang terdiri dari nilai yang diberikan diulang jumlah waktu yang ditentukan."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "sebagai"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "sisipkan di"; -Blockly.Msg.LISTS_SET_INDEX_SET = "tetapkan"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Sisipkan item di bagian awal dari list."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Sisipkan item ke dalam posisi yang telah ditentukan di dalam list. #1 adalah item yang terakhir."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Sisipkan item ke dalam posisi yang telah ditentukan di dalam list. #1 adalah item yang pertama."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Tambahkan item ke bagian akhir list."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Sisipkan item secara acak ke dalam list."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Tetapkan item pertama di dalam list."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Tetapkan item ke dalam posisi yang telah ditentukan di dalam list. #1 adalah item yang terakhir."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Tetapkan item ke dalam posisi yang telah ditentukan di dalam list. #1 adalah item yang pertama."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Menetapkan item terakhir dalam list."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Tetapkan secara acak sebuah item dalam list."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "membuat daftar dari teks"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "buat teks dari daftar"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Gabung daftar teks menjadi satu teks, yang dipisahkan oleh pembatas."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Membagi teks ke dalam daftar teks, pisahkan pada setiap pembatas."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "dengan pembatas"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "Salah"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Mengembalikan betul (true) atau salah (false)."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "Benar"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Mengembalikan betul jika input kedua-duanya sama dengan satu sama lain."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Mengembalikan nilai benar (true) jika input yang pertama lebih besar dari input yang kedua."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Mengembalikan nilai benar (true) jika input yang pertama lebih besar dari atau sama dengan input yang kedua."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Mengembalikan nilai benar (true) jika input yang pertama lebih kecil dari input yang kedua."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Mengembalikan nilai benar (true) jika input yang pertama lebih kecil atau sama dengan input yang kedua ."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Mengembalikan nilai benar (true) jika kedua input tidak sama satu dengan yang lain."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "bukan (not) %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Mengembalikan nilai benar (true) jika input false. Mengembalikan nilai salah (false) jika input true."; -Blockly.Msg.LOGIC_NULL = "null"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "mengembalikan kosong."; -Blockly.Msg.LOGIC_OPERATION_AND = "dan"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "atau"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Kembalikan betul jika kedua-dua input adalah betul."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Mengembalikan nilai benar (true) jika setidaknya salah satu masukan nilainya benar (true)."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "jika tidak benar (false)"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "jika benar (true)"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Periksa kondisi di \"test\". Jika kondisi benar (true), mengembalikan nilai \"jika benar\" ; Jik sebaliknya akan mengembalikan nilai \"jika salah\"."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://id.wikipedia.org/wiki/Aritmetika"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Kembalikan jumlah dari kedua angka."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Kembalikan hasil bagi dari kedua angka."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Kembalikan selisih dari kedua angka."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Kembalikan perkalian dari kedua angka."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Kembalikan angka pertama pangkat angka kedua."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "ubah %1 oleh %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Tambahkan angka kedalam variabel '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Kembalikan salah satu konstanta: π (3,141…), e (2,718…), φ (1,618…), akar(2) (1,414…), akar(½) (0.707…), atau ∞ (tak terhingga)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "Batasi %1 rendah %2 tinggi %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Batasi angka antara batas yang ditentukan (inklusif)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "dibagi oleh"; -Blockly.Msg.MATH_IS_EVEN = "adalah bilangan genap"; -Blockly.Msg.MATH_IS_NEGATIVE = "adalah bilangan negatif"; -Blockly.Msg.MATH_IS_ODD = "adalah bilangan ganjil"; -Blockly.Msg.MATH_IS_POSITIVE = "adalah bilangan positif"; -Blockly.Msg.MATH_IS_PRIME = "adalah bilangan pokok"; -Blockly.Msg.MATH_IS_TOOLTIP = "Periksa apakah angka adalah bilangan genap, bilangan pokok, bilangan bulat, bilangan positif, bilangan negatif, atau apakan bisa dibagi oleh angka tertentu. Mengembalikan benar (true) atau salah (false)."; -Blockly.Msg.MATH_IS_WHOLE = "adalah bilangan bulat"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "sisa %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Kembalikan sisa dari pembagian ke dua angka."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Suatu angka."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "rata-rata dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maximum dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "median dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimum dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "mode-mode dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "item acak dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "deviasi standar dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "jumlah dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Kembalikan rata-rata (mean aritmetik) dari nilai numerik dari list (daftar)."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Kembalikan angka terbesar dari list."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Kembalikan median dari list."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Kembalikan angka terkecil dari list."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Kembalikan list berisi item-item yang paling umum dari dalam list."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Kembalikan element acak dari list."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Kembalikan standard deviasi dari list."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Kembalikan jumlah dari seluruh bilangan dari list."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "Nilai pecahan acak"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Mengembalikan nilai acak pecahan antara 0.0 (inklusif) dan 1.0 (ekslusif)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "acak bulat dari %1 sampai %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Mengembalikan bilangan acak antara dua batas yang ditentukan, inklusif."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "membulatkan"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "membulatkan kebawah"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "mengumpulkan"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Bulatkan suatu bilangan naik atau turun."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "mutlak"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "akar"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Kembalikan nilai absolut angka."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Kembalikan 10 pangkat angka."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Kembalikan logaritma natural dari angka."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Kembalikan dasar logaritma 10 dari angka."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Kembalikan penyangkalan terhadap angka."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Kembalikan 10 pangkat angka."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Kembalikan akar dari angka."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "acos"; -Blockly.Msg.MATH_TRIG_ASIN = "asin"; -Blockly.Msg.MATH_TRIG_ATAN = "atan"; -Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; -Blockly.Msg.MATH_TRIG_TAN = "tan"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Kembalikan acosine dari angka."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Kembalikan asin dari angka."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Kembalikan atan dari angka."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Kembalikan cos dari derajat (bukan radian)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Kembalikan sinus dari derajat (bukan radian)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Kembalikan tangen dari derajat (tidak radian)."; -Blockly.Msg.ME = "Saya"; -Blockly.Msg.NEW_VARIABLE = "Pembolehubah baru..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nama pembolehubah baru:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "memungkinkan pernyataan"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "dengan:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Menjalankan fungsi '%1' yang ditetapkan pengguna."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Menjalankan fungsi '%1' yang ditetapkan pengguna dan menggunakan outputnya."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "dengan:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Buat '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "buat sesuatu"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "untuk"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Menciptakan sebuah fungsi dengan tiada output."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "kembali"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Menciptakan sebuah fungsi dengan satu output."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Peringatan: Fungsi ini memiliki parameter duplikat."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Sorot definisi fungsi"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Jika nilai yang benar, kemudian kembalikan nilai kedua."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Peringatan: Blok ini dapat digunakan hanya dalam definisi fungsi."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "masukan Nama:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Tambahkan masukan ke fungsi."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "input"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Menambah, menghapus, atau menyusun ulang masukan untuk fungsi ini."; -Blockly.Msg.REMOVE_COMMENT = "Hapus komentar"; -Blockly.Msg.RENAME_VARIABLE = "namai ulang variabel..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Ubah nama semua variabel '%1' menjadi:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "tambahkan teks"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "untuk"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Tambahkan beberapa teks ke variabel '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "menjadi huruf kecil"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "menjadi huruf pertama kapital"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "menjadi huruf kapital"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Kembalikan kopi dari text dengan kapitalisasi yang berbeda."; -Blockly.Msg.TEXT_CHARAT_FIRST = "ambil huruf pertama"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "ambil huruf nomor # dari belakang"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "ambil huruf ke #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "dalam teks"; -Blockly.Msg.TEXT_CHARAT_LAST = "ambil huruf terakhir"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "ambil huruf secara acak"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Kembalikan karakter dari posisi tertentu."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Tambahkan suatu item ke dalam teks."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "join"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Tambah, ambil, atau susun ulang teks blok."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "pada huruf nomer # dari terakhir"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "pada huruf #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "pada huruf terakhir"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in teks"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "ambil bagian teks (substring) dari huruf pertama"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "ambil bagian teks (substring) dari huruf ke # dari terakhir"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "ambil bagian teks (substring) dari huruf no #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Mengembalikan spesifik bagian dari teks."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "dalam teks"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "temukan kejadian pertama dalam teks"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "temukan kejadian terakhir dalam teks"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Kembalikan indeks pertama dan terakhir dari kejadian pertama/terakhir dari teks pertama dalam teks kedua. Kembalikan 0 jika teks tidak ditemukan."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 kosong"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Kembalikan benar (true) jika teks yang disediakan kosong."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "Buat teks dengan"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Buat teks dengan cara gabungkan sejumlah item."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "panjang dari %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Kembalikan sejumlah huruf (termasuk spasi) dari teks yang disediakan."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "cetak %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Cetak teks yant ditentukan, angka atau ninlai lainnya."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Meminta pengguna untuk memberi sebuah angka."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Meminta pengguna untuk memberi beberapa teks."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Meminta angka dengan pesan"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "meminta teks dengan pesan"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Huruf, kata atau baris teks."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "pangkas ruang dari kedua belah sisi"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "pangkas ruang dari sisi kiri"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "pangkas ruang dari sisi kanan"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Kembali salinan teks dengan spasi dihapus dari satu atau kedua ujungnya."; -Blockly.Msg.TODAY = "Hari ini"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Membuat 'tetapkan %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Mengembalikan nilai variabel ini."; -Blockly.Msg.VARIABLES_SET = "tetapkan %1 untuk %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Membuat 'dapatkan %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "tetapkan variabel ini dengan input yang sama."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/is.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/is.js deleted file mode 100644 index 9ab93ab..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/is.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.is'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Skrifa skýringu"; -Blockly.Msg.AUTH = "Vinsamlegast heimilaðu þetta forrit svo að hægt sé að vista verk þitt og svo að þú megir deila því"; -Blockly.Msg.CHANGE_VALUE_TITLE = "Breyta gildi:"; -Blockly.Msg.CHAT = "Spjallaðu við félaga með því að skrifa í þennan reit!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Loka kubbum"; -Blockly.Msg.COLLAPSE_BLOCK = "Loka kubbi"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "litur 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "litur 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "hlutfall"; -Blockly.Msg.COLOUR_BLEND_TITLE = "blöndun"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blandar tveimur litum í gefnu hlutfalli (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Velja lit úr litakorti."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "einhver litur"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Velja einhvern lit af handahófi."; -Blockly.Msg.COLOUR_RGB_BLUE = "blátt"; -Blockly.Msg.COLOUR_RGB_GREEN = "grænt"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "rauður"; -Blockly.Msg.COLOUR_RGB_TITLE = "litur"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Búa til lit úr tilteknu magni af rauðu, grænu og bláu. Allar tölurnar verða að vera á bilinu 0 til 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "fara út úr lykkju"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "fara beint í næstu umferð lykkjunnar"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Fara út úr umlykjandi lykkju."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Sleppa afganginum af lykkjunni og fara beint í næstu umferð hennar."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Aðvörun: Þennan kubb má aðeins nota innan lykkju."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "fyrir hvert %1 í lista %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Fyrir hvert atriði í lista er breyta '%1' stillt á atriðið og skipanir gerðar."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; -Blockly.Msg.CONTROLS_FOR_TITLE = "telja með %1 frá %2 til %3 um %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Láta breytuna \"%1\" taka inn gildi frá fyrstu tölu til síðustu tölu hlaupandi á bilinu og endurtaka kubbana fyrir hverja tölu."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Bæta skilyrði við EF kubbinn."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Bæta við hluta EF kubbs sem grípur öll tilfelli sem uppfylla ekki hin skilyrðin."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Bæta við, fjarlægja eða umraða til að breyta skipan þessa EF kubbs."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "annars"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "annars ef"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "ef"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Ef gildi er satt skal gera einhverjar skipanir."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Ef gildi er satt skal gera skipanir í fyrri kubbnum. Annars skal gera skipanir í seinni kubbnum."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Ef fyrra gildið er satt skal gera skipanir í fyrri kubbnum. Annars, ef seinna gildið er satt, þá skal gera skipanir í seinni kubbnum."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Ef fyrra gildið er satt skal gera skipanir í fyrri kubbnum. Annars, ef seinna gildið er satt, skal gera skipanir í seinni kubbnum. Ef hvorugt gildið er satt, skal gera skipanir í síðasta kubbnum."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "gera"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "endurtaka %1 sinnum"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Gera eitthvað aftur og aftur."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "endurtaka þar til"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "endurtaka á meðan"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Endurtaka eitthvað á meðan gildi er ósatt."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Endurtaka eitthvað á meðan gildi er satt."; -Blockly.Msg.DELETE_BLOCK = "Eyða kubbi"; -Blockly.Msg.DELETE_X_BLOCKS = "Eyða %1 kubbum"; -Blockly.Msg.DISABLE_BLOCK = "Óvirkja kubb"; -Blockly.Msg.DUPLICATE_BLOCK = "Afrita"; -Blockly.Msg.ENABLE_BLOCK = "Virkja kubb"; -Blockly.Msg.EXPAND_ALL = "Opna kubba"; -Blockly.Msg.EXPAND_BLOCK = "Opna kubb"; -Blockly.Msg.EXTERNAL_INPUTS = "Ytri inntök"; -Blockly.Msg.HELP = "Hjálp"; -Blockly.Msg.INLINE_INPUTS = "Innri inntök"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "búa til tóman lista"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Skilar lista með lengdina 0 án gagna"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "listi"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Bæta við, fjarlægja eða umraða hlutum til að breyta skipan þessa listakubbs."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "búa til lista með"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Bæta atriði við listann."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Búa til lista með einhverjum fjölda atriða."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "fyrsta"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# frá enda"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "sækja"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "sækja og fjarlægja"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "síðasta"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "eitthvert"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "fjarlægja"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Skilar fyrsta atriði í lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Skilar atriðinu á hinum tiltekna stað í lista. #1 er síðasta atriðið."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Skilar atriðinu í hinum tiltekna stað í lista. #1 er fyrsta atriðið."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Skilar síðasta atriði í lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Skilar einhverju atriði úr lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Fjarlægir og skilar fyrsta atriðinu í lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Fjarlægir og skilar atriðinu á hinum tiltekna stað í lista. #1 er síðasta atriðið."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Fjarlægir og skilar atriðinu á hinum tiltekna stað í lista. #1 er fyrsta atriðið."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Fjarlægir og skilar síðasta atriðinu í lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Fjarlægir og skilar einhverju atriði úr lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Fjarlægir fyrsta atriðið í lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Fjarlægir atriðið á hinum tiltekna stað í lista. #1 er síðasta atriðið."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Fjarlægir atriðið á hinum tiltekna stað í lista. #1 er fyrsta atriðið."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Fjarlægir síðasta atriðið í lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Fjarlægir eitthvert atriði úr lista."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "til # frá enda"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "til #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "til síðasta"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "sækja undirlista frá fyrsta"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "sækja undirlista frá # frá enda"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "sækja undirlista frá #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Býr til afrit af tilteknum hluta lista."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "finna fyrsta tilfelli atriðis"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; -Blockly.Msg.LISTS_INDEX_OF_LAST = "finna síðasta tilfelli atriðis"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Finnur hvar atriðið kemur fyrir fyrst/síðast í listanum og skilar sæti þess. Skilar 0 ef textinn finnst ekki."; -Blockly.Msg.LISTS_INLIST = "í lista"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 er tómur"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Skilar sönnu ef listinn er tómur."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; -Blockly.Msg.LISTS_LENGTH_TITLE = "lengd %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Skilar lengd lista."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_REPEAT_TITLE = "búa til lista með atriði %1 endurtekið %2 sinnum"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Býr til lista sem inniheldur tiltekna gildið endurtekið tiltekið oft."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "sem"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "bæta við"; -Blockly.Msg.LISTS_SET_INDEX_SET = "setja í"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Bætir atriðinu fremst í listann."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Bætir atriðinu í listann á tilteknum stað. #1 er síðasta atriðið."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Bætir atriðinu í listann á tilteknum stað. #1 er fyrsta atriðið."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Bætir atriðinu aftan við listann."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Bætir atriðinu einhversstaðar við listann."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Setur atriðið í fyrsta sæti lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Setur atriðið í tiltekna sætið í listanum. #1 er síðasta atriðið."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Setur atriðið í tiltekna sætið í listanum. #1 er fyrsta atriðið."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Setur atriðið í síðasta sæti lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setur atriðið í eitthvert sæti lista."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "gera lista úr texta"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "gera texta úr lista"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Sameinar lista af textum í einn texta, með skiltákn á milli."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Skiptir texta í lista af textum, með skil við hvert skiltákn."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "með skiltákni"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "ósatt"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Skilar annað hvort sönnu eða ósönnu."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "satt"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Skila sönnu ef inntökin eru jöfn."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Skila sönnu ef fyrra inntakið er stærra en seinna inntakið."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Skila sönnu ef fyrra inntakið er stærra en eða jafnt og seinna inntakið."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Skila sönnu ef fyrra inntakið er minna en seinna inntakið."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Skila sönnu ef fyrra inntakið er minna en eða jafnt og seinna inntakið."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Skila sönnu ef inntökin eru ekki jöfn."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; -Blockly.Msg.LOGIC_NEGATE_TITLE = "ekki %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Skilar sönnu ef inntakið er ósatt. Skilar ósönnu ef inntakið er satt."; -Blockly.Msg.LOGIC_NULL = "tómagildi"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Skilar tómagildi."; -Blockly.Msg.LOGIC_OPERATION_AND = "og"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; -Blockly.Msg.LOGIC_OPERATION_OR = "eða"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Skila sönnu ef bæði inntökin eru sönn."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Skila sönnu ef að minnsta kosti eitt inntak er satt."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "prófun"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "ef ósatt"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "ef satt"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Kanna skilyrðið í 'prófun'. Skilar 'ef satt' gildinu ef skilyrðið er satt, en skilar annars 'ef ósatt' gildinu."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Skila summu talnanna tveggja."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Skila deilingu talnanna."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Skila mismun talnanna."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Skila margfeldi talnanna."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Skila fyrri tölunni í veldinu seinni talan."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "breyta %1 um %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Bæta tölu við breytu '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Skila algengum fasta: π (3.141…), e (2.718…), φ (1.618…), kvrót(2) (1.414…), kvrót(½) (0.707…) eða ∞ (óendanleika)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "þröngva %1 lægst %2 hæst %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Þröngva tölu til að vera innan hinna tilgreindu marka (að báðum meðtöldum)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "er\u00A0deilanleg með"; -Blockly.Msg.MATH_IS_EVEN = "er\u00A0jöfn tala"; -Blockly.Msg.MATH_IS_NEGATIVE = "er neikvæð"; -Blockly.Msg.MATH_IS_ODD = "er oddatala"; -Blockly.Msg.MATH_IS_POSITIVE = "er jákvæð"; -Blockly.Msg.MATH_IS_PRIME = "er prímtala"; -Blockly.Msg.MATH_IS_TOOLTIP = "Kanna hvort tala sé jöfn tala, oddatala, jákvæð, neikvæð eða deilanleg með tiltekinni tölu. Skilar sönnu eða ósönnu."; -Blockly.Msg.MATH_IS_WHOLE = "er heiltala"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "afgangur af %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Skila afgangi deilingar með tölunum."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Tala."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "meðaltal lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "stærst í lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "miðgildi lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minnst í lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "tíðast í lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "eitthvað úr lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "staðalfrávik lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "summa lista"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Skila meðaltali talna í listanum."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Skila stærstu tölu í listanum."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Skila miðgildi listans."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Skila minnstu tölu í listanum."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Skila lista yfir tíðustu gildin í listanum."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Skila einhverju atriði úr listanum."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Skila staðalfráviki lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Skila summu allra talna í listanum."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "slembibrot"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Skila broti sem er valið af handahófi úr tölum á bilinu frá og með 0.0 til (en ekki með) 1.0."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "slembitala frá %1 til %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Skila heiltölu sem valin er af handahófi og er innan tilgreindra marka, að báðum meðtöldum."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "námunda"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "námunda niður"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "námunda upp"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Námunda tölu upp eða niður."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "algildi"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "kvaðratrót"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Skila algildi tölu."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Skila e í veldi tölu."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Skila náttúrlegum lógaritma tölu."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Skila tugalógaritma tölu."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Skila neitun tölu (tölunni með öfugu formerki)."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Skila 10 í veldi tölu."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Skila kvaðratrót tölu."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "acos"; -Blockly.Msg.MATH_TRIG_ASIN = "asin"; -Blockly.Msg.MATH_TRIG_ATAN = "atan"; -Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; -Blockly.Msg.MATH_TRIG_TAN = "tan"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Skila arkarkósínusi tölu."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Skila arkarsínusi tölu."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Skila arkartangensi tölu."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Skila kósínusi horns gefnu í gráðum."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Skila sínusi horns gefnu í gráðum."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Skila tangensi horns gefnu í gráðum."; -Blockly.Msg.ME = "Mig"; -Blockly.Msg.NEW_VARIABLE = "Ný breyta..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Heiti nýrrar breytu:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "leyfa setningar"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "með:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Keyra heimatilbúna fallið '%1'."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Keyra heimatilbúna fallið '%1' og nota úttak þess."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "með:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Búa til '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "gera eitthvað"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "til að"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Býr til fall sem skilar engu."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "skila"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Býr til fall sem skilar úttaki."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Aðvörun: Þetta fall er með tvítekna stika."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Sýna skilgreiningu falls"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Ef gildi er satt, skal skila öðru gildi."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Aðvörun: Þennan kubb má aðeins nota í skilgreiningu falls."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "heiti inntaks:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Bæta inntaki við fallið."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inntök"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Bæta við, fjarlægja eða umraða inntökum fyrir þetta fall."; -Blockly.Msg.REMOVE_COMMENT = "Fjarlægja skýringu"; -Blockly.Msg.RENAME_VARIABLE = "Endurnefna breytu..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Endurnefna allar '%1' breyturnar:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "bæta texta"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; -Blockly.Msg.TEXT_APPEND_TO = "við"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Bæta texta við breytuna '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "í lágstafi"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "í Upphafstafi"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "í HÁSTAFI"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Skila afriti af textanum með annarri stafastöðu."; -Blockly.Msg.TEXT_CHARAT_FIRST = "sækja fyrsta staf"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "sækja staf # frá enda"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "sækja staf #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "í texta"; -Blockly.Msg.TEXT_CHARAT_LAST = "sækja síðasta staf"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "sækja einhvern staf"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Skila staf á tilteknum stað."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Bæta atriði við textann."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "tengja"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Bæta við, fjarlægja eða umraða hlutum til að breyta skipan þessa textakubbs."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "að staf # frá enda"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "að staf #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "að síðasta staf"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "í texta"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "sækja textabút frá fyrsta staf"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "sækja textabút frá staf # frá enda"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "sækja textabút frá staf #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Skilar tilteknum hluta textans."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "í texta"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "finna fyrsta tilfelli texta"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "finna síðasta tilfelli texta"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Finnur fyrsta/síðasta tilfelli fyrri textans í seinni textanum og skilar sæti hans. Skilar 0 ef textinn finnst ekki."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 er tómur"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Skilar sönnu ef gefni textinn er tómur."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "búa til texta með"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Búa til texta með því að tengja saman einhvern fjölda atriða."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; -Blockly.Msg.TEXT_LENGTH_TITLE = "lengd %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Skilar fjölda stafa (með bilum) í gefna textanum."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; -Blockly.Msg.TEXT_PRINT_TITLE = "prenta %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Prenta tiltekinn texta, tölu eða annað gildi."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Biðja notandann um tölu."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Biðja notandann um texta."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "biðja um tölu með skilaboðum"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "biðja um texta með skilaboðum"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Stafur, orð eða textalína."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "eyða bilum báðum megin við"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "eyða bilum vinstra megin við"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "eyða bilum hægra megin við"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Skila afriti af textanum þar sem möguleg bil við báða enda hafa verið fjarlægð."; -Blockly.Msg.TODAY = "Í dag"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "atriði"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Búa til 'stilla %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Skilar gildi þessarar breytu."; -Blockly.Msg.VARIABLES_SET = "stilla %1 á %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Búa til 'sækja %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Stillir þessa breytu á innihald inntaksins."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/it.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/it.js deleted file mode 100644 index ab2ce57..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/it.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.it'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Aggiungi commento"; -Blockly.Msg.AUTH = "Autorizza questa applicazione per consentire di salvare il tuo lavoro e per essere condiviso."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Modifica valore:"; -Blockly.Msg.CHAT = "Chatta con il tuo collaboratore scrivendo in questo box!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Comprimi blocchi"; -Blockly.Msg.COLLAPSE_BLOCK = "Comprimi blocco"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "colore 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "colore 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "rapporto"; -Blockly.Msg.COLOUR_BLEND_TITLE = "miscela"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mescola due colori insieme con un determinato rapporto (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://it.wikipedia.org/wiki/Colore"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Scegli un colore dalla tavolozza."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "colore casuale"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Scegli un colore a caso."; -Blockly.Msg.COLOUR_RGB_BLUE = "blu"; -Blockly.Msg.COLOUR_RGB_GREEN = "verde"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "rosso"; -Blockly.Msg.COLOUR_RGB_TITLE = "colora con"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Crea un colore con la quantità specificata di rosso, verde e blu. Tutti i valori devono essere compresi tra 0 e 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "esce dal ciclo"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "prosegui con la successiva iterazione del ciclo"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Esce dal ciclo."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Salta il resto di questo ciclo e prosegue con la successiva iterazione."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Attenzioneː Questo blocco può essere usato solo in un ciclo."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "per ogni elemento %1 nella lista %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Per ogni elemento in una lista, imposta la variabile '%1' pari all'elemento e quindi esegue alcune istruzioni."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "conta con %1 da %2 a %3 per %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Fa sì che la variabile '%1' prenda tutti i valori a partire dal numero di partenza fino a quello di arrivo, con passo pari all'intervallo specificato, ed esegue il blocco indicato."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Aggiungi una condizione al blocco se."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Aggiungi una condizione finale pigliatutto al blocco se."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Aggiungi, elimina o riordina le sezioni per riconfigurare questo blocco se."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "altrimenti"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "altrimenti se"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "se"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Se un valore è vero allora esegue alcune istruzioni."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Se un valore è vero allora esegue il primo blocco di istruzioni. Altrimenti esegue il secondo blocco di istruzioni."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Se il primo valore è vero allora esegue un primo blocco di istruzioni. Altrimenti, se il secondo valore è vero, esegue un secondo blocco di istruzioni."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Se il primo valore è vero allora esegue un primo blocco di istruzioni. Altrimenti, se il secondo valore è vero, esegue un secondo blocco di istruzioni. Se nessuno dei valori è vero esegue l'ultimo blocco di istruzioni."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://it.wikipedia.org/wiki/Ciclo_for"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "fai"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "ripeti %1 volte"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Esegue alcune istruzione diverse volte."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ripeti fino a che"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ripeti mentre"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Finché un valore è falso, esegue alcune istruzioni."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Finché un valore è vero, esegue alcune istruzioni."; -Blockly.Msg.DELETE_BLOCK = "Cancella blocco"; -Blockly.Msg.DELETE_X_BLOCKS = "Cancella %1 blocchi"; -Blockly.Msg.DISABLE_BLOCK = "Disattiva blocco"; -Blockly.Msg.DUPLICATE_BLOCK = "Duplica"; -Blockly.Msg.ENABLE_BLOCK = "Attiva blocco"; -Blockly.Msg.EXPAND_ALL = "Espandi blocchi"; -Blockly.Msg.EXPAND_BLOCK = "Espandi blocco"; -Blockly.Msg.EXTERNAL_INPUTS = "Ingressi esterni"; -Blockly.Msg.HELP = "Aiuto"; -Blockly.Msg.INLINE_INPUTS = "Ingressi in linea"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "crea lista vuota"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Restituisce una lista, di lunghezza 0, contenente nessun record di dati"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Aggiungi, rimuovi o riordina le sezioni per riconfigurare il blocco lista."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "crea lista con"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Aggiunge un elemento alla lista."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Crea una lista con un certo numero di elementi."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "primo"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# dalla fine"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "prendi"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "prendi e rimuovi"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "ultimo"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "casuale"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "rimuovi"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Restituisce il primo elemento in una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Restituisce l'elemento nella posizione indicata della lista. 1 corrisponde all'ultimo elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Restituisce l'elemento nella posizione indicata della lista. 1 corrisponde al primo elemento della lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Restituisce l'ultimo elemento in una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Restituisce un elemento casuale in una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Rimuove e restituisce il primo elemento in una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Rimuove e restituisce l'elemento nella posizione indicata in una lista. 1 corrisponde all'ultimo elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Rimuove e restituisce l'elemento nella posizione indicata in una lista. 1 corrisponde al primo elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Restituisce e rimuove l'ultimo elemento in una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Restituisce e rimuove un elemento casuale in una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Rimuove il primo elemento in una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Rimuove l'elemento nella posizione indicata in una lista. 1 corrisponde all'ultimo elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Rimuove l'elemento nella posizione indicata in una lista. 1 corrisponde al primo elemento."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Rimuove l'ultimo elemento in una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Rimuove un elemento casuale in una lista."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "da # dalla fine"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "fino a #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "dagli ultimi"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "prendi sotto-lista dall'inizio"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "prendi sotto-lista da # dalla fine"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "prendi sotto-lista da #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crea una copia della porzione specificata di una lista."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "trova la prima occorrenza dell'elemento"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "trova l'ultima occorrenza dell'elemento"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Restituisce l'indice della prima/ultima occorrenza dell'elemento nella lista. Restituisce 0 se il testo non viene trovato."; -Blockly.Msg.LISTS_INLIST = "nella lista"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 è vuota"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Restituisce vero se la lista è vuota."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "lunghezza di %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Restituisce la lunghezza della lista"; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "crea una lista con l'elemento %1 ripetuto %2 volte"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Crea una lista costituita dal valore indicato ripetuto per il numero di volte specificato."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "come"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "inserisci in"; -Blockly.Msg.LISTS_SET_INDEX_SET = "imposta"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserisci l'elemento all'inizio della lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserisci l'elemento nella posizione indicata in una lista. #1 corrisponde all'ultimo elemento."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserisci un elemento nella posizione indicata in una lista. #1 corrisponde al primo elemento."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Aggiungi un elemento alla fine di una lista"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserisce l'elemento casualmente in una lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Imposta il primo elemento in una lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Imposta l'elemento nella posizione indicata di una lista. 1 corrisponde all'ultimo elemento."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Imposta l'elemento nella posizione indicata di una lista. 1 corrisponde al primo elemento."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Imposta l'ultimo elemento in una lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Imposta un elemento casuale in una lista."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "crea lista da testo"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "crea testo da lista"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Unisci una lista di testi in un unico testo, separato da un delimitatore."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Dividi il testo in un elenco di testi, interrompendo ad ogni delimitatore."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "con delimitatore"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falso"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Restituisce vero o falso."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "vero"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://it.wikipedia.org/wiki/Disuguaglianza"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Restituisce vero se gli input sono uno uguale all'altro."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Restituisce vero se il primo input è maggiore o uguale al secondo."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Restituisce uguale se il primo input è maggiore o uguale al secondo input."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Restituisce vero se il primo input è minore del secondo."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Restituisce vero se il primo input è minore o uguale al secondo."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Restituisce vero se gli input non sono uno uguale all'altro."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "non %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Restituisce vero se l'input è falso. Restituisce falso se l'input è vero."; -Blockly.Msg.LOGIC_NULL = "nullo"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Restituisce valore nullo."; -Blockly.Msg.LOGIC_OPERATION_AND = "e"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "o"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Restituisce vero se entrambi gli input sono veri."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Restituisce vero se almeno uno degli input è vero."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "se falso"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "se vero"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Verifica la condizione in 'test'. Se questa è vera restituisce il valore 'se vero' altrimenti restituisce il valore 'se falso'."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://it.wikipedia.org/wiki/Aritmetica"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Restituisce la somma dei due numeri."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Restituisce il quoziente dei due numeri."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Restituisce la differenza dei due numeri."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Restituisce il prodotto dei due numeri."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Restituisce il primo numero elevato alla potenza del secondo numero."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://it.wikipedia.org/wiki/Addizione"; -Blockly.Msg.MATH_CHANGE_TITLE = "cambia %1 di %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Aggiunge un numero alla variabile '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://it.wikipedia.org/wiki/Costante_matematica"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Restituisce una delle costanti comuniː π (3.141…), e (2.718…), φ (1.618…), radq(2) (1.414…), radq(½) (0.707…) o ∞ (infinito)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "costringi %1 da %2 a %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Costringe un numero all'interno dei limiti indicati (compresi)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "è divisibile per"; -Blockly.Msg.MATH_IS_EVEN = "è pari"; -Blockly.Msg.MATH_IS_NEGATIVE = "è negativo"; -Blockly.Msg.MATH_IS_ODD = "è dispari"; -Blockly.Msg.MATH_IS_POSITIVE = "è positivo"; -Blockly.Msg.MATH_IS_PRIME = "è primo"; -Blockly.Msg.MATH_IS_TOOLTIP = "Verifica se un numero è pari, dispari, primo, intero, positivo, negativo o se è divisibile per un certo numero. Restituisce vero o falso."; -Blockly.Msg.MATH_IS_WHOLE = "è intero"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://it.wikipedia.org/wiki/Resto"; -Blockly.Msg.MATH_MODULO_TITLE = "resto di %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Restituisce il resto della divisione di due numeri."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://it.wikipedia.org/wiki/Numero"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un numero."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "media della lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "massimo della lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana della lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimo della lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "mode della lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "elemento casuale della lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "deviazione standard della lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "somma la lista"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Restituisce la media (media aritmetica) dei valori numerici nella lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Restituisce il più grande numero della lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Restituisce il valore mediano della lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Restituisce il più piccolo numero della lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Restituisce una lista degli elementi più frequenti nella lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Restituisce un elemento casuale della lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Restituisce la deviazione standard della lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Restituisce la somma si tutti i numeri nella lista."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://it.wikipedia.org/wiki/Numeri_pseudo-casuali"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "frazione casuale"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Restituisce una frazione compresa fra 0.0 (incluso) e 1.0 (escluso)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://it.wikipedia.org/wiki/Numeri_pseudo-casuali"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "intero casuale da %1 a %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Restituisce un numero intero casuale compreso tra i due limiti indicati (inclusi)."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://it.wikipedia.org/wiki/Arrotondamento"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arrotonda"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arrotonda verso il basso"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arrotonda verso l'alto"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Arrotonda un numero verso l'alto o verso il basso."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://it.wikipedia.org/wiki/Radice_quadrata"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "assoluto"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "radice quadrata"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Restituisce il valore assoluto del numero."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Restituisce e elevato alla potenza del numero."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Restituisce il logaritmo naturale del numero."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Restituisce il logaritmo in base 10 del numero."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Restituisce l'opposto del numero."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Restituisce 10 elevato alla potenza del numero."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Restituisce la radice quadrata del numero."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://it.wikipedia.org/wiki/Funzione_trigonometrica"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Restituisce l'arco-coseno di un numero."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Restituisce l'arco-seno di un numero."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Restituisce l'arco-tangente di un numero."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Restituisce il coseno di un angolo espresso in gradi (non radianti)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Restituisce il seno di un angolo espresso in gradi (non radianti)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Restituisce la tangente di un angolo espresso in gradi (non radianti)."; -Blockly.Msg.ME = "Me"; -Blockly.Msg.NEW_VARIABLE = "Nuova variabile..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nome della nuova variabile:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "consenti dichiarazioni"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "conː"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://it.wikipedia.org/wiki/Funzione_(informatica)"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Esegue la funzione definita dall'utente '%1'."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://it.wikipedia.org/wiki/Funzione_(informatica)"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Esegue la funzione definita dall'utente '%1' ed usa il suo output."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "conː"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Crea '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "fai qualcosa"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "per"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crea una funzione senza output."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "ritorna"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crea una funzione con un output."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Attenzioneː Questa funzione ha parametri duplicati."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Evidenzia definizione di funzione"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Se un valore è vero allora restituisce un secondo valore."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Attenzioneː Questo blocco può essere usato solo all'interno di una definizione di funzione."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nome inputː"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Aggiungi un input alla funzione."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "input"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Aggiungi, rimuovi o riordina input alla funzione."; -Blockly.Msg.REMOVE_COMMENT = "Rimuovi commento"; -Blockly.Msg.RENAME_VARIABLE = "Rinomina variabile..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Rinomina tutte le variabili '%1' in:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "aggiungi il testo"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "a"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Aggiunge del testo alla variabile '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "in minuscolo"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "con Iniziali Maiuscole"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "in MAIUSCOLO"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Restituisce una copia del testo in un diverso formato maiuscole/minuscole."; -Blockly.Msg.TEXT_CHARAT_FIRST = "prendi la prima lettera"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "prendi la lettera # dalla fine"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "prendi la lettera #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "nel testo"; -Blockly.Msg.TEXT_CHARAT_LAST = "prendi l'ultima lettera"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "prendi lettera casuale"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Restituisce la lettera nella posizione indicata."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Aggiungi un elemento al testo."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "unisci"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Aggiungi, rimuovi o riordina le sezioni per riconfigurare questo blocco testo."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "alla lettera # dalla fine"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "alla lettera #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "all'ultima lettera"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "nel testo"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "prendi sotto-stringa dalla prima lettera"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "prendi sotto-stringa dalla lettera # dalla fine"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "prendi sotto-stringa dalla lettera #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Restituisce la porzione di testo indicata."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "nel testo"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "trova la prima occorrenza del testo"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "trova l'ultima occorrenza del testo"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Restituisce l'indice della prima occorrenza del primo testo all'interno del secondo testo. Restituisce 0 se il testo non viene trovato."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 è vuoto"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Restituisce vero se il testo fornito è vuoto."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "crea testo con"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Crea un blocco di testo unendo un certo numero di elementi."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "lunghezza di %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Restituisce il numero di lettere (inclusi gli spazi) nel testo fornito."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "scrivi %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Scrive il testo, numero o altro valore indicato."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Richiedi un numero all'utente."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Richiede del testo da parte dell'utente."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "richiedi numero con messaggio"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "richiedi testo con messaggio"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://it.wikipedia.org/wiki/Stringa_(informatica)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Una lettera, una parola o una linea di testo."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "rimuovi spazi da entrambi gli estremi"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "rimuovi spazi a sinistra"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "rimuovi spazi a destra"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Restituisce una copia del testo con gli spazi rimossi ad uno o entrambe le estremità."; -Blockly.Msg.TODAY = "Oggi"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "elemento"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crea 'imposta %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Restituisce il valore di una variabile."; -Blockly.Msg.VARIABLES_SET = "imposta %1 a %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Crea 'prendi %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Imposta questa variabile ad essere pari all'input."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ja.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/ja.js deleted file mode 100644 index d6e6aa7..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ja.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.ja'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "コメントを追加"; -Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated -Blockly.Msg.CHANGE_VALUE_TITLE = "値を変更します。"; -Blockly.Msg.CHAT = "このボックスに入力して共同編集者とチャットしよう!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "ブロックを折りたたむ"; -Blockly.Msg.COLLAPSE_BLOCK = "ブロックを折りたたむ"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "色 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "色 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "割合"; -Blockly.Msg.COLOUR_BLEND_TITLE = "ブレンド"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "ブレンド2 つの色を指定された比率に混ぜる」 (0.0 ~ 1.0)。"; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ja.wikipedia.org/wiki/色"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "パレットから色を選んでください。"; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "ランダムな色"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "ランダムな色を選択します。"; -Blockly.Msg.COLOUR_RGB_BLUE = "青"; -Blockly.Msg.COLOUR_RGB_GREEN = "緑"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "赤"; -Blockly.Msg.COLOUR_RGB_TITLE = "カラーと"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "赤、緑、および青の指定された量で色を作成します。すべての値は 0 ~ 100 の間でなければなりません。"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "ループから抜け出す"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "ループの次の反復処理を続行します。"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "含むループから抜け出します。"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "このループの残りの部分をスキップし、次のイテレーションに進みます。"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "注意: このブロックは、ループ内でのみ使用します。"; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "各項目の %1 リストで %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "リストの各項目に対して変数 '%1' のアイテムに設定し、いくつかのステートメントをしてください。"; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "で、カウントします。 %1 %2 から%3、 %4 で"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "変数 \"%1\"は、指定した間隔ごとのカウントを開始番号から 終了番号まで、値をとり、指定したブロックを行う必要があります。"; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "場合に条件にブロック追加。"; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Ifブロックに、すべてをキャッチする条件を追加。"; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "追加、削除、またはセクションを順序変更して、ブロックをこれを再構成します。"; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "他"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "他でもし"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "もし"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "値が true の場合はその後ステートメントを行をいくつかします。"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "値が true 場合は、ステートメントの最初のブロックを行います。それ以外の場合は、ステートメントの 2 番目のブロックを行います。"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "最初の値が true 場合は、ステートメントの最初のブロックを行います。それ以外の場合は、2 番目の値が true の場合、ステートメントの 2 番目のブロックをします。"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "最初の値が true 場合は、ステートメントの最初のブロックを行います。2 番目の値が true の場合は、ステートメントの 2 番目のブロックを行います。それ以外の場合は最後のブロックのステートメントを行います。"; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://ja.wikipedia.org/wiki/for文"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "してください"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1 回、繰り返します"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "いくつかのステートメントを数回行います。"; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "までを繰り返します"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "つつその間、繰り返す4"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "値は false のあいだ、いくつかのステートメントを行います。"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "値は true のあいだ、いくつかのステートメントを行います。"; -Blockly.Msg.DELETE_BLOCK = "ブロックを消す"; -Blockly.Msg.DELETE_X_BLOCKS = "%1 個のブロックを消す"; -Blockly.Msg.DISABLE_BLOCK = "ブロックを無効にします。"; -Blockly.Msg.DUPLICATE_BLOCK = "複製"; -Blockly.Msg.ENABLE_BLOCK = "ブロックを有効にします。"; -Blockly.Msg.EXPAND_ALL = "ブロックを展開します。"; -Blockly.Msg.EXPAND_BLOCK = "ブロックを展開します。"; -Blockly.Msg.EXTERNAL_INPUTS = "外部入力"; -Blockly.Msg.HELP = "ヘルプ"; -Blockly.Msg.INLINE_INPUTS = "インライン入力"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "空のリストを作成します。"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "長さゼロ、データ レコード空のリストを返します"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "リスト"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "追加、削除、またはセクションを順序変更して、ブロックを再構成します。"; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "これを使ってリストを作成します。"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "リストにアイテムを追加します。"; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "アイテム数かぎりないのリストを作成します。"; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "最初"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "終しまいから #"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "取得"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "取得と削除"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "最後"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "ランダム"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "削除"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "リストの最初の項目を返信します。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "リスト内の指定位置にある項目を返します。# 1 は、最後の項目です。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "リスト内の指定位置にある項目を返します。# 1 は、最初の項目です。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "リストの最後の項目を返します。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "ランダム アイテム リストを返します。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "リスト内の最初の項目を削除したあと返します。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "リスト内の指定位置にある項目を削除し、返します。# 1 は、最後の項目です。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "リスト内の指定位置にある項目を削除し、返します。# 1 は、最後の項目です。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "リスト内の最後の項目を削除したあと返します。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "リストのランダムなアイテムを削除し、返します。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "リスト内の最初の項目を削除します。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "リスト内の指定位置にある項目を削除します。# 1 は、最後の項目です。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "リスト内の指定位置にある項目を返します。# 1 は、最初の項目です。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "リスト内の最後の項目を削除します。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "リスト内にある任意のアイテムを削除します。"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "最後から#へ"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "#へ"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "最後へ"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "最初からサブリストを取得する。"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "端から #のサブリストを取得します。"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "# からサブディレクトリのリストを取得します。"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "リストの指定された部分のコピーを作成してくださ。"; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "最初に見つかった項目を検索します。"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "最後に見つかったアイテムを見つける"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "リスト項目の最初/最後に出現するインデックス位置を返します。テキストが見つからない場合は 0 を返します。"; -Blockly.Msg.LISTS_INLIST = "リストで"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 が空"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "リストが空の場合は、true を返します。"; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = " %1の長さ"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "リストの長さを返します。"; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "アイテム %1 と一緒にリストを作成し %2 回繰り"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "指定された値をなんどか繰り返してリストを作ります。"; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "として"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "挿入します。"; -Blockly.Msg.LISTS_SET_INDEX_SET = "セット"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "リストの先頭に項目を挿入します。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "リスト内の指定位置に項目を挿入します。# 1 は、最後の項目です。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "リスト内の指定位置に項目を挿入します。# 1 は、最初の項目です。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "リストの末尾に項目を追加します。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "リストに項目をランダムに挿入します。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "リスト内に最初の項目を設定します。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "リスト内の指定された位置に項目を設定します。# 1 は、最後の項目です。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "リスト内の指定された位置に項目を設定します。# 1 は、最初の項目です。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "リスト内の最後の項目を設定します。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "リスト内にランダムなアイテムを設定します。"; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "テキストからリストを作る"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "リストからテキストを作る"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "false"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "True または false を返します。"; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "true"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://ja.wikipedia.org/wiki/不等式"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "もし両方がお互いに等しく入力した場合は true を返します。"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "最初の入力が 2 番目の入力よりも大きい場合は true を返します。"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "もし入力がふたつめの入よりも大きかったらtrueをり返します。"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "最初の入力が 2 番目の入力よりも小さいい場合は true を返します。"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "もし、最初の入力が二つ目入力より少ないか、おなじであったらTRUEをかえしてください"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "両方の入力が互いに等しくない場合に true を返します。"; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://ja.wikipedia.org/wiki/否定"; -Blockly.Msg.LOGIC_NEGATE_TITLE = "%1 ではないです。"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "入力が false の場合は、true を返します。入力が true の場合は false を返します。"; -Blockly.Msg.LOGIC_NULL = "null"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Null を返します。"; -Blockly.Msg.LOGIC_OPERATION_AND = "そして"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "または"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "両方の入力がおんなじ場わいわtrue を返します。"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "最低少なくとも 1 つの入力が true の場合は true を返します。"; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "テスト"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://ja.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "false の場合"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "true の場合"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "'テスト' の条件をチェックします。条件が true の場合、'true' の値を返します。それ以外の場合 'false' のを返します。"; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ja.wikipedia.org/wiki/算術"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "2 つの数の合計を返します。"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "2 つの数の商を返します。"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "2 つの数の差を返します。"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "2 つの数の積を返します。"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "最初の数を2 番目の値で累乗した結果を返します。"; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://ja.wikipedia.org/wiki/加法"; -Blockly.Msg.MATH_CHANGE_TITLE = "変更 %1 に %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "'%1' をたします。"; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://ja.wikipedia.org/wiki/数学定数"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "いずれかの共通の定数のを返す: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (無限)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "制限%1下リミット%2上限リミット%3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "値を、上限 x と下限 y のあいだに制限んする(上限と下限が、x と y とに同じ場合わ、上限の値は x, 下限の値はy)。"; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "割り切れる"; -Blockly.Msg.MATH_IS_EVEN = "わ偶数"; -Blockly.Msg.MATH_IS_NEGATIVE = "負の値"; -Blockly.Msg.MATH_IS_ODD = "奇数です。"; -Blockly.Msg.MATH_IS_POSITIVE = "正の値"; -Blockly.Msg.MATH_IS_PRIME = "素数です"; -Blockly.Msg.MATH_IS_TOOLTIP = "数字が、偶数、奇数、素数、整数、正数、負数、またはそれが特定の数で割り切れる場合かどうかを確認してください。どの制限が一つでも本当でしたら true をかえしてください、そうでない場合わ falseを返してください。"; -Blockly.Msg.MATH_IS_WHOLE = "は整数"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "残りの %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "2 つの数値を除算した残りを返します。"; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://ja.wikipedia.org/wiki/数"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "数です。"; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "リストの平均"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "リストの最大値"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "リストの中央値"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "リストの最小の数"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "一覧モード"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "リストのランダム アイテム"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "リストの標準偏差"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "リストの合計"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "リストの数値の平均 (算術平均) を返します。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "リストの最大数を返します。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "リストの中央値の数を返します。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "リストの最小数を返します。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "リストで最も一般的な項目のリストを返します。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "リストからランダムに要素を返します。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "リウトの標準偏差をかえす"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "全部リストの数をたして返す"; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "ランダムな分数"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "ランダムな分数を返すー0.0 (包括) の間のと 1.0 (排他的な)。"; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "%1 から %2 への無作為の整数"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "指定した下限の間、無作為なランダムな整数を返します。"; -Blockly.Msg.MATH_ROUND_HELPURL = "https://ja.wikipedia.org/wiki/端数処理"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "概数"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "端数を切り捨てる"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "数値を切り上げ"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "数値を切り上げるか切り捨てる"; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://ja.wikipedia.org/wiki/平方根"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "絶対値"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "平方根"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "絶対値を返す"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "数値の e 粂を返す"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "数値の自然対数をかえしてください"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "log 10 を返す。"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "負の数を返す"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "10の x 乗"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "平方根を返す"; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "acos"; -Blockly.Msg.MATH_TRIG_ASIN = "asin"; -Blockly.Msg.MATH_TRIG_ATAN = "atan"; -Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://ja.wikipedia.org/wiki/三角関数"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; -Blockly.Msg.MATH_TRIG_TAN = "tan"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "arccosine の値を返す"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "番号のarcsine を返すます"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "番号のarctangent を返すます"; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "番号のcosineの次数を返す"; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "番号のsineの次数を返す"; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "番号のtangentの次数を返す"; -Blockly.Msg.ME = "私に"; -Blockly.Msg.NEW_VARIABLE = "新しい変数"; -Blockly.Msg.NEW_VARIABLE_TITLE = "新しい変数の、名前"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "で。"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://ja.wikipedia.org/wiki/サブルーチン"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "ユーザー定義関数 '%1' を実行します。"; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://ja.wikipedia.org/wiki/サブルーチン"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "ユーザー定義関数 '%1' を実行し、その出力を使用します。"; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "で。"; -Blockly.Msg.PROCEDURES_CREATE_DO = "%1をつくる"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://ja.wikipedia.org/wiki/サブルーチン"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "何かしてください"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "宛先"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "出力なしで関数を作成します。"; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://ja.wikipedia.org/wiki/サブルーチン"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "返す"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "出力を持つ関数を作成します。"; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "警告: この関数は、重複するパラメーターがあります。"; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "関数の内容を強調表示します。"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "1番目値が true の場合、2 番目の値を返します。"; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "警告: このブロックは、関数定義内でのみ使用できます。"; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "入力名:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "入力"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated -Blockly.Msg.REMOVE_COMMENT = "コメントを削除します。"; -Blockly.Msg.RENAME_VARIABLE = "変数の名前を変更."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "%1の変数すべてを名前変更します。"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "テキストを追加します。"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "宛先"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "変数 '%1' にいくつかのテキストを追加します。"; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "小文字に"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "タイトル ケースに"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "大文字に変換する"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "別のケースに、テキストのコピーを返します。"; -Blockly.Msg.TEXT_CHARAT_FIRST = "最初の文字を得る"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "一番最後の言葉、キャラクターを所得"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "文字# を取得"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "テキストで"; -Blockly.Msg.TEXT_CHARAT_LAST = "最後の文字を得る"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "ランダムな文字を得る"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "指定された位置に文字を返します。"; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "テキスト をアイテム追加します。"; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "結合"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "追加、削除、またはセクションを順序変更して、ブロックを再構成します。"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "文字列の# 終わりからの#"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "# の文字"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "最後のの文字"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "テキストで"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "部分文字列を取得する。"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "部分文字列を取得する #端から得る"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "文字列からの部分文字列を取得 #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "テキストの指定部分を返します。"; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "テキストで"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "テキストの最初の出現箇所を検索します。"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "テキストの最後に見つかったを検索します。"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "最初のテキストの二番目のてきすとの、最初と最後の、出現したインデックスをかえします。テキストが見つからない場合は 0 を返します。"; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 が空"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "指定されたテキストが空の場合は、true を返します。"; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "テキストを作成します。"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "任意の数の項目一部を一緒に接合してテキストの作成します。"; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "%1 の長さ"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "指定されたテキストの文字 (スペースを含む) の数を返します。"; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "%1 を印刷します。"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "指定したテキスト、番号または他の値を印刷します。"; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "ユーザーにプロンプトして数字のインプットを求めます"; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "いくつかのテキストを、ユーザーに入力するようにプロンプト。"; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "メッセージを送って番号の入力を求める"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "メッセージをプロンプトしてにテキストを求める"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://ja.wikipedia.org/wiki/文字列"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "文字、単語、または行のテキスト。"; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "両端のスペースを取り除く"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "左端のスペースを取り除く"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "右端のスペースを取り除く"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "スペースを 1 つまたは両方の端から削除したのち、テキストのコピーを返します。"; -Blockly.Msg.TODAY = "今日"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "項目"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "'セット%1を作成します。"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "この変数の値を返します。"; -Blockly.Msg.VARIABLES_SET = "セット %1 宛先 %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "'%1 を取得' を作成します。"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "この入力を変数と等しくなるように設定します。"; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ko.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/ko.js deleted file mode 100644 index 2befbb7..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ko.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.ko'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "댓글 추가"; -Blockly.Msg.AUTH = "당신의 작업을 저장하고 다른 사람과 공유할 수 있도록 이 애플리케이션을 인증해 주십시오."; -Blockly.Msg.CHANGE_VALUE_TITLE = "값 바꾸기:"; -Blockly.Msg.CHAT = "이 상자에 입력하여 당신의 동료와 채팅하세요!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "블록 축소"; -Blockly.Msg.COLLAPSE_BLOCK = "블록 축소"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "색 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "색 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "비율"; -Blockly.Msg.COLOUR_BLEND_TITLE = "혼합"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "두 색을 주어진 비율로 혼합 (0.0 - 1.0)"; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ko.wikipedia.org/wiki/색"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "팔레트에서 색을 고릅니다"; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "임의 색상"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "무작위로 색을 고릅니다."; -Blockly.Msg.COLOUR_RGB_BLUE = "파랑"; -Blockly.Msg.COLOUR_RGB_GREEN = "초록"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "빨강"; -Blockly.Msg.COLOUR_RGB_TITLE = "RGB 색"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "빨강,파랑,초록의 값을 이용하여 색을 만드십시오. 모든 값은 0과 100 사이에 있어야 합니다."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://ko.wikipedia.org/wiki/%EC%A0%9C%EC%96%B4_%ED%9D%90%EB%A6%84"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "반복 중단"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "다음 반복"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "현재 반복 실행 블럭을 빠져나갑니다."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "나머지 반복 부분을 더이상 실행하지 않고, 다음 반복을 수행합니다."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "경고 : 이 블록은 반복 실행 블럭 안에서만 사용됩니다."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://ko.wikipedia.org/wiki/For_%EB%A3%A8%ED%94%84#.EC.9E.84.EC.9D.98.EC.9D.98_.EC.A7.91.ED.95.A9"; -Blockly.Msg.CONTROLS_FOREACH_TITLE = "각 항목에 대해 %1 목록으로 %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "리스트 안에 들어있는 각 아이템들을, 순서대로 변수 '%1' 에 한 번씩 저장시키고, 그 때 마다 명령을 실행합니다."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://ko.wikipedia.org/wiki/For_%EB%A3%A8%ED%94%84"; -Blockly.Msg.CONTROLS_FOR_TITLE = "으로 계산 %1 %2에서 %4을 이용하여 %3로"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "변수 \"%1\"은 지정된 간격으로 시작 수에서 끝 수까지를 세어 지정된 블록을 수행해야 합니다."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "\"만약\" 블럭에 조건 검사를 추가합니다."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "\"만약\" 블럭의 마지막에, 모든 검사 결과가 거짓인 경우 실행할 부분을 추가합니다."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://ko.wikipedia.org/wiki/%EC%A1%B0%EA%B1%B4%EB%AC%B8"; -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "\"만약\" 블럭의 내용을 추가, 삭제, 재구성 합니다."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "아니라면"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "다른 경우"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "만약"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "조건식의 계산 결과가 참이면, 명령을 실행합니다."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "조건식의 계산 결과가 참이면, 첫번째 블럭의 명령을 실행하고, 그렇지 않으면 두번째 블럭의 명령을 실행합니다."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "첫번째 조건식의 계산 결과가 참이면, 첫번째 블럭의 명령을 실행하고, 두번째 조건식의 계산 결과가 참이면, 두번째 블럭의 명령을 실행합니다."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "첫번째 조건식의 계산 결과가 참이면, 첫번째 블럭의 명령을 실행하고, 두번째 조건식의 계산 결과가 참이면, 두번째 블럭의 명령을 실행하고, ... , 어떤 조건식의 계산 결과도 참이 아니면, 마지막 블럭의 명령을 실행합니다."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://ko.wikipedia.org/wiki/For_루프"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "하기"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1회 반복"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "여러 번 반복해 명령들을 실행합니다."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://ko.wikipedia.org/wiki/While_%EB%A3%A8%ED%94%84"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "다음까지 반복"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "동안 반복"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "값이 거짓일 때, 몇가지 선언을 합니다."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "값이 참일 때, 몇가지 선언을 합니다."; -Blockly.Msg.DELETE_BLOCK = "블록 삭제"; -Blockly.Msg.DELETE_X_BLOCKS = "블록 %1 삭제"; -Blockly.Msg.DISABLE_BLOCK = "블록 비활성화"; -Blockly.Msg.DUPLICATE_BLOCK = "중복됨"; -Blockly.Msg.ENABLE_BLOCK = "블록 활성화"; -Blockly.Msg.EXPAND_ALL = "블록 확장"; -Blockly.Msg.EXPAND_BLOCK = "블록 확장"; -Blockly.Msg.EXTERNAL_INPUTS = "외부 입력"; -Blockly.Msg.HELP = "도움말"; -Blockly.Msg.INLINE_INPUTS = "내부 입력"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "빈 리스트 생성"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "아이템이 없는, 빈 리스트를 만들어 돌려줍니다."; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "리스트"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "리스트 블럭의 내용을 추가, 삭제, 재구성 합니다."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "리스트 만들기"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "아이템을 리스트에 추가합니다."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "원하는 아이템 갯수로 리스트를 생성합니다."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "첫번째"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "마지막 번째 위치부터, # 번째"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "아이템 가져오기"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "잘라 내기"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "마지막"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "임의로"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "삭제"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "첫 번째 아이템을 찾아 돌려줍니다."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "특정 위치의 아이템을 찾아 돌려줍니다. #1 은 마지막 아이템."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "특정 위치의 아이템을 찾아 돌려줍니다. #1 은 첫번째 아이템."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "마지막 아이템을 찾아 돌려줍니다."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "리스트의 아이템들 중, 랜덤으로 선택해 돌려줍니다."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "첫 번째 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "특정 위치의 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다. #1 는 마지막 아이템."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "특정 위치의 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다. #1 는 첫번째 아이템."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "마지막 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "목록에서 임의 위치의 아이템을 찾아내 삭제하고 돌려줍니다."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "리스트에서 첫 번째 아이템을 삭제합니다."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "특정 위치의 아이템을 찾아내 삭제합니다. #1 는 마지막 아이템."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "특정 위치의 아이템을 찾아내 삭제합니다. #1 는 첫번째 아이템."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "리스트에서 마지막 아이템을 찾아 삭제합니다."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "리스트에서 랜덤하게 아이템을 삭제합니다."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "끝에서부터 # 번째로"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "앞에서부터 # 번째로"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "마지막으로"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "첫 번째 위치부터, 서브 리스트 추출"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "마지막부터 # 번째 위치부터, 서브 리스트 추출"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "처음 # 번째 위치부터, 서브 리스트 추출"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "특정 부분을 복사해 새로운 리스트로 생성합니다."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "처음으로 나타난 위치"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; -Blockly.Msg.LISTS_INDEX_OF_LAST = "마지막으로 나타난 위치"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "아이템이 나타난, 처음 또는 마지막 위치를 찾아 돌려줍니다. 아이템이 없으면 0 돌려줌."; -Blockly.Msg.LISTS_INLIST = "리스트"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1이 비어 있습니다"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "목록이 비었을 때 참을 반환합니다."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; -Blockly.Msg.LISTS_LENGTH_TITLE = "%1의 길이"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "리스트에 포함되어있는, 아이템 갯수를 돌려줍니다."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_REPEAT_TITLE = "%1 을 %2 번 넣어, 리스트 생성"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "원하는 값을, 원하는 갯수 만큼 넣어, 새로운 리스트를 생성합니다."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "에"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "에서 원하는 위치에 삽입"; -Blockly.Msg.LISTS_SET_INDEX_SET = "에서 설정"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "아이템을 리스트의 첫번째 위치에 삽입합니다."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "아이템을 리스트의 특정 위치에 삽입합니다. 마지막 아이템은 #1."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "아이템을 리스트의 특정 위치에 삽입합니다. 첫번째 아이템은 #1."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "리스트의 마지막에 아이템을 추가합니다."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "목록에서 임의 위치에 아이템을 삽입합니다."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "첫 번째 위치의 아이템으로 설정합니다."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "특정 번째 위치의 아이템으로 설정합니다. #1 는 마지막 아이템."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "특정 번째 위치의 아이템으로 설정합니다. #1 는 첫번째 아이템."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "마지막 아이템으로 설정합니다."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "목록에서 임의 위치의 아이템을 설정합니다."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "텍스트에서 목록 만들기"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "목록에서 텍스트 만들기"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "구분 기호로 분리 된 하나의 텍스트에 텍스트 의 목록을 넣으세요."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "각 속보, 텍스트의 목록들에서 텍스트를 분할합니다."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "분리와"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "거짓"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://ko.wikipedia.org/wiki/%EC%A7%84%EB%A6%BF%EA%B0%92"; -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "참 혹은 거짓 모두 반환합니다."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "참"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "두 값이 같으면, 참(true) 값을 돌려줍니다."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "첫 번째 값이 두 번째 값보다 크면, 참(true) 값을 돌려줍니다."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "첫 번째 값이 두 번째 값보다 크거나 같으면, 참(true) 값을 돌려줍니다."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "첫 번째 값이 두 번째 값보다 작으면, 참(true) 값을 돌려줍니다."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "첫 번째 값이 두 번째 값보다 작거나 같으면, 참(true) 값을 돌려줍니다."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "두 값이 서로 다르면, 참(true) 값을 돌려줍니다."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://ko.wikipedia.org/wiki/%EB%B6%80%EC%A0%95"; -Blockly.Msg.LOGIC_NEGATE_TITLE = "%1 의 반대"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "입력값이 거짓이라면 참을 반환합니다. 참이라면 거짓을 반환합니다."; -Blockly.Msg.LOGIC_NULL = "빈 값"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "빈 값을 반환합니다."; -Blockly.Msg.LOGIC_OPERATION_AND = "그리고"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://ko.wikipedia.org/wiki/%EB%B6%88_%EB%85%BC%EB%A6%AC"; -Blockly.Msg.LOGIC_OPERATION_OR = "또는"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "두 값이 모두 참(true) 값이면, 참 값을 돌려줍니다."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "적어도 하나의 값이 참일 경우 참을 반환합니다."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "테스트"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "만약 거짓이라면"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "만약 참이라면"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "'검사' 를 진행해, 결과가 참(true)이면 '참이면' 부분의 값을 돌려줍니다. ; 결과가 참이 아니면, '거짓이면' 부분의 값을 돌려줍니다."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "두 수의 합을 반환합니다."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "두 수의 나눈 결과를 반환합니다."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "두 수간의 차이를 반환합니다."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "두 수의 곱을 반환합니다."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "첫 번째 수를 두 번째 수 만큼, 거듭제곱 한 결과값을 돌려줍니다."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "바꾸기 %1 만큼 %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "변수 '%1' 에 저장되어있는 값에, 어떤 수를 더해, 변수에 다시 저장합니다."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "일반적인 상수 값들 중 하나를 돌려줍니다. : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://ko.wikipedia.org/wiki/%ED%81%B4%EB%9E%A8%ED%95%91_(%EA%B7%B8%EB%9E%98%ED%94%BD)"; -Blockly.Msg.MATH_CONSTRAIN_TITLE = "%1 의 값을, 최소 %2 최대 %3 으로 조정"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "어떤 수를, 특정 범위의 값이 되도록 강제로 조정합니다."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "가 다음 수로 나누어 떨어지면 :"; -Blockly.Msg.MATH_IS_EVEN = "가 짝수(even) 이면"; -Blockly.Msg.MATH_IS_NEGATIVE = "가 음(-)수 이면"; -Blockly.Msg.MATH_IS_ODD = "가 홀수(odd) 이면"; -Blockly.Msg.MATH_IS_POSITIVE = "가 양(+)수 이면"; -Blockly.Msg.MATH_IS_PRIME = "가 소수(prime) 이면"; -Blockly.Msg.MATH_IS_TOOLTIP = "어떤 수가 짝 수, 홀 수, 소 수, 정 수, 양 수, 음 수, 나누어 떨어지는 수 인지 검사해 결과값을 돌려줍니다. 참(true) 또는 거짓(false) 값을 돌려줌."; -Blockly.Msg.MATH_IS_WHOLE = "가 정수이면"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "%1 를 %2 로 나눈 나머지"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "첫 번째 수를 두 번째 수로 나눈, 나머지 값을 돌려줍니다."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "x"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "수"; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "평균값"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "최대값"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "중간값"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "최소값"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "가장 여러 개 있는 값"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "목록의 임의 아이템"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "표준 편차"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "합"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "리스트에 들어있는 수(값)들에 대해, 산술 평균(arithmetic mean) 한 값을 돌려줍니다."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "리스트에 들어있는 수(값) 들 중, 가장 큰(max) 수(값)를 돌려줍니다."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "리스트에 들어있는 수(값) 들 중, 중간(median) 수(값)를 돌려줍니다."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "리스트에 들어있는 수(값) 들 중, 가장 작은(min) 수(값)를 돌려줍니다."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "리스트에 들어있는 아이템들 중에서, 가장 여러 번 들어있는 아이템들을 리스트로 만들어 돌려줍니다. (최빈값, modes)"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "목록에서 임의의 아이템을 돌려줍니다."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "리스트에 들어있는 수(값)들에 대해, 표준 편차(standard deviation) 를 구해 돌려줍니다."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "리스트에 들어있는 수(값)들을, 모두 합(sum) 한, 총합(sum)을 돌려줍니다."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "임의 분수"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "0.0 (포함)과 1.0 (배타적) 사이의 임의 분수 값을 돌려줍니다."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "랜덤정수(%1<= n <=%2)"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "두 주어진 제한된 범위 사이의 임의 정수값을 돌려줍니다."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "반올림"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "버림"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "올림"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "어떤 수를 반올림/올림/버림한 결과를, 정수값으로 돌려줍니다."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "절대값"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "제곱근"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "어떤 수의 절대값(absolute)을 계산한 결과를, 정수값으로 돌려줍니다."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "e 의, 거듭제곱(power) 값을 돌려줍니다."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "어떤 수의, 자연로그(natural logarithm) 값을 돌려줍니다.(밑 e, 예시 log e x)"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "어떤 수의, 기본로그(logarithm) 값을 돌려줍니다.(밑 10, 예시 log 10 x)"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "음(-)/양(+), 부호를 반대로 하여 값을 돌려줍니다."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "10 의, 거듭제곱(power) 값을 돌려줍니다."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "숫자의 제곱근을 반환합니다."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "acos"; -Blockly.Msg.MATH_TRIG_ASIN = "asin"; -Blockly.Msg.MATH_TRIG_ATAN = "atan"; -Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; -Blockly.Msg.MATH_TRIG_TAN = "tan"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "어떤 수에 대한, acos(arccosine) 값을 돌려줍니다."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "어떤 수에 대한, asin(arcsine) 값을 돌려줍니다."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "어떤 수에 대한, atan(arctangent) 값을 돌려줍니다."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "어떤 각도(degree, radian 아님)의, cos(cosine) 값을 계산해 돌려줍니다."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "어떤 각도(degree, radian 아님)의, sin(sine) 값을 계산해 돌려줍니다."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "어떤 각도(degree, radian 아님)의, tan(tangent) 값을 계산해 돌려줍니다."; -Blockly.Msg.ME = "나"; -Blockly.Msg.NEW_VARIABLE = "새 변수"; -Blockly.Msg.NEW_VARIABLE_TITLE = "새 변수 이름:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "서술 허가"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "사용:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "미리 정의해 둔 '%1' 함수를 실행합니다."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "미리 정의해 둔 '%1' 함수를 실행하고, 함수를 실행한 결과 값을 돌려줍니다."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "사용:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "'%1' 생성"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98_%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "함수 이름"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "함수"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "실행 후, 결과 값을 돌려주지 않는 함수를 만듭니다."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98_%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "다음을 돌려줌"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "실행 후, 결과 값을 돌려주는 함수를 만듭니다."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "경고: 이 함수에는, 같은 이름을 사용하는 매개 변수들이 있습니다."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "함수 정의 찾기"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "값이 참이라면, 두번째 값을 반환합니다."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "경고: 이 블럭은, 함수 정의 블럭 안에서만 사용할 수 있습니다."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "매개 변수:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "함수에 값을 더합니다."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "매개 변수들"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "이 함수를 추가, 삭제, 혹은 재정렬합니다."; -Blockly.Msg.REMOVE_COMMENT = "내용 제거"; -Blockly.Msg.RENAME_VARIABLE = "변수 이름 바꾸기:"; -Blockly.Msg.RENAME_VARIABLE_TITLE = "'%1' 변수 이름을 바꾸기:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "내용 덧붙이기"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; -Blockly.Msg.TEXT_APPEND_TO = "다음"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "'%1' 의 마지막에 문장을 덧붙입니다."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "소문자로"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "첫 문자만 대문자로"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "대문자로"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "영문 대소문자 형태를 변경해 돌려줍니다."; -Blockly.Msg.TEXT_CHARAT_FIRST = "에서, 첫 번째 문자 얻기"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "에서, 마지막부터 # 번째 위치의 문자 얻기"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "에서, 앞에서부터 # 번째 위치의 문자 얻기"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "문장"; -Blockly.Msg.TEXT_CHARAT_LAST = "에서, 마지막 문자 얻기"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "에서, 랜덤하게 한 문자 얻기"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "특정 번째 위치에서, 문자를 얻어내 돌려줍니다."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "문장을 만들 조각 아이템"; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "가입"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "이 문장 블럭의 구성을 추가, 삭제, 재구성 합니다."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "끝에서부터 # 번째 문자까지"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "# 번째 문자까지"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "마지막 문자까지"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "문장"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "에서, 처음부터 얻어냄"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "에서, 마지막에서 # 번째부터 얻어냄"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "에서, 처음부터 # 번째 문자부터 얻어냄"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "문장 중 일부를 얻어내 돌려줍니다."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "문장"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "에서 다음 문장이 처음으로 나타난 위치 찾기 :"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "에서 다음 문장이 마지막으로 나타난 위치 찾기 :"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "어떤 문장이 가장 처음 나타난 위치 또는, 가장 마지막으로 나타난 위치를 찾아 돌려줍니다. 찾는 문장이 없는 경우는 0 값을 돌려줌."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1이 비어 있습니다"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "입력된 문장이, 빈 문장(\"\")이면 참(true) 값을 돌려줍니다."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "텍스트 만들기"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "여러 개의 아이템들을 연결해(묶어), 새로운 문장을 만듭니다."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; -Blockly.Msg.TEXT_LENGTH_TITLE = "다음 문장의 문자 개수 %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "입력된 문장의, 문자 개수를 돌려줍니다.(공백문자 포함)"; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; -Blockly.Msg.TEXT_PRINT_TITLE = "다음 내용 출력 %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "원하는 문장, 수, 값 등을 출력합니다."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "수 입력 받음."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "문장 입력 받음."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "다음 안내 멘트를 활용해 수 입력"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "다음 안내 멘트를 활용해 문장 입력"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "문자, 단어, 문장."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "양쪽의 공백 문자 제거"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "왼쪽의 공백 문자 제거"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "오른쪽의 공백 문자 제거"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "문장의 왼쪽/오른쪽/양쪽에서 스페이스 문자를 제거해 돌려줍니다."; -Blockly.Msg.TODAY = "오늘"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "항목"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "'집합 %1' 생성"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://ko.wikipedia.org/wiki/%EB%B3%80%EC%88%98_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)"; -Blockly.Msg.VARIABLES_GET_TOOLTIP = "변수에 저장 되어있는 값을 돌려줍니다."; -Blockly.Msg.VARIABLES_SET = "바꾸기 %1 를 다음 값으로 바꾸기 %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "'%1 값 읽기' 블럭 생성"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://ko.wikipedia.org/wiki/%EB%B3%80%EC%88%98_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)"; -Blockly.Msg.VARIABLES_SET_TOOLTIP = "변수의 값을 입력한 값으로 변경해 줍니다."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/mk.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/mk.js deleted file mode 100644 index 6a56130..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/mk.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.mk'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Додај коментар:"; -Blockly.Msg.AUTH = "Овластете го извршников за да можете да ја зачувате вашата работа и да можете да ја споделувате."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Смена на вредност:"; -Blockly.Msg.CHAT = "Разговарајте со вашиот соработник во ова поле!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Собери блокови"; -Blockly.Msg.COLLAPSE_BLOCK = "Собери блок"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "боја 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "боја 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "сооднос"; -Blockly.Msg.COLOUR_BLEND_TITLE = "смешај"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Меша две бои во даден сооднос (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://mk.wikipedia.org/wiki/Боја"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Изберете боја од палетата."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "случајна боја"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Избери боја на тепка."; -Blockly.Msg.COLOUR_RGB_BLUE = "сина"; -Blockly.Msg.COLOUR_RGB_GREEN = "зелена"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "црвена"; -Blockly.Msg.COLOUR_RGB_TITLE = "боја со"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Создајте боја со укажаните износи на црвена, зелена и сина. Сите вредности мора да бидат помеѓу 0 и 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "излези од јамката"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "продолжи со следното повторување на јамката"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Излези од содржечката јамка."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the rest of this loop, and continue with the next iteration."; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warning: This block may only be used within a loop."; // untranslated -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "за секој елемент %1 на списокот %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Му ја задава променливата „%1“ на секој елемент на списокот, а потоа исполнува наредби."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "број со %1 од %2 до %3 со %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Променливата \"%1\" да ги земе вредностите од почетниот до завршниот број, броејќи според укажаниот интервал и ги исполнува укажаните блокови."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block."; // untranslated -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block."; // untranslated -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Додава, отстранува или прередува делови за прераспоредување на овој блок „ако“."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "инаку"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "инаку ако"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "ако"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "If a value is true, then do some statements."; // untranslated -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://mk.wikipedia.org/wiki/For-јамка"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "исполни"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "повтори %1 пати"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Исполнува наредби неколку пати."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "повторувај сè до"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "повторувај додека"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Додека вредноста е невистинита, исполнува наредби."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Додека вредноста е вистинита, исполнува наредби."; -Blockly.Msg.DELETE_BLOCK = "Избриши блок"; -Blockly.Msg.DELETE_X_BLOCKS = "Избриши %1 блока"; -Blockly.Msg.DISABLE_BLOCK = "Исклучи блок"; -Blockly.Msg.DUPLICATE_BLOCK = "Ископирај"; -Blockly.Msg.ENABLE_BLOCK = "Вклучи блок"; -Blockly.Msg.EXPAND_ALL = "Рашири блокови"; -Blockly.Msg.EXPAND_BLOCK = "Рашири го блокови"; -Blockly.Msg.EXTERNAL_INPUTS = "Надворешен внос"; -Blockly.Msg.HELP = "Помош"; -Blockly.Msg.INLINE_INPUTS = "Внатрешен внос"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "create empty list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "list"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "create list with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Add an item to the list."; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_FIRST = "first"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# from end"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "get"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "get and remove"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_LAST = "last"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "random"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "remove"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returns the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Removes and returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Removes and returns the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Removes the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Removes the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "to # from end"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "to #"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "to last"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "get sub-list from first"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated -Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated -Blockly.Msg.LISTS_INLIST = "in list"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty."; // untranslated -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "length of %1"; // untranslated -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; // untranslated -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "as"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INSERT = "insert at"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_SET = "set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserts the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserts the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "невистина"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Дава или вистина или невистина."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "вистина"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://mk.wikipedia.org/wiki/Неравенство"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Дава вистина ако обата вноса се еднакви."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Дава вистина ако првиот внос е поголем од вториот."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Дава вистина ако првиот внос е поголем или еднаков на вториот."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Дава вистина ако првиот внос е помал од вториот."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Дава вистина ако првиот внос е помал или еднаков на вториот."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Дава вистина ако обата вноса не се еднакви."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "не %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Дава вистина ако вносот е невистинит. Дава невистина ако вносот е вистинит."; -Blockly.Msg.LOGIC_NULL = "ништо"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Дава ништо."; -Blockly.Msg.LOGIC_OPERATION_AND = "и"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "или"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Дава вистина ако обата вноса се вистинити."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Дава вистина ако барем еден од вносовите е вистинит."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "испробај"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "ако е невистинито"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "ако е вистинито"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Return the sum of the two numbers."; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers."; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Return the difference of the two numbers."; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Return the product of the two numbers."; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; // untranslated -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter?uselang=mk"; -Blockly.Msg.MATH_CHANGE_TITLE = "повиши %1 за %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Ѝ додава број на променливата „%1“."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://mk.wikipedia.org/wiki/Математичка_константа"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Дава една од вообичаените константи: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), или ∞ (бесконечност)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "е делив со"; -Blockly.Msg.MATH_IS_EVEN = "е парен"; -Blockly.Msg.MATH_IS_NEGATIVE = "е негативен"; -Blockly.Msg.MATH_IS_ODD = "е непарен"; -Blockly.Msg.MATH_IS_POSITIVE = "е позитивен"; -Blockly.Msg.MATH_IS_PRIME = "е прост"; -Blockly.Msg.MATH_IS_TOOLTIP = "Проверува дали бројот е парен, непарен, прост, цел, позитивен, негативен или делив со некој број. Дава вистина или невистина."; -Blockly.Msg.MATH_IS_WHOLE = "е цел"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated -Blockly.Msg.MATH_MODULO_TITLE = "remainder of %1 ÷ %2"; // untranslated -Blockly.Msg.MATH_MODULO_TOOLTIP = "Return the remainder from dividing the two numbers."; // untranslated -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; // untranslated -Blockly.Msg.MATH_NUMBER_TOOLTIP = "A number."; // untranslated -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "просек на списокот"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "најголем на списокот"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "медијана на списокот"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "најмал на списокот"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "модул на списокот"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "random item of list"; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standard deviation of list"; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "збир од списокот"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Дава просек (аритметичка средина) од броевите на списокот."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Го дава најголемиот број на списокот."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Дава медијана од броевите на списокот."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Го дава најмалиот број на списокот."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Дава список на најзастапен(и) елемент(и) на списокот."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Return a random element from the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Дава збир од сите броеви на списокот."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "random fraction"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated -Blockly.Msg.MATH_RANDOM_INT_TITLE = "random integer from %1 to %2"; // untranslated -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; // untranslated -Blockly.Msg.MATH_ROUND_HELPURL = "https://mk.wikipedia.org/wiki/Заокружување"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "заокружи"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "заокружи на помало"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "заокружи на поголемо"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Го заокружува бројот на поголем или помал."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; // untranslated -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolute"; // untranslated -Blockly.Msg.MATH_SINGLE_OP_ROOT = "square root"; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Return the natural logarithm of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Return the base 10 logarithm of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Return the negation of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Return the square root of a number."; // untranslated -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated -Blockly.Msg.ME = "Мене"; -Blockly.Msg.NEW_VARIABLE = "Нова променлива..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Назив на новата променлива:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "with:"; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "with:"; // untranslated -Blockly.Msg.PROCEDURES_CREATE_DO = "Create '%1'"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "do something"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "to"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "return"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; // untranslated -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; // untranslated -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; // untranslated -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; // untranslated -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; // untranslated -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated -Blockly.Msg.REMOVE_COMMENT = "Отстрани коментар"; -Blockly.Msg.RENAME_VARIABLE = "Преименувај променлива..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Преименувај ги сите променливи „%1“ во:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "append text"; // untranslated -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "to"; // untranslated -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; // untranslated -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "to lower case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "to UPPER CASE"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated -Blockly.Msg.TEXT_CHARAT_FIRST = "get first letter"; // untranslated -Blockly.Msg.TEXT_CHARAT_FROM_END = "get letter # from end"; // untranslated -Blockly.Msg.TEXT_CHARAT_FROM_START = "get letter #"; // untranslated -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in text"; // untranslated -Blockly.Msg.TEXT_CHARAT_LAST = "get last letter"; // untranslated -Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; // untranslated -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "join"; // untranslated -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; // untranslated -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "create text with"; // untranslated -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "length of %1"; // untranslated -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; // untranslated -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "print %1"; // untranslated -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; // untranslated -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated -Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; // untranslated -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "trim spaces from both sides of"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated -Blockly.Msg.TODAY = "Today"; // untranslated -Blockly.Msg.VARIABLES_DEFAULT_NAME = "елемент"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; // untranslated -Blockly.Msg.VARIABLES_SET = "set %1 to %2"; // untranslated -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ms.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/ms.js deleted file mode 100644 index 0cf42bc..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ms.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.ms'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Berikan Komen"; -Blockly.Msg.AUTH = "Sila benarkan aplikasi ini untuk membolehkan hasil kerja anda disimpan, malah dikongsikan oleh anda."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Ubah nilai:"; -Blockly.Msg.CHAT = "Bersembang dengan rakan kerjasama anda dengan menaip di dalam petak ini!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Lipat Blok²"; -Blockly.Msg.COLLAPSE_BLOCK = "Lipat Blok"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "warna 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "warna 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "nisbah"; -Blockly.Msg.COLOUR_BLEND_TITLE = "adun"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Campurkan dua warna sekali pada nisbah yang ditentukan (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ms.wikipedia.org/wiki/Warna"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Pilih satu warna daripada palet."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "warna rawak"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Pilih satu warna secara rawak."; -Blockly.Msg.COLOUR_RGB_BLUE = "biru"; -Blockly.Msg.COLOUR_RGB_GREEN = "hijau"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "merah"; -Blockly.Msg.COLOUR_RGB_TITLE = "warnakan"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Peroleh satu warna dengan menentukan amaun campuran merah, hijau dan biru. Kesemua nilai haruslah antara 0 hingga 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "hentikan gelung"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "teruskan dengan lelaran gelung seterusnya"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Keluar dari gelung pengandung."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Langkau seluruh gelung yang tinggal dan bersambung dengan lelaran seterusnya."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Amaran: Blok ini hanya boleh digunakan dalam satu gelung."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "untuk setiap perkara %1 dalam senarai %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Untuk setiap perkara dalam senarai, tetapkan pembolehubah '%1' pada perkara, kemudian lakukan beberapa perintah."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "kira dengan %1 dari %2 hingga %3 selang %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Gunakan pembolehubah \"%1\" pada nilai-nilai dari nombor pangkal hingga nombor hujung, mengira mengikut selang yang ditentukan, dan lakukan blok-blok yang tertentu."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Tambah satu syarat kepada blok jika."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Tambah yang terakhir, alihkan semua keadaan ke blok jika."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Tambah, alih keluar, atau susun semula bahagian-bahagian untuk menyusun semula blok jika."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "lain"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "lain jika"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "jika"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Jika nilai yang benar, lakukan beberapa penyata."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Jika suatu nilai benar, lakukan penyata blok pertama. Jika tidak, bina penyata blok kedua."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Jika nilai yang pertama adalah benar, lakukan penyata pertama blok. Sebaliknya, jika nilai kedua adalah benar, lakukan penyata blok kedua."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Jika nilai yang pertama adalah benar, lakukan penyata blok pertama. Sebaliknya, jika nilai kedua adalah benar, lakukan penyata blok kedua. Jika tiada nilai adalah benar, lakukan penyata blok terakhir."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "lakukan"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "ulang %1 kali"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Lakukan perintah berulang kali."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ulangi sehingga"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ulangi apabila"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Lakukan beberapa perintah apabila nilainya palsu (false)."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Lakukan beberapa perintah apabila nilainya benar (true)."; -Blockly.Msg.DELETE_BLOCK = "Hapuskan Blok"; -Blockly.Msg.DELETE_X_BLOCKS = "Hapuskan %1 Blok"; -Blockly.Msg.DISABLE_BLOCK = "Matikan Blok"; -Blockly.Msg.DUPLICATE_BLOCK = "Pendua"; -Blockly.Msg.ENABLE_BLOCK = "Hidupkan Blok"; -Blockly.Msg.EXPAND_ALL = "Buka Blok²"; -Blockly.Msg.EXPAND_BLOCK = "Buka Blok"; -Blockly.Msg.EXTERNAL_INPUTS = "Input Luaran"; -Blockly.Msg.HELP = "Bantuan"; -Blockly.Msg.INLINE_INPUTS = "Input Sebaris"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "Wujudkan senarai kosong"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Kembalikan senarai panjang 0, yang tidak mengandungi rekod data"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "senarai"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Tambah, alih keluar, atau susun semula bahagian-bahagian untuk menyusun semula senarai blok."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "wujudkan senarai dengan"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Tambah item ke dalam senarai."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Wujudkan senarai dengan apa jua nombor item."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "pertama"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# dari akhir"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "dapatkan"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "dapat dan alihkan"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "terakhir"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "rawak"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "alihkan"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Kembalikan item pertama dalam senarai."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Kembalikan item dalam kedudukan yang ditetapkan dalam senarai. #1 ialah item terakhir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Kembalikan item dalam kedudukan yang ditetapkan dalam senarai. #1 ialah item terakhir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Kembalikan item pertama dalam senarai."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Kembalikan item rawak dalam senarai."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Alihkan dan kembalikan item pertama dalam senarai."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Alihkan dan kembalikan item mengikut spesifikasi posisi dalam senarai. #1 ialah item terakhir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Alihkan dan kembalikan item mengikut spesifikasi posisi dalam senarai. #1 ialah item pertama."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Alihkan dan kembalikan item terakhir dalam senarai."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Alihkan dan kembalikan item rawak dalam senarai."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Alihkan item pertama dalam senarai."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Alihkan item mengikut spesifikasi posisi dalam senarai. #1 ialah item terakhir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Alihkan item pada posisi mengikut spesifikasi dalam senarai. #1 ialah item pertama."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Alihkan item terakhir dalam senarai."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Alihkan item rawak dalam senarai."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "ke # dari akhir"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "ke #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "ke akhir"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "dapatkan sub-senarai daripada pertama"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "dapatkan sub-senarai daripada # daripada terakhir"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "dapatkan sub-senarai daripada #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Wujudkan salinan bahagian yang ditentukan dari senarai."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "cari pertama item kejadian"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "cari kejadian akhir item"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Kembalikan indeks kejadian pertama/terakhir item dalam senarai. Kembalikan 0 jika teks tidak ditemui."; -Blockly.Msg.LISTS_INLIST = "dalam senarai"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 adalah kosong"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Kembalikan benar jika senarai kosong."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "panjang %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Kembalikan panjang senarai"; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "wujudkan senarai dengan item %1 diulangi %2 kali"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Wujudkan senarai yang terdiri daripada nilai berulang mengikut nombor yang ditentukan."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "sebagai"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "masukkan pada"; -Blockly.Msg.LISTS_SET_INDEX_SET = "set"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Selit item pada permulaan senarai."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Masukkan item pada posisi yang ditentukan dalam senarai. #1 ialah item terakhir."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Masukkan item pada posisi yand ditentukan dalam senarai. #1 ialah item terakhir."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Tambahkan item dalam senarai akhir."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Selit item secara rawak di dalam senarai."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Set item pertama dalam senarai."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Masukkan item pada posisi yang ditentukan dalam senarai. #1 ialah item terakhir."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Masukkan item pada posisi yang ditentukan dalam senarai. #1 ialah item terakhir."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Set item terakhir dalam senarai."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Set item rawak dalam senarai."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "buat senarai dgn teks"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "buat teks drpd senarai"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Cantumkan senarai teks menjadi satu teks, dipecahkan oleh delimiter."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Pecahkan teks kepada senarai teks, berpecah di setiap delimiter."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "dengan delimiter"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "palsu"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Kembalikan samada benar atau palsu."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "benar"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://id.wikipedia.org/wiki/Pertidaksamaan"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Kembali benar jika kedua-dua input benar antara satu sama lain."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Kembali benar jika input pertama adalah lebih besar daripada input kedua."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Kembali benar jika input pertama adalah lebih besar daripada atau sama dengan input kedua."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Kembali benar jika input pertama adalah lebih kecil daripada input kedua."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Kembali benar jika input pertama adalah lebih kecil daripada atau sama dengan input kedua."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Taip balik benar jika kedua-dua input tidak sama."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "bukan %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "'Benar' akan dibalas jika inputnya salah. 'Salah' akan dibalas jika inputnya benar."; -Blockly.Msg.LOGIC_NULL = "null"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returns null."; -Blockly.Msg.LOGIC_OPERATION_AND = "dan"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "atau"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Return true if both inputs are true."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "Jika palsu"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "Jika benar"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ms.wikipedia.org/wiki/Aritmetik"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Kembalikan jumlah kedua-dua bilangan."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Taip balik hasil bahagi dua nombor tersebut."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Taip balik hasil tolak dua nombor tersebut."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Taip balik hasil darab dua nombor tersebut."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://id.wikipedia.org/wiki/Perjumlahan"; -Blockly.Msg.MATH_CHANGE_TITLE = "perubahan %1 oleh %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Tambah nombor kepada pembolehubah '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://ms.wikipedia.org/wiki/Pemalar_matematik"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "Boleh dibahagikan dengan"; -Blockly.Msg.MATH_IS_EVEN = "Adalah genap"; -Blockly.Msg.MATH_IS_NEGATIVE = "negatif"; -Blockly.Msg.MATH_IS_ODD = "aneh"; -Blockly.Msg.MATH_IS_POSITIVE = "adalah positif"; -Blockly.Msg.MATH_IS_PRIME = "is prime"; -Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; -Blockly.Msg.MATH_IS_WHOLE = "is whole"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://id.wikipedia.org/wiki/Operasi_modulus"; -Blockly.Msg.MATH_MODULO_TITLE = "remainder of %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Taip balik baki yang didapat daripada pembahagian dua nombor tersebut."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://ms.wikipedia.org/wiki/Nombor"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Suatu nombor."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "purata daripada senarai"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "Max senarai"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "Median senarai"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "min dalam senarai"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "jenis senarai"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "Item rawak daripada senarai"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "sisihan piawai bagi senarai"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "Jumlah senarai"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Kembalikan purata (min aritmetik) nilai-nilai angka di dalam senarai."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Pulangkan jumlah terbesar dalam senarai."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Kembalikan nombor median dalam senarai."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Kembalikan nombor terkecil dalam senarai."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Kembali senarai item yang paling biasa dalam senarai."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Kembalikan elemen rawak daripada senarai."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Kembali dengan sisihan piawai daripada senarai."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Kembalikan jumlah semua nombor dalam senarai."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "pecahan rawak"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Kembali sebahagian kecil rawak antara 0.0 (inklusif) dan 1.0 (eksklusif)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "integer rawak dari %1ke %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Kembalikan integer rawak diantara dua had yang ditentukan, inklusif."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "pusingan"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "Pusingan ke bawah"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "pusingan ke atas"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Bulat nombor yang naik atau turun."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://ms.wikipedia.org/wiki/Punca_kuasa_dua"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "mutlak"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "Punca kuasa dua"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Kembalikan nilai mutlak suatu nombor."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Kembalikan e kepada kuasa nombor."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Kembali dalam logaritma nombor asli."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Kembali logarithm 10 asas nombor."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Kembalikan nombor yang songsang."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Kembalikan 10 kepada kuasa nombor."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Kembalikan punca kuasa nombor."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "acos"; -Blockly.Msg.MATH_TRIG_ASIN = "asin"; -Blockly.Msg.MATH_TRIG_ATAN = "atan"; -Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://ms.wikipedia.org/wiki/Fungsi_trigonometri"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; -Blockly.Msg.MATH_TRIG_TAN = "tan"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Kembali arccosine beberapa nombor."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Kembalikan arcsince beberapa nombor."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Kembalikan beberapa nombor arctangent."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Kembalikan darjah kosinus (bukan radian)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Kembalikan darjah sine (bukan radian)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Kembalikan darjah tangen (bukan radian)."; -Blockly.Msg.ME = "Saya"; -Blockly.Msg.NEW_VARIABLE = "Pembolehubah baru..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nama pembolehubah baru:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "bolehkan kenyataan"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "dengan:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://ms.wikipedia.org/wiki/Fungsi"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://ms.wikipedia.org/wiki/Fungsi"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "dengan:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Hasilkan '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "Buat sesuatu"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "Untuk"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Menghasilkan suatu fungsi tanpa output."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "kembali"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Mencipta satu fungsi dengan pengeluaran."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Amaran: Fungsi ini mempunyai parameter yang berganda."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Serlahkan definisi fungsi"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Amaran: Blok ini hanya boleh digunakan dalam fungsi definisi."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Nama input:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Tambah satu input pada fungsi."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Input-input"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Tambah, alih keluar atau susun semula input pada fungsi ini."; -Blockly.Msg.REMOVE_COMMENT = "Padamkan Komen"; -Blockly.Msg.RENAME_VARIABLE = "Tukar nama pembolehubah..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Tukar nama semua pembolehubah '%1' kepada:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "append text"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "Untuk"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "Kepada huruf kecil"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "Kepada HURUF BESAR"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; -Blockly.Msg.TEXT_CHARAT_FIRST = "get first letter"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "get letter # from end"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "get letter #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "Dalam teks"; -Blockly.Msg.TEXT_CHARAT_LAST = "Dapatkan abjad terakhir"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "Dapatkan abjad rawak"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "Sertai"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "untuk huruf terakhir"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "dalam teks"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "dalam teks"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "mencari kejadian pertama teks"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "mencari kejadian terakhir teks"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Kembalikan Indeks kejadian pertama/terakhir dari teks pertama ke dalam teks kedua. Kembalikan 0 Jika teks tidak ditemui."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 adalah kosong"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Kembalikan benar jika teks yang disediakan adalah kosong."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "hasilkan teks dengan"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Hasilkan sebahagian teks dengan menghubungkan apa jua nombor item."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "panjang %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Kembalikan jumlah huruf (termasuk ruang) dalam teks yang disediakan."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "cetak %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Cetak teks yang ditentukan, nombor atau nilai lain."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Peringatan kepada pengguna untuk nombor."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Peringatkan pengguna untuk sebahagian teks."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Prom untuk nombor dengan mesej"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Prom untuk teks dengan mesej"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://ms.wikipedia.org/wiki/Rentetan"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Huruf, perkataan, atau baris teks."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "mengurangkan kawasan dari kedua-dua belah"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "mengurangkan ruang dari sebelah kiri"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "mengurangkan kawasan dari sisi kanan"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Kembali salinan teks dengan ruang yang dikeluarkan daripada satu atau hujung kedua belah."; -Blockly.Msg.TODAY = "Hari ini"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "Perkara"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Hasilkan 'set %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Kembalikan nilai pemboleh ubah ini."; -Blockly.Msg.VARIABLES_SET = "set %1 ke %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Hasilkan 'set %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Set pembolehubah ini supaya sama dengan input."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/nb.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/nb.js deleted file mode 100644 index 67562f4..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/nb.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.nb'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Legg til kommentar"; -Blockly.Msg.AUTH = "Vennligst godkjenn at denne appen gjør det mulig for deg å lagre arbeidet slik at du kan dele det."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Bytt verdi:"; -Blockly.Msg.CHAT = "Chat med din medarbeider ved å skrive i dette feltet!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Skjul blokker"; -Blockly.Msg.COLLAPSE_BLOCK = "Skjul blokk"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "farge 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "farge 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "forhold"; -Blockly.Msg.COLOUR_BLEND_TITLE = "blande"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blander to farger sammen med et gitt forhold (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Velg en farge fra paletten."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "tilfeldig farge"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Velg en tilfeldig farge."; -Blockly.Msg.COLOUR_RGB_BLUE = "blå"; -Blockly.Msg.COLOUR_RGB_GREEN = "grønn"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "rød"; -Blockly.Msg.COLOUR_RGB_TITLE = "farge med"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Lag en farge med angitt verdi av rød, grønn og blå. Alle verdier må være mellom 0 og 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "bryt ut av løkken"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "fortsett med neste gjentakelse av løkken"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Bryt ut av den gjeldende løkken."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Hopp over resten av denne løkken og fortsett med neste gjentakelse."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Advarsel: Denne blokken kan kun brukes innenfor en løkke."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "for hvert element %1 i listen %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For hvert element i en liste, angi variabelen '%1' til elementet, og deretter lag noen setninger."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "tell med %1 fra %2 til %3 med %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Ha variabel \"%1\" ta verdiene fra start nummer til slutt nummer, telle med spesifisert intervall og lag de spesifiserte blokkene."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Legg til en betingelse til hvis blokken."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Legg til hva som skal skje hvis de andre ikke slår til."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Legg til, fjern eller flytt seksjoner i denne hvis-blokken."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "ellers"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "ellers hvis"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "hvis"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Hvis dette er sant, så gjør følgende."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Hvis dette er sant, så utfør den første blokken av instruksjoner. Hvis ikke, utfør den andre blokken."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Hvis det første stemmer, så utfør den første blokken av instruksjoner. Ellers, hvis det andre stemmer, utfør den andre blokken av instruksjoner."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Hvis den første verdien er sann, så utfør den første blokken med setninger. Ellers, hvis den andre verdien er sann, så utfør den andre blokken med setninger. Hvis ingen av verdiene er sanne, så utfør den siste blokken med setninger."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "gjør"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "gjenta %1 ganger"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Gjenta noen instruksjoner flere ganger."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "gjenta til"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "gjenta mens"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Så lenge et utsagn ikke stemmer, gjør noen instruksjoner."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Så lenge et utsagn stemmer, utfør noen instruksjoner."; -Blockly.Msg.DELETE_BLOCK = "Slett blokk"; -Blockly.Msg.DELETE_X_BLOCKS = "Slett %1 blokk(er)"; -Blockly.Msg.DISABLE_BLOCK = "Deaktiver blokk"; -Blockly.Msg.DUPLICATE_BLOCK = "duplikat"; -Blockly.Msg.ENABLE_BLOCK = "Aktiver blokk"; -Blockly.Msg.EXPAND_ALL = "Utvid blokker"; -Blockly.Msg.EXPAND_BLOCK = "Utvid blokk"; -Blockly.Msg.EXTERNAL_INPUTS = "Eksterne kilder"; -Blockly.Msg.HELP = "Hjelp"; -Blockly.Msg.INLINE_INPUTS = "Interne kilder"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "opprett en tom liste"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returnerer en tom liste, altså med lengde 0"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "liste"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Legg til, fjern eller endre rekkefølgen for å endre på denne delen av listen."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "lag en liste med"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Tilføy et element til listen."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Lag en liste med et vilkårlig antall elementer."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "først"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# fra slutten"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "hent"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "hent og fjern"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "siste"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "tilfeldig"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "fjern"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returnerer det første elementet i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returner elementet på den angitte posisjonen i en liste. #1 er det siste elementet."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returner elementet på den angitte posisjonen i en liste. #1 er det første elementet."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returnerer det siste elementet i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returnerer et tilfeldig element i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Fjerner og returnerer det første elementet i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Fjerner og returnerer elementet ved en gitt posisjon i en liste. #1 er det siste elementet."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Fjerner og returnerer elementet ved en gitt posisjon i en liste. #1 er det første elementet."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Fjerner og returnerer det siste elementet i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Fjerner og returnerer et tilfeldig element i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Fjerner det første elementet i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Fjerner et element ved en gitt posisjon i en liste. #1 er det siste elementet."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Fjerner et element ved en gitt posisjon i en liste. #1 er det første elementet."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Fjerner det siste elementet i en liste."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Fjerner et tilfeldig element i en liste."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "til # fra slutten"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "til #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "til siste"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "Hent en del av listen"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "Hent de siste # elementene"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "Hent del-listen fra #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Kopiérer en ønsket del av en liste."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "finn første forekomst av elementet"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "finn siste forekomst av elementet"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returnerer posisjonen til den første/siste forekomsten av elementet i en liste. Returnerer 0 hvis ikke funnet."; -Blockly.Msg.LISTS_INLIST = "i listen"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 er tom"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returnerer sann hvis listen er tom."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "lengden på %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returnerer lengden til en liste."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "Lag en liste hvor elementet %1 forekommer %2 ganger"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Lager en liste hvor den gitte verdien gjentas et antall ganger."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "som"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "sett inn ved"; -Blockly.Msg.LISTS_SET_INDEX_SET = "sett"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Setter inn elementet i starten av en liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Setter inn elementet ved den angitte posisjonen i en liste. #1 er det siste elementet."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Setter inn elementet ved den angitte posisjonen i en liste. #1 er det første elementet."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Tilføy elementet til slutten av en liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Setter inn elementet ved en tilfeldig posisjon i en liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Angir det første elementet i en liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Setter inn elementet ved den angitte posisjonen i en liste. #1 er det siste elementet."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Setter inn elementet ved den angitte posisjonen i en liste. #1 er det første elementet."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Angir det siste elementet i en liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Angir et tilfeldig element i en liste."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "usann"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returnerer enten sann eller usann."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "sann"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Returnerer sann hvis begge inputene er like hverandre."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Returnerer sant hvis det første argumentet er større enn den andre argumentet."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Returnerer sant hvis det første argumentet er større enn eller likt det andre argumentet."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Returnerer sant hvis det første argumentet er mindre enn det andre argumentet."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Returnerer sant hvis det første argumentet er mindre enn eller likt det andre argumentet."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Returnerer sant hvis begge argumentene er ulike hverandre."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "ikke %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returnerer sant hvis argumentet er usant. Returnerer usant hvis argumentet er sant."; -Blockly.Msg.LOGIC_NULL = "null"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returnerer null."; -Blockly.Msg.LOGIC_OPERATION_AND = "og"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "eller"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Returnerer sant hvis begge argumentene er sanne."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Returnerer sant hvis minst ett av argumentene er sant."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "hvis usant"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "hvis sant"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Sjekk betingelsen i 'test'. Hvis betingelsen er sann, da returneres 'hvis sant' verdien. Hvis ikke returneres 'hvis usant' verdien."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://no.wikipedia.org/wiki/Aritmetikk"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Returnerer summen av to tall."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Returner kvotienten av to tall."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Returner differansen mellom to tall."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Returner produktet av to tall."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Returner det første tallet opphøyd i den andre tallet."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "endre %1 ved %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Addere et tall til variabelen '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Returner en av felleskonstantene π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), eller ∞ (uendelig)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "begrense %1 lav %2 høy %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Begrens et tall til å være mellom de angitte grenseverdiene (inklusiv)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "er delelig med"; -Blockly.Msg.MATH_IS_EVEN = "er et partall"; -Blockly.Msg.MATH_IS_NEGATIVE = "er negativer negativt"; -Blockly.Msg.MATH_IS_ODD = "er et oddetall"; -Blockly.Msg.MATH_IS_POSITIVE = "er positivt"; -Blockly.Msg.MATH_IS_PRIME = "er et primtall"; -Blockly.Msg.MATH_IS_TOOLTIP = "Sjekk om et tall er et partall, oddetall, primtall, heltall, positivt, negativt, eller om det er delelig med et annet tall. Returnerer sant eller usant."; -Blockly.Msg.MATH_IS_WHOLE = "er et heltall"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "resten av %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Returner resten fra delingen av to tall."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "x"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Et tall."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "gjennomsnittet av listen"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maksimum av liste"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "medianen til listen"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimum av listen"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "Listens typetall"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "tilfeldig element i listen"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standardavviket til listen"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "summen av listen"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Returner det aritmetiske gjennomsnittet av tallene i listen."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Returner det største tallet i listen."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Returner listens median."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Returner det minste tallet i listen."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Returner en liste av de vanligste elementene i listen."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Returner et tilfeldig element fra listen."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Returner listens standardavvik."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Returner summen av alle tallene i listen."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "tilfeldig flyttall"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Returner et tilfeldig flyttall mellom 0.0 (inkludert) og 1.0 (ikke inkludert)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "Et tilfeldig heltall mellom %1 og %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Returner et tilfeldig tall mellom de to spesifiserte grensene, inkludert de to."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "avrunding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "rund ned"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "rund opp"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Avrund et tall ned eller opp."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absoluttverdi"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "kvadratrot"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Returner absoluttverdien av et tall."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Returner e opphøyd i et tall."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Returner den naturlige logaritmen til et tall."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Returner base-10 logaritmen til et tall."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Returner det negative tallet."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Returner 10 opphøyd i et tall."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Returner kvadratroten av et tall."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "acos"; -Blockly.Msg.MATH_TRIG_ASIN = "asin"; -Blockly.Msg.MATH_TRIG_ATAN = "atan"; -Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; -Blockly.Msg.MATH_TRIG_TAN = "tan"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Returner arccosinus til et tall."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Returner arcsinus til et tall."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Returner arctangens til et tall."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Returner cosinus av en vinkel (ikke radian)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Returner sinus av en vinkel (ikke radian)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Returner tangenten av en vinkel (ikke radian)."; -Blockly.Msg.ME = "Jeg"; -Blockly.Msg.NEW_VARIABLE = "Ny variabel..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nytt variabelnavn:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "tillat uttalelser"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "med:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Kjør den brukerdefinerte funksjonen '%1'."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Kjør den brukerdefinerte funksjonen'%1' og bruk resultatet av den."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "med:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Opprett '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "gjør noe"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "til"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Opprett en funksjon som ikke har noe resultat."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "returner"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Oppretter en funksjon som har et resultat."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Advarsel: Denne funksjonen har duplikate parametere."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Marker funksjonsdefinisjonen"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Hvis en verdi er sann, returner da en annen verdi."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Advarsel: Denne blokken kan bare benyttes innenfor en funksjonsdefinisjon."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Navn på parameter:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Legg til en input til funksjonen."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "parametere"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Legg til, fjern eller endre rekkefølgen på input til denne funksjonen."; -Blockly.Msg.REMOVE_COMMENT = "Fjern kommentar"; -Blockly.Msg.RENAME_VARIABLE = "Gi nytt navn til variabel..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Endre navnet til alle '%1' variabler til:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "tilføy tekst"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "til"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Tilføy tekst til variabelen '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "til små bokstaver"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "til store forbokstaver"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "til STORE BOKSTAVER"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Returnerer en kopi av teksten der store og små bokstaver er byttet om."; -Blockly.Msg.TEXT_CHARAT_FIRST = "hent første bokstav"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "hent bokstav # fra slutten"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "hent bokstav #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "i tekst"; -Blockly.Msg.TEXT_CHARAT_LAST = "hent den siste bokstaven"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "hent en tilfeldig bokstav"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returnerer bokstaven på angitt plassering."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Legg til et element til teksten."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "føy sammen"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Legg til, fjern eller forandre rekkefølgen for å forandre på denne tekstblokken."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "til bokstav # fra slutten"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "til bokstav #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "til siste bokstav"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "i tekst"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "hent delstreng fra første bokstav"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "hent delstreng fra bokstav # fra slutten"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "hent delstreng fra bokstav #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returnerer den angitte delen av teksten."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "i tekst"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "finn første forekomst av tekst"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "finn siste forekomst av tekst"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returnerer posisjonen for første/siste forekomsten av den første tekst i den andre teksten. Returnerer 0 hvis teksten ikke blir funnet."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 er tom"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returnerer sann hvis den angitte teksten er tom."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "lage tekst med"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Opprett en tekst ved å sette sammen et antall elementer."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "lengden av %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returnerer antall bokstaver (inkludert mellomrom) i den angitte teksten."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "skriv ut %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Skriv ut angitt tekst, tall eller annet innhold."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Be brukeren om et tall."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Spør brukeren om tekst."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "spør om et tall med en melding"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "spør om tekst med en melding"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "En bokstav, ett ord eller en linje med tekst."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "fjern mellomrom fra begge sider av"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "fjern mellomrom fra venstre side av"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "fjern mellomrom fra høyre side av"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Returner en kopi av teksten med mellomrom fjernet fra en eller begge sidene."; -Blockly.Msg.TODAY = "I dag"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Opprett 'sett %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returnerer verdien av denne variabelen."; -Blockly.Msg.VARIABLES_SET = "sett %1 til %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Opprett 'hent %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Setter verdien av denne variablen lik parameteren."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/nl.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/nl.js deleted file mode 100644 index 9f12e70..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/nl.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.nl'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Reactie toevoegen"; -Blockly.Msg.AUTH = "Sta deze app toe om uw werk op te slaan het uw werk te delen."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Waarde wijzigen:"; -Blockly.Msg.CHAT = "Chat met iemand die ook aan het werk is via dit venster!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Blokken inklappen"; -Blockly.Msg.COLLAPSE_BLOCK = "Blok inklappen"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "kleur 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "kleur 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "verhouding"; -Blockly.Msg.COLOUR_BLEND_TITLE = "mengen"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mengt twee kleuren samen met een bepaalde verhouding (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://nl.wikipedia.org/wiki/Kleur"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Kies een kleur in het palet."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "willekeurige kleur"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Kies een willekeurige kleur."; -Blockly.Msg.COLOUR_RGB_BLUE = "blauw"; -Blockly.Msg.COLOUR_RGB_GREEN = "groen"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "rood"; -Blockly.Msg.COLOUR_RGB_TITLE = "kleuren met"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Maak een kleur met de opgegeven hoeveelheid rood, groen en blauw. Alle waarden moeten tussen 0 en 100 liggen."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "uit lus breken"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "doorgaan met de volgende iteratie van de lus"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "uit de bovenliggende lus breken"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "De rest van deze lus overslaan en doorgaan met de volgende herhaling."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Waarschuwing: dit blok mag alleen gebruikt worden in een lus."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "voor ieder item %1 in lijst %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Voor ieder item in een lijst, stel de variabele \"%1\" in op het item en voer daarna opdrachten uit."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; -Blockly.Msg.CONTROLS_FOR_TITLE = "rekenen met %1 van %2 tot %3 in stappen van %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Laat de variabele \"%1\" de waarden aannemen van het beginnummer tot het laatste nummer, tellende met het opgegeven interval, en met uitvoering van de opgegeven blokken."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Voeg een voorwaarde toe aan het als-blok."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Voeg een laatste, vang-alles conditie toe aan het als-statement."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Voeg stukken toe, verwijder of verander de volgorde om dit \"als\"-blok te wijzigen."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "anders"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "anders als"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "als"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Als een waarde waar is, voer dan opdrachten uit."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Als een waarde waar is, voert dan het eerste blok met opdrachten uit. Voer andere het tweede blok met opdrachten uit."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Als de eerste waarde waar is, voer dan het eerste blok met opdrachten uit. Voer anders, als de tweede waarde waar is, het tweede blok met opdrachten uit."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Als de eerste waarde \"waar\" is, voer dan het eerste blok uit. Voer anders wanneer de tweede waarde \"waar\" is, het tweede blok uit. Als geen van beide waarden waar zijn, voer dan het laatste blok uit."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://nl.wikipedia.org/wiki/Repetitie_(informatica)#For_en_Foreach"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "voer uit"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1 keer herhalen"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Voer een aantal opdrachten meerdere keren uit."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "herhalen totdat"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "herhalen zolang"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Terwijl een waarde onwaar is de volgende opdrachten uitvoeren."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Terwijl een waarde waar is de volgende opdrachten uitvoeren."; -Blockly.Msg.DELETE_BLOCK = "Blok verwijderen"; -Blockly.Msg.DELETE_X_BLOCKS = "%1 blokken verwijderen"; -Blockly.Msg.DISABLE_BLOCK = "Blok uitschakelen"; -Blockly.Msg.DUPLICATE_BLOCK = "Duplicaat"; -Blockly.Msg.ENABLE_BLOCK = "Blok inschakelen"; -Blockly.Msg.EXPAND_ALL = "Blokken uitvouwen"; -Blockly.Msg.EXPAND_BLOCK = "Blok uitvouwen"; -Blockly.Msg.EXTERNAL_INPUTS = "Externe invoer"; -Blockly.Msg.HELP = "Hulp"; -Blockly.Msg.INLINE_INPUTS = "Inline invoer"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "maak een lege lijst"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Geeft een lijst terug met lengte 0, zonder items"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lijst"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Voeg stukken toe, verwijder ze of verander de volgorde om dit lijstblok aan te passen."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "maak een lijst met"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Voeg iets toe aan de lijst."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Maak een lijst met een willekeurig aantal items."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "eerste"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# van einde"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "haal op"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "haal op en verwijder"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "laatste"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "willekeurig"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "verwijder"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Geeft het eerste item in een lijst terug."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Geeft het item op de opgegeven positie in een lijst terug. Item 1 is het laatste item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Geeft het item op de opgegeven positie in een lijst. Item 1 is het eerste item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Geeft het laatste item in een lijst terug."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Geeft een willekeurig item uit een lijst."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Geeft het laatste item in een lijst terug en verwijdert het."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Verwijdert en geeft het item op de opgegeven positie in de lijst. Item 1 is het laatste item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Geeft het item op de opgegeven positie in een lijst terug en verwijdert het. Item 1 is het eerste item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Geeft het laatste item uit een lijst terug en verwijdert het."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Geeft een willekeurig item in een lijst terug en verwijdert het."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Verwijdert het eerste item in een lijst."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Verwijdert een item op de opgegeven positie in een lijst. Item 1 is het laatste item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Verwijdert het item op de opgegeven positie in een lijst. Item 1 is het eerste item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Verwijdert het laatste item uit een lijst."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Verwijdert een willekeurig item uit een lijst."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "naar # vanaf einde"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "naar item"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "naar laatste"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "haal sublijst op vanaf eerste"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "haal sublijst op van positie vanaf einde"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "haal sublijst op vanaf positie"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Maakt een kopie van het opgegeven deel van de lijst."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "zoek eerste voorkomen van item"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; -Blockly.Msg.LISTS_INDEX_OF_LAST = "zoek laatste voorkomen van item"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Geeft de index van het eerste of laatste voorkomen van een item in de lijst terug. Geeft 0 terug als de tekst niet is gevonden."; -Blockly.Msg.LISTS_INLIST = "in lijst"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is leeg"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Geeft waar terug als de lijst leeg is."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; -Blockly.Msg.LISTS_LENGTH_TITLE = "lengte van %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Geeft de lengte van een lijst terug."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_REPEAT_TITLE = "Maak lijst met item %1, %2 keer herhaald"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Maakt een lijst die bestaat uit de opgegeven waarde, het opgegeven aantal keer herhaald."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "als"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "tussenvoegen op"; -Blockly.Msg.LISTS_SET_INDEX_SET = "stel in"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Voegt het item toe aan het begin van de lijst."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Voegt het item op de opgegeven positie toe aan een lijst in. Item 1 is het laatste item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Voegt het item op een opgegeven positie in een lijst in. Item 1 is het eerste item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Voeg het item aan het einde van een lijst toe."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Voegt het item op een willekeurige positie in de lijst in."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Stelt het eerste item in een lijst in."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Stelt het item op een opgegeven positie in de lijst in. Item 1 is het laatste item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Stelt het item op de opgegeven positie in de lijst in. Item 1 is het eerste item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Stelt het laatste item van een lijst in."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Stelt een willekeurig item uit de lijst in."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "lijst maken van tekst"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "tekst maken van lijst"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Lijst van tekstdelen samenvoegen in één stuk tekst, waarbij de tekstdelen gescheiden zijn door een scheidingsteken."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Tekst splitsen in een tekst van tekst op basis van een scheidingsteken."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "met scheidingsteken"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "onwaar"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Geeft \"waar\" of \"onwaar\" terug."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "waar"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://nl.wikipedia.org/wiki/Ongelijkheid_(wiskunde)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Geeft \"waar\", als beide waarden gelijk aan elkaar zijn."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Geeft \"waar\" terug als de eerste invoer meer is dan de tweede invoer."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Geeft \"waar\" terug als de eerste invoer groter is of gelijk aan de tweede invoer."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Geeft \"waar\" als de eerste invoer kleiner is dan de tweede invoer."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Geeft \"waar\" terug als de eerste invoer kleiner of gelijk is aan de tweede invoer."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Geeft \"waar\" terug als de waarden niet gelijk zijn aan elkaar."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; -Blockly.Msg.LOGIC_NEGATE_TITLE = "niet %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Geeft \"waar\" terug als de invoer \"onwaar\" is. Geeft \"onwaar\" als de invoer \"waar\" is."; -Blockly.Msg.LOGIC_NULL = "niets"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Geeft niets terug."; -Blockly.Msg.LOGIC_OPERATION_AND = "en"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; -Blockly.Msg.LOGIC_OPERATION_OR = "of"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Geeft waar als beide waarden waar zijn."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Geeft \"waar\" terug als in ieder geval één van de waarden waar is."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "als onwaar"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "als waar"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Test de voorwaarde in \"test\". Als de voorwaarde \"waar\" is, geef de waarde van \"als waar\" terug; geef anders de waarde van \"als onwaar\" terug."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://nl.wikipedia.org/wiki/Rekenen"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Geeft de som van 2 getallen."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Geeft de gedeelde waarde van twee getallen."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Geeft het verschil van de twee getallen."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Geeft het product terug van de twee getallen."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Geeft het eerste getal tot de macht van het tweede getal."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "%1 wijzigen met %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Voegt een getal toe aan variabele \"%1\"."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://nl.wikipedia.org/wiki/Wiskundige_constante"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Geeft een van de vaak voorkomende constante waardes: π (3.141…), e (2.718…), φ (1.618…), √2 (1.414…), √½ (0.707…), of ∞ (oneindig)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "beperk %1 van minimaal %2 tot maximaal %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Beperk een getal tussen de twee opgegeven limieten (inclusief)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "is deelbaar door"; -Blockly.Msg.MATH_IS_EVEN = "is even"; -Blockly.Msg.MATH_IS_NEGATIVE = "is negatief"; -Blockly.Msg.MATH_IS_ODD = "is oneven"; -Blockly.Msg.MATH_IS_POSITIVE = "is positief"; -Blockly.Msg.MATH_IS_PRIME = "is priemgetal"; -Blockly.Msg.MATH_IS_TOOLTIP = "Test of een getal even, oneven, een priemgetal, geheel, positief of negatief is, of deelbaar is door een bepaald getal. Geeft \"waar\" of \"onwaar\"."; -Blockly.Msg.MATH_IS_WHOLE = "is geheel getal"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://nl.wikipedia.org/wiki/Modulair_rekenen"; -Blockly.Msg.MATH_MODULO_TITLE = "restgetal van %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Geeft het restgetal van het resultaat van de deling van de twee getallen."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://nl.wikipedia.org/wiki/Getal_%28wiskunde%29"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Een getal."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "gemiddelde van lijst"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "hoogste uit lijst"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediaan van lijst"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "laagste uit lijst"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modi van lijst"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "willekeurige item van lijst"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standaarddeviatie van lijst"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "som van lijst"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Geeft het gemiddelde terug van de numerieke waardes in een lijst."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Geeft het grootste getal in een lijst."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Geeft de mediaan in de lijst."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Geeft het kleinste getal uit een lijst."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Geeft een lijst van de meest voorkomende onderdelen in de lijst."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Geeft een willekeurig item uit de lijst terug."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Geeft de standaardafwijking van de lijst."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Geeft de som van alle getallen in de lijst."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://nl.wikipedia.org/wiki/Toevalsgenerator"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "willekeurige fractie"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Geeft een willekeurige fractie tussen 0.0 (inclusief) en 1.0 (exclusief)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://nl.wikipedia.org/wiki/Toevalsgenerator"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "willekeurig geheel getal van %1 tot %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Geeft een willekeurig getal tussen de 2 opgegeven limieten in, inclusief."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://nl.wikipedia.org/wiki/Afronden"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "afronden"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "naar beneden afronden"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "omhoog afronden"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Rondt een getal af omhoog of naar beneden."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://nl.wikipedia.org/wiki/Vierkantswortel"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absoluut"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "wortel"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Geeft de absolute waarde van een getal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Geeft e tot de macht van een getal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Geeft het natuurlijk logaritme van een getal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Geeft het logaritme basis 10 van een getal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Geeft de negatief van een getal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Geeft 10 tot de macht van een getal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Geeft de wortel van een getal."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "acos"; -Blockly.Msg.MATH_TRIG_ASIN = "asin"; -Blockly.Msg.MATH_TRIG_ATAN = "arctan"; -Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://nl.wikipedia.org/wiki/Goniometrische_functie"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; -Blockly.Msg.MATH_TRIG_TAN = "tan"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Geeft de arccosinus van een getal."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Geeft de arcsinus van een getal."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Geeft de arctangens van een getal."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Geeft de cosinus van een graad (geen radialen)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Geeft de sinus van een graad (geen radialen)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Geeft de tangens van een graad (geen radialen)."; -Blockly.Msg.ME = "Ik"; -Blockly.Msg.NEW_VARIABLE = "Nieuwe variabele..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nieuwe variabelenaam:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "statements toestaan"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "met:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://nl.wikipedia.org/wiki/Subprogramma"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Voer de door de gebruiker gedefinieerde functie \"%1\" uit."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://nl.wikipedia.org/wiki/Subprogramma"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Voer de door de gebruiker gedefinieerde functie \"%1\" uit en gebruik de uitvoer."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "met:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Maak \"%1\""; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://nl.wikipedia.org/wiki/Subprogramma"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "doe iets"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "om"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Maakt een functie zonder uitvoer."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://nl.wikipedia.org/wiki/Subprogramma"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "uitvoeren"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Maakt een functie met een uitvoer."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Waarschuwing: deze functie heeft parameters met dezelfde naam."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Accentueer functiedefinitie"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Als de eerste waarde \"waar\" is, geef dan de tweede waarde terug."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Waarschuwing: dit blok mag alleen gebruikt worden binnen de definitie van een functie."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "invoernaam:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Een invoer aan de functie toevoegen."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "ingangen"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Invoer van deze functie toevoegen, verwijderen of herordenen."; -Blockly.Msg.REMOVE_COMMENT = "Opmerking verwijderen"; -Blockly.Msg.RENAME_VARIABLE = "Variabele hernoemen..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Alle variabelen \"%1\" hernoemen naar:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "tekst"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; -Blockly.Msg.TEXT_APPEND_TO = "voeg toe aan"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Voeg tekst toe aan de variabele \"%1\"."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "naar kleine letters"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "naar Hoofdletter Per Woord"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "naar HOOFDLETTERS"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Geef een kopie van de tekst met veranderde hoofdletters terug."; -Blockly.Msg.TEXT_CHARAT_FIRST = "haal eerste letter op"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "haal letter # op vanaf einde"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "haal letter # op"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in tekst"; -Blockly.Msg.TEXT_CHARAT_LAST = "haal laatste letter op"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "haal willekeurige letter op"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Geeft de letter op de opgegeven positie terug."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Voegt een item aan de tekst toe."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "samenvoegen"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Toevoegen, verwijderen of volgorde veranderen van secties om dit tekstblok opnieuw in te stellen."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "van letter # tot einde"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "naar letter #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "naar laatste letter"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in tekst"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "haal subtekst op van eerste letter"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "haal subtekst op vanaf letter # vanaf einde"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "haal subtekst op vanaf letter #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Geeft het opgegeven onderdeel van de tekst terug."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in tekst"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "zoek eerste voorkomen van tekst"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "zoek het laatste voorkomen van tekst"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Geeft de index terug van de eerste/laatste aanwezigheid van de eerste tekst in de tweede tekst. Geeft 0 terug als de tekst niet gevonden is."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is leeg"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Geeft \"waar\" terug, als de opgegeven tekst leeg is."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "maak tekst met"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Maakt een stuk tekst door één of meer items samen te voegen."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; -Blockly.Msg.TEXT_LENGTH_TITLE = "lengte van %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Geeft het aantal tekens terug (inclusief spaties) in de opgegeven tekst."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; -Blockly.Msg.TEXT_PRINT_TITLE = "tekst weergeven: %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Drukt de opgegeven tekst, getal of een andere waarde af."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Vraagt de gebruiker om een getal in te voeren."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Vraagt de gebruiker om invoer."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "vraagt de gebruiker om een getal met de tekst"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "vraagt om invoer met bericht"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://nl.wikipedia.org/wiki/String_%28informatica%29"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Een letter, woord of een regel tekst."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "spaties van beide kanten afhalen van"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "spaties van de linkerkant verwijderen van"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "spaties van de rechterkant verwijderen van"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Geeft een kopie van de tekst met verwijderde spaties van één of beide kanten."; -Blockly.Msg.TODAY = "Vandaag"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Maak \"verander %1\""; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Geeft de waarde van deze variabele."; -Blockly.Msg.VARIABLES_SET = "stel %1 in op %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Maak 'opvragen van %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Verandert de waarde van de variabele naar de waarde van de invoer."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/oc.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/oc.js deleted file mode 100644 index c6dd8b7..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/oc.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.oc'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Apondre un comentari"; -Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated -Blockly.Msg.CHANGE_VALUE_TITLE = "Modificar la valor :"; -Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!"; // untranslated -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Redusir los blòts"; -Blockly.Msg.COLLAPSE_BLOCK = "Redusir lo blòt"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "color 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "color 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "ratio"; -Blockly.Msg.COLOUR_BLEND_TITLE = "mesclar"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://oc.wikipedia.org/wiki/Color"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Choose a colour from the palette."; // untranslated -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "color aleatòria"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Causir una color a l'azard."; -Blockly.Msg.COLOUR_RGB_BLUE = "blau"; -Blockly.Msg.COLOUR_RGB_GREEN = "verd"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "roge"; -Blockly.Msg.COLOUR_RGB_TITLE = "colorar amb"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "break out of loop"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continue with next iteration of loop"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Break out of the containing loop."; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the rest of this loop, and continue with the next iteration."; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warning: This block may only be used within a loop."; // untranslated -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "per cada element %1 dins la lista %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For each item in a list, set the variable '%1' to the item, and then do some statements."; // untranslated -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "comptar amb %1 de %2 a %3 per %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; // untranslated -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block."; // untranslated -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block."; // untranslated -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Add, remove, or reorder sections to reconfigure this if block."; // untranslated -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "siquenon"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "siquenon se"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "se"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "If a value is true, then do some statements."; // untranslated -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://oc.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "far"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "repetir %1 còps"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Do some statements several times."; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repetir fins a"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repetir tant que"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "While a value is false, then do some statements."; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "While a value is true, then do some statements."; // untranslated -Blockly.Msg.DELETE_BLOCK = "Suprimir lo blòt"; -Blockly.Msg.DELETE_X_BLOCKS = "Suprimir %1 blòts"; -Blockly.Msg.DISABLE_BLOCK = "Desactivar lo blòt"; -Blockly.Msg.DUPLICATE_BLOCK = "Duplicar"; -Blockly.Msg.ENABLE_BLOCK = "Activar lo blòt"; -Blockly.Msg.EXPAND_ALL = "Desvolopar los blòts"; -Blockly.Msg.EXPAND_BLOCK = "Desvolopar lo blòt"; -Blockly.Msg.EXTERNAL_INPUTS = "Entradas extèrnas"; -Blockly.Msg.HELP = "Ajuda"; -Blockly.Msg.INLINE_INPUTS = "Entradas en linha"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "create empty list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "crear una lista amb"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Add an item to the list."; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_FIRST = "primièr"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# dempuèi la fin"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "obténer"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "obténer e suprimir"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "darrièr"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aleatòri"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "suprimit"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returns the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Removes and returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Removes and returns the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Removes the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Removes the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "fins a # dempuèi la fin"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "fins a #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "fins a la fin"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "get sub-list from first"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated -Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated -Blockly.Msg.LISTS_INLIST = "dins la lista"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty."; // untranslated -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "length of %1"; // untranslated -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; // untranslated -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "coma"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "inserir en"; -Blockly.Msg.LISTS_SET_INDEX_SET = "metre"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserts the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserts the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "fals"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returns either true or false."; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "verai"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Return true if both inputs equal each other."; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Return true if the first input is greater than the second input."; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Return true if the first input is greater than or equal to the second input."; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Return true if the first input is smaller than the second input."; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Return true if the first input is smaller than or equal to the second input."; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Return true if both inputs are not equal to each other."; // untranslated -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "pas %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returns true if the input is false. Returns false if the input is true."; // untranslated -Blockly.Msg.LOGIC_NULL = "nul"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Renvia nul."; -Blockly.Msg.LOGIC_OPERATION_AND = "e"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "o"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Return true if both inputs are true."; // untranslated -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true."; // untranslated -Blockly.Msg.LOGIC_TERNARY_CONDITION = "tèst"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "se fals"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "se verai"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://oc.wikipedia.org/wiki/Aritmetica"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Return the sum of the two numbers."; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers."; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Return the difference of the two numbers."; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Return the product of the two numbers."; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; // untranslated -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated -Blockly.Msg.MATH_CHANGE_TITLE = "incrementar %1 per %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; // untranslated -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "es devesible per"; -Blockly.Msg.MATH_IS_EVEN = "es par"; -Blockly.Msg.MATH_IS_NEGATIVE = "es negatiu"; -Blockly.Msg.MATH_IS_ODD = "es impar"; -Blockly.Msg.MATH_IS_POSITIVE = "es positiu"; -Blockly.Msg.MATH_IS_PRIME = "es primièr"; -Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated -Blockly.Msg.MATH_IS_WHOLE = "es entièr"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated -Blockly.Msg.MATH_MODULO_TITLE = "remainder of %1 ÷ %2"; // untranslated -Blockly.Msg.MATH_MODULO_TOOLTIP = "Return the remainder from dividing the two numbers."; // untranslated -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://oc.wikipedia.org/wiki/Nombre"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un nombre."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "mejana de la lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maximum de la lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana de la lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimum de la lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modes of list"; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "random item of list"; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standard deviation of list"; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "soma de la lista"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Return the average (arithmetic mean) of the numeric values in the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Return the largest number in the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Return the median number in the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Return the smallest number in the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Return a list of the most common item(s) in the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Return a random element from the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Return the sum of all the numbers in the list."; // untranslated -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "random fraction"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated -Blockly.Msg.MATH_RANDOM_INT_TITLE = "random integer from %1 to %2"; // untranslated -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; // untranslated -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; // untranslated -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arredondir"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arredondir a l’inferior"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arredondir al superior"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Round a number up or down."; // untranslated -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; // untranslated -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolut"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "raiç carrada"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Return the natural logarithm of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Return the base 10 logarithm of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Return the negation of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Return the square root of a number."; // untranslated -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated -Blockly.Msg.ME = "Ieu"; -Blockly.Msg.NEW_VARIABLE = "Variabla novèla…"; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nom de la novèla variabla :"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "amb :"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "amb :"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Crear '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "far quicòm"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "a"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "retorn"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; // untranslated -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; // untranslated -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; // untranslated -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nom de l’entrada :"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entradas"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated -Blockly.Msg.REMOVE_COMMENT = "Suprimir un comentari"; -Blockly.Msg.RENAME_VARIABLE = "Renomenar la variabla…"; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Rename all '%1' variables to:"; // untranslated -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "apondre lo tèxte"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "a"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; // untranslated -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "en minusculas"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "en MAJUSCULAS"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated -Blockly.Msg.TEXT_CHARAT_FIRST = "obténer la primièra letra"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "obténer la letra # dempuèi la fin"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "obténer la letra #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "dins lo tèxte"; -Blockly.Msg.TEXT_CHARAT_LAST = "obténer la darrièra letra"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "obténer una letra a l'azard"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Renvia la letra a la posicion indicada."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "join"; // untranslated -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "fins a la letra #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "dins lo tèxte"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; // untranslated -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "dins lo tèxte"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 es void"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "create text with"; // untranslated -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "longor de %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; // untranslated -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "afichar %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; // untranslated -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated -Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; // untranslated -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "trim spaces from both sides of"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated -Blockly.Msg.TODAY = "Today"; // untranslated -Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crear 'fixar %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; // untranslated -Blockly.Msg.VARIABLES_SET = "fixar %1 a %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/pl.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/pl.js deleted file mode 100644 index b008a5f..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/pl.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.pl'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Dodaj komentarz"; -Blockly.Msg.AUTH = "Proszę autoryzować ten program, aby można było zapisać swoją pracę i umożliwić dzielenie się nią przez ciebie."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Zmień wartość:"; -Blockly.Msg.CHAT = "Rozmawiaj z swoim współpracownikiem, pisząc w tym polu!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Zwiń bloki"; -Blockly.Msg.COLLAPSE_BLOCK = "Zwiń blok"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "kolor 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "kolor 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "proporcja"; -Blockly.Msg.COLOUR_BLEND_TITLE = "mieszanka"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Miesza dwa kolory w danej proporcji (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Wybierz kolor z palety."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "losowy kolor"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Wybierz kolor w sposób losowy."; -Blockly.Msg.COLOUR_RGB_BLUE = "niebieski"; -Blockly.Msg.COLOUR_RGB_GREEN = "zielony"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "czerwony"; -Blockly.Msg.COLOUR_RGB_TITLE = "kolor z"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Połącz czerwony, zielony i niebieski w odpowiednich proporcjach, tak aby powstał nowy kolor. Zawartość każdego z nich określa liczba z przedziału od 0 do 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "wyjść z pętli"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "przejdź do kolejnej iteracji pętli"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Wyjść z zawierającej pętli."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Pomiń resztę pętli i kontynuuj w kolejnej iteracji."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Ostrzeżenie: Ten blok może być użyty tylko w pętli."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "dla każdego elementu %1 na liście %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Dla każdego elementu z listy przyporządkuj zmienną '%1', a następnie wykonaj kilka instrukcji."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "liczyć z %1 od %2 do %3 co %4 (wartość kroku)"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Czy zmienna \"%1\" przyjmuje wartości od numeru startowego do numeru końcowego, licząc przez określony interwał, wykonując określone bloki."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Dodaj warunek do bloku „jeśli”."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Dodaj ostatni warunek do bloku „jeśli”, gdy żaden wcześniejszy nie był spełniony."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Dodaj, usuń lub zmień kolejność bloków, żeby zmodyfikować blok „jeśli”."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "w przeciwnym razie"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "w przeciwnym razie jeśli"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "jeśli"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Jeśli wartość jest prawdziwa, to wykonaj kilka instrukcji."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Jeśli wartość jest prawdziwa, to wykonaj pierwszy blok instrukcji. W przeciwnym razie, wykonaj drugi blok instrukcji."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Jeśli pierwsza wartość jest prawdziwa, to wykonaj pierwszy blok instrukcji. W przeciwnym razie, jeśli druga wartość jest prawdziwa, to wykonaj drugi blok instrukcji."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Jeśli pierwsza wartość jest prawdziwa, wykonaj pierwszy blok instrukcji. W przeciwnym razie jeśli druga wartość jest prawdziwa, wykonaj drugi blok instrukcji. Jeżeli żadna z wartości nie jest prawdziwa, wykonaj ostatni blok instrukcji."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "wykonaj"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "powtórz %1 razy"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Wykonaj niektóre instrukcje kilka razy."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "powtarzaj aż"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "powtarzaj dopóki"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Gdy wartość jest nieprawdziwa, wykonaj kilka instrukcji."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Gdy wartość jest prawdziwa, wykonaj kilka instrukcji."; -Blockly.Msg.DELETE_BLOCK = "Usuń blok"; -Blockly.Msg.DELETE_X_BLOCKS = "Usunąć %1 bloki(ów)"; -Blockly.Msg.DISABLE_BLOCK = "Wyłącz blok"; -Blockly.Msg.DUPLICATE_BLOCK = "Powiel"; -Blockly.Msg.ENABLE_BLOCK = "Włącz blok"; -Blockly.Msg.EXPAND_ALL = "Rozwiń bloki"; -Blockly.Msg.EXPAND_BLOCK = "Rozwiń blok"; -Blockly.Msg.EXTERNAL_INPUTS = "Zewnętrzne wejścia"; -Blockly.Msg.HELP = "Pomoc"; -Blockly.Msg.INLINE_INPUTS = "Wbudowane wejscia"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "utwórz pustą listę"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Zwraca listę, o długości 0, nie zawierającą rekordów z danymi"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Dodać, usunąć lub zmienić kolejność sekcji żeby zrekonfigurować blok tej listy."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "Tworzenie listy z"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Dodaj element do listy."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Utwórz listę z dowolną ilością elementów."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "pierwszy"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# od końca"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "pobierz"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "Pobierz i usuń"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "ostatni"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "losowy"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "usuń"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Zwraca pierwszy element z listy."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Zwraca element z określonej pozycji na liście. #1 to ostatni element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Zwraca element z konkretnej pozycji na liście. #1 to pierwszy element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Zwraca ostatni element z listy."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Zwraca losowy element z listy."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Usuwa i zwraca pierwszy element z listy."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Usuwa i zwraca element z określonej pozycji na liście. #1 to ostatni element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Usuwa i zwraca element z określonej pozycji na liście. #1 to pierwszy element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Usuwa i zwraca ostatni element z listy."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Usuwa i zwraca losowy element z listy."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Usuwa pierwszy element z listy."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Usuwa element z określonej pozycji na liście. #1 to ostatni element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Usuwa element z określonej pozycji na liście. #1 to pierwszy element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Usuwa ostatni element z listy."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Usuwa losowy element z listy."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "do # od końca"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "do #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "do ostatniego"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "Pobierz listę podrzędną z pierwszego"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "Pobierz listę podrzędną z # od końca"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "Pobierz listę podrzędną z #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Tworzy kopię z określoną część listy."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "znaleźć pierwsze wystąpienie elementu"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "znajduje ostatanie wystąpienie elementu"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Zwraca indeks pierwszego/ostatniego wystąpienia elementu na liście. Zwraca wartość 0, jeśli tekst nie zostanie znaleziony."; -Blockly.Msg.LISTS_INLIST = "na liście"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 jest pusty"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Zwraca \"prawda\" jeśli lista jest pusta."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "długość %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Zwraca długość listy."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "stwórz listę, powtarzając element %1 %2 razy"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Tworzy listę składającą się z podanej wartości powtórzonej odpowiednią liczbę razy."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "jako"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "wstaw w"; -Blockly.Msg.LISTS_SET_INDEX_SET = "ustaw"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Wstawia element na początku listy."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Wstawia element w odpowiednim miejscu na liście. #1 to ostatni element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Wstawia element w odpowiednim miejscu na liście. #1 to pierwszy element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Dodaj element na koniec listy."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Wstawia element w losowym miejscu na liście."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Ustawia pierwszy element na liście."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Ustawia element w odpowiednie miejsce na liście. #1 to ostatni element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Ustawia element w odpowiednie miejsce na liście. #1 to pierwszy element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Ustawia ostatni element na liście."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Ustawia losowy element na liście."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "stwórz listę z tekstu"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "stwórz tekst z listy"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Łączy listę tekstów w jeden tekst, rozdzielany separatorem."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Rozdziela tekst na listę mniejszych tekstów, dzieląc na każdym separatorze."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "z separatorem"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "fałsz"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Zwraca 'prawda' lub 'fałsz'."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "prawda"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Zwróć \"prawda\", jeśli obie dane wejściowe są sobie równe."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Zwróć \"prawda\" jeśli pierwszy dany element jest większy od drugiego."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Zwróć \"prawda\", jeśli pierwsza dana wejściowa jest większa niż lub równa drugiej danej wejściowej."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Zwróć \"prawda\" jeśli pierwsza dana wejściowa jest większa od drugiej."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Zwróć \"prawda\", jeśli pierwsza dana wejściowa jest większa lub równa drugiej danej wejściowej."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Zwróć \"prawda\", jeśli obie dane wejściowe nie są sobie równe."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "nie %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Zwraca \"prawda\", jeśli dane wejściowe są fałszywe. Zwraca \"fałsz\", jeśli dana wejściowa jest prawdziwa."; -Blockly.Msg.LOGIC_NULL = "nic"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Zwraca nic."; -Blockly.Msg.LOGIC_OPERATION_AND = "i"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "lub"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Zwróć \"prawda\" jeśli oba dane elementy mają wartość \"prawda\"."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Zwróć \"prawda\" jeśli co najmniej jeden dany element ma wartość \"prawda\"."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "jeśli fałsz"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "jeśli prawda"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Sprawdź warunek w „test”. Jeśli warunek jest prawdziwy, to zwróci „jeśli prawda”; jeśli nie jest prawdziwy to zwróci „jeśli fałsz”."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://pl.wikipedia.org/wiki/Arytmetyka"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Zwróć sumę dwóch liczb."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Zwróć iloraz dwóch liczb."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Zwróć różnicę dwóch liczb."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Zwraca iloczyn dwóch liczb."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Zwróć liczbę podniesioną do potęgi o wykładniku drugiej liczby."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "zmień %1 o %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Dodaj liczbę do zmiennej '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Zwróć jedną wspólną stałą: π (3.141), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) lub ∞ (nieskończoność)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "ogranicz %1 z dołu %2 z góry %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Ogranicz liczbę, aby była w określonych granicach (włącznie)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "/"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "jest podzielna przez"; -Blockly.Msg.MATH_IS_EVEN = "jest parzysta"; -Blockly.Msg.MATH_IS_NEGATIVE = "jest ujemna"; -Blockly.Msg.MATH_IS_ODD = "jest nieparzysta"; -Blockly.Msg.MATH_IS_POSITIVE = "jest dodatnia"; -Blockly.Msg.MATH_IS_PRIME = "jest liczbą pierwszą"; -Blockly.Msg.MATH_IS_TOOLTIP = "Sprawdź, czy liczba jest parzysta, nieparzysta, pierwsza, całkowita, dodatnia, ujemna, lub czy jest podzielna przez podaną liczbę. Zwraca wartość \"prawda\" lub \"fałsz\"."; -Blockly.Msg.MATH_IS_WHOLE = "jest liczbą całkowitą"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "reszta z dzielenia %1 przez %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Zwróć resztę z dzielenia dwóch liczb przez siebie."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Liczba."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "średnia z listy"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maksymalna wartość z listy"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana z listy"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimalna wartość z listy"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "dominanty listy"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "losowy element z listy"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "odchylenie standardowe z listy"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "suma z listy"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Zwróć średnią (średnią arytmetyczną) wartości liczbowych z listy."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Zwróć najwyższy numer w liście."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Zwróć medianę liczby na liście."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Zwróć najniższy numer w liście."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Zwróć listę najczęściej występujących elementów na liście."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Zwróć losowy element z listy."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Zwróć odchylenie standardowe listy."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Zwróć sumę wszystkich liczb z listy."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "losowy ułamek"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Zwróć losowy ułamek między 0.0 (włącznie), a 1.0 (wyłącznie)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "losowa liczba całkowita od %1 do %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Zwróć losową liczbę całkowitą w ramach dwóch wyznaczonych granic, włącznie."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "zaokrąglić"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "zaokrąglić w dół"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "zaokrąglić w górę"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Zaokrąglij w górę lub w dół."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "wartość bezwzględna"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "pierwiastek kwadratowy"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Zwróć wartość bezwzględną danej liczby."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Zwróć e do potęgi danej liczby."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Zwróć logarytm naturalny danej liczby."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Zwraca logarytm dziesiętny danej liczby."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Zwróć negację danej liczby."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Zwróć 10 do potęgi danej liczby."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Zwróć pierwiastek kwadratowy danej liczby."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "arc cos"; -Blockly.Msg.MATH_TRIG_ASIN = "arc sin"; -Blockly.Msg.MATH_TRIG_ATAN = "arc tan"; -Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; -Blockly.Msg.MATH_TRIG_TAN = "tan"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Zwróć arcus cosinus danej liczby."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Zwróć arcus sinus danej liczby."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Zwróć arcus tangens danej liczby."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Zwróć wartość cosinusa o stopniu (nie radianach)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Zwróć wartość sinusa o stopniu (nie radianach)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Zwróć tangens o stopniu (nie radianach)."; -Blockly.Msg.ME = "Ja"; -Blockly.Msg.NEW_VARIABLE = "Nowa zmienna..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nowa nazwa zmiennej:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "zezwól na instrukcje"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "z:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Uruchom funkcję zdefiniowaną przez użytkownika '%1'."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Uruchom funkcję zdefiniowaną przez użytkownika '%1' i skorzystaj z jej wyniku."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "z:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Stwórz '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "zrób coś"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "do"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Tworzy funkcję bez wyniku."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "zwróć"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Tworzy funkcję z wynikiem."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Ostrzeżenie: Ta funkcja ma powtórzone parametry."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Podświetl definicję funkcji"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Jeśli wartość jest prawdziwa, zwróć drugą wartość."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Ostrzeżenie: Ten blok może być używany tylko w definicji funkcji."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nazwa wejścia:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Dodaj dane wejściowe do funkcji."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "wejścia"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Dodaj, usuń lub zmień kolejność danych wejściowych dla tej funkcji."; -Blockly.Msg.REMOVE_COMMENT = "Usuń Komentarz"; -Blockly.Msg.RENAME_VARIABLE = "Zmień nazwę zmiennej..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Zmień nazwy wszystkich '%1' zmiennych na:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "dołącz tekst"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "do"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Dołącz tekst do zmiennej '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "zmień na małe litery"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "zmień na od Wielkich Liter"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "zmień na WIELKIE LITERY"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Zwraca kopię tekstu z inną wielkością liter."; -Blockly.Msg.TEXT_CHARAT_FIRST = "pobierz pierwszą literę"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "pobierz literę # od końca"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "pobierz literę #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "z tekstu"; -Blockly.Msg.TEXT_CHARAT_LAST = "pobierz ostatnią literę"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "pobierz losową literę"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Zwraca literę z określonej pozycji."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Dodaj element do tekstu."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "połącz"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Dodaj, usuń lub zmień kolejność sekcji, aby zmodyfikować blok tekstowy."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "do litery # od końca"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "do litery #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "do ostatniej litery"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "w tekście"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "pobierz podciąg od pierwszej litery"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "pobierz podciąg od litery # od końca"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "pobierz podciąg od litery #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Zwraca określoną część tekstu."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "w tekście"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "znajdź pierwsze wystąpienie tekstu"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "znajdź ostatnie wystąpienie tekstu"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Zwraca indeks pierwszego/ostatniego wystąpienia pierwszego tekstu w drugim tekście. Zwraca wartość 0, jeśli tekst nie został znaleziony."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 jest pusty"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Zwraca prawda (true), jeśli podany tekst jest pusty."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "utwórz tekst z"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Tworzy fragment tekstu, łącząc ze sobą dowolną liczbę tekstów."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "długość %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Zwraca liczbę liter (łącznie ze spacjami) w podanym tekście."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "wydrukuj %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Drukuj określony tekst, liczbę lub coś innego."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Zapytaj użytkownika o liczbę."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Zapytaj użytkownika o jakiś tekst."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "poproś o liczbę z tą wiadomością"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "poproś o tekst z tą wiadomością"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Litera, wyraz lub linia tekstu."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "usuń spacje po obu stronach"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "usuń spacje z lewej strony"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "usuń spacje z prawej strony"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Zwraca kopię tekstu z usuniętymi spacjami z jednego lub z obu końców tekstu."; -Blockly.Msg.TODAY = "Dzisiaj"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Utwórz blok 'ustaw %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Zwraca wartość tej zmiennej."; -Blockly.Msg.VARIABLES_SET = "przypisz %1 wartość %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Utwórz blok 'pobierz %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Nadaj tej zmiennej wartość."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/pms.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/pms.js deleted file mode 100644 index 8d3ac63..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/pms.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.pms'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Gionté un coment"; -Blockly.Msg.AUTH = "Për piasì, ch'a autorisa costa aplicassion a përmëtte ëd salvé sò travaj e a autoriselo a esse partagià da chiel."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Modifiché ël valor:"; -Blockly.Msg.CHAT = "Ch'a ciaciara con sò colaborator an scrivend an costa casela!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Arduve ij blòch"; -Blockly.Msg.COLLAPSE_BLOCK = "Arduve ël blòch"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "color 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "color 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "rapòrt"; -Blockly.Msg.COLOUR_BLEND_TITLE = "mës-cé"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "A mës-cia doi color ansema con un rapòrt dàit (0,0 - 1,0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Serne un color ant la taulòssa."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "color a asar"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Serne un color a asar."; -Blockly.Msg.COLOUR_RGB_BLUE = "bleu"; -Blockly.Msg.COLOUR_RGB_GREEN = "verd"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "ross"; -Blockly.Msg.COLOUR_RGB_TITLE = "coloré con"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Creé un color con la quantità spessificà ëd ross, verd e bleu. Tuti ij valor a devo esse antra 0 e 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "seurte da la liassa"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continué con l'iterassion sucessiva dla liassa"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Seurte da la liassa anglobanta."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Sauté ël rest ëd sa liassa, e continué con l'iterassion apress."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Atension: Ës blòch a peul mach esse dovrà andrinta a na liassa."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "për minca n'element %1 ant la lista %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Për minca element an na lista, dé ël valor ëd l'element a la variàbil '%1', peui eseguì chèiche anstrussion."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "conté con %1 da %2 a %3 për %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Fé an manera che la variàbil \"%1\" a pija ij valor dal nùmer inissial fin-a al nùmer final, an contand për l'antërval ëspessificà, e eseguì ij bloch ëspessificà."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Gionté na condission al blòch si."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Gionté na condission final ch'a cheuj tut al blòch si."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Gionté, gavé o riordiné le session për cinfiguré torna ës blòch si."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "dësnò"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "dësnò si"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "si"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Si un valor a l'é ver, antlora eseguì chèiche anstrussion."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Si un valor a l'é ver, antlora eseguì ël prim blòch d'anstrussion. Dësnò, eseguì ël second blòch d'anstrussion."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Si ël prim valor a l'é ver, antlora fé andé ël prim blòch d'anstrussion. Dësnò, si ël second valor a l'é ver, fé andé ël second blòch d'anstrussion."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Si ël prim valor a l'é ver, antlora fé andé ël prim blòch d'anstrussion. Dësnò, si ël second valor a l'é ver, fé andé ël second blòcj d'anstrussion. Si gnun dij valor a l'é ver, fé andé l'ùltim blòch d'anstrussion."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "fé"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "arpete %1 vire"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Eseguì chèiche anstrussion vàire vire."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "arpete fin-a a"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "arpete antramentre che"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Cand un valor a l'é fàuss, eseguì chèiche anstrussion."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Cand un valor a l'é ver, eseguì chèiche anstrussion."; -Blockly.Msg.DELETE_BLOCK = "Scancelé ël blòch"; -Blockly.Msg.DELETE_X_BLOCKS = "Scancelé %1 blòch"; -Blockly.Msg.DISABLE_BLOCK = "Disativé ël blòch"; -Blockly.Msg.DUPLICATE_BLOCK = "Dupliché"; -Blockly.Msg.ENABLE_BLOCK = "Ativé ël blòch"; -Blockly.Msg.EXPAND_ALL = "Dësvlupé ij blòch"; -Blockly.Msg.EXPAND_BLOCK = "Dësvlupé ël blòch"; -Blockly.Msg.EXTERNAL_INPUTS = "Imission esterne"; -Blockly.Msg.HELP = "Agiut"; -Blockly.Msg.INLINE_INPUTS = "Imission an linia"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "creé na lista veuida"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Smon-e na lista, ëd longheur 0, ch'a conten gnun-a argistrassion"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Gionté, gavé o riordiné le session për configuré torna cost blòch ëd lista."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "creé na lista con"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Gionté n'element a la lista."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Creé na lista con un nùmer qualsëssìa d'element."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "prim"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# da la fin"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "oten-e"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "oten-e e eliminé"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "ùltim"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "a l'ancàpit"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "eliminé"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "A smon ël prim element an na lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "A smon l'element a la posission ëspessificà an na lista. #1 a l'é l'ùltim element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "A smon l'element a la posission ëspessificà an na lista. #1 a l'é ël prim element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "A smon l'ùltim element an na lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "A smon n'element a l'ancàpit an na lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "A gava e a smon ël prim element an na lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "A gava e a smon l'element a la posission ëspessificà an na lista. #1 a l'é l'ùltim element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "A gava e a smon l'element a la posission ëspessificà an na lista. #1 a l'é 'l prim element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "A gava e a smon l'ùltim element an na lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "A gava e a smon n'element a l'ancàpit an na lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "A gava ël prim element an na lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "A gava l'element a la posission ëspessificà an na lista. #1 a l'é l'ùltim element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "A gava l'element a la posission ëspessificà an na lista. #1 a l'é ël prim element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "A gava l'ùltim element an na lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "A gava n'element a l'ancàpit da na lista."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "fin-a a # da la fin"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "fin-a a #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "fin-a a l'ùltim"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "oten-e la sot-lista dal prim"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "oten-e la sot-lista da # da la fin"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "oten-e la sot-lista da #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "A crea na còpia dël tòch ëspessificà ëd na lista."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "trové la prima ocorensa dl'element"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "trové l'ùltima ocorensa dl'element"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "A smon l'ìndes ëd la prima/ùltima ocorensa dl'element ant la lista. A smon 0 se ël test a l'é nen trovà."; -Blockly.Msg.LISTS_INLIST = "ant la lista"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 a l'é veuid"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "A smon ver se la lista a l'é veuida."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "longheur ëd %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "A smon la longheur ¨d na lista."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "creé na lista con l'element %1 arpetù %2 vire"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "A crea na lista ch'a consist dël valor dàit arpetù ël nùmer ëspessificà ëd vire."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "tanme"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "anserì an"; -Blockly.Msg.LISTS_SET_INDEX_SET = "buté"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "A anseriss l'element al prinsipi ëd na lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "A anseriss l'element a la posission ëspessificà an na lista. #1 a l'é l'ùltim element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "A anseriss l'element a la posission ëspessificà an na lista. #1 a l'é ël prim element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Gionté l'element a la fin ëd na lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "A anseriss l'element a l'ancàpit an na lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "A fissa ël prim element an na lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "A fissa l'element a la posission ëspessificà an na lista. #1 a l'é l'ùltim element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "A fissa l'element a la posission ëspessificà an na lista. #1 a l'é ël prim element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "A fissa l'ùltim element an na lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "A fissa n'element a l'ancàpit an na lista."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "fé na lista da 'n test"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "fé 'n test da na lista"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Gionze na lista ëd test ant un test sol, separandje con un separator."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Divide un test an na lista ëd test, tajand a minca 'n separator."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "con ël separator"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "fàuss"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "A rëspond ver o fàuss."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "ver"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Rësponde ver si le doe imission a son uguaj."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Rësponde ver si la prima imission a l'é pi granda che la sconda."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Rësponde ver si la prima imission a l'é pi granda o ugual a la sconda."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Rësponde ver si la prima imission a l'é pi cita dla sconda."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Rësponde ver si la prima imission a l'é pi cita o ugual a la sconda."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Rësponde ver si le doe imission a son nen uguaj."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "nen %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "A rëspond ver se l'imission a l'é fàussa. A rëspond fàuss se l'imission a l'é vera."; -Blockly.Msg.LOGIC_NULL = "gnente"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "A rëspond gnente."; -Blockly.Msg.LOGIC_OPERATION_AND = "e"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "o"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Rësponde ver se tute doe j'imission a son vere."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Rësponde ver se almanch un-a d'imission a l'é vera."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "preuva"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "se fàuss"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "se ver"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Controlé la condission an 'preuva'. Se la condission a l'é vera, a rëspond con ël valor 'se ver'; dësnò a rëspond con ël valor 'se fàuss'."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "A smon la soma ëd doi nùmer."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "A smon ël cossient dij doi nùmer."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "A smon la diferensa dij doi nùmer."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "A smon ël prodot dij doi nùmer."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "A smon ël prim nùmer alvà a la potensa dël second."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "ancrementé %1 për %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Gionté un nùmer a la variàbil '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "A smon un-a dle costante comun-e π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) o ∞ (infinì)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "limité %1 antra %2 e %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Limité un nùmer a esse antra le limitassion ëspessificà (comprèise)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "a l'é divisìbil për"; -Blockly.Msg.MATH_IS_EVEN = "a l'é cobi"; -Blockly.Msg.MATH_IS_NEGATIVE = "a l'é negativ"; -Blockly.Msg.MATH_IS_ODD = "a l'é dëscobi"; -Blockly.Msg.MATH_IS_POSITIVE = "a l'é positiv"; -Blockly.Msg.MATH_IS_PRIME = "a l'é prim"; -Blockly.Msg.MATH_IS_TOOLTIP = "A contròla si un nùmer a l'é cobi, dëscobi, prim, antreghm positiv, negativ, o s'a l'é divisìbil për un nùmer dàit. A rëspond ver o fàuss."; -Blockly.Msg.MATH_IS_WHOLE = "a l'é antregh"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "resta ëd %1:%2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "A smon la resta ëd la division dij doi nùmer."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un nùmer."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "media dla lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "màssim ëd la lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mesan-a dla lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "mìnim ëd la lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "mòde dla lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "element a l'ancàpit ëd la lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "deviassion ëstàndard ëd la lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "soma dla lista"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "A smon la media (aritmética) dij valor numérich ant la lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "A smon ël pi gròss nùmer ëd la lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "A smon ël nùmer mesan ëd la lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "A smon ël pi cit nùmer ëd la lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "A smon na lista dj'element pi frequent ëd la lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "A smon n'element a l'ancàpit da la lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "A smon la deviassion ëstàndard ëd la lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "A smon la soma ëd tuti ij nùmer ant la lista."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "frassion aleatòria"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "A smon na frassion aleatòria antra 0,0 (comprèis) e 1,0 (esclus)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "antregh aleatòri antra %1 e %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "A smon n'antregh aleatòri antra ij doi lìmit ëspessificà, comprèis."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "ariondé"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "ariondé për difet"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "ariondé për ecess"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "A arionda un nùmer për difet o ecess."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "assolù"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "rèis quadra"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "A smon ël valor assolù d'un nùmer."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "A smon e a la potensa d'un nùmer."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "A smon ël logaritm natural d'un nùmer."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "A smon ël logaritm an base 10 d'un nùmer."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "A smon l'opòst d'un nùmer."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "A smon 10 a la potensa d'un nùmer."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "A smon la rèis quadra d'un nùmer."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "A smon l'arch-cosen d'un nùmer."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "A smon l'arch-sen d'un nùmer."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "A smon l'arch-tangenta d'un nùmer."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "A smon ël cosen ëd n'àngol an gré (pa an radiant)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "A smon ël sen ëd n'àngol an gré (pa an radiant)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "A smon la tangenta ëd n'àngol an gré (pa an radiant)."; -Blockly.Msg.ME = "Mi"; -Blockly.Msg.NEW_VARIABLE = "Neuva variàbil..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nòm ëd la neuva variàbil:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "përmëtte le diciairassion"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "con:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Eseguì la fonsion '%1' definìa da l'utent."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Eseguì la fonsion '%1' definìa da l'utent e dovré sò arzultà."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "con:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Creé '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "fé cheicòs"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "a"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "A crea na fonsion sensa surtìa."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "artorn"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "A crea na fonsion con na surtìa."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Atension: Costa fonsion a l'ha dij paràmeter duplicà."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Sot-ligné la definission dla fonsion"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Se un valor a l'é ver, antlora smon-e un second valor."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Atension: Ës blòch a podria esse dovrà mach an na definission ëd fonsion."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nòm ëd l'imission:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Gionté n'imission a la fonsion."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "imission"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Gionté, gavé o riordiné j'imission ëd sa fonsion."; -Blockly.Msg.REMOVE_COMMENT = "Scancelé un coment"; -Blockly.Msg.RENAME_VARIABLE = "Arnomé la variàbil..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Arnomé tute le variàbij '%1' 'me:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "taché ël test"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "a"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Taché dël test a la variàbil '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "an minùscul"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "an Majùscol A L'Ancamin Ëd Minca Paròla"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "an MAJÙSCOL"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "A smon na còpia dël test ant un caràter diferent."; -Blockly.Msg.TEXT_CHARAT_FIRST = "oten-e la prima litra"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "oten-e la litra # da la fin"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "oten-e la litra #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "ant ël test"; -Blockly.Msg.TEXT_CHARAT_LAST = "oten-e l'ùltima litra"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "oten-e na litra a l'ancàpit"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "A smon la litra ant la posission ëspessificà."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Gionté n'element al test."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "gionze"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Gionté, gavé o riordiné le session për configuré torna ës blòch ëd test."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "fin-a a la litra # da la fin"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "fin-a a la litra #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "fin-a a l'ùltima litra"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "ant ël test"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "oten-e la sota-stringa da la prima litra"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "oten-e la sota-stringa da la litra # da la fin"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "oten-e la sota-stringa da la litra #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "A smon un tòch ëspessificà dël test."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "ant ël test"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "trové la prima ocorensa dël test"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "trové l'ùltima ocorensa dël test"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "A smon l'ìndes dla prima/ùltima ocorensa dël prim test ant ël second test. A smon 0 se ël test a l'é nen trovà."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 a l'é veuid"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "A smon ver se ël test fornì a l'é veuid."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "creé ël test con"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Creé un tòch ëd test an gionzend un nùmer qualsëssìa d'element."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "longheur ëd %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "A smon ël nùmer ëd litre (spassi comprèis) ant ël test fornì."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "smon-e %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Smon-e ël test, ël nùmer o n'àutr valor ëspessificà."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Ciamé un nùmer a l'utent."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Ciamé un test a l'utent."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "anvit për un nùmer con un mëssagi"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "anvit për un test con un mëssagi"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Na litra, na paròla o na linia ëd test."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "gavé jë spassi da le doe bande ëd"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "gavé jë spassi da la banda snistra ëd"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "gavé jë spassi da la banda drita ëd"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "A smon na còpia dël test con jë spassi gavà da n'estremità o da tute doe."; -Blockly.Msg.TODAY = "Ancheuj"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Creé 'fissé %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "A smon ël valor ëd sa variàbil."; -Blockly.Msg.VARIABLES_SET = "fissé %1 a %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Creé 'oten-e %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Fissé costa variàbil ugual al valor d'imission."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/pt-br.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/pt-br.js deleted file mode 100644 index 5b45dfe..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/pt-br.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.pt.br'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Adicionar comentário"; -Blockly.Msg.AUTH = "Por favor autorize este aplicativo para permitir que o seu trabalho seja gravado e que ele seja compartilhado por você."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Mudar valor:"; -Blockly.Msg.CHAT = "Converse com o seu colaborador digitando nesta caixa!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Recolher blocos"; -Blockly.Msg.COLLAPSE_BLOCK = "Recolher bloco"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "cor 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "cor 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "proporção"; -Blockly.Msg.COLOUR_BLEND_TITLE = "misturar"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mistura duas cores em uma dada proporção (0,0 - 1,0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://pt.wikipedia.org/wiki/Cor"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Escolher uma cor da palheta de cores."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "cor aleatória"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Escolher cor de forma aleatória."; -Blockly.Msg.COLOUR_RGB_BLUE = "azul"; -Blockly.Msg.COLOUR_RGB_GREEN = "verde"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "vermelho"; -Blockly.Msg.COLOUR_RGB_TITLE = "colorir com"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Cria uma cor de acordo com a quantidade especificada de vermelho, verde e azul. Todos os valores devem estar entre 0 e 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "encerra o laço"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continua com a próxima iteração do laço"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Encerra o laço."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Ignora o resto deste laço, e continua com a próxima iteração."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Atenção: Este bloco só pode ser usado dentro de um laço."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "para cada item %1 na lista %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Para cada item em uma lista, atribui o item à variável '%1' e então realiza algumas instruções."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "contar com %1 de %2 até %3 por %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Faz com que a variável '%1' assuma os valores do número inicial ao número final, contando de acordo com o intervalo especificado e executa os blocos especificados."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Acrescente uma condição para o bloco se."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Acrescente uma condição final para o bloco se."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Acrescente, remova ou reordene seções para reconfigurar este bloco."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "senão"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "senão se"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "se"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Se um valor for verdadeiro, então realize algumas instruções."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Se um valor for verdadeiro, então realize o primeiro bloco de instruções. Senão, realize o segundo bloco de instruções."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Se o primeiro valor é verdadeiro, então realize o primeiro bloco de instruções. Senão, se o segundo valor é verdadeiro, realize o segundo bloco de instruções."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Se o primeiro valor for verdadeiro, então realize o primeiro bloco de instruções. Senão, se o segundo valor é verdadeiro, realize o segundo bloco de instruções. Se nenhum dos blocos for verdadeiro, realize o último bloco de instruções."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://pt.wikipedia.org/wiki/Estrutura_de_repeti%C3%A7%C3%A3o#Repeti.C3.A7.C3.A3o_com_vari.C3.A1vel_de_controle"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "faça"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "repita %1 vezes"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Faça algumas instruções várias vezes."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repita até"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repita enquanto"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Enquanto um valor for falso, então faça algumas instruções."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Enquanto um valor for verdadeiro, então faça algumas instruções."; -Blockly.Msg.DELETE_BLOCK = "Remover bloco"; -Blockly.Msg.DELETE_X_BLOCKS = "Remover %1 blocos"; -Blockly.Msg.DISABLE_BLOCK = "Desabilitar bloco"; -Blockly.Msg.DUPLICATE_BLOCK = "Duplicar"; -Blockly.Msg.ENABLE_BLOCK = "Habilitar bloco"; -Blockly.Msg.EXPAND_ALL = "Expandir blocos"; -Blockly.Msg.EXPAND_BLOCK = "Expandir bloco"; -Blockly.Msg.EXTERNAL_INPUTS = "Entradas externas"; -Blockly.Msg.HELP = "Ajuda"; -Blockly.Msg.INLINE_INPUTS = "Entradas incorporadas"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "criar lista vazia"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Retorna uma lista, de tamanho 0, contendo nenhum registro"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Acrescenta, remove ou reordena seções para reconfigurar este bloco de lista."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "criar lista com"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Acrescenta um item à lista."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Cria uma lista com a quantidade de itens informada."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "primeiro"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "nº a partir do final"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "nº"; -Blockly.Msg.LISTS_GET_INDEX_GET = "obter"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "obter e remover"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "último"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aleatório"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "remover"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Retorna o primeiro item em uma lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Retorna o item da lista na posição especificada. #1 é o último item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Retorna o item da lista na posição especificada. #1 é o primeiro item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Retorna o último item em uma lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Retorna um item aleatório de uma lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Remove e retorna o primeiro item de uma lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Remove e retorna o item na posição especificada em uma lista. #1 é o último item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Remove e retorna o item na posição especificada em uma lista. #1 é o primeiro item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Remove e retorna o último item de uma lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Remove e retorna um item aleatório de uma lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Remove o primeiro item de uma lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Remove o item na posição especificada em uma lista. #1 é o último item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Remove o item na posição especificada em uma lista. #1 é o primeiro item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Remove o último item de uma lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Remove um item aleatório de uma lista."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "até nº a partir do final"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "até nº"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "até último"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "obtém sublista a partir do primeiro"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "obtém sublista de nº a partir do final"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "obtém sublista de nº"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Cria uma cópia da porção especificada de uma lista."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "encontre a primeira ocorrência do item"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "encontre a última ocorrência do item"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do item na lista. Retorna 0 se o texto não for encontrado."; -Blockly.Msg.LISTS_INLIST = "na lista"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 é vazia"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Retona verdadeiro se a lista estiver vazia."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "tamanho de %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Retorna o tamanho de uma lista."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "criar lista com item %1 repetido %2 vezes"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Cria uma lista consistindo no valor informado repetido o número de vezes especificado."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "como"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "inserir em"; -Blockly.Msg.LISTS_SET_INDEX_SET = "definir"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Insere o item no início de uma lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Insere o item na posição especificada em uma lista. #1 é o último item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Insere o item na posição especificada em uma lista. #1 é o primeiro item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Insere o item no final de uma lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Insere o item em uma posição qualquer de uma lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Define o primeiro item de uma lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Define o item da posição especificada de uma lista. #1 é o último item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Define o item da posição especificada de uma lista. #1 é o primeiro item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Define o último item de uma lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Define um item aleatório de uma lista."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Fazer uma lista a partir do texto"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "fazer um texto a partir da lista"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Juntar uma lista de textos em um único texto, separado por um delimitador."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Dividir o texto em uma lista de textos, separando-o em cada delimitador."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "com delimitador"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falso"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Retorna verdadeiro ou falso."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "verdadeiro"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://pt.wikipedia.org/wiki/Inequa%C3%A7%C3%A3o"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Retorna verdadeiro se ambas as entradas forem iguais."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Retorna verdadeiro se a primeira entrada for maior que a segunda entrada."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Retorna verdadeiro se a primeira entrada for maior ou igual à segunda entrada."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Retorna verdadeiro se a primeira entrada for menor que a segunda entrada."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Retorna verdadeiro se a primeira entrada for menor ou igual à segunda entrada."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Retorna verdadeiro se ambas as entradas forem diferentes."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "não %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Retorna verdadeiro se a entrada for falsa. Retorna falsa se a entrada for verdadeira."; -Blockly.Msg.LOGIC_NULL = "nulo"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Retorna nulo."; -Blockly.Msg.LOGIC_OPERATION_AND = "e"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "ou"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Retorna verdadeiro se ambas as entradas forem verdadeiras."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Retorna verdadeiro se uma das estradas for verdadeira."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "teste"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "se falso"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "se verdadeiro"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Avalia a condição em \"teste\". Se a condição for verdadeira retorna o valor \"se verdadeiro\", senão retorna o valor \"se falso\"."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://pt.wikipedia.org/wiki/Aritm%C3%A9tica"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Retorna a soma dos dois números."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Retorna o quociente da divisão dos dois números."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Retorna a diferença entre os dois números."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Retorna o produto dos dois números."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Retorna o primeiro número elevado à potência do segundo número."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://pt.wikipedia.org/wiki/Adi%C3%A7%C3%A3o"; -Blockly.Msg.MATH_CHANGE_TITLE = "alterar %1 por %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Soma um número à variável \"%1\"."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://pt.wikipedia.org/wiki/Anexo:Lista_de_constantes_matem%C3%A1ticas"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Retorna uma das constantes comuns: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ou ∞ (infinito)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "restringe %1 inferior %2 superior %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Restringe um número entre os limites especificados (inclusivo)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "é divisível por"; -Blockly.Msg.MATH_IS_EVEN = "é par"; -Blockly.Msg.MATH_IS_NEGATIVE = "é negativo"; -Blockly.Msg.MATH_IS_ODD = "é ímpar"; -Blockly.Msg.MATH_IS_POSITIVE = "é positivo"; -Blockly.Msg.MATH_IS_PRIME = "é primo"; -Blockly.Msg.MATH_IS_TOOLTIP = "Verifica se um número é par, ímpar, inteiro, positivo, negativo, ou se é divisível por outro número. Retorna verdadeiro ou falso."; -Blockly.Msg.MATH_IS_WHOLE = "é inteiro"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://pt.wikipedia.org/wiki/Opera%C3%A7%C3%A3o_m%C3%B3dulo"; -Blockly.Msg.MATH_MODULO_TITLE = "resto da divisão de %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Retorna o resto da divisão de dois números."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://pt.wikipedia.org/wiki/N%C3%BAmero"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Um número."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "média da lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maior da lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana da lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "menor da lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "moda da lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "item aleatório da lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "desvio padrão da lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "soma de uma lista"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Retorna a média aritmética dos números da lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Retorna o maior número da lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Retorna a mediana dos números da lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Retorna o menor número da lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Retorna uma lista do(s) item(ns) mais comum(ns) da lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Retorna um elemento aleatório da lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Retorna o desvio padrão dos números da lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Retorna a soma de todos os números na lista."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://pt.wikipedia.org/wiki/Gerador_de_n%C3%BAmeros_pseudoaleat%C3%B3rios"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "fração aleatória"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Retorna uma fração aleatória entre 0.0 (inclusivo) e 1.0 (exclusivo)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://pt.wikipedia.org/wiki/Gerador_de_n%C3%BAmeros_pseudoaleat%C3%B3rios"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "inteiro aleatório entre %1 e %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Retorna um número inteiro entre os dois limites informados, inclusivo."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://pt.wikipedia.org/wiki/Arredondamento"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arredonda"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arredonda para baixo"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arredonda para cima"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Arredonda um número para cima ou para baixo."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://pt.wikipedia.org/wiki/Raiz_quadrada"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absoluto"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "raiz quadrada"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Retorna o valor absoluto de um número."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Retorna o número e elevado à potência de um número."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Retorna o logaritmo natural de um número."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Retorna o logaritmo em base 10 de um número."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Retorna o oposto de um número."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Retorna 10 elevado à potência de um número."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Retorna a raiz quadrada de um número."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://pt.wikipedia.org/wiki/Fun%C3%A7%C3%A3o_trigonom%C3%A9trica"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Retorna o arco cosseno de um número."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Retorna o arco seno de um número."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Retorna o arco tangente de um número."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Retorna o cosseno de um grau (não radiano)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Retorna o seno de um grau (não radiano)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Retorna a tangente de um grau (não radiano)."; -Blockly.Msg.ME = "Eu"; -Blockly.Msg.NEW_VARIABLE = "Nova variável..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nome da nova variável:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "permitir declarações"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "com:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://pt.wikipedia.org/wiki/Sub-rotina"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Executa a função definida pelo usuário \"%1\"."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://pt.wikipedia.org/wiki/Sub-rotina"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Executa a função definida pelo usuário \"%1\" e usa seu retorno."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "com:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Criar \"%1\""; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "faça algo"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "para"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Cria uma função que não tem retorno."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "retorna"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Cria uma função que possui um valor de retorno."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Atenção: Esta função tem parâmetros duplicados."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Destacar definição da função"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Se um valor é verdadeiro, então retorna um valor."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Atenção: Este bloco só pode ser utilizado dentro da definição de uma função."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nome da entrada:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Adiciona uma entrada para esta função"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entradas"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Adiciona, remove, ou reordena as entradas para esta função."; -Blockly.Msg.REMOVE_COMMENT = "Remover comentário"; -Blockly.Msg.RENAME_VARIABLE = "Renomear variável..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Renomear todas as variáveis '%1' para:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "acrescentar texto"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "para"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Acrescentar um pedaço de texto à variável \"%1\"."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "para minúsculas"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "para Nomes Próprios"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "para MAIÚSCULAS"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Retorna uma cópia do texto em um formato diferente."; -Blockly.Msg.TEXT_CHARAT_FIRST = "obter primeira letra"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "obter letra # a partir do final"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "obter letra nº"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "no texto"; -Blockly.Msg.TEXT_CHARAT_LAST = "obter última letra"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "obter letra aleatória"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Retorna a letra na posição especificada."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Acrescentar um item ao texto."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "unir"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Acrescenta, remove ou reordena seções para reconfigurar este bloco de texto."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "até letra nº a partir do final"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "até letra nº"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "até última letra"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "no texto"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "obter trecho de primeira letra"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "obter trecho de letra nº a partir do final"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "obter trecho de letra nº"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Retorna o trecho de texto especificado."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "no texto"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "encontre a primeira ocorrência do item"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "encontre a última ocorrência do texto"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna 0 se o texto não for encontrado."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 é vazio"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Retorna verdadeiro se o texto fornecido for vazio."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "criar texto com"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Criar um pedaço de texto juntando qualquer número de itens."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "tamanho de %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Retorna o número de letras (incluindo espaços) no texto fornecido."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "imprime %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Imprime o texto, número ou valor especificado."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Pede ao usuário um número."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Pede ao usuário um texto."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Pede um número com uma mensagem"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Pede um texto com uma mensagem"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://pt.wikipedia.org/wiki/Cadeia_de_caracteres"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Uma letra, palavra ou linha de texto."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "remover espaços de ambos os lados de"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "remover espaços à esquerda de"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "remover espaços à direita de"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Retorna uma cópia do texto com os espaços removidos de uma ou ambas extremidades."; -Blockly.Msg.TODAY = "Hoje"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Criar \"definir %1\""; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Retorna o valor desta variável."; -Blockly.Msg.VARIABLES_SET = "definir %1 para %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Criar \"obter %1\""; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Define esta variável para o valor da entrada."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ro.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/ro.js deleted file mode 100644 index 005a19b..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ro.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.ro'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Adaugă un comentariu"; -Blockly.Msg.AUTH = "Va rugăm să autorizați această aplicație să permită salvarea activității dumneavoastră și să permită distribuirea acesteia de către dumneavoastră."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Schimbaţi valoarea:"; -Blockly.Msg.CHAT = "Discută cu colaboratorul tău tastând în cadrul acestei zone!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Restrange blocurile"; -Blockly.Msg.COLLAPSE_BLOCK = "Restrange blocul"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "culoare 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "culoare 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "Raport"; -Blockly.Msg.COLOUR_BLEND_TITLE = "amestec"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Amestecă două culori cu un raport dat (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ro.wikipedia.org/wiki/Culoare"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Alege o culoare din paleta de culori."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "culoare aleatorie"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Alege o culoare la întâmplare."; -Blockly.Msg.COLOUR_RGB_BLUE = "albastru"; -Blockly.Msg.COLOUR_RGB_GREEN = "verde"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "roşu"; -Blockly.Msg.COLOUR_RGB_TITLE = "colorează cu"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Creează o culoare cu suma specificată de roşu, verde şi albastru. Toate valorile trebuie să fie între 0 şi 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "ieşi din bucla"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continuă cu următoarea iterație a buclei"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Ieși din bucla care conţine."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Sari peste restul aceastei bucle, şi continuă cu urmatoarea iteratie."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Avertisment: Acest bloc pote fi utilizat numai în interiorul unei bucle."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "pentru fiecare element %1 în listă %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Pentru fiecare element din listă, setaţi variabila '%1' ca valoarea elementului, şi apoi faceţi unele declaraţii."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "numără cu %1 de la %2 la %3 prin %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Cu variablia \"%1\" ia o valoare din numărul început la numărul final, numara in intervalul specificat, apoi face blocurile specificate."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Adăugaţi o condiţie in blocul if."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Adauga o stare finala, cuprinde toata conditia din blocul if."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Adaugă, elimină sau reordonează secţiuni pentru a reconfigura acest bloc if."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "altfel"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "altfel dacă"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "dacă"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Dacă o valoare este adevărată, atunci fa unele declaraţii."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Dacă o valoare este adevărat, atunci face primul bloc de declaraţii. Altfel, face al doilea bloc de declaraţii."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Dacă prima valoare este adevărat, atunci face primul bloc de declaraţii. Altfel, dacă a doua valoare este adevărat, face al doilea bloc de declaraţii."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Dacă prima valoare este adevărat, atunci face primul bloc de declaraţii. Altfel, dacă a doua valoare este adevărat, face al doilea bloc de declaraţii. În cazul în care niciuna din valorilor nu este adevărat, face ultimul bloc de declaraţii."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "fă"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "repetă de %1 ori"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Face unele afirmaţii de mai multe ori."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "Repetaţi până când"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repetă în timp ce"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "În timp ce o valoare este adevărat, atunci face unele declaraţii."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "În timp ce o valoare este adevărat, atunci face unele declaraţii."; -Blockly.Msg.DELETE_BLOCK = "Șterge Bloc"; -Blockly.Msg.DELETE_X_BLOCKS = "Ștergeți %1 Blocuri"; -Blockly.Msg.DISABLE_BLOCK = "Dezactivaţi bloc"; -Blockly.Msg.DUPLICATE_BLOCK = "Duplicati"; -Blockly.Msg.ENABLE_BLOCK = "Permite bloc"; -Blockly.Msg.EXPAND_ALL = "Extinde blocuri"; -Blockly.Msg.EXPAND_BLOCK = "Extinde bloc"; -Blockly.Msg.EXTERNAL_INPUTS = "Intrări externe"; -Blockly.Msg.HELP = "Ajutor"; -Blockly.Msg.INLINE_INPUTS = "Intrări în linie"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "creează listă goală"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returnează o listă, de lungime 0, care nu conţine înregistrări de date"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "listă"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Adaugă, elimină sau reordonează secţiuni ca să reconfiguraţi aceste blocuri de listă."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "creează listă cu"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Adăugaţi un element la listă."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Creaţi o listă cu orice număr de elemente."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "primul"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# de la sfârșit"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "obţine"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "obţine şi elimină"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "ultimul"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aleator"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "elimină"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returnează primul element dintr-o listă."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returneaza elementul la poziţia specificată într-o listă. #1 este ultimul element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returneaza elementul la poziţia specificată într-o listă. #1 este primul element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returnează ultimul element într-o listă."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returneaza un element aleatoriu într-o listă."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Elimină şi returnează primul element într-o listă."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Elimină şi returneaza elementul la poziţia specificată într-o listă. #1 este ultimul element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Elimină şi returneaza elementul la poziţia specificată într-o listă. #1 este primul element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Elimină şi returnează ultimul element într-o listă."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Elimină şi returnează un element aleatoriu într-o listă."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Elimină primul element într-o listă."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Elimină elementul la poziţia specificată într-o listă. #1 este ultimul element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Elimină elementul la poziţia specificată într-o listă. #1 este primul element."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Elimină ultimul element într-o listă."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Elimină un element aleatoriu într-o listă."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "la # de la sfarsit"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "la #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "la ultima"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "obţine sub-lista de la primul"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "obţine sub-lista de la # de la sfârşitul"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "obţine sub-lista de la #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creează o copie a porţiunii specificate dintr-o listă."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "Găseşte prima apariţie a elementului"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "găseşte ultima apariţie a elementului"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returneaza indexul de la prima/ultima aparitie a elementuli din lista. Returneaza 0 daca textul nu este gasit."; -Blockly.Msg.LISTS_INLIST = "în listă"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 este gol"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returnează adevărat dacă lista este goală."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "lungime de %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returnează lungimea unei liste."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "creaza lista cu %1 elemente repetate de %2 ori"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creează o listă alcătuită dintr-o anumită valoare repetată de numărul specificat de ori."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "ca"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "introduceţi la"; -Blockly.Msg.LISTS_SET_INDEX_SET = "seteaza"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserează elementul la începutul unei liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserează elementul la poziţia specificată într-o listă. #1 este ultimul element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserează elementul la poziţia specificată într-o listă. #1 este primul element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Adăugă elementul la sfârşitul unei liste."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserează elementul aleatoriu într-o listă."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Setează primul element într-o listă."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Setează elementul la poziţia specificată într-o listă. #1 este ultimul element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Setează elementul la poziţia specificată într-o listă. #1 este primul element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Setează ultimul element într-o listă."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setează un element aleator într-o listă."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "convertește textul în listă"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "convertește lista în text"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Concatenează o listă de texte (alternate cu separatorul) într-un text unic"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Împarte textul într-o listă de texte, despărțite prin fiecare separator"; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "cu separatorul"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "fals"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returnează adevărat sau fals."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "adevărat"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Returnează adevărat dacă ambele intrări sunt egale."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Returnează adevărat dacă prima intrare este mai mare decât a doua intrare."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Returnează adevărat dacă prima intrare este mai mare sau egală cu a doua intrare."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Returnează adevărat dacă prima intrare este mai mică decât a doua intrare."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Returnează adevărat dacă prima intrare este mai mică sau egală cu a doua intrare."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Returnează adevărat daca cele două intrări nu sunt egale."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "non %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returnează adevărat dacă intrarea este falsă. Returnează fals dacă intrarea este adevărată."; -Blockly.Msg.LOGIC_NULL = "nul"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "returnează nul."; -Blockly.Msg.LOGIC_OPERATION_AND = "şi"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "sau"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Returnează adevărat daca ambele intrări sunt adevărate."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Returnează adevărat dacă cel puţin una din intrări este adevărată."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "dacă este fals"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "dacă este adevărat"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Verifică condiţia din \"test\". Dacă condiţia este adevărată, returnează valoarea \"în cazul în care adevărat\"; în caz contrar întoarce valoarea \"în cazul în care e fals\"."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ro.wikipedia.org/wiki/Aritmetic%C4%83"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Returnează suma a două numere."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Returnează câtul celor două numere."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Returneaza diferenţa dintre cele două numere."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Returnează produsul celor două numere."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Returneaza numărul rezultat prin ridicarea primului număr la puterea celui de-al doilea."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "schimbă %1 de %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Adaugă un număr variabilei '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://ro.wikipedia.org/wiki/Constant%C4%83_matematic%C4%83"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Întoarcă una din constantele comune: π (3.141...), e (2.718...), φ (1,618...), sqrt(2) (1.414...), sqrt(½) (0.707...) sau ∞ (infinitate)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrânge %1 redus %2 ridicat %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrânge un număr să fie între limitele specificate (inclusiv)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "este divizibil cu"; -Blockly.Msg.MATH_IS_EVEN = "este par"; -Blockly.Msg.MATH_IS_NEGATIVE = "este negativ"; -Blockly.Msg.MATH_IS_ODD = "este impar"; -Blockly.Msg.MATH_IS_POSITIVE = "este pozitiv"; -Blockly.Msg.MATH_IS_PRIME = "este prim"; -Blockly.Msg.MATH_IS_TOOLTIP = "Verifică dacă un număr este un par, impar, prim, întreg, pozitiv, negativ, sau dacă este divizibil cu un anumit număr. Returnează true sau false."; -Blockly.Msg.MATH_IS_WHOLE = "este întreg"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "restul la %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Întoarce restul din împărţirea celor două numere."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un număr."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "media listei"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maximul listei"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "media listei"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimul listei"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "moduri de listă"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "element aleatoriu din lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "deviația standard a listei"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "suma listei"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Întoarce media (aritmetică) a valorilor numerice în listă."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Întoarce cel mai mare număr din listă."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Întoarce numărul median în listă."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Returnează cel mai mic număr din listă."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Returnează o listă cu cel(e) mai frecvent(e) element(e) din listă."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Returnează un element aleatoriu din listă."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Întoarce deviația standard a listei."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Returnează suma tuturor numerelor din lista."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "fracții aleatorii"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Returnează o fracţie aleatoare între 0.0 (inclusiv) si 1.0 (exclusiv)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "un număr întreg aleator de la %1 la %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Returnează un număr întreg aleator aflat între cele două limite specificate, inclusiv."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "rotund"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "rotunjit"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "rotunjește în sus"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Rotunjirea unui număr în sus sau în jos."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolută"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "rădăcina pătrată"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Returnează valoarea absolută a unui număr."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Returnează e la puterea unui număr."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Întoarce logaritmul natural al unui număr."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Returnează logaritmul în baza 10 a unui număr."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Returnează negaţia unui număr."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Returnează 10 la puterea unui număr."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Returnează rădăcina pătrată a unui număr."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "arccos"; -Blockly.Msg.MATH_TRIG_ASIN = "arcsin"; -Blockly.Msg.MATH_TRIG_ATAN = "arctg"; -Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; -Blockly.Msg.MATH_TRIG_TAN = "tg"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Returnează arccosinusul unui număr."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Returnează arcsinusul unui număr."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Returnează arctangenta unui număr."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Întoarce cosinusul unui grad (nu radianul)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Întoarce cosinusul unui grad (nu radianul)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Întoarce tangenta unui grad (nu radianul)."; -Blockly.Msg.ME = "Eu"; -Blockly.Msg.NEW_VARIABLE = "Variabilă nouă..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Noul nume de variabilă:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "permite declarațiile"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "cu:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Executați funcția '%1 'definită de utilizator."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Executați funcția '%1 'definită de utilizator şi folosiţi producţia sa."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "cu:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Creaţi '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "fă ceva"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "la"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crează o funcţie cu nici o ieşire."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "returnează"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creează o funcţie cu o ieşire."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Atenţie: Această funcţie are parametri duplicaţi."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Evidenţiază definiţia funcţiei"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Dacă o valoare este adevărată, atunci returnează valoarea a doua."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Avertisment: Acest bloc poate fi utilizat numai în definiţia unei funcţii."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nume de intrare:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Adaugă un parametru de intrare pentru funcție."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "intrări"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Adăugă, șterge sau reordonează parametrii de intrare ai acestei funcții."; -Blockly.Msg.REMOVE_COMMENT = "Elimină comentariu"; -Blockly.Msg.RENAME_VARIABLE = "Redenumirea variabilei..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Redenumeşte toate variabilele '%1' în:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "Adăugaţi text"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "la"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Adăugaţi text la variabila '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "la litere mici"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "către Titlul de caz"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "la MAJUSCULE"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Întoarce o copie a textului într-un caz diferit."; -Blockly.Msg.TEXT_CHARAT_FIRST = "obţine prima litera"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "obţine litera # de la sfârșit"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "obtine litera #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "în text"; -Blockly.Msg.TEXT_CHARAT_LAST = "obţine o litera oarecare"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "obtine o litera oarecare"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returnează litera la poziția specificată."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Adaugă un element în text."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "alăturaţi-vă"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Adaugă, elimină sau reordonează secțiuni ca să reconfigureze blocul text."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "la litera # de la sfarsit"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "la litera #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "la ultima literă"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "în text"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "obţine un subșir de la prima literă"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "obține un subșir de la litera # de la sfârșit"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "obține subșir de la litera #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returnează o anumită parte din text."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "în text"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "găseşte prima apariţie a textului"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "găseşte ultima apariţie a textului"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returnează indicele primei/ultimei apariţii din primul text în al doilea text. Returnează 0 dacă textul nu este găsit."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 este gol"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returnează adevărat dacă textul furnizat este gol."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "crează text cu"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Creaţi o bucată de text prin unirea oricărui număr de elemente."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "lungime de %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returnează numărul de litere (inclusiv spaţiile) în textul furnizat."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "imprimare %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Afișează textul specificat, numărul sau altă valoare."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Solicită utilizatorul pentru un număr."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Solicită utilizatorul pentru text."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "solicită pentru număr cu mesaj"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "solicită pentru text cu mesaj"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "O literă, cuvânt sau linie de text."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "taie spațiile de pe ambele părți ale"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "tăiaţi spațiile din partea stângă a"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "taie spațiile din partea dreaptă a"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Returnează o copie a textului fără spațiile de la unul sau ambele capete."; -Blockly.Msg.TODAY = "Today"; // untranslated -Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crează 'set %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returnează valoarea acestei variabile."; -Blockly.Msg.VARIABLES_SET = "seteaza %1 la %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Crează 'get %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Setează această variabilă sa fie egală la intrare."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ru.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/ru.js deleted file mode 100644 index c0084a5..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ru.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.ru'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Добавить комментарий"; -Blockly.Msg.AUTH = "Пожалуйста, авторизуйте это приложение, чтоб можно было сохранять вашу работу и чтобы дать возможность вам делиться ей."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Измените значение:"; -Blockly.Msg.CHAT = "Общайтесь со своим коллегой, печатая в этом поле!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Свернуть блоки"; -Blockly.Msg.COLLAPSE_BLOCK = "Свернуть блок"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "цвет 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "цвет 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "доля цвета 1"; -Blockly.Msg.COLOUR_BLEND_TITLE = "смешать"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Смешивает два цвета в заданном соотношении (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ru.wikipedia.org/wiki/Цвет"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Выберите цвет из палитры."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "случайный цвет"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Выбирает цвет случайным образом."; -Blockly.Msg.COLOUR_RGB_BLUE = "синего"; -Blockly.Msg.COLOUR_RGB_GREEN = "зелёного"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "красного"; -Blockly.Msg.COLOUR_RGB_TITLE = "цвет из"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Создаёт цвет с указанной пропорцией красного, зеленого и синего. Все значения должны быть между 0 и 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "выйти из цикла"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "перейти к следующему шагу цикла"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Прерывает этот цикл."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Пропускает остаток цикла и переходит к следующему шагу."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Предупреждение: этот блок может использоваться только внутри цикла."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "для каждого элемента %1 в списке %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Для каждого элемента в списке, присваивает переменной '%1' значение элемента и выполняет указанные команды."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "цикл по %1 от %2 до %3 с шагом %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Присваивает переменной '%1' значения от начального до конечного с заданным шагом и выполняет указанные команды."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Добавляет условие к блоку \"если\""; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Добавить заключительный подблок для случая, когда все условия ложны."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Добавьте, удалите, переставьте фрагменты для переделки блока \"если\"."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "иначе"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "иначе если"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "если"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Если условие истинно, выполняет команды."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Если условие истинно, выполняет первый блок команд. Иначе выполняется второй блок команд."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Если первое условие истинно, то выполняет первый блок команд. Иначе, если второе условие истинно, выполняет второй блок команд."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Если первое условие истинно, то выполняет первый блок команд. В противном случае, если второе условие истинно, выполняет второй блок команд. Если ни одно из условий не истинно, выполняет последний блок команд."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://ru.wikipedia.org/wiki/Цикл_(программирование)"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "выполнить"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "повторить %1 раз"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Выполняет некоторые команды несколько раз."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "повторять, пока не"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "повторять, пока"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Пока значение ложно, выполняет команды"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Пока значение истинно, выполняет команды."; -Blockly.Msg.DELETE_BLOCK = "Удалить блок"; -Blockly.Msg.DELETE_X_BLOCKS = "Удалить %1 блоков"; -Blockly.Msg.DISABLE_BLOCK = "Отключить блок"; -Blockly.Msg.DUPLICATE_BLOCK = "Скопировать"; -Blockly.Msg.ENABLE_BLOCK = "Включить блок"; -Blockly.Msg.EXPAND_ALL = "Развернуть блоки"; -Blockly.Msg.EXPAND_BLOCK = "Развернуть блок"; -Blockly.Msg.EXTERNAL_INPUTS = "Вставки снаружи"; -Blockly.Msg.HELP = "Справка"; -Blockly.Msg.INLINE_INPUTS = "Вставки внутри"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "создать пустой список"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Возвращает список длины 0, не содержащий данных"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "список"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Добавьте, удалите, переставьте элементы для переделки блока списка."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "создать список из"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Добавляет элемент к списку."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Создаёт список с любым числом элементов."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "первый"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "№ с конца"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "взять"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "взять и удалить"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "последний"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "произвольный"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "удалить"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Возвращает первый элемент списка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Возвращает элемент в указанной позиции списка (№1 - последний элемент)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Возвращает элемент в указанной позиции списка (№1 - первый элемент)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Возвращает последний элемент списка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Возвращает случайный элемент списка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Удаляет и возвращает первый элемент списка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Удаляет и возвращает элемент в указанной позиции списка (№1 - последний элемент)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Удаляет и возвращает элемент в указанной позиции списка (№1 - первый элемент)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Удаляет и возвращает последний элемент списка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Удаляет и возвращает случайный элемент списка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Удаляет первый элемент списка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Удаляет элемент в указанной позиции списка (№1 - последний элемент)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Удаляет элемент в указанной позиции списка (№1 - первый элемент)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Удаляет последний элемент списка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Удаляет случайный элемент списка."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "по № с конца"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "по №"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "по последний"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "взять подсписок с первого"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "взять подсписок с № с конца"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "взять подсписок с №"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Создаёт копию указанной части списка."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "найти первое вхождение элемента"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "найти последнее вхождение элемента"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Возвращает номер позиции первого/последнего вхождения элемента в списке. Возвращает 0, если текст не найден."; -Blockly.Msg.LISTS_INLIST = "в списке"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 пуст"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Возвращает значение истина, если список пуст."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "длина %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Возвращает длину списка."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "создать список из элемента %1, повторяющегося %2 раз"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Создаёт список, состоящий из заданного числа копий элемента."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "="; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "вставить в"; -Blockly.Msg.LISTS_SET_INDEX_SET = "присвоить"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Вставляет элемент в начало списка."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Вставляет элемент в указанной позиции списка (№1 - последний элемент)."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Вставляет элемент в указанной позиции списка (№1 - первый элемент)."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Добавляет элемент в конец списка."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Вставляет элемент в случайное место в списке."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Присваивает значение первому элементу списка."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Присваивает значение элементу в указанной позиции списка (№1 - последний элемент)."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Присваивает значение элементу в указанной позиции списка (№1 - первый элемент)."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Присваивает значение последнему элементу списка."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Присваивает значение случайному элементу списка."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "сделать список из текста"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "собрать текст из списка"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Соединяет сптсок текстов в один текст с разделителями."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Разбивает текст в список текстов, по разделителям."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "с разделителем"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "ложь"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Возвращает значение истина или ложь."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "истина"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Возвращает значение истина, если вставки равны."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Возвращает значение истина, если первая вставка больше второй."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Возвращает значение истина, если первая вставка больше или равна второй."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Возвращает значение истина, если первая вставка меньше второй."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Возвращает значение истина, если первая вставка меньше или равна второй."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Возвращает значение истина, если вставки не равны."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "не %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Возвращает значение истина, если вставка ложна. Возвращает значение ложь, если вставка истинна."; -Blockly.Msg.LOGIC_NULL = "ничто"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Возвращает ничто."; -Blockly.Msg.LOGIC_OPERATION_AND = "и"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "или"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Возвращает значение истина, если обе вставки истинны."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Возвращает значение истина, если хотя бы одна из вставок истинна."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "выбрать по"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://ru.wikipedia.org/wiki/Тернарная_условная_операция"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "если ложь"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "если истина"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Проверяет условие выбора. Если условие истинно, возвращает первое значение, в противном случае возвращает второе значение."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ru.wikipedia.org/wiki/Арифметика"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Возвращает сумму двух чисел."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Возвращает частное от деления первого числа на второе."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Возвращает разность двух чисел."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Возвращает произведение двух чисел."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Возвращает первое число, возведённое в степень второго числа."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://ru.wikipedia.org/wiki/%D0%98%D0%B4%D0%B8%D0%BE%D0%BC%D0%B0_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29#.D0.98.D0.BD.D0.BA.D1.80.D0.B5.D0.BC.D0.B5.D0.BD.D1.82"; -Blockly.Msg.MATH_CHANGE_TITLE = "увеличить %1 на %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Добавляет число к переменной '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://ru.wikipedia.org/wiki/Математическая_константа"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Возвращает одну из распространённых констант: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) или ∞ (бесконечность)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "ограничить %1 снизу %2 сверху %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Ограничивает число нижней и верхней границами (включительно)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "делится на"; -Blockly.Msg.MATH_IS_EVEN = "чётное"; -Blockly.Msg.MATH_IS_NEGATIVE = "отрицательное"; -Blockly.Msg.MATH_IS_ODD = "нечётное"; -Blockly.Msg.MATH_IS_POSITIVE = "положительное"; -Blockly.Msg.MATH_IS_PRIME = "простое"; -Blockly.Msg.MATH_IS_TOOLTIP = "Проверяет, является ли число чётным, нечётным, простым, целым, положительным, отрицательным или оно кратно определённому числу. Возвращает значение истина или ложь."; -Blockly.Msg.MATH_IS_WHOLE = "целое"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://ru.wikipedia.org/wiki/Деление_с_остатком"; -Blockly.Msg.MATH_MODULO_TITLE = "остаток от %1 : %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Возвращает остаток от деления двух чисел."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://ru.wikipedia.org/wiki/Число"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Число."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "среднее арифметическое списка"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "наибольшее в списке"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "медиана списка"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "наименьшее в списке"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "моды списка"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "случайный элемент списка"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "стандартное отклонение списка"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "сумма списка"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Возвращает среднее арифметическое списка."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Возвращает наибольшее число списка."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Возвращает медиану списка."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Возвращает наименьшее число списка."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Возвращает список наиболее часто встречающихся элементов списка."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Возвращает случайный элемент списка."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Возвращает стандартное отклонение списка."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Возвращает сумму всех чисел в списке."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "случайное число от 0 (включительно) до 1"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Возвращает случайное число от 0.0 (включительно) до 1.0."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "случайное целое число от %1 для %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Возвращает случайное число между двумя заданными пределами (включая и их)."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://ru.wikipedia.org/wiki/Округление"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "округлить"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "округлить к меньшему"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "округлить к большему"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Округляет число до большего или меньшего."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://ru.wikipedia.org/wiki/Квадратный_корень"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "модуль"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "квадратный корень"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Возвращает модуль числа"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Возвращает е в указанной степени."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Возвращает натуральный логарифм числа."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Возвращает десятичный логарифм числа."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Возвращает противоположное число."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Возвращает 10 в указанной степени."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Возвращает квадратный корень числа."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://ru.wikipedia.org/wiki/Тригонометрические_функции"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Возвращает арккосинус (в градусах)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Возвращает арксинус (в градусах)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Возвращает арктангенс (в градусах)"; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Возвращает косинус угла в градусах."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Возвращает синус угла в градусах."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Возвращает тангенс угла в градусах."; -Blockly.Msg.ME = "Мне"; -Blockly.Msg.NEW_VARIABLE = "Новая переменная…"; -Blockly.Msg.NEW_VARIABLE_TITLE = "Имя новой переменной:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "разрешить операторы"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "с:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://ru.wikipedia.org/wiki/Функция_%28программирование%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Исполняет определённую пользователем процедуру '%1'."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://ru.wikipedia.org/wiki/Функция_%28программирование%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Исполняет определённую пользователем процедуру '%1' и возвращает вычисленное значение."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "с:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Создать вызов '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "выполнить что-то"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "чтобы"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Создаёт процедуру, не возвращающую значение."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "вернуть"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Создаёт процедуру, возвращающую значение."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Предупреждение: эта функция имеет повторяющиеся параметры."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Выделить определение процедуры"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Если первое значение истинно, возвращает второе значение."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Предупреждение: Этот блок может использоваться только внутри определения функции."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "имя параметра:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Добавить входной параметр в функцию."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "параметры"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Добавить, удалить или изменить порядок входных параметров для этой функции."; -Blockly.Msg.REMOVE_COMMENT = "Удалить комментарий"; -Blockly.Msg.RENAME_VARIABLE = "Переименовать переменную…"; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Переименовать все переменные '%1' в:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "добавить текст"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "к"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Добавить текст к переменной «%1»."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "в строчные буквы"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "в Заглавные Начальные Буквы"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "в ЗАГЛАВНЫЕ БУКВЫ"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Возвращает копию текста с ЗАГЛАВНЫМИ или строчными буквами."; -Blockly.Msg.TEXT_CHARAT_FIRST = "взять первую букву"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "взять букву № с конца"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "взять букву №"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "в тексте"; -Blockly.Msg.TEXT_CHARAT_LAST = "взять последнюю букву"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "взять случайную букву"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Возвращает букву в указанной позиции."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Добавить элемент к тексту."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "соединить"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Добавьте, удалите, переставьте фрагменты для переделки текстового блока."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "по букву № с конца"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "по букву №"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "по последнюю букву"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "в тексте"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "взять подстроку с первой буквы"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "взять подстроку с буквы № с конца"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "взять подстроку с буквы №"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Возвращает указанную часть текста."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "в тексте"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "найти первое вхождение текста"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "найти последнее вхождение текста"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Возвращает номер позиции первого/последнего вхождения первого текста во втором. Возвращает 0, если текст не найден."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 пуст"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Возвращает значение истина, если предоставленный текст пуст."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "создать текст из"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Создаёт фрагмент текста, объединяя любое число элементов"; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "длина %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Возвращает число символов (включая пробелы) в заданном тексте."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "напечатать %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Печатает текст, число или другой объект."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Запросить у пользователя число."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Запросить у пользователя текст."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "запросить число с подсказкой"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "запросить текст с подсказкой"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://ru.wikipedia.org/wiki/Строковый_тип"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Буква, слово или строка текста."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "обрезать пробелы с двух сторон"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "обрезать пробелы слева"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "обрезать пробелы справа"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Возвращает копию текста с пробелами, удалеными с одного или обоих концов."; -Blockly.Msg.TODAY = "Сегодня"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "элемент"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Создать блок \"присвоить\" для %1"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Возвращает значение этой переменной."; -Blockly.Msg.VARIABLES_SET = "присвоить %1 = %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Создать вставку %1"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Присваивает переменной значение вставки."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/sc.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/sc.js deleted file mode 100644 index 00d7a9e..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/sc.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.sc'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Agiunghe unu cumentu"; -Blockly.Msg.AUTH = "Permiti a custa app de sarvare su traballu tuo e de ti lu fàghere cumpartzire."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Muda valori:"; -Blockly.Msg.CHAT = "Faedda cun su cumpàngiu tuo iscriende inoghe!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Serra e astringhe Boocos"; -Blockly.Msg.COLLAPSE_BLOCK = "Serra e astringhe Blocu"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "colori 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "colori 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "raportu"; -Blockly.Msg.COLOUR_BLEND_TITLE = "mestura"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Amestura duus coloris cun unu raportu (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Scebera unu colori de sa tauledda."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "Unu colori a brítiu"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Scebera unu colori a brítiu."; -Blockly.Msg.COLOUR_RGB_BLUE = "blue"; -Blockly.Msg.COLOUR_RGB_GREEN = "birdi"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "arrùbiu"; -Blockly.Msg.COLOUR_RGB_TITLE = "colora cun"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Cuncorda unu colori cun su tanti de arrubiu, birdi, e blue. Totu is valoris depint essi intra 0 e 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "sàrtiat a foras de sa lòriga"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "sighit cun su repicu afatànti"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Bessit de sa lòriga."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Sartiat su chi abarrat de sa loriga, e sighit cun su repicu afatànti."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Amonestu: Custu brocu ddu podis ponni sceti aintru de una lòriga."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "po dònnia item %1 in lista %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Po dònnia item in sa lista, ponit sa variàbili '%1' pari a s'item, e tandu fait pariga de cumandus."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "po %1 de %2 fintzas %3 a passus de %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Fait pigai a sa variàbili \"%1\" i valoris de su primu numeru a s'urtimu, a su passu impostau e fait su brocu."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Aciungi una cunditzioni a su brocu si."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Aciungi una urtima cunditzioni piga-totu a su brocu si."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Aciungi, fùlia, o assenta is partis po torrai a sètiu custu brocu si."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "sinuncas"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "sinuncas si"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "si"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Si su valori est berus, tandu fait pariga de cumandus."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Si su valori est berus, tandu fai su primu brocu de is cumandus. Sinuncas, fai su segundu brocu de is cumandus."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Si su primu valori est beridadi, tandu fai su primu brocu de is cumandus. Sinuncas, si su segundu valori est beridadi, fai su segundu brocu de is cumandus."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Si su primu valori est berus, tandu fai su primu brocu de is cumandus. Sinuncas, si su segundu valori est berus, fai su segundu brocu de is cumandus. Si mancu unu valori est berus, tandu fai s'urtimu brocu de is cumandus."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "fai"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "repiti %1 bortas"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Fait pariga de cumandus prus bortas."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repiti fintzas"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repiti interis"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Interis su valori est frassu, tandu fai pariga de cumandus."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Interis su valori est berus, tandu fai pariga de cumandus."; -Blockly.Msg.DELETE_BLOCK = "Fùlia Blocu"; -Blockly.Msg.DELETE_X_BLOCKS = "Fulia %1 Blocus"; -Blockly.Msg.DISABLE_BLOCK = "Disabìlita Blocu"; -Blockly.Msg.DUPLICATE_BLOCK = "Dùplica"; -Blockly.Msg.ENABLE_BLOCK = "Abìlita Blocu"; -Blockly.Msg.EXPAND_ALL = "Aberi Brocos"; -Blockly.Msg.EXPAND_BLOCK = "Aberi Blocu"; -Blockly.Msg.EXTERNAL_INPUTS = "Intradas esternas"; -Blockly.Msg.HELP = "Agiudu"; -Blockly.Msg.INLINE_INPUTS = "Intradas in lìnia"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "fait una lista buida"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Torrat una lista, de longària 0, chena records de datus."; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Aciungi, fùlia, o assenta is partis po torrai a sètiu custu brocu lista."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "fait una lista cun"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Acciungi unu item a sa lista."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Fait una lista cun calisiollat numeru de items."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "primu"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# de sa fini"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "piga"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "piga e fùlia"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "urtimu"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "a brìtiu (random)"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "fùlia"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Torrat su primu elementu de una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Torrat s'elementu de su postu inditau de una lista. Postu #1 est po s'urtimu elementu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Torrat s'elementu de su postu inditau de una lista. #1 est po su primu elementu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Torrat s'urtimu elementu de una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Torrat un'elementu a brìtiu de una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Fùliat e torrat su primu elementu de una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Fùliat e torrat s'elementu de su postu inditau de una lista. #1 est po s'urtimu elementu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Fùliat e torrat s'elementu de su postu inditau de una lista. #1 est po su primu elementu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Fùliat e torrat s'urtimu elementu de una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Fùliat e torrat un'elementu a brìtiu de una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Fùliat su primu elementu de una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Fùliat s'elementu de su postu inditau de una lista. #1 est po s'urtimu elementu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Fùliat s'elementu de su postu inditau de una lista. #1 est po su primu elementu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Fùliat s'urtimu elementu de una lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Fùliat unu elementu a brìtiu de una lista."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "a # de sa fini"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "fintzas a #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "a s'urtimu"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "bogandi suta-lista de su primu"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "bogandi suta-lista de # de sa fini."; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "bogandi suta-lista de #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Fait una copia de sa parti inditada de sa lista."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "circa prima ocasioni de s'item"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "circa urtima ocasioni de s'item"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Torrat s'indixi de sa primu/urtima ocasioni de s'item in sa lista. Torrat 0 si su testu no ddu agatat."; -Blockly.Msg.LISTS_INLIST = "in lista"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 est buidu"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Torrat berus si sa lista est buida."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "longària de %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Torrat sa longària de una lista."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "fait una lista cun item %1 repitiu %2 bortas"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Fait una lista cun unu numeru giau repitiu su tanti de is bortas inditadas."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "a"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "inserta a"; -Blockly.Msg.LISTS_SET_INDEX_SET = "imposta"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Insertat s'elementu a su cumintzu de sa lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Insertat s'elementu in su postu inditau de una lista. Postu #1 est po s'urtimu elementu."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Insertat s'elementu in su postu inditau in una lista. Postu #1 est po su primu elementu."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Aciungit s'elementu a sa fini de sa lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Aciungit s'elementu a brítiu in sa lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Impostat su primu elementu in una lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Impostat s'elementu in su postu inditau de una lista. Postu #1 est po s'urtimu elementu."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Impostat s'elementu in su postu inditau de una lista. Postu 1 est po su primu elementu."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Impostat s'urtimu elementu in una lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Impostat unu elementu random in una lista."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "fai una lista de unu testu"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "fai unu testu de una lista"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Auni una lista de testus in d-unu sceti, ponendi separadoris."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Dividi su testu in un'elencu de testus, firmendi po dònnia separadori."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "cun separadori"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "frassu"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Torrat berus o frassu."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "berus"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Torrat berus si is inputs funt unu uguali a s'àteru."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Torrat berus si su primu input est prus mannu de s'àteru."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Torrat berus si su primu input est prus mannu o uguali a s'àteru."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Torrat berus si su primu input est prus piticu de s'àteru."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Torrat berus si su primu input est prus piticu o uguali a s'àteru."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Torrat berus si is inputs non funt unu uguali a s'àteru."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "non %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Torrat berus si s'input est frassu. Torrat frassu si s'input est berus."; -Blockly.Msg.LOGIC_NULL = "null"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Torrat null."; -Blockly.Msg.LOGIC_OPERATION_AND = "and"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "or"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Torrat berus si ambos is inputs funt berus."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Torrat berus si assumancu unu de is inputs est berus."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "cumpròa"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "si frassu"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "si berus"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "‎Cumproa sa cunditzioni in 'cumproa'. Si sa cunditzioni est berus, torrat su valori 'si berus'; sinuncas torrat su valori 'si frassu'."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Torrat sa summa de is duus nùmerus."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Torrat su cuotzienti de is duus nùmerus."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Torrat sa diferèntzia de is duus nùmerus."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Torrat su produtu de is duus nùmerus."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Torrat su primu numeru artziau a sa potenza de su segundu nùmeru."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "muda %1 de %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Aciungi unu numeru a sa variabili '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Torrat una de is costantis comunas: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), o ∞ (infiniu)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "custringi %1 de %2 a %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Custringi unu numeru aintru de is liminaxus giaus (cumprendius)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "fait a ddu dividi po"; -Blockly.Msg.MATH_IS_EVEN = "est paris"; -Blockly.Msg.MATH_IS_NEGATIVE = "est negativu"; -Blockly.Msg.MATH_IS_ODD = "est dísparu"; -Blockly.Msg.MATH_IS_POSITIVE = "est positivu"; -Blockly.Msg.MATH_IS_PRIME = "est primu"; -Blockly.Msg.MATH_IS_TOOLTIP = "Cumprova si unu numeru est paris, dìsparis, primu, intreu, positivu, negativu o si fait a ddu dividi po unu numeru giau. Torrat berus o frassu."; -Blockly.Msg.MATH_IS_WHOLE = "est intreu"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "arrestu de %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Torrat s'arrestu de sa divisioni de duus numerus."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Unu numeru"; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "mèdia de sa lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "massimu de sa lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "medianu de sa lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimu de sa lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modas de sa lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "unu item a brìtiu de sa lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "deviadura standard de sa lista"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "suma sa lista"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Torrat sa mèdia (aritimètica) de is valoris de sa lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Torrat su numeru prus mannu de sa lista"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Torrat su numeru medianu de sa lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Torrat su numeru prus piticu de sa lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Torrat una lista de is itams prus frecuentis de sa lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Torrat unu item a brìtiu de sa lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Torrat sa deviadura standard de sa lista."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Torrat sa suma de totu is numerus de sa lista."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "una fratzioni a brìtiu"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Torrat una fratzioni a brìtiu intra 0.0 (cumpresu) e 1.0 (bogau)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "numeru intreu a brítiu de %1 a %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Torrat unu numeru intreu a brìtiu intra duus nùmerus giaus (cumpresus)."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arretunda"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arretunda faci a bàsciu."; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "Arretunda faci a susu"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Arretunda unu numeru faci a susu o faci a bàsciu."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "assolutu"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "arraxina cuadra"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Torrat su valori assolútu de unu numeru."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Torrat (e) a sa potèntzia de unu numeru."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Torrat su logaritmu naturali de unu numeru."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Torrat su logaritmu a basi 10 de unu numeru."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Torrat su valori negau de unu numeru."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Torrat (10) a sa potèntzia de unu numeru."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Torrat s'arraxina cuadra de unu numeru."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Torrat su arccosinu de unu numeru."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Torrat su arcsinu de unu numeru."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Torrat su arctangenti de unu numeru."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Torrat su cosinu de unu gradu (no radianti)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Torrat su sinu de unu gradu (no radianti)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Torrat sa tangenti de unu gradu (no radianti)."; -Blockly.Msg.ME = "Deo"; -Blockly.Msg.NEW_VARIABLE = "Variabili noa..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nòmini de sa variabili noa:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "permiti decraratzionis"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "con:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Arròllia sa funtzione '%1' cuncordada dae s'impitadore."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Arròllia sa funtzione '%1' cuncordada dae s'impitadore e imprea s'output suu."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "cun"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Ingenerau'%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "fait calincuna cosa"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "po"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Fait una funtzioni chena output."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "torrat"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Fait una funtzioni cun output."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Amonestu: Custa funtzioni tenit parametrus duplicaus."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Marca sa definitzioni de funtzioni."; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Si unu valori est berus, tandu torrat unu segundu valori."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Amonestu: Custu brocu ddu podis ponni sceti aintru de una funtzioni."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nomini input:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Aciungi un input a sa funtzioni."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Aciungi, fùlia, o assenta is inputs a custa funtzioni."; -Blockly.Msg.REMOVE_COMMENT = "Fùlia unu cumentu"; -Blockly.Msg.RENAME_VARIABLE = "Muda nòmini a variabili..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "A is variabilis '%1' muda nòmini a:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "acciungi su testu"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "a"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Aciungit testu a sa variàbili '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "a minúdu"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "cun Primu lìtera a Mauschínu"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "a mauschínu"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Torrat una copia de su testu inditau mudendi mauschínu/minúdu."; -Blockly.Msg.TEXT_CHARAT_FIRST = "piga sa prima lìtera"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "piga sa lìtera # de sa fini"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "piga sa lìtera #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in su testu"; -Blockly.Msg.TEXT_CHARAT_LAST = "piga s'urtima lìtera"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "piga una lìtera a brìtiu"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Torrat sa lìtera de su postu giau."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Acciungi unu item a su testu."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "auni a pari"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Aciungi, fùlia, o assenta is partis po torrai a sètiu custu brocu de testu."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "a sa lìtera # de sa fini"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "a sa lìtera #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "a s'urtima lìtera"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in su testu"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "piga suta-stringa de sa primu lìtera"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "piga suta-stringa de sa lìtera # fintzas a fini"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "piga suta-stringa de sa lìtera #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Torrat su testu inditau."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in su testu"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "circa prima ocasioni de su testu"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "circa urtima ocasioni de su testu"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Torrat s'indixi de sa primu/urtima ocasioni de su primu testu in su segundu testu. Torrat 0 si su testu no ddu agatat."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 est buidu"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Torrat berus si su testu giau est buidu."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "scri testu cun"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Fait unu testu ponendi a pari parigas de items."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "longària de %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Torrat su numeru de lìteras (cun is spàtzius) in su testu giau."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "scri %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Scri su testu, numeru o àteru valori."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Pregonta unu nùmeru a s'impitadore."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Pregonta testu a s'impitadore."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "pregonta po unu numeru"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "pregonta po su testu"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Una lìtera, paràula, o linia de testu."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "bogat spàtzius de ambus càbudus de"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "bogat spàtzius de su càbudu de manca de"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "bogat spàtzius de su càbudu de dereta de"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Torrat una copia de su testu bogaus is spàtzius de unu o de ambus is càbudus."; -Blockly.Msg.TODAY = "Oe"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Fait 'imposta %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Torrat su valori de custa variabili."; -Blockly.Msg.VARIABLES_SET = "imposta %1 a %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Fait 'piga %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Imposta custa variabili uguali a s'input."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/sk.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/sk.js deleted file mode 100644 index f127d8d..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/sk.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.sk'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Pridať komentár"; -Blockly.Msg.AUTH = "Autorizujte prosím túto aplikáciu, aby ste mohli uložiť a zdieľať vašu prácu."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Zmeniť hodnotu:"; -Blockly.Msg.CHAT = "Písaním do tohto políčka komunikujte so spolupracovníkmi!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Zvinúť bloky"; -Blockly.Msg.COLLAPSE_BLOCK = "Zvinúť blok"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "farba 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "farba 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "pomer"; -Blockly.Msg.COLOUR_BLEND_TITLE = "zmiešať"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Zmieša dve farby v danom pomere (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Zvoľte farbu z palety."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "náhodná farba"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Zvoliť farbu náhodne."; -Blockly.Msg.COLOUR_RGB_BLUE = "modrá"; -Blockly.Msg.COLOUR_RGB_GREEN = "zelená"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "červená"; -Blockly.Msg.COLOUR_RGB_TITLE = "ofarbiť s"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Vytvoriť farbu pomocou zadaného množstva červenej, zelenej a modrej. Množstvo musí byť medzi 0 a 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "opustiť slučku"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "prejdi na nasledujúce opakovanie slučky"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Opustiť túto slučku."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Vynechať zvyšok tejto slučky a pokračovať ďalším opakovaním."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Upozornenie: Tento blok sa môže používať len v rámci slučky."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "pre každý prvok %1 v zozname %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Pre každý prvok v zozname priraď jeho hodnotu do premenej '%1' a vykonaj príkazy."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "počítať s %1 od %2 do %3 o %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Nechá premennú '%1' nadobúdať hodnoty od začiatočného čísla po konečné s daným medzikrokom a vykoná zadané bloky."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Pridať podmienku k \"ak\" bloku."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Pridať poslednú záchytnú podmienku k \"ak\" bloku."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Pridať, odstrániť alebo zmeniť poradie oddielov tohto \"ak\" bloku."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "inak"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "inak ak"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "ak"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Ak je hodnota pravda, vykonaj príkazy."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Ak je hodnota pravda, vykonaj príkazy v prvom bloku. Inak vykonaj príkazy v druhom bloku."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Ak je prvá hodnota pravda, vykonaj príkazy v prvom bloku. Inak, ak je druhá hodnota pravda, vykonaj príkazy v druhom bloku."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Ak je prvá hodnota pravda, vykonaj príkazy v prvom bloku. Inak, ak je druhá hodnota pravda, vykonaj príkazy v druhom bloku. Ak ani jedna hodnota nie je pravda, vykonaj príkazy v poslednom bloku."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "rob"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "opakuj %1 krát"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Opakuj určité príkazy viackrát."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "opakuj kým nebude"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "opakuj kým"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Kým je hodnota nepravdivá, vykonávaj príkazy."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Kým je hodnota pravdivá, vykonávaj príkazy."; -Blockly.Msg.DELETE_BLOCK = "Odstrániť blok"; -Blockly.Msg.DELETE_X_BLOCKS = "Odstrániť %1 blokov"; -Blockly.Msg.DISABLE_BLOCK = "Vypnúť blok"; -Blockly.Msg.DUPLICATE_BLOCK = "Duplikovať"; -Blockly.Msg.ENABLE_BLOCK = "Povoliť blok"; -Blockly.Msg.EXPAND_ALL = "Rozvinúť bloky"; -Blockly.Msg.EXPAND_BLOCK = "Rozvinúť blok"; -Blockly.Msg.EXTERNAL_INPUTS = "Vonkajšie vstupy"; -Blockly.Msg.HELP = "Pomoc"; -Blockly.Msg.INLINE_INPUTS = "Riadkové vstupy"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "prázdny zoznam"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Vráti zoznam nulovej dĺžky, ktorý neobsahuje žiadne prvky."; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "zoznam"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Pridaj, odstráň alebo zmeň poradie v tomto zoznamovom bloku."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "vytvor zoznam s"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Pridaj prvok do zoznamu."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Vytvor zoznam s ľubovoľným počtom prvkov."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "prvý"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# od konca"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "zisti"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "zisti a odstráň"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "posledný"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "náhodný"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "odstráň"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Vráti počiatočný prvok zoznamu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Vráti prvok na určenej pozícii v zozname. #1 je posledný prvok."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Vráti prvok na určenej pozícii v zozname. #1 je počiatočný prvok."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Vráti posledný prvok zoznamu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Vráti náhodný prvok zoznamu."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Odstráni a vráti prvý prvok v zozname."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Odstráni a vráti prvok z určenej pozície v zozname. #1 je posledný prvok."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Odstráni a vráti prvok z určenej pozície v zozname. #1 je prvý prvok."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Odstráni a vráti posledný prvok v zozname."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Odstráni a vráti náhodný prvok v zozname."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Odstráni prvý prvok v zozname."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Odstráni prvok na určenej pozícii v zozname. #1 je posledný prvok."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Odstráni prvok na určenej pozícii v zozname. #1 je prvý prvok."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Odstráni posledný prvok v zozname."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Odstráni náhodný prvok v zozname."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "po # od konca"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "po #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "po koniec"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "Získať podzoznam od začiatku"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "Získať podzoznam od # od konca"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "získať podzoznam od #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Skopíruje určený úsek zoznamu."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "nájdi prvý výskyt prvku"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "nájdi posledný výskyt prvku"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Vráti index prvého/posledného výskytu prvku v zozname. Ak nenašiel, vráti 0."; -Blockly.Msg.LISTS_INLIST = "v zozname"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 je prázdny"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Vráti pravda, ak je zoznam prázdny."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "dĺžka %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Vráti dĺžku zoznamu"; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "vytvor zoznam s prvkom %1 opakovaným %2 krát"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Vytvorí zoznam s niekoľkými rovnakými prvkami s danou hodnotou."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "ako"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "vložiť na"; -Blockly.Msg.LISTS_SET_INDEX_SET = "nastaviť"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Vsunie prvok na začiatok zoznamu."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Vsunie prvok na určenú pozíciu v zozname. #1 je posledný prvok."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Vsunie prvok na určenú pozíciu v zozname. #1 je prvý prvok."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Pripojí prvok na koniec zoznamu."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Vsunie prvok na náhodné miesto v zozname."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Nastaví prvý prvok v zozname."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Nastaví prvok na určenej pozícii v zozname. #1 je posledný prvok."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Nastaví prvok na určenej pozícii v zozname. #1 je prvý prvok."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Nastaví posledný prvok v zozname."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Nastaví posledný prvok v zozname."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "vytvoriť zoznam z textu"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "vytvoriť text zo zoznamu"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Spojiť zoznam textov do jedného textu s oddeľovačmi."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Rozdelenie textu do zoznamu textov, lámanie na oddeľovačoch."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "s oddeľovačom"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "nepravda"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Vráť buď hodnotu pravda alebo nepravda."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "pravda"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Vráť hodnotu pravda, ak sú vstupy rovnaké."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Vráť hodnotu pravda ak prvý vstup je väčší než druhý."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Vráť hodnotu pravda ak prvý vstup je väčší alebo rovný druhému."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Vráť hodnotu pravda, ak prvý vstup je menší než druhý."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Vráť hodnotu pravda ak prvý vstup je menší alebo rovný druhému."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Vráť hodnotu pravda, ak vstupy nie sú rovnaké."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "nie je %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Vráti hodnotu pravda, ak je vstup nepravda. Vráti hodnotu nepravda ak je vstup pravda."; -Blockly.Msg.LOGIC_NULL = "nič"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Vráti hodnotu nula."; -Blockly.Msg.LOGIC_OPERATION_AND = "a"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "alebo"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Vráť hodnotu pravda, ak sú vstupy pravdivé."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Vráť hodnotu pravda, ak je aspoň jeden vstup pravda."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "ak nepravda"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "ak pravda"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Skontroluj podmienku testom. Ak je podmienka pravda, vráť hodnotu \"ak pravda\", inak vráť hodnotu \"ak nepravda\"."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Vráť súčet dvoch čísel."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Vráť podiel dvoch čísel."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Vráť rozdiel dvoch čísel."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Vráť súčin dvoch čísel."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Vráť prvé číslo umocnené druhým."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "zmeniť %1 o %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Pridaj číslo do premennej \"%1\"."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant‎"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Vráť jednu zo zvyčajných konštánt: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), alebo ∞ (nekonečno)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "obmedz %1 od %2 do %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Obmedzí číslo do zadaných hraníc (vrátane)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "je deliteľné"; -Blockly.Msg.MATH_IS_EVEN = "je párne"; -Blockly.Msg.MATH_IS_NEGATIVE = "je záporné"; -Blockly.Msg.MATH_IS_ODD = "je nepárne"; -Blockly.Msg.MATH_IS_POSITIVE = "je kladné"; -Blockly.Msg.MATH_IS_PRIME = "je prvočíslo"; -Blockly.Msg.MATH_IS_TOOLTIP = "Skontroluj či je číslo párne, nepárne, celé, kladné, záporné alebo deliteľné určitým číslom. Vráť hodnotu pravda alebo nepravda."; -Blockly.Msg.MATH_IS_WHOLE = "je celé číslo"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "zvyšok po delení %1 + %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Vráť zvyšok po delení jedného čísla druhým."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Číslo."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "priemer zoznamu"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "najväčšie v zozname"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "medián zoznamu"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "najmenšie v zozname"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "najčastejšie v zozname"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "náhodný prvok zoznamu"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "smerodajná odchýlka zoznamu"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "súčet zoznamu"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Vráť aritmetický priemer čísel v zozname."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Vrátiť najväčšie číslo v zozname."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Vráť medián čísel v zozname."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Vrátiť najmenšie číslo v zozname."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Vrátiť najčastejší prvok v zozname."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Vráť náhodne zvolený prvok zoznamu."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Vráť smeroddajnú odchýlku zoznamu."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Vráť súčet všetkých čísel v zozname."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "náhodné číslo od 0 do 1"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Vráť náhodné číslo z intervalu 0.0 (vrátane) až 1.0."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "náhodné celé číslo od %1 do %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Vráť náhodné celé číslo z určeného intervalu (vrátane)."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "zaokrúhli"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "zaokrúhli nadol"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "zaokrúhli nahor"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Zaokrúhli číslo nahor alebo nadol."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolútna hodnota"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "druhá odmocnina"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Vráť absolútnu hodnotu čísla."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Vráť e umocnené číslom."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Vráť prirodzený logaritmus čísla."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Vráť logaritmus čísla so základom 10."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Vráť opačné číslo."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Vráť 10 umocnené číslom."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Vráť druhú odmocninu čísla."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Vráť arkus kosínus čísla."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Vráť arkus sínus čísla."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Vráť arkus tangens čísla."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Vráť kosínus uhla (v stupňoch)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Vráť sínus uhla (v stupňoch)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Vráť tangens uhla (v stupňoch)."; -Blockly.Msg.ME = "Ja"; -Blockly.Msg.NEW_VARIABLE = "Nová premenná..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Názov novej premennej:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "povoliť príkazy"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "s:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Spustí používateľom definovanú funkciu '%1'."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Spustí používateľom definovanú funkciu '%1' a použije jej výstup."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "s:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Vytvoriť '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "urob niečo"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "na"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Vytvorí funciu bez výstupu."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "vrátiť"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Vytvorí funkciu s výstupom."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Upozornenie: Táto funkcia má duplicitné parametre."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Zvýrazniť definíciu funkcie"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Ak je hodnota pravda, tak vráti druhú hodnotu."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Upozornenie: Tento blok môže byť len vo vnútri funkcie."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "názov vstupu:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Pridať vstup do funkcie."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "vstupy"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Pridať, odstrániť alebo zmeniť poradie vstupov tejto funkcie."; -Blockly.Msg.REMOVE_COMMENT = "Odstrániť komentár"; -Blockly.Msg.RENAME_VARIABLE = "Premenovať premennú..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Premenovať všetky premenné '%1' na:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "pridaj text"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "do"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Pridaj určitý text do premennej '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "na malé písmená"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "na Veľké Začiatočné Písmená"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "na VEĽKÉ PÍSMENÁ"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Vráť kópiu textu s inou veľkosťou písmen."; -Blockly.Msg.TEXT_CHARAT_FIRST = "zisti prvé písmeno"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "zisti # písmeno od konca"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "zisti písmeno #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "v texte"; -Blockly.Msg.TEXT_CHARAT_LAST = "zisti posledné písmeno"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "vyber náhodné písmeno"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Vráti písmeno na určenej pozícii."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Pridaj prvok do textu."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "spoj"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Pridaj, odstráň alebo zmeň poradie oddielov v tomto textovom bloku."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "po # písmeno od konca"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "po písmeno #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "po koniec"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "v texte"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "vyber podreťazec od začiatku"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "vyber podreťazec od # písmena od konca"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "vyber podreťazec od písmena #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Vráti určenú časť textu."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "v texte"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "nájdi prvý výskyt textu"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "nájdi posledný výskyt textu"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Vráti index prvého/posledného výskytu prvého textu v druhom texte. Ak nenájde, vráti 0."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 je prázdny"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Vráti hodnotu pravda, ak zadaný text je prázdny."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "vytvor text z"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Vytvor text spojením určitého počtu prvkov."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "dĺžka %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Vráti počet písmen (s medzerami) v zadanom texte."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "píš %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Napíš zadaný text, číslo alebo hodnotu."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Výzva pre používateľa na zadanie čísla."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Výzva pre používateľa na zadanie textu."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "výzva na zadanie čísla so správou"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "výzva za zadanie textu so správou"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Písmeno, slovo alebo riadok textu."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "odstráň medzery z oboch strán"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "odstráň medzery z ľavej strany"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "odstráň medzery z pravej strany"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Vráť kópiu textu bez medzier na jednom alebo oboch koncoch."; -Blockly.Msg.TODAY = "Dnes"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "prvok"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Vytvoriť \"nastaviť %1\""; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Vráti hodnotu tejto premennej."; -Blockly.Msg.VARIABLES_SET = "nastaviť %1 na %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Vytvoriť \"získať %1\""; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Nastaví túto premennú, aby sa rovnala vstupu."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/sr.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/sr.js deleted file mode 100644 index e903b75..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/sr.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.sr'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Додај коментар"; -Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated -Blockly.Msg.CHANGE_VALUE_TITLE = "Промените вредност:"; -Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!"; // untranslated -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Скупи блокове"; -Blockly.Msg.COLLAPSE_BLOCK = "Скупи блок"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "боја 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "боја 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "однос"; -Blockly.Msg.COLOUR_BLEND_TITLE = "помешај"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Помешати две боје заједно са датим односом (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://sr.wikipedia.org/wiki/Боја"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Изаберите боју са палете."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "случајна боја"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Изаберите боју насумице."; -Blockly.Msg.COLOUR_RGB_BLUE = "плава"; -Blockly.Msg.COLOUR_RGB_GREEN = "зелена"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "црвена"; -Blockly.Msg.COLOUR_RGB_TITLE = "боја са"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Креирај боју са одређеном количином црвене,зелене, и плаве. Све вредности морају бити између 0 и 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "Изађите из петље"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "настави са следећом итерацијом петље"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Напусти садржај петље."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Прескочи остатак ове петље, и настави са следећом итерацијом(понављанјем)."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Упозорење: Овај блок може да се употреби само унутар петље."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "за сваку ставку %1 на списку %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "За сваку ставку унутар листе, подеси промењиву '%1' по ставци, и онда начини неке изјаве-наредбе."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "преброј са %1 од %2 до %3 од %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Имај промењиву \"%1\" узми вредности од почетног броја до задњег броја, бројећи по одређеном интервалу, и изврши одређене блокове."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Додајте услов блоку „ако“."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Додај коначни, catch-all (ухвати све) услове иф блока."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Додај, уклони, или преуреди делове како бих реконфигурисали овај иф блок."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "иначе"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "иначе-ако"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "ако"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "ако је вредност тачна, онда изврши неке наредбе-изјаве."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "ако је вредност тачна, онда изврши први блок наредби, У супротном, изврши други блок наредби."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Ако је прва вредност тачна, онда изврши први блок наредби, у супротном, ако је друга вредност тачна , изврши други блок наредби."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Ако је прва вредност тачна, онда изврши први блок наредби, у супротном, ако је друга вредност тачна , изврши други блок наредби. Ако ни једна од вредности није тачна, изврши последнји блок наредби."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://sr.wikipedia.org/wiki/For_петља"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "изврши"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "понови %1 пута"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Одрадити неке наредбе неколико пута."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "понављати до"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "понављати док"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Док вредност није тачна, онда извршити неке наредбе."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Док је вредност тачна, онда извршите неке наредбе."; -Blockly.Msg.DELETE_BLOCK = "Обриши блок"; -Blockly.Msg.DELETE_X_BLOCKS = "Обриши %1 блокова"; -Blockly.Msg.DISABLE_BLOCK = "Онемогући блок"; -Blockly.Msg.DUPLICATE_BLOCK = "Дуплирај"; -Blockly.Msg.ENABLE_BLOCK = "Омогући блок"; -Blockly.Msg.EXPAND_ALL = "Прошири блокове"; -Blockly.Msg.EXPAND_BLOCK = "Прошири блок"; -Blockly.Msg.EXTERNAL_INPUTS = "Спољни улази"; -Blockly.Msg.HELP = "Помоћ"; -Blockly.Msg.INLINE_INPUTS = "Унутрашњи улази"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "направи празан списак"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "враћа листу, дужине 0, не садржавајући евиденцију података"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "списак"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Додајте, избришите, или преуредите делове како би се реорганизовали овај блок листе."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "направи списак са"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Додајте ставку на списак."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Креирај листу са било којим бројем ставки."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "прва"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# са краја"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "преузми"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "преузми и уклони"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "последња"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "случајна"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "уклони"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Враћа прву ставку на списку."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Враћа ставку на одређену позицију на листи. #1 је последња ставка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Враћа ставку на одређену позицију на листи. #1 је прва ставка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Враћа последњу ставку на списку."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Враћа случајну ставку са списка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Уклања и враћа прву ставку са списка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Уклања и враћа ставку са одређеног положаја на списку. #1 је последња ставка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Уклања и враћа ставку са одређеног положаја на списку. #1 је прва ставка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Уклања и враћа последњу ставку са списка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Уклања и враћа случајну ставку са списка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Уклања прву ставку са списка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Уклања ставку са одређеног положаја на списку. #1 је последња ставка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Уклања ставку са одређеног положаја на списку. #1 је прва ставка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Уклања последњу ставку са списка."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Уклања случајну ставку са списка."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "до # од краја"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "до #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "до последње"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "преузми подсписак од прве"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "преузми подсписак из # са краја"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "преузми подсписак од #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Прави копију одређеног дела листе."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "пронађи прво појављивање ставке"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "пронађи последње појављивање ставке"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Враћа однос првог/последнјег појавлјиванја ставке у листи. Враћа 0 ако се текст не наће."; -Blockly.Msg.LISTS_INLIST = "на списку"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 је празан"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Враћа вредност тачно ако је листа празна."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "дужина списка %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Враћа дужину списка."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "Направити листу са ставком %1 која се понавлја %2 пута"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Прави листу која се састоји од задане вредности коју понавлјамо одређени број шута."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "као"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "убаци на"; -Blockly.Msg.LISTS_SET_INDEX_SET = "постави"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Убацује ставку на почетак списка."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Убацује ставку на одређени положај на списку. #1 је последња ставка."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Убацује ставку на одређени положај на списку. #1 је прва ставка."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Додајте ставку на крај списка."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Убацује ставку на случајно место на списку."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Поставља прву ставку на списку."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Поставља ставку на одређени положај на списку. #1 је последња ставка."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Поставља ставку на одређени положај на списку. #1 је прва ставка."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Поставља последњу ставку на списку."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Поставља случајну ставку на списку."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "нетачно"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "враћа вредност или тачно или нетачно."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "тачно"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://sr.wikipedia.org/wiki/Неједнакост"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Враћа вредност „тачно“ ако су оба улаза једнака."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Враћа вредност „тачно“ ако је први улаз већи од другог."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Враћа вредност „тачно“ ако је први улаз већи или једнак другом."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Враћа вредност „тачно“ ако је први улаз мањи од другог."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Враћа вредност „тачно“ ако је први улаз мањи или једнак другом."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Враћа вредност „тачно“ ако су оба улаза неједнака."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "није %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Враћа вредност „тачно“ ако је улаз нетачан. Враћа вредност „нетачно“ ако је улаз тачан."; -Blockly.Msg.LOGIC_NULL = "без вредности"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Враћа „без вредности“."; -Blockly.Msg.LOGIC_OPERATION_AND = "и"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "или"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Враћа вредност „тачно“ ако су оба улаза тачна."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Враћа вредност „тачно“ ако је бар један од улаза тачан."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "тест"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "ако је нетачно"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "ако је тачно"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Провери услов у 'test'. Ако је услов тачан, тада враћа 'if true' вредност; у другом случају враћа 'if false' вредност."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Вратите збир два броја."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Враћа количник два броја."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Враћа разлику два броја."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Враћа производ два броја."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Враћа први број степенован другим."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "промени %1 за %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Додајте број променљивој „%1“."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://sr.wikipedia.org/wiki/Математичка_константа"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "врати једну од заједничких константи: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), или ∞ (infinity)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "ограничи %1 ниско %2 високо %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Ограничава број на доње и горње границе (укључиво)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "је дељив са"; -Blockly.Msg.MATH_IS_EVEN = "је паран"; -Blockly.Msg.MATH_IS_NEGATIVE = "је негативан"; -Blockly.Msg.MATH_IS_ODD = "је непаран"; -Blockly.Msg.MATH_IS_POSITIVE = "је позитиван"; -Blockly.Msg.MATH_IS_PRIME = "је прост"; -Blockly.Msg.MATH_IS_TOOLTIP = "Провјерава да ли је број паран, непаран, прост, цио, позитиван, негативан, или да ли је делјив са одређеним бројем. Враћа тачно или нетачно."; -Blockly.Msg.MATH_IS_WHOLE = "је цео"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://sr.wikipedia.org/wiki/Конгруенција"; -Blockly.Msg.MATH_MODULO_TITLE = "подсетник од %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Враћа подсетник од дељења два броја."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Неки број."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "просек списка"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "макс. списка"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "медијана списка"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "мин. списка"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "модус списка"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "случајна ставка списка"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "стандардна девијација списка"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "збир списка"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Враћа просек нумеричких вредности са списка."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Враћа највећи број са списка."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Враћа медијану са списка."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Враћа најмањи број са списка."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Враћа најчешће ставке са списка."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Враћа случајни елемент са списка."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Враћа стандардну девијацију списка."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Враћа збир свих бројева са списка."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://sr.wikipedia.org/wiki/Генератор_случајних_бројева"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "случајни разломак"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Враћа случајни разломак између 0.0 (укључиво) и 1.0 (искључиво)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://sr.wikipedia.org/wiki/Генератор_случајних_бројева"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "сличајно одабрани цијели број од %1 до %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Враћа случајно одабрани цели број између две одређене границе, уклјучиво."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://sr.wikipedia.org/wiki/Заокруживање"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "заокружи"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "заокружи наниже"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "заокружи навише"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Заокружите број на већу или мању вредност."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://sr.wikipedia.org/wiki/Квадратни_корен"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "апсолутан"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "квадратни корен"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Враћа апсолутну вредност броја."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "вратити е на власти броја."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Враћа природни логаритам броја."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Враћа логаритам броја са основом 10."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Враћа негацију броја."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Враћа 10-ти степен броја."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Враћа квадратни корен броја."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "арц цос"; -Blockly.Msg.MATH_TRIG_ASIN = "арц син"; -Blockly.Msg.MATH_TRIG_ATAN = "арц тан"; -Blockly.Msg.MATH_TRIG_COS = "цос"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://sr.wikipedia.org/wiki/Тригонометријске_функције"; -Blockly.Msg.MATH_TRIG_SIN = "син"; -Blockly.Msg.MATH_TRIG_TAN = "тан"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Враћа аркус косинус броја."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Враћа аркус броја."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Враћа аркус тангенс броја."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Враћа косинус степена (не радијан)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Враћа синус степена (не радијан)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Враћа тангенс степена (не радијан)."; -Blockly.Msg.ME = "Me"; // untranslated -Blockly.Msg.NEW_VARIABLE = "Нова променљива…"; -Blockly.Msg.NEW_VARIABLE_TITLE = "Име нове променљиве:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "са:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://sr.wikipedia.org/wiki/Функција_(програмирање)"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Покрените прилагођену функцију „%1“."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://sr.wikipedia.org/wiki/Функција_(програмирање)"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Покрените прилагођену функцију „%1“ и користи њен излаз."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "са:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Направи „%1“"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "урадите нешто"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "да"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Прави функцију без излаза."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "врати"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Прави функцију са излазом."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Упозорење: Ова функција има дупликате параметара."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Истакни дефиницију функције"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Уколико је вредност тачна, врати другу вредност."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Упозорење: Овај блок се може користити једино у дефиницији функције."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "назив улаза:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "улази"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated -Blockly.Msg.REMOVE_COMMENT = "Уклони коментар"; -Blockly.Msg.RENAME_VARIABLE = "Преименуј променљиву…"; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Преименујте све „%1“ променљиве у:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "додај текст"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "на"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Додајте текст на променљиву „%1“."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "малим словима"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "свака реч великим словом"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "великим словима"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Враћа примерак текста са другачијом величином слова."; -Blockly.Msg.TEXT_CHARAT_FIRST = "преузми прво слово"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "преузми слово # са краја"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "преузми слово #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "у тексту"; -Blockly.Msg.TEXT_CHARAT_LAST = "преузми последње слово"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "преузми случајно слово"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Враћа слово на одређени положај."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Додајте ставку у текст."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "спајањем"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Додај, уклони, или другачије поредај одјелке како би изнова поставили овај текст блок."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "слову # са краја"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "слову #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "последњем слову"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "у тексту"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "преузми подниску из првог слова"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "преузми подниску из слова # са краја"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "преузми подниску из слова #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Враћа одређени део текста."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "у тексту"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "пронађи прво појављивање текста"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "пронађи последње појављивање текста"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Враћа однос првог/заднјег појавлјиванја текста у другом тексту. Врађа 0 ако текст није пронађен."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 је празан"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Враћа тачно ако је доставлјени текст празан."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "напиши текст са"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Направити дио текста спајајући различите ставке."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "дужина текста %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Враћа број слова (уклјучујући размаке) у датом тексту."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "прикажи %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Прикажите одређени текст, број или другу вредност на екрану."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Питајте корисника за број."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Питајте корисника за унос текста."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "питај за број са поруком"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "питај за текст са поруком"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://sr.wikipedia.org/wiki/Ниска"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Слово, реч или ред текста."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "скратити простор са обе стране"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "скратити простор са леве стране"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "скратити простор са десне стране"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Враћа копију текста са уклонјеним простором са једног од два краја."; -Blockly.Msg.TODAY = "Today"; // untranslated -Blockly.Msg.VARIABLES_DEFAULT_NAME = "ставка"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Направи „постави %1“"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Враћа вредност ове променљиве."; -Blockly.Msg.VARIABLES_SET = "постави %1 у %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Направи „преузми %1“"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Поставља променљиву тако да буде једнака улазу."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/sv.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/sv.js deleted file mode 100644 index 52e1d98..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/sv.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.sv'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Lägg till kommentar"; -Blockly.Msg.AUTH = "Var god godkänn denna app för att du ska kunna spara och dela den."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Ändra värde:"; -Blockly.Msg.CHAT = "Chatta med din medarbetare genom att skriva i detta fält."; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Fäll ihop block"; -Blockly.Msg.COLLAPSE_BLOCK = "Fäll ihop block"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "färg 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "färg 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "förhållande"; -Blockly.Msg.COLOUR_BLEND_TITLE = "blanda"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blandar ihop två färger med ett bestämt förhållande (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://sv.wikipedia.org/wiki/Färg"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Välj en färg från paletten."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "slumpfärg"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Slumpa fram en färg."; -Blockly.Msg.COLOUR_RGB_BLUE = "blå"; -Blockly.Msg.COLOUR_RGB_GREEN = "grön"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "röd"; -Blockly.Msg.COLOUR_RGB_TITLE = "färg med"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Skapa en färg med det angivna mängden röd, grön och blå. Alla värden måste vara mellan 0 och 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "bryt ut ur loop"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "fortsätta med nästa upprepning av loop"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Bryta ut ur den innehållande upprepningen."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Hoppa över resten av denna loop och fortsätt med nästa loop."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Varning: Detta block kan endast användas i en loop."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "för varje föremål %1 i listan %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "För varje objekt i en lista, ange variabeln '%1' till objektet, och utför sedan några kommandon."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "räkna med %1 från %2 till %3 med %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Låt variabeln \"%1\" ta värden från starttalet till sluttalet, beräknat med det angivna intervallet, och utför de angivna blocken."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Lägg till ett villkor blocket \"om\"."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Lägg till ett sista villkor som täcker alla alternativ som är kvar för \"if\"-blocket."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Lägg till, ta bort eller ändra ordningen för sektioner för att omkonfigurera blocket \"om\"."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "annars"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "annars om"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "om"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Om ett värde är sant, utför några kommandon."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Om värdet är sant, utför det första kommandoblocket. Annars utför det andra kommandoblocket."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Om det första värdet är sant, utför det första kommandoblocket. Annars, om det andra värdet är sant, utför det andra kommandoblocket."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Om det första värdet är sant, utför det första kommandoblocket. Annars, om det andra värdet är sant, utför det andra kommandoblocket. Om ingen av värdena är sanna, utför det sista kommandoblocket."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "utför"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "upprepa %1 gånger"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Utför några kommandon flera gånger."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "upprepa tills"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "upprepa medan"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Medan ett värde är falskt, utför några kommandon."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Medan ett värde är sant, utför några kommandon."; -Blockly.Msg.DELETE_BLOCK = "Radera block"; -Blockly.Msg.DELETE_X_BLOCKS = "Radera %1 block"; -Blockly.Msg.DISABLE_BLOCK = "Inaktivera block"; -Blockly.Msg.DUPLICATE_BLOCK = "Duplicera"; -Blockly.Msg.ENABLE_BLOCK = "Aktivera block"; -Blockly.Msg.EXPAND_ALL = "Fäll ut block"; -Blockly.Msg.EXPAND_BLOCK = "Fäll ut block"; -Blockly.Msg.EXTERNAL_INPUTS = "Externa inmatningar"; -Blockly.Msg.HELP = "Hjälp"; -Blockly.Msg.INLINE_INPUTS = "Radinmatning"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "skapa tom lista"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Ger tillbaka en lista utan någon data, alltså med längden 0"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Lägg till, ta bort eller ändra ordningen på objekten för att göra om det här \"list\"-blocket."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "skapa lista med"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Lägg till ett föremål till listan."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Skapa en lista med valfritt antal föremål."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "första"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# från slutet"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "hämta"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "hämta och ta bort"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "sista"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "slumpad"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "ta bort"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returnerar det första objektet i en lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Ger tillbaka objektet på den efterfrågade positionen i en lista. #1 är det sista objektet."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Ger tillbaka objektet på den efterfrågade positionen i en lista. #1 är det första objektet."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returnerar det sista objektet i en lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returnerar ett slumpmässigt objekt i en lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Tar bort och återställer det första objektet i en lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Tar bort och återställer objektet på den specificerade positionen i en lista. #1 är det sista objektet."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Tar bort och återställer objektet på den specificerade positionen i en lista. #1 är det första objektet."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Tar bort och återställer det sista objektet i en lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Tar bort och återställer ett slumpmässigt objekt i en lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Tar bort det första objektet i en lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Tar bort objektet på den efterfrågade positionen i en lista. #1 är det sista objektet."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Tar bort objektet på den specificerade positionen i en lista. #1 är det första objektet."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Tar bort det sista objektet i en lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Tar bort en slumpmässig post i en lista."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "till # från slutet"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "till #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "till sista"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "få underlista från första"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "få underlista från # från slutet"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "få underlista från #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Skapar en kopia av den specificerade delen av en lista."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "hitta första förekomsten av objektet"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "hitta sista förekomsten av objektet"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Ger tillbaka den första/sista förekomsten av objektet i listan. Ger tillbaka 0 om texten inte hittas."; -Blockly.Msg.LISTS_INLIST = "i listan"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 är tom"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returnerar sant om listan är tom."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "längden på %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returnerar längden på en lista."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "skapa lista med föremålet %1 upprepat %2 gånger"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Skapar en lista som innehåller ett valt värde upprepat ett bestämt antalet gånger."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "som"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "Sätt in vid"; -Blockly.Msg.LISTS_SET_INDEX_SET = "ange"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "sätter in objektet i början av en lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "sätter in objektet vid en specificerad position i en lista. #1 är det sista objektet."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Sätter in objektet vid en specificerad position i en lista. #1 är det första objektet."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Lägg till objektet i slutet av en lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "sätter in objektet på en slumpad position i en lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Anger det första objektet i en lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sätter in objektet vid en specificerad position i en lista. #1 är det sista objektet."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sätter in objektet vid en specificerad position i en lista. #1 är det första objektet."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Anger det sista elementet i en lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sätter in ett slumpat objekt i en lista."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "skapa lista från text"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "skapa text från lista"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Sammanfoga en textlista till en text, som separeras av en avgränsare."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Dela upp text till en textlista och bryt vid varje avgränsare."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "med avgränsare"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falskt"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returnerar antingen sant eller falskt."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "sant"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://sv.wikipedia.org/wiki/Olikhet"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Ger tillbaka sant om båda värdena är lika med varandra."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Ger tillbaka sant om det första värdet är större än det andra."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Ger tillbaka sant om det första värdet är större än eller lika med det andra."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Ger tillbaka sant om det första värdet är mindre än det andra."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Ger tillbaka sant om det första värdet är mindre än eller lika med det andra."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Ger tillbaka sant om båda värdena inte är lika med varandra."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "inte %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Ger tillbaka sant om inmatningen är falsk. Ger tillbaka falskt och inmatningen är sann."; -Blockly.Msg.LOGIC_NULL = "null"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://sv.wikipedia.org/wiki/Null"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returnerar null."; -Blockly.Msg.LOGIC_OPERATION_AND = "och"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "eller"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Ger tillbaka sant om båda värdena är sanna."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Ger tillbaka sant om minst ett av värdena är sant."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "om falskt"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "om sant"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Kontrollera villkoret i \"test\". Om villkoret är sant, ge tillbaka \"om sant\"-värdet; annars ge tillbaka \"om falskt\"-värdet."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://sv.wikipedia.org/wiki/Aritmetik"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Returnerar summan av de två talen."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Returnerar kvoten av de två talen."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Returnerar differensen mellan de två talen."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Returnerar produkten av de två talen."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Ger tillbaka det första talet upphöjt till det andra talet."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "ändra %1 med %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Lägg till ett tal till variabeln '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://sv.wikipedia.org/wiki/Matematisk_konstant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Returnerar en av de vanliga konstanterna: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) eller ∞ (oändligt)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "begränsa %1 till mellan %2 och %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Begränsa ett tal till att mellan de angivna gränsvärden (inklusive)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "är delbart med"; -Blockly.Msg.MATH_IS_EVEN = "är jämnt"; -Blockly.Msg.MATH_IS_NEGATIVE = "är negativt"; -Blockly.Msg.MATH_IS_ODD = "är ojämnt"; -Blockly.Msg.MATH_IS_POSITIVE = "är positivt"; -Blockly.Msg.MATH_IS_PRIME = "är ett primtal"; -Blockly.Msg.MATH_IS_TOOLTIP = "Kontrollera om ett tal är jämnt, ojämnt, helt, positivt, negativt eller det är delbart med ett bestämt tal. Returnerar med sant eller falskt."; -Blockly.Msg.MATH_IS_WHOLE = "är helt"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "resten av %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Returnerar kvoten från divisionen av de två talen."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://sv.wikipedia.org/wiki/Tal"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Ett tal."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "medelvärdet av listan"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "högsta talet i listan"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "medianen av listan"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minsta talet i listan"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "typvärdet i listan"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "slumpmässigt objekt i listan"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standardavvikelsen i listan"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "summan av listan"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Ger tillbaka medelvärdet (aritmetiskt) av de numeriska värdena i listan."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Ger tillbaka det största talet i listan."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Returnerar medianen av talen i listan."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Ger tillbaka det minsta talet i listan."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Ger tillbaka en lista med de(t) vanligaste objekte(t/n) i listan."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Returnerar ett slumpmässigt element från listan."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Ger tillbaka standardavvikelsen i listan."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Ger tillbaka summan av alla talen i listan."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://sv.wikipedia.org/wiki/Slumptalsgenerator"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "slumpat decimaltal"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Ger tillbaka ett slumpat decimaltal mellan 0.0 (inkluderat) och 1.0 (exkluderat)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://sv.wikipedia.org/wiki/Slumptalsgenerator"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "slumpartat heltal från %1 till %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Ger tillbaka ett slumpat heltal mellan två värden (inklusive)."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://sv.wikipedia.org/wiki/Avrundning"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "avrunda"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "avrunda nedåt"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "avrunda uppåt"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Avrunda ett tal uppåt eller nedåt."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://sv.wikipedia.org/wiki/Kvadratrot"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolut"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "kvadratrot"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Returnerar absolutvärdet av ett tal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Ger tillbaka e upphöjt i ett tal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Returnera den naturliga logaritmen av ett tal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Returnerar logaritmen för bas 10 av ett tal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Returnerar negationen av ett tal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Ger tillbaka 10 upphöjt i ett tal."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Returnerar kvadratroten av ett tal."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "arccos"; -Blockly.Msg.MATH_TRIG_ASIN = "arcsin"; -Blockly.Msg.MATH_TRIG_ATAN = "arctan"; -Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://sv.wikipedia.org/wiki/Trigonometrisk_funktion"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; -Blockly.Msg.MATH_TRIG_TAN = "tan"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Ger tillbaka arcus cosinus (arccos) för ett tal."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Ger tillbaka arcus sinus (arcsin) för ett tal."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Ger tillbaka arcus tangens (arctan) av ett tal."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Ger tillbaka cosinus för en grad (inte radian)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Ger tillbaka sinus för en grad (inte radian)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Ger tillbaka tangens för en grad (inte radian)."; -Blockly.Msg.ME = "Jag"; -Blockly.Msg.NEW_VARIABLE = "Ny variabel..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nytt variabelnamn:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "tillåta uttalanden"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "med:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Kör den användardefinierade funktionen \"%1\"."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Kör den användardefinierade funktionen \"%1\" och använd resultatet av den."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "med:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Skapa '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "göra något"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "för att"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Skapar en funktion utan output."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "returnera"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Skapar en funktion med output."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Varning: Denna funktion har dubbla parametrar."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Markera funktionsdefinition"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Om ett värde är sant returneras ett andra värde."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Varning: Detta block får användas endast i en funktionsdefinition."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "inmatningsnamn:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Lägg till en inmatning till funktionen."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inmatningar"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Lägg till, ta bort och ändra ordningen för inmatningar till denna funktion."; -Blockly.Msg.REMOVE_COMMENT = "Radera kommentar"; -Blockly.Msg.RENAME_VARIABLE = "Byt namn på variabel..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Byt namn på alla'%1'-variabler till:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "lägg till text"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "till"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Lägg till lite text till variabeln '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "till gemener"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "till Versala Initialer"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "till VERSALER"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Returnerar en kopia av texten i ett annat skiftläge."; -Blockly.Msg.TEXT_CHARAT_FIRST = "hämta första bokstaven"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "hämta bokstaven # från slutet"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "hämta bokstaven #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "i texten"; -Blockly.Msg.TEXT_CHARAT_LAST = "hämta sista bokstaven"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "hämta slumpad bokstav"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Ger tillbaka bokstaven på den specificerade positionen."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Lägg till ett föremål till texten."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "sammanfoga"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Lägg till, ta bort eller ändra ordningen för sektioner för att omkonfigurera detta textblock."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "till bokstav # från slutet"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "till bokstav #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "till sista bokstaven"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "i texten"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "få textdel från första bokstaven"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "få textdel från bokstav # från slutet"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "få textdel från bokstav #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Ger tillbaka en viss del av texten."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "i texten"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "hitta första förekomsten av texten"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "hitta sista förekomsten av texten"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Ger tillbaka indexet för den första/sista förekomsten av första texten i den andra texten. Ger tillbaka 0 om texten inte hittas."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 är tom"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returnerar sant om den angivna texten är tom."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "skapa text med"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Skapa en textbit genom att sammanfoga ett valfritt antal föremål."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "längden på %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Ger tillbaka antalet bokstäver (inklusive mellanslag) i den angivna texten."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "skriv %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Skriv den angivna texten, talet eller annat värde."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Fråga användaren efter ett tal."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Fråga användaren efter lite text."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "fråga efter ett tal med meddelande"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "fråga efter text med meddelande"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://sv.wikipedia.org/wiki/Str%C3%A4ng_%28data%29"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "En bokstav, ord eller textrad."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "ta bort mellanrum från båda sidorna av"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "ta bort mellanrum från vänstra sidan av"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "ta bort mellanrum från högra sidan av"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Returnerar en kopia av texten med borttagna mellanrum från en eller båda ändar."; -Blockly.Msg.TODAY = "Idag"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "föremål"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Skapa \"välj %1\""; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returnerar värdet av denna variabel."; -Blockly.Msg.VARIABLES_SET = "välj %1 till %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Skapa 'hämta %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Gör så att den här variabeln blir lika med inputen."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/th.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/th.js deleted file mode 100644 index 74657e8..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/th.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.th'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "ใส่คำอธิบาย"; -Blockly.Msg.AUTH = "กรุณาอนุญาตแอปนี้เพื่อเปิดใช้งาน การบันทึกงานของคุณ และยินยอมให้คุณแบ่งปันงานของคุณได้"; -Blockly.Msg.CHANGE_VALUE_TITLE = "เปลี่ยนค่า:"; -Blockly.Msg.CHAT = "คุยกับผู้ร่วมงานของคุณโดยพิมพ์ลงในกล่องนี้!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "ย่อบล็อก"; -Blockly.Msg.COLLAPSE_BLOCK = "ย่อบล็อก"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "สีที่ 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "สีที่ 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "อัตราส่วน"; -Blockly.Msg.COLOUR_BLEND_TITLE = "ผสม"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "ผสมสองสีเข้าด้วยกันด้วยอัตราส่วน (0.0 - 1.0)"; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://th.wikipedia.org/wiki/สี"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "เลือกสีจากจานสี"; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "สุ่มสี"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "เลือกสีแบบสุ่ม"; -Blockly.Msg.COLOUR_RGB_BLUE = "ค่าสีน้ำเงิน"; -Blockly.Msg.COLOUR_RGB_GREEN = "ค่าสีเขียว"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "ค่าสีแดง"; -Blockly.Msg.COLOUR_RGB_TITLE = "สีที่ประกอบด้วย"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "สร้างสีด้วยการกำหนดค่าสีแดง เขียว และน้ำเงิน ค่าทั้งหมดต้องอยู่ระหว่าง 0 ถึง 100"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "ออกจากการวนซ้ำ"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "เริ่มการวนซ้ำรอบต่อไป"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "ออกจากการวนซ้ำที่มีอยู่"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "ข้ามสิ่งที่เหลืออยู่ และไปเริ่มวนซ้ำรอบต่อไปทันที"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "ระวัง: บล็อกชนิดนี้สามารถใช้งานได้เมื่ออยู่ภายในการวนซ้ำเท่านั้น"; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "วนซ้ำทุกรายการ %1 ในรายการ %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "ทำซ้ำทุกรายการ กำหนดค่าตัวแปร \"%1\" ตามรายการ และทำตามคำสั่งที่กำหนดไว้"; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "นับ %1 จาก %2 จนถึง %3 เปลี่ยนค่าทีละ %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "ตัวแปร \"%1\" จะมีค่าตั้งแต่จำนวนเริ่มต้น ไปจนถึงจำนวนสิ้นสุด โดยมีการเปลี่ยนแปลงตามจำนวนที่กำหนด"; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "กำหนดเงื่อนไขของบล็อก \"ถ้า\""; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "เพิ่มสิ่งสุดท้าย ที่จะตรวจจับความเป็นไปได้ทั้งหมดของบล็อก \"ถ้า\""; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "เพิ่ม ลบ หรือจัดเรียงบล็อก \"ถ้า\" นี้ใหม่"; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "นอกเหนือจากนี้"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "นอกเหนือจากนี้ ถ้า"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "ถ้า"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "ว่าเงื่อนไขเป็นจริง ก็จะ \"ทำ\" ตามที่กำหนด"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "ถ้าเงื่อนไขเป็นจริง ก็จะ \"ทำ\" ตามที่กำหนด แต่ถ้าเงื่อนไขเป็นเท็จก็จะทำ \"นอกเหนือจากนี้\""; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "ถ้าเงื่อนไขแรกเป็นจริง ก็จะทำตามคำสั่งในบล็อกแรก แต่ถ้าไม่ก็จะไปตรวจเงื่อนไขที่สอง ถ้าเงื่อนไขที่สองเป็นจริง ก็จะทำตามเงื่อนไขในบล็อกที่สองนี้"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "ถ้าเงื่อนไขแรกเป็นจริง ก็จะทำคำสั่งในบล็อกแรก จากนั้นจะข้ามคำสั่งในบล็อกที่เหลือ แต่ถ้าเงื่อนไขแรกเป็นเท็จ ก็จะทำการตรวจเงื่อนไขที่สอง ถ้าเงื่อนไขที่สองเป็นจริง ก็จะทำตามคำสั่งในบล็อกที่สอง จากนั้นจะข้ามคำสั่งในบล็อกที่เหลือ แต่ถ้าทั้งเงื่อนไขแรกและเงื่อนไขที่สองเป็นเท็จทั้งหมด ก็จะมาทำบล็อกที่สาม"; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "ทำ:"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "ทำซ้ำ %1 ครั้ง"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "ทำซ้ำบางคำสั่งหลายครั้ง"; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ทำซ้ำจนกระทั่ง"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ทำซ้ำตราบเท่าที่"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "ตราบเท่าที่ค่าเป็นเท็จ ก็จะทำบางคำสั่ง"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "ตราบเท่าที่ค่าเป็นจริง ก็จะทำบางคำสั่ง"; -Blockly.Msg.DELETE_BLOCK = "ลบบล็อก"; -Blockly.Msg.DELETE_X_BLOCKS = "ลบ %1 บล็อก"; -Blockly.Msg.DISABLE_BLOCK = "ปิดใช้งานบล็อก"; -Blockly.Msg.DUPLICATE_BLOCK = "ทำซ้ำ"; -Blockly.Msg.ENABLE_BLOCK = "เปิดใช้งานบล็อก"; -Blockly.Msg.EXPAND_ALL = "ขยายบล็อก"; -Blockly.Msg.EXPAND_BLOCK = "ขยายบล็อก"; -Blockly.Msg.EXTERNAL_INPUTS = "อินพุตภายนอก"; -Blockly.Msg.HELP = "ช่วยเหลือ"; -Blockly.Msg.INLINE_INPUTS = "อินพุตในบรรทัด"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "สร้างรายการเปล่า"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "สร้างรายการเปล่า (ความยาวเป็น 0) ยังไม่มีข้อมูลใดๆ อยู่"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "รายการ"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "เพิ่ม ลบ หรือจัดเรียงบล็อกรายการนี้ใหม่"; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "สร้างข้อความด้วย"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "เพิ่มไอเท็มเข้าไปในรายการ"; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "สร้างรายการพร้อมด้วยไอเท็ม"; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "แรกสุด"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# จากท้าย"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "เรียกดู"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "เรียกดูและเอาออก"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "ท้ายสุด"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "สุ่ม"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "เอาออก"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "คืนค่าไอเท็มอันแรกในรายการ"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ #1 คือไอเท็มอันท้ายสุด"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ #1 คือไอเท็มอันแรกสุด"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "คืนค่าไอเท็มอันสุดท้ายในรายการ"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "คืนค่าไอเท็มแบบสุ่มจากรายการ"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "เอาออก และคืนค่าไอเท็มอันแรกในรายการ"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "เอาออก และคืนค่าไอเท็มในตำแหน่งที่ระบุจากรายการ #1 คือไอเท็มอันสุดท้าย"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "เอาออก และคืนค่าไอเท็มในตำแหน่งที่ระบุจากรายการ #1 คือไอเท็มอันแรก"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "เอาออก และคืนค่าไอเท็มอันสุดท้ายในรายการ"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "เอาออก และคืนค่าไอเท็มแบบสุ่มจากรายการ"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "เอาไอเท็มแรกสุดในรายการออก"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ #1 คือไอเท็มอันท้ายสุด"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ #1 คือไอเท็มอันแรกสุด"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "เอาไอเท็มอันท้ายสุดในรายการออก"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "เอาไอเท็มแบบสุ่มจากรายการออก"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "ถึง # จากท้ายสุด"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "จนถึง #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "ถึง ท้ายสุด"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "ดึงรายการย่อยทั้งแต่แรกสุด"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "ดึงรายการย่อยจาก # จากท้ายสุด"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "ดึงรายการย่อยจาก #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "สร้างสำเนารายการในช่วงที่กำหนด"; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "หาอันแรกที่พบ"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "หาอันสุดท้ายที่พบ"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "คืนค่าตำแหน่งของไอเท็มอันแรก/สุดท้ายที่พบในรายการ คืนค่า 0 ถ้าหาไม่พบ"; -Blockly.Msg.LISTS_INLIST = "ในรายการ"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ว่างเปล่า"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "คืนค่าเป็นจริง ถ้ารายการยังว่างเปล่า"; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "ความยาวของ %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "ส่งคืนค่าความยาวของรายการ"; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "สร้างรายการที่มีไอเท็ม %1 จำนวน %2"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "สร้างรายการที่ประกอบด้วยค่าตามที่ระบุในจำนวนตามที่ต้องการ"; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "เป็น"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "แทรกที่"; -Blockly.Msg.LISTS_SET_INDEX_SET = "กำหนด"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "แทรกไอเท็มเข้าไปเป็นอันแรกสุดของรายการ"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "แทรกไอเท็มเข้าไปในตำแหน่งที่กำหนด #1 คือไอเท็มอันสุดท้าย"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "แทรกไอเท็มเข้าไปในตำแหน่งที่กำหนด #1 คือไอเท็มอันแรก"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "เพิ่มไอเท็มเข้าไปท้ายสุดของรายการ"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "เพิ่มไอเท็มเข้าไปในรายการแบบสุ่ม"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "กำหนดไอเท็มอันแรกในรายการ"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "กำหนดไอเท็มในตำแหน่งที่ระบุในรายการ #1 คือไอเท็มอันท้ายสุด"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "กำหนดไอเท็มในตำแหน่งที่ระบุในรายการ #1 คือไอเท็มอันแรกสุด"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "กำหนดไอเท็มอันสุดท้ายในรายการ"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "กำหนดไอเท็มแบบสุ่มในรายการ"; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "สร้างรายการจากข้อความ"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "สร้างข้อความจากรายการ"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "รวมรายการข้อความเป็นข้อความเดียว แบ่งด้วยตัวคั่น"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "แบ่งข้อความเป็นรายการข้อความ แยกแต่ละรายการด้วยตัวคั่น"; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "ด้วยตัวคั่น"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "เท็จ"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "คืนค่าเป็นจริงหรือเท็จ"; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "จริง"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://th.wikipedia.org/wiki/อสมการ"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "คืนค่าเป็น \"จริง\" ถ้าค่าที่ใส่ทั้งสองค่านั้นเท่ากัน"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "คืนค่าเป็น \"จริง\" ถ้าค่าแรกมากกว่าค่าที่สอง"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "คืนค่าเป็น \"จริง\" ถ้าค่าแรกมากกว่าหรือเท่ากับค่าที่สอง"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "คืนค่าเป็น \"จริง\" ถ้าค่าแรกน้อยกว่าค่าที่สอง"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "คืนค่าเป็น \"จริง\" ถ้าค่าแรกน้อยกว่าหรือเท่ากับค่าที่สอง"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "คืนค่าเป็น \"จริง\" ถ้าค่าที่ใส่ทั้งสองค่านั้นไม่เท่ากัน"; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "ไม่ %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "คืนค่าเป็น \"จริง\" ถ้าค่าที่ใส่เป็นเท็จ คืนค่าเป็น \"เท็จ\" ถ้าค่าที่ใส่เป็นจริง"; -Blockly.Msg.LOGIC_NULL = "ไม่กำหนด"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "คืนค่า \"ไม่กำหนด\""; -Blockly.Msg.LOGIC_OPERATION_AND = "และ"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "หรือ"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "คืนค่าเป็น \"จริง\" ถ้าค่าทั้งสองค่าเป็นจริง"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "คืนค่าเป็น \"จริง\" ถ้ามีอย่างน้อยหนึ่งค่าที่เป็นจริง"; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "ทดสอบ"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "ถ้า เป็นเท็จ"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "ถ้า เป็นจริง"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "ตรวจสอบเงื่อนไขใน \"ทดสอบ\" ถ้าเงื่อนไขเป็นจริง จะคืนค่า \"ถ้า เป็นจริง\" ถ้าเงื่อนไขเป็นเท็จ จะคืนค่า \"ถ้า เป็นเท็จ\""; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://th.wikipedia.org/wiki/เลขคณิต"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "คืนค่าผลรวมของตัวเลขทั้งสองจำนวน"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "คืนค่าผลหารของตัวเลขทั้งสองจำนวน"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "คืนค่าผลต่างของตัวเลขทั้งสองจำนวน"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "คืนค่าผลคูณของตัวเลขทั้งสองจำนวน"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "คืนค่าผลการยกกำลัง โดยตัวเลขแรกเป็นฐาน และตัวเลขที่สองเป็นเลขชี้กำลัง"; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "เปลี่ยนค่า %1 เป็น %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "เพิ่มค่าของตัวแปร \"%1\""; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://th.wikipedia.org/wiki/ค่าคงตัวทางคณิตศาสตร์"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "คืนค่าคงตัวทางคณิตศาสตร์ที่พบบ่อยๆ เช่น π (3.141…), e (2.718…), φ (1.618…), รากที่สอง (1.414…), รากที่ ½ (0.707…), ∞ (อนันต์)"; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "จำกัดค่า %1 ต่ำสุด %2 สูงสุด %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "จำกัดค่าของตัวเลขให้อยู่ในช่วงที่กำหนด"; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "หารลงตัว"; -Blockly.Msg.MATH_IS_EVEN = "เป็นจำนวนคู่"; -Blockly.Msg.MATH_IS_NEGATIVE = "เป็นเลขติดลบ"; -Blockly.Msg.MATH_IS_ODD = "เป็นจำนวนคี่"; -Blockly.Msg.MATH_IS_POSITIVE = "เป็นเลขบวก"; -Blockly.Msg.MATH_IS_PRIME = "เป็นจำนวนเฉพาะ"; -Blockly.Msg.MATH_IS_TOOLTIP = "ตรวจว่าตัวเลขเป็นจำนวนคู่ จำนวนคี่ จำนวนเฉพาะ จำนวนเต็ม เลขบวก เลขติดลบ หรือหารด้วยเลขที่กำหนดลงตัวหรือไม่ คืนค่าเป็นจริงหรือเท็จ"; -Blockly.Msg.MATH_IS_WHOLE = "เป็นเลขจำนวนเต็ม"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "เศษของ %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "คืนค่าเศษที่ได้จากการหารของตัวเลขทั้งสองจำนวน"; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://th.wikipedia.org/wiki/จำนวน"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "จำนวน"; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "ค่าเฉลี่ยของรายการ"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "มากที่สุดในรายการ"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "ค่ามัธยฐานของรายการ"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "น้อยที่สุดในรายการ"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "ฐานนิยมของรายการ"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "สุ่มรายการ"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "ส่วนเบี่ยงเบนมาตรฐานของรายการ"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "ผลรวมของรายการ"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "คืนค่าเฉลี่ยของรายการ"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "คืนค่าตัวเลขที่มากที่สุดในรายการ"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "คืนค่ามัธยฐานของรายการ"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "คืนค่าตัวเลขที่น้อยที่สุดในรายการ"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "คืนค่าฐานนิยมของรายการ"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "สุ่มคืนค่าสิ่งที่อยู่ในรายการ"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "คืนค่าส่วนเบี่ยงเบนมาตรฐานของรายการ"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "คืนค่าผลรวมของตัวเลขทั้งหมดในรายการ"; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "สุ่มเลขเศษส่วน"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "สุ่มเลขเศษส่วน ตั้งแต่ 0.0 แต่ไม่เกิน 1.0"; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "สุ่มเลขจำนวนเต็มตั้งแต่ %1 จนถึง %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "สุ่มเลขจำนวนเต็มจากช่วงที่กำหนด"; -Blockly.Msg.MATH_ROUND_HELPURL = "https://th.wikipedia.org/wiki/การปัดเศษ"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "ปัดเศษ"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "ปัดเศษลง"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "ปัดเศษขึ้น"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "ปัดเศษของตัวเลขขึ้นหรือลง"; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "ค่าสัมบูรณ์"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "รากที่สอง"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "คืนค่าค่าสัมบูรณ์ของตัวเลข"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "คืนค่า e ยกกำลังด้วยตัวเลข"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "คืนค่าลอการิทึมธรรมชาติของตัวเลข"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "คืนค่าลอการิทึมฐานสิบของตัวเลข"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "คืนค่าติดลบของตัวเลข"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "คืนค่า 10 ยกกำลังด้วยตัวเลข"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "คืนค่ารากที่สองของตัวเลข"; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://th.wikipedia.org/wiki/ฟังก์ชันตรีโกณมิติ"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "คืนค่า arccosine ของตัวเลข"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "คืนค่า arcsine ของตัวเลข"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "คืนค่า arctangent ของตัวเลข"; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "คืนค่า cosine ขององศา (ไม่ใช่เรเดียน)"; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "คืนค่า sine ขององศา (ไม่ใช่เรเดียน)"; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "คืนค่า tangent ขององศา (ไม่ใช่เรเดียน)"; -Blockly.Msg.ME = "ฉัน"; -Blockly.Msg.NEW_VARIABLE = "สร้างตัวแปร..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "ชื่อตัวแปรใหม่:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "ด้วย:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_(computer_science)"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "เรียกใช้ฟังก์ชันที่สร้างโดยผู้ใช้ \"%1\""; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_(computer_science)"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "เรียกใช้ฟังก์ชันที่สร้างโดยผู้ใช้ \"%1\" และใช้ผลลัพธ์ของมัน"; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "ด้วย:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "สร้าง \"%1\""; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "ทำอะไรบางอย่าง"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "ถึง"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "สร้างฟังก์ชันที่ไม่มีผลลัพธ์"; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "คืนค่า"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "สร้างฟังก์ชันที่มีผลลัพธ์"; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "ระวัง: ฟังก์ชันนี้มีพารามิเตอร์ที่มีชื่อซ้ำกัน"; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "เน้นฟังก์ชันนิยาม"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "ถ้ามีค่าเป็นจริง ให้คืนค่าที่สอง"; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "ระวัง: บล็อกนี้ใช้เฉพาะในการสร้างฟังก์ชันเท่านั้น"; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "ชื่อนำเข้า:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "นำเข้า"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated -Blockly.Msg.REMOVE_COMMENT = "เอาคำอธิบายออก"; -Blockly.Msg.RENAME_VARIABLE = "เปลี่ยนชื่อตัวแปร..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "เปลี่ยนชื่อตัวแปร '%1' ทั้งหมดเป็น:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "ต่อด้วยข้อความ"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "นำเอา"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "ต่อข้อความให้ตัวแปร \"%1\""; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "เปลี่ยนเป็น ตัวพิมพ์เล็ก"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "เปลี่ยนเป็น ตัวอักษรแรกเป็นตัวพิมพ์ใหญ่"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "เปลี่ยนเป็น ตัวพิมพ์ใหญ่"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "คืนค่าสำเนาของข้อความในกรณีต่างๆ"; -Blockly.Msg.TEXT_CHARAT_FIRST = "ดึง ตัวอักษรตัวแรก"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "ดึง ตัวอักษรตัวที่ # จากท้าย"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "ดึง ตัวอักษรตัวที่"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "ในข้อความ"; -Blockly.Msg.TEXT_CHARAT_LAST = "ดึง ตัวอักษรตัวสุดท้าย"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "ถึงตัวอักษรแบบสุ่ม"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "คืนค่าตัวอักษรจากตำแหน่งที่ระบุ"; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "เพิ่มรายการเข้าไปในข้อความ"; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "รวม"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "เพิ่ม ลบ หรือจัดเรียงบล็อกข้อความนี้ใหม่"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "จนถึง ตัวอักษรที่ # จากท้าย"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "จนถึง ตัวอักษรที่"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "จนถึง ตัวอักษรสุดท้าย"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "ในข้อความ"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "แยกข้อความย่อยตั้งแต่ ตัวอักษรแรก"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "แยกข้อความย่อยตั้งแต่ ตัวอักษรที่ # จากท้าย"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "แยกข้อความย่อยตั้งแต่ ตัวอักษรที่"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "คืนค่าบางส่วนของข้อความ"; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "ในข้อความ"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "หาข้อความแรกที่พบ"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "หาข้อความสุดท้ายที่พบ"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "คืนค่าตำแหน่งที่พบข้อความแรกอยู่ในข้อความที่สอง คืนค่า 0 ถ้าหาไม่พบ"; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ว่าง"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "คืนค่าจริง ถ้าข้อความยังว่าง"; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "สร้างข้อความด้วย"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "สร้างข้อความด้วยการรวมจำนวนของรายการเข้าด้วยกัน"; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "ความยาวของ %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "คืนค่าความยาวของข้อความ (รวมช่องว่าง)"; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "พิมพ์ %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "พิมพ์ข้อความ ตัวเลข หรือค่าอื่นๆ"; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "แสดงหน้าต่างให้ผู้ใช้ใส่ตัวเลข"; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "แสดงหน้าต่างให้ผู้ใช้ใส่ข้อความ"; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "แสดงหน้าต่างตัวเลข"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "แสดงหน้าต่างข้อความ"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://th.wikipedia.org/wiki/สายอักขระ"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "ตัวหนังสือ คำ หรือข้อความ"; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "ลบช่องว่างทั้งสองข้างของ"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "ลบช่องว่างด้านหน้าของ"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "ลบช่องว่างข้างท้ายของ"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "คืนค่าสำเนาของข้อความที่ลบเอาช่องว่างหน้าและหลังข้อความออกแล้ว"; -Blockly.Msg.TODAY = "วันนี้"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "รายการ"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "สร้าง \"กำหนด %1\""; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "คืนค่าของตัวแปรนี้"; -Blockly.Msg.VARIABLES_SET = "กำหนด %1 จนถึง %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "สร้าง \"get %1\""; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "กำหนดให้ตัวแปรนี้เท่ากับการป้อนข้อมูล"; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/tlh.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/tlh.js deleted file mode 100644 index ff98569..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/tlh.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.tlh'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "QInHom chel"; -Blockly.Msg.AUTH = "ngogh nablIj DapollaHmeH qoj latlhvaD DangeHlaHmeH chaw' yInob."; -Blockly.Msg.CHANGE_VALUE_TITLE = "choH:"; -Blockly.Msg.CHAT = "beqpu'lI'vaD bIjawmeH naDev yIrI'!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "ngoghmey DejmoH"; -Blockly.Msg.COLLAPSE_BLOCK = "ngogh DejmoH"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "rItlh wa'"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "rItlh cha'"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "'ar"; -Blockly.Msg.COLOUR_BLEND_TITLE = "DuD"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; // untranslated -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Choose a colour from the palette."; // untranslated -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "rItlh vISaHbe'"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Choose a colour at random."; // untranslated -Blockly.Msg.COLOUR_RGB_BLUE = "chal rItlh"; -Blockly.Msg.COLOUR_RGB_GREEN = "tI rItlh"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "'Iw rItlh"; -Blockly.Msg.COLOUR_RGB_TITLE = "rItlh wIv"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "gho Haw'"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "gho taHqa'"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Break out of the containing loop."; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the rest of this loop, and continue with the next iteration."; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "yIqIm! ghoDaq neH ngoghvam lo'laH vay'."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "ngIq Doch %1 ngaSbogh tetlh %2 nuDDI'"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For each item in a list, set the variable '%1' to the item, and then do some statements."; // untranslated -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "togh %1 mung %2 ghoch %3 Do %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; // untranslated -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block."; // untranslated -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block."; // untranslated -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Add, remove, or reorder sections to reconfigure this if block."; // untranslated -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "pagh"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "pagh teHchugh"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "teHchugh"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "If a value is true, then do some statements."; // untranslated -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; // untranslated -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "ruch"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1-logh qaSmoH"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Do some statements several times."; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "teHpa' qaSmoH"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "teHtaHvIS qaSmoH"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "While a value is false, then do some statements."; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "While a value is true, then do some statements."; // untranslated -Blockly.Msg.DELETE_BLOCK = "ngogh Qaw'"; -Blockly.Msg.DELETE_X_BLOCKS = "%1 ngoghmey Qaw'"; -Blockly.Msg.DISABLE_BLOCK = "ngogh Qotlh"; -Blockly.Msg.DUPLICATE_BLOCK = "velqa' chenmoH"; -Blockly.Msg.ENABLE_BLOCK = "ngogh QotlhHa'"; -Blockly.Msg.EXPAND_ALL = "ngoghmey DejHa'moH"; -Blockly.Msg.EXPAND_BLOCK = "ngogh DejHa'moH"; -Blockly.Msg.EXTERNAL_INPUTS = "Hur rar"; -Blockly.Msg.HELP = "QaH"; -Blockly.Msg.INLINE_INPUTS = "qoD rar"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "tetlh chIm"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "tetlh"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "tetlh ghom"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Add an item to the list."; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_FIRST = "wa'DIch"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# Qav"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "Suq"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "Suq vaj pej"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "Qav"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "Sahbe'"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "pej"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returns the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Removes and returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Removes and returns the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Removes the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Removes the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "mojaQ # Qav"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "mojaQ #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "mojaQ Qav"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "tetlhHom moHaq wa'DIch"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "tetlhHom moHaq # Qav"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "tetlhHom moHaq #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "Suq"; -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated -Blockly.Msg.LISTS_INDEX_OF_FIRST = "Doch sam wa'DIch"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "Doch sam Qav"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated -Blockly.Msg.LISTS_INLIST = "tetlhDaq"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 chIm'a'"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty."; // untranslated -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "chuq %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; // untranslated -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "tetlh ghom %2 Dochmey %1 pus"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "Dos"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "lIH"; -Blockly.Msg.LISTS_SET_INDEX_SET = "choH"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserts the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserts the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "teHbe'"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returns either true or false."; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "teH"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Return true if both inputs equal each other."; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Return true if the first input is greater than the second input."; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Return true if the first input is greater than or equal to the second input."; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Return true if the first input is smaller than the second input."; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Return true if the first input is smaller than or equal to the second input."; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Return true if both inputs are not equal to each other."; // untranslated -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "yoymoH %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returns true if the input is false. Returns false if the input is true."; // untranslated -Blockly.Msg.LOGIC_NULL = "paghna'"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returns null."; // untranslated -Blockly.Msg.LOGIC_OPERATION_AND = "'ej"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "qoj"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Return true if both inputs are true."; // untranslated -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true."; // untranslated -Blockly.Msg.LOGIC_TERNARY_CONDITION = "chov"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "teHbe'chugh"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "teHchugh"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Return the sum of the two numbers."; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers."; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Return the difference of the two numbers."; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Return the product of the two numbers."; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; // untranslated -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated -Blockly.Msg.MATH_CHANGE_TITLE = "choH %1 chel %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; // untranslated -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "jon %1 bIng %2 Dung %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "wav'a'"; -Blockly.Msg.MATH_IS_EVEN = "lang'a' mI'"; -Blockly.Msg.MATH_IS_NEGATIVE = "bIng pagh"; -Blockly.Msg.MATH_IS_ODD = "ror'a' mI'"; -Blockly.Msg.MATH_IS_POSITIVE = "Dung pagh"; -Blockly.Msg.MATH_IS_PRIME = "potlh'a' mI'"; -Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated -Blockly.Msg.MATH_IS_WHOLE = "ngoHlaHbe''a'"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated -Blockly.Msg.MATH_MODULO_TITLE = "ratlwI' SIm %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Return the remainder from dividing the two numbers."; // untranslated -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; // untranslated -Blockly.Msg.MATH_NUMBER_TOOLTIP = "A number."; // untranslated -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "beQwI' SIm tetlh"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "tInwI''a' SIm tetlh"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "beQwI'botlh SIm tetlh"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "machwI''a' SIm tetlh"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "beQwI' motlh SIm tetlh"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "SaHbe' SIm tetlh"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "motlhbe'wI' SIm tetlh"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "chelwI' SIm tetlh"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Return the average (arithmetic mean) of the numeric values in the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Return the largest number in the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Return the median number in the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Return the smallest number in the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Return a list of the most common item(s) in the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Return a random element from the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Return the sum of all the numbers in the list."; // untranslated -Blockly.Msg.MATH_POWER_SYMBOL = "^"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "mI'HomSaHbe'"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated -Blockly.Msg.MATH_RANDOM_INT_TITLE = "ngoH mI'SaHbe' bIng %1 Dung %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; // untranslated -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; // untranslated -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "ngoH"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "bIng ngoH"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "Dung ngoH"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Round a number up or down."; // untranslated -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; // untranslated -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "Dung pagh choH"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "cha'DIch wav"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Return the natural logarithm of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Return the base 10 logarithm of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Return the negation of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Return the square root of a number."; // untranslated -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; -Blockly.Msg.MATH_TRIG_ACOS = "acos"; -Blockly.Msg.MATH_TRIG_ASIN = "asin"; -Blockly.Msg.MATH_TRIG_ATAN = "atan"; -Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated -Blockly.Msg.MATH_TRIG_SIN = "sin"; -Blockly.Msg.MATH_TRIG_TAN = "tan"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated -Blockly.Msg.ME = "Me"; // untranslated -Blockly.Msg.NEW_VARIABLE = "lIw chu'..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "lIw chu' pong:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "qel:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "qel:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "chel '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "mIw"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "ruch"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "chegh"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; // untranslated -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "ghuHmoHna': qelwI' cha'logh chen."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "mIwna' wew"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "ghoHmoHna': ngoghvam ngaSbe' mIwDaq."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "pong:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "qelwI'mey"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated -Blockly.Msg.REMOVE_COMMENT = "QInHom chelHa'"; -Blockly.Msg.RENAME_VARIABLE = "lIw pong choH..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Hoch \"%1\" lIwmey pongmey choH:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "ghItlh"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "chel"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; // untranslated -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "machchoH"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "DojchoH"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "tInchoH"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated -Blockly.Msg.TEXT_CHARAT_FIRST = "mu'Hom wa'DIch"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "mu'Hom # Qav"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "mu'Hom #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "ghItlhDaq"; -Blockly.Msg.TEXT_CHARAT_LAST = "mu'Hom Qav"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "mu'Hom SaHbe'"; -Blockly.Msg.TEXT_CHARAT_TAIL = "Suq"; -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "ghom"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "mojaq mu'Hom # Qav"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "mojaq mu'Hom #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "mojaq mu'Hom Qav"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "ghItlhDaq"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "ghItlhHom moHaq mu'Hom wa'DIch"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "ghItlhHom moHaq mu'Hom # Qav"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "ghItlhHom moHaq mu'Hom #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = "Suq"; -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; // untranslated -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "ghItlhDaq"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "ghItlh wa'DIch Sam"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "ghItlh Qav Sam"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 chIm'a'"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "ghItlh ghom"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "chuq %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; // untranslated -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "maq %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; // untranslated -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "mI' tlhob 'ej maq"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "ghItln tlhob 'ej maq"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated -Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; // untranslated -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "poSnIHlogh pei"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "poSlogh pei"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "nIHlogh pei"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated -Blockly.Msg.TODAY = "Today"; // untranslated -Blockly.Msg.VARIABLES_DEFAULT_NAME = "Doch"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "chel 'choH %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; // untranslated -Blockly.Msg.VARIABLES_SET = "choH %1 %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "chel 'Suq %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/tr.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/tr.js deleted file mode 100644 index d9bf89e..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/tr.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.tr'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Yorum Ekle"; -Blockly.Msg.AUTH = "Çalışmanızın kaydedilmesi ve sizinle paylaşılmasına izin verilmesi için lütfen bu uygulamaya yetki verin."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Değeri değiştir:"; -Blockly.Msg.CHAT = "Bu kutuya yazarak iş birlikçin ile sohbet et!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Blokları Daralt"; -Blockly.Msg.COLLAPSE_BLOCK = "Blok'u Daralt"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "renk 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "renk 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "oran"; -Blockly.Msg.COLOUR_BLEND_TITLE = "karıştır"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Verilen bir orana bağlı olarak iki rengi karıştırır. (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://tr.wikipedia.org/wiki/Renk"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Paletten bir renk seçin."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "rastgele renk"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Rastgele bir renk seçin."; -Blockly.Msg.COLOUR_RGB_BLUE = "mavi"; -Blockly.Msg.COLOUR_RGB_GREEN = "yeşil"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "kırmızı"; -Blockly.Msg.COLOUR_RGB_TITLE = "renk değerleri"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Kırmızı, yeşil ve mavinin belirtilen miktarıyla bir renk oluşturun. Tüm değerler 0 ile 100 arasında olmalıdır."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "döngüden çık"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "döngünün sonraki adımından devam et"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "İçeren döngüden çık."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Bu döngünün geri kalanını atlayın ve sonraki adım ile devam edin."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Uyarı: Bu blok sadece bir döngü içinde kullanılabilir."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "her öğe için %1 listede %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Bir listedeki her öğe için '%1' değişkenini maddeye atayın ve bundan sonra bazı açıklamalar yapın."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "ile sayılır %1 %2 den %3 ye, her adımda %4 değişim"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "\"%1\" değişkenini başlangıç numarasından bitiş numarasına kadar tanımlı farkla değerler verirken tanımlı blokları yap."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "If bloğuna bir koşul ekleyin."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "If bloğuna kalan durumları \"yakalayan\" bir son ekle."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "If bloğuna ekle, kaldır veya yeniden düzenleme yap."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "değilse"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "değilse eğer"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "eğer"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Eğer değişken true , yani gerçekleşmiş ise , ardından gelen işlemi yerine getir ."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Eğer değişken true, yani gerçekleşiyor ise ilk blok'taki işlemleri yerine getir, Aksi halde ikinci blok'taki işlemleri yerine getir."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Eğer ilk değişken true, yani koşul gerçekleşmiş ise ilk blok içerisindeki işlem(ler)i gerçekleştir. Eğer ikinci değişken true ise, ikinci bloktaki işlem(ler)i gerçekleştir ."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Eğer ilk değer true, yani olumlu ise, ilk blok'taki işlem(ler)i gerçekleştir. İlk değer true değil ama ikinci değer true ise, ikinci bloktaki işlem(ler)i gerçekleştir. Eğer değerlerin hiçbiri true değil ise son blok'taki işlem(ler)i gerçekleştir."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://tr.wikipedia.org/wiki/For_d%C3%B6ng%C3%BCs%C3%BC"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "yap"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1 kez tekrarla"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Bazı işlemleri birkaç kez yap."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "kadar tekrarla"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "tekrar ederken"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Bir değer yanlış olduğunda bazı beyanlarda bulun."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Bir değer doğru olduğunda bazı beyanlarda bulun."; -Blockly.Msg.DELETE_BLOCK = "Bloğu Sil"; -Blockly.Msg.DELETE_X_BLOCKS = "%1 Blokları Sil"; -Blockly.Msg.DISABLE_BLOCK = "Bloğu Devre Dışı Bırak"; -Blockly.Msg.DUPLICATE_BLOCK = "Çoğalt"; -Blockly.Msg.ENABLE_BLOCK = "Bloğu Etkinleştir"; -Blockly.Msg.EXPAND_ALL = "Blokları Genişlet"; -Blockly.Msg.EXPAND_BLOCK = "Bloğu Genişlet"; -Blockly.Msg.EXTERNAL_INPUTS = "Harici Girişler"; -Blockly.Msg.HELP = "Yardım"; -Blockly.Msg.INLINE_INPUTS = "Satır içi girdiler"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "Boş liste oluştur"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Veri kaydı içermeyen uzunluğu 0 olan bir listeyi verir"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "liste"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Bu liste bloğunu yeniden yapılandırmak için bölüm ekle,kaldır veya yeniden çağır."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "İle liste oluşturma"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Listeye bir nesne ekle."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Herhangi sayıda nesne içeren bir liste oluştur."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "ilk"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# sonundan"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "# Kare"; -Blockly.Msg.LISTS_GET_INDEX_GET = "Al"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "al ve kaldır"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "son"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "rastgele"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "kaldır"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Listedeki ilk öğeyi verir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Listede belirli pozisyondaki bir öğeyi verir.#1 son öğedir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Listede belirli pozisyondaki bir öğeyi verir.#1 ilk öğedir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Listedeki son öğeyi verir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Listedeki rastgele bir öğeyi verir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Kaldırır ve listedeki ilk öğeyi döndürür."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Kaldırır ve listede belirtilen konumdaki bir ögeyi döndürür. #1 son ögedir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Kaldırır ve listede belirtilen konumdaki bir öğeyi döndürür. #1 son öğedir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Kaldırır ve listedeki son öğeyi döndürür."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Kaldırır ve listedeki rastgele bir öğeyi verir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Listedeki ilk nesneyi kaldırır."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Liste içerisinde , tanımlanan pozisyondaki bir öğeyi kaldırır . #1 son öğe dir ."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Bir liste içerisinde , tanımlanan pozisyonda ki öğeyi kaldırır.#1 ilk öğedir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Listedeki son nesneyi kaldırır."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Listedeki rastgele bir nesneyi kaldırır."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "Sondan #'a kadar"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "#'a"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "Sona kadar"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "ilk öğeden alt liste al"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "# işaretinden sonra gelen ifadeye göre alt liste al , # sondan"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "# dan alt liste al"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Listenin belirli bir kısmının kopyasını yaratır."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "Öğenin ilk varolduğu yeri bul"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "Öğenin son varolduğu yeri bul"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Öğenin listede , ilk ve son görüldüğü dizinleri döndürür . Öğe bulunmassa , 0 döndürür ."; -Blockly.Msg.LISTS_INLIST = "Listede"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 boş"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Eğer liste boş ise true döndürür ."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "%1'in uzunluğu"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Bir listenin uzunluğunu verir."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "%1 nesnenin %2 kez tekrarlandığı bir liste yarat"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Verilen bir değerin , belirli bir sayıda tekrarlanmasından oluşan bir liste yaratır ."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "olarak"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "e yerleştir"; -Blockly.Msg.LISTS_SET_INDEX_SET = "yerleştir"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Nesneyi listenin başlangıcına ekler."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Bir öğeyi , belirtilen yer pozisyonuna göre , listeye yerleştirir . #1 son öğedir ."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Bir öğeyi belirtilen pozisyona göre listeye yerleştirir . #1 ilk öğedir ."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Öğeyi listenin sonuna ekle ."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Bir öğeyi listeye rast gele ekler ."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Bir listenin ilk öğesini yerleştirir ."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Bir öğeyi belirtilen yere göre listeye yerleştirir . #1 son öğedir ."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Bir öğeyi belirtilen yere göre listeye yerleştirir . #1 ilk öğedir ."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Bir listedeki son öğeyi yerleştirir ."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Listeye rast gele bir öğe yerleştirir ."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "false = Olumsuz"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Ya 'True' yada 'False' değerini verir."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "Olumlu"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://tr.wikipedia.org/wiki/E%C5%9Fitsizlikler"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Girilen iki değer birbirine eşitse \"True\" değerini verir."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Girilen ilk değer ikinci değerden daha büyükse \"True\" değerini verir."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Girilen ilk değer ikinci değerden büyük veya eşitse \"True\" değerini verir."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Girilen ilk değer ikinci değerden küçükse \"True\" değerini verir."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Girilen ilk değer ikinci değerden küçük veya eşitse \"True\" değerini verir."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Girilen iki değerde birbirine eşit değilse \"True\" değerini verir."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "%1 değil"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Girilen değer yanlışsa \"True\" değerini verir.Girilen değer doğruysa \"False\" değerini verir."; -Blockly.Msg.LOGIC_NULL = "sıfır"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "sıfır verir."; -Blockly.Msg.LOGIC_OPERATION_AND = "ve"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "veya"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Girilen iki değerde doğruysa \"True\" değerini verir."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Girilen iki değerden en az biri doğruysa \"True\" değerini verir."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "yanlış ise"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "doğru ise"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "'test'deki şartı test eder. Eğer şart doğru ise 'doğru' değeri döndürür, aksi halde 'yanlış' değeri döndürür."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://tr.wikipedia.org/wiki/Aritmetik"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "İki rakamın toplamını döndür."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "İki sayının bölümünü döndür."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "İki sayını farkını döndür."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "İki sayının çarpımını döndür."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "İlk sayinin ikincinin kuvvetine yükseltilmişini döndür."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "%1'i %2 kadar değiştir"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "'%1' değişkenine bir sayı ekle."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Yaygın sabitlerden birini döndür:π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (sonsuz)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "%1 i en düşük %2 en yüksek %3 ile sınırla"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Bir sayıyı belirli iki sayı arasında sınırlandır(dahil)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "bölünebilir"; -Blockly.Msg.MATH_IS_EVEN = "çift"; -Blockly.Msg.MATH_IS_NEGATIVE = "negatif"; -Blockly.Msg.MATH_IS_ODD = "tek"; -Blockly.Msg.MATH_IS_POSITIVE = "pozitif"; -Blockly.Msg.MATH_IS_PRIME = "asal"; -Blockly.Msg.MATH_IS_TOOLTIP = "Bir sayinin çift mi tek mi , tam mı, asal mı , pozitif mi, negatif mi, veya tam bir sayıyla bölünebilirliğini kontrol et.'True' veya 'False' değerini döndür."; -Blockly.Msg.MATH_IS_WHOLE = "Bütün olduğunu"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "%1 ÷ %2 nin kalanı"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "İki sayının bölümünden kalanı döndür."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "x"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Bir sayı."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "listenin ortalaması"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "en büyük sayı"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "Listenin medyanı"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "Listenin en küçüğü"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "Listenin modları"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "Listenin rastgele öğesi"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "Listenin standart sapması"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "Listenin toplamı"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Listedeki sayısal değerlerin ortalamasını (aritmetik anlamda) döndür."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Listenin en büyüğünü döndür."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Listenin medyanını döndür."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Listenin en küçüğünü döndür."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Listede ki en yaygın öğe veya öğelerinin listesini döndür."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Listeden rastgele bir element döndür."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Listenin standart sapmasını döndür."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Listede ki tüm sayıların toplamını döndür."; -Blockly.Msg.MATH_POWER_SYMBOL = "üst alma"; -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://tr.wikipedia.org/wiki/Rastgele_say%C4%B1_%C3%BCretimi"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "Rast gele kesirli sayı , yada parça"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "0.0(dahil) ve 1.0 (hariç) sayıları arasında bir sayı döndür ."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://tr.wikipedia.org/wiki/Rastgele_say%C4%B1_%C3%BCretimi"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "%1 ile %2 arasında rastgele tam sayı üret"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Herhangi iki sayı arasında , sayılar dahil olmak üzere , rastgele bir tam sayı döndür."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; // untranslated -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "Yuvarla"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "aşağı yuvarla"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "yukarı yuvarla"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Bir sayı yı yukarı yada aşağı yuvarla ."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://tr.wikipedia.org/wiki/Karek%C3%B6k"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "Kesin"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "Kare kök"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Bir sayının tam değerini döndür ."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Bir sayının e ' inci kuvvetini döndür ."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Bir sayının doğal logaritmasını döndür ."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Bir sayının 10 temelinde logaritmasını döndür ."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Bir sayıyı geçersiz olarak döndür ."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Bir sayının 10. kuvvetini döndür ."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Bir sayının karekökü nü döndür ."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "tire"; -Blockly.Msg.MATH_TRIG_ACOS = "akosünüs"; -Blockly.Msg.MATH_TRIG_ASIN = "asinüs"; -Blockly.Msg.MATH_TRIG_ATAN = "atanjant"; -Blockly.Msg.MATH_TRIG_COS = "kosünüs"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://tr.wikipedia.org/wiki/Trigonometrik_fonksiyonlar"; -Blockly.Msg.MATH_TRIG_SIN = "Sinüs"; -Blockly.Msg.MATH_TRIG_TAN = "tanjant"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Bir sayının ters kosunusunu döndür ."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Bir sayının ters sinüsünü döndür ."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Bir sayının ters tanjantını döndür ."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Bir açının kosinüsünü döndür(radyan olarak değil)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Bir açının sinüsünü döndür(radyan olarak değil)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Bir açının tanjantını döndür(radyan olarak değil)."; -Blockly.Msg.ME = "Beni"; -Blockly.Msg.NEW_VARIABLE = "Yeni değişken..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Yeni değişken ismi :"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "Eğer ifadelerine izin ver"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "ile :"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Kullanıcı tanımlı fonksiyonu çalıştır '%1' ."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Kullanıcı tanımlı fonksiyonu çalıştır '%1' ve çıktısını kullan ."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "ile :"; -Blockly.Msg.PROCEDURES_CREATE_DO = "'%1' oluştur"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "birşey yap"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "e"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Çıktı vermeyen bir fonksiyon yaratır ."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "Geri dön"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Çıktı veren bir fonksiyon oluşturur."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Uyarı: Bu fonksiyon yinelenen parametreler vardır."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Fonksiyon tanımı vurgulamak"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Eğer değer doğruysa, ikinci değere geri dön."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Uyarı: Bu blok yalnızca bir fonksiyon tanımı içinde kullanılır."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "girdi adı:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "İşleve bir girdi ekleyin."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "girdiler"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Bu işlevin girdilerini ekleyin, çıkarın, ya da yeniden sıralayın."; -Blockly.Msg.REMOVE_COMMENT = "Yorumu Sil"; -Blockly.Msg.RENAME_VARIABLE = "Değişkeni yeniden adlandır..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Tüm '%1' değişkenlerini yeniden isimlendir:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "Metin Ekle"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "e"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Değişken '%1' e bazı metinler ekleyin."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "küçük harf"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "Baş Harfler Büyük"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "büyük harf"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Metnin bir kopyasını farklı bir harf durumunda (HEPSİ BÜYÜK - hepsi küçük) getirir."; -Blockly.Msg.TEXT_CHARAT_FIRST = "İlk harfini al"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "# dan sona harfleri al"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "# harfini al"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "metinde"; -Blockly.Msg.TEXT_CHARAT_LAST = "son harfi al"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "Rastgele bir harf al"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Belirli pozisyonda ki bir harfi döndürür."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Metine bir öğe ekle."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "Katıl"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Bu metin bloğunu düzenlemek için bölüm ekle,sil veya yeniden görevlendir."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "Sondan # harfe"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "# harfe"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "son harfe"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "metinde"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "ilk harften başlayarak alt-string alma"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "n inci harften sona kadar alt-string alma"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "n inci harften alt-string alma"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Metinin belirli bir kısmını döndürür."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "metinde"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "Metnin ilk varolduğu yeri bul"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "Metnin son varolduğu yeri bul"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "İlk metnin ikinci metnin içindeki ilk ve son varoluşlarının indeksini döndürür.Metin bulunamadıysa 0 döndürür."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 boş"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Verilen metin boşsa true(doğru) değerini verir."; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "ile metin oluştur"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Herhangi bir sayıda ki öğeleri bir araya getirerek metnin bir parçasını oluştur."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "%1 in uzunluğu"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Yazı içerisinde verilen harflerin ( harf arasındaki boşluklar dahil) sayısını verir ."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "%1 ' i Yaz"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Belirli bir metni,sayıyı veya başka bir değeri yaz."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Kullanıcıdan sayı al ."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Kullanıcıdan Yazım al ."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Kullanıcıdan sayı al , istek mesajı göstererek"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Kullanıcıdan yazım al , istek mesajıyla"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Metnin bir harfi,kelimesi veya satırı."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "iki tarafından da boşlukları temizle"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "solundan boşlukları temizle"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "sağından boşlukları temizle"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Metnin bir veya her iki sondan da boşlukları silinmiş şekilde kopyasını verir."; -Blockly.Msg.TODAY = "Bugün"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "öge"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "'set %1' oluştur"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Bu değişkenin değerini verir."; -Blockly.Msg.VARIABLES_SET = "Atamak %1 e %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "'get %1' oluştur"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Bu değişkeni girilen değere eşitler."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/uk.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/uk.js deleted file mode 100644 index 49bb9a3..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/uk.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.uk'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Додати коментар"; -Blockly.Msg.AUTH = "Будь ласка, авторизуйте цю програму, аби можна було зберігати вашу роботу і для надання можливості вам поширювати її."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Змінити значення:"; -Blockly.Msg.CHAT = "Спілкуйтеся з вашими співавторами, набираючи у цьому полі!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Згорнути блоки"; -Blockly.Msg.COLLAPSE_BLOCK = "Згорнути блок"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "колір 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "колір 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "співвідношення"; -Blockly.Msg.COLOUR_BLEND_TITLE = "змішати"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Змішує два кольори разом у вказаному співвідношені (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://uk.wikipedia.org/wiki/Колір"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Вибрати колір з палітри."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "випадковий колір"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Вибрати колір навмання."; -Blockly.Msg.COLOUR_RGB_BLUE = "синій"; -Blockly.Msg.COLOUR_RGB_GREEN = "зелений"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; -Blockly.Msg.COLOUR_RGB_RED = "червоний"; -Blockly.Msg.COLOUR_RGB_TITLE = "колір з"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Створити колір зі вказаними рівнями червоного, зеленого та синього. Усі значення мають бути від 0 до 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "перервати цикл"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "продовжити з наступної ітерації циклу"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Перервати виконання циклу."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Пропустити залишок цього циклу і перейти до виконання наступної ітерації."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Попередження: цей блок може бути використаний тільки в межах циклу."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "для кожного елемента %1 у списку %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Для кожного елемента в списку змінна '%1' отримує значення елемента, а потім виконуються певні дії."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "рахувати з %1 від %2 до %3 через %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Наявна змінна \"%1\" набуває значень від початкового до кінцевого, враховуючи заданий інтервал, і виконуються вказані блоки."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Додайте умову до блока 'якщо'."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Додати остаточну, всеосяжну умову до блоку 'якщо'."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Додайте, вилучіть або змініть порядок секцій, щоб переналаштувати цей блок 'якщо'."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "інакше"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "інакше якщо"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "якщо"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Якщо значення істинне, то виконати певні дії."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Якщо значення істинне, то виконується перший блок операторів. В іншому випадку виконується другий блок операторів."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Якщо перше значення істинне, то виконується перший блок операторів. В іншому випадку, якщо друге значення істина, то виконується другий блок операторів."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Якщо перше значення істинне, то виконується перший блок операторів. В іншому випадку, якщо друге значення істинне, то виконується другий блок операторів. Якщо жодне із значень не є істинним, то виконується останній блок операторів."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://uk.wikipedia.org/wiki/Цикл_(програмування)#.D0.A6.D0.B8.D0.BA.D0.BB_.D0.B7_.D0.BB.D1.96.D1.87.D0.B8.D0.BB.D1.8C.D0.BD.D0.B8.D0.BA.D0.BE.D0.BC"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "виконати"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "повторити %1 разів"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Виконати певні дії декілька разів."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "повторювати, доки не"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "повторювати поки"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Поки значення хибне, виконувати певні дії."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Поки значення істинне, виконувати певні дії."; -Blockly.Msg.DELETE_BLOCK = "Видалити блок"; -Blockly.Msg.DELETE_X_BLOCKS = "Видалити %1 блоків"; -Blockly.Msg.DISABLE_BLOCK = "Вимкнути блок"; -Blockly.Msg.DUPLICATE_BLOCK = "Дублювати"; -Blockly.Msg.ENABLE_BLOCK = "Увімкнути блок"; -Blockly.Msg.EXPAND_ALL = "Розгорнути блоки"; -Blockly.Msg.EXPAND_BLOCK = "Розгорнути блок"; -Blockly.Msg.EXTERNAL_INPUTS = "Зовнішні входи"; -Blockly.Msg.HELP = "Довідка"; -Blockly.Msg.INLINE_INPUTS = "Вбудовані входи"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "створити порожній список"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Повертає список, довжиною 0, що не містить записів даних"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "список"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Додайте, вилучіть або змініть порядок секцій для переналаштування блока списку."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "створити список з"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Додати елемент до списку."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Створює список з будь-якою кількістю елементів."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "перший"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# з кінця"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "отримати"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "отримати і вилучити"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "останній"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "випадковий"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "вилучити"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = "-ий."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Повертає перший елемент списку."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Повертає елемент у заданій позиції у списку. #1 - це останній елемент."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Повертає елемент у заданій позиції у списку. #1 - це перший елемент."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Повертає останній елемент списку."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Повертає випадковий елемент списку."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Видаляє і повертає перший елемент списку."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Видаляє і повертає елемент у заданій позиції у списку. #1 - це останній елемент."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Видаляє і повертає елемент у заданій позиції у списку. #1 - це перший елемент."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Видаляє і повертає останній елемент списку."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Видаляє і повертає випадковий елемент списоку."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Вилучає перший елемент списку."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Вилучає зі списку елемент у вказаній позиції. #1 - це останній елемент."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Вилучає зі списку елемент у вказаній позиції. #1 - це перший елемент."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Вилучає останній елемент списку."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Вилучає випадковий елемент списку."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "до # з кінця"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "до #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "до останнього"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "отримати вкладений список з першого"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "отримати вкладений список від # з кінця"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "отримати вкладений список з #"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "символу."; -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Створює копію вказаної частини списку."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "знайти перше входження елемента"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "знайти останнє входження елемента"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Повертає індекс першого/останнього входження елемента у списку. Повертає 0, якщо текст не знайдено."; -Blockly.Msg.LISTS_INLIST = "у списку"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 є порожнім"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Повертає істину, якщо список порожній."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "довжина %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Повертає довжину списку."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "створити список з елемента %1 повтореного %2 разів"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Створює список, що складається з заданого значення повтореного задану кількість разів."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "як"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "вставити в"; -Blockly.Msg.LISTS_SET_INDEX_SET = "встановити"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Вставляє елемент на початок списку."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Вставляє елемент у вказану позицію списку. #1 - це останній елемент."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Вставка елемента у вказану позицію списку. #1 - перший елемент."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Додає елемент у кінці списку."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Випадковим чином вставляє елемент у список."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Задає перший елемент списку."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Задає елемент списку у вказаній позиції. #1 - це останній елемент."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Задає елемент списку у вказаній позиції. #1 - це перший елемент."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Задає останній елемент списку."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Задає випадковий елемент у списку."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "зробити з тексту список"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "зробити зі списку текст"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Злити список текстів у єдиний текст, відокремивши розділювачами."; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Поділити текст на список текстів, розриваючи на кожному розділювачі."; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "з розділювачем"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "хибність"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Повертає значення істина або хибність."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "істина"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://uk.wikipedia.org/wiki/Нерівність"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Повертає істину, якщо обидва входи рівні один одному."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Повертає істину, якщо перше вхідне значення більше, ніж друге."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Повертає істину, якщо перше вхідне значення більше або дорівнює другому."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Повертає істину, якщо перше вхідне значення менше, ніж друге."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Повертає істину, якщо перше вхідне значення менше або дорівнює другому."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Повертає істину, якщо обидва входи не дорівнюють один одному."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "не %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Повертає істину, якщо вхідне значення хибне. Повертає хибність, якщо вхідне значення істинне."; -Blockly.Msg.LOGIC_NULL = "ніщо"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Повертає ніщо."; -Blockly.Msg.LOGIC_OPERATION_AND = "та"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "або"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Повертає істину, якщо обидва входи істинні."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Повертає істину, якщо принаймні один з входів істинний."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "тест"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "якщо хибність"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "якщо істина"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Перевіряє умову в 'тест'. Якщо умова істинна, то повертає значення 'якщо істина'; в іншому випадку повертає значення 'якщо хибність'."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://uk.wikipedia.org/wiki/Арифметика"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Повертає суму двох чисел."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Повертає частку двох чисел."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Повертає різницю двох чисел."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Повертає добуток двох чисел."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Повертає перше число, піднесене до степеня, вираженого другим числом."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; -Blockly.Msg.MATH_CHANGE_TITLE = "змінити %1 на %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Додати число до змінної '%1'."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://uk.wikipedia.org/wiki/Математична_константа"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Повертає одну з поширених констант: π (3.141...), e (2.718...), φ (1,618...), sqrt(2) (1.414...), sqrt(½) (0.707...) або ∞ (нескінченність)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "обмежити %1 від %2 до %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Обмежує число вказаними межами (включно)."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "ділиться на"; -Blockly.Msg.MATH_IS_EVEN = "парне"; -Blockly.Msg.MATH_IS_NEGATIVE = "від'ємне"; -Blockly.Msg.MATH_IS_ODD = "непарне"; -Blockly.Msg.MATH_IS_POSITIVE = "додатне"; -Blockly.Msg.MATH_IS_PRIME = "просте"; -Blockly.Msg.MATH_IS_TOOLTIP = "Перевіряє, чи число парне, непарне, просте, ціле, додатне, від'ємне або чи воно ділиться на певне число без остачі. Повертає істину або хибність."; -Blockly.Msg.MATH_IS_WHOLE = "ціле"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://uk.wikipedia.org/wiki/Ділення_з_остачею"; -Blockly.Msg.MATH_MODULO_TITLE = "остача від %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Повертає остачу від ділення двох чисел."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://uk.wikipedia.org/wiki/Число"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Число."; -Blockly.Msg.MATH_ONLIST_HELPURL = "http://www.mapleprimes.com/questions/100441-Applying-Function-To-List-Of-Numbers"; -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "середнє списку"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "максимум списку"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "медіана списку"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "мінімум списку"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "моди списку"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "випадковий елемент списку"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "стандартне відхилення списку"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "сума списку"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Повертає середнє (арифметичне) числових значень у списку."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Повертає найбільше число у списку."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Повертає медіану списку."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Повертає найменше число у списку."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Повертає перелік найпоширеніших елементів у списку."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Повертає випадковий елемент зі списку."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Повертає стандартне відхилення списку."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Повертає суму всіх чисел у списку."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://uk.wikipedia.org/wiki/Генерація_випадкових_чисел"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "випадковий дріб"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Повертає випадковий дріб від 0,0 (включно) та 1.0 (не включно)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://uk.wikipedia.org/wiki/Генерація_випадкових_чисел"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "випадкове ціле число від %1 до %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Повертає випадкове ціле число між двома заданими межами включно."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://uk.wikipedia.org/wiki/Округлення"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "округлити"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "округлити до меншого"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "округлити до більшого"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Округлення числа до більшого або до меншого."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://uk.wikipedia.org/wiki/Квадратний_корінь"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "модуль"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "квадратний корінь"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Повертає модуль числа."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Повертає e у степені."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Повертає натуральний логарифм числа."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Повертає десятковий логарифм числа."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Повертає протилежне число."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Повертає 10 у степені."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Повертає квадратний корінь з числа."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://uk.wikipedia.org/wiki/Тригонометричні_функції"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Повертає арккосинус числа."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Повертає арксинус числа."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Повертає арктангенс числа."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Повертає косинус кута в градусах (не в радіанах)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Повертає синус кута в градусах (не в радіанах)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Повертає тангенс кута в градусах (не в радіанах)."; -Blockly.Msg.ME = "Я"; -Blockly.Msg.NEW_VARIABLE = "Нова змінна..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Нова назва змінної:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "-ий."; -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "дозволити дії"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "з:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = "блок тексту"; -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://uk.wikipedia.org/wiki/Підпрограма"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Запустити користувацьку функцію \"%1\"."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://uk.wikipedia.org/wiki/Підпрограма"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Запустити користувацьку функцію \"%1\" і використати її вивід."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "з:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Створити \"%1\""; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = "блок тексту"; -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://uk.wikipedia.org/wiki/Підпрограма"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "щось зробити"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "до"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Створює функцію без виводу."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://uk.wikipedia.org/wiki/Підпрограма"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "повернути"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Створює функцію з виводом."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Увага: ця функція має дубльовані параметри."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Підсвітити визначення функції"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Якщо значення істинне, то повернути друге значення."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Попередження: цей блок може використовуватися лише в межах визначення функції."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "назва входу:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Додати до функції вхідні параметри."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "входи"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Додайте, вилучіть або змініть порядок вхідних параметрів для цієї функції."; -Blockly.Msg.REMOVE_COMMENT = "Видалити коментар"; -Blockly.Msg.RENAME_VARIABLE = "Перейменувати змінну..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Перейменувати усі змінні \"%1\" до:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "додати текст"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "до"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Додати деякий текст до змінної '%1'."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "до нижнього регістру"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "Великі Перші Букви"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "до ВЕРХНЬОГО регістру"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "В іншому випадку повертає копію тексту."; -Blockly.Msg.TEXT_CHARAT_FIRST = "отримати перший символ"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "отримати символ # з кінця"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "отримати символ #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "у тексті"; -Blockly.Msg.TEXT_CHARAT_LAST = "отримати останній символ"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "отримати випадковий символ"; -Blockly.Msg.TEXT_CHARAT_TAIL = "-ий."; -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Повертає символ у зазначеній позиції."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Додати елемент до тексту."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "приєднати"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Додайте, вилучіть або змініть порядок секцій для переналаштування текстового блоку."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "до символу # з кінця"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "до символу #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "до останнього символу"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "у тексті"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "отримати підрядок від першого символу"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "отримати підрядок від символу # з кінця"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "отримати підрядок від символу #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = "-ого."; -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Повертає заданий фрагмент тексту."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "у тексті"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "знайти перше входження тексту"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "знайти останнє входження тексту"; -Blockly.Msg.TEXT_INDEXOF_TAIL = "."; -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Повертає індекс першого/останнього входження першого тексту в другий. Повертає 0, якщо текст не знайдено."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 є порожнім"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Повертає істину, якщо вказаний текст порожній."; -Blockly.Msg.TEXT_JOIN_HELPURL = "http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_8.html"; -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "створити текст з"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Створити фрагмент тексту шляхом з'єднування будь-якого числа елементів."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "довжина %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Повертає число символів (включно з пропусками) у даному тексті."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "друк %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Надрукувати заданий текст, числа або інші значення."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Запитати у користувача число."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Запитати у користувача деякий текст."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "запит числа з повідомленням"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "запит тексту з повідомленням"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://uk.wikipedia.org/wiki/Рядок_(програмування)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Символ, слово або рядок тексту."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "вилучити крайні пропуски з обох кінців"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "вилучити пропуски з лівого боку"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "вилучити пропуски з правого боку"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Повертає копію тексту з вилученими пропусками з одного або обох кінців."; -Blockly.Msg.TODAY = "Сьогодні"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "елемент"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Створити 'встановити %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Повертає значення цієї змінної."; -Blockly.Msg.VARIABLES_SET = "встановити %1 до %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Створити 'отримати %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Задає цю змінну рівною входу."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/vi.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/vi.js deleted file mode 100644 index ba07edd..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/vi.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.vi'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "Thêm Chú Giải"; -Blockly.Msg.AUTH = "Vui lòng cho phép ứng dụng được lưu dữ liệu của bạn và tự động chia sẻ bằng tên của bạn"; -Blockly.Msg.CHANGE_VALUE_TITLE = "Thay giá trị thành:"; -Blockly.Msg.CHAT = "Trò chuyện với cộng tác viên của bạn bằng cách gõ vào hộp này!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Thu Nhỏ Mọi Mảnh"; -Blockly.Msg.COLLAPSE_BLOCK = "Thu Nhỏ Mảnh"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "màu 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "màu 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "tỉ lệ"; -Blockly.Msg.COLOUR_BLEND_TITLE = "pha"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Pha hai màu với nhau theo tỉ lệ (0 - 100)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://vi.wikipedia.org/wiki/M%C3%A0u_s%E1%BA%AFc"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Chọn một màu từ bảng màu."; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "màu bất kỳ"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "chọn một màu bất kỳ."; -Blockly.Msg.COLOUR_RGB_BLUE = "màu xanh dương"; -Blockly.Msg.COLOUR_RGB_GREEN = "màu xanh lá cây"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "màu đỏ"; -Blockly.Msg.COLOUR_RGB_TITLE = "Tạo màu từ"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Tạo màu từ ba màu: đỏ, xanh lá cây, xanh dương với số lượng cụ thể. Mỗi số phải có giá trị từ 0 đến 100."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "thoát"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "sang lần lặp tiếp theo"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Thoát khỏi vòng lặp hiện tại."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Bỏ qua phần còn lại trong vòng lặp này, và sang lần lặp tiếp theo."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Chú ý: Mảnh này chỉ có thế dùng trong các vòng lặp."; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "với mỗi thành phần %1 trong danh sách %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Trong một danh sách, lấy từng thành phần, gán vào biến \"%1\", rồi thực hiện một số lệnh."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "đếm theo %1 từ %2 đến %3 mỗi lần thêm %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Đếm từ số đầu đến số cuối. Khi đến mỗi số, gán số vào biến \"%1\" rồi thực hiện các lệnh."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Thêm một điều kiện vào mảnh nếu."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Cuối cùng, khi không điều kiện nào đúng."; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Thêm, bỏ, hoặc đổi thứ tự các mảnh con để tạo cấu trúc mới cho mảnh nếu."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "nếu không"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "nếu không nếu"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "nếu"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Nếu điều kiện đúng, thực hiện các lệnh."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Nếu điều kiện đúng, thực hiện các lệnh đầu. Nếu sai, thực hiện các lệnh sau."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Nếu điều kiện đúng, thực hiện các lệnh đầu. Nếu không, nếu điều kiện thứ hai đúng, thực hiện các lệnh thứ hai."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Nếu điều kiện đúng, thực hiện các lệnh đầu. Nếu không, nếu điều kiện thứ hai đúng, thực hiện các lệnh thứ hai. Nếu không điều kiện nào đúng, thực hiện các lệnh cuối cùng."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "thực hiện"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "lặp lại %1 lần"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Thực hiện các lệnh vài lần."; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "lặp lại cho đến khi"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "lặp lại trong khi"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Miễn là điều kiện còn sai, thì thực hiện các lệnh. Khi điều kiện đúng thì ngưng."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Miễn là điều kiện còn đúng, thì thực hiện các lệnh."; -Blockly.Msg.DELETE_BLOCK = "Xóa Mảnh Này"; -Blockly.Msg.DELETE_X_BLOCKS = "Xóa %1 Mảnh"; -Blockly.Msg.DISABLE_BLOCK = "Ngưng Tác Dụng"; -Blockly.Msg.DUPLICATE_BLOCK = "Tạo Bản Sao"; -Blockly.Msg.ENABLE_BLOCK = "Phục Hồi Tác Dụng"; -Blockly.Msg.EXPAND_ALL = "Mở Lớn Mọi Mảnh"; -Blockly.Msg.EXPAND_BLOCK = "Mở Lớn Mảnh"; -Blockly.Msg.EXTERNAL_INPUTS = "Chỗ Gắn Bên Ngoài"; -Blockly.Msg.HELP = "Trợ Giúp"; -Blockly.Msg.INLINE_INPUTS = "Chỗ Gắn Cùng Dòng"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "tạo danh sách trống"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Hoàn trả một danh sách, với độ dài 0, không có thành tố nào cả"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "danh sách"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Thêm, bỏ, hoặc sắp xếp lại các thành phần để tạo dựng mảnh danh sách này."; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "tạo danh sách gồm"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Thêm vật vào danh sách."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Tạo một danh sách bao gồm nhiều vậts, với một số lượng bất kỳ."; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "đầu tiên"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "(đếm từ cuối) thứ"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "thứ"; -Blockly.Msg.LISTS_GET_INDEX_GET = "lấy thành tố"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "lấy và xóa thành tố"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "cuối cùng"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "bất kỳ"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "xóa thành tố"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Hoàn trả thành tố đầu tiên trong danh sách."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Hoàn trả thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố cuối cùng."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Hoàn trả thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố đầu tiên."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Hoàn trả thành tố cuối cùng trong danh sách."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Hoàn trả một thành tố bất kỳ trong danh sách."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Hoàn trả và xóa thành tố đầu tiên trong danh sách."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Hoàn trả và xóa thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố cuối cùng."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Hoàn trả và xóa thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố đầu tiên."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Hoàn trả và xóa thành tố cuối cùng trong danh sách."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Hoàn trả và xóa mộtthành tố bất kỳ trong danh sách."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Xóa thành tố đầu tiên trong danh sách."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Xóa thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố cuối cùng."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Xóa thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố đầu tiên."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Xóa thành tố cuối cùng trong danh sách."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Xóa thành tố bất kỳ trong danh sách."; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "đến (đếm từ cuối) thứ"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "đến thứ"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "đến cuối cùng"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "lấy một danh sách con từ đầu tiên"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "lấy một danh sách con từ (đếm từ cuối) thứ"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "lấy một danh sách con từ thứ"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Lấy một mảng của danh sách này để tạo danh sách con."; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "tìm sự có mặt đầu tiên của vật"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "tìm sự có mặt cuối cùng của vật"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Hoàn trả vị trí xuất hiện đầu/cuối của vật trong danh sách. Nếu không tìm thấy thì hoàn trả số 0."; -Blockly.Msg.LISTS_INLIST = "trong dánh sách"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 trống rỗng"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Hoàn trả “đúng\" nếu danh sách không có thành tử nào."; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "độ dài của %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Hoàn trả độ dài của một danh sách."; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "tạo danh sách gồm một vật %1 lặp lại %2 lần"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Tạo danh sách gồm một số lượng vật nhất định với mỗi vật đều giống nhau."; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "giá trị"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "gắn chèn vào vị trí"; -Blockly.Msg.LISTS_SET_INDEX_SET = "đặt thành tố"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Gắn chèn vật vào đầu danh sách."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Gắn chèn vật vào danh sách theo vị trí ấn định từ phía cuối. #1 là thành tố cuối cùng."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Gắn chèn vật vào danh sách theo vị trí ấn định. #1 là thành tố đầu tiên."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Gắn thêm vật vào cuối danh sách."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Gắn chèn vật vào danh sách ở vị trí ngẫu nhiên."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Đặt giá trị của thành tố đầu tiên trong danh sách."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Đặt giá trị của thành tố trong một danh sách ở vị trí ấn định từ phía cuối. #1 là thành tố cuối cùng."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Đặt giá trị của thành tố ở vị trí ấn định trong một danh sách. #1 là thành tố đầu tiên."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Đặt giá trị của thành tố cuối cùng trong danh sách."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Đặt giá trị của thành tố ngẫu nhiên trong danh sách."; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "sai"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Hoàn trả \"đúng\" hoặc \"sai\"."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "đúng"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://vi.wikipedia.org/wiki/B%E1%BA%A5t_%C4%91%E1%BA%B3ng_th%E1%BB%A9c"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Hoàn trả giá trị \"đúng\" (true) nếu giá trị hai đầu vào bằng nhau."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Hoàn trả giá trị \"đúng\" (true) nếu đầu vào thứ nhất lớn hơn đầu vào thứ hai."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Hoàn trả giá trị \"đúng\" (true) nếu đầu vào thứ nhất lớn hơn hoặc bằng đầu vào thứ hai."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Hoàn trả giá trị \"đúng\" (true) nếu đầu vào thứ nhất nhỏ hơn đầu vào thứ hai."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Hoàn trả giá trị \"đúng\" (true) nếu đầu vào thứ nhất nhỏ hơn hoặc bằng đầu vào thứ hai."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Hoàn trả giá trị \"đúng\" (true) nếu giá trị hai đầu vào không bằng nhau."; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "không %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Hoàn trả \"đúng\" (true) nếu đầu vào sai. Hoàn trả \"sai\" (false) nếu đầu vào đúng."; -Blockly.Msg.LOGIC_NULL = "trống không"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Hoàn trả trống không."; -Blockly.Msg.LOGIC_OPERATION_AND = "và"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "hoặc"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Hoàn trả \"đúng\" (true) nếu cả hai đầu vào đều đúng."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Hoàn trả \"đúng\" (true) nếu ít nhất một trong hai đầu vào đúng."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "kiểm tra"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "nếu sai"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "nếu đúng"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Kiểm tra điều kiện. Nếu điều kiện đúng, hoàn trả giá trị từ mệnh đề \"nếu đúng\" nếu không đúng, hoàn trả giá trị từ mệnh đề \"nếu sai\"."; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://vi.wikipedia.org/wiki/S%E1%BB%91_h%E1%BB%8Dc"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Hoàn trả tổng của hai con số."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Hoàn trả thương của hai con số."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Hoàn trả hiệu của hai con số."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Hoàn trả tích của hai con số."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Hoàn trả số lũy thừa với số thứ nhất là cơ số và số thứ hai là số mũ."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://vi.wikipedia.org/wiki/Ph%C3%A9p_c%E1%BB%99ng"; -Blockly.Msg.MATH_CHANGE_TITLE = "cộng vào %1 giá trị %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "Cộng số đầu vào vào biến \"%1\"."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Hoàn trả các đẳng số thường gặp: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (vô cực)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "giới hạn %1 không dưới %2 không hơn %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Giới hạn số đầu vào để không dưới số thứ nhất và không hơn số thứ hai."; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "chia hết cho"; -Blockly.Msg.MATH_IS_EVEN = "chẵn"; -Blockly.Msg.MATH_IS_NEGATIVE = "là số âm"; -Blockly.Msg.MATH_IS_ODD = "lẻ"; -Blockly.Msg.MATH_IS_POSITIVE = "là số dương"; -Blockly.Msg.MATH_IS_PRIME = "là số nguyên tố"; -Blockly.Msg.MATH_IS_TOOLTIP = "Kiểm tra con số xem nó có phải là số chẵn, lẻ, nguyên tố, nguyên, dương, âm, hay xem nó có chia hết cho số đầu vào hay không. Hoàn trả đúng hay sai."; -Blockly.Msg.MATH_IS_WHOLE = "là số nguyên"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "số dư của %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Chia số thứ nhất cho số thứ hai rồi hoàn trả số dư từ."; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://vi.wikipedia.org/wiki/S%E1%BB%91"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "Một con số."; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "giá trị trung bình của một danh sách"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "số lớn nhât của một danh sách"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "số trung vị của một danh sách"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "số nhỏ nhất của một danh sách"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "các mode của một danh sách"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "một số bất kỳ của một danh sách"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "độ lệch chuẩn của một danh sách"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "tổng của một danh sách"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Hoàn trả giá trị trung bình từ của danh sách số."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Hoàn trả số lớn nhất trong tất cả các số trong danh sách."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Hoàn trả số trung vị của danh sách số."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Hoàn trả số nhỏ nhất trong tất cả các số trong danh sách."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Hoàn trả các số có mặt nhiều nhất trong danh sách."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Hoàn trả một số bất kỳ từ các số trong danh sách."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Hoàn trả độ lệch chuẩn của danh sách số."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Hoàn trả tổng số của tất cả các số trong danh sách."; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "phân số bất kỳ"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Hoàn trả một phân số bất kỳ không nhỏ hơn 0.0 và không lớn hơn 1.0."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "Một số nguyên bất kỳ từ %1 đến %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Hoàn trả một số nguyên bất kỳ lớn hơn hoặc bằng số đầu và nhỏ hơn hoặc bằng số sau."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "làm tròn"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "làm tròn xuống"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "làm tròn lên"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Làm tròn lên hoặc tròn xuống số đầu vào."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://vi.wikipedia.org/wiki/C%C4%83n_b%E1%BA%ADc_hai"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "giá trị tuyệt đối"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "căn bật hai"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Hoàn trả giá trị tuyệt đối của số đầu vào."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Hoàn trả lũy thừa của số e với số mũ đầu vào."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Hoàn trả lôgarit tự nhiên của số đầu vào."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Hoàn trả lôgarit cơ số 10 của số đầu vào."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Đổi dấu của số đầu vào: âm thành dương và dương thành âm, và hoàn trả số mới."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Hoàn trả lũy thừa của số 10 với số mũ đầu vào."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Hoàn trả căn bật hai của số đầu vào."; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://vi.wikipedia.org/wiki/H%C3%A0m_l%C6%B0%E1%BB%A3ng_gi%C3%A1c"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Hoàn trả Arccos của một góc (theo độ)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Hoàn trả Arcsin của một góc (theo độ)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Hoàn trả Arctang của một góc (theo độ)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Hoàn trả Cos của một góc (theo độ)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Hoàn trả Sin của một góc (theo độ)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Hoàn trả Tang của một góc (theo độ)."; -Blockly.Msg.ME = "Tôi"; -Blockly.Msg.NEW_VARIABLE = "Biến mới..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Tên của biến mới:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "cho phép báo cáo"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "với:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = "thực hiện"; -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Chạy một thủ tục không có giá trị hoàn trả."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Chạy một thủ tục có giá trị hoàn trả."; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "với:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Tạo mảnh \"thực hiện %1\""; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "thủ tục"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = ""; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Một thủ tục không có giá trị hoàn trả."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "hoàn trả"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Một thủ tục có giá trị hoàn trả."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Chú ý: Thủ tục này có lặp lại tên các tham số."; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Làm nổi bật thủ tục"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Khi điều kiện đúng thì hoàn trả một giá trị."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Chú ý: Mảnh này chỉ có thể dùng trong một thủ tục."; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "biến:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Thêm một đầu vào cho hàm."; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "các tham số"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Thêm, xóa hoặc sắp xếp lại các đầu vào cho hàm này."; -Blockly.Msg.REMOVE_COMMENT = "Xóa Chú Giải"; -Blockly.Msg.RENAME_VARIABLE = "Thay tên biến..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Thay tên tất cả \"%1\" biến này thành:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "thêm văn bản"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "ở cuối"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Thêm một mảng văn bản vào biến \"%1\"."; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "thành chữ thường"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "thành Chữ In Đầu Mỗi Từ"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "thành CHỮ IN HOA"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Hoàn trả văn bản sau khi chuyển đổi chữ in hoa hay thường."; -Blockly.Msg.TEXT_CHARAT_FIRST = "lấy ký tự đầu tiên"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "lấy từ phía cuối, ký tự thứ"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "lấy ký tự thứ"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "trong văn bản"; -Blockly.Msg.TEXT_CHARAT_LAST = "lấy ký tự cuối cùng"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "lấy ký tự bất kỳ"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Hoàn trả ký tự ở vị trí đặt ra."; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "thêm vật mới vào văn bản."; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "kết nối"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Thêm, bỏ, hoặc sắp xếp lại các thành phần để tạo dựng mảnh văn bản này."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "đến từ phía cuối, ký tự thứ"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "đến ký tự thứ"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "đến ký tự cuối cùng"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "trong văn bản"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "lấy từ ký tự đầu tiên"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "lấy từ phía cuối, ký tự thứ"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "lấy từ ký tự thứ"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Hoàn trả một mảng ký tự ấn định từ trong văn bản."; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "trong văn bản"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "tìm sự có mặt đầu tiên của"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "tìm sự có mặt cuối cùng của"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Hoàn trả vị trí xuất hiện đầu/cuối của văn bản thứ nhất trong văn bản thứ hai. Nếu không tìm thấy thì hoàn trả số 0."; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 trống không"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Hoàn trả “đúng nếu văn bản không có ký tự nào."; -Blockly.Msg.TEXT_JOIN_HELPURL = ""; -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "tạo văn bản từ"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "Tạo một văn bản từ các thành phần."; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "độ dài của %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Hoàn trả số lượng ký tự (kể cả khoảng trắng) trong văn bản đầu vào."; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "in lên màng hình %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "In ra màng hình một văn bản, con số, hay một giá trị đầu vào khác."; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Xin người dùng nhập vào một con số."; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Xin người dùng nhập vào một văn bản."; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Xin người dùng nhập vào con số với dòng hướng dẫn"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Xin người dùng nhập vào văn bản với dòng hướng dẫn"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/string_(computer_science)"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "Một ký tự, một từ, hay một dòng."; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "cắt các không gian từ cả hai mặt của"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "cắt các không gian từ bên trái của"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "cắt các không gian từ bên phải của"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "Hoàn trả bản sao của văn bản sau khi xóa khoảng trắng từ một hoặc hai bên."; -Blockly.Msg.TODAY = "Today"; // untranslated -Blockly.Msg.VARIABLES_DEFAULT_NAME = "vật"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Tạo mảnh \"đặt vào %1\""; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Hoàn trả giá trị của."; -Blockly.Msg.VARIABLES_SET = "cho %1 bằng %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Tạo mảnh \"lấy %1\""; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "Đặt giá trị của biến này thành..."; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/zh-hans.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/zh-hans.js deleted file mode 100644 index 9a02fc7..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/zh-hans.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.zh.hans'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "添加注释"; -Blockly.Msg.AUTH = "请授权这个应用程序以保存您的作品并共享。"; -Blockly.Msg.CHANGE_VALUE_TITLE = "更改值:"; -Blockly.Msg.CHAT = "通过在此框输入与您的合作者沟通!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "折叠块"; -Blockly.Msg.COLLAPSE_BLOCK = "折叠块"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "颜色1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "颜色2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "比例"; -Blockly.Msg.COLOUR_BLEND_TITLE = "混合"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "用一个给定的比率(0.0-1.0)混合两种颜色。"; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://zh.wikipedia.org/wiki/颜色"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "从调色板中选择一种颜色。"; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "随机颜色"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "随机选择一种颜色。"; -Blockly.Msg.COLOUR_RGB_BLUE = "蓝色"; -Blockly.Msg.COLOUR_RGB_GREEN = "绿色"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "红色"; -Blockly.Msg.COLOUR_RGB_TITLE = "颜色"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "通过指定红色、绿色和蓝色的量创建一种颜色。所有的值必须介于0和100之间。"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "中断循环"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "继续下一次循环"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "中断包含它的循环。"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "跳过这个循环的剩余部分,并继续下一次迭代。"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "警告:此块仅可用于在一个循环内。"; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "为每个项目 %1 在列表中 %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "遍历每个列表中的项目,将变量“%1”设定到该项中,然后执行某些语句。"; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "使用 %1 从范围 %2 到 %3 每隔 %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "从起始数到结尾数中取出变量“%1”的值,按指定的时间间隔,执行指定的块。"; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "在if语句块中增加一个条件。"; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "添加一个最终的,包括所有情况的节到if块中。"; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "增加、删除或重新排列各节来重新配置“if”块。"; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "否则"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "否则如果"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "如果"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "如果值为真,执行一些语句。"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "如果值为真,则执行语句的第一块;否则,则执行语句的第二块。"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "如果第一个值为真,则执行语句的第一个块;否则,如果第二个值为真,则执行语句的第二块。"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "如果第一个值为真,则执行语句的第一块;否则,如果第二个值为真,则执行语句的第二块;如果没有值为真,则执行语句的最后一块。"; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://zh.wikipedia.org/wiki/For循环"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "执行"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "重复 %1 次"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "多次执行一些语句。"; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "重复直到"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "重复当"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "只要值为假,执行一些语句。"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "只要值为真,执行一些语句。"; -Blockly.Msg.DELETE_BLOCK = "删除块"; -Blockly.Msg.DELETE_X_BLOCKS = "删除 %1 块"; -Blockly.Msg.DISABLE_BLOCK = "禁用块"; -Blockly.Msg.DUPLICATE_BLOCK = "复制"; -Blockly.Msg.ENABLE_BLOCK = "启用块"; -Blockly.Msg.EXPAND_ALL = "展开块"; -Blockly.Msg.EXPAND_BLOCK = "展开块"; -Blockly.Msg.EXTERNAL_INPUTS = "外部输入"; -Blockly.Msg.HELP = "帮助"; -Blockly.Msg.INLINE_INPUTS = "单行输入"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "创建空列表"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "返回一个列表,长度为 0,不包含任何数据记录"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "列表"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "增加、删除或重新排列各部分以此重新配置这个列表块。"; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "建立字串使用"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "将一个项添加到列表中。"; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "建立一个具有任意数量项目的列表。"; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "第一"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "倒数第#"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; -Blockly.Msg.LISTS_GET_INDEX_GET = "获得"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "取出并移除"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "最后"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "随机"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "移除"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = "空白"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "返回列表中的第一个项目。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "返回在列表中的指定位置的项。#1是最后一项。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "返回在列表中的指定位置的项。#1是第一个项目。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "返回列表中的最后一项。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "随机返回列表中的一个项目。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "移除并返回列表中的第一个项目。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "移除并返回列表中的指定位置的项。#1 是最后一项。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "移除并返回列表中的指定位置的项。#1 是第一项。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "移除并返回列表中的最后一个项目。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "移除并返回列表中的一个随机项目中。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "移除列表中的第一项"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "删除在列表中的指定位置的项。#1是最后一项。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "移除在列表中的指定位置的项。#1 是第一项。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "移除列表中的最后一项"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "删除列表中的一个随机的项。"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "到倒数第#"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "到#"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "到最后"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "从头获得子列表"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "从倒数#取得子列表"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "从#取得子列表"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "空白"; -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "复制列表中指定的部分。"; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "找出第一个项出现"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "找出最后一个项出现"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "返回在列表中的第一/最后一个匹配项的索引值。如果未找到则返回 0。"; -Blockly.Msg.LISTS_INLIST = "在列表中"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1是空的"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "如果改列表为空,则返回真。"; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "%1的长度"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "返回列表的长度。"; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "建立列表使用项 %1 重复 %2 次"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "建立包含指定重复次数的值的列表。"; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "为"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "插入在"; -Blockly.Msg.LISTS_SET_INDEX_SET = "设置"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "在列表的起始处添加该项。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "插入在列表中的指定位置的项。#1是最后一项。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "插入在列表中指定位置的项。#1是第一项。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "将该项追加到列表的末尾。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "在列表中随机插入项。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "设置列表中的第一个项目。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "设置在列表中指定位置的项。#1是最后一项。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "设置在列表中指定位置的项。#1是第一项。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "设置列表中的最后一项。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "设置列表中一个随机的项目。"; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "从文本制作列表"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "从列表拆出文本"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "加入文本列表至一个文本,由分隔符分隔。"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "拆分文本到文本列表,按每个分隔符拆分。"; -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "用分隔符"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "错"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "同时返回真或假。"; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "真"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://zh.wikipedia.org/wiki/不等"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "如果两个输入结果相等,则返回真。"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "如果第一个输入结果比第二个大,则返回真。"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "如果第一个输入结果大于或等于第二个输入结果,则返回真。"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "如果第一个输入结果比第二个小,则返回真。"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "如果第一个输入结果小于或等于第二个输入结果,则返回真。"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "如果两个输入结果不相等,则返回真。"; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://zh.wikipedia.org/wiki/逻辑非"; -Blockly.Msg.LOGIC_NEGATE_TITLE = "并非%1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "如果输入结果为假,则返回真;如果输入结果为真,则返回假。"; -Blockly.Msg.LOGIC_NULL = "空"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "返回空值。"; -Blockly.Msg.LOGIC_OPERATION_AND = "和"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "或"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "如果两个输入结果都为真,则返回真。"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "如果至少有一个输入结果为真,则返回真。"; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "测试"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://zh.wikipedia.org/wiki/条件运算符"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "如果为假"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "如果为真"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "检查“test”中的条件。如果条件为真,则返回“if true”的值,否则,则返回“if false”的值。"; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://zh.wikipedia.org/wiki/算术"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "返回两个数字的和。"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "返回两个数字的商。"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "返回两个数字的区别。"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "返回两个数字的乘积。"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "返回第一个数的第二个数次幂。"; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://zh.wikipedia.org/wiki/%E5%8A%A0%E6%B3%95"; -Blockly.Msg.MATH_CHANGE_TITLE = "更改 %1 由 %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "将一个数添加到变量“%1”。"; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://zh.wikipedia.org/wiki/数学常数"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "返回一个常见常量:π (3.141......),e (2.718...)、φ (1.618...)、 sqrt(2) (1.414......)、sqrt(½) (0.707......)或 ∞(无穷大)。"; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "限制数字 %1 介于 (低) %2 到 (高) %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "限制数字介于两个指定的数字之间"; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "可被整除"; -Blockly.Msg.MATH_IS_EVEN = "是偶数"; -Blockly.Msg.MATH_IS_NEGATIVE = "为负"; -Blockly.Msg.MATH_IS_ODD = "是奇数"; -Blockly.Msg.MATH_IS_POSITIVE = "是正值"; -Blockly.Msg.MATH_IS_PRIME = "是质数"; -Blockly.Msg.MATH_IS_TOOLTIP = "如果数字是偶数、奇数、非负整数、正数、负数或如果它可被某数字整除,则返回真或假。"; -Blockly.Msg.MATH_IS_WHOLE = "为整数"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://zh.wikipedia.org/wiki/模除"; -Blockly.Msg.MATH_MODULO_TITLE = "取余数自 %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "返回这两个数字相除后的余数。"; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://zh.wikipedia.org/wiki/数"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "一个数字。"; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "列表中的平均数"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "列表中的最大值"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "列表中位数"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "列表中的最小值"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "列表模式"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "列表的随机项"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "列表中的标准差"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "列表中的数的总和"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "返回列表中的数值的平均值。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "返回列表中最大数。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "返回列表中的中位数。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "返回列表中最小数。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "返回列表中的最常见的项的列表。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "从列表中返回一个随机的元素。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "返回列表的标准偏差。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "返回列表中的所有数字的和。"; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://zh.wikipedia.org/wiki/随机数生成器"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "随机分数"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "返回介于(包含)0.0到1.0之间的随机数。"; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://zh.wikipedia.org/wiki/随机数生成器"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "从 %1 到 %2 之间的随机整数"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "返回两个指定的范围(含)之间的随机整数。"; -Blockly.Msg.MATH_ROUND_HELPURL = "https://zh.wikipedia.org/wiki/数值修约"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "向下舍入"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "向下舍入"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "向上舍入"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "数字向上或向下舍入。"; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://zh.wikipedia.org/wiki/平方根"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "绝对"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "平方根"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "返回一个数的绝对值。"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "返回数的e次幂。"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "返回一个数的自然对数。"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "返回数字的对数。"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "返回数的逻辑非。"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "返回数的10次幂。"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "返回数的平方根。"; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://zh.wikipedia.org/wiki/三角函数"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "返回一个数的反余弦值。"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "返回一个数的反正弦值。"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "返回指定角度的反正切值。"; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "返回指定角度的余弦值(非弧度)。"; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "返回指定角度的正弦值(非弧度)。"; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "返回指定角度的正切值(非弧度)。"; -Blockly.Msg.ME = "我"; -Blockly.Msg.NEW_VARIABLE = "新变量..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "新变量的名称:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "空白"; -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "允许声明"; -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "与:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = "空白"; -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://zh.wikipedia.org/wiki/子程序"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "运行用户定义的函数“%1”。"; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://zh.wikipedia.org/wiki/子程序"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "运行用户定义的函数“%1”,并使用它的输出值。"; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "与:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "创建“%1”"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = "空白"; -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://zh.wikipedia.org/wiki/子程序"; -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "做点什么"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "至"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "创建一个不带输出值的函数。"; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://zh.wikipedia.org/wiki/子程序"; -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "返回"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "创建一个有输出值的函数。"; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "警告: 此函数具有重复参数。"; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "突出显示函数定义"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "如果值为真,则返回第二个值。"; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "警告: 仅在定义函数内可使用此块。"; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "输入名称:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "添加函数输入。"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "输入"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "添加、删除或重新排此函数的输入。"; -Blockly.Msg.REMOVE_COMMENT = "删除注释"; -Blockly.Msg.RENAME_VARIABLE = "重命名变量..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "将所有“%1”变量重命名为:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "追加文本"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "在"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "将一些文本追加到变量“%1”。"; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "为小写"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "为首字母大写"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "为大写"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "使用不同的大小写复制这段文字。"; -Blockly.Msg.TEXT_CHARAT_FIRST = "获得第一个字符"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "获得倒数第#个字符"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "获得字符#"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "于文本中"; -Blockly.Msg.TEXT_CHARAT_LAST = "获得最后一个字符"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "获取随机的字母"; -Blockly.Msg.TEXT_CHARAT_TAIL = "空白"; -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "返回位于指定位置的字母。"; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "将一个项添加到文本中。"; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "加入"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "添加、移除或重新排列各节来重新配置这个文本块。"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "到倒数第#个字符"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "到字符#"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "到最后一个字符"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "自文本"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "取得一段字串自第一个字符"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "取得一段字串自#到末尾"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "取得一段字串自#"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = "空白"; -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "返回指定的部分文本。"; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "自文本"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "寻找第一个出现的文本"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "寻找最后一个出现的文本"; -Blockly.Msg.TEXT_INDEXOF_TAIL = "空白"; -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "返回在第二个字串中的第一/最后一个匹配项的索引值。如果未找到则返回 0。"; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1是空的"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "如果提供的文本为空,则返回真。"; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "建立字串使用"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "通过串起任意数量的项以建立一段文字。"; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "%1的长度"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "返回提供文本的字母数(包括空格)。"; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "打印%1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "打印指定的文字、数字或其他值。"; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "提示用户输入数字。"; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "提示用户输入一些文本。"; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "输入数字并显示提示消息"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "输入数字并显示提示消息"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://zh.wikipedia.org/wiki/字符串"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "一个字母、单词或一行文本。"; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "消除两侧空格"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "消除左侧空格"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "消除右侧空格"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "复制这段文字的同时删除两端多余的空格。"; -Blockly.Msg.TODAY = "今天"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "项目"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "创建“设定%1”"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "返回此变量的值。"; -Blockly.Msg.VARIABLES_SET = "赋值 %1 到 %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "创建“获得%1”"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "设置此变量,以使它和输入值相等。"; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/zh-hant.js b/src/opsoro/apps/visual_programming/static/blockly/msg/js/zh-hant.js deleted file mode 100644 index db7090e..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/zh-hant.js +++ /dev/null @@ -1,382 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.zh.hant'); - -goog.require('Blockly.Msg'); - -Blockly.Msg.ADD_COMMENT = "加入註解"; -Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated -Blockly.Msg.CHANGE_VALUE_TITLE = "修改值:"; -Blockly.Msg.CHAT = "與您的合作者洽談藉由在此框輸入!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "收合積木"; -Blockly.Msg.COLLAPSE_BLOCK = "收合積木"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "顏色 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "顏色 2"; -Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated -Blockly.Msg.COLOUR_BLEND_RATIO = "比例"; -Blockly.Msg.COLOUR_BLEND_TITLE = "混合"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "透過一個比率 (0.0-1.0)來混合兩種顏色。"; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://zh.wikipedia.org/wiki/顏色"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "從調色板中選擇一種顏色。"; -Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated -Blockly.Msg.COLOUR_RANDOM_TITLE = "隨機顏色"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "隨機選擇一種顏色。"; -Blockly.Msg.COLOUR_RGB_BLUE = "藍"; -Blockly.Msg.COLOUR_RGB_GREEN = "綠"; -Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated -Blockly.Msg.COLOUR_RGB_RED = "紅"; -Blockly.Msg.COLOUR_RGB_TITLE = "顏色"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "透過指定紅、綠、 藍色的值來建立一種顏色。所有的值必須介於 0 和 100 之間。"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "停止 迴圈"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "繼續下一個 迴圈"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "離開當前的 迴圈"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "跳過這個迴圈的其餘步驟,並繼續下一次的迴圈運算。"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "警告: 此積木僅可用於迴圈內。"; -Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "取出每個 %1 自列表 %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "遍歷每個列表中的項目,將變量 '%1' 設定到該項目中,然後執行某些語句"; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "使用 %1 從範圍 %2 到 %3 每隔 %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "從起始數到結尾數中取出變數 \"%1\" 的值,按指定的時間間隔,執行指定的積木。"; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "將條件添加到'如果'積木。"; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "加入一個最終,所有條件下都都執行的區塊到'如果'積木中"; -Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "添加、 刪除或重新排列各區塊來此重新配置這個'如果'積木。"; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "否則"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "否則如果"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "如果"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "當值為真時,執行一些語句"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "當值為真時,執行第一個語句,否則則執行第二個語句"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "如果第一個值為真,則執行第一個語句。否則當第二個值為真時,則執行第二個語句"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "如果第一個值為真,則執行第一個語句。否則當第二個值為真時,則執行第二個語句。如果前幾個敘述都不為真,則執行最後一個語句"; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://zh.wikipedia.org/wiki/For迴圈"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "執行"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "重複 %1 次"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "多次執行一些語句"; -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "重複 直到"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "重複 當"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "當值為否時,執行一些語句"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "當值為真時,執行一些語句"; -Blockly.Msg.DELETE_BLOCK = "刪除積木"; -Blockly.Msg.DELETE_X_BLOCKS = "刪除 %1 塊積木"; -Blockly.Msg.DISABLE_BLOCK = "停用積木"; -Blockly.Msg.DUPLICATE_BLOCK = "複製"; -Blockly.Msg.ENABLE_BLOCK = "啟用積木"; -Blockly.Msg.EXPAND_ALL = "展開積木"; -Blockly.Msg.EXPAND_BLOCK = "展開積木"; -Blockly.Msg.EXTERNAL_INPUTS = "多行輸入"; -Blockly.Msg.HELP = "說明"; -Blockly.Msg.INLINE_INPUTS = "單行輸入"; -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "建立空列表"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "返回一個長度為 0 的列表,不包含任何資料記錄"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "加入"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "添加、 刪除或重新排列各區塊來此重新配置這個 列表 積木。"; -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "使用這些值建立列表"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "將一個項目加入到列表中。"; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "建立一個具備任意數量項目的列表。"; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "第一筆"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "倒數第#筆"; -Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "取值"; -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "取出並移除"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "最後一筆"; -Blockly.Msg.LISTS_GET_INDEX_RANDOM = "隨機"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "移除"; -Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "返回列表中的第一個項目"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "返回在列表中的指定位置的項目。#1 是最後一個項目。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "返回在列表中的指定位置的項目。#1 是第一個項目。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "返回列表中的最後一個項目"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "返回列表中隨機的一個項目"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "移除並返回列表中的第一個項目"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "移除並返回列表中的指定位置的項目。#1 是最後一個項目。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "移除並返回列表中的指定位置的項目。#1 是第一個項目。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "移除並返回列表中的最後一個項目"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "移除並返回列表中的隨機一個項目"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "移除列表中的第一個項目"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "移除在列表中的指定位置的項目。#1 是最後一個項目。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "移除在列表中的指定位置的項目。#1 是第一個項目。"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "移除列表中的最後一個項目"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "移除列表中隨機的一個項目"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "到 倒數 # 位"; -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "到 #"; -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "到 最後"; -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "從 頭 取得子列表"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "從倒數 # 取得子列表"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "從 # 取得子列表"; -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "複製列表中指定的部分。"; -Blockly.Msg.LISTS_INDEX_OF_FIRST = "找出 第一個 項目出現"; -Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "找出 最後一個 項目出現"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "返回在列表中的第一個/最後一個匹配項目的索引值。如果未找到則返回 0。"; -Blockly.Msg.LISTS_INLIST = "自列表"; -Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated -Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 值為空"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "如果該列表為空,則返回 真。"; -Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "長度 %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "返回列表的長度。"; -Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "建立列表使用項目 %1 重複 %2 次數"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "建立包含指定重複次數的 值 的列表。"; -Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "為"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "插入到"; -Blockly.Msg.LISTS_SET_INDEX_SET = "設定"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "在列表的起始處添加一個項目。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "插入在列表中的指定位置的項目。#1 是最後一個項目。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "插入在列表中的指定位置的項目。#1 是第一個項目。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "在列表的尾端加入一個項目"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "在列表中隨機插入項目"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "設定列表中的第一個項目"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "設定在列表中的指定位置的項目。#1 是最後一個項目。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "設定在列表中的指定位置的項目。#1 是第一個項目。"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "設定列表中的最後一個項目"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "設定列表中隨機的一個項目"; -Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "否"; -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "返回 真 或 否。"; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "真"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://zh.wikipedia.org/wiki/不等"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "如果這兩個輸入區塊內容相等,返回 真。"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "如果第一個輸入大於第二個輸入,返回 真。"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "如果第一個輸入大於或等於第二個輸入,返回 真。"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "如果第一個輸入小於第二個輸入,返回 真。"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "如果第一個輸入是小於或等於第二個輸入,返回 真。"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "如果這兩個輸入區塊內容不相等,返回 真。"; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "非 %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "如果輸入的值是 否,則返回 真。如果輸入的值是 真 返回 否。"; -Blockly.Msg.LOGIC_NULL = "空"; -Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "返回 空。"; -Blockly.Msg.LOGIC_OPERATION_AND = "且"; -Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "或"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "如果這兩個輸入值都為 真,則返回 真。"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "如果至少一個輸入的值為 真,返回 真。"; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "測試"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://zh.wikipedia.org/wiki/條件運算符"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "如果為非"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "如果為真"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "檢查 'test' 中的條件。如果條件為 真,將返回 '如果為 真' 值 ;否則,返回 '如果為 否' 的值。"; -Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://zh.wikipedia.org/wiki/算術"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "返回兩個數字的總和。"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "返回兩個數字的商。"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "返回兩個數字的差。"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "返回兩個數字的乘積。"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "返回第二個數字的指數的第一個數字。"; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://zh.wikipedia.org/wiki/加法"; -Blockly.Msg.MATH_CHANGE_TITLE = "修改 %1 自 %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "將數字添加到變量 '%1'。"; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://zh.wikipedia.org/wiki/數學常數"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "返回一個的常見常量: π (3.141......),e (2.718...)、 φ (1.618...)、 開方(2) (1.414......)、 開方(½) (0.707......) 或 ∞ (無窮大)。"; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated -Blockly.Msg.MATH_CONSTRAIN_TITLE = "限制數字 %1 介於 (低) %2 到 (高) %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "限制數字介於兩個指定的數字之間"; -Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "可被整除"; -Blockly.Msg.MATH_IS_EVEN = "是偶數"; -Blockly.Msg.MATH_IS_NEGATIVE = "是負值"; -Blockly.Msg.MATH_IS_ODD = "是奇數"; -Blockly.Msg.MATH_IS_POSITIVE = "是正值"; -Blockly.Msg.MATH_IS_PRIME = "是質數"; -Blockly.Msg.MATH_IS_TOOLTIP = "如果數字是偶數,奇數,非負整數,正數、 負數或如果它是可被某數字整除,則返回 真 或 否。"; -Blockly.Msg.MATH_IS_WHOLE = "是非負整數"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://zh.wikipedia.org/wiki/模除"; -Blockly.Msg.MATH_MODULO_TITLE = "取餘數自 %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "回傳兩個數字相除的餘數"; -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://zh.wikipedia.org/wiki/數"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "一個數字。"; -Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "平均值 自列表"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "最大值 自列表"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "中位數 自列表"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "最小值 自列表"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "比較眾數 自列表"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "隨機抽取 自列表"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "標準差 自列表"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "總和 自列表"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "返回列表中數值的平均值 (算術平均值)。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "返回列表中的最大數字。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "返回列表中數值的中位數。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "返回列表中的最小數字。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "返回一個列表中的最常見項目的列表。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "從列表中返回一個隨機的項目。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "返回列表中數字的標準差。"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "返回列表中的所有數字的總和。"; -Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://zh.wikipedia.org/wiki/隨機數生成器"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "取隨機分數"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "返回介於 (包含) 0.0 到 1.0 之間的隨機數。"; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://zh.wikipedia.org/wiki/隨機數生成器"; -Blockly.Msg.MATH_RANDOM_INT_TITLE = "取隨機整數介於 (低) %1 到 %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "回傳限制的數字區間內的隨機數字"; -Blockly.Msg.MATH_ROUND_HELPURL = "https://zh.wikipedia.org/wiki/數值簡化"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "四捨五入"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "無條件捨去"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "無條件進位"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "將數字向上或向下舍入。"; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://zh.wikipedia.org/wiki/平方根"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "絕對值"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "開根號"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "返回指定數字的絕對值。"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "返回指定數字指數的 e"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "返回指定數字的自然對數。"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "返回指定數字的對數。"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "返回指定數字的 negation。"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "返回指定數字指數的10的冪次。"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "返回指定數字的平方根。"; -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated -Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated -Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "返回指定角度的反餘弦值(非弧度)。"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "返回指定角度的反正弦值(非弧度)。"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "返回指定角度的反正切值。"; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "返回指定角度的餘弦值(非弧度)。"; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "返回指定角度的正弦值(非弧度)。"; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "返回指定角度的正切值(非弧度)。"; -Blockly.Msg.ME = "我"; -Blockly.Msg.NEW_VARIABLE = "新變量..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "新變量名稱:"; -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "與:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = "呼叫"; -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://zh.wikipedia.org/wiki/子程式"; -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "執行使用者定義的函數 '%1'。"; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://zh.wikipedia.org/wiki/子程式"; -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "執行使用者定義的函數 '%1' 並使用它的回傳值"; -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "與:"; -Blockly.Msg.PROCEDURES_CREATE_DO = "建立 '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "流程"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "到"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "創建一個無回傳值的函數。"; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "回傳"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "創建一個有回傳值的函數。"; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "警告: 此函數中有重複的參數。"; -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "反白顯示函式定義"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "如果值為 真,則返回第二個值。"; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "警告: 此積木僅可在定義函式時使用。"; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "變量:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "參數"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated -Blockly.Msg.REMOVE_COMMENT = "移除註解"; -Blockly.Msg.RENAME_VARIABLE = "重新命名變量..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "將所有 \"%1\" 變量重新命名為:"; -Blockly.Msg.TEXT_APPEND_APPENDTEXT = "後加入文字"; -Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_APPEND_TO = "在"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "將一些文字追加到變量 '%1'。"; -Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "轉成 小寫"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "轉成 首字母大寫"; -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "轉成 大寫"; -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "使用不同的大小寫複製這段文字。"; -Blockly.Msg.TEXT_CHARAT_FIRST = "取第一個字元"; -Blockly.Msg.TEXT_CHARAT_FROM_END = "取得 倒數第 # 個字元"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "取得 字元 #"; -Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "的字元在字串"; -Blockly.Msg.TEXT_CHARAT_LAST = "取最後一個字元"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "取隨機一個字元"; -Blockly.Msg.TEXT_CHARAT_TAIL = ""; -Blockly.Msg.TEXT_CHARAT_TOOLTIP = "返回位於指定位置的字元。"; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "將一個項目加入到字串中。"; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "加入"; -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "添加、 刪除或重新排列各區塊來此重新配置這個文字積木。"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "到 倒數第 # 個字元"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "到 字元 #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "到 最後一個字元"; -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "自字串"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "取得一段字串 自 第一個字元"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "取得一段字串自 #"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "取得一段字串自 #"; -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "返回指定的部分文字。"; -Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "在字串"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "尋找 第一個 出現的字串"; -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "尋找 最後一個 出現的字串"; -Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "返回在第二個字串中的第一個/最後一個匹配項目的索引值。如果未找到則返回 0。"; -Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated -Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 為空"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "如果提供的字串為空,則返回 真。"; -Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "建立字串使用"; -Blockly.Msg.TEXT_JOIN_TOOLTIP = "通過串起任意數量的項目來建立一段文字。"; -Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "長度 %1"; -Blockly.Msg.TEXT_LENGTH_TOOLTIP = "返回這串文字的字元數(含空格) 。"; -Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "印出 %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "印出指定的文字、 數字或其他值。"; -Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "輸入數字"; -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "輸入文字"; -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "輸入 數字 並顯示提示訊息"; -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "輸入 文字 並顯示提示訊息"; -Blockly.Msg.TEXT_TEXT_HELPURL = "https://zh.wikipedia.org/wiki/字串"; -Blockly.Msg.TEXT_TEXT_TOOLTIP = "字元、 單詞或一行文字。"; -Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "消除兩側空格"; -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "消除左側空格"; -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "消除右側空格"; -Blockly.Msg.TEXT_TRIM_TOOLTIP = "複製這段文字的同時刪除兩端多餘的空格。"; -Blockly.Msg.TODAY = "今天"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "變量"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "創立 '設定 %1'"; -Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "返回此變量的值。"; -Blockly.Msg.VARIABLES_SET = "賦值 %1 到 %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "建立 '取得 %1'"; -Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "設定此變量,好和輸入值相等。"; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/de.json b/src/opsoro/apps/visual_programming/static/blockly/msg/json/de.json deleted file mode 100644 index 7a1b74e..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/de.json +++ /dev/null @@ -1,338 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Metalhead64", - "M165437", - "Dan-yell", - "아라", - "Octycs" - ] - }, - "VARIABLES_DEFAULT_NAME": "Element", - "TODAY": "Heute", - "DUPLICATE_BLOCK": "Kopieren", - "ADD_COMMENT": "Kommentar hinzufügen", - "REMOVE_COMMENT": "Kommentar entfernen", - "EXTERNAL_INPUTS": "externe Eingänge", - "INLINE_INPUTS": "interne Eingänge", - "DELETE_BLOCK": "Block löschen", - "DELETE_X_BLOCKS": "Block %1 löschen", - "COLLAPSE_BLOCK": "Block zusammenfalten", - "COLLAPSE_ALL": "Alle Blöcke zusammenfalten", - "EXPAND_BLOCK": "Block entfalten", - "EXPAND_ALL": "Alle Blöcke entfalten", - "DISABLE_BLOCK": "Block deaktivieren", - "ENABLE_BLOCK": "Block aktivieren", - "HELP": "Hilfe", - "CHAT": "Chatte mit unserem Mitarbeiter durch Eingeben von Text in diesen Kasten!", - "AUTH": "Bitte autorisiere diese App zum Aktivieren der Speicherung deiner Arbeit und zum Teilen.", - "ME": "Ich", - "CHANGE_VALUE_TITLE": "Wert ändern:", - "NEW_VARIABLE": "Neue Variable...", - "NEW_VARIABLE_TITLE": "Name der neuen Variable:", - "RENAME_VARIABLE": "Variable umbenennen...", - "RENAME_VARIABLE_TITLE": "Alle \"%1\" Variablen umbenennen in:", - "COLOUR_PICKER_HELPURL": "https://de.wikipedia.org/wiki/Farbe", - "COLOUR_PICKER_TOOLTIP": "Wähle eine Farbe aus der Palette.", - "COLOUR_RANDOM_TITLE": "zufällige Farbe", - "COLOUR_RANDOM_TOOLTIP": "Wähle eine Farbe nach dem Zufallsprinzip.", - "COLOUR_RGB_HELPURL": "https://de.wikipedia.org/wiki/RGB-Farbraum", - "COLOUR_RGB_TITLE": "Farbe mit", - "COLOUR_RGB_RED": "rot", - "COLOUR_RGB_GREEN": "grün", - "COLOUR_RGB_BLUE": "blau", - "COLOUR_RGB_TOOLTIP": "Kreiere eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 100 liegen.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "mische", - "COLOUR_BLEND_COLOUR1": "Farbe 1", - "COLOUR_BLEND_COLOUR2": "mit Farbe 2", - "COLOUR_BLEND_RATIO": "im Verhältnis", - "COLOUR_BLEND_TOOLTIP": "Vermische 2 Farben mit konfigurierbaren Farbverhältnis (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://de.wikipedia.org/wiki/For-Schleife", - "CONTROLS_REPEAT_TITLE": "wiederhole %1 mal", - "CONTROLS_REPEAT_INPUT_DO": "mache", - "CONTROLS_REPEAT_TOOLTIP": "Eine Anweisung mehrfach ausführen.", - "CONTROLS_WHILEUNTIL_HELPURL": "https://de.wikipedia.org/wiki/Schleife_%28Programmierung%29", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "Wiederhole solange", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "Wiederhole bis", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Führe die Anweisung solange aus wie die Bedingung wahr (true) ist.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Führe die Anweisung solange aus wie die Bedingung falsch (false) ist.", - "CONTROLS_FOR_HELPURL": "https://de.wikipedia.org/wiki/For-Schleif", - "CONTROLS_FOR_TOOLTIP": "Zähle die Variable \"%1\" von einem Startwert bis zu einem Zielwert und führe für jeden Wert eine Anweisung aus.", - "CONTROLS_FOR_TITLE": "Zähle %1 von %2 bis %3 mit %4", - "CONTROLS_FOREACH_HELPURL": "https://de.wikipedia.org/wiki/For-Schleife", - "CONTROLS_FOREACH_TITLE": "Für Wert %1 aus der Liste %2", - "CONTROLS_FOREACH_TOOLTIP": "Führe eine Anweisung für jeden Wert in der Liste aus und setzte dabei die Variable \"%1\" auf den aktuellen Listenwert.", - "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://de.wikipedia.org/wiki/Kontrollstruktur", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "Die Schleife abbrechen", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "mit der nächsten Iteration der Schleife fortfahren", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Die umgebende Schleife beenden.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Diese Anweisung abbrechen und mit der nächsten Schleifendurchlauf fortfahren.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Warnung: Dieser Block sollte nur in einer Schleife verwendet werden.", - "CONTROLS_IF_TOOLTIP_1": "Wenn eine Bedingung wahr (true) ist, dann führe eine Anweisung aus.", - "CONTROLS_IF_TOOLTIP_2": "Wenn eine Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Ansonsten führe die zweite Anweisung aus.", - "CONTROLS_IF_TOOLTIP_3": "Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus.", - "CONTROLS_IF_TOOLTIP_4": "Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus. Falls keine der beiden Bedingungen wahr (true) ist, dann führe die dritte Anweisung aus.", - "CONTROLS_IF_MSG_IF": "wenn", - "CONTROLS_IF_MSG_ELSEIF": "sonst wenn", - "CONTROLS_IF_MSG_ELSE": "sonst", - "CONTROLS_IF_IF_TOOLTIP": "Hinzufügen, entfernen oder sortieren von Sektionen", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Eine weitere Bedingung hinzufügen.", - "CONTROLS_IF_ELSE_TOOLTIP": "Eine sonst-Bedingung hinzufügen, führt eine Anweisung aus falls keine Bedingung zutrifft.", - "LOGIC_COMPARE_HELPURL": "https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29", - "LOGIC_COMPARE_TOOLTIP_EQ": "Ist wahr (true) wenn beide Werte gleich sind.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Ist wahr (true) wenn beide Werte unterschiedlich sind.", - "LOGIC_COMPARE_TOOLTIP_LT": "Ist wahr (true) wenn der erste Wert kleiner als der zweite Wert ist.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Ist wahr (true) wenn der erste Wert kleiner als oder gleich groß wie zweite Wert ist.", - "LOGIC_COMPARE_TOOLTIP_GT": "Ist wahr (true) wenn der erste Wert größer als der zweite Wert ist.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Ist wahr (true) wenn der erste Wert größer als oder gleich groß wie zweite Wert ist.", - "LOGIC_OPERATION_TOOLTIP_AND": "Ist wahr (true) wenn beide Werte wahr (true) sind.", - "LOGIC_OPERATION_AND": "und", - "LOGIC_OPERATION_TOOLTIP_OR": "Ist wahr (true) wenn einer der beiden Werte wahr (true) ist.", - "LOGIC_OPERATION_OR": "oder", - "LOGIC_NEGATE_TITLE": "nicht %1", - "LOGIC_NEGATE_TOOLTIP": "Ist wahr (true) wenn der Eingabewert falsch (false) ist. Ist falsch (false) wenn der Eingabewert wahr (true) ist.", - "LOGIC_BOOLEAN_TRUE": "wahr", - "LOGIC_BOOLEAN_FALSE": "falsch", - "LOGIC_BOOLEAN_TOOLTIP": "Ist entweder wahr (true) oder falsch (false)", - "LOGIC_NULL_HELPURL": "https://de.wikipedia.org/wiki/Nullwert", - "LOGIC_NULL": "null", - "LOGIC_NULL_TOOLTIP": "Ist NULL.", - "LOGIC_TERNARY_HELPURL": "https://de.wikipedia.org/wiki/%3F:#Auswahloperator", - "LOGIC_TERNARY_CONDITION": "teste", - "LOGIC_TERNARY_IF_TRUE": "wenn wahr", - "LOGIC_TERNARY_IF_FALSE": "wenn falsch", - "LOGIC_TERNARY_TOOLTIP": "Überprüft eine Bedingung \"teste\". Wenn die Bedingung wahr ist wird der \"wenn wahr\" Wert zurückgegeben, andernfalls der \"wenn falsch\" Wert", - "MATH_NUMBER_HELPURL": "https://de.wikipedia.org/wiki/Zahl", - "MATH_NUMBER_TOOLTIP": "Eine Zahl.", - "MATH_ARITHMETIC_HELPURL": "https://de.wikipedia.org/wiki/Grundrechenart", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Ist die Summe zweier Werte.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Ist die Differenz zweier Werte.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Ist das Produkt zweier Werte.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Ist der Quotient zweier Werte.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Ist der erste Wert potenziert mit dem zweiten Wert.", - "MATH_SINGLE_HELPURL": "https://de.wikipedia.org/wiki/Quadratwurzel", - "MATH_SINGLE_OP_ROOT": "Quadratwurzel", - "MATH_SINGLE_TOOLTIP_ROOT": "Ist die Quadratwurzel eines Wertes.", - "MATH_SINGLE_OP_ABSOLUTE": "Absolutwert", - "MATH_SINGLE_TOOLTIP_ABS": "Ist der Absolutwert eines Wertes.", - "MATH_SINGLE_TOOLTIP_NEG": "Negiert einen Wert.", - "MATH_SINGLE_TOOLTIP_LN": "Ist der natürliche Logarithmus eines Wertes.", - "MATH_SINGLE_TOOLTIP_LOG10": "Ist der dekadische Logarithmus eines Wertes.", - "MATH_SINGLE_TOOLTIP_EXP": "Ist Wert der Exponentialfunktion eines Wertes.", - "MATH_SINGLE_TOOLTIP_POW10": "Rechnet 10 hoch Eingabewert.", - "MATH_TRIG_HELPURL": "https://de.wikipedia.org/wiki/Trigonometrie", - "MATH_TRIG_TOOLTIP_SIN": "Ist der Sinus des Winkels.", - "MATH_TRIG_TOOLTIP_COS": "Ist der Kosinus des Winkels.", - "MATH_TRIG_TOOLTIP_TAN": "Ist der Tangens des Winkels.", - "MATH_TRIG_TOOLTIP_ASIN": "Ist der Arkussinus des Eingabewertes.", - "MATH_TRIG_TOOLTIP_ACOS": "Ist der Arkuskosinus des Eingabewertes.", - "MATH_TRIG_TOOLTIP_ATAN": "Ist der Arkustangens des Eingabewertes.", - "MATH_CONSTANT_HELPURL": "https://de.wikipedia.org/wiki/Mathematische_Konstante", - "MATH_CONSTANT_TOOLTIP": "Mathematische Konstanten wie: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) oder ∞ (unendlich).", - "MATH_IS_EVEN": "ist gerade", - "MATH_IS_ODD": "ist ungerade", - "MATH_IS_PRIME": "ist eine Primzahl", - "MATH_IS_WHOLE": "ist eine ganze Zahl", - "MATH_IS_POSITIVE": "ist positiv", - "MATH_IS_NEGATIVE": "ist negativ", - "MATH_IS_DIVISIBLE_BY": "ist teilbar durch", - "MATH_IS_TOOLTIP": "Überprüft ob eine Zahl gerade, ungerade, eine Primzahl, ganzzahlig, positiv, negativ oder durch eine zweite Zahl teilbar ist. Gibt wahr (true) oder falsch (false) zurück.", - "MATH_CHANGE_HELPURL": "https://de.wikipedia.org/wiki/Inkrement_und_Dekrement", - "MATH_CHANGE_TITLE": "erhöhe %1 um %2", - "MATH_CHANGE_TOOLTIP": "Addiert einen Wert zur Variable \"%1\" hinzu.", - "MATH_ROUND_HELPURL": "https://de.wikipedia.org/wiki/Runden", - "MATH_ROUND_TOOLTIP": "Eine Zahl auf- oder abrunden.", - "MATH_ROUND_OPERATOR_ROUND": "runden", - "MATH_ROUND_OPERATOR_ROUNDUP": "aufrunden", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "abrunden", - "MATH_ONLIST_HELPURL": "http://www.sysplus.ch/einstieg.php?links=menu&seite=4125&grad=Crash&prog=Excel", - "MATH_ONLIST_OPERATOR_SUM": "Summe einer Liste", - "MATH_ONLIST_TOOLTIP_SUM": "Ist die Summe aller Werte in einer Liste.", - "MATH_ONLIST_OPERATOR_MIN": "Minimalwert einer Liste", - "MATH_ONLIST_TOOLTIP_MIN": "Ist der kleinste Wert in einer Liste.", - "MATH_ONLIST_OPERATOR_MAX": "Maximalwert einer Liste", - "MATH_ONLIST_TOOLTIP_MAX": "Ist der größte Wert in einer Liste.", - "MATH_ONLIST_OPERATOR_AVERAGE": "Mittelwert einer Liste", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Ist der Durchschnittswert aller Werte in einer Liste.", - "MATH_ONLIST_OPERATOR_MEDIAN": "Median einer Liste", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Ist der Median aller Werte in einer Liste.", - "MATH_ONLIST_OPERATOR_MODE": "Modulo / Restwert einer Liste", - "MATH_ONLIST_TOOLTIP_MODE": "Findet den am häufigsten vorkommenden Wert in einer Liste. Falls kein Wert öfter vorkommt als alle anderen, wird die originale Liste zurückgeben", - "MATH_ONLIST_OPERATOR_STD_DEV": "Standardabweichung einer Liste", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Ist die standardisierte Standardabweichung aller Werte in der Liste", - "MATH_ONLIST_OPERATOR_RANDOM": "Zufallswert einer Liste", - "MATH_ONLIST_TOOLTIP_RANDOM": "Gebe einen zufälligen Wert aus der Liste zurück.", - "MATH_MODULO_HELPURL": "https://de.wikipedia.org/wiki/Modulo", - "MATH_MODULO_TITLE": "Rest von %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Der Rest nach einer Division.", - "MATH_CONSTRAIN_TITLE": "begrenze %1 von %2 bis %3", - "MATH_CONSTRAIN_TOOLTIP": "Begrenzt den Wertebereich auf den \"von\"-Wert bis einschließlich zum \"bis\"-Wert. (inklusiv)", - "MATH_RANDOM_INT_HELPURL": "https://de.wikipedia.org/wiki/Zufallszahlen", - "MATH_RANDOM_INT_TITLE": "ganzzahliger Zufallswert zwischen %1 bis %2", - "MATH_RANDOM_INT_TOOLTIP": "Erzeuge einen ganzzahligen Zufallswert zwischen zwei Werten (inklusiv).", - "MATH_RANDOM_FLOAT_HELPURL": "https://de.wikipedia.org/wiki/Zufallszahlen", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "Zufallszahl (0.0 -1.0)", - "MATH_RANDOM_FLOAT_TOOLTIP": "Erzeuge eine Zufallszahl zwischen 0.0 (inklusiv) und 1.0 (exklusiv).", - "TEXT_TEXT_HELPURL": "https://de.wikipedia.org/wiki/Zeichenkette", - "TEXT_TEXT_TOOLTIP": "Ein Buchstabe, Text oder Satz.", - "TEXT_JOIN_HELPURL": "", - "TEXT_JOIN_TITLE_CREATEWITH": "Erstelle Text aus", - "TEXT_JOIN_TOOLTIP": "Erstellt einen Text durch das Verbinden von mehreren Textelementen.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "verbinden", - "TEXT_CREATE_JOIN_TOOLTIP": "Hinzufügen, entfernen und sortieren von Elementen.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Ein Element zum Text hinzufügen.", - "TEXT_APPEND_TO": "An", - "TEXT_APPEND_APPENDTEXT": "Text anhängen", - "TEXT_APPEND_TOOLTIP": "Text an die Variable \"%1\" anhängen.", - "TEXT_LENGTH_TITLE": "Länge %1", - "TEXT_LENGTH_TOOLTIP": "Die Anzahl von Zeichen in einem Text. (inkl. Leerzeichen)", - "TEXT_ISEMPTY_TITLE": "%1 ist leer?", - "TEXT_ISEMPTY_TOOLTIP": "Ist wahr (true), wenn der Text keine Zeichen enthält ist.", - "TEXT_INDEXOF_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "TEXT_INDEXOF_TOOLTIP": "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs oder 0 zurück.", - "TEXT_INDEXOF_INPUT_INTEXT": "im Text", - "TEXT_INDEXOF_OPERATOR_FIRST": "Suche erstes Auftreten des Begriffs", - "TEXT_INDEXOF_OPERATOR_LAST": "Suche letztes Auftreten des Begriffs", - "TEXT_INDEXOF_TAIL": "", - "TEXT_CHARAT_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "TEXT_CHARAT_INPUT_INTEXT": "vom Text", - "TEXT_CHARAT_FROM_START": "Nehme #ten Buchstaben", - "TEXT_CHARAT_FROM_END": "Nehme #ten Buchstaben von hinten", - "TEXT_CHARAT_FIRST": "Nehme ersten Buchstaben", - "TEXT_CHARAT_LAST": "Nehme letzten Buchstaben", - "TEXT_CHARAT_RANDOM": "Nehme zufälligen Buchstaben", - "TEXT_CHARAT_TAIL": "", - "TEXT_CHARAT_TOOLTIP": "Extrahiere einen Buchstaben von einer spezifizierten Position.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Gibt die angegebenen Textabschnitt zurück.", - "TEXT_GET_SUBSTRING_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "in Text", - "TEXT_GET_SUBSTRING_START_FROM_START": "vom #ten Buchstaben", - "TEXT_GET_SUBSTRING_START_FROM_END": "vom #ten Buchstaben von hinten", - "TEXT_GET_SUBSTRING_START_FIRST": "vom ersten Buchstaben", - "TEXT_GET_SUBSTRING_END_FROM_START": "bis zum #ten Buchstaben", - "TEXT_GET_SUBSTRING_END_FROM_END": "bis zum #ten Buchstaben von hinten", - "TEXT_GET_SUBSTRING_END_LAST": "bis zum letzten Buchstaben", - "TEXT_GET_SUBSTRING_TAIL": "", - "TEXT_CHANGECASE_TOOLTIP": "Wandelt Schreibweise von Texten um, in Großbuchstaben, Kleinbuchstaben oder den ersten Buchstaben jedes Wortes groß und die anderen klein.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "umwandeln in GROSSBUCHSTABEN", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "umwandeln in kleinbuchstaben", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "umwandeln in Substantive", - "TEXT_TRIM_TOOLTIP": "Entfernt Leerzeichen vom Anfang und / oder Ende eines Textes.", - "TEXT_TRIM_OPERATOR_BOTH": "entferne Leerzeichen vom Anfang und vom Ende (links und rechts)", - "TEXT_TRIM_OPERATOR_LEFT": "entferne Leerzeichen vom Anfang (links)", - "TEXT_TRIM_OPERATOR_RIGHT": "entferne Leerzeichen vom Ende (rechts)", - "TEXT_PRINT_TITLE": "Ausgabe %1", - "TEXT_PRINT_TOOLTIP": "Gib den Inhalt einer Variable aus.", - "TEXT_PROMPT_TYPE_TEXT": "Fragt nach Text mit Hinweis", - "TEXT_PROMPT_TYPE_NUMBER": "Fragt nach Zahl mit Hinweis", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Fragt den Benutzer nach einer Zahl.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Fragt den Benutzer nach einem Text.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "Erzeuge eine leere Liste", - "LISTS_CREATE_EMPTY_TOOLTIP": "Erzeugt eine leere Liste ohne Inhalt.", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_CREATE_WITH_TOOLTIP": "Erzeugt eine List mit konfigurierten Elementen.", - "LISTS_CREATE_WITH_INPUT_WITH": "Erzeuge Liste mit", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "Liste", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Hinzufügen, entfernen und sortieren von Elementen.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Ein Element zur Liste hinzufügen.", - "LISTS_REPEAT_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "LISTS_REPEAT_TOOLTIP": "Erzeugt eine Liste mit einer variablen Anzahl von Elementen", - "LISTS_REPEAT_TITLE": "Erzeuge Liste mit Element %1 wiederhole es %2 mal", - "LISTS_LENGTH_TITLE": "Länge von %1", - "LISTS_LENGTH_TOOLTIP": "Die Anzahl von Elementen in der Liste.", - "LISTS_ISEMPTY_TITLE": "%1 ist leer?", - "LISTS_ISEMPTY_TOOLTIP": "Ist wahr (true), wenn die Liste leer ist.", - "LISTS_INLIST": "von der Liste", - "LISTS_INDEX_OF_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "LISTS_INDEX_OF_FIRST": "suche erstes Auftreten von", - "LISTS_INDEX_OF_LAST": "suche letztes Auftreten von", - "LISTS_INDEX_OF_TOOLTIP": "Sucht die Position (index) eines Elementes in der Liste. Gibt 0 zurück wenn nichts gefunden wurde.", - "LISTS_GET_INDEX_GET": "nimm", - "LISTS_GET_INDEX_GET_REMOVE": "nimm und entferne", - "LISTS_GET_INDEX_REMOVE": "entferne", - "LISTS_GET_INDEX_FROM_START": "#tes", - "LISTS_GET_INDEX_FROM_END": "#tes von hinten", - "LISTS_GET_INDEX_FIRST": "erstes", - "LISTS_GET_INDEX_LAST": "letztes", - "LISTS_GET_INDEX_RANDOM": "zufälliges", - "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Extrahiere das #1te Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Extrahiere das #1te Element aus Ende der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Extrahiere das erste Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Extrahiere das letzte Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Extrahiere ein zufälliges Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Extrahiere und entfernt das #1te Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Extrahiere und entfernt das #1te Element aus Ende der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Extrahiere und entfernt das erste Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Extrahiere und entfernt das letzte Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Extrahiere und entfernt ein zufälliges Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Entfernt das #1te Element von der Liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Entfernt das #1te Element von Ende der Liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Entfernt das erste Element von der Liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Entfernt das letzte Element von der Liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Entfernt ein zufälliges Element von der Liste.", - "LISTS_SET_INDEX_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "LISTS_SET_INDEX_SET": "setze", - "LISTS_SET_INDEX_INSERT": "füge", - "LISTS_SET_INDEX_INPUT_TO": "ein", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Setzte das Element an der angegebenen Position in der Liste. #1 ist das erste Element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Setzt das Element an der angegebenen Position in der Liste. #1 ist das letzte Element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Setzt das erste Element in der Liste.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Setzt das letzte Element in der Liste.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Setzt ein zufälliges Element in der Liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Fügt das Element an der angegebenen Position in der Liste ein. #1 ist die erste Element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Fügt das Element an der angegebenen Position in der Liste ein. #1 ist das letzte Element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Fügt das Element an den Anfang der Liste an.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Fügt das Element ans Ende der Liste an.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Fügt das Element zufällig in die Liste ein.", - "LISTS_GET_SUBLIST_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "LISTS_GET_SUBLIST_START_FROM_START": "erhalte Unterliste von #", - "LISTS_GET_SUBLIST_START_FROM_END": "erhalte Unterliste von # von hinten", - "LISTS_GET_SUBLIST_START_FIRST": "erhalte Unterliste vom Anfang", - "LISTS_GET_SUBLIST_END_FROM_START": "bis zu #", - "LISTS_GET_SUBLIST_END_FROM_END": "bis zu # von hinten", - "LISTS_GET_SUBLIST_END_LAST": "bis zum Ende", - "LISTS_GET_SUBLIST_TAIL": "", - "LISTS_GET_SUBLIST_TOOLTIP": "Erstellt eine Kopie mit dem angegebenen Abschnitt der Liste.", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", - "LISTS_SPLIT_LIST_FROM_TEXT": "Liste aus Text erstellen", - "LISTS_SPLIT_TEXT_FROM_LIST": "Text aus Liste erstellen", - "LISTS_SPLIT_WITH_DELIMITER": "mit Trennzeichen", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Text in eine Liste mit Texten aufteilen, unterbrochen bei jedem Trennzeichen.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Liste mit Texten in einen Text vereinen, getrennt durch ein Trennzeichen.", - "ORDINAL_NUMBER_SUFFIX": "", - "VARIABLES_GET_HELPURL": "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29", - "VARIABLES_GET_TOOLTIP": "Gibt den Wert der Variable zurück.", - "VARIABLES_GET_CREATE_SET": "Erzeuge \"Schreibe %1\"", - "VARIABLES_SET_HELPURL": "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29", - "VARIABLES_SET": "Schreibe %1 %2", - "VARIABLES_SET_TOOLTIP": "Setzt den Wert einer Variable.", - "VARIABLES_SET_CREATE_GET": "Erzeuge \"Lese %1\"", - "PROCEDURES_DEFNORETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", - "PROCEDURES_DEFNORETURN_TITLE": "zu", - "PROCEDURES_DEFNORETURN_PROCEDURE": "Funktionsblock", - "PROCEDURES_BEFORE_PARAMS": "mit:", - "PROCEDURES_CALL_BEFORE_PARAMS": "mit:", - "PROCEDURES_DEFNORETURN_DO": "", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Ein Funktionsblock ohne Rückgabewert.", - "PROCEDURES_DEFRETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", - "PROCEDURES_DEFRETURN_RETURN": "gebe zurück", - "PROCEDURES_DEFRETURN_TOOLTIP": "Ein Funktionsblock mit Rückgabewert.", - "PROCEDURES_ALLOW_STATEMENTS": "Aussagen erlauben", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Warnung: dieser Funktionsblock hat zwei gleich benannte Parameter.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", - "PROCEDURES_CALLNORETURN_CALL": "", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Rufe einen Funktionsblock ohne Rückgabewert auf.", - "PROCEDURES_CALLRETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Rufe einen Funktionsblock mit Rückgabewert auf.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "Parameter", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Die Eingaben zu dieser Funktion hinzufügen, entfernen oder neu anordnen.", - "PROCEDURES_MUTATORARG_TITLE": "Variable:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Eine Eingabe zur Funktion hinzufügen.", - "PROCEDURES_HIGHLIGHT_DEF": "Markiere Funktionsblock", - "PROCEDURES_CREATE_DO": "Erzeuge \"Aufruf %1\"", - "PROCEDURES_IFRETURN_TOOLTIP": "Wenn der erste Wert wahr (true) ist, Gebe den zweiten Wert zurück.", - "PROCEDURES_IFRETURN_WARNING": "Warnung: Dieser Block darf nur innerhalb eines Funktionsblock genutzt werden." -} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/id.json b/src/opsoro/apps/visual_programming/static/blockly/msg/json/id.json deleted file mode 100644 index 998b0b9..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/id.json +++ /dev/null @@ -1,323 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Kenrick95", - "아라", - "Mirws", - "Marwan Mohamad" - ] - }, - "VARIABLES_DEFAULT_NAME": "item", - "TODAY": "Hari ini", - "DUPLICATE_BLOCK": "Duplikat", - "ADD_COMMENT": "Tambahkan sebuah comment", - "REMOVE_COMMENT": "Hapus komentar", - "EXTERNAL_INPUTS": "Input-input eksternal", - "INLINE_INPUTS": "Input inline", - "DELETE_BLOCK": "Hapus Blok", - "DELETE_X_BLOCKS": "Hapus %1 Blok", - "COLLAPSE_BLOCK": "Ciutkan Blok", - "COLLAPSE_ALL": "Ciutkan Blok", - "EXPAND_BLOCK": "Kembangkan Blok", - "EXPAND_ALL": "Kembangkan blok-blok", - "DISABLE_BLOCK": "Nonaktifkan Blok", - "ENABLE_BLOCK": "Aktifkan Blok", - "HELP": "Bantuan", - "CHAT": "Chatting dengan kolaborator anda dengan mengetikkan di kotak ini!", - "AUTH": "Silakan mengotorisasi aplikasi ini untuk memungkinkan pekerjaan Anda dapat disimpan dan digunakan bersama.", - "ME": "Saya", - "CHANGE_VALUE_TITLE": "Ubah nilai:", - "NEW_VARIABLE": "Pembolehubah baru...", - "NEW_VARIABLE_TITLE": "Nama pembolehubah baru:", - "RENAME_VARIABLE": "namai ulang variabel...", - "RENAME_VARIABLE_TITLE": "Ubah nama semua variabel '%1' menjadi:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Pilih warna dari daftar warna.", - "COLOUR_RANDOM_TITLE": "Warna acak", - "COLOUR_RANDOM_TOOLTIP": "Pilih warna secara acak.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "Dengan warna", - "COLOUR_RGB_RED": "merah", - "COLOUR_RGB_GREEN": "hijau", - "COLOUR_RGB_BLUE": "biru", - "COLOUR_RGB_TOOLTIP": "Buatlah warna dengan jumlah yang ditentukan dari merah, hijau dan biru. Semua nilai harus antarai 0 sampai 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "Tertutup", - "COLOUR_BLEND_COLOUR1": "Warna 1", - "COLOUR_BLEND_COLOUR2": "Warna 2", - "COLOUR_BLEND_RATIO": "rasio", - "COLOUR_BLEND_TOOLTIP": "mencampur dua warna secara bersamaan dengan perbandingan (0.0-1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "ulangi %1 kali", - "CONTROLS_REPEAT_INPUT_DO": "kerjakan", - "CONTROLS_REPEAT_TOOLTIP": "Lakukan beberapa perintah beberapa kali.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "Ulangi jika", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "Ulangi sampai", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Jika sementara nilai benar (true), maka lakukan beberapa perintah.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Jika sementara nilai tidak benar (false), maka lakukan beberapa perintah.", - "CONTROLS_FOR_TOOLTIP": "Menggunakan variabel \"%1\" dengan mengambil nilai dari batas awal hingga ke batas akhir, dengan interval tertentu, dan mengerjakan block tertentu.", - "CONTROLS_FOR_TITLE": "Cacah dengan %1 dari %2 ke %3 dengan step / penambahan %4", - "CONTROLS_FOREACH_TITLE": "untuk setiap item %1 di dalam list %2", - "CONTROLS_FOREACH_TOOLTIP": "Untuk tiap-tiap item di dalam list, tetapkan variabel '%1' ke dalam item, selanjutnya kerjakan beberapa statement.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "Keluar dari perulangan", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "Lanjutkan dengan langkah penggulangan berikutnya", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Keluar sementara dari perulanggan.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Abaikan sisa dari loop ini, dan lanjutkan dengan iterasi berikutnya.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Peringatan: Blok ini hanya dapat digunakan dalam loop.", - "CONTROLS_IF_TOOLTIP_1": "jika nilainya benar maka kerjakan perintah berikutnya.", - "CONTROLS_IF_TOOLTIP_2": "jika nilainya benar, maka kerjakan blok perintah yang pertama. Jika tidak, kerjakan blok perintah yang kedua.", - "CONTROLS_IF_TOOLTIP_3": "Jika nilai pertama adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok pertama. Jika nilai kedua adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok kedua.", - "CONTROLS_IF_TOOLTIP_4": "Jika blok pertama adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok pertama. Atau jika blok kedua adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok kedua.", - "CONTROLS_IF_MSG_IF": "Jika", - "CONTROLS_IF_MSG_ELSEIF": "else if", - "CONTROLS_IF_MSG_ELSE": "else", - "CONTROLS_IF_IF_TOOLTIP": "Menambahkan, menghapus, atau menyusun kembali bagian untuk mengkonfigurasi blok IF ini.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "tambahkan prasyarat ke dalam blok IF.", - "CONTROLS_IF_ELSE_TOOLTIP": "Terakhir, tambahkan tangkap-semua kondisi kedalam blok jika (if).", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Mengembalikan betul jika input kedua-duanya sama dengan satu sama lain.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Mengembalikan nilai benar (true) jika kedua input tidak sama satu dengan yang lain.", - "LOGIC_COMPARE_TOOLTIP_LT": "Mengembalikan nilai benar (true) jika input yang pertama lebih kecil dari input yang kedua.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Mengembalikan nilai benar (true) jika input yang pertama lebih kecil atau sama dengan input yang kedua .", - "LOGIC_COMPARE_TOOLTIP_GT": "Mengembalikan nilai benar (true) jika input yang pertama lebih besar dari input yang kedua.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Mengembalikan nilai benar (true) jika input yang pertama lebih besar dari atau sama dengan input yang kedua.", - "LOGIC_OPERATION_TOOLTIP_AND": "Kembalikan betul jika kedua-dua input adalah betul.", - "LOGIC_OPERATION_AND": "dan", - "LOGIC_OPERATION_TOOLTIP_OR": "Mengembalikan nilai benar (true) jika setidaknya salah satu masukan nilainya benar (true).", - "LOGIC_OPERATION_OR": "atau", - "LOGIC_NEGATE_TITLE": "bukan (not) %1", - "LOGIC_NEGATE_TOOLTIP": "Mengembalikan nilai benar (true) jika input false. Mengembalikan nilai salah (false) jika input true.", - "LOGIC_BOOLEAN_TRUE": "Benar", - "LOGIC_BOOLEAN_FALSE": "Salah", - "LOGIC_BOOLEAN_TOOLTIP": "Mengembalikan betul (true) atau salah (false).", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "null", - "LOGIC_NULL_TOOLTIP": "mengembalikan kosong.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "jika benar (true)", - "LOGIC_TERNARY_IF_FALSE": "jika tidak benar (false)", - "LOGIC_TERNARY_TOOLTIP": "Periksa kondisi di \"test\". Jika kondisi benar (true), mengembalikan nilai \"jika benar\" ; Jik sebaliknya akan mengembalikan nilai \"jika salah\".", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "Suatu angka.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "https://id.wikipedia.org/wiki/Aritmetika", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Kembalikan jumlah dari kedua angka.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Kembalikan selisih dari kedua angka.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Kembalikan perkalian dari kedua angka.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Kembalikan hasil bagi dari kedua angka.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Kembalikan angka pertama pangkat angka kedua.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "akar", - "MATH_SINGLE_TOOLTIP_ROOT": "Kembalikan akar dari angka.", - "MATH_SINGLE_OP_ABSOLUTE": "mutlak", - "MATH_SINGLE_TOOLTIP_ABS": "Kembalikan nilai absolut angka.", - "MATH_SINGLE_TOOLTIP_NEG": "Kembalikan penyangkalan terhadap angka.", - "MATH_SINGLE_TOOLTIP_LN": "Kembalikan logaritma natural dari angka.", - "MATH_SINGLE_TOOLTIP_LOG10": "Kembalikan dasar logaritma 10 dari angka.", - "MATH_SINGLE_TOOLTIP_EXP": "Kembalikan 10 pangkat angka.", - "MATH_SINGLE_TOOLTIP_POW10": "Kembalikan 10 pangkat angka.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "Kembalikan sinus dari derajat (bukan radian).", - "MATH_TRIG_TOOLTIP_COS": "Kembalikan cos dari derajat (bukan radian).", - "MATH_TRIG_TOOLTIP_TAN": "Kembalikan tangen dari derajat (tidak radian).", - "MATH_TRIG_TOOLTIP_ASIN": "Kembalikan asin dari angka.", - "MATH_TRIG_TOOLTIP_ACOS": "Kembalikan acosine dari angka.", - "MATH_TRIG_TOOLTIP_ATAN": "Kembalikan atan dari angka.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Kembalikan salah satu konstanta: π (3,141…), e (2,718…), φ (1,618…), akar(2) (1,414…), akar(½) (0.707…), atau ∞ (tak terhingga).", - "MATH_IS_EVEN": "adalah bilangan genap", - "MATH_IS_ODD": "adalah bilangan ganjil", - "MATH_IS_PRIME": "adalah bilangan pokok", - "MATH_IS_WHOLE": "adalah bilangan bulat", - "MATH_IS_POSITIVE": "adalah bilangan positif", - "MATH_IS_NEGATIVE": "adalah bilangan negatif", - "MATH_IS_DIVISIBLE_BY": "dibagi oleh", - "MATH_IS_TOOLTIP": "Periksa apakah angka adalah bilangan genap, bilangan pokok, bilangan bulat, bilangan positif, bilangan negatif, atau apakan bisa dibagi oleh angka tertentu. Mengembalikan benar (true) atau salah (false).", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "ubah %1 oleh %2", - "MATH_CHANGE_TOOLTIP": "Tambahkan angka kedalam variabel '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Bulatkan suatu bilangan naik atau turun.", - "MATH_ROUND_OPERATOR_ROUND": "membulatkan", - "MATH_ROUND_OPERATOR_ROUNDUP": "mengumpulkan", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "membulatkan kebawah", - "MATH_ONLIST_OPERATOR_SUM": "jumlah dari list (daftar)", - "MATH_ONLIST_TOOLTIP_SUM": "Kembalikan jumlah dari seluruh bilangan dari list.", - "MATH_ONLIST_OPERATOR_MIN": "minimum dari list (daftar)", - "MATH_ONLIST_TOOLTIP_MIN": "Kembalikan angka terkecil dari list.", - "MATH_ONLIST_OPERATOR_MAX": "maximum dari list (daftar)", - "MATH_ONLIST_TOOLTIP_MAX": "Kembalikan angka terbesar dari list.", - "MATH_ONLIST_OPERATOR_AVERAGE": "rata-rata dari list (daftar)", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Kembalikan rata-rata (mean aritmetik) dari nilai numerik dari list (daftar).", - "MATH_ONLIST_OPERATOR_MEDIAN": "median dari list (daftar)", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Kembalikan median dari list.", - "MATH_ONLIST_OPERATOR_MODE": "mode-mode dari list (daftar)", - "MATH_ONLIST_TOOLTIP_MODE": "Kembalikan list berisi item-item yang paling umum dari dalam list.", - "MATH_ONLIST_OPERATOR_STD_DEV": "deviasi standar dari list (daftar)", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Kembalikan standard deviasi dari list.", - "MATH_ONLIST_OPERATOR_RANDOM": "item acak dari list (daftar)", - "MATH_ONLIST_TOOLTIP_RANDOM": "Kembalikan element acak dari list.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "sisa %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Kembalikan sisa dari pembagian ke dua angka.", - "MATH_CONSTRAIN_TITLE": "Batasi %1 rendah %2 tinggi %3", - "MATH_CONSTRAIN_TOOLTIP": "Batasi angka antara batas yang ditentukan (inklusif).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "acak bulat dari %1 sampai %2", - "MATH_RANDOM_INT_TOOLTIP": "Mengembalikan bilangan acak antara dua batas yang ditentukan, inklusif.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "Nilai pecahan acak", - "MATH_RANDOM_FLOAT_TOOLTIP": "Mengembalikan nilai acak pecahan antara 0.0 (inklusif) dan 1.0 (ekslusif).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "Huruf, kata atau baris teks.", - "TEXT_JOIN_TITLE_CREATEWITH": "Buat teks dengan", - "TEXT_JOIN_TOOLTIP": "Buat teks dengan cara gabungkan sejumlah item.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "join", - "TEXT_CREATE_JOIN_TOOLTIP": "Tambah, ambil, atau susun ulang teks blok.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Tambahkan suatu item ke dalam teks.", - "TEXT_APPEND_TO": "untuk", - "TEXT_APPEND_APPENDTEXT": "tambahkan teks", - "TEXT_APPEND_TOOLTIP": "Tambahkan beberapa teks ke variabel '%1'.", - "TEXT_LENGTH_TITLE": "panjang dari %1", - "TEXT_LENGTH_TOOLTIP": "Kembalikan sejumlah huruf (termasuk spasi) dari teks yang disediakan.", - "TEXT_ISEMPTY_TITLE": "%1 kosong", - "TEXT_ISEMPTY_TOOLTIP": "Kembalikan benar (true) jika teks yang disediakan kosong.", - "TEXT_INDEXOF_TOOLTIP": "Kembalikan indeks pertama dan terakhir dari kejadian pertama/terakhir dari teks pertama dalam teks kedua. Kembalikan 0 jika teks tidak ditemukan.", - "TEXT_INDEXOF_INPUT_INTEXT": "dalam teks", - "TEXT_INDEXOF_OPERATOR_FIRST": "temukan kejadian pertama dalam teks", - "TEXT_INDEXOF_OPERATOR_LAST": "temukan kejadian terakhir dalam teks", - "TEXT_CHARAT_INPUT_INTEXT": "dalam teks", - "TEXT_CHARAT_FROM_START": "ambil huruf ke #", - "TEXT_CHARAT_FROM_END": "ambil huruf nomor # dari belakang", - "TEXT_CHARAT_FIRST": "ambil huruf pertama", - "TEXT_CHARAT_LAST": "ambil huruf terakhir", - "TEXT_CHARAT_RANDOM": "ambil huruf secara acak", - "TEXT_CHARAT_TOOLTIP": "Kembalikan karakter dari posisi tertentu.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Mengembalikan spesifik bagian dari teks.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "in teks", - "TEXT_GET_SUBSTRING_START_FROM_START": "ambil bagian teks (substring) dari huruf no #", - "TEXT_GET_SUBSTRING_START_FROM_END": "ambil bagian teks (substring) dari huruf ke # dari terakhir", - "TEXT_GET_SUBSTRING_START_FIRST": "ambil bagian teks (substring) dari huruf pertama", - "TEXT_GET_SUBSTRING_END_FROM_START": "pada huruf #", - "TEXT_GET_SUBSTRING_END_FROM_END": "pada huruf nomer # dari terakhir", - "TEXT_GET_SUBSTRING_END_LAST": "pada huruf terakhir", - "TEXT_CHANGECASE_TOOLTIP": "Kembalikan kopi dari text dengan kapitalisasi yang berbeda.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "menjadi huruf kapital", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "menjadi huruf kecil", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "menjadi huruf pertama kapital", - "TEXT_TRIM_TOOLTIP": "Kembali salinan teks dengan spasi dihapus dari satu atau kedua ujungnya.", - "TEXT_TRIM_OPERATOR_BOTH": "pangkas ruang dari kedua belah sisi", - "TEXT_TRIM_OPERATOR_LEFT": "pangkas ruang dari sisi kiri", - "TEXT_TRIM_OPERATOR_RIGHT": "pangkas ruang dari sisi kanan", - "TEXT_PRINT_TITLE": "cetak %1", - "TEXT_PRINT_TOOLTIP": "Cetak teks yant ditentukan, angka atau ninlai lainnya.", - "TEXT_PROMPT_TYPE_TEXT": "meminta teks dengan pesan", - "TEXT_PROMPT_TYPE_NUMBER": "Meminta angka dengan pesan", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Meminta pengguna untuk memberi sebuah angka.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Meminta pengguna untuk memberi beberapa teks.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "buat list kosong", - "LISTS_CREATE_EMPTY_TOOLTIP": "Mengembalikan daftar, dengan panjang 0, tidak berisi data", - "LISTS_CREATE_WITH_TOOLTIP": "Buat sebuah daftar (list) dengan sejumlah item.", - "LISTS_CREATE_WITH_INPUT_WITH": "buat daftar (list) dengan", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "list", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Tambahkan, hapus, atau susun ulang bagian untuk mengkonfigurasi blok LIST (daftar) ini.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Tambahkan sebuah item ke daftar (list).", - "LISTS_REPEAT_TOOLTIP": "Ciptakan daftar yang terdiri dari nilai yang diberikan diulang jumlah waktu yang ditentukan.", - "LISTS_REPEAT_TITLE": "membuat daftar dengan item %1 diulang %2 kali", - "LISTS_LENGTH_TITLE": "panjang dari %1", - "LISTS_LENGTH_TOOLTIP": "Mengembalikan panjang daftar.", - "LISTS_ISEMPTY_TITLE": "%1 kosong", - "LISTS_ISEMPTY_TOOLTIP": "Mengembalikan nilai benar (true) jika list kosong.", - "LISTS_INLIST": "dalam daftar", - "LISTS_INDEX_OF_FIRST": "cari kejadian pertama item", - "LISTS_INDEX_OF_LAST": "Cari kejadian terakhir item", - "LISTS_INDEX_OF_TOOLTIP": "Mengembalikan indeks dari kejadian pertama/terakhir item dalam daftar. Menghasilkan 0 jika teks tidak ditemukan.", - "LISTS_GET_INDEX_GET": "dapatkan", - "LISTS_GET_INDEX_GET_REMOVE": "dapatkan dan hapus", - "LISTS_GET_INDEX_REMOVE": "Hapus", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# dari akhir", - "LISTS_GET_INDEX_FIRST": "pertama", - "LISTS_GET_INDEX_LAST": "terakhir", - "LISTS_GET_INDEX_RANDOM": "acak", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Sisipkan item ke dalam posisi yang telah ditentukan didalam list (daftar). Item pertama adalah item terakhir (yg paling akhir).", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Sisipkan item ke dalam posisi yang telah ditentukan didalam list (daftar). Item pertama adalah item yang terakhir.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Kembalikan item pertama dalam daftar (list).", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Mengembalikan item pertama dalam list (daftar).", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Mengembalikan item acak dalam list (daftar).", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Menghilangkan dan mengembalikan barang di posisi tertentu dalam list (daftar). #1 adalah item pertama.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Menghilangkan dan mengembalikan barang di posisi tertentu dalam list (daftar). #1 adalah item terakhir.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Menghilangkan dan mengembalikan item pertama dalam list (daftar).", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Menghilangkan dan mengembalikan item terakhir dalam list (daftar).", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Menghilangkan dan mengembalikan barang dengan acak dalam list (daftar).", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Menghapus item dengan posisi tertentu dalam daftar. Item pertama adalah item yang terakhir.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Menghapus item dengan posisi tertentu dalam daftar. Item pertama adalah item yang terakhir.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Menghapus item pertama dalam daftar.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Menghapus item terakhir dalam daftar.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Menghapus sebuah item secara acak dalam list.", - "LISTS_SET_INDEX_SET": "tetapkan", - "LISTS_SET_INDEX_INSERT": "sisipkan di", - "LISTS_SET_INDEX_INPUT_TO": "sebagai", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Tetapkan item ke dalam posisi yang telah ditentukan di dalam list. #1 adalah item yang pertama.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Tetapkan item ke dalam posisi yang telah ditentukan di dalam list. #1 adalah item yang terakhir.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Tetapkan item pertama di dalam list.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Menetapkan item terakhir dalam list.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Tetapkan secara acak sebuah item dalam list.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Sisipkan item ke dalam posisi yang telah ditentukan di dalam list. #1 adalah item yang pertama.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Sisipkan item ke dalam posisi yang telah ditentukan di dalam list. #1 adalah item yang terakhir.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Sisipkan item di bagian awal dari list.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Tambahkan item ke bagian akhir list.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Sisipkan item secara acak ke dalam list.", - "LISTS_GET_SUBLIST_START_FROM_START": "Dapatkan bagian daftar dari #", - "LISTS_GET_SUBLIST_START_FROM_END": "Dapatkan bagian list nomor # dari akhir", - "LISTS_GET_SUBLIST_START_FIRST": "Dapatkan bagian pertama dari list", - "LISTS_GET_SUBLIST_END_FROM_START": "ke #", - "LISTS_GET_SUBLIST_END_FROM_END": "ke # dari akhir", - "LISTS_GET_SUBLIST_END_LAST": "ke yang paling akhir", - "LISTS_GET_SUBLIST_TOOLTIP": "Membuat salinan dari bagian tertentu dari list.", - "LISTS_SPLIT_LIST_FROM_TEXT": "membuat daftar dari teks", - "LISTS_SPLIT_TEXT_FROM_LIST": "buat teks dari daftar", - "LISTS_SPLIT_WITH_DELIMITER": "dengan pembatas", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Membagi teks ke dalam daftar teks, pisahkan pada setiap pembatas.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Gabung daftar teks menjadi satu teks, yang dipisahkan oleh pembatas.", - "VARIABLES_GET_TOOLTIP": "Mengembalikan nilai variabel ini.", - "VARIABLES_GET_CREATE_SET": "Membuat 'tetapkan %1'", - "VARIABLES_SET": "tetapkan %1 untuk %2", - "VARIABLES_SET_TOOLTIP": "tetapkan variabel ini dengan input yang sama.", - "VARIABLES_SET_CREATE_GET": "Membuat 'dapatkan %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFNORETURN_TITLE": "untuk", - "PROCEDURES_DEFNORETURN_PROCEDURE": "buat sesuatu", - "PROCEDURES_BEFORE_PARAMS": "dengan:", - "PROCEDURES_CALL_BEFORE_PARAMS": "dengan:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Menciptakan sebuah fungsi dengan tiada output.", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFRETURN_RETURN": "kembali", - "PROCEDURES_DEFRETURN_TOOLTIP": "Menciptakan sebuah fungsi dengan satu output.", - "PROCEDURES_ALLOW_STATEMENTS": "memungkinkan pernyataan", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Peringatan: Fungsi ini memiliki parameter duplikat.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Menjalankan fungsi '%1' yang ditetapkan pengguna.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Menjalankan fungsi '%1' yang ditetapkan pengguna dan menggunakan outputnya.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "input", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Menambah, menghapus, atau menyusun ulang masukan untuk fungsi ini.", - "PROCEDURES_MUTATORARG_TITLE": "masukan Nama:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Tambahkan masukan ke fungsi.", - "PROCEDURES_HIGHLIGHT_DEF": "Sorot definisi fungsi", - "PROCEDURES_CREATE_DO": "Buat '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Jika nilai yang benar, kemudian kembalikan nilai kedua.", - "PROCEDURES_IFRETURN_WARNING": "Peringatan: Blok ini dapat digunakan hanya dalam definisi fungsi." -} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ja.json b/src/opsoro/apps/visual_programming/static/blockly/msg/json/ja.json deleted file mode 100644 index dfe02f5..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ja.json +++ /dev/null @@ -1,327 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Shirayuki", - "Oda", - "아라", - "Otokoume", - "Sujiniku" - ] - }, - "VARIABLES_DEFAULT_NAME": "項目", - "TODAY": "今日", - "DUPLICATE_BLOCK": "複製", - "ADD_COMMENT": "コメントを追加", - "REMOVE_COMMENT": "コメントを削除します。", - "EXTERNAL_INPUTS": "外部入力", - "INLINE_INPUTS": "インライン入力", - "DELETE_BLOCK": "ブロックを消す", - "DELETE_X_BLOCKS": "%1 個のブロックを消す", - "COLLAPSE_BLOCK": "ブロックを折りたたむ", - "COLLAPSE_ALL": "ブロックを折りたたむ", - "EXPAND_BLOCK": "ブロックを展開します。", - "EXPAND_ALL": "ブロックを展開します。", - "DISABLE_BLOCK": "ブロックを無効にします。", - "ENABLE_BLOCK": "ブロックを有効にします。", - "HELP": "ヘルプ", - "CHAT": "このボックスに入力して共同編集者とチャットしよう!", - "ME": "私に", - "CHANGE_VALUE_TITLE": "値を変更します。", - "NEW_VARIABLE": "新しい変数", - "NEW_VARIABLE_TITLE": "新しい変数の、名前", - "RENAME_VARIABLE": "変数の名前を変更.", - "RENAME_VARIABLE_TITLE": "%1の変数すべてを名前変更します。", - "COLOUR_PICKER_HELPURL": "https://ja.wikipedia.org/wiki/色", - "COLOUR_PICKER_TOOLTIP": "パレットから色を選んでください。", - "COLOUR_RANDOM_TITLE": "ランダムな色", - "COLOUR_RANDOM_TOOLTIP": "ランダムな色を選択します。", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "カラーと", - "COLOUR_RGB_RED": "赤", - "COLOUR_RGB_GREEN": "緑", - "COLOUR_RGB_BLUE": "青", - "COLOUR_RGB_TOOLTIP": "赤、緑、および青の指定された量で色を作成します。すべての値は 0 ~ 100 の間でなければなりません。", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "ブレンド", - "COLOUR_BLEND_COLOUR1": "色 1", - "COLOUR_BLEND_COLOUR2": "色 2", - "COLOUR_BLEND_RATIO": "割合", - "COLOUR_BLEND_TOOLTIP": "ブレンド2 つの色を指定された比率に混ぜる」 (0.0 ~ 1.0)。", - "CONTROLS_REPEAT_HELPURL": "https://ja.wikipedia.org/wiki/for文", - "CONTROLS_REPEAT_TITLE": "%1 回、繰り返します", - "CONTROLS_REPEAT_INPUT_DO": "してください", - "CONTROLS_REPEAT_TOOLTIP": "いくつかのステートメントを数回行います。", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "つつその間、繰り返す4", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "までを繰り返します", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "値は true のあいだ、いくつかのステートメントを行います。", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "値は false のあいだ、いくつかのステートメントを行います。", - "CONTROLS_FOR_TOOLTIP": "変数 \"%1\"は、指定した間隔ごとのカウントを開始番号から 終了番号まで、値をとり、指定したブロックを行う必要があります。", - "CONTROLS_FOR_TITLE": "で、カウントします。 %1 %2 から%3、 %4 で", - "CONTROLS_FOREACH_TITLE": "各項目の %1 リストで %2", - "CONTROLS_FOREACH_TOOLTIP": "リストの各項目に対して変数 '%1' のアイテムに設定し、いくつかのステートメントをしてください。", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ループから抜け出す", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "ループの次の反復処理を続行します。", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "含むループから抜け出します。", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "このループの残りの部分をスキップし、次のイテレーションに進みます。", - "CONTROLS_FLOW_STATEMENTS_WARNING": "注意: このブロックは、ループ内でのみ使用します。", - "CONTROLS_IF_TOOLTIP_1": "値が true の場合はその後ステートメントを行をいくつかします。", - "CONTROLS_IF_TOOLTIP_2": "値が true 場合は、ステートメントの最初のブロックを行います。それ以外の場合は、ステートメントの 2 番目のブロックを行います。", - "CONTROLS_IF_TOOLTIP_3": "最初の値が true 場合は、ステートメントの最初のブロックを行います。それ以外の場合は、2 番目の値が true の場合、ステートメントの 2 番目のブロックをします。", - "CONTROLS_IF_TOOLTIP_4": "最初の値が true 場合は、ステートメントの最初のブロックを行います。2 番目の値が true の場合は、ステートメントの 2 番目のブロックを行います。それ以外の場合は最後のブロックのステートメントを行います。", - "CONTROLS_IF_MSG_IF": "もし", - "CONTROLS_IF_MSG_ELSEIF": "他でもし", - "CONTROLS_IF_MSG_ELSE": "他", - "CONTROLS_IF_IF_TOOLTIP": "追加、削除、またはセクションを順序変更して、ブロックをこれを再構成します。", - "CONTROLS_IF_ELSEIF_TOOLTIP": "場合に条件にブロック追加。", - "CONTROLS_IF_ELSE_TOOLTIP": "Ifブロックに、すべてをキャッチする条件を追加。", - "LOGIC_COMPARE_HELPURL": "https://ja.wikipedia.org/wiki/不等式", - "LOGIC_COMPARE_TOOLTIP_EQ": "もし両方がお互いに等しく入力した場合は true を返します。", - "LOGIC_COMPARE_TOOLTIP_NEQ": "両方の入力が互いに等しくない場合に true を返します。", - "LOGIC_COMPARE_TOOLTIP_LT": "最初の入力が 2 番目の入力よりも小さいい場合は true を返します。", - "LOGIC_COMPARE_TOOLTIP_LTE": "もし、最初の入力が二つ目入力より少ないか、おなじであったらTRUEをかえしてください", - "LOGIC_COMPARE_TOOLTIP_GT": "最初の入力が 2 番目の入力よりも大きい場合は true を返します。", - "LOGIC_COMPARE_TOOLTIP_GTE": "もし入力がふたつめの入よりも大きかったらtrueをり返します。", - "LOGIC_OPERATION_TOOLTIP_AND": "両方の入力がおんなじ場わいわtrue を返します。", - "LOGIC_OPERATION_AND": "そして", - "LOGIC_OPERATION_TOOLTIP_OR": "最低少なくとも 1 つの入力が true の場合は true を返します。", - "LOGIC_OPERATION_OR": "または", - "LOGIC_NEGATE_HELPURL": "https://ja.wikipedia.org/wiki/否定", - "LOGIC_NEGATE_TITLE": "%1 ではないです。", - "LOGIC_NEGATE_TOOLTIP": "入力が false の場合は、true を返します。入力が true の場合は false を返します。", - "LOGIC_BOOLEAN_TRUE": "true", - "LOGIC_BOOLEAN_FALSE": "false", - "LOGIC_BOOLEAN_TOOLTIP": "True または false を返します。", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "null", - "LOGIC_NULL_TOOLTIP": "Null を返します。", - "LOGIC_TERNARY_HELPURL": "https://ja.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "テスト", - "LOGIC_TERNARY_IF_TRUE": "true の場合", - "LOGIC_TERNARY_IF_FALSE": "false の場合", - "LOGIC_TERNARY_TOOLTIP": "'テスト' の条件をチェックします。条件が true の場合、'true' の値を返します。それ以外の場合 'false' のを返します。", - "MATH_NUMBER_HELPURL": "https://ja.wikipedia.org/wiki/数", - "MATH_NUMBER_TOOLTIP": "数です。", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "https://ja.wikipedia.org/wiki/算術", - "MATH_ARITHMETIC_TOOLTIP_ADD": "2 つの数の合計を返します。", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "2 つの数の差を返します。", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "2 つの数の積を返します。", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "2 つの数の商を返します。", - "MATH_ARITHMETIC_TOOLTIP_POWER": "最初の数を2 番目の値で累乗した結果を返します。", - "MATH_SINGLE_HELPURL": "https://ja.wikipedia.org/wiki/平方根", - "MATH_SINGLE_OP_ROOT": "平方根", - "MATH_SINGLE_TOOLTIP_ROOT": "平方根を返す", - "MATH_SINGLE_OP_ABSOLUTE": "絶対値", - "MATH_SINGLE_TOOLTIP_ABS": "絶対値を返す", - "MATH_SINGLE_TOOLTIP_NEG": "負の数を返す", - "MATH_SINGLE_TOOLTIP_LN": "数値の自然対数をかえしてください", - "MATH_SINGLE_TOOLTIP_LOG10": "log 10 を返す。", - "MATH_SINGLE_TOOLTIP_EXP": "数値の e 粂を返す", - "MATH_SINGLE_TOOLTIP_POW10": "10の x 乗", - "MATH_TRIG_HELPURL": "https://ja.wikipedia.org/wiki/三角関数", - "MATH_TRIG_TOOLTIP_SIN": "番号のsineの次数を返す", - "MATH_TRIG_TOOLTIP_COS": "番号のcosineの次数を返す", - "MATH_TRIG_TOOLTIP_TAN": "番号のtangentの次数を返す", - "MATH_TRIG_TOOLTIP_ASIN": "番号のarcsine を返すます", - "MATH_TRIG_TOOLTIP_ACOS": "arccosine の値を返す", - "MATH_TRIG_TOOLTIP_ATAN": "番号のarctangent を返すます", - "MATH_CONSTANT_HELPURL": "https://ja.wikipedia.org/wiki/数学定数", - "MATH_CONSTANT_TOOLTIP": "いずれかの共通の定数のを返す: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (無限).", - "MATH_IS_EVEN": "わ偶数", - "MATH_IS_ODD": "奇数です。", - "MATH_IS_PRIME": "素数です", - "MATH_IS_WHOLE": "は整数", - "MATH_IS_POSITIVE": "正の値", - "MATH_IS_NEGATIVE": "負の値", - "MATH_IS_DIVISIBLE_BY": "割り切れる", - "MATH_IS_TOOLTIP": "数字が、偶数、奇数、素数、整数、正数、負数、またはそれが特定の数で割り切れる場合かどうかを確認してください。どの制限が一つでも本当でしたら true をかえしてください、そうでない場合わ falseを返してください。", - "MATH_CHANGE_HELPURL": "https://ja.wikipedia.org/wiki/加法", - "MATH_CHANGE_TITLE": "変更 %1 に %2", - "MATH_CHANGE_TOOLTIP": "'%1' をたします。", - "MATH_ROUND_HELPURL": "https://ja.wikipedia.org/wiki/端数処理", - "MATH_ROUND_TOOLTIP": "数値を切り上げるか切り捨てる", - "MATH_ROUND_OPERATOR_ROUND": "概数", - "MATH_ROUND_OPERATOR_ROUNDUP": "数値を切り上げ", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "端数を切り捨てる", - "MATH_ONLIST_HELPURL": "", - "MATH_ONLIST_OPERATOR_SUM": "リストの合計", - "MATH_ONLIST_TOOLTIP_SUM": "全部リストの数をたして返す", - "MATH_ONLIST_OPERATOR_MIN": "リストの最小の数", - "MATH_ONLIST_TOOLTIP_MIN": "リストの最小数を返します。", - "MATH_ONLIST_OPERATOR_MAX": "リストの最大値", - "MATH_ONLIST_TOOLTIP_MAX": "リストの最大数を返します。", - "MATH_ONLIST_OPERATOR_AVERAGE": "リストの平均", - "MATH_ONLIST_TOOLTIP_AVERAGE": "リストの数値の平均 (算術平均) を返します。", - "MATH_ONLIST_OPERATOR_MEDIAN": "リストの中央値", - "MATH_ONLIST_TOOLTIP_MEDIAN": "リストの中央値の数を返します。", - "MATH_ONLIST_OPERATOR_MODE": "一覧モード", - "MATH_ONLIST_TOOLTIP_MODE": "リストで最も一般的な項目のリストを返します。", - "MATH_ONLIST_OPERATOR_STD_DEV": "リストの標準偏差", - "MATH_ONLIST_TOOLTIP_STD_DEV": "リウトの標準偏差をかえす", - "MATH_ONLIST_OPERATOR_RANDOM": "リストのランダム アイテム", - "MATH_ONLIST_TOOLTIP_RANDOM": "リストからランダムに要素を返します。", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "残りの %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "2 つの数値を除算した残りを返します。", - "MATH_CONSTRAIN_TITLE": "制限%1下リミット%2上限リミット%3", - "MATH_CONSTRAIN_TOOLTIP": "値を、上限 x と下限 y のあいだに制限んする(上限と下限が、x と y とに同じ場合わ、上限の値は x, 下限の値はy)。", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "%1 から %2 への無作為の整数", - "MATH_RANDOM_INT_TOOLTIP": "指定した下限の間、無作為なランダムな整数を返します。", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "ランダムな分数", - "MATH_RANDOM_FLOAT_TOOLTIP": "ランダムな分数を返すー0.0 (包括) の間のと 1.0 (排他的な)。", - "TEXT_TEXT_HELPURL": "https://ja.wikipedia.org/wiki/文字列", - "TEXT_TEXT_TOOLTIP": "文字、単語、または行のテキスト。", - "TEXT_JOIN_TITLE_CREATEWITH": "テキストを作成します。", - "TEXT_JOIN_TOOLTIP": "任意の数の項目一部を一緒に接合してテキストの作成します。", - "TEXT_CREATE_JOIN_TITLE_JOIN": "結合", - "TEXT_CREATE_JOIN_TOOLTIP": "追加、削除、またはセクションを順序変更して、ブロックを再構成します。", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "テキスト をアイテム追加します。", - "TEXT_APPEND_TO": "宛先", - "TEXT_APPEND_APPENDTEXT": "テキストを追加します。", - "TEXT_APPEND_TOOLTIP": "変数 '%1' にいくつかのテキストを追加します。", - "TEXT_LENGTH_TITLE": "%1 の長さ", - "TEXT_LENGTH_TOOLTIP": "指定されたテキストの文字 (スペースを含む) の数を返します。", - "TEXT_ISEMPTY_TITLE": "%1 が空", - "TEXT_ISEMPTY_TOOLTIP": "指定されたテキストが空の場合は、true を返します。", - "TEXT_INDEXOF_TOOLTIP": "最初のテキストの二番目のてきすとの、最初と最後の、出現したインデックスをかえします。テキストが見つからない場合は 0 を返します。", - "TEXT_INDEXOF_INPUT_INTEXT": "テキストで", - "TEXT_INDEXOF_OPERATOR_FIRST": "テキストの最初の出現箇所を検索します。", - "TEXT_INDEXOF_OPERATOR_LAST": "テキストの最後に見つかったを検索します。", - "TEXT_INDEXOF_TAIL": "", - "TEXT_CHARAT_INPUT_INTEXT": "テキストで", - "TEXT_CHARAT_FROM_START": "文字# を取得", - "TEXT_CHARAT_FROM_END": "一番最後の言葉、キャラクターを所得", - "TEXT_CHARAT_FIRST": "最初の文字を得る", - "TEXT_CHARAT_LAST": "最後の文字を得る", - "TEXT_CHARAT_RANDOM": "ランダムな文字を得る", - "TEXT_CHARAT_TAIL": "", - "TEXT_CHARAT_TOOLTIP": "指定された位置に文字を返します。", - "TEXT_GET_SUBSTRING_TOOLTIP": "テキストの指定部分を返します。", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "テキストで", - "TEXT_GET_SUBSTRING_START_FROM_START": "文字列からの部分文字列を取得 #", - "TEXT_GET_SUBSTRING_START_FROM_END": "部分文字列を取得する #端から得る", - "TEXT_GET_SUBSTRING_START_FIRST": "部分文字列を取得する。", - "TEXT_GET_SUBSTRING_END_FROM_START": "# の文字", - "TEXT_GET_SUBSTRING_END_FROM_END": "文字列の# 終わりからの#", - "TEXT_GET_SUBSTRING_END_LAST": "最後のの文字", - "TEXT_GET_SUBSTRING_TAIL": "", - "TEXT_CHANGECASE_TOOLTIP": "別のケースに、テキストのコピーを返します。", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "大文字に変換する", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "小文字に", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "タイトル ケースに", - "TEXT_TRIM_TOOLTIP": "スペースを 1 つまたは両方の端から削除したのち、テキストのコピーを返します。", - "TEXT_TRIM_OPERATOR_BOTH": "両端のスペースを取り除く", - "TEXT_TRIM_OPERATOR_LEFT": "左端のスペースを取り除く", - "TEXT_TRIM_OPERATOR_RIGHT": "右端のスペースを取り除く", - "TEXT_PRINT_TITLE": "%1 を印刷します。", - "TEXT_PRINT_TOOLTIP": "指定したテキスト、番号または他の値を印刷します。", - "TEXT_PROMPT_TYPE_TEXT": "メッセージをプロンプトしてにテキストを求める", - "TEXT_PROMPT_TYPE_NUMBER": "メッセージを送って番号の入力を求める", - "TEXT_PROMPT_TOOLTIP_NUMBER": "ユーザーにプロンプトして数字のインプットを求めます", - "TEXT_PROMPT_TOOLTIP_TEXT": "いくつかのテキストを、ユーザーに入力するようにプロンプト。", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "空のリストを作成します。", - "LISTS_CREATE_EMPTY_TOOLTIP": "長さゼロ、データ レコード空のリストを返します", - "LISTS_CREATE_WITH_TOOLTIP": "アイテム数かぎりないのリストを作成します。", - "LISTS_CREATE_WITH_INPUT_WITH": "これを使ってリストを作成します。", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "リスト", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "追加、削除、またはセクションを順序変更して、ブロックを再構成します。", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "リストにアイテムを追加します。", - "LISTS_REPEAT_TOOLTIP": "指定された値をなんどか繰り返してリストを作ります。", - "LISTS_REPEAT_TITLE": "アイテム %1 と一緒にリストを作成し %2 回繰り", - "LISTS_LENGTH_TITLE": " %1の長さ", - "LISTS_LENGTH_TOOLTIP": "リストの長さを返します。", - "LISTS_ISEMPTY_TITLE": "%1 が空", - "LISTS_ISEMPTY_TOOLTIP": "リストが空の場合は、true を返します。", - "LISTS_INLIST": "リストで", - "LISTS_INDEX_OF_FIRST": "最初に見つかった項目を検索します。", - "LISTS_INDEX_OF_LAST": "最後に見つかったアイテムを見つける", - "LISTS_INDEX_OF_TOOLTIP": "リスト項目の最初/最後に出現するインデックス位置を返します。テキストが見つからない場合は 0 を返します。", - "LISTS_GET_INDEX_GET": "取得", - "LISTS_GET_INDEX_GET_REMOVE": "取得と削除", - "LISTS_GET_INDEX_REMOVE": "削除", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "終しまいから #", - "LISTS_GET_INDEX_FIRST": "最初", - "LISTS_GET_INDEX_LAST": "最後", - "LISTS_GET_INDEX_RANDOM": "ランダム", - "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "リスト内の指定位置にある項目を返します。# 1 は、最初の項目です。", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "リスト内の指定位置にある項目を返します。# 1 は、最後の項目です。", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "リストの最初の項目を返信します。", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "リストの最後の項目を返します。", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "ランダム アイテム リストを返します。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "リスト内の指定位置にある項目を削除し、返します。# 1 は、最後の項目です。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "リスト内の指定位置にある項目を削除し、返します。# 1 は、最後の項目です。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "リスト内の最初の項目を削除したあと返します。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "リスト内の最後の項目を削除したあと返します。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "リストのランダムなアイテムを削除し、返します。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "リスト内の指定位置にある項目を返します。# 1 は、最初の項目です。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "リスト内の指定位置にある項目を削除します。# 1 は、最後の項目です。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "リスト内の最初の項目を削除します。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "リスト内の最後の項目を削除します。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "リスト内にある任意のアイテムを削除します。", - "LISTS_SET_INDEX_SET": "セット", - "LISTS_SET_INDEX_INSERT": "挿入します。", - "LISTS_SET_INDEX_INPUT_TO": "として", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "リスト内の指定された位置に項目を設定します。# 1 は、最初の項目です。", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "リスト内の指定された位置に項目を設定します。# 1 は、最後の項目です。", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "リスト内に最初の項目を設定します。", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "リスト内の最後の項目を設定します。", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "リスト内にランダムなアイテムを設定します。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "リスト内の指定位置に項目を挿入します。# 1 は、最初の項目です。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "リスト内の指定位置に項目を挿入します。# 1 は、最後の項目です。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "リストの先頭に項目を挿入します。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "リストの末尾に項目を追加します。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "リストに項目をランダムに挿入します。", - "LISTS_GET_SUBLIST_START_FROM_START": "# からサブディレクトリのリストを取得します。", - "LISTS_GET_SUBLIST_START_FROM_END": "端から #のサブリストを取得します。", - "LISTS_GET_SUBLIST_START_FIRST": "最初からサブリストを取得する。", - "LISTS_GET_SUBLIST_END_FROM_START": "#へ", - "LISTS_GET_SUBLIST_END_FROM_END": "最後から#へ", - "LISTS_GET_SUBLIST_END_LAST": "最後へ", - "LISTS_GET_SUBLIST_TAIL": "", - "LISTS_GET_SUBLIST_TOOLTIP": "リストの指定された部分のコピーを作成してくださ。", - "LISTS_SPLIT_LIST_FROM_TEXT": "テキストからリストを作る", - "LISTS_SPLIT_TEXT_FROM_LIST": "リストからテキストを作る", - "ORDINAL_NUMBER_SUFFIX": "", - "VARIABLES_GET_TOOLTIP": "この変数の値を返します。", - "VARIABLES_GET_CREATE_SET": "'セット%1を作成します。", - "VARIABLES_SET": "セット %1 宛先 %2", - "VARIABLES_SET_TOOLTIP": "この入力を変数と等しくなるように設定します。", - "VARIABLES_SET_CREATE_GET": "'%1 を取得' を作成します。", - "PROCEDURES_DEFNORETURN_HELPURL": "https://ja.wikipedia.org/wiki/サブルーチン", - "PROCEDURES_DEFNORETURN_TITLE": "宛先", - "PROCEDURES_DEFNORETURN_PROCEDURE": "何かしてください", - "PROCEDURES_BEFORE_PARAMS": "で。", - "PROCEDURES_CALL_BEFORE_PARAMS": "で。", - "PROCEDURES_DEFNORETURN_DO": "", - "PROCEDURES_DEFNORETURN_TOOLTIP": "出力なしで関数を作成します。", - "PROCEDURES_DEFRETURN_HELPURL": "https://ja.wikipedia.org/wiki/サブルーチン", - "PROCEDURES_DEFRETURN_RETURN": "返す", - "PROCEDURES_DEFRETURN_TOOLTIP": "出力を持つ関数を作成します。", - "PROCEDURES_DEF_DUPLICATE_WARNING": "警告: この関数は、重複するパラメーターがあります。", - "PROCEDURES_CALLNORETURN_HELPURL": "https://ja.wikipedia.org/wiki/サブルーチン", - "PROCEDURES_CALLNORETURN_CALL": "", - "PROCEDURES_CALLNORETURN_TOOLTIP": "ユーザー定義関数 '%1' を実行します。", - "PROCEDURES_CALLRETURN_HELPURL": "https://ja.wikipedia.org/wiki/サブルーチン", - "PROCEDURES_CALLRETURN_TOOLTIP": "ユーザー定義関数 '%1' を実行し、その出力を使用します。", - "PROCEDURES_MUTATORCONTAINER_TITLE": "入力", - "PROCEDURES_MUTATORARG_TITLE": "入力名:", - "PROCEDURES_HIGHLIGHT_DEF": "関数の内容を強調表示します。", - "PROCEDURES_CREATE_DO": "%1をつくる", - "PROCEDURES_IFRETURN_TOOLTIP": "1番目値が true の場合、2 番目の値を返します。", - "PROCEDURES_IFRETURN_WARNING": "警告: このブロックは、関数定義内でのみ使用できます。" -} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/lb.json b/src/opsoro/apps/visual_programming/static/blockly/msg/json/lb.json deleted file mode 100644 index 7db7b10..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/lb.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Robby", - "Soued031" - ] - }, - "VARIABLES_DEFAULT_NAME": "Element", - "TODAY": "Haut", - "DUPLICATE_BLOCK": "Duplizéieren", - "ADD_COMMENT": "Bemierkung derbäisetzen", - "REMOVE_COMMENT": "Bemierkunge ewechhuelen", - "DELETE_BLOCK": "Block läschen", - "DELETE_X_BLOCKS": "%1 Bléck läschen", - "COLLAPSE_BLOCK": "Block zesummeklappen", - "EXPAND_BLOCK": "Block opklappen", - "EXPAND_ALL": "Bléck opklappen", - "DISABLE_BLOCK": "Block desaktivéieren", - "ENABLE_BLOCK": "Block aktivéieren", - "HELP": "Hëllef", - "CHAT": "Mat ärem Mataarbechter chatten an deem Dir an dës Këscht tippt!", - "ME": "Mech", - "CHANGE_VALUE_TITLE": "Wäert änneren:", - "NEW_VARIABLE": "Nei Variabel...", - "NEW_VARIABLE_TITLE": "Neie variabelen Numm:", - "RENAME_VARIABLE": "Variabel ëmbenennen...", - "RENAME_VARIABLE_TITLE": "All '%1' Variabelen ëmbenennen op:", - "COLOUR_PICKER_TOOLTIP": "Wielt eng Faarf vun der Palette.", - "COLOUR_RANDOM_TITLE": "zoufälleg Faarf", - "COLOUR_RANDOM_TOOLTIP": "Eng zoufälleg Faarf eraussichen.", - "COLOUR_RGB_TITLE": "fierwe mat", - "COLOUR_RGB_RED": "rout", - "COLOUR_RGB_GREEN": "gréng", - "COLOUR_RGB_BLUE": "blo", - "COLOUR_BLEND_TITLE": "mëschen", - "COLOUR_BLEND_COLOUR1": "Faarf 1", - "COLOUR_BLEND_COLOUR2": "Faarf 2", - "COLOUR_BLEND_RATIO": "ratio", - "CONTROLS_REPEAT_TITLE": "%1 mol widderhuelen", - "CONTROLS_REPEAT_INPUT_DO": "maachen", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "widderhuele bis", - "CONTROLS_FOREACH_TITLE": "fir all Element %1 an der Lëscht %2", - "CONTROLS_IF_MSG_IF": "wann", - "CONTROLS_IF_MSG_ELSE": "soss", - "LOGIC_OPERATION_AND": "an", - "LOGIC_OPERATION_OR": "oder", - "LOGIC_NEGATE_TITLE": "net %1", - "LOGIC_BOOLEAN_TRUE": "wouer", - "LOGIC_BOOLEAN_FALSE": "falsch", - "LOGIC_BOOLEAN_TOOLTIP": "Schéckt entweder richteg oder falsch zréck.", - "LOGIC_NULL": "null", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "wa wouer", - "LOGIC_TERNARY_IF_FALSE": "wa falsch", - "MATH_NUMBER_TOOLTIP": "Eng Zuel.", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Gëtt d'Zomme vun zwou Zuelen.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "D'Produkt vun den zwou Zuelen zréckginn.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "Quadratwuerzel", - "MATH_SINGLE_OP_ABSOLUTE": "absolut", - "MATH_IS_EVEN": "ass gerued", - "MATH_IS_ODD": "ass net gerued", - "MATH_IS_PRIME": "ass eng Primzuel", - "MATH_IS_WHOLE": "ass eng ganz Zuel", - "MATH_IS_POSITIVE": "ass positiv", - "MATH_IS_NEGATIVE": "ass negativ", - "MATH_CHANGE_TITLE": "änneren %1 ëm %2", - "MATH_ROUND_TOOLTIP": "Eng Zuel op- oder ofronnen.", - "MATH_ROUND_OPERATOR_ROUND": "opronnen", - "MATH_ROUND_OPERATOR_ROUNDUP": "opronnen", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "ofronnen", - "MATH_ONLIST_OPERATOR_MAX": "Maximum aus der Lëscht", - "MATH_ONLIST_TOOLTIP_MAX": "Schéckt de gréisste Wäert aus enger Lëscht zréck.", - "MATH_ONLIST_OPERATOR_AVERAGE": "Duerchschnëtt vun der Lëscht", - "MATH_ONLIST_OPERATOR_RANDOM": "zoufällegt Element vun enger Lëscht", - "MATH_MODULO_TITLE": "Rescht vu(n) %1 ÷ %2", - "MATH_RANDOM_INT_TITLE": "zoufälleg ganz Zuel tëscht %1 a(n) %2", - "TEXT_TEXT_TOOLTIP": "E Buschtaf, e Wuert oder eng Textzeil.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "En Element bei den Text derbäisetzen.", - "TEXT_APPEND_APPENDTEXT": "Text drunhänken", - "TEXT_LENGTH_TITLE": "Längt vu(n) %1", - "TEXT_ISEMPTY_TITLE": "%1 ass eidel", - "TEXT_INDEXOF_INPUT_INTEXT": "am Text", - "TEXT_CHARAT_INPUT_INTEXT": "am Text", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "am Text", - "TEXT_GET_SUBSTRING_END_FROM_START": "bis de Buschtaf #", - "TEXT_GET_SUBSTRING_END_LAST": "op de leschte Buschtaw", - "TEXT_PRINT_TITLE": "%1 drécken", - "TEXT_PROMPT_TOOLTIP_TEXT": "Freet de Benotzer en Text.", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "Lëscht", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "En Element op d'Lëscht derbäisetzen.", - "LISTS_LENGTH_TITLE": "Längt vu(n) %1", - "LISTS_ISEMPTY_TITLE": "%1 ass eidel", - "LISTS_INLIST": "an der Lëscht", - "LISTS_GET_INDEX_REMOVE": "ewechhuelen", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# vum Schluss", - "LISTS_GET_INDEX_FIRST": "éischt", - "LISTS_GET_INDEX_LAST": "lescht", - "LISTS_GET_INDEX_RANDOM": "Zoufall", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Schéckt en zoufällegt Element aus enger Lëscht zréck.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Hëlt dat lescht Element aus enger Lëscht eraus.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Hëlt en zoufällegt Element aus enger Lëscht eraus.", - "LISTS_SET_INDEX_INSERT": "asetzen op", - "LISTS_SET_INDEX_INPUT_TO": "als", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Setzt en zuofällegt Element an eng Lëscht.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Setzt d'Element um Ënn vun enger Lëscht derbäi.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Setzt d'Element op eng zoufälleg Plaz an d'Lëscht derbäi.", - "PROCEDURES_DEFNORETURN_PROCEDURE": "eppes maachen", - "PROCEDURES_BEFORE_PARAMS": "mat:", - "PROCEDURES_CALL_BEFORE_PARAMS": "mat:", - "PROCEDURES_DEFRETURN_RETURN": "zréck" -} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/lt.json b/src/opsoro/apps/visual_programming/static/blockly/msg/json/lt.json deleted file mode 100644 index 07ae97f..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/lt.json +++ /dev/null @@ -1,207 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Eitvys200", - "Jurgis" - ] - }, - "VARIABLES_DEFAULT_NAME": "elementas", - "DUPLICATE_BLOCK": "Kopijuoti", - "ADD_COMMENT": "Pridėti komentarą", - "REMOVE_COMMENT": "Pašalinti komentarą", - "EXTERNAL_INPUTS": "Išdėstyti stulpeliu, kai daug parametrų", - "INLINE_INPUTS": "Išdėstyti vienoje eilutėje", - "DELETE_BLOCK": "Ištrinti bloką", - "DELETE_X_BLOCKS": "Ištrinti %1 blokus", - "COLLAPSE_BLOCK": "Suskleisti bloką", - "COLLAPSE_ALL": "Suskleisti blokus", - "EXPAND_BLOCK": "Išplėsti Bloką", - "EXPAND_ALL": "Išskleisti blokus", - "DISABLE_BLOCK": "Išjungti bloką", - "ENABLE_BLOCK": "Įjungti bloką", - "HELP": "Pagalba", - "CHAT": "Galite susirašinėti su projekto bendradarbiais.", - "AUTH": "Norint išsaugoti (ir dalintis) savo sukurtas programas, reikia prisijungti (autorizuotis).", - "ME": "Aš", - "CHANGE_VALUE_TITLE": "Keisti reikšmę:", - "NEW_VARIABLE": "Naujas kintamasis...", - "NEW_VARIABLE_TITLE": "Naujo kintamojo pavadinimas:", - "RENAME_VARIABLE": "Pervardyti kintamajį...", - "RENAME_VARIABLE_TITLE": "Pervadinti visus '%1' kintamuosius į:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Pasirinkti spalvą iš paletės.", - "COLOUR_RANDOM_TITLE": "atsitiktinė spalva", - "COLOUR_RANDOM_TOOLTIP": "Pasirinkti spalvą atsitiktinai.", - "COLOUR_RGB_TITLE": "RGB spalva:", - "COLOUR_RGB_RED": "raudona", - "COLOUR_RGB_GREEN": "žalia", - "COLOUR_RGB_BLUE": "mėlyna", - "COLOUR_RGB_TOOLTIP": "Spalvą galima sudaryti iš raudonos, žalios ir mėlynos dedamųjų. Kiekvienos intensyvumas nuo 0 iki 100.", - "COLOUR_BLEND_TITLE": "sumaišyk", - "COLOUR_BLEND_COLOUR1": "1 spalva", - "COLOUR_BLEND_COLOUR2": "2 spalva", - "COLOUR_BLEND_RATIO": "santykis", - "COLOUR_BLEND_TOOLTIP": "Sumaišo dvi spalvas su pateiktu santykiu (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "pakartokite %1 kartus", - "CONTROLS_REPEAT_INPUT_DO": ":", - "CONTROLS_REPEAT_TOOLTIP": "Leidžia atlikti išvardintus veiksmus kelis kartus.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "kartok kol", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "kartok, kol pasieksi", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Kartoja veiksmus, kol sąlyga tenkinama.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Kartoja veiksmus, kol bus pasiekta nurodyta sąlyga.", - "CONTROLS_FOR_TOOLTIP": "Kartoti veiksmus su kiekvienu sąrašo elementu, priskirtu kintamajam \"%1\".", - "CONTROLS_FOR_TITLE": "kartok, kai %1 kinta nuo %2 iki %3 po %4", - "CONTROLS_FOREACH_TITLE": "kartok su kiekvienu %1 iš sąrašo %2", - "CONTROLS_FOREACH_TOOLTIP": "Kartok veiksmus, kol kintamasis \"%1\" paeiliui gauna kiekvieną sąrašo reikšmę.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "nutraukti kartojimą", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "šį kartą praleisti likusius veiksmus ir tęsti kartojimą", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Nutraukia (artimiausią) vykstantį kartojimą.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Praleidžia žemiau išvardintus kartojimo veiksmus (ir tęsia darbą nuo kartojimo pradinio veiksmo).", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Atsargiai: šis blokas gali būt naudojamas tik kartojimo bloko viduje.", - "CONTROLS_IF_TOOLTIP_1": "Jeigu sąlyga tenkinama, tai atlik veiksmus.", - "CONTROLS_IF_TOOLTIP_2": "Jei sąlyga tenkinama, atlikti jai priklausančius veiksmus, o jei ne -- atlikti kitus nurodytus veiksmus.", - "CONTROLS_IF_TOOLTIP_3": "Jei pirma sąlyga tenkinama, atlikti jai priklausančius veiksmus, O jei ne, tikrinti antrą sąlygą -- ir jei ši tenkinama, atlikti jos veiksmus.", - "CONTROLS_IF_TOOLTIP_4": "Jei pirma sąlyga tenkinama, atlikti jai priklausančius veiksmus, O jei ne, tikrinti antrą sąlygą -- ir jei ši tenkinama, atlikti jos veiksmus. Kitais atvejais -- atlikti paskutinio bloko veiksmus.", - "CONTROLS_IF_MSG_IF": "jei", - "CONTROLS_IF_MSG_ELSEIF": "arba jei", - "CONTROLS_IF_MSG_ELSE": "kitu atveju", - "CONTROLS_IF_IF_TOOLTIP": "Galite pridėt/pašalinti/pertvarkyti sąlygų \"šakas\".", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Pridėti sąlygą", - "CONTROLS_IF_ELSE_TOOLTIP": "Pridėti veiksmų vykdymo variantą/\"šaką\", kai netenkinama nė viena sąlyga.", - "LOGIC_COMPARE_TOOLTIP_EQ": "Tenkinama, jei abu reiškiniai lygūs.", - "LOGIC_OPERATION_TOOLTIP_AND": "Bus teisinga, kai abi sąlygos bus tenkinamos.", - "LOGIC_OPERATION_AND": "ir", - "LOGIC_OPERATION_OR": "ar", - "LOGIC_NEGATE_TITLE": "ne %1", - "LOGIC_BOOLEAN_TRUE": "tiesa", - "LOGIC_BOOLEAN_FALSE": "klaidinga", - "LOGIC_BOOLEAN_TOOLTIP": "Reikšmė gali būti \"teisinga\"/\"Taip\" arba \"klaidinga\"/\"Ne\".", - "LOGIC_NULL": "nieko", - "LOGIC_NULL_TOOLTIP": "Reikšmė nebuvo nurodyta...", - "LOGIC_TERNARY_CONDITION": "sąlyga", - "LOGIC_TERNARY_IF_TRUE": "jei taip", - "LOGIC_TERNARY_IF_FALSE": "jei ne", - "LOGIC_TERNARY_TOOLTIP": "Jeigu sąlygą tenkinama, grąžina pirmą reikšmę, o jei ne - antrąją.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "Skaičius.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Grąžina dviejų skaičių suma.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Grąžina dviejų skaičių skirtumą.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Grąžina dviejų skaičių sandaugą.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Grąžina dviejų skaičių dalmenį.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Grąžina pirmą skaičių pakeltą laipsniu pagal antrą skaičių.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "kv. šaknis", - "MATH_SINGLE_OP_ABSOLUTE": "modulis", - "MATH_SINGLE_TOOLTIP_ABS": "Skaičiaus modulis - reikšmė be ženklo (panaikina minusą).", - "MATH_SINGLE_TOOLTIP_NEG": "Neigiamas skaičius", - "MATH_IS_EVEN": "yra lyginis", - "MATH_IS_ODD": "yra nelyginis", - "MATH_IS_PRIME": "yra pirminis", - "MATH_IS_WHOLE": "yra sveikasis", - "MATH_IS_POSITIVE": "yra teigiamas", - "MATH_IS_NEGATIVE": "yra neigiamas", - "MATH_IS_DIVISIBLE_BY": "yra dalus iš", - "MATH_IS_TOOLTIP": "Patikrina skaičiaus savybę: (ne)lyginis/pirminis/sveikasis/teigiamas/neigiamas/dalus iš x.", - "MATH_CHANGE_TITLE": "padidink %1 (emptypage) %2", - "MATH_CHANGE_TOOLTIP": "Prideda skaičių prie kintamojo '%1'. Kai skaičius neigiamas - gaunasi atimtis.", - "MATH_ROUND_OPERATOR_ROUND": "apvalink", - "MATH_ROUND_OPERATOR_ROUNDUP": "apvalink aukštyn", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "apvalink žemyn", - "MATH_ONLIST_OPERATOR_SUM": "suma", - "MATH_ONLIST_TOOLTIP_SUM": "didžiausia reikšmė", - "MATH_ONLIST_OPERATOR_MIN": "mažiausia reikšmė sąraše", - "MATH_ONLIST_OPERATOR_MAX": "didžiausia reikšmė sąraše", - "MATH_ONLIST_OPERATOR_AVERAGE": "vidurkis", - "MATH_ONLIST_OPERATOR_MEDIAN": "mediana sąrašui", - "MATH_ONLIST_OPERATOR_MODE": "statistinė moda sąrašui", - "MATH_ONLIST_OPERATOR_STD_DEV": "standartinis nuokrypis sąraše", - "MATH_ONLIST_OPERATOR_RANDOM": "atsitiktinis elementas iš sąrašo", - "MATH_MODULO_TITLE": "dalybos liekana %1 ÷ %2", - "MATH_CONSTRAIN_TITLE": "apribok %1 tarp %2 ir %3", - "MATH_RANDOM_INT_TITLE": "atsitiktinis sveikas sk. nuo %1 iki %2", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "atsitiktinis sk. nuo 0 iki 1", - "MATH_RANDOM_FLOAT_TOOLTIP": "Atsitiktinė trupmena nuo 0 (imtinai) iki 1 (neimtinai).", - "TEXT_TEXT_TOOLTIP": "Tekstas (arba žodis, ar raidė)", - "TEXT_JOIN_TITLE_CREATEWITH": "tekstas iš:", - "TEXT_CREATE_JOIN_TITLE_JOIN": "sujunk", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Pridėti teksto elementą.", - "TEXT_APPEND_TO": "prie", - "TEXT_APPEND_APPENDTEXT": "pridėk tekstą", - "TEXT_LENGTH_TITLE": "teksto %1 ilgis", - "TEXT_LENGTH_TOOLTIP": "Suranda teksto simbolių kiekį (įskaitant ir tarpus)", - "TEXT_ISEMPTY_TITLE": "%1 yra tuščias", - "TEXT_INDEXOF_INPUT_INTEXT": "tekste", - "TEXT_INDEXOF_OPERATOR_FIRST": "rask,kur pirmą kartą paminėta", - "TEXT_INDEXOF_OPERATOR_LAST": "rask,kur paskutinį kartą paminėta", - "TEXT_CHARAT_INPUT_INTEXT": "teksto", - "TEXT_CHARAT_FROM_START": "raidė nr.", - "TEXT_CHARAT_FROM_END": "raidė nuo galo #", - "TEXT_CHARAT_FIRST": "raidė pradinė", - "TEXT_CHARAT_LAST": "raidė paskutinė", - "TEXT_CHARAT_RANDOM": "raidė atsitiktinė", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "teksto", - "TEXT_GET_SUBSTRING_START_FROM_START": "dalis nuo raidės #", - "TEXT_GET_SUBSTRING_START_FROM_END": "dalis nuo raidės #", - "TEXT_GET_SUBSTRING_START_FIRST": "dalis nuo pradžios", - "TEXT_GET_SUBSTRING_END_FROM_START": "iki raidės #", - "TEXT_GET_SUBSTRING_END_FROM_END": "iki raidės nuo galo #", - "TEXT_GET_SUBSTRING_END_LAST": "iki pabaigos", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": " DIDŽIOSIOM RAIDĖM", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": " mažosiom raidėm", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": " Pavadinimo Raidėmis", - "TEXT_TRIM_OPERATOR_BOTH": "išvalyk tarpus šonuose", - "TEXT_TRIM_OPERATOR_LEFT": "išvalyk tarpus pradžioje", - "TEXT_TRIM_OPERATOR_RIGHT": "išvalyk tarpus pabaigoje", - "TEXT_PRINT_TITLE": "spausdinti %1", - "TEXT_PROMPT_TYPE_TEXT": "paprašyk įvesti tekstą :", - "TEXT_PROMPT_TYPE_NUMBER": "paprašyk įvesti skaičių :", - "LISTS_CREATE_EMPTY_TITLE": "tuščias sąrašas", - "LISTS_CREATE_WITH_INPUT_WITH": "sąrašas:", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "sąrašas", - "LISTS_REPEAT_TITLE": "sukurk sąrašą, kuriame %1 bus %2 kartus", - "LISTS_LENGTH_TITLE": "ilgis %1", - "LISTS_ISEMPTY_TITLE": "%1 yra tuščias", - "LISTS_INLIST": "sąraše", - "LISTS_INDEX_OF_FIRST": "rask pirmą reikšmę", - "LISTS_INDEX_OF_LAST": "rask paskutinę reikšmę", - "LISTS_INDEX_OF_TOOLTIP": "Grąžina pirmos/paskutinės reikšmės eilės nr. sąraše. Grąžina 0, jei reikšmės neranda.", - "LISTS_GET_INDEX_GET": "paimk", - "LISTS_GET_INDEX_GET_REMOVE": "paimk ir ištrink", - "LISTS_GET_INDEX_REMOVE": "ištrink", - "LISTS_GET_INDEX_FROM_END": "# nuo galo", - "LISTS_GET_INDEX_FIRST": "pirmas", - "LISTS_GET_INDEX_LAST": "paskutinis", - "LISTS_GET_INDEX_RANDOM": "atsitiktinis", - "LISTS_SET_INDEX_SET": "priskirk elementui", - "LISTS_SET_INDEX_INSERT": "įterpk į vietą", - "LISTS_SET_INDEX_INPUT_TO": "reikšmę", - "LISTS_GET_SUBLIST_START_FROM_START": "sąrašo dalis nuo #", - "LISTS_GET_SUBLIST_START_FROM_END": "sąrašo dalis nuo # nuo galo", - "LISTS_GET_SUBLIST_START_FIRST": "sąrašo dalis nuo pradžios", - "LISTS_GET_SUBLIST_END_FROM_START": "iki #", - "LISTS_GET_SUBLIST_END_FROM_END": "iki # nuo galo", - "LISTS_GET_SUBLIST_END_LAST": "iki galo", - "VARIABLES_GET_CREATE_SET": "Sukurk \"priskirk %1\"", - "VARIABLES_SET": "priskirk %1 = %2", - "VARIABLES_SET_CREATE_GET": "Sukurti 'kintamasis %1'", - "PROCEDURES_DEFNORETURN_TITLE": "komanda:", - "PROCEDURES_DEFNORETURN_PROCEDURE": "daryk kažką", - "PROCEDURES_BEFORE_PARAMS": "pagal:", - "PROCEDURES_CALL_BEFORE_PARAMS": "su:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Sukuria procedūrą - komandą, kuri nepateikia jokio rezultato (tik atlieka veiksmus).", - "PROCEDURES_DEFRETURN_RETURN": "duok", - "PROCEDURES_DEFRETURN_TOOLTIP": "Sukuria funkciją - komandą, kuri ne tik atlieka veiksmus bet ir pateikia (grąžina/duoda) rezultatą.", - "PROCEDURES_ALLOW_STATEMENTS": "leisti vidinius veiksmus", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Ši komanda turi du vienodus gaunamų duomenų pavadinimus.", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Vykdyti sukurtą komandą \"%1\".", - "PROCEDURES_CALLRETURN_TOOLTIP": "Įvykdyti komandą \"%1\" ir naudoti jos suskaičiuotą (atiduotą) reikšmę.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "gaunami duomenys (parametrai)", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Tvarkyti komandos gaunamus duomenis (parametrus).", - "PROCEDURES_MUTATORARG_TITLE": "parametro pavadinimas:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Pridėti funkcijos parametrą (gaunamų duomenų pavadinimą).", - "PROCEDURES_CREATE_DO": "Sukurti \"%1\"", - "PROCEDURES_IFRETURN_TOOLTIP": "Jeigu pirma reikšmė yra teisinga (sąlyga tenkinama), grąžina antrą reikšmę.", - "PROCEDURES_IFRETURN_WARNING": "Perspėjimas: šis blokas gali būti naudojamas tik aprašant funkciją." -} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/pl.json b/src/opsoro/apps/visual_programming/static/blockly/msg/json/pl.json deleted file mode 100644 index 50f4515..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/pl.json +++ /dev/null @@ -1,335 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Cotidianis", - "Faren", - "Vengir", - "Pbz", - "Pio387", - "아라", - "Mateon1" - ] - }, - "VARIABLES_DEFAULT_NAME": "element", - "TODAY": "Dzisiaj", - "DUPLICATE_BLOCK": "Powiel", - "ADD_COMMENT": "Dodaj komentarz", - "REMOVE_COMMENT": "Usuń Komentarz", - "EXTERNAL_INPUTS": "Zewnętrzne wejścia", - "INLINE_INPUTS": "Wbudowane wejscia", - "DELETE_BLOCK": "Usuń blok", - "DELETE_X_BLOCKS": "Usunąć %1 bloki(ów)", - "COLLAPSE_BLOCK": "Zwiń blok", - "COLLAPSE_ALL": "Zwiń bloki", - "EXPAND_BLOCK": "Rozwiń blok", - "EXPAND_ALL": "Rozwiń bloki", - "DISABLE_BLOCK": "Wyłącz blok", - "ENABLE_BLOCK": "Włącz blok", - "HELP": "Pomoc", - "CHAT": "Rozmawiaj z swoim współpracownikiem, pisząc w tym polu!", - "AUTH": "Proszę autoryzować ten program, aby można było zapisać swoją pracę i umożliwić dzielenie się nią przez ciebie.", - "ME": "Ja", - "CHANGE_VALUE_TITLE": "Zmień wartość:", - "NEW_VARIABLE": "Nowa zmienna...", - "NEW_VARIABLE_TITLE": "Nowa nazwa zmiennej:", - "RENAME_VARIABLE": "Zmień nazwę zmiennej...", - "RENAME_VARIABLE_TITLE": "Zmień nazwy wszystkich '%1' zmiennych na:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Wybierz kolor z palety.", - "COLOUR_RANDOM_TITLE": "losowy kolor", - "COLOUR_RANDOM_TOOLTIP": "Wybierz kolor w sposób losowy.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "kolor z", - "COLOUR_RGB_RED": "czerwony", - "COLOUR_RGB_GREEN": "zielony", - "COLOUR_RGB_BLUE": "niebieski", - "COLOUR_RGB_TOOLTIP": "Połącz czerwony, zielony i niebieski w odpowiednich proporcjach, tak aby powstał nowy kolor. Zawartość każdego z nich określa liczba z przedziału od 0 do 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "mieszanka", - "COLOUR_BLEND_COLOUR1": "kolor 1", - "COLOUR_BLEND_COLOUR2": "kolor 2", - "COLOUR_BLEND_RATIO": "proporcja", - "COLOUR_BLEND_TOOLTIP": "Miesza dwa kolory w danej proporcji (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "powtórz %1 razy", - "CONTROLS_REPEAT_INPUT_DO": "wykonaj", - "CONTROLS_REPEAT_TOOLTIP": "Wykonaj niektóre instrukcje kilka razy.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "powtarzaj dopóki", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "powtarzaj aż", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Gdy wartość jest prawdziwa, wykonaj kilka instrukcji.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Gdy wartość jest nieprawdziwa, wykonaj kilka instrukcji.", - "CONTROLS_FOR_TOOLTIP": "Czy zmienna \"%1\" przyjmuje wartości od numeru startowego do numeru końcowego, licząc przez określony interwał, wykonując określone bloki.", - "CONTROLS_FOR_TITLE": "liczyć z %1 od %2 do %3 co %4 (wartość kroku)", - "CONTROLS_FOREACH_TITLE": "dla każdego elementu %1 na liście %2", - "CONTROLS_FOREACH_TOOLTIP": "Dla każdego elementu z listy przyporządkuj zmienną '%1', a następnie wykonaj kilka instrukcji.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "wyjść z pętli", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "przejdź do kolejnej iteracji pętli", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Wyjść z zawierającej pętli.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Pomiń resztę pętli i kontynuuj w kolejnej iteracji.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Ostrzeżenie: Ten blok może być użyty tylko w pętli.", - "CONTROLS_IF_TOOLTIP_1": "Jeśli wartość jest prawdziwa, to wykonaj kilka instrukcji.", - "CONTROLS_IF_TOOLTIP_2": "Jeśli wartość jest prawdziwa, to wykonaj pierwszy blok instrukcji. W przeciwnym razie, wykonaj drugi blok instrukcji.", - "CONTROLS_IF_TOOLTIP_3": "Jeśli pierwsza wartość jest prawdziwa, to wykonaj pierwszy blok instrukcji. W przeciwnym razie, jeśli druga wartość jest prawdziwa, to wykonaj drugi blok instrukcji.", - "CONTROLS_IF_TOOLTIP_4": "Jeśli pierwsza wartość jest prawdziwa, wykonaj pierwszy blok instrukcji. W przeciwnym razie jeśli druga wartość jest prawdziwa, wykonaj drugi blok instrukcji. Jeżeli żadna z wartości nie jest prawdziwa, wykonaj ostatni blok instrukcji.", - "CONTROLS_IF_MSG_IF": "jeśli", - "CONTROLS_IF_MSG_ELSEIF": "w przeciwnym razie jeśli", - "CONTROLS_IF_MSG_ELSE": "w przeciwnym razie", - "CONTROLS_IF_IF_TOOLTIP": "Dodaj, usuń lub zmień kolejność bloków, żeby zmodyfikować blok „jeśli”.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Dodaj warunek do bloku „jeśli”.", - "CONTROLS_IF_ELSE_TOOLTIP": "Dodaj ostatni warunek do bloku „jeśli”, gdy żaden wcześniejszy nie był spełniony.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Zwróć \"prawda\", jeśli obie dane wejściowe są sobie równe.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Zwróć \"prawda\", jeśli obie dane wejściowe nie są sobie równe.", - "LOGIC_COMPARE_TOOLTIP_LT": "Zwróć \"prawda\" jeśli pierwsza dana wejściowa jest większa od drugiej.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Zwróć \"prawda\", jeśli pierwsza dana wejściowa jest większa lub równa drugiej danej wejściowej.", - "LOGIC_COMPARE_TOOLTIP_GT": "Zwróć \"prawda\" jeśli pierwszy dany element jest większy od drugiego.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Zwróć \"prawda\", jeśli pierwsza dana wejściowa jest większa niż lub równa drugiej danej wejściowej.", - "LOGIC_OPERATION_TOOLTIP_AND": "Zwróć \"prawda\" jeśli oba dane elementy mają wartość \"prawda\".", - "LOGIC_OPERATION_AND": "i", - "LOGIC_OPERATION_TOOLTIP_OR": "Zwróć \"prawda\" jeśli co najmniej jeden dany element ma wartość \"prawda\".", - "LOGIC_OPERATION_OR": "lub", - "LOGIC_NEGATE_TITLE": "nie %1", - "LOGIC_NEGATE_TOOLTIP": "Zwraca \"prawda\", jeśli dane wejściowe są fałszywe. Zwraca \"fałsz\", jeśli dana wejściowa jest prawdziwa.", - "LOGIC_BOOLEAN_TRUE": "prawda", - "LOGIC_BOOLEAN_FALSE": "fałsz", - "LOGIC_BOOLEAN_TOOLTIP": "Zwraca 'prawda' lub 'fałsz'.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "nic", - "LOGIC_NULL_TOOLTIP": "Zwraca nic.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "jeśli prawda", - "LOGIC_TERNARY_IF_FALSE": "jeśli fałsz", - "LOGIC_TERNARY_TOOLTIP": "Sprawdź warunek w „test”. Jeśli warunek jest prawdziwy, to zwróci „jeśli prawda”; jeśli nie jest prawdziwy to zwróci „jeśli fałsz”.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "Liczba.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "/", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "arc sin", - "MATH_TRIG_ACOS": "arc cos", - "MATH_TRIG_ATAN": "arc tan", - "MATH_ARITHMETIC_HELPURL": "https://pl.wikipedia.org/wiki/Arytmetyka", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Zwróć sumę dwóch liczb.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Zwróć różnicę dwóch liczb.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Zwraca iloczyn dwóch liczb.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Zwróć iloraz dwóch liczb.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Zwróć liczbę podniesioną do potęgi o wykładniku drugiej liczby.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "pierwiastek kwadratowy", - "MATH_SINGLE_TOOLTIP_ROOT": "Zwróć pierwiastek kwadratowy danej liczby.", - "MATH_SINGLE_OP_ABSOLUTE": "wartość bezwzględna", - "MATH_SINGLE_TOOLTIP_ABS": "Zwróć wartość bezwzględną danej liczby.", - "MATH_SINGLE_TOOLTIP_NEG": "Zwróć negację danej liczby.", - "MATH_SINGLE_TOOLTIP_LN": "Zwróć logarytm naturalny danej liczby.", - "MATH_SINGLE_TOOLTIP_LOG10": "Zwraca logarytm dziesiętny danej liczby.", - "MATH_SINGLE_TOOLTIP_EXP": "Zwróć e do potęgi danej liczby.", - "MATH_SINGLE_TOOLTIP_POW10": "Zwróć 10 do potęgi danej liczby.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "Zwróć wartość sinusa o stopniu (nie radianach).", - "MATH_TRIG_TOOLTIP_COS": "Zwróć wartość cosinusa o stopniu (nie radianach).", - "MATH_TRIG_TOOLTIP_TAN": "Zwróć tangens o stopniu (nie radianach).", - "MATH_TRIG_TOOLTIP_ASIN": "Zwróć arcus sinus danej liczby.", - "MATH_TRIG_TOOLTIP_ACOS": "Zwróć arcus cosinus danej liczby.", - "MATH_TRIG_TOOLTIP_ATAN": "Zwróć arcus tangens danej liczby.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Zwróć jedną wspólną stałą: π (3.141), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) lub ∞ (nieskończoność).", - "MATH_IS_EVEN": "jest parzysta", - "MATH_IS_ODD": "jest nieparzysta", - "MATH_IS_PRIME": "jest liczbą pierwszą", - "MATH_IS_WHOLE": "jest liczbą całkowitą", - "MATH_IS_POSITIVE": "jest dodatnia", - "MATH_IS_NEGATIVE": "jest ujemna", - "MATH_IS_DIVISIBLE_BY": "jest podzielna przez", - "MATH_IS_TOOLTIP": "Sprawdź, czy liczba jest parzysta, nieparzysta, pierwsza, całkowita, dodatnia, ujemna, lub czy jest podzielna przez podaną liczbę. Zwraca wartość \"prawda\" lub \"fałsz\".", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "zmień %1 o %2", - "MATH_CHANGE_TOOLTIP": "Dodaj liczbę do zmiennej '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Zaokrąglij w górę lub w dół.", - "MATH_ROUND_OPERATOR_ROUND": "zaokrąglić", - "MATH_ROUND_OPERATOR_ROUNDUP": "zaokrąglić w górę", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "zaokrąglić w dół", - "MATH_ONLIST_HELPURL": "", - "MATH_ONLIST_OPERATOR_SUM": "suma z listy", - "MATH_ONLIST_TOOLTIP_SUM": "Zwróć sumę wszystkich liczb z listy.", - "MATH_ONLIST_OPERATOR_MIN": "minimalna wartość z listy", - "MATH_ONLIST_TOOLTIP_MIN": "Zwróć najniższy numer w liście.", - "MATH_ONLIST_OPERATOR_MAX": "maksymalna wartość z listy", - "MATH_ONLIST_TOOLTIP_MAX": "Zwróć najwyższy numer w liście.", - "MATH_ONLIST_OPERATOR_AVERAGE": "średnia z listy", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Zwróć średnią (średnią arytmetyczną) wartości liczbowych z listy.", - "MATH_ONLIST_OPERATOR_MEDIAN": "mediana z listy", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Zwróć medianę liczby na liście.", - "MATH_ONLIST_OPERATOR_MODE": "dominanty listy", - "MATH_ONLIST_TOOLTIP_MODE": "Zwróć listę najczęściej występujących elementów na liście.", - "MATH_ONLIST_OPERATOR_STD_DEV": "odchylenie standardowe z listy", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Zwróć odchylenie standardowe listy.", - "MATH_ONLIST_OPERATOR_RANDOM": "losowy element z listy", - "MATH_ONLIST_TOOLTIP_RANDOM": "Zwróć losowy element z listy.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "reszta z dzielenia %1 przez %2", - "MATH_MODULO_TOOLTIP": "Zwróć resztę z dzielenia dwóch liczb przez siebie.", - "MATH_CONSTRAIN_TITLE": "ogranicz %1 z dołu %2 z góry %3", - "MATH_CONSTRAIN_TOOLTIP": "Ogranicz liczbę, aby była w określonych granicach (włącznie).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "losowa liczba całkowita od %1 do %2", - "MATH_RANDOM_INT_TOOLTIP": "Zwróć losową liczbę całkowitą w ramach dwóch wyznaczonych granic, włącznie.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "losowy ułamek", - "MATH_RANDOM_FLOAT_TOOLTIP": "Zwróć losowy ułamek między 0.0 (włącznie), a 1.0 (wyłącznie).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "Litera, wyraz lub linia tekstu.", - "TEXT_JOIN_TITLE_CREATEWITH": "utwórz tekst z", - "TEXT_JOIN_TOOLTIP": "Tworzy fragment tekstu, łącząc ze sobą dowolną liczbę tekstów.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "połącz", - "TEXT_CREATE_JOIN_TOOLTIP": "Dodaj, usuń lub zmień kolejność sekcji, aby zmodyfikować blok tekstowy.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Dodaj element do tekstu.", - "TEXT_APPEND_TO": "do", - "TEXT_APPEND_APPENDTEXT": "dołącz tekst", - "TEXT_APPEND_TOOLTIP": "Dołącz tekst do zmiennej '%1'.", - "TEXT_LENGTH_TITLE": "długość %1", - "TEXT_LENGTH_TOOLTIP": "Zwraca liczbę liter (łącznie ze spacjami) w podanym tekście.", - "TEXT_ISEMPTY_TITLE": "%1 jest pusty", - "TEXT_ISEMPTY_TOOLTIP": "Zwraca prawda (true), jeśli podany tekst jest pusty.", - "TEXT_INDEXOF_TOOLTIP": "Zwraca indeks pierwszego/ostatniego wystąpienia pierwszego tekstu w drugim tekście. Zwraca wartość 0, jeśli tekst nie został znaleziony.", - "TEXT_INDEXOF_INPUT_INTEXT": "w tekście", - "TEXT_INDEXOF_OPERATOR_FIRST": "znajdź pierwsze wystąpienie tekstu", - "TEXT_INDEXOF_OPERATOR_LAST": "znajdź ostatnie wystąpienie tekstu", - "TEXT_INDEXOF_TAIL": "", - "TEXT_CHARAT_INPUT_INTEXT": "z tekstu", - "TEXT_CHARAT_FROM_START": "pobierz literę #", - "TEXT_CHARAT_FROM_END": "pobierz literę # od końca", - "TEXT_CHARAT_FIRST": "pobierz pierwszą literę", - "TEXT_CHARAT_LAST": "pobierz ostatnią literę", - "TEXT_CHARAT_RANDOM": "pobierz losową literę", - "TEXT_CHARAT_TAIL": "", - "TEXT_CHARAT_TOOLTIP": "Zwraca literę z określonej pozycji.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Zwraca określoną część tekstu.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "w tekście", - "TEXT_GET_SUBSTRING_START_FROM_START": "pobierz podciąg od litery #", - "TEXT_GET_SUBSTRING_START_FROM_END": "pobierz podciąg od litery # od końca", - "TEXT_GET_SUBSTRING_START_FIRST": "pobierz podciąg od pierwszej litery", - "TEXT_GET_SUBSTRING_END_FROM_START": "do litery #", - "TEXT_GET_SUBSTRING_END_FROM_END": "do litery # od końca", - "TEXT_GET_SUBSTRING_END_LAST": "do ostatniej litery", - "TEXT_GET_SUBSTRING_TAIL": "", - "TEXT_CHANGECASE_TOOLTIP": "Zwraca kopię tekstu z inną wielkością liter.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "zmień na WIELKIE LITERY", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "zmień na małe litery", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "zmień na od Wielkich Liter", - "TEXT_TRIM_TOOLTIP": "Zwraca kopię tekstu z usuniętymi spacjami z jednego lub z obu końców tekstu.", - "TEXT_TRIM_OPERATOR_BOTH": "usuń spacje po obu stronach", - "TEXT_TRIM_OPERATOR_LEFT": "usuń spacje z lewej strony", - "TEXT_TRIM_OPERATOR_RIGHT": "usuń spacje z prawej strony", - "TEXT_PRINT_TITLE": "wydrukuj %1", - "TEXT_PRINT_TOOLTIP": "Drukuj określony tekst, liczbę lub coś innego.", - "TEXT_PROMPT_TYPE_TEXT": "poproś o tekst z tą wiadomością", - "TEXT_PROMPT_TYPE_NUMBER": "poproś o liczbę z tą wiadomością", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Zapytaj użytkownika o liczbę.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Zapytaj użytkownika o jakiś tekst.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "utwórz pustą listę", - "LISTS_CREATE_EMPTY_TOOLTIP": "Zwraca listę, o długości 0, nie zawierającą rekordów z danymi", - "LISTS_CREATE_WITH_TOOLTIP": "Utwórz listę z dowolną ilością elementów.", - "LISTS_CREATE_WITH_INPUT_WITH": "Tworzenie listy z", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Dodać, usunąć lub zmienić kolejność sekcji żeby zrekonfigurować blok tej listy.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Dodaj element do listy.", - "LISTS_REPEAT_TOOLTIP": "Tworzy listę składającą się z podanej wartości powtórzonej odpowiednią liczbę razy.", - "LISTS_REPEAT_TITLE": "stwórz listę, powtarzając element %1 %2 razy", - "LISTS_LENGTH_TITLE": "długość %1", - "LISTS_LENGTH_TOOLTIP": "Zwraca długość listy.", - "LISTS_ISEMPTY_TITLE": "%1 jest pusty", - "LISTS_ISEMPTY_TOOLTIP": "Zwraca \"prawda\" jeśli lista jest pusta.", - "LISTS_INLIST": "na liście", - "LISTS_INDEX_OF_FIRST": "znaleźć pierwsze wystąpienie elementu", - "LISTS_INDEX_OF_LAST": "znajduje ostatanie wystąpienie elementu", - "LISTS_INDEX_OF_TOOLTIP": "Zwraca indeks pierwszego/ostatniego wystąpienia elementu na liście. Zwraca wartość 0, jeśli tekst nie zostanie znaleziony.", - "LISTS_GET_INDEX_GET": "pobierz", - "LISTS_GET_INDEX_GET_REMOVE": "Pobierz i usuń", - "LISTS_GET_INDEX_REMOVE": "usuń", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# od końca", - "LISTS_GET_INDEX_FIRST": "pierwszy", - "LISTS_GET_INDEX_LAST": "ostatni", - "LISTS_GET_INDEX_RANDOM": "losowy", - "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Zwraca element z konkretnej pozycji na liście. #1 to pierwszy element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Zwraca element z określonej pozycji na liście. #1 to ostatni element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Zwraca pierwszy element z listy.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Zwraca ostatni element z listy.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Zwraca losowy element z listy.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Usuwa i zwraca element z określonej pozycji na liście. #1 to pierwszy element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Usuwa i zwraca element z określonej pozycji na liście. #1 to ostatni element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Usuwa i zwraca pierwszy element z listy.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Usuwa i zwraca ostatni element z listy.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Usuwa i zwraca losowy element z listy.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Usuwa element z określonej pozycji na liście. #1 to pierwszy element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Usuwa element z określonej pozycji na liście. #1 to ostatni element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Usuwa pierwszy element z listy.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Usuwa ostatni element z listy.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Usuwa losowy element z listy.", - "LISTS_SET_INDEX_SET": "ustaw", - "LISTS_SET_INDEX_INSERT": "wstaw w", - "LISTS_SET_INDEX_INPUT_TO": "jako", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Ustawia element w odpowiednie miejsce na liście. #1 to pierwszy element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Ustawia element w odpowiednie miejsce na liście. #1 to ostatni element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Ustawia pierwszy element na liście.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Ustawia ostatni element na liście.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Ustawia losowy element na liście.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Wstawia element w odpowiednim miejscu na liście. #1 to pierwszy element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Wstawia element w odpowiednim miejscu na liście. #1 to ostatni element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Wstawia element na początku listy.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Dodaj element na koniec listy.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Wstawia element w losowym miejscu na liście.", - "LISTS_GET_SUBLIST_START_FROM_START": "Pobierz listę podrzędną z #", - "LISTS_GET_SUBLIST_START_FROM_END": "Pobierz listę podrzędną z # od końca", - "LISTS_GET_SUBLIST_START_FIRST": "Pobierz listę podrzędną z pierwszego", - "LISTS_GET_SUBLIST_END_FROM_START": "do #", - "LISTS_GET_SUBLIST_END_FROM_END": "do # od końca", - "LISTS_GET_SUBLIST_END_LAST": "do ostatniego", - "LISTS_GET_SUBLIST_TAIL": "", - "LISTS_GET_SUBLIST_TOOLTIP": "Tworzy kopię z określoną część listy.", - "LISTS_SPLIT_LIST_FROM_TEXT": "stwórz listę z tekstu", - "LISTS_SPLIT_TEXT_FROM_LIST": "stwórz tekst z listy", - "LISTS_SPLIT_WITH_DELIMITER": "z separatorem", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Rozdziela tekst na listę mniejszych tekstów, dzieląc na każdym separatorze.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Łączy listę tekstów w jeden tekst, rozdzielany separatorem.", - "ORDINAL_NUMBER_SUFFIX": "", - "VARIABLES_GET_TOOLTIP": "Zwraca wartość tej zmiennej.", - "VARIABLES_GET_CREATE_SET": "Utwórz blok 'ustaw %1'", - "VARIABLES_SET": "przypisz %1 wartość %2", - "VARIABLES_SET_TOOLTIP": "Nadaj tej zmiennej wartość.", - "VARIABLES_SET_CREATE_GET": "Utwórz blok 'pobierz %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFNORETURN_TITLE": "do", - "PROCEDURES_DEFNORETURN_PROCEDURE": "zrób coś", - "PROCEDURES_BEFORE_PARAMS": "z:", - "PROCEDURES_CALL_BEFORE_PARAMS": "z:", - "PROCEDURES_DEFNORETURN_DO": "", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Tworzy funkcję bez wyniku.", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFRETURN_RETURN": "zwróć", - "PROCEDURES_DEFRETURN_TOOLTIP": "Tworzy funkcję z wynikiem.", - "PROCEDURES_ALLOW_STATEMENTS": "zezwól na instrukcje", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Ostrzeżenie: Ta funkcja ma powtórzone parametry.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_CALL": "", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Uruchom funkcję zdefiniowaną przez użytkownika '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Uruchom funkcję zdefiniowaną przez użytkownika '%1' i skorzystaj z jej wyniku.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "wejścia", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Dodaj, usuń lub zmień kolejność danych wejściowych dla tej funkcji.", - "PROCEDURES_MUTATORARG_TITLE": "nazwa wejścia:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Dodaj dane wejściowe do funkcji.", - "PROCEDURES_HIGHLIGHT_DEF": "Podświetl definicję funkcji", - "PROCEDURES_CREATE_DO": "Stwórz '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Jeśli wartość jest prawdziwa, zwróć drugą wartość.", - "PROCEDURES_IFRETURN_WARNING": "Ostrzeżenie: Ten blok może być używany tylko w definicji funkcji." -} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/synonyms.json b/src/opsoro/apps/visual_programming/static/blockly/msg/json/synonyms.json deleted file mode 100644 index 89b9187..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/synonyms.json +++ /dev/null @@ -1 +0,0 @@ -{"PROCEDURES_DEFRETURN_TITLE": "PROCEDURES_DEFNORETURN_TITLE", "CONTROLS_IF_IF_TITLE_IF": "CONTROLS_IF_MSG_IF", "CONTROLS_WHILEUNTIL_INPUT_DO": "CONTROLS_REPEAT_INPUT_DO", "CONTROLS_IF_MSG_THEN": "CONTROLS_REPEAT_INPUT_DO", "LISTS_GET_SUBLIST_INPUT_IN_LIST": "LISTS_INLIST", "PROCEDURES_CALLRETURN_CALL": "PROCEDURES_CALLNORETURN_CALL", "CONTROLS_IF_ELSE_TITLE_ELSE": "CONTROLS_IF_MSG_ELSE", "PROCEDURES_DEFRETURN_PROCEDURE": "PROCEDURES_DEFNORETURN_PROCEDURE", "TEXT_CREATE_JOIN_ITEM_TITLE_ITEM": "VARIABLES_DEFAULT_NAME", "LISTS_GET_INDEX_INPUT_IN_LIST": "LISTS_INLIST", "CONTROLS_IF_ELSEIF_TITLE_ELSEIF": "CONTROLS_IF_MSG_ELSEIF", "PROCEDURES_DEFRETURN_DO": "PROCEDURES_DEFNORETURN_DO", "CONTROLS_FOR_INPUT_DO": "CONTROLS_REPEAT_INPUT_DO", "LISTS_GET_INDEX_HELPURL": "LISTS_INDEX_OF_HELPURL", "LISTS_INDEX_OF_INPUT_IN_LIST": "LISTS_INLIST", "CONTROLS_FOREACH_INPUT_DO": "CONTROLS_REPEAT_INPUT_DO", "LISTS_CREATE_WITH_ITEM_TITLE": "VARIABLES_DEFAULT_NAME", "TEXT_APPEND_VARIABLE": "VARIABLES_DEFAULT_NAME", "MATH_CHANGE_TITLE_ITEM": "VARIABLES_DEFAULT_NAME", "LISTS_SET_INDEX_INPUT_IN_LIST": "LISTS_INLIST"} \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/zh-hant.json b/src/opsoro/apps/visual_programming/static/blockly/msg/json/zh-hant.json deleted file mode 100644 index c54e0b4..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/zh-hant.json +++ /dev/null @@ -1,298 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Gasolin", - "Wehwei", - "Liuxinyu970226", - "LNDDYL" - ] - }, - "VARIABLES_DEFAULT_NAME": "變量", - "TODAY": "今天", - "DUPLICATE_BLOCK": "複製", - "ADD_COMMENT": "加入註解", - "REMOVE_COMMENT": "移除註解", - "EXTERNAL_INPUTS": "多行輸入", - "INLINE_INPUTS": "單行輸入", - "DELETE_BLOCK": "刪除積木", - "DELETE_X_BLOCKS": "刪除 %1 塊積木", - "COLLAPSE_BLOCK": "收合積木", - "COLLAPSE_ALL": "收合積木", - "EXPAND_BLOCK": "展開積木", - "EXPAND_ALL": "展開積木", - "DISABLE_BLOCK": "停用積木", - "ENABLE_BLOCK": "啟用積木", - "HELP": "說明", - "CHAT": "與您的合作者洽談藉由在此框輸入!", - "ME": "我", - "CHANGE_VALUE_TITLE": "修改值:", - "NEW_VARIABLE": "新變量...", - "NEW_VARIABLE_TITLE": "新變量名稱:", - "RENAME_VARIABLE": "重新命名變量...", - "RENAME_VARIABLE_TITLE": "將所有 \"%1\" 變量重新命名為:", - "COLOUR_PICKER_HELPURL": "https://zh.wikipedia.org/wiki/顏色", - "COLOUR_PICKER_TOOLTIP": "從調色板中選擇一種顏色。", - "COLOUR_RANDOM_TITLE": "隨機顏色", - "COLOUR_RANDOM_TOOLTIP": "隨機選擇一種顏色。", - "COLOUR_RGB_TITLE": "顏色", - "COLOUR_RGB_RED": "紅", - "COLOUR_RGB_GREEN": "綠", - "COLOUR_RGB_BLUE": "藍", - "COLOUR_RGB_TOOLTIP": "透過指定紅、綠、 藍色的值來建立一種顏色。所有的值必須介於 0 和 100 之間。", - "COLOUR_BLEND_TITLE": "混合", - "COLOUR_BLEND_COLOUR1": "顏色 1", - "COLOUR_BLEND_COLOUR2": "顏色 2", - "COLOUR_BLEND_RATIO": "比例", - "COLOUR_BLEND_TOOLTIP": "透過一個比率 (0.0-1.0)來混合兩種顏色。", - "CONTROLS_REPEAT_HELPURL": "https://zh.wikipedia.org/wiki/For迴圈", - "CONTROLS_REPEAT_TITLE": "重複 %1 次", - "CONTROLS_REPEAT_INPUT_DO": "執行", - "CONTROLS_REPEAT_TOOLTIP": "多次執行一些語句", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "重複 當", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "重複 直到", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "當值為真時,執行一些語句", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "當值為否時,執行一些語句", - "CONTROLS_FOR_TOOLTIP": "從起始數到結尾數中取出變數 \"%1\" 的值,按指定的時間間隔,執行指定的積木。", - "CONTROLS_FOR_TITLE": "使用 %1 從範圍 %2 到 %3 每隔 %4", - "CONTROLS_FOREACH_TITLE": "取出每個 %1 自列表 %2", - "CONTROLS_FOREACH_TOOLTIP": "遍歷每個列表中的項目,將變量 '%1' 設定到該項目中,然後執行某些語句", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "停止 迴圈", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "繼續下一個 迴圈", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "離開當前的 迴圈", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "跳過這個迴圈的其餘步驟,並繼續下一次的迴圈運算。", - "CONTROLS_FLOW_STATEMENTS_WARNING": "警告: 此積木僅可用於迴圈內。", - "CONTROLS_IF_TOOLTIP_1": "當值為真時,執行一些語句", - "CONTROLS_IF_TOOLTIP_2": "當值為真時,執行第一個語句,否則則執行第二個語句", - "CONTROLS_IF_TOOLTIP_3": "如果第一個值為真,則執行第一個語句。否則當第二個值為真時,則執行第二個語句", - "CONTROLS_IF_TOOLTIP_4": "如果第一個值為真,則執行第一個語句。否則當第二個值為真時,則執行第二個語句。如果前幾個敘述都不為真,則執行最後一個語句", - "CONTROLS_IF_MSG_IF": "如果", - "CONTROLS_IF_MSG_ELSEIF": "否則如果", - "CONTROLS_IF_MSG_ELSE": "否則", - "CONTROLS_IF_IF_TOOLTIP": "添加、 刪除或重新排列各區塊來此重新配置這個'如果'積木。", - "CONTROLS_IF_ELSEIF_TOOLTIP": "將條件添加到'如果'積木。", - "CONTROLS_IF_ELSE_TOOLTIP": "加入一個最終,所有條件下都都執行的區塊到'如果'積木中", - "LOGIC_COMPARE_HELPURL": "https://zh.wikipedia.org/wiki/不等", - "LOGIC_COMPARE_TOOLTIP_EQ": "如果這兩個輸入區塊內容相等,返回 真。", - "LOGIC_COMPARE_TOOLTIP_NEQ": "如果這兩個輸入區塊內容不相等,返回 真。", - "LOGIC_COMPARE_TOOLTIP_LT": "如果第一個輸入小於第二個輸入,返回 真。", - "LOGIC_COMPARE_TOOLTIP_LTE": "如果第一個輸入是小於或等於第二個輸入,返回 真。", - "LOGIC_COMPARE_TOOLTIP_GT": "如果第一個輸入大於第二個輸入,返回 真。", - "LOGIC_COMPARE_TOOLTIP_GTE": "如果第一個輸入大於或等於第二個輸入,返回 真。", - "LOGIC_OPERATION_TOOLTIP_AND": "如果這兩個輸入值都為 真,則返回 真。", - "LOGIC_OPERATION_AND": "且", - "LOGIC_OPERATION_TOOLTIP_OR": "如果至少一個輸入的值為 真,返回 真。", - "LOGIC_OPERATION_OR": "或", - "LOGIC_NEGATE_TITLE": "非 %1", - "LOGIC_NEGATE_TOOLTIP": "如果輸入的值是 否,則返回 真。如果輸入的值是 真 返回 否。", - "LOGIC_BOOLEAN_TRUE": "真", - "LOGIC_BOOLEAN_FALSE": "否", - "LOGIC_BOOLEAN_TOOLTIP": "返回 真 或 否。", - "LOGIC_NULL": "空", - "LOGIC_NULL_TOOLTIP": "返回 空。", - "LOGIC_TERNARY_HELPURL": "https://zh.wikipedia.org/wiki/條件運算符", - "LOGIC_TERNARY_CONDITION": "測試", - "LOGIC_TERNARY_IF_TRUE": "如果為真", - "LOGIC_TERNARY_IF_FALSE": "如果為非", - "LOGIC_TERNARY_TOOLTIP": "檢查 'test' 中的條件。如果條件為 真,將返回 '如果為 真' 值 ;否則,返回 '如果為 否' 的值。", - "MATH_NUMBER_HELPURL": "https://zh.wikipedia.org/wiki/數", - "MATH_NUMBER_TOOLTIP": "一個數字。", - "MATH_ARITHMETIC_HELPURL": "https://zh.wikipedia.org/wiki/算術", - "MATH_ARITHMETIC_TOOLTIP_ADD": "返回兩個數字的總和。", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "返回兩個數字的差。", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "返回兩個數字的乘積。", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "返回兩個數字的商。", - "MATH_ARITHMETIC_TOOLTIP_POWER": "返回第二個數字的指數的第一個數字。", - "MATH_SINGLE_HELPURL": "https://zh.wikipedia.org/wiki/平方根", - "MATH_SINGLE_OP_ROOT": "開根號", - "MATH_SINGLE_TOOLTIP_ROOT": "返回指定數字的平方根。", - "MATH_SINGLE_OP_ABSOLUTE": "絕對值", - "MATH_SINGLE_TOOLTIP_ABS": "返回指定數字的絕對值。", - "MATH_SINGLE_TOOLTIP_NEG": "返回指定數字的 negation。", - "MATH_SINGLE_TOOLTIP_LN": "返回指定數字的自然對數。", - "MATH_SINGLE_TOOLTIP_LOG10": "返回指定數字的對數。", - "MATH_SINGLE_TOOLTIP_EXP": "返回指定數字指數的 e", - "MATH_SINGLE_TOOLTIP_POW10": "返回指定數字指數的10的冪次。", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "返回指定角度的正弦值(非弧度)。", - "MATH_TRIG_TOOLTIP_COS": "返回指定角度的餘弦值(非弧度)。", - "MATH_TRIG_TOOLTIP_TAN": "返回指定角度的正切值(非弧度)。", - "MATH_TRIG_TOOLTIP_ASIN": "返回指定角度的反正弦值(非弧度)。", - "MATH_TRIG_TOOLTIP_ACOS": "返回指定角度的反餘弦值(非弧度)。", - "MATH_TRIG_TOOLTIP_ATAN": "返回指定角度的反正切值。", - "MATH_CONSTANT_HELPURL": "https://zh.wikipedia.org/wiki/數學常數", - "MATH_CONSTANT_TOOLTIP": "返回一個的常見常量: π (3.141......),e (2.718...)、 φ (1.618...)、 開方(2) (1.414......)、 開方(½) (0.707......) 或 ∞ (無窮大)。", - "MATH_IS_EVEN": "是偶數", - "MATH_IS_ODD": "是奇數", - "MATH_IS_PRIME": "是質數", - "MATH_IS_WHOLE": "是非負整數", - "MATH_IS_POSITIVE": "是正值", - "MATH_IS_NEGATIVE": "是負值", - "MATH_IS_DIVISIBLE_BY": "可被整除", - "MATH_IS_TOOLTIP": "如果數字是偶數,奇數,非負整數,正數、 負數或如果它是可被某數字整除,則返回 真 或 否。", - "MATH_CHANGE_HELPURL": "https://zh.wikipedia.org/wiki/加法", - "MATH_CHANGE_TITLE": "修改 %1 自 %2", - "MATH_CHANGE_TOOLTIP": "將數字添加到變量 '%1'。", - "MATH_ROUND_HELPURL": "https://zh.wikipedia.org/wiki/數值簡化", - "MATH_ROUND_TOOLTIP": "將數字向上或向下舍入。", - "MATH_ROUND_OPERATOR_ROUND": "四捨五入", - "MATH_ROUND_OPERATOR_ROUNDUP": "無條件進位", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "無條件捨去", - "MATH_ONLIST_OPERATOR_SUM": "總和 自列表", - "MATH_ONLIST_TOOLTIP_SUM": "返回列表中的所有數字的總和。", - "MATH_ONLIST_OPERATOR_MIN": "最小值 自列表", - "MATH_ONLIST_TOOLTIP_MIN": "返回列表中的最小數字。", - "MATH_ONLIST_OPERATOR_MAX": "最大值 自列表", - "MATH_ONLIST_TOOLTIP_MAX": "返回列表中的最大數字。", - "MATH_ONLIST_OPERATOR_AVERAGE": "平均值 自列表", - "MATH_ONLIST_TOOLTIP_AVERAGE": "返回列表中數值的平均值 (算術平均值)。", - "MATH_ONLIST_OPERATOR_MEDIAN": "中位數 自列表", - "MATH_ONLIST_TOOLTIP_MEDIAN": "返回列表中數值的中位數。", - "MATH_ONLIST_OPERATOR_MODE": "比較眾數 自列表", - "MATH_ONLIST_TOOLTIP_MODE": "返回一個列表中的最常見項目的列表。", - "MATH_ONLIST_OPERATOR_STD_DEV": "標準差 自列表", - "MATH_ONLIST_TOOLTIP_STD_DEV": "返回列表中數字的標準差。", - "MATH_ONLIST_OPERATOR_RANDOM": "隨機抽取 自列表", - "MATH_ONLIST_TOOLTIP_RANDOM": "從列表中返回一個隨機的項目。", - "MATH_MODULO_HELPURL": "https://zh.wikipedia.org/wiki/模除", - "MATH_MODULO_TITLE": "取餘數自 %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "回傳兩個數字相除的餘數", - "MATH_CONSTRAIN_TITLE": "限制數字 %1 介於 (低) %2 到 (高) %3", - "MATH_CONSTRAIN_TOOLTIP": "限制數字介於兩個指定的數字之間", - "MATH_RANDOM_INT_HELPURL": "https://zh.wikipedia.org/wiki/隨機數生成器", - "MATH_RANDOM_INT_TITLE": "取隨機整數介於 (低) %1 到 %2", - "MATH_RANDOM_INT_TOOLTIP": "回傳限制的數字區間內的隨機數字", - "MATH_RANDOM_FLOAT_HELPURL": "https://zh.wikipedia.org/wiki/隨機數生成器", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "取隨機分數", - "MATH_RANDOM_FLOAT_TOOLTIP": "返回介於 (包含) 0.0 到 1.0 之間的隨機數。", - "TEXT_TEXT_HELPURL": "https://zh.wikipedia.org/wiki/字串", - "TEXT_TEXT_TOOLTIP": "字元、 單詞或一行文字。", - "TEXT_JOIN_TITLE_CREATEWITH": "建立字串使用", - "TEXT_JOIN_TOOLTIP": "通過串起任意數量的項目來建立一段文字。", - "TEXT_CREATE_JOIN_TITLE_JOIN": "加入", - "TEXT_CREATE_JOIN_TOOLTIP": "添加、 刪除或重新排列各區塊來此重新配置這個文字積木。", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "將一個項目加入到字串中。", - "TEXT_APPEND_TO": "在", - "TEXT_APPEND_APPENDTEXT": "後加入文字", - "TEXT_APPEND_TOOLTIP": "將一些文字追加到變量 '%1'。", - "TEXT_LENGTH_TITLE": "長度 %1", - "TEXT_LENGTH_TOOLTIP": "返回這串文字的字元數(含空格) 。", - "TEXT_ISEMPTY_TITLE": "%1 為空", - "TEXT_ISEMPTY_TOOLTIP": "如果提供的字串為空,則返回 真。", - "TEXT_INDEXOF_TOOLTIP": "返回在第二個字串中的第一個/最後一個匹配項目的索引值。如果未找到則返回 0。", - "TEXT_INDEXOF_INPUT_INTEXT": "在字串", - "TEXT_INDEXOF_OPERATOR_FIRST": "尋找 第一個 出現的字串", - "TEXT_INDEXOF_OPERATOR_LAST": "尋找 最後一個 出現的字串", - "TEXT_CHARAT_INPUT_INTEXT": "的字元在字串", - "TEXT_CHARAT_FROM_START": "取得 字元 #", - "TEXT_CHARAT_FROM_END": "取得 倒數第 # 個字元", - "TEXT_CHARAT_FIRST": "取第一個字元", - "TEXT_CHARAT_LAST": "取最後一個字元", - "TEXT_CHARAT_RANDOM": "取隨機一個字元", - "TEXT_CHARAT_TAIL": "", - "TEXT_CHARAT_TOOLTIP": "返回位於指定位置的字元。", - "TEXT_GET_SUBSTRING_TOOLTIP": "返回指定的部分文字。", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "自字串", - "TEXT_GET_SUBSTRING_START_FROM_START": "取得一段字串自 #", - "TEXT_GET_SUBSTRING_START_FROM_END": "取得一段字串自 #", - "TEXT_GET_SUBSTRING_START_FIRST": "取得一段字串 自 第一個字元", - "TEXT_GET_SUBSTRING_END_FROM_START": "到 字元 #", - "TEXT_GET_SUBSTRING_END_FROM_END": "到 倒數第 # 個字元", - "TEXT_GET_SUBSTRING_END_LAST": "到 最後一個字元", - "TEXT_CHANGECASE_TOOLTIP": "使用不同的大小寫複製這段文字。", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "轉成 大寫", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "轉成 小寫", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "轉成 首字母大寫", - "TEXT_TRIM_TOOLTIP": "複製這段文字的同時刪除兩端多餘的空格。", - "TEXT_TRIM_OPERATOR_BOTH": "消除兩側空格", - "TEXT_TRIM_OPERATOR_LEFT": "消除左側空格", - "TEXT_TRIM_OPERATOR_RIGHT": "消除右側空格", - "TEXT_PRINT_TITLE": "印出 %1", - "TEXT_PRINT_TOOLTIP": "印出指定的文字、 數字或其他值。", - "TEXT_PROMPT_TYPE_TEXT": "輸入 文字 並顯示提示訊息", - "TEXT_PROMPT_TYPE_NUMBER": "輸入 數字 並顯示提示訊息", - "TEXT_PROMPT_TOOLTIP_NUMBER": "輸入數字", - "TEXT_PROMPT_TOOLTIP_TEXT": "輸入文字", - "LISTS_CREATE_EMPTY_TITLE": "建立空列表", - "LISTS_CREATE_EMPTY_TOOLTIP": "返回一個長度為 0 的列表,不包含任何資料記錄", - "LISTS_CREATE_WITH_TOOLTIP": "建立一個具備任意數量項目的列表。", - "LISTS_CREATE_WITH_INPUT_WITH": "使用這些值建立列表", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "加入", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "添加、 刪除或重新排列各區塊來此重新配置這個 列表 積木。", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "將一個項目加入到列表中。", - "LISTS_REPEAT_TOOLTIP": "建立包含指定重複次數的 值 的列表。", - "LISTS_REPEAT_TITLE": "建立列表使用項目 %1 重複 %2 次數", - "LISTS_LENGTH_TITLE": "長度 %1", - "LISTS_LENGTH_TOOLTIP": "返回列表的長度。", - "LISTS_ISEMPTY_TITLE": "%1 值為空", - "LISTS_ISEMPTY_TOOLTIP": "如果該列表為空,則返回 真。", - "LISTS_INLIST": "自列表", - "LISTS_INDEX_OF_FIRST": "找出 第一個 項目出現", - "LISTS_INDEX_OF_LAST": "找出 最後一個 項目出現", - "LISTS_INDEX_OF_TOOLTIP": "返回在列表中的第一個/最後一個匹配項目的索引值。如果未找到則返回 0。", - "LISTS_GET_INDEX_GET": "取值", - "LISTS_GET_INDEX_GET_REMOVE": "取出並移除", - "LISTS_GET_INDEX_REMOVE": "移除", - "LISTS_GET_INDEX_FROM_END": "倒數第#筆", - "LISTS_GET_INDEX_FIRST": "第一筆", - "LISTS_GET_INDEX_LAST": "最後一筆", - "LISTS_GET_INDEX_RANDOM": "隨機", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "返回在列表中的指定位置的項目。#1 是第一個項目。", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "返回在列表中的指定位置的項目。#1 是最後一個項目。", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "返回列表中的第一個項目", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "返回列表中的最後一個項目", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "返回列表中隨機的一個項目", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "移除並返回列表中的指定位置的項目。#1 是第一個項目。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "移除並返回列表中的指定位置的項目。#1 是最後一個項目。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "移除並返回列表中的第一個項目", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "移除並返回列表中的最後一個項目", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "移除並返回列表中的隨機一個項目", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "移除在列表中的指定位置的項目。#1 是第一個項目。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "移除在列表中的指定位置的項目。#1 是最後一個項目。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "移除列表中的第一個項目", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "移除列表中的最後一個項目", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "移除列表中隨機的一個項目", - "LISTS_SET_INDEX_SET": "設定", - "LISTS_SET_INDEX_INSERT": "插入到", - "LISTS_SET_INDEX_INPUT_TO": "為", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "設定在列表中的指定位置的項目。#1 是第一個項目。", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "設定在列表中的指定位置的項目。#1 是最後一個項目。", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "設定列表中的第一個項目", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "設定列表中的最後一個項目", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "設定列表中隨機的一個項目", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "插入在列表中的指定位置的項目。#1 是第一個項目。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "插入在列表中的指定位置的項目。#1 是最後一個項目。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "在列表的起始處添加一個項目。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "在列表的尾端加入一個項目", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "在列表中隨機插入項目", - "LISTS_GET_SUBLIST_START_FROM_START": "從 # 取得子列表", - "LISTS_GET_SUBLIST_START_FROM_END": "從倒數 # 取得子列表", - "LISTS_GET_SUBLIST_START_FIRST": "從 頭 取得子列表", - "LISTS_GET_SUBLIST_END_FROM_START": "到 #", - "LISTS_GET_SUBLIST_END_FROM_END": "到 倒數 # 位", - "LISTS_GET_SUBLIST_END_LAST": "到 最後", - "LISTS_GET_SUBLIST_TOOLTIP": "複製列表中指定的部分。", - "VARIABLES_GET_TOOLTIP": "返回此變量的值。", - "VARIABLES_GET_CREATE_SET": "創立 '設定 %1'", - "VARIABLES_SET": "賦值 %1 到 %2", - "VARIABLES_SET_TOOLTIP": "設定此變量,好和輸入值相等。", - "VARIABLES_SET_CREATE_GET": "建立 '取得 %1'", - "PROCEDURES_DEFNORETURN_TITLE": "到", - "PROCEDURES_DEFNORETURN_PROCEDURE": "流程", - "PROCEDURES_BEFORE_PARAMS": "與:", - "PROCEDURES_CALL_BEFORE_PARAMS": "與:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "創建一個無回傳值的函數。", - "PROCEDURES_DEFRETURN_RETURN": "回傳", - "PROCEDURES_DEFRETURN_TOOLTIP": "創建一個有回傳值的函數。", - "PROCEDURES_DEF_DUPLICATE_WARNING": "警告: 此函數中有重複的參數。", - "PROCEDURES_CALLNORETURN_HELPURL": "https://zh.wikipedia.org/wiki/子程式", - "PROCEDURES_CALLNORETURN_CALL": "呼叫", - "PROCEDURES_CALLNORETURN_TOOLTIP": "執行使用者定義的函數 '%1'。", - "PROCEDURES_CALLRETURN_HELPURL": "https://zh.wikipedia.org/wiki/子程式", - "PROCEDURES_CALLRETURN_TOOLTIP": "執行使用者定義的函數 '%1' 並使用它的回傳值", - "PROCEDURES_MUTATORCONTAINER_TITLE": "參數", - "PROCEDURES_MUTATORARG_TITLE": "變量:", - "PROCEDURES_HIGHLIGHT_DEF": "反白顯示函式定義", - "PROCEDURES_CREATE_DO": "建立 '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "如果值為 真,則返回第二個值。", - "PROCEDURES_IFRETURN_WARNING": "警告: 此積木僅可在定義函式時使用。" -} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/messages.js b/src/opsoro/apps/visual_programming/static/blockly/msg/messages.js deleted file mode 100644 index 47fb477..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/messages.js +++ /dev/null @@ -1,1100 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview English strings. - * @author fraser@google.com (Neil Fraser) - * - * After modifying this file, either run "build.py" from the parent directory, - * or run (from this directory): - * ../i18n/js_to_json.py - * to regenerate json/{en,qqq,synonyms}.json. - * - * To convert all of the json files to .js files, run: - * ../i18n/create_messages.py json/*.json - */ -'use strict'; - -goog.provide('Blockly.Msg.en'); - -goog.require('Blockly.Msg'); - - -/** - * Due to the frequency of long strings, the 80-column wrap rule need not apply - * to message files. - */ - -/** - * Tip: Generate URLs for read-only blocks by creating the blocks in the Code app, - * then evaluating this in the console: - * 'http://blockly-demo.appspot.com/static/apps/code/readonly.html?lang=en&xml=' + encodeURIComponent(Blockly.Xml.domToText(Blockly.Xml.workspaceToDom(Blockly.mainWorkspace)).slice(5, -6)) - */ - -/// default name - A simple, general default name for a variable, preferably short. -/// For more context, see -/// [[Translating:Blockly#infrequent_message_types]].\n{{Identical|Item}} -Blockly.Msg.VARIABLES_DEFAULT_NAME = 'item'; -/// button text - Botton that sets a calendar to today's date.\n{{Identical|Today}} -Blockly.Msg.TODAY = 'Today'; - -// Context menus. -/// context menu - Make a copy of the selected block (and any blocks it contains).\n{{Identical|Duplicate}} -Blockly.Msg.DUPLICATE_BLOCK = 'Duplicate'; -/// context menu - Add a descriptive comment to the selected block. -Blockly.Msg.ADD_COMMENT = 'Add Comment'; -/// context menu - Remove the descriptive comment from the selected block. -Blockly.Msg.REMOVE_COMMENT = 'Remove Comment'; -/// context menu - Change from 'external' to 'inline' mode for displaying blocks used as inputs to the selected block. See [[Translating:Blockly#context_menus]]. -Blockly.Msg.EXTERNAL_INPUTS = 'External Inputs'; -/// context menu - Change from 'internal' to 'external' mode for displaying blocks used as inputs to the selected block. See [[Translating:Blockly#context_menus]]. -Blockly.Msg.INLINE_INPUTS = 'Inline Inputs'; -/// context menu - Permanently delete the selected block. -Blockly.Msg.DELETE_BLOCK = 'Delete Block'; -/// context menu - Permanently delete the %1 selected blocks.\n\nParameters:\n* %1 - an integer greater than 1. -Blockly.Msg.DELETE_X_BLOCKS = 'Delete %1 Blocks'; -/// context menu - Reposition all the blocks so that they form a neat line. -Blockly.Msg.CLEAN_UP = 'Clean up Blocks'; -/// context menu - Make the appearance of the selected block smaller by hiding some information about it. -Blockly.Msg.COLLAPSE_BLOCK = 'Collapse Block'; -/// context menu - Make the appearance of all blocks smaller by hiding some information about it. Use the same terminology as in the previous message. -Blockly.Msg.COLLAPSE_ALL = 'Collapse Blocks'; -/// context menu - Restore the appearance of the selected block by showing information about it that was hidden (collapsed) earlier. -Blockly.Msg.EXPAND_BLOCK = 'Expand Block'; -/// context menu - Restore the appearance of all blocks by showing information about it that was hidden (collapsed) earlier. Use the same terminology as in the previous message. -Blockly.Msg.EXPAND_ALL = 'Expand Blocks'; -/// context menu - Make the selected block have no effect (unless reenabled). -Blockly.Msg.DISABLE_BLOCK = 'Disable Block'; -/// context menu - Make the selected block have effect (after having been disabled earlier). -Blockly.Msg.ENABLE_BLOCK = 'Enable Block'; -/// context menu - Provide helpful information about the selected block.\n{{Identical|Help}} -Blockly.Msg.HELP = 'Help'; - -// Realtime collaboration. -/// collaboration instruction - Tell the user that they can talk with other users. -Blockly.Msg.CHAT = 'Chat with your collaborator by typing in this box!'; -/// authorization instruction - Ask the user to authorize this app so it can be saved and shared by them. -Blockly.Msg.AUTH = 'Please authorize this app to enable your work to be saved and to allow it to be shared by you.'; -/// First person singular - objective case -Blockly.Msg.ME = 'Me'; - -// Variable renaming. -/// prompt - This message is only seen in the Opera browser. With most browsers, users can edit numeric values in blocks by just clicking and typing. Opera does not allows this, so we have to open a new window and prompt users with this message to chanage a value. -Blockly.Msg.CHANGE_VALUE_TITLE = 'Change value:'; -/// dropdown choice - When the user clicks on a variable block, this is one of the dropdown menu choices. It is used to define a new variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu]. -Blockly.Msg.NEW_VARIABLE = 'New variable...'; -/// prompt - Prompts the user to enter the name for a new variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu]. -Blockly.Msg.NEW_VARIABLE_TITLE = 'New variable name:'; -/// dropdown choice - When the user clicks on a variable block, this is one of the dropdown menu choices. It is used to rename the current variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu]. -Blockly.Msg.RENAME_VARIABLE = 'Rename variable...'; -/// prompt - Prompts the user to enter the new name for the selected variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu].\n\nParameters:\n* %1 - the name of the variable to be renamed. -Blockly.Msg.RENAME_VARIABLE_TITLE = 'Rename all "%1" variables to:'; - -// Colour Blocks. -/// url - Information about colour. -Blockly.Msg.COLOUR_PICKER_HELPURL = 'https://en.wikipedia.org/wiki/Color'; -/// tooltip - See [https://github.com/google/blockly/wiki/Colour#picking-a-colour-from-a-palette https://github.com/google/blockly/wiki/Colour#picking-a-colour-from-a-palette]. -Blockly.Msg.COLOUR_PICKER_TOOLTIP = 'Choose a colour from the palette.'; -/// url - A link that displays a random colour each time you visit it. -Blockly.Msg.COLOUR_RANDOM_HELPURL = 'http://randomcolour.com'; -/// block text - Title of block that generates a colour at random. -Blockly.Msg.COLOUR_RANDOM_TITLE = 'random colour'; -/// tooltip - See [https://github.com/google/blockly/wiki/Colour#generating-a-random-colour https://github.com/google/blockly/wiki/Colour#generating-a-random-colour]. -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = 'Choose a colour at random.'; -/// url - A link for color codes with percentages (0-100%) for each component, instead of the more common 0-255, which may be more difficult for beginners. -Blockly.Msg.COLOUR_RGB_HELPURL = 'http://www.december.com/html/spec/colorper.html'; -/// block text - Title of block for [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components]. -Blockly.Msg.COLOUR_RGB_TITLE = 'colour with'; -/// block input text - The amount of red (from 0 to 100) to use when [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].\n{{Identical|Red}} -Blockly.Msg.COLOUR_RGB_RED = 'red'; -/// block input text - The amount of green (from 0 to 100) to use when [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components]. -Blockly.Msg.COLOUR_RGB_GREEN = 'green'; -/// block input text - The amount of blue (from 0 to 100) to use when [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].\n{{Identical|Blue}} -Blockly.Msg.COLOUR_RGB_BLUE = 'blue'; -/// tooltip - See [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components]. -Blockly.Msg.COLOUR_RGB_TOOLTIP = 'Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100.'; -/// url - A useful link that displays blending of two colors. -Blockly.Msg.COLOUR_BLEND_HELPURL = 'http://meyerweb.com/eric/tools/color-blend/'; -/// block text - A verb for blending two shades of paint. -Blockly.Msg.COLOUR_BLEND_TITLE = 'blend'; -/// block input text - The first of two colours to [https://github.com/google/blockly/wiki/Colour#blending-colours blend]. -Blockly.Msg.COLOUR_BLEND_COLOUR1 = 'colour 1'; -/// block input text - The second of two colours to [https://github.com/google/blockly/wiki/Colour#blending-colours blend]. -Blockly.Msg.COLOUR_BLEND_COLOUR2 = 'colour 2'; -/// block input text - The proportion of the [https://github.com/google/blockly/wiki/Colour#blending-colours blend] containing the first color; the remaining proportion is of the second colour. For example, if the first colour is red and the second color blue, a ratio of 1 would yield pure red, a ratio of .5 would yield purple (equal amounts of red and blue), and a ratio of 0 would yield pure blue.\n{{Identical|Ratio}} -Blockly.Msg.COLOUR_BLEND_RATIO = 'ratio'; -/// tooltip - See [https://github.com/google/blockly/wiki/Colour#blending-colours https://github.com/google/blockly/wiki/Colour#blending-colours]. -Blockly.Msg.COLOUR_BLEND_TOOLTIP = 'Blends two colours together with a given ratio (0.0 - 1.0).'; - -// Loop Blocks. -/// url - Describes 'repeat loops' in computer programs; consider using the translation of the page [https://en.wikipedia.org/wiki/Control_flow http://en.wikipedia.org/wiki/Control_flow]. -Blockly.Msg.CONTROLS_REPEAT_HELPURL = 'https://en.wikipedia.org/wiki/For_loop'; -/// block input text - Title of [https://github.com/google/blockly/wiki/Loops#repeat repeat block].\n\nParameters:\n* %1 - the number of times the body of the loop should be repeated. -Blockly.Msg.CONTROLS_REPEAT_TITLE = 'repeat %1 times'; -/// block text - Preceding the blocks in the body of the loop. See [https://github.com/google/blockly/wiki/Loops https://github.com/google/blockly/wiki/Loops].\n{{Identical|Do}} -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = 'do'; -/// tooltip - See [https://github.com/google/blockly/wiki/Loops#repeat https://github.com/google/blockly/wiki/Loops#repeat]. -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = 'Do some statements several times.'; -/// url - Describes 'while loops' in computer programs; consider using the translation of [https://en.wikipedia.org/wiki/While_loop https://en.wikipedia.org/wiki/While_loop], if present, or [https://en.wikipedia.org/wiki/Control_flow https://en.wikipedia.org/wiki/Control_flow]. -Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = 'https://github.com/google/blockly/wiki/Loops#repeat'; -Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -/// dropdown - Specifies that a loop should [https://github.com/google/blockly/wiki/Loops#repeat-while repeat while] the following condition is true. -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = 'repeat while'; -/// dropdown - Specifies that a loop should [https://github.com/google/blockly/wiki/Loops#repeat-until repeat until] the following condition becomes true. -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = 'repeat until'; -/// tooltip - See [https://github.com/google/blockly/wiki/Loops#repeat-while Loops#repeat-while https://github.com/google/blockly/wiki/Loops#repeat-while Loops#repeat-while]. -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = 'While a value is true, then do some statements.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Loops#repeat-until https://github.com/google/blockly/wiki/Loops#repeat-until]. -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = 'While a value is false, then do some statements.'; - -/// url - Describes 'for loops' in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/For_loop https://en.wikipedia.org/wiki/For_loop], if present. -Blockly.Msg.CONTROLS_FOR_HELPURL = 'https://github.com/google/blockly/wiki/Loops#count-with'; -/// tooltip - See [https://github.com/google/blockly/wiki/Loops#count-with https://github.com/google/blockly/wiki/Loops#count-with].\n\nParameters:\n* %1 - the name of the loop variable. -Blockly.Msg.CONTROLS_FOR_TOOLTIP = 'Have the variable "%1" take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks.'; -/// block text - Repeatedly counts a variable (%1) -/// starting with a (usually lower) number in a range (%2), -/// ending with a (usually higher) number in a range (%3), and counting the -/// iterations by a number of steps (%4). As in -/// [https://github.com/google/blockly/wiki/Loops#count-with -/// https://github.com/google/blockly/wiki/Loops#count-with]. -/// [[File:Blockly-count-with.png]] -Blockly.Msg.CONTROLS_FOR_TITLE = 'count with %1 from %2 to %3 by %4'; -Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; - -/// url - Describes 'for-each loops' in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/Foreach https://en.wikipedia.org/wiki/Foreach] if present. -Blockly.Msg.CONTROLS_FOREACH_HELPURL = 'https://github.com/google/blockly/wiki/Loops#for-each'; -/// block text - Title of [https://github.com/google/blockly/wiki/Loops#for-each for each block]. -/// Sequentially assigns every item in array %2 to the valiable %1. -Blockly.Msg.CONTROLS_FOREACH_TITLE = 'for each item %1 in list %2'; -Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -/// block text - Description of [https://github.com/google/blockly/wiki/Loops#for-each for each blocks].\n\nParameters:\n* %1 - the name of the loop variable. -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = 'For each item in a list, set the variable "%1" to the item, and then do some statements.'; - -/// url - Describes control flow in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/Control_flow https://en.wikipedia.org/wiki/Control_flow], if it exists. -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = 'https://github.com/google/blockly/wiki/Loops#loop-termination-blocks'; -/// dropdown - The current loop should be exited. See [https://github.com/google/blockly/wiki/Loops#break https://github.com/google/blockly/wiki/Loops#break]. -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = 'break out of loop'; -/// dropdown - The current iteration of the loop should be ended and the next should begin. See [https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration]. -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = 'continue with next iteration of loop'; -/// tooltip - See [https://github.com/google/blockly/wiki/Loops#break-out-of-loop https://github.com/google/blockly/wiki/Loops#break-out-of-loop]. -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = 'Break out of the containing loop.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration]. -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = 'Skip the rest of this loop, and continue with the next iteration.'; -/// warning - The user has tried placing a block outside of a loop (for each, while, repeat, etc.), but this type of block may only be used within a loop. See [https://github.com/google/blockly/wiki/Loops#loop-termination-blocks https://github.com/google/blockly/wiki/Loops#loop-termination-blocks]. -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = 'Warning: This block may only be used within a loop.'; - -// Logic Blocks. -/// url - Describes conditional statements (if-then-else) in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_else https://en.wikipedia.org/wiki/If_else], if present. -Blockly.Msg.CONTROLS_IF_HELPURL = 'https://github.com/google/blockly/wiki/IfElse'; -/// tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-blocks 'if' blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present. -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = 'If a value is true, then do some statements.'; -/// tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-else-blocks if-else blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present. -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = 'If a value is true, then do the first block of statements. Otherwise, do the second block of statements.'; -/// tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-else-if-blocks if-else-if blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present. -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = 'If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements.'; -/// tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-else-if-else-blocks if-else-if-else blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present. -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = 'If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements.'; -/// block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. -/// It is recommended, but not essential, that this have text in common with the translation of 'else if' -Blockly.Msg.CONTROLS_IF_MSG_IF = 'if'; -/// block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. The English words "otherwise if" would probably be clearer than "else if", but the latter is used because it is traditional and shorter. -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = 'else if'; -/// block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. The English word "otherwise" would probably be superior to "else", but the latter is used because it is traditional and shorter. -Blockly.Msg.CONTROLS_IF_MSG_ELSE = 'else'; -Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; -/// tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#block-modification if block modification]. -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = 'Add, remove, or reorder sections to reconfigure this if block.'; -Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; -/// tooltip - Describes the 'else if' subblock during [https://github.com/google/blockly/wiki/IfElse#block-modification if block modification]. -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = 'Add a condition to the if block.'; -Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -/// tooltip - Describes the 'else' subblock during [https://github.com/google/blockly/wiki/IfElse#block-modification if block modification]. -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = 'Add a final, catch-all condition to the if block.'; - -/// url - Information about comparisons. -Blockly.Msg.LOGIC_COMPARE_HELPURL = 'https://en.wikipedia.org/wiki/Inequality_(mathematics)'; -/// tooltip - Describes the equals (=) block. -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = 'Return true if both inputs equal each other.'; -/// tooltip - Describes the not equals (≠) block. -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = 'Return true if both inputs are not equal to each other.'; -/// tooltip - Describes the less than (<) block. -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = 'Return true if the first input is smaller than the second input.'; -/// tooltip - Describes the less than or equals (≤) block. -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = 'Return true if the first input is smaller than or equal to the second input.'; -/// tooltip - Describes the greater than (>) block. -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = 'Return true if the first input is greater than the second input.'; -/// tooltip - Describes the greater than or equals (≥) block. -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = 'Return true if the first input is greater than or equal to the second input.'; - -/// url - Information about the Boolean conjunction ("and") and disjunction ("or") operators. Consider using the translation of [https://en.wikipedia.org/wiki/Boolean_logic https://en.wikipedia.org/wiki/Boolean_logic], if it exists in your language. -Blockly.Msg.LOGIC_OPERATION_HELPURL = 'https://github.com/google/blockly/wiki/Logic#logical-operations'; -/// tooltip - See [https://en.wikipedia.org/wiki/Logical_conjunction https://en.wikipedia.org/wiki/Logical_conjunction]. -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = 'Return true if both inputs are true.'; -/// block text - See [https://en.wikipedia.org/wiki/Logical_conjunction https://en.wikipedia.org/wiki/Logical_conjunction]. -Blockly.Msg.LOGIC_OPERATION_AND = 'and'; -/// block text - See [https://en.wikipedia.org/wiki/Disjunction https://en.wikipedia.org/wiki/Disjunction]. -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = 'Return true if at least one of the inputs is true.'; -/// block text - See [https://en.wikipedia.org/wiki/Disjunction https://en.wikipedia.org/wiki/Disjunction]. -Blockly.Msg.LOGIC_OPERATION_OR = 'or'; - -/// url - Information about logical negation. The translation of [https://en.wikipedia.org/wiki/Logical_negation https://en.wikipedia.org/wiki/Logical_negation] is recommended if it exists in the target language. -Blockly.Msg.LOGIC_NEGATE_HELPURL = 'https://github.com/google/blockly/wiki/Logic#not'; -/// block text - This is a unary operator that returns ''false'' when the input is ''true'', and ''true'' when the input is ''false''. -/// \n\nParameters:\n* %1 - the input (which should be either the value "true" or "false") -Blockly.Msg.LOGIC_NEGATE_TITLE = 'not %1'; -/// tooltip - See [https://en.wikipedia.org/wiki/Logical_negation https://en.wikipedia.org/wiki/Logical_negation]. -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = 'Returns true if the input is false. Returns false if the input is true.'; - -/// url - Information about the logic values ''true'' and ''false''. Consider using the translation of [https://en.wikipedia.org/wiki/Truth_value https://en.wikipedia.org/wiki/Truth_value] if it exists in your language. -Blockly.Msg.LOGIC_BOOLEAN_HELPURL = 'https://github.com/google/blockly/wiki/Logic#values'; -/// block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''true''. -Blockly.Msg.LOGIC_BOOLEAN_TRUE = 'true'; -/// block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''false''. -Blockly.Msg.LOGIC_BOOLEAN_FALSE = 'false'; -/// tooltip - Indicates that the block returns either of the two possible [https://en.wikipedia.org/wiki/Truth_value logical values]. -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = 'Returns either true or false.'; - -/// url - Provide a link to the translation of [https://en.wikipedia.org/wiki/Nullable_type https://en.wikipedia.org/wiki/Nullable_type], if it exists in your language; otherwise, do not worry about translating this advanced concept. -Blockly.Msg.LOGIC_NULL_HELPURL = 'https://en.wikipedia.org/wiki/Nullable_type'; -/// block text - In computer languages, ''null'' is a special value that indicates that no value has been set. You may use your language's word for "nothing" or "invalid". -Blockly.Msg.LOGIC_NULL = 'null'; -/// tooltip - This should use the word from the previous message. -Blockly.Msg.LOGIC_NULL_TOOLTIP = 'Returns null.'; - -/// url - Describes the programming language operator known as the ''ternary'' or ''conditional'' operator. It is recommended that you use the translation of [https://en.wikipedia.org/wiki/%3F: https://en.wikipedia.org/wiki/%3F:] if it exists. -Blockly.Msg.LOGIC_TERNARY_HELPURL = 'https://en.wikipedia.org/wiki/%3F:'; -/// block input text - Label for the input whose value determines which of the other two inputs is returned. In some programming languages, this is called a ''''predicate''''. -Blockly.Msg.LOGIC_TERNARY_CONDITION = 'test'; -/// block input text - Indicates that the following input should be returned (used as output) if the test input is true. Remember to try to keep block text terse (short). -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = 'if true'; -/// block input text - Indicates that the following input should be returned (used as output) if the test input is false. -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = 'if false'; -/// tooltip - See [https://en.wikipedia.org/wiki/%3F: https://en.wikipedia.org/wiki/%3F:]. -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = 'Check the condition in "test". If the condition is true, returns the "if true" value; otherwise returns the "if false" value.'; - -// Math Blocks. -/// url - Information about (real) numbers. -Blockly.Msg.MATH_NUMBER_HELPURL = 'https://en.wikipedia.org/wiki/Number'; -/// tooltip - Any positive or negative number, not necessarily an integer. -Blockly.Msg.MATH_NUMBER_TOOLTIP = 'A number.'; - -/// {{optional}}\nmath - The symbol for the binary operation addition. -Blockly.Msg.MATH_ADDITION_SYMBOL = '+'; -/// {{optional}}\nmath - The symbol for the binary operation indicating that the right operand should be -/// subtracted from the left operand. -Blockly.Msg.MATH_SUBTRACTION_SYMBOL = '-'; -/// {{optional}}\nmath - The binary operation indicating that the left operand should be divided by -/// the right operand. -Blockly.Msg.MATH_DIVISION_SYMBOL = '÷'; -/// {{optional}}\nmath - The symbol for the binary operation multiplication. -Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = '×'; -/// {{optional}}\nmath - The symbol for the binary operation exponentiation. Specifically, if the -/// value of the left operand is L and the value of the right operand (the exponent) is -/// R, multiply L by itself R times. (Fractional and negative exponents are also legal.) -Blockly.Msg.MATH_POWER_SYMBOL = '^'; - -/// math - The short name of the trigonometric function -/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent sine]. -Blockly.Msg.MATH_TRIG_SIN = 'sin'; -/// math - The short name of the trigonometric function -/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent cosine]. -Blockly.Msg.MATH_TRIG_COS = 'cos'; -/// math - The short name of the trigonometric function -/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent tangent]. -Blockly.Msg.MATH_TRIG_TAN = 'tan'; -/// math - The short name of the ''inverse of'' the trigonometric function -/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent sine]. -Blockly.Msg.MATH_TRIG_ASIN = 'asin'; -/// math - The short name of the ''inverse of'' the trigonometric function -/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent cosine]. -Blockly.Msg.MATH_TRIG_ACOS = 'acos'; -/// math - The short name of the ''inverse of'' the trigonometric function -/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent tangent]. -Blockly.Msg.MATH_TRIG_ATAN = 'atan'; - -/// url - Information about addition, subtraction, multiplication, division, and exponentiation. -Blockly.Msg.MATH_ARITHMETIC_HELPURL = 'https://en.wikipedia.org/wiki/Arithmetic'; -/// tooltip - See [https://en.wikipedia.org/wiki/Addition https://en.wikipedia.org/wiki/Addition]. -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = 'Return the sum of the two numbers.'; -/// tooltip - See [https://en.wikipedia.org/wiki/Subtraction https://en.wikipedia.org/wiki/Subtraction]. -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = 'Return the difference of the two numbers.'; -/// tooltip - See [https://en.wikipedia.org/wiki/Multiplication https://en.wikipedia.org/wiki/Multiplication]. -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = 'Return the product of the two numbers.'; -/// tooltip - See [https://en.wikipedia.org/wiki/Division_(mathematics) https://en.wikipedia.org/wiki/Division_(mathematics)]. -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = 'Return the quotient of the two numbers.'; -/// tooltip - See [https://en.wikipedia.org/wiki/Exponentiation https://en.wikipedia.org/wiki/Exponentiation]. -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = 'Return the first number raised to the power of the second number.'; - -/// url - Information about the square root operation. -Blockly.Msg.MATH_SINGLE_HELPURL = 'https://en.wikipedia.org/wiki/Square_root'; -/// dropdown - This computes the positive [https://en.wikipedia.org/wiki/Square_root square root] of its input. For example, the square root of 16 is 4. -Blockly.Msg.MATH_SINGLE_OP_ROOT = 'square root'; -/// tooltip - Please use the same term as in the previous message. -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = 'Return the square root of a number.'; -/// dropdown - This leaves positive numeric inputs changed and inverts negative inputs. For example, the absolute value of 5 is 5; the absolute value of -5 is also 5. For more information, see [https://en.wikipedia.org/wiki/Absolute_value https://en.wikipedia.org/wiki/Absolute_value]. -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = 'absolute'; -/// tooltip - Please use the same term as in the previous message. -Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = 'Return the absolute value of a number.'; - -/// tooltip - Calculates '''0-n''', where '''n''' is the single numeric input. -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = 'Return the negation of a number.'; -/// tooltip - Calculates the [https://en.wikipedia.org/wiki/Natural_logarithm|natural logarithm] of its single numeric input. -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = 'Return the natural logarithm of a number.'; -/// tooltip - Calculates the [https://en.wikipedia.org/wiki/Common_logarithm common logarithm] of its single numeric input. -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = 'Return the base 10 logarithm of a number.'; -/// tooltip - Multiplies [https://en.wikipedia.org/wiki/E_%28mathematical_constant%29 e] by itself n times, where n is the single numeric input. -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = 'Return e to the power of a number.'; -/// tooltip - Multiplies 10 by itself n times, where n is the single numeric input. -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = 'Return 10 to the power of a number.'; - -/// url - Information about the trigonometric functions sine, cosine, tangent, and their inverses (ideally using degrees, not radians). -Blockly.Msg.MATH_TRIG_HELPURL = 'https://en.wikipedia.org/wiki/Trigonometric_functions'; -/// tooltip - Return the [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent sine] of an [https://en.wikipedia.org/wiki/Degree_(angle) angle in degrees], not radians. -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = 'Return the sine of a degree (not radian).'; -/// tooltip - Return the [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent cosine] of an [https://en.wikipedia.org/wiki/Degree_(angle) angle in degrees], not radians. -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = 'Return the cosine of a degree (not radian).'; -/// tooltip - Return the [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent tangent] of an [https://en.wikipedia.org/wiki/Degree_(angle) angle in degrees], not radians. -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = 'Return the tangent of a degree (not radian).'; -/// tooltip - The [https://en.wikipedia.org/wiki/Inverse_trigonometric_functions inverse] of the [https://en.wikipedia.org/wiki/Cosine#Sine.2C_cosine_and_tangent sine function], using [https://en.wikipedia.org/wiki/Degree_(angle) degrees], not radians. -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = 'Return the arcsine of a number.'; -/// tooltip - The [https://en.wikipedia.org/wiki/Inverse_trigonometric_functions inverse] of the [https://en.wikipedia.org/wiki/Cosine#Sine.2C_cosine_and_tangent cosine] function, using [https://en.wikipedia.org/wiki/Degree_(angle) degrees], not radians. -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = 'Return the arccosine of a number.'; -/// tooltip - The [https://en.wikipedia.org/wiki/Inverse_trigonometric_functions inverse] of the [https://en.wikipedia.org/wiki/Cosine#Sine.2C_cosine_and_tangent tangent] function, using [https://en.wikipedia.org/wiki/Degree_(angle) degrees], not radians. -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = 'Return the arctangent of a number.'; - -/// url - Information about the mathematical constants Pi (π), e, the golden ratio (φ), √ 2, √ 1/2, and infinity (∞). -Blockly.Msg.MATH_CONSTANT_HELPURL = 'https://en.wikipedia.org/wiki/Mathematical_constant'; -/// tooltip - Provides the specified [https://en.wikipedia.org/wiki/Mathematical_constant mathematical constant]. -Blockly.Msg.MATH_CONSTANT_TOOLTIP = 'Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).'; -/// dropdown - A number is '''even''' if it is a multiple of 2. For example, 4 is even (yielding true), but 3 is not (false). -Blockly.Msg.MATH_IS_EVEN = 'is even'; -/// dropdown - A number is '''odd''' if it is not a multiple of 2. For example, 3 is odd (yielding true), but 4 is not (false). The opposite of "odd" is "even". -Blockly.Msg.MATH_IS_ODD = 'is odd'; -/// dropdown - A number is [https://en.wikipedia.org/wiki/Prime prime] if it cannot be evenly divided by any positive integers except for 1 and itself. For example, 5 is prime, but 6 is not because 2 × 3 = 6. -Blockly.Msg.MATH_IS_PRIME = 'is prime'; -/// dropdown - A number is '''whole''' if it is an [https://en.wikipedia.org/wiki/Integer integer]. For example, 5 is whole, but 5.1 is not. -Blockly.Msg.MATH_IS_WHOLE = 'is whole'; -/// dropdown - A number is '''positive''' if it is greater than 0. (0 is neither negative nor positive.) -Blockly.Msg.MATH_IS_POSITIVE = 'is positive'; -/// dropdown - A number is '''negative''' if it is less than 0. (0 is neither negative nor positive.) -Blockly.Msg.MATH_IS_NEGATIVE = 'is negative'; -/// dropdown - A number x is divisible by y if y goes into x evenly. For example, 10 is divisible by 5, but 10 is not divisible by 3. -Blockly.Msg.MATH_IS_DIVISIBLE_BY = 'is divisible by'; -/// tooltip - This block lets the user specify via a dropdown menu whether to check if the numeric input is even, odd, prime, whole, positive, negative, or divisible by a given value. -Blockly.Msg.MATH_IS_TOOLTIP = 'Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false.'; - -/// url - Information about incrementing (increasing the value of) a variable. -/// For other languages, just use the translation of the Wikipedia page about -/// addition ([https://en.wikipedia.org/wiki/Addition https://en.wikipedia.org/wiki/Addition]). -Blockly.Msg.MATH_CHANGE_HELPURL = 'https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter'; -/// - As in: ''change'' [the value of variable] ''item'' ''by'' 1 (e.g., if the variable named 'item' had the value 5, change it to 6). -/// %1 is a variable name. -/// %2 is the amount of change. -Blockly.Msg.MATH_CHANGE_TITLE = 'change %1 by %2'; -Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -/// tooltip - This updates the value of the variable by adding to it the following numeric input.\n\nParameters:\n* %1 - the name of the variable whose value should be increased. -Blockly.Msg.MATH_CHANGE_TOOLTIP = 'Add a number to variable "%1".'; - -/// url - Information about how numbers are rounded to the nearest integer -Blockly.Msg.MATH_ROUND_HELPURL = 'https://en.wikipedia.org/wiki/Rounding'; -/// tooltip - See [https://en.wikipedia.org/wiki/Rounding https://en.wikipedia.org/wiki/Rounding]. -Blockly.Msg.MATH_ROUND_TOOLTIP = 'Round a number up or down.'; -/// dropdown - This rounds its input to the nearest whole number. For example, 3.4 is rounded to 3. -Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = 'round'; -/// dropdown - This rounds its input up to the nearest whole number. For example, if the input was 2.2, the result would be 3. -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = 'round up'; -/// dropdown - This rounds its input down to the nearest whole number. For example, if the input was 3.8, the result would be 3. -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = 'round down'; - -/// url - Information about applying a function to a list of numbers. (We were unable to find such information in English. Feel free to skip this and any other URLs that are difficult.) -Blockly.Msg.MATH_ONLIST_HELPURL = ''; -/// dropdown - This computes the sum of the numeric elements in the list. For example, the sum of the list {1, 4} is 5. -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = 'sum of list'; -/// tooltip - Please use the same term for "sum" as in the previous message. -Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = 'Return the sum of all the numbers in the list.'; -/// dropdown - This finds the smallest (minimum) number in a list. For example, the smallest number in the list [-5, 0, 3] is -5. -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = 'min of list'; -/// tooltip - Please use the same term for "min" or "minimum" as in the previous message. -Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = 'Return the smallest number in the list.'; -/// dropdown - This finds the largest (maximum) number in a list. For example, the largest number in the list [-5, 0, 3] is 3. -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = 'max of list'; -/// tooltip -Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = 'Return the largest number in the list.'; -/// dropdown - This adds up all of the numbers in a list and divides the sum by the number of elements in the list. For example, the [https://en.wikipedia.org/wiki/Arithmetic_mean average] of the list [1, 2, 3, 4] is 2.5 (10/4). -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = 'average of list'; -/// tooltip - See [https://en.wikipedia.org/wiki/Arithmetic_mean https://en.wikipedia.org/wiki/Arithmetic_mean] for more informatin. -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = 'Return the average (arithmetic mean) of the numeric values in the list.'; -/// dropdown - This finds the [https://en.wikipedia.org/wiki/Median median] of the numeric values in a list. For example, the median of the list {1, 2, 7, 12, 13} is 7. -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = 'median of list'; -/// tooltip - See [https://en.wikipedia.org/wiki/Median median https://en.wikipedia.org/wiki/Median median] for more information. -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = 'Return the median number in the list.'; -/// dropdown - This finds the most common numbers ([https://en.wikipedia.org/wiki/Mode_(statistics) modes]) in a list. For example, the modes of the list {1, 3, 9, 3, 9} are {3, 9}. -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = 'modes of list'; -/// tooltip - See [https://en.wikipedia.org/wiki/Mode_(statistics) https://en.wikipedia.org/wiki/Mode_(statistics)] for more information. -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = 'Return a list of the most common item(s) in the list.'; -/// dropdown - This finds the [https://en.wikipedia.org/wiki/Standard_deviation standard deviation] of the numeric values in a list. -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = 'standard deviation of list'; -/// tooltip - See [https://en.wikipedia.org/wiki/Standard_deviation https://en.wikipedia.org/wiki/Standard_deviation] for more information. -Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = 'Return the standard deviation of the list.'; -/// dropdown - This choose an element at random from a list. Each element is chosen with equal probability. -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = 'random item of list'; -/// tooltip - Please use same term for 'random' as in previous entry. -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = 'Return a random element from the list.'; - -/// url - information about the modulo (remainder) operation. -Blockly.Msg.MATH_MODULO_HELPURL = 'https://en.wikipedia.org/wiki/Modulo_operation'; -/// block text - Title of block providing the remainder when dividing the first numerical input by the second. For example, the remainder of 10 divided by 3 is 1.\n\nParameters:\n* %1 - the dividend (10, in our example)\n* %2 - the divisor (3 in our example). -Blockly.Msg.MATH_MODULO_TITLE = 'remainder of %1 ÷ %2'; -/// tooltip - For example, the remainder of 10 divided by 3 is 1. -Blockly.Msg.MATH_MODULO_TOOLTIP = 'Return the remainder from dividing the two numbers.'; - -/// url - Information about constraining a numeric value to be in a specific range. (The English URL is not ideal. Recall that translating URLs is the lowest priority.) -Blockly.Msg.MATH_CONSTRAIN_HELPURL = 'https://en.wikipedia.org/wiki/Clamping_%28graphics%29'; -/// block text - The title of the block that '''constrain'''s (forces) a number to be in a given range. -///For example, if the number 150 is constrained to be between 5 and 100, the result will be 100. -///\n\nParameters:\n* %1 - the value to constrain (e.g., 150)\n* %2 - the minimum value (e.g., 5)\n* %3 - the maximum value (e.g., 100). -Blockly.Msg.MATH_CONSTRAIN_TITLE = 'constrain %1 low %2 high %3'; -/// tooltip - This compares a number ''x'' to a low value ''L'' and a high value ''H''. If ''x'' is less then ''L'', the result is ''L''. If ''x'' is greater than ''H'', the result is ''H''. Otherwise, the result is ''x''. -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = 'Constrain a number to be between the specified limits (inclusive).'; - -/// url - Information about how computers generate random numbers. -Blockly.Msg.MATH_RANDOM_INT_HELPURL = 'https://en.wikipedia.org/wiki/Random_number_generation'; -/// block text - The title of the block that generates a random integer (whole number) in the specified range. For example, if the range is from 5 to 7, this returns 5, 6, or 7 with equal likelihood. %1 is a placeholder for the lower number, %2 is the placeholder for the larger number. -Blockly.Msg.MATH_RANDOM_INT_TITLE = 'random integer from %1 to %2'; -/// tooltip - Return a random integer between two values specified as inputs. For example, if one input was 7 and another 9, any of the numbers 7, 8, or 9 could be produced. -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = 'Return a random integer between the two specified limits, inclusive.'; - -/// url - Information about how computers generate random numbers (specifically, numbers in the range from 0 to just below 1). -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = 'https://en.wikipedia.org/wiki/Random_number_generation'; -/// block text - The title of the block that generates a random number greater than or equal to 0 and less than 1. -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = 'random fraction'; -/// tooltip - Return a random fraction between 0 and 1. The value may be equal to 0 but must be less than 1. -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = 'Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive).'; - -// Text Blocks. -/// url - Information about how computers represent text (sometimes referred to as ''string''s). -Blockly.Msg.TEXT_TEXT_HELPURL = 'https://en.wikipedia.org/wiki/String_(computer_science)'; -/// tooltip - See [https://github.com/google/blockly/wiki/Text https://github.com/google/blockly/wiki/Text]. -Blockly.Msg.TEXT_TEXT_TOOLTIP = 'A letter, word, or line of text.'; - -/// url - Information on concatenating/appending pieces of text. -Blockly.Msg.TEXT_JOIN_HELPURL = 'https://github.com/google/blockly/wiki/Text#text-creation'; -/// block text - See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation]. -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = 'create text with'; -/// tooltip - See [https://github.com/google/blockly/wiki/Text#text-creation create text with] for more information. -Blockly.Msg.TEXT_JOIN_TOOLTIP = 'Create a piece of text by joining together any number of items.'; - -/// block text - This is shown when the programmer wants to change the number of pieces of text being joined together. See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation], specifically the last picture in the 'Text creation' section.\n{{Identical|Join}} -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = 'join'; -/// tooltip - See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation], specifically the last picture in the 'Text creation' section. -Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = 'Add, remove, or reorder sections to reconfigure this text block.'; -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; -/// block text - See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation], specifically the last picture in the 'Text creation' section. -Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = 'Add an item to the text.'; - -/// url - This and the other text-related URLs are going to be hard to translate. As always, it is okay to leave untranslated or paste in the English-language URL. For these URLs, you might also consider a general URL about how computers represent text (such as the translation of [https://en.wikipedia.org/wiki/String_(computer_science) this Wikipedia page]). -Blockly.Msg.TEXT_APPEND_HELPURL = 'https://github.com/google/blockly/wiki/Text#text-modification'; -/// block input text - Message preceding the name of a variable to which text should be appended. -/// [[File:blockly-append-text.png]] -Blockly.Msg.TEXT_APPEND_TO = 'to'; -/// block input text - Message following the variable and preceding the piece of text that should -/// be appended, as shown below. -/// [[File:blockly-append-text.png]] -Blockly.Msg.TEXT_APPEND_APPENDTEXT = 'append text'; -Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -/// tooltip - See [https://github.com/google/blockly/wiki/Text#text-modification https://github.com/google/blockly/wiki/Text#text-modification] for more information.\n\nParameters:\n* %1 - the name of the variable to which text should be appended -Blockly.Msg.TEXT_APPEND_TOOLTIP = 'Append some text to variable "%1".'; - -/// url - Information about text on computers (usually referred to as 'strings'). -Blockly.Msg.TEXT_LENGTH_HELPURL = 'https://github.com/google/blockly/wiki/Text#text-modification'; -/// block text - See [https://github.com/google/blockly/wiki/Text#text-length https://github.com/google/blockly/wiki/Text#text-length]. -/// \n\nParameters:\n* %1 - the piece of text to take the length of -Blockly.Msg.TEXT_LENGTH_TITLE = 'length of %1'; -/// tooltip - See [https://github.com/google/blockly/wiki/Text#text-length https://github.com/google/blockly/wiki/Text#text-length]. -Blockly.Msg.TEXT_LENGTH_TOOLTIP = 'Returns the number of letters (including spaces) in the provided text.'; - -/// url - Information about empty pieces of text on computers (usually referred to as 'empty strings'). -Blockly.Msg.TEXT_ISEMPTY_HELPURL = 'https://github.com/google/blockly/wiki/Text#checking-for-empty-text'; -/// block text - See [https://github.com/google/blockly/wiki/Text#checking-for-empty-text https://github.com/google/blockly/wiki/Text#checking-for-empty-text]. -/// \n\nParameters:\n* %1 - the piece of text to test for emptiness -Blockly.Msg.TEXT_ISEMPTY_TITLE = '%1 is empty'; -/// tooltip - See [https://github.com/google/blockly/wiki/Text#checking-for-empty-text https://github.com/google/blockly/wiki/Text#checking-for-empty-text]. -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = 'Returns true if the provided text is empty.'; - -/// url - Information about finding a character in a piece of text. -Blockly.Msg.TEXT_INDEXOF_HELPURL = 'https://github.com/google/blockly/wiki/Text#finding-text'; -/// tooltip - See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text]. -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = 'Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found.'; -/// block text - Title of blocks allowing users to find text. See -/// [https://github.com/google/blockly/wiki/Text#finding-text -/// https://github.com/google/blockly/wiki/Text#finding-text]. -/// [[File:Blockly-find-text.png]]. -Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = 'in text'; -/// dropdown - See [https://github.com/google/blockly/wiki/Text#finding-text -/// https://github.com/google/blockly/wiki/Text#finding-text]. -/// [[File:Blockly-find-text.png]]. -Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = 'find first occurrence of text'; -/// dropdown - See [https://github.com/google/blockly/wiki/Text#finding-text -/// https://github.com/google/blockly/wiki/Text#finding-text]. This would -/// replace "find first occurrence of text" below. (For more information on -/// how common text is factored out of dropdown menus, see -/// [https://translatewiki.net/wiki/Translating:Blockly#Drop-Down_Menus -/// https://translatewiki.net/wiki/Translating:Blockly#Drop-Down_Menus)].) -/// [[File:Blockly-find-text.png]]. -Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = 'find last occurrence of text'; -/// block text - Optional text to follow the rightmost block in a -/// [https://github.com/google/blockly/wiki/Text#finding-text -/// https://github.com/google/blockly/wiki/Text#finding-text in text ... find block] -/// (after the "a" in the below picture). This will be the empty string in most languages. -/// [[File:Blockly-find-text.png]]. -Blockly.Msg.TEXT_INDEXOF_TAIL = ''; - -/// url - Information about extracting characters (letters, number, symbols, etc.) from text. -Blockly.Msg.TEXT_CHARAT_HELPURL = 'https://github.com/google/blockly/wiki/Text#extracting-text'; -/// block text - Appears before the piece of text from which a letter (or number, -/// punctuation character, etc.) should be extracted, as shown below. See -/// [https://github.com/google/blockly/wiki/Text#extracting-a-single-character -/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. -/// [[File:Blockly-text-get.png]] -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = 'in text'; -/// dropdown - Indicates that the letter (or number, punctuation character, etc.) with the -/// specified index should be obtained from the preceding piece of text. See -/// [https://github.com/google/blockly/wiki/Text#extracting-a-single-character -/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. -/// [[File:Blockly-text-get.png]] -Blockly.Msg.TEXT_CHARAT_FROM_START = 'get letter #'; -/// block text - Indicates that the letter (or number, punctuation character, etc.) with the -/// specified index from the end of a given piece of text should be obtained. See -/// [https://github.com/google/blockly/wiki/Text#extracting-a-single-character -/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. -/// [[File:Blockly-text-get.png]] -Blockly.Msg.TEXT_CHARAT_FROM_END = 'get letter # from end'; -/// block text - Indicates that the first letter of the following piece of text should be -/// retrieved. See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character -/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. -/// [[File:Blockly-text-get.png]] -Blockly.Msg.TEXT_CHARAT_FIRST = 'get first letter'; -/// block text - Indicates that the last letter (or number, punctuation mark, etc.) of the -/// following piece of text should be retrieved. See -/// [https://github.com/google/blockly/wiki/Text#extracting-a-single-character -/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. -/// [[File:Blockly-text-get.png]] -Blockly.Msg.TEXT_CHARAT_LAST = 'get last letter'; -/// block text - Indicates that any letter (or number, punctuation mark, etc.) in the -/// following piece of text should be randomly selected. See -/// [https://github.com/google/blockly/wiki/Text#extracting-a-single-character -/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. -/// [[File:Blockly-text-get.png]] -Blockly.Msg.TEXT_CHARAT_RANDOM = 'get random letter'; -/// block text - Text that goes after the rightmost block/dropdown when getting a single letter from -/// a piece of text, as in [https://blockly-demo.appspot.com/static/apps/code/index.html#3m23km these -/// blocks] or shown below. For most languages, this will be blank. -/// [[File:Blockly-text-get.png]] -Blockly.Msg.TEXT_CHARAT_TAIL = ''; -/// tooltip - See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character -/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. -/// [[File:Blockly-text-get.png]] -Blockly.Msg.TEXT_CHARAT_TOOLTIP = 'Returns the letter at the specified position.'; - -/// See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text -/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = 'Returns a specified portion of the text.'; -/// url - Information about extracting characters from text. Reminder: urls are the -/// lowest priority translations. Feel free to skip. -Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = 'https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text'; -/// block text - Precedes a piece of text from which a portion should be extracted. -/// [[File:Blockly-get-substring.png]] -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = 'in text'; -/// dropdown - Indicates that the following number specifies the position (relative to the start -/// position) of the beginning of the region of text that should be obtained from the preceding -/// piece of text. See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text -/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. -/// [[File:Blockly-get-substring.png]] -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = 'get substring from letter #'; -/// dropdown - Indicates that the following number specifies the position (relative to the end -/// position) of the beginning of the region of text that should be obtained from the preceding -/// piece of text. See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text -/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. -/// Note: If {{msg-Blockly|ORDINAL_NUMBER_SUFFIX}} is defined, it will -/// automatically appear ''after'' this and any other -/// [https://translatewiki.net/wiki/Translating:Blockly#Ordinal_numbers ordinal numbers] -/// on this block. -/// [[File:Blockly-get-substring.png]] -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = 'get substring from letter # from end'; -/// block text - Indicates that a region starting with the first letter of the preceding piece -/// of text should be extracted. See -/// [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text -/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. -/// [[File:Blockly-get-substring.png]] -Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = 'get substring from first letter'; -/// dropdown - Indicates that the following number specifies the position (relative to -/// the start position) of the end of the region of text that should be obtained from the -/// preceding piece of text. See -/// [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text -/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. -/// [[File:Blockly-get-substring.png]] -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = 'to letter #'; -/// dropdown - Indicates that the following number specifies the position (relative to the -/// end position) of the end of the region of text that should be obtained from the preceding -/// piece of text. See -/// [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text -/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. -/// [[File:Blockly-get-substring.png]] -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = 'to letter # from end'; -/// block text - Indicates that a region ending with the last letter of the preceding piece -/// of text should be extracted. See -/// [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text -/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. -/// [[File:Blockly-get-substring.png]] -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = 'to last letter'; -/// block text - Text that should go after the rightmost block/dropdown when -/// [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text -/// extracting a region of text]. In most languages, this will be the empty string. -/// [[File:Blockly-get-substring.png]] -Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ''; - -/// url - Information about the case of letters (upper-case and lower-case). -Blockly.Msg.TEXT_CHANGECASE_HELPURL = 'https://github.com/google/blockly/wiki/Text#adjusting-text-case'; -/// tooltip - Describes a block to adjust the case of letters. For more information on this block, -/// see [https://github.com/google/blockly/wiki/Text#adjusting-text-case -/// https://github.com/google/blockly/wiki/Text#adjusting-text-case]. -Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = 'Return a copy of the text in a different case.'; -/// block text - Indicates that all of the letters in the following piece of text should be -/// capitalized. If your language does not use case, you may indicate that this is not -/// applicable to your language. For more information on this block, see -/// [https://github.com/google/blockly/wiki/Text#adjusting-text-case -/// https://github.com/google/blockly/wiki/Text#adjusting-text-case]. -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = 'to UPPER CASE'; -/// block text - Indicates that all of the letters in the following piece of text should be converted to lower-case. If your language does not use case, you may indicate that this is not applicable to your language. For more information on this block, see [https://github.com/google/blockly/wiki/Text#adjusting-text-case https://github.com/google/blockly/wiki/Text#adjusting-text-case]. -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = 'to lower case'; -/// block text - Indicates that the first letter of each of the following words should be capitalized and the rest converted to lower-case. If your language does not use case, you may indicate that this is not applicable to your language. For more information on this block, see [https://github.com/google/blockly/wiki/Text#adjusting-text-case https://github.com/google/blockly/wiki/Text#adjusting-text-case]. -Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = 'to Title Case'; - -/// url - Information about trimming (removing) text off the beginning and ends of pieces of text. -Blockly.Msg.TEXT_TRIM_HELPURL = 'https://github.com/google/blockly/wiki/Text#trimming-removing-spaces'; -/// tooltip - See [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces -/// https://github.com/google/blockly/wiki/Text#trimming-removing-spaces]. -Blockly.Msg.TEXT_TRIM_TOOLTIP = 'Return a copy of the text with spaces removed from one or both ends.'; -/// dropdown - Removes spaces from the beginning and end of a piece of text. See -/// [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces -/// https://github.com/google/blockly/wiki/Text#trimming-removing-spaces]. Note that neither -/// this nor the other options modify the original piece of text (that follows); -/// the block just returns a version of the text without the specified spaces. -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = 'trim spaces from both sides of'; -/// dropdown - Removes spaces from the beginning of a piece of text. See -/// [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces -/// https://github.com/google/blockly/wiki/Text#trimming-removing-spaces]. -/// Note that in right-to-left scripts, this will remove spaces from the right side. -Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = 'trim spaces from left side of'; -/// dropdown - Removes spaces from the end of a piece of text. See -/// [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces -/// https://github.com/google/blockly/wiki/Text#trimming-removing-spaces]. -/// Note that in right-to-left scripts, this will remove spaces from the left side. -Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = 'trim spaces from right side of'; - -/// url - Information about displaying text on computers. -Blockly.Msg.TEXT_PRINT_HELPURL = 'https://github.com/google/blockly/wiki/Text#printing-text'; -/// block text - Display the input on the screen. See -/// [https://github.com/google/blockly/wiki/Text#printing-text -/// https://github.com/google/blockly/wiki/Text#printing-text]. -/// \n\nParameters:\n* %1 - the value to print -Blockly.Msg.TEXT_PRINT_TITLE = 'print %1'; -/// tooltip - See [https://github.com/google/blockly/wiki/Text#printing-text -/// https://github.com/google/blockly/wiki/Text#printing-text]. -Blockly.Msg.TEXT_PRINT_TOOLTIP = 'Print the specified text, number or other value.'; -/// url - Information about getting text from users. -Blockly.Msg.TEXT_PROMPT_HELPURL = 'https://github.com/google/blockly/wiki/Text#getting-input-from-the-user'; -/// dropdown - Specifies that a piece of text should be requested from the user with -/// the following message. See [https://github.com/google/blockly/wiki/Text#printing-text -/// https://github.com/google/blockly/wiki/Text#printing-text]. -Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = 'prompt for text with message'; -/// dropdown - Specifies that a number should be requested from the user with the -/// following message. See [https://github.com/google/blockly/wiki/Text#printing-text -/// https://github.com/google/blockly/wiki/Text#printing-text]. -Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = 'prompt for number with message'; -/// dropdown - Precedes the message with which the user should be prompted for -/// a number. See [https://github.com/google/blockly/wiki/Text#printing-text -/// https://github.com/google/blockly/wiki/Text#printing-text]. -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = 'Prompt for user for a number.'; -/// dropdown - Precedes the message with which the user should be prompted for some text. -/// See [https://github.com/google/blockly/wiki/Text#printing-text -/// https://github.com/google/blockly/wiki/Text#printing-text]. -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = 'Prompt for user for some text.'; - -// Lists Blocks. -/// url - Information on empty lists. -Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = 'https://github.com/google/blockly/wiki/Lists#create-empty-list'; -/// block text - See [https://github.com/google/blockly/wiki/Lists#create-empty-list https://github.com/google/blockly/wiki/Lists#create-empty-list]. -Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = 'create empty list'; -/// block text - See [https://github.com/google/blockly/wiki/Lists#create-empty-list https://github.com/google/blockly/wiki/Lists#create-empty-list]. -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = 'Returns a list, of length 0, containing no data records'; - -/// url - Information on building lists. -Blockly.Msg.LISTS_CREATE_WITH_HELPURL = 'https://github.com/google/blockly/wiki/Lists#create-list-with'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#create-list-with https://github.com/google/blockly/wiki/Lists#create-list-with]. -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = 'Create a list with any number of items.'; -/// block text - See [https://github.com/google/blockly/wiki/Lists#create-list-with https://github.com/google/blockly/wiki/Lists#create-list-with]. -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = 'create list with'; -/// block text - This appears in a sub-block when [https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs changing the number of inputs in a ''''create list with'''' block].\n{{Identical|List}} -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = 'list'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs]. -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = 'Add, remove, or reorder sections to reconfigure this list block.'; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs]. -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = 'Add an item to the list.'; - -/// url - Information about [https://github.com/google/blockly/wiki/Lists#create-list-with creating a list with multiple copies of a single item]. -Blockly.Msg.LISTS_REPEAT_HELPURL = 'https://github.com/google/blockly/wiki/Lists#create-list-with'; -/// url - See [https://github.com/google/blockly/wiki/Lists#create-list-with creating a list with multiple copies of a single item]. -Blockly.Msg.LISTS_REPEAT_TOOLTIP = 'Creates a list consisting of the given value repeated the specified number of times.'; -/// block text - See [https://github.com/google/blockly/wiki/Lists#create-list-with -/// https://github.com/google/blockly/wiki/Lists#create-list-with]. -///\n\nParameters:\n* %1 - the item (text) to be repeated\n* %2 - the number of times to repeat it -Blockly.Msg.LISTS_REPEAT_TITLE = 'create list with item %1 repeated %2 times'; - -/// url - Information about how the length of a list is computed (i.e., by the total number of elements, not the number of different elements). -Blockly.Msg.LISTS_LENGTH_HELPURL = 'https://github.com/google/blockly/wiki/Lists#length-of'; -/// block text - See [https://github.com/google/blockly/wiki/Lists#length-of https://github.com/google/blockly/wiki/Lists#length-of]. -/// \n\nParameters:\n* %1 - the list whose length is desired -Blockly.Msg.LISTS_LENGTH_TITLE = 'length of %1'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#length-of https://github.com/google/blockly/wiki/Lists#length-of Blockly:Lists:length of]. -Blockly.Msg.LISTS_LENGTH_TOOLTIP = 'Returns the length of a list.'; - -/// url - See [https://github.com/google/blockly/wiki/Lists#is-empty https://github.com/google/blockly/wiki/Lists#is-empty]. -Blockly.Msg.LISTS_ISEMPTY_HELPURL = 'https://github.com/google/blockly/wiki/Lists#is-empty'; -/// block text - See [https://github.com/google/blockly/wiki/Lists#is-empty -/// https://github.com/google/blockly/wiki/Lists#is-empty]. -/// \n\nParameters:\n* %1 - the list to test -Blockly.Msg.LISTS_ISEMPTY_TITLE = '%1 is empty'; -/// block tooltip - See [https://github.com/google/blockly/wiki/Lists#is-empty -/// https://github.com/google/blockly/wiki/Lists#is-empty]. -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = 'Returns true if the list is empty.'; - -/// block text - Title of blocks operating on [https://github.com/google/blockly/wiki/Lists lists]. -Blockly.Msg.LISTS_INLIST = 'in list'; - -/// url - See [https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list -/// https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list]. -Blockly.Msg.LISTS_INDEX_OF_HELPURL = 'https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list'; -Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -/// dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list -/// Lists#finding-items-in-a-list]. -/// [[File:Blockly-list-find.png]] -Blockly.Msg.LISTS_INDEX_OF_FIRST = 'find first occurrence of item'; -/// dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list -/// https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list]. -/// [[File:Blockly-list-find.png]] -Blockly.Msg.LISTS_INDEX_OF_LAST = 'find last occurrence of item'; -/// dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list -/// https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list]. -/// [[File:Blockly-list-find.png]] -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = 'Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found.'; - -Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; -/// dropdown - Indicates that the user wishes to -/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item -/// get an item from a list] without removing it from the list. -Blockly.Msg.LISTS_GET_INDEX_GET = 'get'; -/// dropdown - Indicates that the user wishes to -/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item -/// get and remove an item from a list], as opposed to merely getting -/// it without modifying the list. -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = 'get and remove'; -/// dropdown - Indicates that the user wishes to -/// [https://github.com/google/blockly/wiki/Lists#removing-an-item -/// remove an item from a list].\n{{Identical|Remove}} -Blockly.Msg.LISTS_GET_INDEX_REMOVE = 'remove'; -/// dropdown - Indicates that an index relative to the front of the list should be used to -/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item get and/or remove -/// an item from a list]. Note: If {{msg-Blockly|ORDINAL_NUMBER_SUFFIX}} is defined, it will -/// automatically appear ''after'' this number (and any other ordinal numbers on this block). -/// See [[Translating:Blockly#Ordinal_numbers]] for more information on ordinal numbers in Blockly. -/// [[File:Blockly-list-get-item.png]] -Blockly.Msg.LISTS_GET_INDEX_FROM_START = '#'; -/// dropdown - Indicates that an index relative to the end of the list should be used -/// to [https://github.com/google/blockly/wiki/Lists#getting-a-single-item access an item in a list]. -/// [[File:Blockly-list-get-item.png]] -Blockly.Msg.LISTS_GET_INDEX_FROM_END = '# from end'; -/// dropdown - Indicates that the '''first''' item should be -/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. -/// [[File:Blockly-list-get-item.png]] -Blockly.Msg.LISTS_GET_INDEX_FIRST = 'first'; -/// dropdown - Indicates that the '''last''' item should be -/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. -/// [[File:Blockly-list-get-item.png]] -Blockly.Msg.LISTS_GET_INDEX_LAST = 'last'; -/// dropdown - Indicates that a '''random''' item should be -/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. -/// [[File:Blockly-list-get-item.png]] -Blockly.Msg.LISTS_GET_INDEX_RANDOM = 'random'; -/// block text - Text that should go after the rightmost block/dropdown when -/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item -/// accessing an item from a list]. In most languages, this will be the empty string. -/// [[File:Blockly-list-get-item.png]] -Blockly.Msg.LISTS_GET_INDEX_TAIL = ''; -Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item -/// https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information. -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = 'Returns the item at the specified position in a list. #1 is the first item.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item -/// https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information. -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = 'Returns the item at the specified position in a list. #1 is the last item.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item -/// https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information. -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = 'Returns the first item in a list.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item -/// https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information. -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = 'Returns the last item in a list.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item -/// https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information. -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = 'Returns a random item in a list.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] -/// (for remove and return) and -/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '# from start'. -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = 'Removes and returns the item at the specified position in a list. #1 is the first item.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '# from end'. -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = 'Removes and returns the item at the specified position in a list. #1 is the last item.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'first'. -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = 'Removes and returns the first item in a list.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'last'. -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = 'Removes and returns the last item in a list.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'random'. -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = 'Removes and returns a random item in a list.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '# from start'. -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = 'Removes the item at the specified position in a list. #1 is the first item.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '# from end'. -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = 'Removes the item at the specified position in a list. #1 is the last item.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'first'. -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = 'Removes the first item in a list.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'last'. -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = 'Removes the last item in a list.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'random'. -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = 'Removes a random item in a list.'; -/// url - Information about putting items in lists. -Blockly.Msg.LISTS_SET_INDEX_HELPURL = 'https://github.com/google/blockly/wiki/Lists#in-list--set'; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -/// block text - [https://github.com/google/blockly/wiki/Lists#in-list--set -/// Replaces an item in a list]. -/// [[File:Blockly-in-list-set-insert.png]] -Blockly.Msg.LISTS_SET_INDEX_SET = 'set'; -/// block text - [https://github.com/google/blockly/wiki/Lists#in-list--insert-at -/// Inserts an item into a list]. -/// [[File:Blockly-in-list-set-insert.png]] -Blockly.Msg.LISTS_SET_INDEX_INSERT = 'insert at'; -/// block text - The word(s) after the position in the list and before the item to be set/inserted. -/// [[File:Blockly-in-list-set-insert.png]] -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = 'as'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "set" block). -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = 'Sets the item at the specified position in a list. #1 is the first item.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "set" block). -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = 'Sets the item at the specified position in a list. #1 is the last item.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "set" block). -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = 'Sets the first item in a list.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "set" block). -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = 'Sets the last item in a list.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "set" block). -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = 'Sets a random item in a list.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "insert" block). -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = 'Inserts the item at the specified position in a list. #1 is the first item.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "insert" block). -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = 'Inserts the item at the specified position in a list. #1 is the last item.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "insert" block). -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = 'Inserts the item at the start of a list.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "insert" block). -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = 'Append the item to the end of a list.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "insert" block). -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = 'Inserts the item randomly in a list.'; - -/// url - Information describing extracting a sublist from an existing list. -Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = 'https://github.com/google/blockly/wiki/Lists#getting-a-sublist'; -Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -/// dropdown - Indicates that an index relative to the front of the list should be used -/// to specify the beginning of the range from which to -/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. -/// [[File:Blockly-get-sublist.png]] -/// Note: If {{msg-Blockly|ORDINAL_NUMBER_SUFFIX}} is defined, it will -/// automatically appear ''after'' this number (and any other ordinal numbers on this block). -/// See [[Translating:Blockly#Ordinal_numbers]] for more information on ordinal numbers in Blockly. -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = 'get sub-list from #'; -/// dropdown - Indicates that an index relative to the end of the list should be used -/// to specify the beginning of the range from which to -/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = 'get sub-list from # from end'; -/// dropdown - Indicates that the -/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist sublist to extract] -/// should begin with the list's first item. -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = 'get sub-list from first'; -/// dropdown - Indicates that an index relative to the front of the list should be -/// used to specify the end of the range from which to -/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. -/// [[File:Blockly-get-sublist.png]] -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = 'to #'; -/// dropdown - Indicates that an index relative to the end of the list should be -/// used to specify the end of the range from which to -/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. -/// [[File:Blockly-get-sublist.png]] -Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = 'to # from end'; -/// dropdown - Indicates that the '''last''' item in the given list should be -/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist the end -/// of the selected sublist]. -/// [[File:Blockly-get-sublist.png]] -Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = 'to last'; -/// block text - This appears in the rightmost position ("tail") of the -/// sublist block, as described at -/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist -/// https://github.com/google/blockly/wiki/Lists#getting-a-sublist]. -/// In English and most other languages, this is the empty string. -/// [[File:Blockly-get-sublist.png]] -Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ''; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-sublist -/// https://github.com/google/blockly/wiki/Lists#getting-a-sublist] for more information. -/// [[File:Blockly-get-sublist.png]] -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = 'Creates a copy of the specified portion of a list.'; - -/// url - Information describing splitting text into a list, or joining a list into text. -Blockly.Msg.LISTS_SPLIT_HELPURL = 'https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists'; -/// dropdown - Indicates that text will be split up into a list (e.g. "a-b-c" -> ["a", "b", "c"]). -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = 'make list from text'; -/// dropdown - Indicates that a list will be joined together to form text (e.g. ["a", "b", "c"] -> "a-b-c"). -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = 'make text from list'; -/// block text - Prompts for a letter to be used as a separator when splitting or joining text. -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = 'with delimiter'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#make-list-from-text -/// https://github.com/google/blockly/wiki/Lists#make-list-from-text] for more information. -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = 'Split text into a list of texts, breaking at each delimiter.'; -/// tooltip - See [https://github.com/google/blockly/wiki/Lists#make-text-from-list -/// https://github.com/google/blockly/wiki/Lists#make-text-from-list] for more information. -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = 'Join a list of texts into one text, separated by a delimiter.'; - -/// grammar - Text that follows an ordinal number (a number that indicates -/// position relative to other numbers). In most languages, such text appears -/// before the number, so this should be blank. An exception is Hungarian. -/// See [[Translating:Blockly#Ordinal_numbers]] for more information. -Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ''; - -// Variables Blocks. -/// url - Information about ''variables'' in computer programming. Consider using your language's translation of [https://en.wikipedia.org/wiki/Variable_(computer_science) https://en.wikipedia.org/wiki/Variable_(computer_science)], if it exists. -Blockly.Msg.VARIABLES_GET_HELPURL = 'https://github.com/google/blockly/wiki/Variables#get'; -/// tooltip - This gets the value of the named variable without modifying it. -Blockly.Msg.VARIABLES_GET_TOOLTIP = 'Returns the value of this variable.'; -/// context menu - Selecting this creates a block to set (change) the value of this variable. -/// \n\nParameters:\n* %1 - the name of the variable. -Blockly.Msg.VARIABLES_GET_CREATE_SET = 'Create "set %1"'; - -/// url - Information about ''variables'' in computer programming. Consider using your language's translation of [https://en.wikipedia.org/wiki/Variable_(computer_science) https://en.wikipedia.org/wiki/Variable_(computer_science)], if it exists. -Blockly.Msg.VARIABLES_SET_HELPURL = 'https://github.com/google/blockly/wiki/Variables#set'; -/// block text - Change the value of a mathematical variable: '''set [the value of] x to 7'''.\n\nParameters:\n* %1 - the name of the variable.\n* %2 - the value to be assigned. -Blockly.Msg.VARIABLES_SET = 'set %1 to %2'; -/// tooltip - This initializes or changes the value of the named variable. -Blockly.Msg.VARIABLES_SET_TOOLTIP = 'Sets this variable to be equal to the input.'; -/// context menu - Selecting this creates a block to get (change) the value of -/// this variable.\n\nParameters:\n* %1 - the name of the variable. -Blockly.Msg.VARIABLES_SET_CREATE_GET = 'Create "get %1"'; - -// Procedures Blocks. -/// url - Information about defining [https://en.wikipedia.org/wiki/Procedure_(computer_science) functions] that do not have return values. -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = 'https://en.wikipedia.org/wiki/Procedure_%28computer_science%29'; -/// block text - This precedes the name of the function when defining it. See -/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#c84aoc this sample -/// function definition]. -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = 'to'; -/// default name - This acts as a placeholder for the name of a function on a -/// function definition block, as shown on -/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#w7cfju this block]. -/// The user will replace it with the function's name. -Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = 'do something'; -/// block text - This precedes the list of parameters on a function's defiition block. See -/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample -/// function with parameters]. -Blockly.Msg.PROCEDURES_BEFORE_PARAMS = 'with:'; -/// block text - This precedes the list of parameters on a function's caller block. See -/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample -/// function with parameters]. -Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = 'with:'; -/// block text - This appears next to the function's "body", the blocks that should be -/// run when the function is called, as shown in -/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample -/// function definition]. -Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ''; -/// tooltip -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = 'Creates a function with no output.'; -/// url - Information about defining [https://en.wikipedia.org/wiki/Procedure_(computer_science) functions] that have return values. -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = 'https://en.wikipedia.org/wiki/Procedure_%28computer_science%29'; -Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; -Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; -/// block text - This imperative or infinite verb precedes the value that is used as the return value -/// (output) of this function. See -/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#6ot5y5 this sample -/// function that returns a value]. - -Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = 'return'; -/// tooltip -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = 'Creates a function with an output.'; -/// Label for a checkbox that controls if statements are allowed in a function. -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = 'allow statements'; - -/// alert - The user has created a function with two parameters that have the same name. Every parameter must have a different name. -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = 'Warning: This function has duplicate parameters.'; - -/// url - Information about calling [https://en.wikipedia.org/wiki/Procedure_(computer_science) functions] that do not return values. -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = 'https://en.wikipedia.org/wiki/Procedure_%28computer_science%29'; -/// block text - In most (if not all) languages, this will be the empty string. -/// It precedes the name of the function that should be run. See, for example, -/// the "draw square" block in [https://blockly-demo.appspot.com/static/apps/turtle/index.html#ztz96g]. -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ''; -/// tooltip - This block causes the body (blocks inside) of the named function definition to be run. -Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = 'Run the user-defined function "%1".'; - -/// url - Information about calling [https://en.wikipedia.org/wiki/Procedure_(computer_science) functions] that return values. -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = 'https://en.wikipedia.org/wiki/Procedure_%28computer_science%29'; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; -/// tooltip - This block causes the body (blocks inside) of the named function definition to be run.\n\nParameters:\n* %1 - the name of the function. -Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = 'Run the user-defined function "%1" and use its output.'; - -/// block text - This text appears on a block in a window that appears when the user clicks -/// on the plus sign or star on a function definition block. It refers to the set of parameters -/// (referred to by the simpler term "inputs") to the function. See -/// [[Translating:Blockly#function_definitions]]. -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = 'inputs'; -/// tooltip -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = 'Add, remove, or reorder inputs to this function.'; -/// block text - This text appears on a block in a window that appears when the user clicks -/// on the plus sign or star on a function definition block]. It appears on the block for -/// adding an individual parameter (referred to by the simpler term "inputs") to the function. -/// See [[Translating:Blockly#function_definitions]]. -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = 'input name:'; -/// tooltip -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = 'Add an input to the function.'; - -/// context menu - This appears on the context menu for function calls. Selecting -/// it causes the corresponding function definition to be highlighted (as shown at -/// [[Translating:Blockly#context_menus]]. -Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = 'Highlight function definition'; -/// context menu - This appears on the context menu for function definitions. -/// Selecting it creates a block to call the function.\n\nParameters:\n* %1 - the name of the function.\n{{Identical|Create}} -Blockly.Msg.PROCEDURES_CREATE_DO = 'Create "%1"'; - -/// tooltip - If the first value is true, this causes the second value to be returned -/// immediately from the enclosing function. -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = 'If a value is true, then return a second value.'; -/// warning - This appears if the user tries to use this block outside of a function definition. -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = 'Warning: This block may be used only within a function definition.'; diff --git a/src/opsoro/apps/visual_programming/static/blockly/package.json b/src/opsoro/apps/visual_programming/static/blockly/package.json deleted file mode 100644 index 6eba03a..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "blockly-src", - "version": "1.0.0", - "description": "Blockly is a library for building visual programming editors.", - "keywords": ["blockly"], - "scripts": { - "lint": "jshint ." - }, - "repository": { - "type": "git", - "url": "https://github.com/google/blockly.git" - }, - "bugs": { - "url": "https://github.com/google/blockly/issues" - }, - "homepage": "https://developers.google.com/blockly/", - "author": { - "name": "Neil Fraser" - }, - "license": "Apache-2.0", - "private": true, - "devDependencies": { - "jshint": "latest" - }, - "jshintConfig": { - "globalstrict": true, - "predef": ["Blockly", "goog", "window", "document", "soy", "XMLHttpRequest"], - "sub": true, - "undef": true, - "unused": true - } -} diff --git a/src/opsoro/apps/visual_programming/static/blockly/php_compressed.js b/src/opsoro/apps/visual_programming/static/blockly/php_compressed.js deleted file mode 100644 index f0718b3..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/php_compressed.js +++ /dev/null @@ -1,77 +0,0 @@ -// Do not edit this file; automatically generated by build.py. -'use strict'; - - -// Copyright 2015 Google Inc. Apache License 2.0 -Blockly.PHP=new Blockly.Generator("PHP");Blockly.PHP.addReservedWords("__halt_compiler,abstract,and,array,as,break,callable,case,catch,class,clone,const,continue,declare,default,die,do,echo,else,elseif,empty,enddeclare,endfor,endforeach,endif,endswitch,endwhile,eval,exit,extends,final,for,foreach,function,global,goto,if,implements,include,include_once,instanceof,insteadof,interface,isset,list,namespace,new,or,print,private,protected,public,require,require_once,return,static,switch,throw,trait,try,unset,use,var,while,xor,PHP_VERSION,PHP_MAJOR_VERSION,PHP_MINOR_VERSION,PHP_RELEASE_VERSION,PHP_VERSION_ID,PHP_EXTRA_VERSION,PHP_ZTS,PHP_DEBUG,PHP_MAXPATHLEN,PHP_OS,PHP_SAPI,PHP_EOL,PHP_INT_MAX,PHP_INT_SIZE,DEFAULT_INCLUDE_PATH,PEAR_INSTALL_DIR,PEAR_EXTENSION_DIR,PHP_EXTENSION_DIR,PHP_PREFIX,PHP_BINDIR,PHP_BINARY,PHP_MANDIR,PHP_LIBDIR,PHP_DATADIR,PHP_SYSCONFDIR,PHP_LOCALSTATEDIR,PHP_CONFIG_FILE_PATH,PHP_CONFIG_FILE_SCAN_DIR,PHP_SHLIB_SUFFIX,E_ERROR,E_WARNING,E_PARSE,E_NOTICE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE,E_DEPRECATED,E_USER_DEPRECATED,E_ALL,E_STRICT,__COMPILER_HALT_OFFSET__,TRUE,FALSE,NULL,__CLASS__,__DIR__,__FILE__,__FUNCTION__,__LINE__,__METHOD__,__NAMESPACE__,__TRAIT__"); -Blockly.PHP.ORDER_ATOMIC=0;Blockly.PHP.ORDER_CLONE=1;Blockly.PHP.ORDER_NEW=1;Blockly.PHP.ORDER_MEMBER=2;Blockly.PHP.ORDER_FUNCTION_CALL=2;Blockly.PHP.ORDER_INCREMENT=3;Blockly.PHP.ORDER_DECREMENT=3;Blockly.PHP.ORDER_LOGICAL_NOT=4;Blockly.PHP.ORDER_BITWISE_NOT=4;Blockly.PHP.ORDER_UNARY_PLUS=4;Blockly.PHP.ORDER_UNARY_NEGATION=4;Blockly.PHP.ORDER_MULTIPLICATION=5;Blockly.PHP.ORDER_DIVISION=5;Blockly.PHP.ORDER_MODULUS=5;Blockly.PHP.ORDER_ADDITION=6;Blockly.PHP.ORDER_SUBTRACTION=6; -Blockly.PHP.ORDER_BITWISE_SHIFT=7;Blockly.PHP.ORDER_RELATIONAL=8;Blockly.PHP.ORDER_IN=8;Blockly.PHP.ORDER_INSTANCEOF=8;Blockly.PHP.ORDER_EQUALITY=9;Blockly.PHP.ORDER_BITWISE_AND=10;Blockly.PHP.ORDER_BITWISE_XOR=11;Blockly.PHP.ORDER_BITWISE_OR=12;Blockly.PHP.ORDER_CONDITIONAL=13;Blockly.PHP.ORDER_ASSIGNMENT=14;Blockly.PHP.ORDER_LOGICAL_AND=15;Blockly.PHP.ORDER_LOGICAL_OR=16;Blockly.PHP.ORDER_COMMA=17;Blockly.PHP.ORDER_NONE=99; -Blockly.PHP.init=function(a){Blockly.PHP.definitions_=Object.create(null);Blockly.PHP.functionNames_=Object.create(null);Blockly.PHP.variableDB_?Blockly.PHP.variableDB_.reset():Blockly.PHP.variableDB_=new Blockly.Names(Blockly.PHP.RESERVED_WORDS_,"$");var b=[];a=Blockly.Variables.allVariables(a);for(var c=0;c",GTE:">="}[a.getFieldValue("OP")],c="=="==b||"!="==b?Blockly.PHP.ORDER_EQUALITY:Blockly.PHP.ORDER_RELATIONAL,d=Blockly.PHP.valueToCode(a,"A",c)||"0";a=Blockly.PHP.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; -Blockly.PHP.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"&&":"||",c="&&"==b?Blockly.PHP.ORDER_LOGICAL_AND:Blockly.PHP.ORDER_LOGICAL_OR,d=Blockly.PHP.valueToCode(a,"A",c);a=Blockly.PHP.valueToCode(a,"B",c);if(d||a){var e="&&"==b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]};Blockly.PHP.logic_negate=function(a){var b=Blockly.PHP.ORDER_LOGICAL_NOT;return["!"+(Blockly.PHP.valueToCode(a,"BOOL",b)||"true"),b]}; -Blockly.PHP.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"true":"false",Blockly.PHP.ORDER_ATOMIC]};Blockly.PHP.logic_null=function(a){return["null",Blockly.PHP.ORDER_ATOMIC]};Blockly.PHP.logic_ternary=function(a){var b=Blockly.PHP.valueToCode(a,"IF",Blockly.PHP.ORDER_CONDITIONAL)||"false",c=Blockly.PHP.valueToCode(a,"THEN",Blockly.PHP.ORDER_CONDITIONAL)||"null";a=Blockly.PHP.valueToCode(a,"ELSE",Blockly.PHP.ORDER_CONDITIONAL)||"null";return[b+" ? "+c+" : "+a,Blockly.PHP.ORDER_CONDITIONAL]};Blockly.PHP.loops={}; -Blockly.PHP.controls_repeat_ext=function(a){var b=a.getField("TIMES")?String(Number(a.getFieldValue("TIMES"))):Blockly.PHP.valueToCode(a,"TIMES",Blockly.PHP.ORDER_ASSIGNMENT)||"0",c=Blockly.PHP.statementToCode(a,"DO"),c=Blockly.PHP.addLoopTrap(c,a.id);a="";var d=Blockly.PHP.variableDB_.getDistinctName("count",Blockly.Variables.NAME_TYPE),e=b;b.match(/^\w+$/)||Blockly.isNumber(b)||(e=Blockly.PHP.variableDB_.getDistinctName("repeat_end",Blockly.Variables.NAME_TYPE),a+=e+" = "+b+";\n");return a+("for ("+ -d+" = 0; "+d+" < "+e+"; "+d+"++) {\n"+c+"}\n")};Blockly.PHP.controls_repeat=Blockly.PHP.controls_repeat_ext;Blockly.PHP.controls_whileUntil=function(a){var b="UNTIL"==a.getFieldValue("MODE"),c=Blockly.PHP.valueToCode(a,"BOOL",b?Blockly.PHP.ORDER_LOGICAL_NOT:Blockly.PHP.ORDER_NONE)||"false",d=Blockly.PHP.statementToCode(a,"DO"),d=Blockly.PHP.addLoopTrap(d,a.id);b&&(c="!"+c);return"while ("+c+") {\n"+d+"}\n"}; -Blockly.PHP.controls_for=function(a){var b=Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.PHP.valueToCode(a,"FROM",Blockly.PHP.ORDER_ASSIGNMENT)||"0",d=Blockly.PHP.valueToCode(a,"TO",Blockly.PHP.ORDER_ASSIGNMENT)||"0",e=Blockly.PHP.valueToCode(a,"BY",Blockly.PHP.ORDER_ASSIGNMENT)||"1",g=Blockly.PHP.statementToCode(a,"DO"),g=Blockly.PHP.addLoopTrap(g,a.id);if(Blockly.isNumber(c)&&Blockly.isNumber(d)&&Blockly.isNumber(e)){var f=parseFloat(c)<=parseFloat(d); -a="for ("+b+" = "+c+"; "+b+(f?" <= ":" >= ")+d+"; "+b;b=Math.abs(parseFloat(e));a=(1==b?a+(f?"++":"--"):a+((f?" += ":" -= ")+b))+(") {\n"+g+"}\n")}else a="",f=c,c.match(/^\w+$/)||Blockly.isNumber(c)||(f=Blockly.PHP.variableDB_.getDistinctName(b+"_start",Blockly.Variables.NAME_TYPE),a+=f+" = "+c+";\n"),c=d,d.match(/^\w+$/)||Blockly.isNumber(d)||(c=Blockly.PHP.variableDB_.getDistinctName(b+"_end",Blockly.Variables.NAME_TYPE),a+=c+" = "+d+";\n"),d=Blockly.PHP.variableDB_.getDistinctName(b+"_inc",Blockly.Variables.NAME_TYPE), -a+=d+" = ",a=Blockly.isNumber(e)?a+(Math.abs(e)+";\n"):a+("abs("+e+");\n"),a+="if ("+f+" > "+c+") {\n",a+=Blockly.PHP.INDENT+d+" = -"+d+";\n",a+="}\n",a+="for ("+b+" = "+f+";\n "+d+" >= 0 ? "+b+" <= "+c+" : "+b+" >= "+c+";\n "+b+" += "+d+") {\n"+g+"}\n";return a}; -Blockly.PHP.controls_forEach=function(a){var b=Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_ASSIGNMENT)||"[]",d=Blockly.PHP.statementToCode(a,"DO"),d=Blockly.PHP.addLoopTrap(d,a.id);return""+("foreach ("+c+" as "+b+") {\n"+d+"}\n")}; -Blockly.PHP.controls_flow_statements=function(a){switch(a.getFieldValue("FLOW")){case "BREAK":return"break;\n";case "CONTINUE":return"continue;\n"}throw"Unknown flow statement.";};Blockly.PHP.math={};Blockly.PHP.math_number=function(a){return[parseFloat(a.getFieldValue("NUM")),Blockly.PHP.ORDER_ATOMIC]}; -Blockly.PHP.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.PHP.ORDER_ADDITION],MINUS:[" - ",Blockly.PHP.ORDER_SUBTRACTION],MULTIPLY:[" * ",Blockly.PHP.ORDER_MULTIPLICATION],DIVIDE:[" / ",Blockly.PHP.ORDER_DIVISION],POWER:[null,Blockly.PHP.ORDER_COMMA]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.PHP.valueToCode(a,"A",b)||"0";a=Blockly.PHP.valueToCode(a,"B",b)||"0";return c?[d+c+a,b]:["pow("+d+", "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]}; -Blockly.PHP.math_single=function(a){var b=a.getFieldValue("OP"),c;if("NEG"==b)return a=Blockly.PHP.valueToCode(a,"NUM",Blockly.PHP.ORDER_UNARY_NEGATION)||"0","-"==a[0]&&(a=" "+a),["-"+a,Blockly.PHP.ORDER_UNARY_NEGATION];a="SIN"==b||"COS"==b||"TAN"==b?Blockly.PHP.valueToCode(a,"NUM",Blockly.PHP.ORDER_DIVISION)||"0":Blockly.PHP.valueToCode(a,"NUM",Blockly.PHP.ORDER_NONE)||"0";switch(b){case "ABS":c="abs("+a+")";break;case "ROOT":c="sqrt("+a+")";break;case "LN":c="log("+a+")";break;case "EXP":c="exp("+ -a+")";break;case "POW10":c="pow(10,"+a+")";break;case "ROUND":c="round("+a+")";break;case "ROUNDUP":c="ceil("+a+")";break;case "ROUNDDOWN":c="floor("+a+")";break;case "SIN":c="sin("+a+" / 180 * pi())";break;case "COS":c="cos("+a+" / 180 * pi())";break;case "TAN":c="tan("+a+" / 180 * pi())"}if(c)return[c,Blockly.PHP.ORDER_FUNCTION_CALL];switch(b){case "LOG10":c="log("+a+") / log(10)";break;case "ASIN":c="asin("+a+") / pi() * 180";break;case "ACOS":c="acos("+a+") / pi() * 180";break;case "ATAN":c="atan("+ -a+") / pi() * 180";break;default:throw"Unknown math operator: "+b;}return[c,Blockly.PHP.ORDER_DIVISION]};Blockly.PHP.math_constant=function(a){return{PI:["M_PI",Blockly.PHP.ORDER_ATOMIC],E:["M_E",Blockly.PHP.ORDER_ATOMIC],GOLDEN_RATIO:["(1 + sqrt(5)) / 2",Blockly.PHP.ORDER_DIVISION],SQRT2:["M_SQRT2",Blockly.PHP.ORDER_ATOMIC],SQRT1_2:["M_SQRT1_2",Blockly.PHP.ORDER_ATOMIC],INFINITY:["INF",Blockly.PHP.ORDER_ATOMIC]}[a.getFieldValue("CONSTANT")]}; -Blockly.PHP.math_number_property=function(a){var b=Blockly.PHP.valueToCode(a,"NUMBER_TO_CHECK",Blockly.PHP.ORDER_MODULUS)||"0",c=a.getFieldValue("PROPERTY"),d;if("PRIME"==c)return d=Blockly.PHP.provideFunction_("math_isPrime",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($n) {"," // https://en.wikipedia.org/wiki/Primality_test#Naive_methods"," if ($n == 2 || $n == 3) {"," return true;"," }"," // False if n is NaN, negative, is 1, or not whole."," // And false if n is divisible by 2 or 3.", -" if (!is_numeric($n) || $n <= 1 || $n % 1 != 0 || $n % 2 == 0 || $n % 3 == 0) {"," return false;"," }"," // Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for ($x = 6; $x <= sqrt($n) + 1; $x += 6) {"," if ($n % ($x - 1) == 0 || $n % ($x + 1) == 0) {"," return false;"," }"," }"," return true;","}"])+"("+b+")",[d,Blockly.JavaScript.ORDER_FUNCTION_CALL];switch(c){case "EVEN":d=b+" % 2 == 0";break;case "ODD":d=b+" % 2 == 1";break;case "WHOLE":d="is_int("+b+")";break;case "POSITIVE":d= -b+" > 0";break;case "NEGATIVE":d=b+" < 0";break;case "DIVISIBLE_BY":a=Blockly.PHP.valueToCode(a,"DIVISOR",Blockly.PHP.ORDER_MODULUS)||"0",d=b+" % "+a+" == 0"}return[d,Blockly.PHP.ORDER_EQUALITY]};Blockly.PHP.math_change=function(a){var b=Blockly.PHP.valueToCode(a,"DELTA",Blockly.PHP.ORDER_ADDITION)||"0";return Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE)+" += "+b+";\n"};Blockly.PHP.math_round=Blockly.PHP.math_single;Blockly.PHP.math_trig=Blockly.PHP.math_single; -Blockly.PHP.math_on_list=function(a){var b=a.getFieldValue("OP");switch(b){case "SUM":a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_FUNCTION_CALL)||"array()";a="array_sum("+a+")";break;case "MIN":a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_FUNCTION_CALL)||"array()";a="min("+a+")";break;case "MAX":a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_FUNCTION_CALL)||"array()";a="max("+a+")";break;case "AVERAGE":b=Blockly.PHP.provideFunction_("math_mean",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+ -"($myList) {"," return array_sum($myList) / count($myList);","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"array()";a=b+"("+a+")";break;case "MEDIAN":b=Blockly.PHP.provideFunction_("math_median",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($arr) {"," sort($arr,SORT_NUMERIC);"," return (count($arr) % 2) ? $arr[floor(count($arr)/2)] : "," ($arr[floor(count($arr)/2)] + $arr[floor(count($arr)/2) - 1]) / 2;","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)|| -"[]";a=b+"("+a+")";break;case "MODE":b=Blockly.PHP.provideFunction_("math_modes",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($values) {"," $v = array_count_values($values);"," arsort($v);"," foreach($v as $k => $v){$total = $k; break;}"," return array($total);","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "STD_DEV":b=Blockly.PHP.provideFunction_("math_standard_deviation",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($numbers) {", -" $n = count($numbers);"," if (!$n) return null;"," $mean = array_sum($numbers) / count($numbers);"," foreach($numbers as $key => $num) $devs[$key] = pow($num - $mean, 2);"," return sqrt(array_sum($devs) / (count($devs) - 1));","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "RANDOM":b=Blockly.PHP.provideFunction_("math_random_list",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($list) {"," $x = rand(0, count($list)-1);"," return $list[$x];", -"}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;default:throw"Unknown operator: "+b;}return[a,Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.math_modulo=function(a){var b=Blockly.PHP.valueToCode(a,"DIVIDEND",Blockly.PHP.ORDER_MODULUS)||"0";a=Blockly.PHP.valueToCode(a,"DIVISOR",Blockly.PHP.ORDER_MODULUS)||"0";return[b+" % "+a,Blockly.PHP.ORDER_MODULUS]}; -Blockly.PHP.math_constrain=function(a){var b=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_COMMA)||"0",c=Blockly.PHP.valueToCode(a,"LOW",Blockly.PHP.ORDER_COMMA)||"0";a=Blockly.PHP.valueToCode(a,"HIGH",Blockly.PHP.ORDER_COMMA)||"Infinity";return["min(max("+b+", "+c+"), "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]}; -Blockly.PHP.math_random_int=function(a){var b=Blockly.PHP.valueToCode(a,"FROM",Blockly.PHP.ORDER_COMMA)||"0";a=Blockly.PHP.valueToCode(a,"TO",Blockly.PHP.ORDER_COMMA)||"0";return[Blockly.PHP.provideFunction_("math_random_int",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($a, $b) {"," if ($a > $b) {"," return rand($b, $a);"," }"," return rand($a, $b);","}"])+"("+b+", "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]}; -Blockly.PHP.math_random_float=function(a){return["(float)rand()/(float)getrandmax()",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.procedures={}; -Blockly.PHP.procedures_defreturn=function(a){for(var b=Blockly.Variables.allVariables(a),c=b.length-1;0<=c;c--){var d=b[c];-1==a.arguments_.indexOf(d)?b[c]=Blockly.PHP.variableDB_.getName(d,Blockly.Variables.NAME_TYPE):b.splice(c,1)}b=b.length?" global "+b.join(", ")+";\n":"";c=Blockly.PHP.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE);d=Blockly.PHP.statementToCode(a,"STACK");Blockly.PHP.STATEMENT_PREFIX&&(d=Blockly.PHP.prefixLines(Blockly.PHP.STATEMENT_PREFIX.replace(/%1/g,"'"+ -a.id+"'"),Blockly.PHP.INDENT)+d);Blockly.PHP.INFINITE_LOOP_TRAP&&(d=Blockly.PHP.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+a.id+"'")+d);var e=Blockly.PHP.valueToCode(a,"RETURN",Blockly.PHP.ORDER_NONE)||"";e&&(e=" return "+e+";\n");for(var g=[],f=0;f",GTE:">="}[a.getFieldValue("OP")],c=Blockly.Python.ORDER_RELATIONAL,d=Blockly.Python.valueToCode(a,"A",c)||"0";a=Blockly.Python.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; -Blockly.Python.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"and":"or",c="and"==b?Blockly.Python.ORDER_LOGICAL_AND:Blockly.Python.ORDER_LOGICAL_OR,d=Blockly.Python.valueToCode(a,"A",c);a=Blockly.Python.valueToCode(a,"B",c);if(d||a){var e="and"==b?"True":"False";d||(d=e);a||(a=e)}else a=d="False";return[d+" "+b+" "+a,c]};Blockly.Python.logic_negate=function(a){return["not "+(Blockly.Python.valueToCode(a,"BOOL",Blockly.Python.ORDER_LOGICAL_NOT)||"True"),Blockly.Python.ORDER_LOGICAL_NOT]}; -Blockly.Python.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"True":"False",Blockly.Python.ORDER_ATOMIC]};Blockly.Python.logic_null=function(a){return["None",Blockly.Python.ORDER_ATOMIC]}; -Blockly.Python.logic_ternary=function(a){var b=Blockly.Python.valueToCode(a,"IF",Blockly.Python.ORDER_CONDITIONAL)||"False",c=Blockly.Python.valueToCode(a,"THEN",Blockly.Python.ORDER_CONDITIONAL)||"None";a=Blockly.Python.valueToCode(a,"ELSE",Blockly.Python.ORDER_CONDITIONAL)||"None";return[c+" if "+b+" else "+a,Blockly.Python.ORDER_CONDITIONAL]};Blockly.Python.loops={};Blockly.Python.controls_repeat_ext=function(a){var b=a.getField("TIMES")?String(parseInt(a.getFieldValue("TIMES"),10)):Blockly.Python.valueToCode(a,"TIMES",Blockly.Python.ORDER_NONE)||"0",b=Blockly.isNumber(b)?parseInt(b,10):"int("+b+")",c=Blockly.Python.statementToCode(a,"DO"),c=Blockly.Python.addLoopTrap(c,a.id)||Blockly.Python.PASS;return"for "+Blockly.Python.variableDB_.getDistinctName("count",Blockly.Variables.NAME_TYPE)+" in range("+b+"):\n"+c}; -Blockly.Python.controls_repeat=Blockly.Python.controls_repeat_ext;Blockly.Python.controls_whileUntil=function(a){var b="UNTIL"==a.getFieldValue("MODE"),c=Blockly.Python.valueToCode(a,"BOOL",b?Blockly.Python.ORDER_LOGICAL_NOT:Blockly.Python.ORDER_NONE)||"False",d=Blockly.Python.statementToCode(a,"DO"),d=Blockly.Python.addLoopTrap(d,a.id)||Blockly.Python.PASS;b&&(c="not "+c);return"while "+c+":\n"+d}; -Blockly.Python.controls_for=function(a){var b=Blockly.Python.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.Python.valueToCode(a,"FROM",Blockly.Python.ORDER_NONE)||"0",d=Blockly.Python.valueToCode(a,"TO",Blockly.Python.ORDER_NONE)||"0",e=Blockly.Python.valueToCode(a,"BY",Blockly.Python.ORDER_NONE)||"1",g=Blockly.Python.statementToCode(a,"DO"),g=Blockly.Python.addLoopTrap(g,a.id)||Blockly.Python.PASS,f="",h=function(){return Blockly.Python.provideFunction_("upRange", -["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(start, stop, step):"," while start <= stop:"," yield start"," start += abs(step)"])},k=function(){return Blockly.Python.provideFunction_("downRange",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(start, stop, step):"," while start >= stop:"," yield start"," start -= abs(step)"])};a=function(a,b,c){return"("+a+" <= "+b+") and "+h()+"("+a+", "+b+", "+c+") or "+k()+"("+a+", "+b+", "+c+")"};if(Blockly.isNumber(c)&&Blockly.isNumber(d)&& -Blockly.isNumber(e))c=parseFloat(c),d=parseFloat(d),e=Math.abs(parseFloat(e)),0===c%1&&0===d%1&&0===e%1?(c<=d?(d++,a=0==c&&1==e?d:c+", "+d,1!=e&&(a+=", "+e)):(d--,a=c+", "+d+", -"+e),a="range("+a+")"):(a=ca?Blockly.Python.ORDER_UNARY_SIGN:Blockly.Python.ORDER_ATOMIC]}; -Blockly.Python.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.Python.ORDER_ADDITIVE],MINUS:[" - ",Blockly.Python.ORDER_ADDITIVE],MULTIPLY:[" * ",Blockly.Python.ORDER_MULTIPLICATIVE],DIVIDE:[" / ",Blockly.Python.ORDER_MULTIPLICATIVE],POWER:[" ** ",Blockly.Python.ORDER_EXPONENTIATION]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.Python.valueToCode(a,"A",b)||"0";a=Blockly.Python.valueToCode(a,"B",b)||"0";return[d+c+a,b]}; -Blockly.Python.math_single=function(a){var b=a.getFieldValue("OP"),c;if("NEG"==b)return c=Blockly.Python.valueToCode(a,"NUM",Blockly.Python.ORDER_UNARY_SIGN)||"0",["-"+c,Blockly.Python.ORDER_UNARY_SIGN];Blockly.Python.definitions_.import_math="import math";a="SIN"==b||"COS"==b||"TAN"==b?Blockly.Python.valueToCode(a,"NUM",Blockly.Python.ORDER_MULTIPLICATIVE)||"0":Blockly.Python.valueToCode(a,"NUM",Blockly.Python.ORDER_NONE)||"0";switch(b){case "ABS":c="math.fabs("+a+")";break;case "ROOT":c="math.sqrt("+ -a+")";break;case "LN":c="math.log("+a+")";break;case "LOG10":c="math.log10("+a+")";break;case "EXP":c="math.exp("+a+")";break;case "POW10":c="math.pow(10,"+a+")";break;case "ROUND":c="round("+a+")";break;case "ROUNDUP":c="math.ceil("+a+")";break;case "ROUNDDOWN":c="math.floor("+a+")";break;case "SIN":c="math.sin("+a+" / 180.0 * math.pi)";break;case "COS":c="math.cos("+a+" / 180.0 * math.pi)";break;case "TAN":c="math.tan("+a+" / 180.0 * math.pi)"}if(c)return[c,Blockly.Python.ORDER_FUNCTION_CALL];switch(b){case "ASIN":c= -"math.asin("+a+") / math.pi * 180";break;case "ACOS":c="math.acos("+a+") / math.pi * 180";break;case "ATAN":c="math.atan("+a+") / math.pi * 180";break;default:throw"Unknown math operator: "+b;}return[c,Blockly.Python.ORDER_MULTIPLICATIVE]}; -Blockly.Python.math_constant=function(a){var b={PI:["math.pi",Blockly.Python.ORDER_MEMBER],E:["math.e",Blockly.Python.ORDER_MEMBER],GOLDEN_RATIO:["(1 + math.sqrt(5)) / 2",Blockly.Python.ORDER_MULTIPLICATIVE],SQRT2:["math.sqrt(2)",Blockly.Python.ORDER_MEMBER],SQRT1_2:["math.sqrt(1.0 / 2)",Blockly.Python.ORDER_MEMBER],INFINITY:["float('inf')",Blockly.Python.ORDER_ATOMIC]};a=a.getFieldValue("CONSTANT");"INFINITY"!=a&&(Blockly.Python.definitions_.import_math="import math");return b[a]}; -Blockly.Python.math_number_property=function(a){var b=Blockly.Python.valueToCode(a,"NUMBER_TO_CHECK",Blockly.Python.ORDER_MULTIPLICATIVE)||"0",c=a.getFieldValue("PROPERTY"),d;if("PRIME"==c)return Blockly.Python.definitions_.import_math="import math",d=Blockly.Python.provideFunction_("math_isPrime",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(n):"," # https://en.wikipedia.org/wiki/Primality_test#Naive_methods"," # If n is not a number but a string, try parsing it."," if type(n) not in (int, float, long):", -" try:"," n = float(n)"," except:"," return False"," if n == 2 or n == 3:"," return True"," # False if n is negative, is 1, or not whole, or if n is divisible by 2 or 3."," if n <= 1 or n % 1 != 0 or n % 2 == 0 or n % 3 == 0:"," return False"," # Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for x in range(6, int(math.sqrt(n)) + 2, 6):"," if n % (x - 1) == 0 or n % (x + 1) == 0:"," return False"," return True"])+"("+b+")",[d,Blockly.Python.ORDER_FUNCTION_CALL]; -switch(c){case "EVEN":d=b+" % 2 == 0";break;case "ODD":d=b+" % 2 == 1";break;case "WHOLE":d=b+" % 1 == 0";break;case "POSITIVE":d=b+" > 0";break;case "NEGATIVE":d=b+" < 0";break;case "DIVISIBLE_BY":a=Blockly.Python.valueToCode(a,"DIVISOR",Blockly.Python.ORDER_MULTIPLICATIVE);if(!a||"0"==a)return["False",Blockly.Python.ORDER_ATOMIC];d=b+" % "+a+" == 0"}return[d,Blockly.Python.ORDER_RELATIONAL]}; -Blockly.Python.math_change=function(a){var b=Blockly.Python.valueToCode(a,"DELTA",Blockly.Python.ORDER_ADDITIVE)||"0";a=Blockly.Python.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);return a+" = ("+a+" if type("+a+") in (int, float, long) else 0) + "+b+"\n"};Blockly.Python.math_round=Blockly.Python.math_single;Blockly.Python.math_trig=Blockly.Python.math_single; -Blockly.Python.math_on_list=function(a){var b=a.getFieldValue("OP");a=Blockly.Python.valueToCode(a,"LIST",Blockly.Python.ORDER_NONE)||"[]";switch(b){case "SUM":b="sum("+a+")";break;case "MIN":b="min("+a+")";break;case "MAX":b="max("+a+")";break;case "AVERAGE":b=Blockly.Python.provideFunction_("math_mean",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(myList):"," localList = [e for e in myList if type(e) in (int, float, long)]"," if not localList: return"," return float(sum(localList)) / len(localList)"]); -b=b+"("+a+")";break;case "MEDIAN":b=Blockly.Python.provideFunction_("math_median",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(myList):"," localList = sorted([e for e in myList if type(e) in (int, float, long)])"," if not localList: return"," if len(localList) % 2 == 0:"," return (localList[len(localList) / 2 - 1] + localList[len(localList) / 2]) / 2.0"," else:"," return localList[(len(localList) - 1) / 2]"]);b=b+"("+a+")";break;case "MODE":b=Blockly.Python.provideFunction_("math_modes", -["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(some_list):"," modes = []"," # Using a lists of [item, count] to keep count rather than dict",' # to avoid "unhashable" errors when the counted item is itself a list or dict.'," counts = []"," maxCount = 1"," for item in some_list:"," found = False"," for count in counts:"," if count[0] == item:"," count[1] += 1"," maxCount = max(maxCount, count[1])"," found = True"," if not found:"," counts.append([item, 1])", -" for counted_item, item_count in counts:"," if item_count == maxCount:"," modes.append(counted_item)"," return modes"]);b=b+"("+a+")";break;case "STD_DEV":Blockly.Python.definitions_.import_math="import math";b=Blockly.Python.provideFunction_("math_standard_deviation",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(numbers):"," n = len(numbers)"," if n == 0: return"," mean = float(sum(numbers)) / n"," variance = sum((x - mean) ** 2 for x in numbers) / n"," return math.sqrt(variance)"]); -b=b+"("+a+")";break;case "RANDOM":Blockly.Python.definitions_.import_random="import random";b="random.choice("+a+")";break;default:throw"Unknown operator: "+b;}return[b,Blockly.Python.ORDER_FUNCTION_CALL]};Blockly.Python.math_modulo=function(a){var b=Blockly.Python.valueToCode(a,"DIVIDEND",Blockly.Python.ORDER_MULTIPLICATIVE)||"0";a=Blockly.Python.valueToCode(a,"DIVISOR",Blockly.Python.ORDER_MULTIPLICATIVE)||"0";return[b+" % "+a,Blockly.Python.ORDER_MULTIPLICATIVE]}; -Blockly.Python.math_constrain=function(a){var b=Blockly.Python.valueToCode(a,"VALUE",Blockly.Python.ORDER_NONE)||"0",c=Blockly.Python.valueToCode(a,"LOW",Blockly.Python.ORDER_NONE)||"0";a=Blockly.Python.valueToCode(a,"HIGH",Blockly.Python.ORDER_NONE)||"float('inf')";return["min(max("+b+", "+c+"), "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]}; -Blockly.Python.math_random_int=function(a){Blockly.Python.definitions_.import_random="import random";var b=Blockly.Python.valueToCode(a,"FROM",Blockly.Python.ORDER_NONE)||"0";a=Blockly.Python.valueToCode(a,"TO",Blockly.Python.ORDER_NONE)||"0";return["random.randint("+b+", "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]};Blockly.Python.math_random_float=function(a){Blockly.Python.definitions_.import_random="import random";return["random.random()",Blockly.Python.ORDER_FUNCTION_CALL]};Blockly.Python.procedures={}; -Blockly.Python.procedures_defreturn=function(a){for(var b=Blockly.Variables.allVariables(a),c=b.length-1;0<=c;c--){var d=b[c];-1==a.arguments_.indexOf(d)?b[c]=Blockly.Python.variableDB_.getName(d,Blockly.Variables.NAME_TYPE):b.splice(c,1)}b=b.length?" global "+b.join(", ")+"\n":"";c=Blockly.Python.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE);d=Blockly.Python.statementToCode(a,"STACK");Blockly.Python.STATEMENT_PREFIX&&(d=Blockly.Python.prefixLines(Blockly.Python.STATEMENT_PREFIX.replace(/%1/g,"'"+ -a.id+"'"),Blockly.Python.INDENT)+d);Blockly.Python.INFINITE_LOOP_TRAP&&(d=Blockly.Python.INFINITE_LOOP_TRAP.replace(/%1/g,'"'+a.id+'"')+d);var e=Blockly.Python.valueToCode(a,"RETURN",Blockly.Python.ORDER_NONE)||"";e?e=" return "+e+"\n":d||(d=Blockly.Python.PASS);for(var g=[],f=0;f - - test colour picker - - - static colour - - - #ff6600 - - - - - #ff6600 - - - - - - - test rgb - - - from rgb - - - - - 100 - - - - - 40 - - - - - 0 - - - - - - - #ff6600 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test colour random - - - - - 100 - - - - - item - - - - - - test name - - - - - item - - - - - - - 7 - - - - - test name - - - - FIRST - - - item - - - - - - - # - - - - - i - - - 2 - - - - - 7 - - - - - test name - TRUE - - - NEQ - - - 0 - - - - - FIRST - - - abcdefABDEF0123456789 - - - - - - FROM_START - - - item - - - - - i - - - - - - - - - - - - - - - - - - - - - - - test blend - - - blend - - - - - #ff0000 - - - - - - - 100 - - - - - 40 - - - - - 0 - - - - - - - 0.4 - - - - - - - #ff2900 - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/index.html b/src/opsoro/apps/visual_programming/static/blockly/tests/generators/index.html deleted file mode 100644 index 39d5a44..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/index.html +++ /dev/null @@ -1,439 +0,0 @@ - - - - -Blockly Generator Tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      -

      Blockly Generator Tests

      - -

      - - -

      - -

      - Generate: - - - - - -

      -
      - -
      - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/lists.xml b/src/opsoro/apps/visual_programming/static/blockly/tests/generators/lists.xml deleted file mode 100644 index ebbbec9..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/lists.xml +++ /dev/null @@ -1,2255 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test create - - - test create empty - - - - - - - - - - - test create items - - - - - - TRUE - - - - - love - - - - - - - - - - TRUE - - - - - love - - - - - - - test create repeated - - - - - Eject - - - - - 3 - - - - - - - - - - Eject - - - - - Eject - - - - - Eject - - - - - - - - - - - - - test empty - - - not empty - FALSE - - - - - - - - 0 - - - - - - - - - empty - TRUE - - - - - - - - - - - - - - test length - - - zero length - - - - - - - - - - 0 - - - - - one length - - - - - - - - cat - - - - - - - - - 1 - - - - - three length - - - - - - - - cat - - - - - TRUE - - - - - - - - - - - - 3 - - - - - - - - - - - test find - - - find first - - - FIRST - - - - - - Alice - - - - - Eve - - - - - Bob - - - - - Eve - - - - - - - Eve - - - - - - - 2 - - - - - find last - - - LAST - - - - - - Alice - - - - - Eve - - - - - Bob - - - - - Eve - - - - - - - Eve - - - - - - - 4 - - - - - find none - - - FIRST - - - - - - Alice - - - - - Bob - - - - - Carol - - - - - Dave - - - - - - - Eve - - - - - - - 0 - - - - - - - - - - - test get - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - get first - - - - GET - FIRST - - - list - - - - - - - Kirk - - - - - get last - - - - GET - LAST - - - list - - - - - - - McCoy - - - - - get random - TRUE - - - - POSITIVE - - - FIRST - - - list - - - - - - GET - RANDOM - - - list - - - - - - - - - - - get # - - - - GET - FROM_START - - - list - - - - - 2 - - - - - - - Spock - - - - - get #-end - - - - GET - FROM_END - - - list - - - - - 3 - - - - - - - Kirk - - - - - - - - - - - - - - - - - test get remove - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - getremove first - - - - GET_REMOVE - FIRST - - - list - - - - - - - Kirk - - - - - getremove first list - - - list - - - - - - - - Spock - - - - - McCoy - - - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - getremove last - - - - GET_REMOVE - LAST - - - list - - - - - - - McCoy - - - - - getremove last list - - - list - - - - - - - - Kirk - - - - - Spock - - - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - getremove random - TRUE - - - EQ - - - FIRST - - - list - - - - - - GET_REMOVE - RANDOM - - - list - - - - - - - - - 0 - - - - - - - getremove random list - - - - - list - - - - - - - 2 - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - getremove # - - - - GET_REMOVE - FROM_START - - - list - - - - - 2 - - - - - - - Spock - - - - - getremove # list - - - list - - - - - - - - Kirk - - - - - McCoy - - - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - getremove #-end - - - - GET_REMOVE - FROM_END - - - list - - - - - 3 - - - - - - - Kirk - - - - - getremove #-end list - - - list - - - - - - - - Spock - - - - - McCoy - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test remove - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - - REMOVE - FIRST - - - list - - - - - remove first list - - - list - - - - - - - - Spock - - - - - McCoy - - - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - - REMOVE - LAST - - - list - - - - - remove last list - - - list - - - - - - - - Kirk - - - - - Spock - - - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - - REMOVE - RANDOM - - - list - - - - - remove random list - - - - - list - - - - - - - 2 - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - - REMOVE - FROM_START - - - list - - - - - 2 - - - - - remove # list - - - list - - - - - - - - Kirk - - - - - McCoy - - - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - - REMOVE - FROM_END - - - list - - - - - 3 - - - - - remove #-end list - - - list - - - - - - - - Spock - - - - - McCoy - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test set - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - SET - FIRST - - - x - - - - - Jean-Luc - - - - - set first list - - - x - - - - - - - - Jean-Luc - - - - - Riker - - - - - Crusher - - - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - SET - LAST - - - x - - - - - Beverly - - - - - set last list - - - x - - - - - - - - Picard - - - - - Riker - - - - - Beverly - - - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - SET - RANDOM - - - x - - - - - Data - - - - - set random list - - - - - x - - - - - - - 3 - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - SET - FROM_START - - - x - - - - - 3 - - - - - Pulaski - - - - - set # list - - - x - - - - - - - - Picard - - - - - Riker - - - - - Pulaski - - - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - SET - FROM_END - - - x - - - - - 1 - - - - - Pulaski - - - - - set #-end list - - - x - - - - - - - - Picard - - - - - Riker - - - - - Pulaski - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test insert - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - INSERT - FIRST - - - x - - - - - Data - - - - - insert first list - - - x - - - - - - - - Data - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - INSERT - LAST - - - x - - - - - Data - - - - - insert last list - - - x - - - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - Data - - - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - INSERT - RANDOM - - - x - - - - - Data - - - - - insert random list - - - - - x - - - - - - - 4 - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - INSERT - FROM_START - - - x - - - - - 3 - - - - - Data - - - - - insert # list - - - x - - - - - - - - Picard - - - - - Riker - - - - - Data - - - - - Crusher - - - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - INSERT - FROM_END - - - x - - - - - 1 - - - - - Data - - - - - insert #-end list - - - x - - - - - - - - Picard - - - - - Riker - - - - - Data - - - - - Crusher - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test sublist - - - list - - - - - - Columbia - - - - - Challenger - - - - - Discovery - - - - - Atlantis - - - - - Endeavour - - - - - - - sublist # start - - - - FROM_START - FROM_START - - - list - - - - - 2 - - - - - 3 - - - - - - - - - - Challenger - - - - - Discovery - - - - - - - sublist # end - - - - FROM_END - FROM_END - - - list - - - - - 3 - - - - - 2 - - - - - - - - - - Discovery - - - - - Atlantis - - - - - - - sublist first-last - - - - FIRST - LAST - - - list - - - - - - - list - - - - - - - - - - - - - test join - - - list - - - - - - Vulcan - - - - - Klingon - - - - - Borg - - - - - - - join - - - - JOIN - - - list - - - - - , - - - - - - - Vulcan,Klingon,Borg - - - - - - - - - test split - - - list - - - - SPLIT - - - Vulcan,Klingon,Borg - - - - - , - - - - - - - join - - - list - - - - - - - - Vulcan - - - - - Klingon - - - - - Borg - - - - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/logic.xml b/src/opsoro/apps/visual_programming/static/blockly/tests/generators/logic.xml deleted file mode 100644 index b702b5e..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/logic.xml +++ /dev/null @@ -1,786 +0,0 @@ - - - - - True - TRUE - - - TRUE - - - - - False - FALSE - - - FALSE - - - - - Not true - TRUE - - - - - FALSE - - - - - - - Not false - FALSE - - - - - TRUE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test if - - - - - FALSE - - - - - if false - - - - - ok - - - FALSE - - - - - - - TRUE - - - - - ok - - - TRUE - - - - - - - if true - TRUE - - - ok - - - - - ok - - - FALSE - - - - - - - - FALSE - - - - - if/else false - - - - - ok - - - TRUE - - - - - - - if/else false - TRUE - - - ok - - - - - ok - - - FALSE - - - - - - - - TRUE - - - - - ok - - - TRUE - - - - - - - if/else true - - - - - if/else true - TRUE - - - ok - - - - - ok - - - FALSE - - - - - - - - FALSE - - - - - elseif 1 - - - - - TRUE - - - - - ok - - - TRUE - - - - - - - TRUE - - - - - elseif 2 - - - - - elseif 3 - - - - - elseif 4 - TRUE - - - ok - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test equalities - - - Equal yes - TRUE - - - EQ - - - 2 - - - - - 2 - - - - - - - Equal no - FALSE - - - EQ - - - 3 - - - - - 4 - - - - - - - Not equal yes - TRUE - - - NEQ - - - 5 - - - - - 6 - - - - - - - Not equal no - FALSE - - - EQ - - - 3 - - - - - 4 - - - - - - - Smaller yes - TRUE - - - LT - - - 5 - - - - - 6 - - - - - - - Smaller no - FALSE - - - LT - - - 7 - - - - - 7 - - - - - - - Greater yes - TRUE - - - GT - - - 9 - - - - - 8 - - - - - - - Greater no - FALSE - - - GT - - - 10 - - - - - 10 - - - - - - - Smaller-equal yes - TRUE - - - LTE - - - 11 - - - - - 11 - - - - - - - Smaller-equal no - FALSE - - - LTE - - - 13 - - - - - 12 - - - - - - - Greater-equal yes - TRUE - - - GTE - - - 14 - - - - - 14 - - - - - - - Greater-equal no - FALSE - - - GTE - - - 15 - - - - - 16 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test or - - - Or true/true - TRUE - - - OR - - - TRUE - - - - - TRUE - - - - - - - Or false/true - TRUE - - - OR - - - FALSE - - - - - TRUE - - - - - - - Or true/false - TRUE - - - OR - - - TRUE - - - - - FALSE - - - - - - - Or false/false - FALSE - - - OR - - - FALSE - - - - - FALSE - - - - - - - - - - - - - - - test and - - - And true/true - TRUE - - - AND - - - TRUE - - - - - TRUE - - - - - - - And false/true - FALSE - - - AND - - - FALSE - - - - - TRUE - - - - - - - And true/false - FALSE - - - AND - - - TRUE - - - - - FALSE - - - - - - - And false/false - FALSE - - - AND - - - FALSE - - - - - FALSE - - - - - - - - - - - - - - - test ternary - - - if true - - - - - TRUE - - - - - 42 - - - - - 99 - - - - - - - 42 - - - - - if true - - - - - FALSE - - - - - 42 - - - - - 99 - - - - - - - 99 - - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/loops1.xml b/src/opsoro/apps/visual_programming/static/blockly/tests/generators/loops1.xml deleted file mode 100644 index 70fb34c..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/loops1.xml +++ /dev/null @@ -1,275 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - test foreach - - - log - - - - - - - - x - - - - - - a - - - - - b - - - - - c - - - - - - - log - - - x - - - - - - - for loop - - - log - - - - - abc - - - - - - - - - - - - test while - - - WHILE - - - FALSE - - - - - while 0 - - - - - UNTIL - - - TRUE - - - - - until 0 - - - - - count - - - 1 - - - - - WHILE - - - NEQ - - - count - - - - - 10 - - - - - - - count - - - 1 - - - - - - - while 10 - - - count - - - - - 10 - - - - - count - - - 1 - - - - - UNTIL - - - EQ - - - count - - - - - 10 - - - - - - - count - - - 1 - - - - - - - until 10 - - - count - - - - - 10 - - - - - - - - - - - - - - - - - - - - - - test repeat - - - count - - - 0 - - - - - - - 10 - - - - - count - - - 1 - - - - - - - repeat 10 - - - count - - - - - 10 - - - - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/loops2.xml b/src/opsoro/apps/visual_programming/static/blockly/tests/generators/loops2.xml deleted file mode 100644 index 4307f6d..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/loops2.xml +++ /dev/null @@ -1,850 +0,0 @@ - - - - - - - - - - - - - - - test count by - - - log - - - - - - - - x - - - 1 - - - - - 8 - - - - - 2 - - - - - log - - - x - - - - - - - count up ints - - - log - - - - - 1357 - - - - - log - - - - - - - - x - - - 8 - - - - - 1 - - - - - 2 - - - - - log - - - x - - - - - - - count down ints - - - log - - - - - 8642 - - - - - loglist - - - - - - x - - - 1 - - - - - 8 - - - - - 1.5 - - - - - - INSERT - LAST - - - loglist - - - - - x - - - - - - - count with floats - - - loglist - - - - - - - - 1 - - - - - 2.5 - - - - - 4 - - - - - 5.5 - - - - - 7 - - - - - - - loglist - - - - - - x - - - ADD - - - 1 - - - - - 0 - - - - - - - ADD - - - 8 - - - - - 0 - - - - - - - MINUS - - - 1 - - - - - 2 - - - - - - - - INSERT - LAST - - - loglist - - - - - x - - - - - - - count up non-trivial ints - - - loglist - - - - - - - - 1 - - - - - 2 - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - - - loglist - - - - - - x - - - ADD - - - 8 - - - - - 0 - - - - - - - ADD - - - 1 - - - - - 0 - - - - - - - 2 - - - - - - INSERT - LAST - - - loglist - - - - - x - - - - - - - count down non-trivial ints - - - loglist - - - - - - - - 8 - - - - - 6 - - - - - 4 - - - - - 2 - - - - - - - loglist - - - - - - x - - - ADD - - - 5 - - - - - 0.5 - - - - - - - ADD - - - 1 - - - - - 0 - - - - - - - ADD - - - 1 - - - - - 0 - - - - - - - - INSERT - LAST - - - loglist - - - - - x - - - - - - - count with floats - - - loglist - - - - - - - - 5.5 - - - - - 4.5 - - - - - 3.5 - - - - - 2.5 - - - - - 1.5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test count - - - log - - - - - - - - x - - - 1 - - - - - 8 - - - - - log - - - x - - - - - - - count up - - - log - - - - - 12345678 - - - - - log - - - - - - - - x - - - 8 - - - - - 1 - - - - - log - - - x - - - - - - - count down - - - log - - - - - 87654321 - - - - - loglist - - - - - - x - - - ADD - - - 1 - - - - - 0 - - - - - - - ADD - - - 4 - - - - - 0 - - - - - - - - INSERT - LAST - - - loglist - - - - - x - - - - - - - count up non-trivial - - - loglist - - - - - - - - 1 - - - - - 2 - - - - - 3 - - - - - 4 - - - - - - - loglist - - - - - - x - - - ADD - - - 3 - - - - - 1 - - - - - - - ADD - - - 1 - - - - - 0 - - - - - - - - INSERT - LAST - - - loglist - - - - - x - - - - - - - count down non-trivial - - - loglist - - - - - - - - 4 - - - - - 3 - - - - - 2 - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/loops3.xml b/src/opsoro/apps/visual_programming/static/blockly/tests/generators/loops3.xml deleted file mode 100644 index 6cd5e0c..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/loops3.xml +++ /dev/null @@ -1,702 +0,0 @@ - - - - - - - - - - - - - - - test continue - - - log - - - - - - - - count - - - 0 - - - - - WHILE - - - NEQ - - - count - - - - - 8 - - - - - - - count - - - 1 - - - - - - - EQ - - - count - - - - - 5 - - - - - - - CONTINUE - - - - - log - - - count - - - - - - - - - - - while continue - - - log - - - - - 1234678 - - - - - log - - - - - - - - count - - - 0 - - - - - UNTIL - - - EQ - - - count - - - - - 8 - - - - - - - count - - - 1 - - - - - - - EQ - - - count - - - - - 5 - - - - - - - CONTINUE - - - - - log - - - count - - - - - - - - - - - until continue - - - log - - - - - 1234678 - - - - - log - - - - - - - - x - - - 1 - - - - - 8 - - - - - - - EQ - - - x - - - - - 5 - - - - - - - CONTINUE - - - - - log - - - x - - - - - - - - - count continue - - - log - - - - - 1234678 - - - - - log - - - - - - - - x - - - - - - a - - - - - b - - - - - c - - - - - d - - - - - - - - - EQ - - - x - - - - - c - - - - - - - CONTINUE - - - - - log - - - x - - - - - - - - - for continue - - - log - - - - - abd - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test break - - - count - - - 1 - - - - - WHILE - - - NEQ - - - count - - - - - 10 - - - - - - - - - EQ - - - count - - - - - 5 - - - - - - - BREAK - - - - - count - - - 1 - - - - - - - - - while break - - - count - - - - - 5 - - - - - count - - - 1 - - - - - UNTIL - - - EQ - - - count - - - - - 10 - - - - - - - - - EQ - - - count - - - - - 5 - - - - - - - BREAK - - - - - count - - - 1 - - - - - - - - - until break - - - count - - - - - 5 - - - - - log - - - - - - - - x - - - 1 - - - - - 8 - - - - - - - EQ - - - x - - - - - 5 - - - - - - - BREAK - - - - - log - - - x - - - - - - - - - count break - - - log - - - - - 1234 - - - - - log - - - - - - - - x - - - - - - a - - - - - b - - - - - c - - - - - d - - - - - - - - - EQ - - - x - - - - - c - - - - - - - BREAK - - - - - log - - - x - - - - - - - - - for break - - - log - - - - - ab - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/math.xml b/src/opsoro/apps/visual_programming/static/blockly/tests/generators/math.xml deleted file mode 100644 index 38b28c3..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/math.xml +++ /dev/null @@ -1,1591 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test operations on single - - - sqrt - - - ROOT - - - 25 - - - - - - - 5 - - - - - abs - - - ABS - - - -25 - - - - - - - 25 - - - - - negate - - - NEG - - - -25 - - - - - - - 25 - - - - - ln - - - LN - - - 1 - - - - - - - 0 - - - - - log10 - - - LOG10 - - - 100 - - - - - - - 2 - - - - - exp - - - EXP - - - 2 - - - - - - - 7.38905609893065 - - - - - power10 - - - POW10 - - - 2 - - - - - - - 100 - - - - - - - - - - - - - - - - - - - test arithmetic - - - add - - - ADD - - - 1 - - - - - 2 - - - - - - - 3 - - - - - subtract - - - MINUS - - - 1 - - - - - 2 - - - - - - - -1 - - - - - multiply - - - MULTIPLY - - - 4 - - - - - 2.5 - - - - - - - 10 - - - - - divide - - - DIVIDE - - - 8.2 - - - - - -5 - - - - - - - -1.64 - - - - - power - - - POWER - - - 10 - - - - - 4 - - - - - - - 10000 - - - - - - - - - - - - - - - test trig - - - sin - - - SIN - - - 90 - - - - - - - 1 - - - - - cos - - - COS - - - 180 - - - - - - - -1 - - - - - tan - - - TAN - - - 0 - - - - - - - 0 - - - - - asin - - - ASIN - - - -1 - - - - - - - -90 - - - - - acos - - - ACOS - - - 1 - - - - - - - 0 - - - - - atan - - - ATAN - - - 1 - - - - - - - 45 - - - - - - - - - - - - - - - - - test constant - - - const pi - - - ROUNDDOWN - - - MULTIPLY - - - PI - - - - - 1000 - - - - - - - - - 3141 - - - - - const e - - - ROUNDDOWN - - - MULTIPLY - - - E - - - - - 1000 - - - - - - - - - 2718 - - - - - const golden - - - ROUNDDOWN - - - MULTIPLY - - - GOLDEN_RATIO - - - - - 1000 - - - - - - - - - 1618 - - - - - const sqrt 2 - - - ROUNDDOWN - - - MULTIPLY - - - SQRT2 - - - - - 1000 - - - - - - - - - 1414 - - - - - const sqrt 0.5 - - - ROUNDDOWN - - - MULTIPLY - - - SQRT1_2 - - - - - 1000 - - - - - - - - - 707 - - - - - const infinity - TRUE - - - LT - - - 9999 - - - - - INFINITY - - - - - - - - - - - - - - - - - - - test number properties - - - even - TRUE - - - - EVEN - - - 42 - - - - - - - odd - FALSE - - - - ODD - - - 42.1 - - - - - - - prime 5 - TRUE - - - - PRIME - - - 5 - - - - - - - prime 25 - FALSE - - - - PRIME - - - 25 - - - - - - - prime negative - FALSE - - - - PRIME - - - -31.1 - - - - - - - whole - FALSE - - - - WHOLE - - - PI - - - - - - - positive - TRUE - - - - POSITIVE - - - INFINITY - - - - - - - negative - TRUE - - - - NEGATIVE - - - -42 - - - - - - - divisible - TRUE - - - - DIVISIBLE_BY - - - 42 - - - - - 2 - - - - - - - - - - - - - - - - - - - - - - - - - test round - - - round - - - ROUND - - - 42.42 - - - - - - - 42 - - - - - round up - - - ROUNDUP - - - -42.42 - - - - - - - -42 - - - - - round down - - - ROUNDDOWN - - - 42.42 - - - - - - - 42 - - - - - - - - - - - test change - - - varToChange - - - 100 - - - - - varToChange - - - 42 - - - - - change - - - varToChange - - - - - 142 - - - - - - - - - - - - - - - assert list equal - - - equal - - - TRUE - - - - - - - - NEQ - - - - - a - - - - - - - - - b - - - - - - - - - equal - - - FALSE - - - - - - - x - - - 1 - - - - - - - a - - - - - - - - - NEQ - - - - GET - FROM_START - - - a - - - - - x - - - - - - - - GET - FROM_START - - - b - - - - - x - - - - - - - - - equal - - - FALSE - - - - - BREAK - - - - - - - - - - - - - - - equal - - - - - - - list equality - - - a - - - - - b - - - - - - - - - - - - - equal - - - - - test operations on list - - - sum - - - - SUM - - - - - - 3 - - - - - 4 - - - - - 5 - - - - - - - - - 12 - - - - - min - - - - MIN - - - - - - 3 - - - - - 4 - - - - - 5 - - - - - - - - - 3 - - - - - max - - - - MAX - - - - - - 3 - - - - - 4 - - - - - 5 - - - - - - - - - 5 - - - - - average - - - - AVERAGE - - - - - - 3 - - - - - 4 - - - - - 5 - - - - - - - - - 4 - - - - - median - - - - MEDIAN - - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 1 - - - - - - - - - 3.5 - - - - - modes - TRUE - - - - - - - - - - MODE - - - - - - 3 - - - - - 4 - - - - - 3 - - - - - - - - - - - - 3 - - - - - - - - - standard dev - - - - STD_DEV - - - - - - 3 - - - - - 3 - - - - - 3 - - - - - - - - - 0 - - - - - random - TRUE - - - GT - - - FIRST - - - - - - 3 - - - - - 4 - - - - - 5 - - - - - - - - RANDOM - - - - - - 3 - - - - - 4 - - - - - 5 - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - test mod - - - mod - - - - - 42 - - - - - 5 - - - - - - - 2 - - - - - - - test constraint - - - constraint - - - - - 100 - - - - - 0 - - - - - 42 - - - - - - - 42 - - - - - - - test random integer - - - rand - - - - - 5 - - - - - 10 - - - - - - - randRange - TRUE - - - AND - - - GTE - - - rand - - - - - 5 - - - - - - - LTE - - - rand - - - - - 10 - - - - - - - - - randInteger - TRUE - - - - WHOLE - - - rand - - - - - - - - - - - - - test random fraction - - - rand - - - - - - randFloat - TRUE - - - AND - - - GTE - - - rand - - - - - 0 - - - - - - - LTE - - - rand - - - - - 1 - - - - - - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/procedures.xml b/src/opsoro/apps/visual_programming/static/blockly/tests/generators/procedures.xml deleted file mode 100644 index ce450b1..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/procedures.xml +++ /dev/null @@ -1,519 +0,0 @@ - - - - - - - - - - - test recurse - - - - - - - - 3 - - - - - - - -1-2-1-3-1-2-1- - - - - - - - - - - - test procedure - - - - - - - - - 8 - - - - - 2 - - - - - procedure with global - - - proc z - - - - - 4 - - - - - proc w - - - FALSE - - - - - - - - - - FALSE - - - - - procedure no return - TRUE - - - proc w - - - - - proc w - - - FALSE - - - - - - - - - - TRUE - - - - - procedure return - FALSE - - - proc w - - - - - - - - - - - - - - - - - - - - - - - - - procedure 1 - - - proc z - - - DIVIDE - - - proc x - - - - - proc y - - - - - - - - - - - - procedure 2 - - - - - - proc x - - - - - proc w - - - TRUE - - - - - - - - - test function - - - function with arguments - - - - - - - - - 2 - - - - - 3 - - - - - - - -1 - - - - - function with side effect - - - func z - - - - - side effect - - - - - func a - - - unchanged - - - - - func c - - - global - - - - - function with global - - - - - - - - 2 - - - - - - - 3global - - - - - function with scope - - - func a - - - - - unchanged - - - - - function return - TRUE - - - - - - - - TRUE - - - - - - - function no return - FALSE - - - - - - - - FALSE - - - - - - - - - - - - - - - - - - - - - - - - - - - function 1 - - - func z - - - side effect - - - - - - - MINUS - - - func x - - - - - func y - - - - - - - - - - function 2 - - - func a - - - 1 - - - - - - - - - - func a - - - - - func c - - - - - - - - - - function 3 - - - - - - func a - - - - - TRUE - - - - - - - FALSE - - - - - - - - recurse - - - - - - GT - - - n - - - - - 0 - - - - - - - text - - - - - - - - - - - MINUS - - - n - - - - - 1 - - - - - - - - - n - - - - - - - - - - MINUS - - - n - - - - - 1 - - - - - - - - - - - - - text - - - - - - - - - - - - - text - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/text.xml b/src/opsoro/apps/visual_programming/static/blockly/tests/generators/text.xml deleted file mode 100644 index 39a5879..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/text.xml +++ /dev/null @@ -1,707 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test length - - - length - - - - - Google - - - - - - - 6 - - - - - length - - - - - - - - - - - - 0 - - - - - - - - - test empty - - - not empty - FALSE - - - - - Google - - - - - - - empty - TRUE - - - - - - - - - - - - - - - - test create text - - - single text - - - - - - Hello - - - - - - - Hello - - - - - double text - - - - - - K - - - - - 9 - - - - - - - K9 - - - - - triple text - - - - - - 1 - - - - - 2 - - - - - 3 - - - - - - - 123 - - - - - - - - - - - test append item - - - item - - - Miserable - - - - - item - - - Failure - - - - - append text - - - item - - - - - MiserableFailure - - - - - item - - - 12 - - - - - item - - - 34 - - - - - append number - - - item - - - - - 1234 - - - - - - - - - - - - - - - - - test substring - - - text - - - 123456789 - - - - - substring # start - - - - FROM_START - FROM_START - - - text - - - - - 2 - - - - - 3 - - - - - - - 23 - - - - - substring # end - - - - FROM_END - FROM_END - - - text - - - - - 3 - - - - - 2 - - - - - - - 78 - - - - - substring first-last - - - - FIRST - LAST - - - text - - - - - - - text - - - - - - - - - - - - - test find - - - first find - - - FIRST - - - Banana - - - - - an - - - - - - - 2 - - - - - last find - - - LAST - - - Banana - - - - - an - - - - - - - 4 - - - - - no find - - - FIRST - - - Banana - - - - - Peel - - - - - - - 0 - - - - - - - - - - - test letter - - - letter # - - - - FROM_START - - - Blockly - - - - - 3 - - - - - - - o - - - - - letter # from end - - - - FROM_END - - - Blockly - - - - - 3 - - - - - - - k - - - - - first letter - - - - FIRST - - - Blockly - - - - - - - B - - - - - last letter - - - - LAST - - - Blockly - - - - - - - y - - - - - random letter - TRUE - - - - POSITIVE - - - FIRST - - - Blockly - - - - - - RANDOM - - - Blockly - - - - - - - - - - - - - - - - - - - - - test case - - - uppercase - - - UPPERCASE - - - Hello World - - - - - - - HELLO WORLD - - - - - lowercase - - - LOWERCASE - - - Hello World - - - - - - - hello world - - - - - titlecase - - - TITLECASE - - - heLLo WorlD - - - - - - - Hello World - - - - - - - - - - - test trim - - - trim both - - - BOTH - - - abc def - - - - - - - abc def - - - - - trim left - - - LEFT - - - abc def - - - - - - - abc def - - - - - trim right - - - RIGHT - - - abc def - - - - - - - abc def - - - - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/unittest.js b/src/opsoro/apps/visual_programming/static/blockly/tests/generators/unittest.js deleted file mode 100644 index 560e6b9..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/unittest.js +++ /dev/null @@ -1,94 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Unit test blocks for Blockly. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -Blockly.Blocks['unittest_main'] = { - // Container for unit tests. - init: function() { - this.setColour(65); - this.appendDummyInput() - .appendField('run tests'); - this.appendStatementInput('DO'); - this.setTooltip('Executes the enclosed unit tests,\n' + - 'then prints a summary.'); - }, - getVars: function() { - return ['unittestResults']; - } -}; - -Blockly.Blocks['unittest_assertequals'] = { - // Asserts that a value equals another value. - init: function() { - this.setColour(65); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.appendDummyInput() - .appendField(new Blockly.FieldTextInput('test name'), 'MESSAGE'); - this.appendValueInput('ACTUAL', null) - .appendField('actual'); - this.appendValueInput('EXPECTED', null) - .appendField('expected'); - this.setTooltip('Tests that "actual == expected".'); - }, - getVars: function() { - return ['unittestResults']; - } -}; - -Blockly.Blocks['unittest_assertvalue'] = { - // Asserts that a value is true, false, or null. - init: function() { - this.setColour(65); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.appendDummyInput() - .appendField(new Blockly.FieldTextInput('test name'), 'MESSAGE'); - this.appendValueInput('ACTUAL', Boolean) - .appendField('assert') - .appendField(new Blockly.FieldDropdown( - [['true', 'TRUE'], ['false', 'FALSE'], ['null', 'NULL']]), 'EXPECTED'); - this.setTooltip('Tests that the value is true, false, or null.'); - }, - getVars: function() { - return ['unittestResults']; - } -}; - -Blockly.Blocks['unittest_fail'] = { - // Always assert an error. - init: function() { - this.setColour(65); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.appendDummyInput() - .appendField(new Blockly.FieldTextInput('test name'), 'MESSAGE') - .appendField('fail'); - this.setTooltip('Records an error.'); - }, - getVars: function() { - return ['unittestResults']; - } -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/unittest_dart.js b/src/opsoro/apps/visual_programming/static/blockly/tests/generators/unittest_dart.js deleted file mode 100644 index 280595f..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/unittest_dart.js +++ /dev/null @@ -1,156 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Dart for unit test blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -Blockly.Dart['unittest_main'] = function(block) { - // Container for unit tests. - var resultsVar = Blockly.Dart.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.Dart.provideFunction_( - 'unittest_report', - [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '() {', - ' // Create test report.', - ' List report = [];', - ' StringBuffer summary = new StringBuffer();', - ' int fails = 0;', - ' for (int x = 0; x < ' + resultsVar + '.length; x++) {', - ' if (' + resultsVar + '[x][0]) {', - ' summary.write(".");', - ' } else {', - ' summary.write("F");', - ' fails++;', - ' report.add("");', - ' report.add("FAIL: ${' + resultsVar + '[x][2]}");', - ' report.add(' + resultsVar + '[x][1]);', - ' }', - ' }', - ' report.insert(0, summary.toString());', - ' report.add("");', - ' report.add("Ran ${' + resultsVar + '.length} tests.");', - ' report.add("");', - ' if (fails != 0) {', - ' report.add("FAILED (failures=$fails)");', - ' } else {', - ' report.add("OK");', - ' }', - ' return report.join("\\n");', - '}']); - // Setup global to hold test results. - var code = resultsVar + ' = [];\n'; - // Run tests (unindented). - code += Blockly.Dart.statementToCode(block, 'DO') - .replace(/^ /, '').replace(/\n /g, '\n'); - var reportVar = Blockly.Dart.variableDB_.getDistinctName( - 'report', Blockly.Variables.NAME_TYPE); - code += 'String ' + reportVar + ' = ' + functionName + '();\n'; - // Destroy results. - code += resultsVar + ' = null;\n'; - // Print the report to the console (that's where errors will go anyway). - code += 'print(' + reportVar + ');\n'; - return code; -}; - -Blockly.Dart['unittest_main'].defineAssert_ = function() { - var resultsVar = Blockly.Dart.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.Dart.provideFunction_( - 'unittest_assertequals', - [ 'void ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(dynamic actual, dynamic expected, String message) {', - ' // Asserts that a value equals another value.', - ' if (' + resultsVar + ' == null) {', - ' throw "Orphaned assert: ${message}";', - ' }', - ' bool equals(a, b) {', - ' if (a == b) {', - ' return true;', - ' } else if (a is List && b is List) {', - ' if (a.length != b.length) {', - ' return false;', - ' }', - ' for (num i = 0; i < a.length; i++) {', - ' if (!equals(a[i], b[i])) {', - ' return false;', - ' }', - ' }', - ' return true;', - ' }', - ' return false;', - ' }', - ' if (equals(actual, expected)) {', - ' ' + resultsVar + '.add([true, "OK", message]);', - ' } else {', - ' ' + resultsVar + '.add([false, ' + - '"Expected: $expected\\nActual: $actual", message]);', - ' }', - '}']); - return functionName; -}; - -Blockly.Dart['unittest_assertequals'] = function(block) { - // Asserts that a value equals another value. - var message = Blockly.Dart.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.Dart.valueToCode(block, 'ACTUAL', - Blockly.Dart.ORDER_NONE) || 'null'; - var expected = Blockly.Dart.valueToCode(block, 'EXPECTED', - Blockly.Dart.ORDER_NONE) || 'null'; - return Blockly.Dart['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ');\n'; -}; - -Blockly.Dart['unittest_assertvalue'] = function(block) { - // Asserts that a value is true, false, or null. - var message = Blockly.Dart.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.Dart.valueToCode(block, 'ACTUAL', - Blockly.Dart.ORDER_NONE) || 'null'; - var expected = block.getFieldValue('EXPECTED'); - if (expected == 'TRUE') { - expected = 'true'; - } else if (expected == 'FALSE') { - expected = 'false'; - } else if (expected == 'NULL') { - expected = 'null'; - } - return Blockly.Dart['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ');\n'; -}; - -Blockly.Dart['unittest_fail'] = function(block) { - // Always assert an error. - var resultsVar = Blockly.Dart.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var message = Blockly.Dart.quote_(block.getFieldValue('MESSAGE')); - var functionName = Blockly.Dart.provideFunction_( - 'unittest_fail', - [ 'void ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(String message) {', - ' // Always assert an error.', - ' if (' + resultsVar + ' == null) {', - ' throw "Orphaned assert fail: ${message}";', - ' }', - ' ' + resultsVar + '.add([false, "Fail.", message]);', - '}']); - return functionName + '(' + message + ');\n'; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/unittest_javascript.js b/src/opsoro/apps/visual_programming/static/blockly/tests/generators/unittest_javascript.js deleted file mode 100644 index ed5415c..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/unittest_javascript.js +++ /dev/null @@ -1,160 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating JavaScript for unit test blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -Blockly.JavaScript['unittest_main'] = function(block) { - // Container for unit tests. - var resultsVar = Blockly.JavaScript.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.JavaScript.provideFunction_( - 'unittest_report', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '() {', - ' // Create test report.', - ' var report = [];', - ' var summary = [];', - ' var fails = 0;', - ' for (var x = 0; x < ' + resultsVar + '.length; x++) {', - ' if (' + resultsVar + '[x][0]) {', - ' summary.push(".");', - ' } else {', - ' summary.push("F");', - ' fails++;', - ' report.push("");', - ' report.push("FAIL: " + ' + resultsVar + '[x][2]);', - ' report.push(' + resultsVar + '[x][1]);', - ' }', - ' }', - ' report.unshift(summary.join(""));', - ' report.push("");', - ' report.push("Number of tests run: " + ' + resultsVar + - '.length);', - ' report.push("");', - ' if (fails) {', - ' report.push("FAILED (failures=" + fails + ")");', - ' } else {', - ' report.push("OK");', - ' }', - ' return report.join("\\n");', - '}']); - // Setup global to hold test results. - var code = resultsVar + ' = [];\n'; - // Run tests (unindented). - code += Blockly.JavaScript.statementToCode(block, 'DO') - .replace(/^ /, '').replace(/\n /g, '\n'); - var reportVar = Blockly.JavaScript.variableDB_.getDistinctName( - 'report', Blockly.Variables.NAME_TYPE); - code += 'var ' + reportVar + ' = ' + functionName + '();\n'; - // Destroy results. - code += resultsVar + ' = null;\n'; - // Send the report to the console (that's where errors will go anyway). - code += 'console.log(' + reportVar + ');\n'; - return code; -}; - -Blockly.JavaScript['unittest_main'].defineAssert_ = function(block) { - var resultsVar = Blockly.JavaScript.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.JavaScript.provideFunction_( - 'assertEquals', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(actual, expected, message) {', - ' // Asserts that a value equals another value.', - ' if (!' + resultsVar + ') {', - ' throw "Orphaned assert: " + message;', - ' }', - ' function equals(a, b) {', - ' if (a === b) {', - ' return true;', - ' } else if ((typeof a == "number") && (typeof b == "number") &&', - ' (a.toPrecision(15) == b.toPrecision(15))) {', - ' return true;', - ' } else if (a instanceof Array && b instanceof Array) {', - ' if (a.length != b.length) {', - ' return false;', - ' }', - ' for (var i = 0; i < a.length; i++) {', - ' if (!equals(a[i], b[i])) {', - ' return false;', - ' }', - ' }', - ' return true;', - ' }', - ' return false;', - ' }', - ' if (equals(actual, expected)) {', - ' ' + resultsVar + '.push([true, "OK", message]);', - ' } else {', - ' ' + resultsVar + '.push([false, ' + - '"Expected: " + expected + "\\nActual: " + actual, message]);', - ' }', - '}']); - return functionName; -}; - -Blockly.JavaScript['unittest_assertequals'] = function(block) { - // Asserts that a value equals another value. - var message = Blockly.JavaScript.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.JavaScript.valueToCode(block, 'ACTUAL', - Blockly.JavaScript.ORDER_COMMA) || 'null'; - var expected = Blockly.JavaScript.valueToCode(block, 'EXPECTED', - Blockly.JavaScript.ORDER_COMMA) || 'null'; - return Blockly.JavaScript['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ');\n'; -}; - -Blockly.JavaScript['unittest_assertvalue'] = function(block) { - // Asserts that a value is true, false, or null. - var message = Blockly.JavaScript.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.JavaScript.valueToCode(block, 'ACTUAL', - Blockly.JavaScript.ORDER_COMMA) || 'null'; - var expected = block.getFieldValue('EXPECTED'); - if (expected == 'TRUE') { - expected = 'true'; - } else if (expected == 'FALSE') { - expected = 'false'; - } else if (expected == 'NULL') { - expected = 'null'; - } - return Blockly.JavaScript['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ');\n'; -}; - -Blockly.JavaScript['unittest_fail'] = function(block) { - // Always assert an error. - var resultsVar = Blockly.JavaScript.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var message = Blockly.JavaScript.quote_(block.getFieldValue('MESSAGE')); - var functionName = Blockly.JavaScript.provideFunction_( - 'unittest_fail', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(message) {', - ' // Always assert an error.', - ' if (!' + resultsVar + ') {', - ' throw "Orphaned assert fail: " + message;', - ' }', - ' ' + resultsVar + '.push([false, "Fail.", message]);', - '}']); - return functionName + '(' + message + ');\n'; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/unittest_php.js b/src/opsoro/apps/visual_programming/static/blockly/tests/generators/unittest_php.js deleted file mode 100644 index 429831a..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/unittest_php.js +++ /dev/null @@ -1,162 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating PHP for unit test blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -Blockly.PHP['unittest_main'] = function(block) { - // Container for unit tests. - var resultsVar = Blockly.PHP.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.PHP.provideFunction_( - 'unittest_report', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '() {', - 'global ' + resultsVar + ';', - ' // Create test report.', - ' $report = array();', - ' $summary = array();', - ' $fails = 0;', - ' for ($x = 0; $x < count(' + resultsVar + '); $x++) {', - ' if (' + resultsVar + '[$x][0]) {', - ' array_push($summary, ".");', - ' } else {', - ' array_push($summary, "F");', - ' $fails++;', - ' array_push($report,"");', - ' array_push($report, "FAIL: " . ' + resultsVar + '[$x][2]);', - ' array_push($report, ' + resultsVar + '[$x][1]);', - ' }', - ' }', - ' array_unshift($report, implode("",$summary));', - ' array_push($report, "");', - ' array_push($report, "Number of tests run: " . count(' + resultsVar + '));', - ' array_push($report, "");', - ' if ($fails) {', - ' array_push($report, "FAILED (failures=" . $fails + ")");', - ' } else {', - ' array_push($report, "OK");', - ' }', - ' return implode("\\n", $report);', - '}']); - // Setup global to hold test results. - var code = resultsVar + ' = array();\n'; - // Run tests (unindented). - code += Blockly.PHP.statementToCode(block, 'DO') - .replace(/^ /, '').replace(/\n /g, '\n'); - var reportVar = Blockly.PHP.variableDB_.getDistinctName( - 'report', Blockly.Variables.NAME_TYPE); - code += reportVar + ' = ' + functionName + '();\n'; - // Destroy results. - code += resultsVar + ' = null;\n'; - // Send the report to the console (that's where errors will go anyway). - code += 'print(' + reportVar + ');\n'; - return code; -}; - -Blockly.PHP['unittest_main'].defineAssert_ = function(block) { - var resultsVar = Blockly.PHP.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.PHP.provideFunction_( - 'assertEquals', - [ ' function equals($a, $b) {', - ' if ($a === $b) {', - ' return true;', - ' } else if ((is_numeric($a)) && (is_numeric($b)) &&', - ' (round($a,15) == round($b,15))) {', - ' return true;', - ' } else if (is_array($a) && is_array($b)) {', - ' if (count($a) != count($b)) {', - ' return false;', - ' }', - ' for ($i = 0; $i < count($a); $i++) {', - ' if (!equals($a[$i], $b[$i])) {', - ' return false;', - ' }', - ' }', - ' return true;', - ' }', - ' return false;', - ' }', - 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($actual, $expected, $message) {', - 'global ' + resultsVar + ';', - ' // Asserts that a value equals another value.', - ' if (!is_array(' + resultsVar + ')) {', - ' throw new Exception("Orphaned assert: " . $message);', - ' }', - ' if (equals($actual, $expected)) {', - ' array_push(' + resultsVar + ', [true, "OK", $message]);', - ' } else {', - ' array_push(' + resultsVar + ', [false, ' + - '"Expected: " . $expected . "\\nActual: " . $actual, $message]);', - ' }', - '}']); - return functionName; -}; - -Blockly.PHP['unittest_assertequals'] = function(block) { - // Asserts that a value equals another value. - var message = Blockly.PHP.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.PHP.valueToCode(block, 'ACTUAL', - Blockly.PHP.ORDER_COMMA) || 'null'; - var expected = Blockly.PHP.valueToCode(block, 'EXPECTED', - Blockly.PHP.ORDER_COMMA) || 'null'; - return Blockly.PHP['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ');\n'; -}; - -Blockly.PHP['unittest_assertvalue'] = function(block) { - // Asserts that a value is true, false, or null. - var message = Blockly.PHP.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.PHP.valueToCode(block, 'ACTUAL', - Blockly.PHP.ORDER_COMMA) || 'null'; - var expected = block.getFieldValue('EXPECTED'); - if (expected == 'TRUE') { - expected = 'true'; - } else if (expected == 'FALSE') { - expected = 'false'; - } else if (expected == 'NULL') { - expected = 'null'; - } - return Blockly.PHP['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ');\n'; -}; - -Blockly.PHP['unittest_fail'] = function(block) { - // Always assert an error. - var resultsVar = Blockly.PHP.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var message = Blockly.PHP.quote_(block.getFieldValue('MESSAGE')); - var functionName = Blockly.PHP.provideFunction_( - 'unittest_fail', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($message) {', - 'global ' + resultsVar + ';', - ' // Always assert an error.', - ' if (!' + resultsVar + ') {', - ' throw new Exception("Orphaned assert fail: " . $message);', - ' }', - ' array_push(' + resultsVar + ', [false, "Fail.", $message]);', - '}']); - return functionName + '(' + message + ');\n'; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/unittest_python.js b/src/opsoro/apps/visual_programming/static/blockly/tests/generators/unittest_python.js deleted file mode 100644 index fc64d6e..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/unittest_python.js +++ /dev/null @@ -1,131 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Generating Python for unit test blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -Blockly.Python['unittest_main'] = function(block) { - // Container for unit tests. - var resultsVar = Blockly.Python.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.Python.provideFunction_( - 'unittest_report', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '():', - ' # Create test report.', - ' report = []', - ' summary = []', - ' fails = 0', - ' for (success, log, message) in ' + resultsVar + ':', - ' if success:', - ' summary.append(".")', - ' else:', - ' summary.append("F")', - ' fails += 1', - ' report.append("")', - ' report.append("FAIL: " + message)', - ' report.append(log)', - ' report.insert(0, "".join(summary))', - ' report.append("")', - ' report.append("Number of tests run: %d" % len(' + resultsVar + '))', - ' report.append("")', - ' if fails:', - ' report.append("FAILED (failures=%d)" % fails)', - ' else:', - ' report.append("OK")', - ' return "\\n".join(report)']); - - // Setup global to hold test results. - var code = resultsVar + ' = []\n'; - // Run tests (unindented). - code += Blockly.Python.statementToCode(block, 'DO') - .replace(/^ /, '').replace(/\n /g, '\n'); - var reportVar = Blockly.Python.variableDB_.getDistinctName( - 'report', Blockly.Variables.NAME_TYPE); - code += reportVar + ' = ' + functionName + '()\n'; - // Destroy results. - code += resultsVar + ' = None\n'; - // Print the report. - code += 'print(' + reportVar + ')\n'; - return code; -}; - -Blockly.Python['unittest_main'].defineAssert_ = function() { - var resultsVar = Blockly.Python.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.Python.provideFunction_( - 'assertEquals', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + - '(actual, expected, message):', - ' # Asserts that a value equals another value.', - ' if ' + resultsVar + ' == None:', - ' raise Exception("Orphaned assert equals: " + message)', - ' if actual == expected:', - ' ' + resultsVar + '.append((True, "OK", message))', - ' else:', - ' ' + resultsVar + '.append((False, ' + - '"Expected: %s\\nActual: %s" % (expected, actual), message))']); - return functionName; -}; - -Blockly.Python['unittest_assertequals'] = function(block) { - // Asserts that a value equals another value. - var message = Blockly.Python.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.Python.valueToCode(block, 'ACTUAL', - Blockly.Python.ORDER_NONE) || 'None'; - var expected = Blockly.Python.valueToCode(block, 'EXPECTED', - Blockly.Python.ORDER_NONE) || 'None'; - return Blockly.Python['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ')\n'; -}; - -Blockly.Python['unittest_assertvalue'] = function(block) { - // Asserts that a value is true, false, or null. - var message = Blockly.Python.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.Python.valueToCode(block, 'ACTUAL', - Blockly.Python.ORDER_NONE) || 'None'; - var expected = block.getFieldValue('EXPECTED'); - if (expected == 'TRUE') { - expected = 'True'; - } else if (expected == 'FALSE') { - expected = 'False'; - } else if (expected == 'NULL') { - expected = 'None'; - } - return Blockly.Python['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ')\n'; -}; - -Blockly.Python['unittest_fail'] = function(block) { - // Always assert an error. - var resultsVar = Blockly.Python.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var message = Blockly.Python.quote_(block.getFieldValue('MESSAGE')); - var functionName = Blockly.Python.provideFunction_( - 'fail', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(message):', - ' # Always assert an error.', - ' if ' + resultsVar + ' == None:', - ' raise Exception("Orphaned assert equals: " + message)', - ' ' + resultsVar + '.append((False, "Fail.", message))']); - return functionName + '(' + message + ')\n'; -}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/variables.xml b/src/opsoro/apps/visual_programming/static/blockly/tests/generators/variables.xml deleted file mode 100644 index dfb77e5..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/generators/variables.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - item - - - 123 - - - - - variable - - - item - - - - - 123 - - - - - if - - - 123 - - - - - reserved variable - - - if - - - - - 123 - - - - - - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/blockly_test.js b/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/blockly_test.js deleted file mode 100644 index 1318149..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/blockly_test.js +++ /dev/null @@ -1,206 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -'use strict'; - -function verify_DB_(msg, expected, db) { - var equal = (expected.length == db.length); - if (equal) { - for (var x = 0; x < expected.length; x++) { - if (expected[x] != db[x]) { - equal = false; - break; - } - } - } - if (equal) { - assertTrue(msg, true); - } else { - assertEquals(msg, expected, db); - } -} - -function test_DB_addConnection() { - var db = new Blockly.ConnectionDB(); - var o2 = {y_: 2, sourceBlock_: {}}; - db.addConnection_(o2); - verify_DB_('Adding connection #2', [o2], db); - - var o4 = {y_: 4, sourceBlock_: {}}; - db.addConnection_(o4); - verify_DB_('Adding connection #4', [o2, o4], db); - - var o1 = {y_: 1, sourceBlock_: {}}; - db.addConnection_(o1); - verify_DB_('Adding connection #1', [o1, o2, o4], db); - - var o3a = {y_: 3, sourceBlock_: {}}; - db.addConnection_(o3a); - verify_DB_('Adding connection #3a', [o1, o2, o3a, o4], db); - - var o3b = {y_: 3, sourceBlock_: {}}; - db.addConnection_(o3b); - verify_DB_('Adding connection #3b', [o1, o2, o3b, o3a, o4], db); -} - -function test_DB_removeConnection() { - var db = new Blockly.ConnectionDB(); - var o1 = {y_: 1, sourceBlock_: {}}; - var o2 = {y_: 2, sourceBlock_: {}}; - var o3a = {y_: 3, sourceBlock_: {}}; - var o3b = {y_: 3, sourceBlock_: {}}; - var o3c = {y_: 3, sourceBlock_: {}}; - var o4 = {y_: 4, sourceBlock_: {}}; - db.addConnection_(o1); - db.addConnection_(o2); - db.addConnection_(o3c); - db.addConnection_(o3b); - db.addConnection_(o3a); - db.addConnection_(o4); - verify_DB_('Adding connections 1-4', [o1, o2, o3a, o3b, o3c, o4], db); - - db.removeConnection_(o2); - verify_DB_('Removing connection #2', [o1, o3a, o3b, o3c, o4], db); - - db.removeConnection_(o4); - verify_DB_('Removing connection #4', [o1, o3a, o3b, o3c], db); - - db.removeConnection_(o1); - verify_DB_('Removing connection #1', [o3a, o3b, o3c], db); - - db.removeConnection_(o3a); - verify_DB_('Removing connection #3a', [o3b, o3c], db); - - db.removeConnection_(o3c); - verify_DB_('Removing connection #3c', [o3b], db); - - db.removeConnection_(o3b); - verify_DB_('Removing connection #3b', [], db); -} - -function test_addClass() { - var p = document.createElement('p'); - Blockly.addClass_(p, 'one'); - assertEquals('Adding "one"', 'one', p.className); - Blockly.addClass_(p, 'one'); - assertEquals('Adding duplicate "one"', 'one', p.className); - Blockly.addClass_(p, 'two'); - assertEquals('Adding "two"', 'one two', p.className); - Blockly.addClass_(p, 'two'); - assertEquals('Adding duplicate "two"', 'one two', p.className); - Blockly.addClass_(p, 'three'); - assertEquals('Adding "three"', 'one two three', p.className); -} - -function test_removeClass() { - var p = document.createElement('p'); - p.className = ' one three two three '; - Blockly.removeClass_(p, 'two'); - assertEquals('Removing "two"', 'one three three', p.className); - Blockly.removeClass_(p, 'four'); - assertEquals('Removing "four"', 'one three three', p.className); - Blockly.removeClass_(p, 'three'); - assertEquals('Removing "three"', 'one', p.className); - Blockly.removeClass_(p, 'ne'); - assertEquals('Removing "ne"', 'one', p.className); - Blockly.removeClass_(p, 'one'); - assertEquals('Removing "one"', '', p.className); - Blockly.removeClass_(p, 'zero'); - assertEquals('Removing "zero"', '', p.className); -} - -function test_hasClass() { - var p = document.createElement('p'); - p.className = ' one three two three '; - assertTrue('Has "one"', Blockly.hasClass_(p, 'one')); - assertTrue('Has "two"', Blockly.hasClass_(p, 'two')); - assertTrue('Has "three"', Blockly.hasClass_(p, 'three')); - assertFalse('Has no "four"', Blockly.hasClass_(p, 'four')); - assertFalse('Has no "t"', Blockly.hasClass_(p, 't')); -} - -function test_shortestStringLength() { - var len = Blockly.shortestStringLength('one,two,three,four,five'.split(',')); - assertEquals('Length of "one"', 3, len); - len = Blockly.shortestStringLength('one,two,three,four,five,'.split(',')); - assertEquals('Length of ""', 0, len); - len = Blockly.shortestStringLength(['Hello World']); - assertEquals('List of one', 11, len); - len = Blockly.shortestStringLength([]); - assertEquals('Empty list', 0, len); -} - -function test_commonWordPrefix() { - var len = Blockly.commonWordPrefix('one,two,three,four,five'.split(',')); - assertEquals('No prefix', 0, len); - len = Blockly.commonWordPrefix('Xone,Xtwo,Xthree,Xfour,Xfive'.split(',')); - assertEquals('No word prefix', 0, len); - len = Blockly.commonWordPrefix('abc de,abc de,abc de,abc de'.split(',')); - assertEquals('Full equality', 6, len); - len = Blockly.commonWordPrefix('abc deX,abc deY'.split(',')); - assertEquals('One word prefix', 4, len); - len = Blockly.commonWordPrefix('abc de,abc deY'.split(',')); - assertEquals('Overflow no', 4, len); - len = Blockly.commonWordPrefix('abc de,abc de Y'.split(',')); - assertEquals('Overflow yes', 6, len); - len = Blockly.commonWordPrefix(['Hello World']); - assertEquals('List of one', 11, len); - len = Blockly.commonWordPrefix([]); - assertEquals('Empty list', 0, len); - len = Blockly.commonWordPrefix('turn left,turn right'.split(',')); - assertEquals('No prefix due to &nbsp;', 0, len); - len = Blockly.commonWordPrefix('turn\u00A0left,turn\u00A0right'.split(',')); - assertEquals('No prefix due to \\u00A0', 0, len); -} - -function test_commonWordSuffix() { - var len = Blockly.commonWordSuffix('one,two,three,four,five'.split(',')); - assertEquals('No prefix', 0, len); - len = Blockly.commonWordSuffix('oneX,twoX,threeX,fourX,fiveX'.split(',')); - assertEquals('No word prefix', 0, len); - len = Blockly.commonWordSuffix('abc de,abc de,abc de,abc de'.split(',')); - assertEquals('Full equality', 6, len); - len = Blockly.commonWordSuffix('Xabc de,Yabc de'.split(',')); - assertEquals('One word prefix', 3, len); - len = Blockly.commonWordSuffix('abc de,Yabc de'.split(',')); - assertEquals('Overflow no', 3, len); - len = Blockly.commonWordSuffix('abc de,Y abc de'.split(',')); - assertEquals('Overflow yes', 6, len); - len = Blockly.commonWordSuffix(['Hello World']); - assertEquals('List of one', 11, len); - len = Blockly.commonWordSuffix([]); - assertEquals('Empty list', 0, len); -} - -function test_tokenizeInterpolation() { - var tokens = Blockly.tokenizeInterpolation(''); - assertArrayEquals('Null interpolation', [], tokens); - tokens = Blockly.tokenizeInterpolation('Hello'); - assertArrayEquals('No interpolation', ['Hello'], tokens); - tokens = Blockly.tokenizeInterpolation('Hello%World'); - assertArrayEquals('Unescaped %.', ['Hello%World'], tokens); - tokens = Blockly.tokenizeInterpolation('Hello%%World'); - assertArrayEquals('Escaped %.', ['Hello%World'], tokens); - tokens = Blockly.tokenizeInterpolation('Hello %1 World'); - assertArrayEquals('Interpolation.', ['Hello ', 1, ' World'], tokens); - tokens = Blockly.tokenizeInterpolation('%123Hello%456World%789'); - assertArrayEquals('Interpolations.', [123, 'Hello', 456, 'World', 789], tokens); - tokens = Blockly.tokenizeInterpolation('%%%x%%0%00%01%'); - assertArrayEquals('Torture interpolations.', ['%%x%0', 0, 1, '%'], tokens); -} diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/generator_test.js b/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/generator_test.js deleted file mode 100644 index 069f1c5..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/generator_test.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -'use strict'; - -function test_prefix() { - var generator = new Blockly.Generator('INTERCAL'); - assertEquals('Prefix nothing.', '', generator.prefixLines('', '')); - assertEquals('Prefix a word.', '@Hello', generator.prefixLines('Hello', '@')); - assertEquals('Prefix one line.', '12Hello\n', generator.prefixLines('Hello\n', '12')); - assertEquals('Prefix two lines.', '***Hello\n***World\n', generator.prefixLines('Hello\nWorld\n', '***')); -} diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/index.html b/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/index.html deleted file mode 100644 index 09cd4ff..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Unit Tests for Blockly - - - - - - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/names_test.js b/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/names_test.js deleted file mode 100644 index 8a4b008..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/names_test.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -'use strict'; - -function test_safeName() { - var varDB = new Blockly.Names('window,door'); - assertEquals('SafeName empty.', 'unnamed', varDB.safeName_('')); - assertEquals('SafeName ok.', 'foobar', varDB.safeName_('foobar')); - assertEquals('SafeName number start.', 'my_9lives', - varDB.safeName_('9lives')); - assertEquals('SafeName number end.', 'lives9', varDB.safeName_('lives9')); - assertEquals('SafeName special chars.', '____', varDB.safeName_('!@#$')); - assertEquals('SafeName reserved.', 'door', varDB.safeName_('door')); -} - -function test_getName() { - var varDB = new Blockly.Names('window,door'); - assertEquals('Name add #1.', 'Foo_bar', varDB.getName('Foo.bar', 'var')); - assertEquals('Name get #1.', 'Foo_bar', varDB.getName('Foo.bar', 'var')); - assertEquals('Name add #2.', 'Foo_bar2', varDB.getName('Foo bar', 'var')); - assertEquals('Name get #2.', 'Foo_bar2', varDB.getName('foo BAR', 'var')); - assertEquals('Name add #3.', 'door2', varDB.getName('door', 'var')); - assertEquals('Name add #4.', 'Foo_bar3', varDB.getName('Foo.bar', 'proc')); - assertEquals('Name get #1b.', 'Foo_bar', varDB.getName('Foo.bar', 'var')); - assertEquals('Name get #4.', 'Foo_bar3', varDB.getName('Foo.bar', 'proc')); -} - -function test_getDistinctName() { - var varDB = new Blockly.Names('window,door'); - assertEquals('Name distinct #1.', 'Foo_bar', - varDB.getDistinctName('Foo.bar', 'var')); - assertEquals('Name distinct #2.', 'Foo_bar2', - varDB.getDistinctName('Foo.bar', 'var')); - assertEquals('Name distinct #3.', 'Foo_bar3', - varDB.getDistinctName('Foo.bar', 'proc')); - varDB.reset(); - assertEquals('Name distinct #4.', 'Foo_bar', - varDB.getDistinctName('Foo.bar', 'var')); -} - -function test_nameEquals() { - assertTrue('Name equals #1.', Blockly.Names.equals('Foo.bar', 'Foo.bar')); - assertFalse('Name equals #2.', Blockly.Names.equals('Foo.bar', 'Foo_bar')); - assertTrue('Name equals #3.', Blockly.Names.equals('Foo.bar', 'FOO.BAR')); -} diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/workspace_test.js b/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/workspace_test.js deleted file mode 100644 index e8e271b..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/workspace_test.js +++ /dev/null @@ -1,82 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -'use strict'; - -function test_emptyWorkspace() { - var workspace = new Blockly.Workspace(); - assertEquals('Empty workspace (1).', 0, workspace.getTopBlocks(true).length); - assertEquals('Empty workspace (2).', 0, workspace.getTopBlocks(false).length); - assertEquals('Empty workspace (3).', 0, workspace.getAllBlocks().length); - workspace.clear(); - assertEquals('Empty workspace (4).', 0, workspace.getTopBlocks(true).length); - assertEquals('Empty workspace (5).', 0, workspace.getTopBlocks(false).length); - assertEquals('Empty workspace (6).', 0, workspace.getAllBlocks().length); -} - -function test_flatWorkspace() { - var workspace = new Blockly.Workspace(); - var blockA = Blockly.Block.obtain(workspace, ''); - assertEquals('One block workspace (1).', 1, workspace.getTopBlocks(true).length); - assertEquals('One block workspace (2).', 1, workspace.getTopBlocks(false).length); - assertEquals('One block workspace (3).', 1, workspace.getAllBlocks().length); - var blockB = Blockly.Block.obtain(workspace, ''); - assertEquals('Two block workspace (1).', 2, workspace.getTopBlocks(true).length); - assertEquals('Two block workspace (2).', 2, workspace.getTopBlocks(false).length); - assertEquals('Two block workspace (3).', 2, workspace.getAllBlocks().length); - blockA.dispose(); - assertEquals('One block workspace (4).', 1, workspace.getTopBlocks(true).length); - assertEquals('One block workspace (5).', 1, workspace.getTopBlocks(false).length); - assertEquals('One block workspace (6).', 1, workspace.getAllBlocks().length); - workspace.clear(); - assertEquals('Cleared workspace (1).', 0, workspace.getTopBlocks(true).length); - assertEquals('Cleared workspace (2).', 0, workspace.getTopBlocks(false).length); - assertEquals('Cleared workspace (3).', 0, workspace.getAllBlocks().length); -} - -function test_maxBlocksWorkspace() { - var workspace = new Blockly.Workspace(); - var blockA = Blockly.Block.obtain(workspace, ''); - var blockB = Blockly.Block.obtain(workspace, ''); - assertEquals('Infinite capacity.', Infinity, workspace.remainingCapacity()); - workspace.options.maxBlocks = 3; - assertEquals('Three capacity.', 1, workspace.remainingCapacity()); - workspace.options.maxBlocks = 2; - assertEquals('Two capacity.', 0, workspace.remainingCapacity()); - workspace.options.maxBlocks = 1; - assertEquals('One capacity.', -1, workspace.remainingCapacity()); - workspace.options.maxBlocks = 0; - assertEquals('Zero capacity.', -2, workspace.remainingCapacity()); - workspace.clear(); - assertEquals('Cleared capacity.', 0, workspace.remainingCapacity()); -} - -function test_getByIdWorkspace() { - var workspace = new Blockly.Workspace(); - var blockA = Blockly.Block.obtain(workspace, ''); - var blockB = Blockly.Block.obtain(workspace, ''); - assertEquals('Find blockA.', blockA, workspace.getBlockById(blockA.id)); - assertEquals('Find blockB.', blockB, workspace.getBlockById(blockB.id)); - assertEquals('No block found.', null, workspace.getBlockById('I do not exist.')); - blockA.dispose(); - assertEquals('Can\'t find blockA.', null, workspace.getBlockById(blockA.id)); - assertEquals('BlockB exists.', blockB, workspace.getBlockById(blockB.id)); - workspace.clear(); - assertEquals('Can\'t find blockB.', null, workspace.getBlockById(blockB.id)); -} diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/xml_test.js b/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/xml_test.js deleted file mode 100644 index 7487b6f..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/jsunit/xml_test.js +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2014 Google Inc. - * https://developers.google.com/blockly/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -'use strict'; - -var XML_TEXT = ['', - ' ', - ' ', - ' ', - ' 10', - ' ', - ' ', - ' ', - ' ', - ' item', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' Hello', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ''].join('\n'); - -function test_textToDom() { - var dom = Blockly.Xml.textToDom(XML_TEXT); - assertEquals('XML tag', 'xml', dom.nodeName); - assertEquals('Block tags', 6, dom.getElementsByTagName('block').length); -} - -function test_domToText() { - var dom = Blockly.Xml.textToDom(XML_TEXT); - var text = Blockly.Xml.domToText(dom); - assertEquals('Round trip', XML_TEXT.replace(/\s+/g, ''), - text.replace(/\s+/g, '')); -} - -function test_domToPrettyText() { - var dom = Blockly.Xml.textToDom(XML_TEXT); - var text = Blockly.Xml.domToPrettyText(dom); - assertEquals('Round trip', XML_TEXT.replace(/\s+/g, ''), - text.replace(/\s+/g, '')); -} diff --git a/src/opsoro/apps/visual_programming/static/blockly/tests/playground.html b/src/opsoro/apps/visual_programming/static/blockly/tests/playground.html deleted file mode 100644 index 278db90..0000000 --- a/src/opsoro/apps/visual_programming/static/blockly/tests/playground.html +++ /dev/null @@ -1,587 +0,0 @@ - - - - -Blockly Playground - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - -
      - - - -

      Blockly Playground

      - -

      Show - - Hide

      - - - -

      - -   - -
      - -   - -   - -   - -
      - -

      -
      - -

      - Stress test: - - -

      - - - - - - diff --git a/src/opsoro/apps/visual_programming/static/custom_blocks/expression.js b/src/opsoro/apps/visual_programming/static/custom_blocks/expression.js deleted file mode 100644 index d4922e1..0000000 --- a/src/opsoro/apps/visual_programming/static/custom_blocks/expression.js +++ /dev/null @@ -1,97 +0,0 @@ -Blockly.Lua.addReservedWords("Expression"); - -Blockly.Blocks['expression_update'] = { - init: function() { - this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-smile-o.png", 16, 18, "")) - .appendField("Update expression"); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setColour(105); - this.setTooltip('Calculate and update servo motor positions based on the current expression.'); - } -}; -Blockly.Lua['expression_update'] = function(block) { - var code = "Expression:update()\n"; - return code; -}; - -Blockly.Blocks['expression_setekman'] = { - init: function() { - this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-smile-o.png", 16, 18, "")) - .appendField("set emotion to") - .appendField(new Blockly.FieldDropdown([["neutral", "NEUTRAL"], ["happy", "HAPPY"], ["sad", "SAD"], ["angry", "ANGRY"], ["surprise", "SURPRISE"], ["fear", "FEAR"], ["disgust", "DISGUST"]]), "EMOTION"); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setColour(105); - this.setTooltip('Set the current facial expression using Ekman\'s basic emotions'); - } -}; -Blockly.Lua['expression_setekman'] = function(block) { - var dropdown_emotion = block.getFieldValue('EMOTION'); - var va_map = { - HAPPY: {phi: 18 * Math.PI/180.0, r: 1.0}, - SAD: {phi: 200 * Math.PI/180.0, r: 1.0}, - ANGRY: {phi: 153 * Math.PI/180.0, r: 1.0}, - SURPRISE: {phi: 90 * Math.PI/180.0, r: 1.0}, - FEAR: {phi: 125 * Math.PI/180.0, r: 1.0}, - DISGUST: {phi: 172 * Math.PI/180.0, r: 1.0}, - NEUTRAL: {phi: 0, r: 0.0} - }; - var code = 'Expression:set_emotion_r_phi(' + va_map[dropdown_emotion].r.toFixed(1) + ', ' + va_map[dropdown_emotion].phi.toFixed(2) +')\n'; - return code; -}; - -Blockly.Blocks['expression_setva'] = { - init: function() { - this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-smile-o.png", 16, 18, "")) - .appendField("Set emotion to"); - this.appendValueInput("VALENCE") - .setCheck("Number") - .setAlign(Blockly.ALIGN_RIGHT) - .appendField("Valence"); - this.appendValueInput("AROUSAL") - .setCheck("Number") - .setAlign(Blockly.ALIGN_RIGHT) - .appendField("Arousal"); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setColour(105); - this.setTooltip('Set the current facial expression using Valence and Arousal. Parameters range from -1.0 to +1.0.'); - } -}; -Blockly.Lua['expression_setva'] = function(block) { - var value_valence = Blockly.Lua.valueToCode(block, 'VALENCE', Blockly.Lua.ORDER_ATOMIC); - var value_arousal = Blockly.Lua.valueToCode(block, 'AROUSAL', Blockly.Lua.ORDER_ATOMIC); - - var code = 'Expression:set_emotion_val_ar(' + value_valence + ', ' + value_arousal +')\n'; - return code; -}; - -Blockly.Blocks['expression_setrphi'] = { - init: function() { - this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-smile-o.png", 16, 18, "")) - .appendField("Set emotion to"); - this.appendValueInput("R") - .setCheck("Number") - .setAlign(Blockly.ALIGN_RIGHT) - .appendField("R"); - this.appendValueInput("PHI") - .setCheck("Number") - .setAlign(Blockly.ALIGN_RIGHT) - .appendField("Phi"); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setColour(105); - this.setTooltip('Set the current facial expression using Phi and R. Phi is a value in degrees, R ranges from 0.0 to 1.0.'); - } -}; -Blockly.Lua['expression_setrphi'] = function(block) { - var value_phi = Blockly.Lua.valueToCode(block, 'PHI', Blockly.Lua.ORDER_ATOMIC); - var value_r = Blockly.Lua.valueToCode(block, 'R', Blockly.Lua.ORDER_ATOMIC); - var code = 'Expression:set_emotion_r_phi(' + value_phi + ', ' + value_r +', true)\n'; - return code; -}; diff --git a/src/opsoro/apps/visual_programming/static/custom_blocks/servo.js b/src/opsoro/apps/visual_programming/static/custom_blocks/servo.js deleted file mode 100644 index 38c8100..0000000 --- a/src/opsoro/apps/visual_programming/static/custom_blocks/servo.js +++ /dev/null @@ -1,67 +0,0 @@ -Blockly.Blocks['servo_init'] = { - init: function() { - this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-gears.png", 16, 18, "")) - .appendField("Initialize servos"); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setColour(345); - this.setTooltip('Initialize the servo control chip.\nThis must be done before servos can be used.'); - } -}; -Blockly.Lua['servo_init'] = function(block) { - var code = 'Hardware:servo_init()\n'; - return code; -}; - -Blockly.Blocks['servo_enabledisable'] = { - init: function() { - this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-gears.png", 16, 18, "")) - .appendField("Turn all servos") - .appendField(new Blockly.FieldDropdown([["on", "ON"], ["off", "OFF"]]), "ONOFF"); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setColour(345); - this.setTooltip('Enables or disables all servos.'); - } -}; -Blockly.Lua['servo_enabledisable'] = function(block) { - var dropdown_onoff = block.getFieldValue('ONOFF'); - var code = ''; - if(dropdown_onoff == "ON"){ - code = "Hardware:servo_enable()\n" - }else{ - code = "Hardware:servo_disable()\n" - } - return code; -}; - -Blockly.Blocks['servo_set'] = { - init: function() { - this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-gears.png", 16, 18, "")) - .appendField("Set servo ") - .appendField(new Blockly.FieldDropdown( - [ - ["0", "0"], ["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"], ["5", "5"], - ["6", "6"], ["7", "7"], ["8", "8"], ["9", "9"], ["10", "10"], ["11", "11"], - ["12", "12"], ["13", "13"], ["14", "14"], ["15", "15"] - ]), - "CHANNEL"); - this.appendValueInput("POS") - .setCheck("Number") - .appendField("to position"); - this.setInputsInline(true); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setColour(345); - this.setTooltip('Sets the position of one servo. Position should be between 500 and 2500.'); - } -}; -Blockly.Lua['servo_set'] = function(block) { - var dropdown_channel = block.getFieldValue('CHANNEL'); - var value_pos = Blockly.Lua.valueToCode(block, 'POS', Blockly.Lua.ORDER_ATOMIC); - var code = 'Hardware:servo_set(' + dropdown_channel + ', ' + value_pos + ')\n'; - return code; -}; diff --git a/src/opsoro/apps/visual_programming/static/custom_blocks/touch.js b/src/opsoro/apps/visual_programming/static/custom_blocks/touch.js deleted file mode 100644 index baa0cc6..0000000 --- a/src/opsoro/apps/visual_programming/static/custom_blocks/touch.js +++ /dev/null @@ -1,62 +0,0 @@ -Blockly.Blocks['touch_init'] = { - init: function() { - this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-hand-o-up.png", 16, 18, "")) - .appendField("Initialize with") - .appendField(new Blockly.FieldDropdown([["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"], ["5", "5"], ["6", "6"], ["7", "7"], ["8", "8"], ["9", "9"], ["10", "10"], ["11", "11"], ["12", "12"]]), "ELECTRODE") - .appendField("electrodes"); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setColour(210); - this.setTooltip('Initialize the capacitive touch sensor with a specified number of electrodes.'); - } -}; -Blockly.Lua['touch_init'] = function(block) { - var dropdown_electrode = block.getFieldValue('ELECTRODE'); - var code = 'Hardware:cap_init(' + dropdown_electrode + ')\n'; - return code; -}; - -Blockly.Blocks['touch_etouched'] = { - init: function() { - this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-hand-o-up.png", 16, 18, "")) - .appendField("When electrode") - .appendField(new Blockly.FieldDropdown([["E0", "0"], ["E1", "1"], ["E2", "2"], ["E3", "3"], ["E4", "4"], ["E5", "5"], ["E6", "6"], ["E7", "7"], ["E8", "8"], ["E9", "9"], ["E10", "10"], ["E11", "11"]]), "ELECTRODE") - .appendField("is") - this.appendStatementInput("BODY_TOU") - .appendField("Touched"); - this.appendStatementInput("BODY_REL") - .appendField("Released"); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setColour(210); - this.setTooltip('Execute a block of code when an electrode is touched or released.'); - } -}; -Blockly.Lua['touch_etouched'] = function(block) { - var dropdown_electrode = block.getFieldValue('ELECTRODE'); - var statements_body_tou = Blockly.Lua.statementToCode(block, 'BODY_TOU'); - var statements_body_rel = Blockly.Lua.statementToCode(block, 'BODY_REL'); - - var touch_var = Blockly.Lua.variableDB_.getDistinctName('e' + dropdown_electrode + '_touch', Blockly.Variables.NAME_TYPE); - - var code = 'local ' + touch_var + ' = Hardware:cap_get_touched()\n'; - code += touch_var + ' = bit.band(' + touch_var + ', 2^' + dropdown_electrode + ') > 0\n'; - - if(statements_body_tou == '' && statements_body_rel == ''){ - return ''; - } - if(statements_body_tou != ''){ - code += 'if rising_edge("' + touch_var + '", ' + touch_var + ') then\n'; - code += statements_body_tou; - code += 'end\n'; - } - if(statements_body_rel != ''){ - code += 'if falling_edge("' + touch_var + '", ' + touch_var + ') then\n'; - code += statements_body_rel; - code += 'end\n'; - } - - return code; -}; diff --git a/src/opsoro/apps/visual_programming/templates/blockly.html b/src/opsoro/apps/visual_programming/templates/blockly.html deleted file mode 100644 index a4f5414..0000000 --- a/src/opsoro/apps/visual_programming/templates/blockly.html +++ /dev/null @@ -1,328 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/opsoro/apps/visual_programming/templates/visual_programming.html b/src/opsoro/apps/visual_programming/templates/visual_programming.html deleted file mode 100644 index 84416d5..0000000 --- a/src/opsoro/apps/visual_programming/templates/visual_programming.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "app_base.html" %} - -{% block head %} - -{% endblock %} - -{% block app_toolbar %} - {% include "toolbar/_file_operations.html" %} - {% include "toolbar/_script_operations.html" %} - {% include "toolbar/_expand_collapse.html" %} -{% endblock %} - -{% block app_content %} - -
      -
      
      -	
      -
      - -
      -
      - -{% endblock %} - -{% block app_scripts %} - - - - - - - - - -{% endblock %} - -{% block app_modals %} - -
      -
      - - - - - Script UI -
      -
      -
      -

      - The script has not created any UI elements yet! -
      -
        -
        -
        -
        -
        - -{% endblock %} diff --git a/src/opsoro/config/apps_layout.yaml b/src/opsoro/config/apps_layout.yaml new file mode 100644 index 0000000..eb6dae3 --- /dev/null +++ b/src/opsoro/config/apps_layout.yaml @@ -0,0 +1,24 @@ +--- +# Always use '#. ' before the actual title, for sorting purposes +- title: 1. Getting started + apps: + - robot_configurator + - expression_configurator + - preferences + - circumplex + +- title: 2. Ready-to-use apps + apps: + - circumplex + - sliders + - social_script + - sounds + - touch_graph + - blockly + - lua_scripting + +- title: 3. Community apps + apps: + - social_response + - app_template + - cockpit diff --git a/src/opsoro/config/default.conf b/src/opsoro/config/default.conf index 2befe01..907050c 100644 --- a/src/opsoro/config/default.conf +++ b/src/opsoro/config/default.conf @@ -1,5 +1,5 @@ { - "name": "Ono robot", + "name": "OPSORO robot", "skin": "ono", "grid": "18", "modules": [ @@ -7,83 +7,52 @@ "module": "eyebrow", "name": "eyebrow_left", "canvas": { - "x": 0.2007176817525277, - "y": -0.6989197159364468, - "width": 0.19997291766971595, - "height": 0.02888781896966779, + "x": 0.2007168458781363, + "y": -0.6989247311827956, + "width": 0.22470495672698665, + "height": 0.185051140833989, "rotation": 0 }, "dofs": [ { - "name": "left_vertical", - "servo": { - "pin": 15, - "mid": 1550, - "min": 200, - "max": -250 - }, - "mapping": { - "neutral": 0.0, - "poly": [ - 0.0, - 0.0, - 0.0, - 0.0, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - -0.25, - -0.50, - -0.25, - -0.25, - -0.25, - -0.25, - 0.0, - 0.25, - 0.25 - ] - } + "name": "left_vertical" + }, + { + "name": "right_vertical" }, { - "name": "right_vertical", + "name": "rotation", "servo": { - "pin": 14, - "mid": 1525, - "min": -200, - "max": 300 + "pin": "11", + "mid": "1550", + "min": "300", + "max": "-300" }, "mapping": { - "neutral": 0.0, + "neutral": "0", "poly": [ - 0.25, - 0.50, - 0.70, - 0.70, - 0.70, - 0.70, - 0.50, - 0.25, - -0.50, - -0.50, - -0.25, - 0.25, - 0.25, - -0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.50 + 0.3, + 0.5, + 0.7, + 0.5, + 0.15, + -0.15, + -0.45, + -0.7, + -1, + -0.65, + -0.35, + 0, + 0.25, + 0.5, + 0.5, + 0.45, + 0.75, + 1, + 0.7, + 0.25 ] } - }, - { - "name": "rotation" } ] }, @@ -91,62 +60,112 @@ "module": "eye", "name": "eye_left", "canvas": { - "x": 0.20071684587813632, - "y": -0.49820788530465954, - "width": 0.2, - "height": 0.2, + "x": 0.2007168458781363, + "y": -0.4982078853046595, + "width": 0.23792289535798586, + "height": 0.23792289535798586, "rotation": 0 }, "dofs": [ { "name": "pupil_horizontal", "servo": { - "pin": 13, - "mid": 1550, - "min": -350, - "max": 350 + "pin": "15", + "mid": "1600", + "min": "250", + "max": "-250" + }, + "mapping": { + "neutral": 0, + "poly": [ + 0, + 0, + 0, + 0, + 0, + 0.6, + 0.4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.35, + -0.25, + 0, + 0 + ] } }, { "name": "pupil_vertical", "servo": { - "pin": 12, - "mid": 1525, - "min": -350, - "max": 350 + "pin": "14", + "mid": "1500", + "min": "-250", + "max": "250" + }, + "mapping": { + "neutral": 0, + "poly": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.3, + -0.5, + -0.7, + -0.5, + -0.4, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] } }, { "name": "eyelid_closure", "servo": { - "pin": 11, - "mid": 1525, - "min": -300, - "max": 350 + "pin": "13", + "mid": "1630", + "min": "-200", + "max": "200" }, "mapping": { - "neutral": 0.5, + "neutral": "0.7", "poly": [ - 0.50, - 0.50, - 0.50, - 0.50, - 0.50, - 0.80, - 0.80, - 0.80, - 0.50, - 0.50, - 0.50, - 0.40, - 0.40, - 0.40, - 0.25, - 0.25, - 0.50, - 0.50, - 0.50, - 0.50 + 0.7, + 1, + 1, + 0.65, + 0.25, + 0, + 0.05, + -0.05, + 0, + -0.05, + -0.15, + -0.35, + -0.65, + -1, + -0.45, + -0.15, + 0.15, + 0.4, + 0.5, + 0.5 ] } } @@ -157,119 +176,88 @@ "name": "mouth", "canvas": { "x": 0, - "y": -0.19712927298988928, - "width": 0.19998796340876263, - "height": 0.17332691381800674, + "y": -0.1971326164874551, + "width": 0.42738001573564127, + "height": 0.20708103855232102, "rotation": 0 }, "dofs": [ { - "name": "left_vertical", + "name": "left_vertical" + }, + { + "name": "middle_vertical" + }, + { + "name": "right_vertical" + }, + { + "name": "left_rotation", "servo": { - "pin": 5, - "mid": 1550, - "min": 400, - "max": -300 + "pin": "10", + "mid": "1550", + "min": "-250", + "max": "250" }, "mapping": { - "neutral": 0.2, + "neutral": "0", "poly": [ - 0.50, - 0.70, - 0.70, - 0.40, - 0.0, - 0.0, - -0.50, - -0.50, - -0.50, - -0.50, - -0.50, - -1.0, - -1.0, + 0.5, + 0.75, + 1, + 0.6, + 0.1, + -0.3, + -0.55, + 0.5, + -0.5, + -0.4, -0.25, + -0.15, + -0.15, -0.25, + -0.55, + -0.1, + 0.15, 0.25, - 0.25, - 0.50, - 0.50, - 0.50 + 0.2, + 0.35 ] } }, { - "name": "middle_vertical", + "name": "right_rotation", "servo": { - "pin": 6, - "mid": 1525, - "min": 400, - "max": -250 + "pin": "5", + "mid": "1550", + "min": "250", + "max": "-250" }, "mapping": { - "neutral": 0.5, + "neutral": "0", "poly": [ - 1.0, - 0.50, - -1.0, - -1.0, - -0.50, - -1.0, - -0.80, - -0.80, - -0.80, - 0.50, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0 - ] - } - }, - { - "name": "right_vertical", - "servo": { - "pin": 7, - "mid": 1600, - "min": -400, - "max": 300 - }, - "mapping": { - "neutral": 0.2, - "poly": [ - 0.50, - 0.70, - 0.70, - 0.40, - 0.0, - 0.0, - -0.50, - -0.50, - -0.50, - -0.50, - -0.50, - -1.0, - -1.0, + 0.5, + 0.75, + 1, + 0.6, + 0.1, + -0.3, + -0.7, + -1, + -0.75, + -0.4, -0.25, + -0.15, + -0.15, -0.25, + -0.1, + -0.1, + 0.15, 0.25, - 0.25, - 0.50, - 0.50, - 0.50 + 0.2, + 0.35 ] } - }, - { - "name": "left_rotation" - }, - { - "name": "right_rotation" } ] }, @@ -277,62 +265,112 @@ "module": "eye", "name": "eye_right", "canvas": { - "x": -0.2007168458781361, - "y": -0.49820788530465954, - "width": 0.2, - "height": 0.2, + "x": -0.20071684587813615, + "y": -0.4982078853046595, + "width": 0.23792289535798586, + "height": 0.23792289535798586, "rotation": 0 }, "dofs": [ { "name": "pupil_horizontal", "servo": { - "pin": 3, - "mid": 1700, - "min": -350, - "max": 350 + "pin": 0, + "mid": "1600", + "min": "250", + "max": "-250" + }, + "mapping": { + "neutral": 0, + "poly": [ + 0, + 0, + 0, + 0, + 0, + -0.6, + -0.4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.35, + 0.25, + 0, + 0 + ] } }, { "name": "pupil_vertical", "servo": { - "pin": 2, - "mid": 1525, - "min": 350, - "max": -350 + "pin": "1", + "mid": "1500", + "min": "-350", + "max": "350" + }, + "mapping": { + "neutral": 0, + "poly": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.3, + -0.5, + -0.7, + -0.5, + -0.4, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] } }, { "name": "eyelid_closure", "servo": { - "pin": 4, - "mid": 1500, - "min": 300, - "max": -350 + "pin": "2", + "mid": "1630", + "min": "-200", + "max": "200" }, "mapping": { - "neutral": 0.5, + "neutral": "0.7", "poly": [ - 0.50, - 0.50, - 0.50, - 0.50, - 0.50, - 0.80, - 0.80, - 0.80, - 0.50, - 0.50, - 0.50, - 0.40, - 0.40, - 0.40, - 0.25, - 0.25, - 0.50, - 0.50, - 0.50, - 0.50 + 0.7, + 1, + 1, + 0.65, + 0.25, + 0, + 0.05, + -0.05, + 0, + -0.05, + -0.15, + -0.35, + -0.65, + -1, + -0.45, + -0.15, + 0.15, + 0.4, + 0.5, + 0.5 ] } } @@ -342,83 +380,52 @@ "module": "eyebrow", "name": "eyebrow_right", "canvas": { - "x": -0.20071015888300434, - "y": -0.6989197159364468, - "width": 0.19998796340876263, - "height": 0.02888781896966779, + "x": -0.20071684587813615, + "y": -0.6989247311827956, + "width": 0.22470495672698665, + "height": 0.185051140833989, "rotation": 0 }, "dofs": [ { - "name": "left_vertical", - "servo": { - "pin": 0, - "mid": 1625, - "min": 200, - "max": -300 - }, - "mapping": { - "neutral": 0, - "poly": [ - 0.25, - 0.50, - 0.70, - 0.70, - 0.70, - 0.70, - 0.50, - 0.25, - -0.50, - -0.50, - -0.25, - 0.25, - 0.25, - -0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.50 - ] - } + "name": "left_vertical" }, { - "name": "right_vertical", + "name": "right_vertical" + }, + { + "name": "rotation", "servo": { - "pin": 1, - "mid": 1625, - "min": -200, - "max": 250 + "pin": "4", + "mid": "1550", + "min": "300", + "max": "-300" }, "mapping": { - "neutral": 0, + "neutral": "0", "poly": [ - 0.0, - 0.0, - 0.0, - 0.0, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - -0.25, - -0.50, + -0.3, + -0.5, + -0.7, + -0.5, + -0.15, + 0.15, + 0.45, + 0.7, + 1, + 0.65, + 0.35, + 0, -0.25, - -0.25, - -0.25, - -0.25, - 0.0, - 0.25, - 0.25 + -0.5, + -0.5, + -0.45, + -0.75, + -1, + -0.7, + -0.25 ] } - }, - { - "name": "rotation" } ] } diff --git a/src/opsoro/config/default_grid.conf b/src/opsoro/config/default_grid.conf index 907050c..60ef229 100644 --- a/src/opsoro/config/default_grid.conf +++ b/src/opsoro/config/default_grid.conf @@ -71,9 +71,9 @@ "name": "pupil_horizontal", "servo": { "pin": "15", - "mid": "1600", - "min": "250", - "max": "-250" + "mid": "1470", + "min": "300", + "max": "-300" }, "mapping": { "neutral": 0, @@ -105,9 +105,9 @@ "name": "pupil_vertical", "servo": { "pin": "14", - "mid": "1500", - "min": "-250", - "max": "250" + "mid": "1470", + "min": "-300", + "max": "300" }, "mapping": { "neutral": 0, @@ -139,9 +139,9 @@ "name": "eyelid_closure", "servo": { "pin": "13", - "mid": "1630", - "min": "-200", - "max": "200" + "mid": "1300", + "min": "-400", + "max": "450" }, "mapping": { "neutral": "0.7", @@ -276,9 +276,9 @@ "name": "pupil_horizontal", "servo": { "pin": 0, - "mid": "1600", - "min": "250", - "max": "-250" + "mid": "1470", + "min": "300", + "max": "-300" }, "mapping": { "neutral": 0, @@ -310,9 +310,9 @@ "name": "pupil_vertical", "servo": { "pin": "1", - "mid": "1500", - "min": "-350", - "max": "350" + "mid": "1470", + "min": "-300", + "max": "300" }, "mapping": { "neutral": 0, @@ -344,9 +344,9 @@ "name": "eyelid_closure", "servo": { "pin": "2", - "mid": "1630", - "min": "-200", - "max": "200" + "mid": "1300", + "min": "-400", + "max": "450" }, "mapping": { "neutral": "0.7", diff --git a/src/opsoro/config/default_ono.conf b/src/opsoro/config/default_ono.conf new file mode 100644 index 0000000..2befe01 --- /dev/null +++ b/src/opsoro/config/default_ono.conf @@ -0,0 +1,426 @@ +{ + "name": "Ono robot", + "skin": "ono", + "grid": "18", + "modules": [ + { + "module": "eyebrow", + "name": "eyebrow_left", + "canvas": { + "x": 0.2007176817525277, + "y": -0.6989197159364468, + "width": 0.19997291766971595, + "height": 0.02888781896966779, + "rotation": 0 + }, + "dofs": [ + { + "name": "left_vertical", + "servo": { + "pin": 15, + "mid": 1550, + "min": 200, + "max": -250 + }, + "mapping": { + "neutral": 0.0, + "poly": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + -0.25, + -0.50, + -0.25, + -0.25, + -0.25, + -0.25, + 0.0, + 0.25, + 0.25 + ] + } + }, + { + "name": "right_vertical", + "servo": { + "pin": 14, + "mid": 1525, + "min": -200, + "max": 300 + }, + "mapping": { + "neutral": 0.0, + "poly": [ + 0.25, + 0.50, + 0.70, + 0.70, + 0.70, + 0.70, + 0.50, + 0.25, + -0.50, + -0.50, + -0.25, + 0.25, + 0.25, + -0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.50 + ] + } + }, + { + "name": "rotation" + } + ] + }, + { + "module": "eye", + "name": "eye_left", + "canvas": { + "x": 0.20071684587813632, + "y": -0.49820788530465954, + "width": 0.2, + "height": 0.2, + "rotation": 0 + }, + "dofs": [ + { + "name": "pupil_horizontal", + "servo": { + "pin": 13, + "mid": 1550, + "min": -350, + "max": 350 + } + }, + { + "name": "pupil_vertical", + "servo": { + "pin": 12, + "mid": 1525, + "min": -350, + "max": 350 + } + }, + { + "name": "eyelid_closure", + "servo": { + "pin": 11, + "mid": 1525, + "min": -300, + "max": 350 + }, + "mapping": { + "neutral": 0.5, + "poly": [ + 0.50, + 0.50, + 0.50, + 0.50, + 0.50, + 0.80, + 0.80, + 0.80, + 0.50, + 0.50, + 0.50, + 0.40, + 0.40, + 0.40, + 0.25, + 0.25, + 0.50, + 0.50, + 0.50, + 0.50 + ] + } + } + ] + }, + { + "module": "mouth", + "name": "mouth", + "canvas": { + "x": 0, + "y": -0.19712927298988928, + "width": 0.19998796340876263, + "height": 0.17332691381800674, + "rotation": 0 + }, + "dofs": [ + { + "name": "left_vertical", + "servo": { + "pin": 5, + "mid": 1550, + "min": 400, + "max": -300 + }, + "mapping": { + "neutral": 0.2, + "poly": [ + 0.50, + 0.70, + 0.70, + 0.40, + 0.0, + 0.0, + -0.50, + -0.50, + -0.50, + -0.50, + -0.50, + -1.0, + -1.0, + -0.25, + -0.25, + 0.25, + 0.25, + 0.50, + 0.50, + 0.50 + ] + } + }, + { + "name": "middle_vertical", + "servo": { + "pin": 6, + "mid": 1525, + "min": 400, + "max": -250 + }, + "mapping": { + "neutral": 0.5, + "poly": [ + 1.0, + 0.50, + -1.0, + -1.0, + -0.50, + -1.0, + -0.80, + -0.80, + -0.80, + 0.50, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + }, + { + "name": "right_vertical", + "servo": { + "pin": 7, + "mid": 1600, + "min": -400, + "max": 300 + }, + "mapping": { + "neutral": 0.2, + "poly": [ + 0.50, + 0.70, + 0.70, + 0.40, + 0.0, + 0.0, + -0.50, + -0.50, + -0.50, + -0.50, + -0.50, + -1.0, + -1.0, + -0.25, + -0.25, + 0.25, + 0.25, + 0.50, + 0.50, + 0.50 + ] + } + }, + { + "name": "left_rotation" + }, + { + "name": "right_rotation" + } + ] + }, + { + "module": "eye", + "name": "eye_right", + "canvas": { + "x": -0.2007168458781361, + "y": -0.49820788530465954, + "width": 0.2, + "height": 0.2, + "rotation": 0 + }, + "dofs": [ + { + "name": "pupil_horizontal", + "servo": { + "pin": 3, + "mid": 1700, + "min": -350, + "max": 350 + } + }, + { + "name": "pupil_vertical", + "servo": { + "pin": 2, + "mid": 1525, + "min": 350, + "max": -350 + } + }, + { + "name": "eyelid_closure", + "servo": { + "pin": 4, + "mid": 1500, + "min": 300, + "max": -350 + }, + "mapping": { + "neutral": 0.5, + "poly": [ + 0.50, + 0.50, + 0.50, + 0.50, + 0.50, + 0.80, + 0.80, + 0.80, + 0.50, + 0.50, + 0.50, + 0.40, + 0.40, + 0.40, + 0.25, + 0.25, + 0.50, + 0.50, + 0.50, + 0.50 + ] + } + } + ] + }, + { + "module": "eyebrow", + "name": "eyebrow_right", + "canvas": { + "x": -0.20071015888300434, + "y": -0.6989197159364468, + "width": 0.19998796340876263, + "height": 0.02888781896966779, + "rotation": 0 + }, + "dofs": [ + { + "name": "left_vertical", + "servo": { + "pin": 0, + "mid": 1625, + "min": 200, + "max": -300 + }, + "mapping": { + "neutral": 0, + "poly": [ + 0.25, + 0.50, + 0.70, + 0.70, + 0.70, + 0.70, + 0.50, + 0.25, + -0.50, + -0.50, + -0.25, + 0.25, + 0.25, + -0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.50 + ] + } + }, + { + "name": "right_vertical", + "servo": { + "pin": 1, + "mid": 1625, + "min": -200, + "max": 250 + }, + "mapping": { + "neutral": 0, + "poly": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + -0.25, + -0.50, + -0.25, + -0.25, + -0.25, + -0.25, + 0.0, + 0.25, + 0.25 + ] + } + }, + { + "name": "rotation" + } + ] + } + ] +} diff --git a/src/opsoro/config/grid_pin.txt b/src/opsoro/config/grid_pin.txt new file mode 100644 index 0000000..8799a6c --- /dev/null +++ b/src/opsoro/config/grid_pin.txt @@ -0,0 +1,17 @@ +eye_right: + pupil_horizontal: servo pin: 0, + pupil_vertical: servo pin: 1, + eyelid_closure: servo pin": 2, + +eyebrow_right: servo pin: 4, + +mouth: + right_rotation: servo pin: 5, + left_rotation: servo pin: 10, + +eyebrow_left: servo pin: 11, + +eye_left: + pupil_horizontal: servo pin: 15, + pupil_vertical: servo pin: 14, + eyelid_closure: servo pin": 13, diff --git a/src/opsoro/config/preferences.yaml b/src/opsoro/config/preferences.yaml index 78c88e7..d3d9f3a 100644 --- a/src/opsoro/config/preferences.yaml +++ b/src/opsoro/config/preferences.yaml @@ -1,20 +1,19 @@ -general: - robot_name: Ono - password: opsoro123 - -alive: - enabled: true - aliveness: 30 +audio: + master_volume: 50 + tts_engine: pico + tts_gender: f + tts_language: en +behaviour: blink: true + caffeine: 0 + enabled: true gaze: true - -audio: - master_volume: 60 - tts_engine: espeak - tts_language: nl - tts_gender: m - -wireless: - ssid: OPSORO-bot +general: + robot_name: robot + startup_app: --None-- +security: password: opsoro123 +wireless: channel: 6 + password: RobotOpsoro + ssid: OPSORO-NMCT diff --git a/src/opsoro/config/robot_config.conf b/src/opsoro/config/robot_config.conf new file mode 100644 index 0000000..55195ed --- /dev/null +++ b/src/opsoro/config/robot_config.conf @@ -0,0 +1,96 @@ +{"modules": +[ +{"type": "turn", + "dofs": [{ + "servo": {"max": 300, "mid": "1525", "pin": 14, "min": -200}, + "name": "rotation", + "poly": [0.25, 0.50, 0.70, 0.70, 0.70, 0.70, 0.50, 0.25, -0.50, -0.50, -0.25, 0.25, 0.25, -0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.50]}], + "grid": {"y": 4, "x": 15, "rotation": 270}, + "name": "eyebrow left inner"}, + +{"type": "eye", + "dofs": [ + {"servo": {"max": 350, "mid": "1550", "pin": 13, "min": -350}, + "name": "horizontal", + "poly": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, + {"servo": {"max": 350, "mid": "1525", "pin": 12, "min": -350}, + "name": "vertical", + "poly": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, + {"servo": {"max": 350, "mid": "1225", "pin": 11, "min": -300}, + "name": "lid", + "poly": [ 0.50, 0.50, 0.50, 0.50, 0.50, 0.80, 0.80, 0.80, 0.50, 0.50, 0.50, 0.40, 0.40, 0.40, 0.25, 0.25, 0.50, 0.50, 0.50, 0.50]}], + "grid": {"y": 12, "x": 18, "rotation": 0}, + "name": "eye left"}, + +{"type": "eye", + "dofs": [ + {"servo": {"max": 350, "mid": "1700", "pin": 3, "min": -350}, + "name": "horizontal", + "poly": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, + {"servo": {"max": -350, "mid": "1525", "pin": 2, "min": 350}, + "name": "vertical", + "poly": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, + {"servo": {"max": -350, "mid": "1500", "pin": 4, "min": 300}, + "name": "lid", + "poly": [ 0.50, 0.50, 0.50, 0.50, 0.50, 0.80, 0.80, 0.80, 0.50, 0.50, 0.50, 0.40, 0.40, 0.40, 0.25, 0.25, 0.50, 0.50, 0.50, 0.50]}], + "grid": {"y": 12, "x": 7, "rotation": 0}, + "name": "eye right"}, + +{"type": "turn", + "dofs": [ + {"servo": {"max": 250, "mid": "1625", "pin": 1, "min": -200}, + "name": "rotation", + "poly": [ 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, -0.25, -0.50, -0.25, -0.25, -0.25, -0.25, 0.0, 0.25, 0.25]}], + "grid": {"y": 4, "x": 4, "rotation": 270}, + "name": "eyebrow right outer"}, + +{"type": "speaker", + "dofs": [], + "grid": {"y": 34, "x": 6, "rotation": 0}, + "name": "speaker"}, + +{"type": "heart", + "dofs": [], + "grid": {"y": 34, "x": 18, "rotation": 0}, + "name": "heart"}, + +{"grid": {"y": 4, "x": 10, "rotation": 270}, + "dofs": [ + {"poly": [ 0.25, 0.50, 0.70, 0.70, 0.70, 0.70, 0.50, 0.25, -0.50, -0.50, -0.25, 0.25, 0.25, -0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.50], + "name": "rotation", + "servo": {"max": -300, "mid": "1625", "pin": 0, "min": 200}}], + "type": "turn", + "name": "eyebrow right inner"}, + +{"grid": {"y": 4, "x": 21, "rotation": 270}, + "dofs": [ + {"poly": [0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, -0.25, -0.50, -0.25, -0.25, -0.25, -0.25, 0.0, 0.25, 0.25], + "name": "rotation", + "servo": {"max": -250, "mid": "1550", "pin": 15, "min": 200}}], + "type": "turn", + "name": "eyebrow left outer"}, + +{"grid": {"y": 21, "x": 6, "rotation": 180}, + "dofs": [ + {"poly": [0.50, 0.70, 0.70, 0.40, 0.0, 0.0, -0.50, -0.50, -0.50, -0.50, -0.50, -1.0, -1.0, -0.25, -0.25, 0.25, 0.25, 0.50, 0.50, 0.50], + "name": "rotation", + "servo": {"max": 300, "mid": "1600", "pin": 7, "min": -400}}], + "type": "turn", + "name": "mouth right"}, + +{"grid": {"y": 26, "x": 13, "rotation": 90}, + "dofs": [ + {"poly": [1.0, 0.50, -1.0, -1.0, -0.50, -1.0, -0.80, -0.80, -0.80, 0.50, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], + "name": "rotation", + "servo": {"max": -250, "mid": "1525", "pin": 6, "min": 400}}], + "type": "turn", + "name": "mouth middle"}, + +{"grid": {"y": 21, "x": 20, "rotation": 0}, + "dofs": [ + {"poly": [0.50, 0.70, 0.70, 0.40, 0.0, 0.0, -0.50, -0.50, -0.50, -0.50, -0.50, -1.0, -1.0, -0.25, -0.25, 0.25, 0.25, 0.50, 0.50, 0.50], + "name": "rotation", + "servo": {"max": -300, "mid": "1550", "pin": 5, "min": 400}}], + "type": "turn", + "name": "mouth left"}]} + diff --git a/src/opsoro/config/robot_expressions.conf b/src/opsoro/config/robot_expressions.conf new file mode 100644 index 0000000..d8c65e3 --- /dev/null +++ b/src/opsoro/config/robot_expressions.conf @@ -0,0 +1 @@ +[{"dofs": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "name": "neutral", "filename": "1f610"}, {"dofs": [0, 0, 1, 0, -0.5, 0.5, 0, 0, 0, 0, -0.47, 0.5, 0, 1, 0, 0], "name": "happy", "poly": 1, "filename": "1f642"}, {"dofs": [0, 0, 0.65, 0, -0.5, "1", 0, 0, 0, 0, "-1", 0.5, 0, 0.65, 0, 0], "name": "laughing", "poly": 3, "filename": "1f603"}, {"dofs": [-0.6, 0, 0, 0, 0.15, "1", 0, 0, 0, 0, "1", -0.15, 0, 0, 0, 0.6], "name": "surprised", "poly": 5, "filename": "1f62f"}, {"dofs": [0, 0, -0.05, 0, 0.7, 0, 0, 0, 0, 0, 0, -0.7, 0, -0.05, 0, 0], "name": "afraid", "poly": 7, "filename": "1f616"}, {"dofs": [0, -0.3, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, -0.3, 0], "name": "angry", "poly": 8, "filename": "1f620"}, {"dofs": [0, -0.7, -0.15, 0, 0.35, 0, 0, 0, 0, 0, 0, -0.35, 0, -0.15, -0.7, 0], "name": "disgusted", "poly": 10, "filename": "1f623"}, {"dofs": [0, -0.5, -0.35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.35, -0.5, 0], "name": "sad", "poly": 11, "filename": "1f641"}, {"dofs": [0, 0, -0.15, 0, -0.45, 0, 0, 0, 0, 0, 0, 0.45, 0, -0.15, 0, 0], "name": "tired", "poly": 15, "filename": "1f614"}, {"dofs": [0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0], "name": "sleep", "filename": "1f634"}, {"dofs": ["-1", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "name": "Tong", "filename": "1f60b"}] \ No newline at end of file diff --git a/src/opsoro/config/robot_expressions.yaml b/src/opsoro/config/robot_expressions.yaml new file mode 100644 index 0000000..7992fe1 --- /dev/null +++ b/src/opsoro/config/robot_expressions.yaml @@ -0,0 +1,32 @@ +--- +expressions: + - name: neutral + filename: 1f610 + dofs: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] + - name: happy + filename: 1f642 + poly: 1 + - name: laughing + filename: 1f603 + poly: 3 + - name: surprised + filename: 1f62f + poly: 5 + - name: afraid + filename: 1f616 + poly: 7 + - name: angry + filename: 1f620 + poly: 8 + - name: disgusted + filename: 1f623 + poly: 10 + - name: sad + filename: 1f641 + poly: 11 + - name: tired + filename: 1f614 + poly: 15 + - name: sleep + filename: 1f634 + dofs: [ 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0 ] diff --git a/src/opsoro/configuration.py b/src/opsoro/configuration.py new file mode 100644 index 0000000..e4120a9 --- /dev/null +++ b/src/opsoro/configuration.py @@ -0,0 +1,91 @@ +""" +This module defines the interface for loading and saving the configuration files of the robot. + +.. autoclass:: _Configuration + :members: + :undoc-members: + :show-inheritance: +""" + +from __future__ import division +from __future__ import with_statement + +import sys +import os +from functools import partial + +import yaml +try: + from yaml import CLoader as Loader, CDumper as Dumper +except ImportError: + from yaml import Loader, Dumper + +get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) + +from opsoro.console_msg import * +# from opsoro.stoppable_thread import StoppableThread +# from opsoro.hardware import Hardware +# from opsoro.preferences import Preferences + +# Modules +# from opsoro.module import * + +class _Configuration(object): + def __init__(self): + self.data = {} + self.load_config() + + def load_config(self): + """ + Load configuration into data. + """ + try: + with open(get_path("config/default.yaml")) as f: + self.data = yaml.load(f, Loader=Loader) + except IOError: + self.data = {} + print_warning("Could not open config/default.yaml") + + print_info("Configuration loaded") + + def get_module(self, section, item, default): + """ + Retrieve configuration value. + + :param string section: category in which the item is defined. + :param string item: item to retrieve. + :param default: default value to return if the value is not available. + + :return: preference value + """ + return self.data.get(section, {}).get(item, default) + + def set(self, section, item, value): + """ + Set preference value. + + :param string section: category in which the item is defined. + :param string item: item to set. + :param value: value to set. + """ + if value is None: + return + try: + self.data[section][item] = value + except KeyError: + self.data[section] = {item: value} + + def save_prefs(self): + """ + Saves preferences to yaml file. + """ + try: + with open(get_path("config/preferences.yaml"), "w") as f: + f.write(yaml.dump(self.data, default_flow_style=False, Dumper=Dumper)) + except IOError: + print_warning("Could not save config/preferences.yaml") + + def save(self, filename): + pass + +Configuration = _Configuration() diff --git a/src/opsoro/console_msg.py b/src/opsoro/console_msg.py index 0753459..768c01c 100644 --- a/src/opsoro/console_msg.py +++ b/src/opsoro/console_msg.py @@ -1,22 +1,26 @@ def print_info(msg): - print "\033[1m[\033[96m INFO \033[0m\033[1m]\033[0m %s" % msg + print("\033[1m[\033[96m INFO \033[0m\033[1m]\033[0m %s" % msg) def print_warning(msg): - print "\033[1m[\033[93m WARN \033[0m\033[1m]\033[0m %s" % msg + print("\033[1m[\033[93m WARN \033[0m\033[1m]\033[0m %s" % msg) def print_error(msg): - print "\033[1m[\033[91m ERRO \033[0m\033[1m]\033[0m %s" % msg + print("\033[1m[\033[91m ERRO \033[0m\033[1m]\033[0m %s" % msg) def print_apploaded(appname): - print "\033[1m[\033[92m APP LOADED \033[0m\033[1m]\033[0m %s" % appname + print("\033[1m[\033[92m APP LOADED \033[0m\033[1m]\033[0m %s" % appname) def print_appstarted(appname): - print "\033[1m[\033[92m APP STARTED \033[0m\033[1m]\033[0m %s" % appname + print("\033[1m[\033[92m APP STARTED \033[0m\033[1m]\033[0m %s" % appname) def print_appstopped(appname): - print "\033[1m[\033[93m APP STOPPED \033[0m\033[1m]\033[0m %s" % appname + print("\033[1m[\033[93m APP STOPPED \033[0m\033[1m]\033[0m %s" % appname) + + +def print_spi(msg): + print("\033[1m[\033[94m SPI \033[0m\033[1m]\033[0m %s" % msg) diff --git a/src/opsoro/data/__init__.py b/src/opsoro/data/__init__.py new file mode 100644 index 0000000..0edc99b --- /dev/null +++ b/src/opsoro/data/__init__.py @@ -0,0 +1,155 @@ +""" +This module defines the interface for reading and writing app files. + +.. autoclass:: _Data + :members: + :undoc-members: + :show-inheritance: +""" + +import glob +import os +from functools import partial + +from opsoro.apps import Apps +from opsoro.users import Users + +get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) + + +class _Data(object): + def __init__(self): + """ + Data class, used to read and write files. + """ + pass + + def filelist(self, appname, extension='.*', trim_ext=True): + """ + Get the list of files of a certain app, filtered by an extension. + + :param string appname: current app name, to find the files of + :param string extension: extension of requested files + + :return: files of an app. + :rtype: list + """ + if not self._valid_parameters(appname, 'file' + extension): + return None + + filenames = [] + + filepaths = glob.glob(get_path('%s/*%s') % (appname, extension)) + for filepath in filepaths: + if trim_ext: + filenames.append(os.path.splitext(os.path.basename(filepath))[0]) + else: + filenames.append(os.path.basename(filepath)) + filenames.sort() + + return filenames + + def read(self, appname, filename): + """ + Read the data from a file. + + :param string appname: current app name, to find the file of + :param string filename: name of the requested file + + :return: file data. + :rtype: var + """ + if not self._valid_parameters(appname, filename, True): + return None + + data = None + try: + with open(get_path('%s/%s' % (appname, filename))) as f: + data = f.read() + except Exception as e: + print_error(e) + + return data + + def write(self, appname, filename, data): + """ + Write data to a file. + + :param string appname: current app name, to find the file of + :param string filename: name of the requested file + :param var data: data to write to the file + + :return: True if write was successfull. + :rtype: bool + """ + if not self._valid_parameters(appname, filename, False): + return False + + try: + with open(get_path('%s/%s' % (appname, filename)), 'w') as f: + f.write(data) + except Exception as e: + print_error(e) + return False + + return True + + def delete(self, appname, filename): + """ + Delete a file. + + :param string appname: current app name, to find the file of + :param string filename: name of the requested file + + :return: True if deletion was successfull. + :rtype: bool + """ + if not self._valid_parameters(appname, filename, True): + return False + + try: + os.remove(get_path('%s/%s' % (appname, filename))) + except Exception as e: + print_error(e) + return False + + return True + + def _valid_parameters(self, appname, filename='dummy.ext', file_required=False): + """ + Check the validity of given parameters. + + :param string appname: current app name, to find the file of + :param string filename: name of the requested file + :param bool file_required: does the file needs to exist + + :return: True if all parameters are valid. + :rtype: bool + """ + if appname not in Apps.apps: + return False + + # If app-directory does not exist, create it + if not os.path.isdir(get_path(appname)): + os.makedirs(get_path(appname)) + + if filename is None: + return False + + # No path can be included in the filename + if filename != os.path.basename(filename): + return False + + # Filename should be at least 1 character long + if len(os.path.splitext(filename)[0]) < 1: + return False + + # If a file is required, check if it exists + if file_required: + if not os.path.exists(get_path('%s/%s' % (appname, filename))): + return False + + return True + + +Data = _Data() diff --git a/src/opsoro/data/visual_programming/scripts/2_How_can_I_help_you_with_your_sessions.xml b/src/opsoro/data/blockly/2_How_can_I_help_you_with_your_sessions.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/2_How_can_I_help_you_with_your_sessions.xml rename to src/opsoro/data/blockly/2_How_can_I_help_you_with_your_sessions.xml diff --git a/src/opsoro/data/visual_programming/scripts/3touchemotions.xml b/src/opsoro/data/blockly/3touchemotions.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/3touchemotions.xml rename to src/opsoro/data/blockly/3touchemotions.xml diff --git a/src/opsoro/data/visual_programming/scripts/Blink.xml b/src/opsoro/data/blockly/Blink.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/Blink.xml rename to src/opsoro/data/blockly/Blink.xml diff --git a/src/opsoro/data/visual_programming/scripts/Dries.xml b/src/opsoro/data/blockly/Dries.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/Dries.xml rename to src/opsoro/data/blockly/Dries.xml diff --git a/src/opsoro/data/visual_programming/scripts/DriesTest.xml b/src/opsoro/data/blockly/DriesTest.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/DriesTest.xml rename to src/opsoro/data/blockly/DriesTest.xml diff --git a/src/opsoro/data/visual_programming/scripts/Feedback1.xml b/src/opsoro/data/blockly/Feedback1.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/Feedback1.xml rename to src/opsoro/data/blockly/Feedback1.xml diff --git a/src/opsoro/data/visual_programming/scripts/I_am_waiting.xml b/src/opsoro/data/blockly/I_am_waiting.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/I_am_waiting.xml rename to src/opsoro/data/blockly/I_am_waiting.xml diff --git a/src/opsoro/data/visual_programming/scripts/JelleHello.xml b/src/opsoro/data/blockly/JelleHello.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/JelleHello.xml rename to src/opsoro/data/blockly/JelleHello.xml diff --git a/src/opsoro/data/visual_programming/scripts/MVH.xml b/src/opsoro/data/blockly/MVH.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/MVH.xml rename to src/opsoro/data/blockly/MVH.xml diff --git a/src/opsoro/data/visual_programming/scripts/NeoPixel 8X8.xml b/src/opsoro/data/blockly/NeoPixel 8X8.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/NeoPixel 8X8.xml rename to src/opsoro/data/blockly/NeoPixel 8X8.xml diff --git a/src/opsoro/data/visual_programming/scripts/Psychotherapist1.xml b/src/opsoro/data/blockly/Psychotherapist1.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/Psychotherapist1.xml rename to src/opsoro/data/blockly/Psychotherapist1.xml diff --git a/src/opsoro/data/visual_programming/scripts/Scenario1.xml b/src/opsoro/data/blockly/Scenario1.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/Scenario1.xml rename to src/opsoro/data/blockly/Scenario1.xml diff --git a/src/opsoro/data/blockly/Scenario_2.xml b/src/opsoro/data/blockly/Scenario_2.xml new file mode 100644 index 0000000..e69de29 diff --git a/src/opsoro/data/visual_programming/scripts/Scenario_Cesar.xml b/src/opsoro/data/blockly/Scenario_Cesar.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/Scenario_Cesar.xml rename to src/opsoro/data/blockly/Scenario_Cesar.xml diff --git a/src/opsoro/data/visual_programming/scripts/Scenario_Cesar_bak.xml b/src/opsoro/data/blockly/Scenario_Cesar_bak.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/Scenario_Cesar_bak.xml rename to src/opsoro/data/blockly/Scenario_Cesar_bak.xml diff --git a/src/opsoro/data/visual_programming/scripts/Scenario_Cesar_bak2.xml b/src/opsoro/data/blockly/Scenario_Cesar_bak2.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/Scenario_Cesar_bak2.xml rename to src/opsoro/data/blockly/Scenario_Cesar_bak2.xml diff --git a/src/opsoro/data/visual_programming/scripts/SmileButton.xml b/src/opsoro/data/blockly/SmileButton.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/SmileButton.xml rename to src/opsoro/data/blockly/SmileButton.xml diff --git a/src/opsoro/data/visual_programming/scripts/State_LED_BLINK.xml b/src/opsoro/data/blockly/State_LED_BLINK.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/State_LED_BLINK.xml rename to src/opsoro/data/blockly/State_LED_BLINK.xml diff --git a/src/opsoro/data/visual_programming/scripts/Test_coloring_end_v1.xml b/src/opsoro/data/blockly/Test_coloring_end_v1.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/Test_coloring_end_v1.xml rename to src/opsoro/data/blockly/Test_coloring_end_v1.xml diff --git a/src/opsoro/data/visual_programming/scripts/Test_coloring_v1.xml b/src/opsoro/data/blockly/Test_coloring_v1.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/Test_coloring_v1.xml rename to src/opsoro/data/blockly/Test_coloring_v1.xml diff --git a/src/opsoro/data/visual_programming/scripts/Touch-test.xml b/src/opsoro/data/blockly/Touch-test.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/Touch-test.xml rename to src/opsoro/data/blockly/Touch-test.xml diff --git a/src/opsoro/data/visual_programming/scripts/Touch_Emotions.xml b/src/opsoro/data/blockly/Touch_Emotions.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/Touch_Emotions.xml rename to src/opsoro/data/blockly/Touch_Emotions.xml diff --git a/src/opsoro/data/visual_programming/scripts/backup.xml b/src/opsoro/data/blockly/backup.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/backup.xml rename to src/opsoro/data/blockly/backup.xml diff --git a/src/opsoro/data/blockly/currentscript.xml.tmp b/src/opsoro/data/blockly/currentscript.xml.tmp new file mode 100644 index 0000000..e3434a9 --- /dev/null +++ b/src/opsoro/data/blockly/currentscript.xml.tmp @@ -0,0 +1 @@ +eye left horizontal1 \ No newline at end of file diff --git a/src/opsoro/data/visual_programming/scripts/test_ana.xml b/src/opsoro/data/blockly/test_ana.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/test_ana.xml rename to src/opsoro/data/blockly/test_ana.xml diff --git a/src/opsoro/data/visual_programming/scripts/test_elektrode.xml b/src/opsoro/data/blockly/test_elektrode.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/test_elektrode.xml rename to src/opsoro/data/blockly/test_elektrode.xml diff --git a/src/opsoro/data/visual_programming/scripts/test_elektrode2.xml b/src/opsoro/data/blockly/test_elektrode2.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/test_elektrode2.xml rename to src/opsoro/data/blockly/test_elektrode2.xml diff --git a/src/opsoro/data/visual_programming/scripts/test_elektrode3.xml b/src/opsoro/data/blockly/test_elektrode3.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/test_elektrode3.xml rename to src/opsoro/data/blockly/test_elektrode3.xml diff --git a/src/opsoro/data/visual_programming/scripts/test_elektrode4.xml b/src/opsoro/data/blockly/test_elektrode4.xml similarity index 100% rename from src/opsoro/data/visual_programming/scripts/test_elektrode4.xml rename to src/opsoro/data/blockly/test_elektrode4.xml diff --git a/src/opsoro/data/configurator/default.conf b/src/opsoro/data/configurator/default.conf deleted file mode 100644 index ec62aa0..0000000 --- a/src/opsoro/data/configurator/default.conf +++ /dev/null @@ -1,426 +0,0 @@ -{ - "name": "Ono robot", - "skin": "ono", - "grid": "18", - "modules": [ - { - "module": "eyebrow", - "name": "eyebrow_left", - "canvas": { - "x": 0.2007176817525277, - "y": -0.6989197159364468, - "width": 0.19997291766971595, - "height": 0.02888781896966779, - "rotation": 0 - }, - "dofs": [ - { - "name": "left_vertical", - "servo": { - "pin": 15, - "mid": 1550, - "min": 200, - "max": -250 - }, - "mapping": { - "neutral": 0.0, - "poly": [ - 0.25, - 0.25, - 0.0, - -0.25, - -0.25, - -0.25, - -0.25, - -0.50, - -0.25, - 0.25, - 0.0, - 0.0, - 0.0, - 0.0, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25 - ] - } - }, - { - "name": "right_vertical", - "servo": { - "pin": 14, - "mid": 1525, - "min": -200, - "max": 300 - }, - "mapping": { - "neutral": 0.0, - "poly": [ - 0.50, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - -0.25, - 0.25, - 0.25, - -0.25, - 0.25, - 0.50, - 0.70, - 0.70, - 0.70, - 0.70, - 0.50, - 0.25, - -0.50, - -0.50 - ] - } - }, - { - "name": "rotation" - } - ] - }, - { - "module": "eye", - "name": "eye_left", - "canvas": { - "x": 0.20071684587813632, - "y": -0.49820788530465954, - "width": 0.2, - "height": 0.2, - "rotation": 0 - }, - "dofs": [ - { - "name": "pupil_horizontal", - "servo": { - "pin": 13, - "mid": 1550, - "min": -350, - "max": 350 - } - }, - { - "name": "pupil_vertical", - "servo": { - "pin": 12, - "mid": 1525, - "min": -350, - "max": 350 - } - }, - { - "name": "eyelid_closure", - "servo": { - "pin": 11, - "mid": 1525, - "min": -300, - "max": 350 - }, - "mapping": { - "neutral": 0.5, - "poly": [ - 0.50, - 0.50, - 0.50, - 0.50, - 0.25, - 0.25, - 0.40, - 0.40, - 0.40, - 0.50, - 0.50, - 0.50, - 0.50, - 0.50, - 0.50, - 0.80, - 0.80, - 0.80, - 0.50, - 0.50 - ] - } - } - ] - }, - { - "module": "mouth", - "name": "mouth", - "canvas": { - "x": 0, - "y": -0.19712927298988928, - "width": 0.4, - "height": 0.17332691381800674, - "rotation": 0 - }, - "dofs": [ - { - "name": "left_vertical", - "servo": { - "pin": 5, - "mid": 1550, - "min": 400, - "max": -300 - }, - "mapping": { - "neutral": 0.2, - "poly": [ - 0.50, - 0.50, - 0.50, - 0.25, - 0.25, - -0.25, - -0.25, - -1.0, - -1.0, - -0.50, - 0.50, - 0.70, - 0.70, - 0.40, - 0.0, - 0.0, - -0.50, - -0.50, - -0.50, - -0.50 - ] - } - }, - { - "name": "middle_vertical", - "servo": { - "pin": 6, - "mid": 1525, - "min": 400, - "max": -250 - }, - "mapping": { - "neutral": 0.5, - "poly": [ - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 0.50, - -1.0, - -1.0, - -0.50, - -1.0, - -0.80, - -0.80, - -0.80, - 0.50 - ] - } - }, - { - "name": "right_vertical", - "servo": { - "pin": 7, - "mid": 1600, - "min": -400, - "max": 300 - }, - "mapping": { - "neutral": 0.2, - "poly": [ - 0.50, - 0.50, - 0.50, - 0.25, - 0.25, - -0.25, - -0.25, - -1.0, - -1.0, - -0.50, - 0.50, - 0.70, - 0.70, - 0.40, - 0.0, - 0.0, - -0.50, - -0.50, - -0.50, - -0.50 - ] - } - }, - { - "name": "left_rotation" - }, - { - "name": "right_rotation" - } - ] - }, - { - "module": "eye", - "name": "eye_right", - "canvas": { - "x": -0.2007168458781361, - "y": -0.49820788530465954, - "width": 0.2, - "height": 0.2, - "rotation": 0 - }, - "dofs": [ - { - "name": "pupil_horizontal", - "servo": { - "pin": 3, - "mid": 1700, - "min": -350, - "max": 350 - } - }, - { - "name": "pupil_vertical", - "servo": { - "pin": 2, - "mid": 1525, - "min": 350, - "max": -350 - } - }, - { - "name": "eyelid_closure", - "servo": { - "pin": 4, - "mid": 1500, - "min": 300, - "max": -350 - }, - "mapping": { - "neutral": 0.5, - "poly": [ - 0.50, - 0.50, - 0.50, - 0.50, - 0.25, - 0.25, - 0.40, - 0.40, - 0.40, - 0.50, - 0.50, - 0.50, - 0.50, - 0.50, - 0.50, - 0.80, - 0.80, - 0.80, - 0.50, - 0.50 - ] - } - } - ] - }, - { - "module": "eyebrow", - "name": "eyebrow_right", - "canvas": { - "x": -0.20071015888300434, - "y": -0.6989197159364468, - "width": 0.19998796340876263, - "height": 0.02888781896966779, - "rotation": 0 - }, - "dofs": [ - { - "name": "left_vertical", - "servo": { - "pin": 0, - "mid": 1625, - "min": 200, - "max": -300 - }, - "mapping": { - "neutral": 0, - "poly": [ - 0.50, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - -0.25, - 0.25, - 0.25, - -0.25, - 0.25, - 0.50, - 0.70, - 0.70, - 0.70, - 0.70, - 0.50, - 0.25, - -0.50, - -0.50 - ] - } - }, - { - "name": "right_vertical", - "servo": { - "pin": 1, - "mid": 1625, - "min": -200, - "max": 250 - }, - "mapping": { - "neutral": 0, - "poly": [ - 0.25, - 0.25, - 0.0, - -0.25, - -0.25, - -0.25, - -0.25, - -0.50, - -0.25, - 0.25, - 0.0, - 0.0, - 0.0, - 0.0, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25 - ] - } - }, - { - "name": "rotation" - } - ] - } - ] -} diff --git a/src/opsoro/data/configurator/default_old.conf b/src/opsoro/data/configurator/default_old.conf deleted file mode 100644 index 74ddd15..0000000 --- a/src/opsoro/data/configurator/default_old.conf +++ /dev/null @@ -1,426 +0,0 @@ -{ - "name": "Ono robot", - "skin": "ono", - "grid": "18", - "modules": [ - { - "module": "eyebrow", - "name": "eyebrow_left", - "canvas": { - "x": 0.2007176817525277, - "y": -0.6989197159364468, - "width": 0.19997291766971595, - "height": 0.02888781896966779, - "rotation": 0 - }, - "dofs": [ - { - "name": "Left Vertical", - "servo": { - "pin": 15, - "mid": 1550, - "min": 200, - "max": -250 - }, - "mapping": { - "neutral": 0.0, - "poly": [ - 0.25, - 0.25, - 0.0, - -0.25, - -0.25, - -0.25, - -0.25, - -0.50, - -0.25, - 0.25, - 0.0, - 0.0, - 0.0, - 0.0, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25 - ] - } - }, - { - "name": "Right Vertical", - "servo": { - "pin": 14, - "mid": 1525, - "min": -200, - "max": 300 - }, - "mapping": { - "neutral": 0.0, - "poly": [ - 0.50, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - -0.25, - 0.25, - 0.25, - -0.25, - 0.25, - 0.50, - 0.70, - 0.70, - 0.70, - 0.70, - 0.50, - 0.25, - -0.50, - -0.50 - ] - } - }, - { - "name": "Rotation" - } - ] - }, - { - "module": "eye", - "name": "eye_left", - "canvas": { - "x": 0.20071684587813632, - "y": -0.49820788530465954, - "width": 0.2, - "height": 0.2, - "rotation": 0 - }, - "dofs": [ - { - "name": "Pupil Horizontal", - "servo": { - "pin": 13, - "mid": 1550, - "min": -350, - "max": 350 - } - }, - { - "name": "Pupil Vertical", - "servo": { - "pin": 12, - "mid": 1525, - "min": -350, - "max": 350 - } - }, - { - "name": "Eyelid Closure", - "servo": { - "pin": 11, - "mid": 1525, - "min": -300, - "max": 350 - }, - "mapping": { - "neutral": 0.5, - "poly": [ - 0.50, - 0.50, - 0.50, - 0.50, - 0.25, - 0.25, - 0.40, - 0.40, - 0.40, - 0.50, - 0.50, - 0.50, - 0.50, - 0.50, - 0.50, - 0.80, - 0.80, - 0.80, - 0.50, - 0.50 - ] - } - } - ] - }, - { - "module": "mouth", - "name": "mouth", - "canvas": { - "x": 0, - "y": -0.19712927298988928, - "width": 0.4, - "height": 0.17332691381800674, - "rotation": 0 - }, - "dofs": [ - { - "name": "Left Vertical", - "servo": { - "pin": 5, - "mid": 1550, - "min": 400, - "max": -300 - }, - "mapping": { - "neutral": 0.2, - "poly": [ - 0.50, - 0.50, - 0.50, - 0.25, - 0.25, - -0.25, - -0.25, - -1.0, - -1.0, - -0.50, - 0.50, - 0.70, - 0.70, - 0.40, - 0.0, - 0.0, - -0.50, - -0.50, - -0.50, - -0.50 - ] - } - }, - { - "name": "Middle Vertical", - "servo": { - "pin": 6, - "mid": 1525, - "min": 400, - "max": -250 - }, - "mapping": { - "neutral": 0.5, - "poly": [ - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 0.50, - -1.0, - -1.0, - -0.50, - -1.0, - -0.80, - -0.80, - -0.80, - 0.50 - ] - } - }, - { - "name": "Right Vertical", - "servo": { - "pin": 7, - "mid": 1600, - "min": -400, - "max": 300 - }, - "mapping": { - "neutral": 0.2, - "poly": [ - 0.50, - 0.50, - 0.50, - 0.25, - 0.25, - -0.25, - -0.25, - -1.0, - -1.0, - -0.50, - 0.50, - 0.70, - 0.70, - 0.40, - 0.0, - 0.0, - -0.50, - -0.50, - -0.50, - -0.50 - ] - } - }, - { - "name": "Left Rotation" - }, - { - "name": "Right Rotation" - } - ] - }, - { - "module": "eye", - "name": "eye_right", - "canvas": { - "x": -0.2007168458781361, - "y": -0.49820788530465954, - "width": 0.2, - "height": 0.2, - "rotation": 0 - }, - "dofs": [ - { - "name": "Pupil Horizontal", - "servo": { - "pin": 3, - "mid": 1700, - "min": -350, - "max": 350 - } - }, - { - "name": "Pupil Vertical", - "servo": { - "pin": 2, - "mid": 1525, - "min": 350, - "max": -350 - } - }, - { - "name": "Eyelid Closure", - "servo": { - "pin": 4, - "mid": 1500, - "min": 300, - "max": -350 - }, - "mapping": { - "neutral": 0.5, - "poly": [ - 0.50, - 0.50, - 0.50, - 0.50, - 0.25, - 0.25, - 0.40, - 0.40, - 0.40, - 0.50, - 0.50, - 0.50, - 0.50, - 0.50, - 0.50, - 0.80, - 0.80, - 0.80, - 0.50, - 0.50 - ] - } - } - ] - }, - { - "module": "eyebrow", - "name": "eyebrow_right", - "canvas": { - "x": -0.20071015888300434, - "y": -0.6989197159364468, - "width": 0.19998796340876263, - "height": 0.02888781896966779, - "rotation": 0 - }, - "dofs": [ - { - "name": "Left Vertical", - "servo": { - "pin": 0, - "mid": 1625, - "min": 200, - "max": -300 - }, - "mapping": { - "neutral": 0, - "poly": [ - 0.50, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - -0.25, - 0.25, - 0.25, - -0.25, - 0.25, - 0.50, - 0.70, - 0.70, - 0.70, - 0.70, - 0.50, - 0.25, - -0.50, - -0.50 - ] - } - }, - { - "name": "Right Vertical", - "servo": { - "pin": 1, - "mid": 1625, - "min": -200, - "max": 250 - }, - "mapping": { - "neutral": 0, - "poly": [ - 0.25, - 0.25, - 0.0, - -0.25, - -0.25, - -0.25, - -0.25, - -0.50, - -0.25, - 0.25, - 0.0, - 0.0, - 0.0, - 0.0, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25 - ] - } - }, - { - "name": "Rotation" - } - ] - } - ] -} diff --git a/src/opsoro/data/configurator/grid.conf b/src/opsoro/data/configurator/grid.conf deleted file mode 100644 index 907050c..0000000 --- a/src/opsoro/data/configurator/grid.conf +++ /dev/null @@ -1,433 +0,0 @@ -{ - "name": "OPSORO robot", - "skin": "ono", - "grid": "18", - "modules": [ - { - "module": "eyebrow", - "name": "eyebrow_left", - "canvas": { - "x": 0.2007168458781363, - "y": -0.6989247311827956, - "width": 0.22470495672698665, - "height": 0.185051140833989, - "rotation": 0 - }, - "dofs": [ - { - "name": "left_vertical" - }, - { - "name": "right_vertical" - }, - { - "name": "rotation", - "servo": { - "pin": "11", - "mid": "1550", - "min": "300", - "max": "-300" - }, - "mapping": { - "neutral": "0", - "poly": [ - 0.3, - 0.5, - 0.7, - 0.5, - 0.15, - -0.15, - -0.45, - -0.7, - -1, - -0.65, - -0.35, - 0, - 0.25, - 0.5, - 0.5, - 0.45, - 0.75, - 1, - 0.7, - 0.25 - ] - } - } - ] - }, - { - "module": "eye", - "name": "eye_left", - "canvas": { - "x": 0.2007168458781363, - "y": -0.4982078853046595, - "width": 0.23792289535798586, - "height": 0.23792289535798586, - "rotation": 0 - }, - "dofs": [ - { - "name": "pupil_horizontal", - "servo": { - "pin": "15", - "mid": "1600", - "min": "250", - "max": "-250" - }, - "mapping": { - "neutral": 0, - "poly": [ - 0, - 0, - 0, - 0, - 0, - 0.6, - 0.4, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -0.35, - -0.25, - 0, - 0 - ] - } - }, - { - "name": "pupil_vertical", - "servo": { - "pin": "14", - "mid": "1500", - "min": "-250", - "max": "250" - }, - "mapping": { - "neutral": 0, - "poly": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -0.3, - -0.5, - -0.7, - -0.5, - -0.4, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - } - }, - { - "name": "eyelid_closure", - "servo": { - "pin": "13", - "mid": "1630", - "min": "-200", - "max": "200" - }, - "mapping": { - "neutral": "0.7", - "poly": [ - 0.7, - 1, - 1, - 0.65, - 0.25, - 0, - 0.05, - -0.05, - 0, - -0.05, - -0.15, - -0.35, - -0.65, - -1, - -0.45, - -0.15, - 0.15, - 0.4, - 0.5, - 0.5 - ] - } - } - ] - }, - { - "module": "mouth", - "name": "mouth", - "canvas": { - "x": 0, - "y": -0.1971326164874551, - "width": 0.42738001573564127, - "height": 0.20708103855232102, - "rotation": 0 - }, - "dofs": [ - { - "name": "left_vertical" - }, - { - "name": "middle_vertical" - }, - { - "name": "right_vertical" - }, - { - "name": "left_rotation", - "servo": { - "pin": "10", - "mid": "1550", - "min": "-250", - "max": "250" - }, - "mapping": { - "neutral": "0", - "poly": [ - 0.5, - 0.75, - 1, - 0.6, - 0.1, - -0.3, - -0.55, - 0.5, - -0.5, - -0.4, - -0.25, - -0.15, - -0.15, - -0.25, - -0.55, - -0.1, - 0.15, - 0.25, - 0.2, - 0.35 - ] - } - }, - { - "name": "right_rotation", - "servo": { - "pin": "5", - "mid": "1550", - "min": "250", - "max": "-250" - }, - "mapping": { - "neutral": "0", - "poly": [ - 0.5, - 0.75, - 1, - 0.6, - 0.1, - -0.3, - -0.7, - -1, - -0.75, - -0.4, - -0.25, - -0.15, - -0.15, - -0.25, - -0.1, - -0.1, - 0.15, - 0.25, - 0.2, - 0.35 - ] - } - } - ] - }, - { - "module": "eye", - "name": "eye_right", - "canvas": { - "x": -0.20071684587813615, - "y": -0.4982078853046595, - "width": 0.23792289535798586, - "height": 0.23792289535798586, - "rotation": 0 - }, - "dofs": [ - { - "name": "pupil_horizontal", - "servo": { - "pin": 0, - "mid": "1600", - "min": "250", - "max": "-250" - }, - "mapping": { - "neutral": 0, - "poly": [ - 0, - 0, - 0, - 0, - 0, - -0.6, - -0.4, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0.35, - 0.25, - 0, - 0 - ] - } - }, - { - "name": "pupil_vertical", - "servo": { - "pin": "1", - "mid": "1500", - "min": "-350", - "max": "350" - }, - "mapping": { - "neutral": 0, - "poly": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -0.3, - -0.5, - -0.7, - -0.5, - -0.4, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - } - }, - { - "name": "eyelid_closure", - "servo": { - "pin": "2", - "mid": "1630", - "min": "-200", - "max": "200" - }, - "mapping": { - "neutral": "0.7", - "poly": [ - 0.7, - 1, - 1, - 0.65, - 0.25, - 0, - 0.05, - -0.05, - 0, - -0.05, - -0.15, - -0.35, - -0.65, - -1, - -0.45, - -0.15, - 0.15, - 0.4, - 0.5, - 0.5 - ] - } - } - ] - }, - { - "module": "eyebrow", - "name": "eyebrow_right", - "canvas": { - "x": -0.20071684587813615, - "y": -0.6989247311827956, - "width": 0.22470495672698665, - "height": 0.185051140833989, - "rotation": 0 - }, - "dofs": [ - { - "name": "left_vertical" - }, - { - "name": "right_vertical" - }, - { - "name": "rotation", - "servo": { - "pin": "4", - "mid": "1550", - "min": "300", - "max": "-300" - }, - "mapping": { - "neutral": "0", - "poly": [ - -0.3, - -0.5, - -0.7, - -0.5, - -0.15, - 0.15, - 0.45, - 0.7, - 1, - 0.65, - 0.35, - 0, - -0.25, - -0.5, - -0.5, - -0.45, - -0.75, - -1, - -0.7, - -0.25 - ] - } - } - ] - } - ] -} diff --git a/src/opsoro/data/configurator/ono.conf b/src/opsoro/data/configurator/ono.conf deleted file mode 100644 index 7d10c6d..0000000 --- a/src/opsoro/data/configurator/ono.conf +++ /dev/null @@ -1,346 +0,0 @@ -name: Ono -skin: robo -modules: - - module: eye - name: right_eye - canvas: - x: -0.2 - y: -0.5 - width: 0.2 - height: 0.2 - rotation: 0 - dofs: - - name: horizontal - servo: - pin: 3 - mid: 1700 - min: -350 - max: +350 - - name: vertical - servo: - pin: 2 - mid: 1525 - min: +350 - max: -350 - - name: lid - servo: - pin: 4 - mid: 1500 - min: +300 - max: -350 - mapping: - neutral: 0.5 - poly: - # Alpha:Pos - - 0.50 - - 0.50 - - 0.50 - - 0.50 - - 0.50 - - 0.80 - - 0.80 - - 0.80 - - 0.50 - - 0.50 - - 0.50 - - 0.40 - - 0.40 - - 0.40 - - 0.25 - - 0.25 - - 0.50 - - 0.50 - - 0.50 - - 0.50 - - - module: eye - name: left_eye - canvas: - x: 0.2 - y: -0.5 - width: 0.2 - height: 0.2 - rotation: 0 - dofs: - - name: horizontal - servo: - pin: 13 - mid: 1550 - min: -350 - max: +350 - - name: vertical - servo: - pin: 12 - mid: 1525 - min: -350 - max: +350 - - name: lid - servo: - pin: 11 - mid: 1525 - min: -300 - max: +350 - mapping: - neutral: 0.5 - poly: - # Alpha:Pos - - 0.50 - - 0.50 - - 0.50 - - 0.50 - - 0.50 - - 0.80 - - 0.80 - - 0.80 - - 0.50 - - 0.50 - - 0.50 - - 0.40 - - 0.40 - - 0.40 - - 0.25 - - 0.25 - - 0.50 - - 0.50 - - 0.50 - - 0.50 - - - module: mouth - name: mouth - canvas: - x: 0.0 - y: -0.2 - width: 0.5 - height: 0.2 - rotation: 10 - dofs: - - name: left - servo: - pin: 5 - mid: 1550 - min: +400 - max: -300 - mapping: - neutral: 0.2 - poly: - # Alpha:Pos - - 0.50 - - 0.70 - - 0.70 - - 0.40 - - 0.0 - - 0.0 - - -0.50 - - -0.50 - - -0.50 - - -0.50 - - -0.50 - - -1.0 - - -1.0 - - -0.25 - - -0.25 - - 0.25 - - 0.25 - - 0.50 - - 0.50 - - 0.50 - - name: mid - servo: - pin: 6 - mid: 1525 - min: +400 - max: -250 - mapping: - neutral: 0.5 - poly: - # Alpha:Pos - - 1.0 - - 0.50 - - -1.0 - - -1.0 - - -0.50 - - -1.0 - - -0.80 - - -0.80 - - -0.80 - - 0.50 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - name: right - servo: - pin: 7 - mid: 1600 - min: -400 - max: +300 - mapping: - neutral: 0.2 - poly: - # Alpha:Pos - - 0.50 - - 0.70 - - 0.70 - - 0.40 - - 0.0 - - 0.0 - - -0.50 - - -0.50 - - -0.50 - - -0.50 - - -0.50 - - -1.0 - - -1.0 - - -0.25 - - -0.25 - - 0.25 - - 0.25 - - 0.50 - - 0.50 - - 0.50 - - - module: eyebrow - name: right_eyebrow - canvas: - x: -0.2 - y: -0.7 - width: 0.3 - height: 0.2 - rotation: -20 - dofs: - - name: inner - servo: - pin: 0 - mid: 1625 - min: +200 - max: -300 - mapping: - neutral: 0.0 - poly: - # Alpha:Pos - - 0.25 - - 0.50 - - 0.70 - - 0.70 - - 0.70 - - 0.70 - - 0.50 - - 0.25 - - -0.50 - - -0.50 - - -0.25 - - 0.25 - - 0.25 - - -0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.50 - - name: outer - servo: - pin: 1 - mid: 1625 - min: -200 - max: +250 - mapping: - neutral: 0.0 - poly: - # Alpha:Pos - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - -0.25 - - -0.50 - - -0.25 - - -0.25 - - -0.25 - - -0.25 - - 0.0 - - 0.25 - - 0.25 - - - module: eyebrow - name: left_eyebrow - canvas: - x: 0.2 - y: -0.7 - width: 0.3 - height: 0.2 - rotation: 30 - dofs: - - name: inner - servo: - pin: 14 - mid: 1525 - min: -200 - max: +300 - mapping: - neutral: 0.0 - poly: - # Alpha:Pos - - 0.25 - - 0.50 - - 0.70 - - 0.70 - - 0.70 - - 0.70 - - 0.50 - - 0.25 - - -0.50 - - -0.50 - - -0.25 - - 0.25 - - 0.25 - - -0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.50 - - name: outer - servo: - pin: 15 - mid: 1550 - min: +200 - max: -250 - mapping: - neutral: 0.0 - poly: - # Alpha:Pos - - 0.0 - - 0.0 - - 0.0 - - 0.0 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - 0.25 - - -0.25 - - -0.50 - - -0.25 - - -0.25 - - -0.25 - - -0.25 - - 0.0 - - 0.25 - - 0.25 diff --git a/src/opsoro/data/expression_configurator/basic.conf b/src/opsoro/data/expression_configurator/basic.conf new file mode 100644 index 0000000..2f8fd77 --- /dev/null +++ b/src/opsoro/data/expression_configurator/basic.conf @@ -0,0 +1,252 @@ +[ + { + "name": "neutral", + "filename": "1f610", + "dofs": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "name": "happy", + "filename": "1f642", + "dofs": [ + 0, + 0, + 1, + 0, + -0.5, + 0.5, + 0, + 0, + 0, + 0, + -0.47, + 0.5, + 0, + 1, + 0, + 0 + ], + "poly": 1 + }, + { + "name": "laughing", + "filename": "1f603", + "dofs": [ + 0, + 0, + 0.65, + 0, + -0.5, + "1", + 0, + 0, + 0, + 0, + "-1", + 0.5, + 0, + 0.65, + 0, + 0 + ], + "poly": 3 + }, + { + "name": "surprised", + "filename": "1f62f", + "dofs": [ + -0.6, + 0, + 0, + 0, + 0.15, + "1", + 0, + 0, + 0, + 0, + "1", + -0.15, + 0, + 0, + 0, + 0.6 + ], + "poly": 5 + }, + { + "name": "afraid", + "filename": "1f616", + "dofs": [ + 0, + 0, + -0.05, + 0, + 0.7, + 0, + 0, + 0, + 0, + 0, + 0, + -0.7, + 0, + -0.05, + 0, + 0 + ], + "poly": 7 + }, + { + "name": "angry", + "filename": "1f620", + "dofs": [ + 0, + -0.3, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + -1, + 0, + 0, + -0.3, + 0 + ], + "poly": 8 + }, + { + "name": "disgusted", + "filename": "1f623", + "dofs": [ + 0, + -0.7, + -0.15, + 0, + 0.35, + 0, + 0, + 0, + 0, + 0, + 0, + -0.35, + 0, + -0.15, + -0.7, + 0 + ], + "poly": 10 + }, + { + "name": "sad", + "filename": "1f641", + "dofs": [ + 0, + -0.5, + -0.35, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.35, + -0.5, + 0 + ], + "poly": 11 + }, + { + "name": "tired", + "filename": "1f614", + "dofs": [ + 0, + 0, + -0.15, + 0, + -0.45, + 0, + 0, + 0, + 0, + 0, + 0, + 0.45, + 0, + -0.15, + 0, + 0 + ], + "poly": 15 + }, + { + "name": "sleep", + "filename": "1f634", + "dofs": [ + 0, + 0, + -1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -1, + 0, + 0 + ] + }, + { + "name": "Tong", + "filename": "1f60b", + "dofs": [ + "-1", + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + } +] \ No newline at end of file diff --git a/src/opsoro/data/expression_configurator/robot_expressions.conf b/src/opsoro/data/expression_configurator/robot_expressions.conf new file mode 100644 index 0000000..ab45ae0 --- /dev/null +++ b/src/opsoro/data/expression_configurator/robot_expressions.conf @@ -0,0 +1,108 @@ +[ + { + "name": "neutral", + "filename": "1f610", + "dofs": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "name": "happy", + "filename": "1f642", + "poly": 1 + }, + { + "name": "laughing", + "filename": "1f603", + "poly": 3 + }, + { + "name": "surprised", + "filename": "1f62f", + "poly": 5 + }, + { + "name": "afraid", + "filename": "1f616", + "poly": 7 + }, + { + "name": "angry", + "filename": "1f620", + "poly": 8 + }, + { + "name": "disgusted", + "filename": "1f623", + "poly": 10 + }, + { + "name": "sad", + "filename": "1f641", + "poly": 11 + }, + { + "name": "tired", + "filename": "1f614", + "poly": 15 + }, + { + "name": "sleep", + "filename": "1f634", + "dofs": [ + 0, + 0, + -1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -1, + 0, + 0 + ] + }, + { + "name": "Tong", + "filename": "1f60b", + "dofs": [ + "-1", + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + } +] \ No newline at end of file diff --git a/src/opsoro/data/lua_scripting/scripts/AnimateExample.lua b/src/opsoro/data/lua_scripting/AnimateExample.lua similarity index 100% rename from src/opsoro/data/lua_scripting/scripts/AnimateExample.lua rename to src/opsoro/data/lua_scripting/AnimateExample.lua diff --git a/src/opsoro/data/lua_scripting/scripts/CanvasPitch.lua b/src/opsoro/data/lua_scripting/CanvasPitch.lua similarity index 95% rename from src/opsoro/data/lua_scripting/scripts/CanvasPitch.lua rename to src/opsoro/data/lua_scripting/CanvasPitch.lua index 944f65e..b88c6e9 100644 --- a/src/opsoro/data/lua_scripting/scripts/CanvasPitch.lua +++ b/src/opsoro/data/lua_scripting/CanvasPitch.lua @@ -35,8 +35,8 @@ function setup() Sound:say_tts("But usually I'm very happy!", true) -- Initialize hardware and expressions - Hardware:servo_init() - Hardware:servo_neutral() + Hardware.Servo:init() + Hardware.Servo:neutral() Expression.dofs.r_e_lid.add_overlay(blink_overlay) Expression.dofs.l_e_lid.add_overlay(blink_overlay) @@ -44,7 +44,7 @@ function setup() Expression:set_emotion_r_phi(1.0, 15, true, 1.5) Expression.update() - Hardware:servo_enable() + Hardware.Servo:enable() -- Run demo scenario lipsync("Hello, my name is Ono", 1.6, {0.1, 0.45, 0.8}) @@ -101,5 +101,5 @@ end function quit() -- Called when the script is stopped - Hardware:servo_disable() + Hardware.Servo:disable() end diff --git a/src/opsoro/data/lua_scripting/scripts/EdgeHue.lua b/src/opsoro/data/lua_scripting/EdgeHue.lua similarity index 78% rename from src/opsoro/data/lua_scripting/scripts/EdgeHue.lua rename to src/opsoro/data/lua_scripting/EdgeHue.lua index b790c4f..b830e46 100644 --- a/src/opsoro/data/lua_scripting/scripts/EdgeHue.lua +++ b/src/opsoro/data/lua_scripting/EdgeHue.lua @@ -7,8 +7,8 @@ function setup() UI:init() UI:add_key("up") UI:add_key("down") - Hardware:neo_init(8) - Hardware:neo_set_brightness(50) + Hardware.Neopixel:init(8) + Hardware.Neopixel:set_brightness(50) end function loop() @@ -34,12 +34,12 @@ end function change_color() local hue = math.floor(map(hue_pos, 0, 20, 0, 255)) --local hue = 30 - Hardware:neo_set_all_hsv(hue, 255, 255) - Hardware:neo_show() + Hardware.Neopixel:set_all_hsv(hue, 255, 255) + Hardware.Neopixel:show() end function quit() -- Called when the script is stopped - Hardware:neo_set_all(0, 0, 0) - Hardware:neo_show() + Hardware.Neopixel:set_all(0, 0, 0) + Hardware.Neopixel:show() end diff --git a/src/opsoro/data/lua_scripting/EmotionButton.lua b/src/opsoro/data/lua_scripting/EmotionButton.lua new file mode 100644 index 0000000..e8b27e4 --- /dev/null +++ b/src/opsoro/data/lua_scripting/EmotionButton.lua @@ -0,0 +1,24 @@ +function setup() + Hardware.Servo:init() + Hardware.Servo:enable() + + Expression:set_emotion_r_phi(0.0, 0.00) + Expression:update() +end + +function loop() + if Hardware.Analog:read_channel(1) > 1000 then + Expression:set_emotion_r_phi(1.0, 20, true) + Expression:update() + sleep(0.5) + end + if Hardware.Analog:read_channel(0) > 1000 then + Expression:set_emotion_r_phi(1.0, 200, true) + Expression:update() + sleep(0.5) + end +end + +function quit() + Hardware.Servo:disable() +end diff --git a/src/opsoro/data/lua_scripting/scripts/EyeButton.lua b/src/opsoro/data/lua_scripting/EyeButton.lua similarity index 87% rename from src/opsoro/data/lua_scripting/scripts/EyeButton.lua rename to src/opsoro/data/lua_scripting/EyeButton.lua index 1eff788..96f18fd 100644 --- a/src/opsoro/data/lua_scripting/scripts/EyeButton.lua +++ b/src/opsoro/data/lua_scripting/EyeButton.lua @@ -10,16 +10,16 @@ function setup() UI:init() UI:add_key("left") UI:add_key("right") - - Hardware:servo_init() - Hardware:servo_neutral() + + Hardware.Servo:init() + Hardware.Servo:neutral() Expression.dofs.r_e_hor.add_overlay(eye_overlay) Expression.dofs.l_e_hor.add_overlay(eye_overlay) Expression:set_emotion_r_phi(1.0, 15, true, 1.5) - + Expression.update() - Hardware:servo_enable() + Hardware.Servo:enable() end function loop() @@ -38,5 +38,5 @@ end function quit() -- Called when the script is stopped - Hardware:servo_disable() + Hardware.Servo:disable() end diff --git a/src/opsoro/data/lua_scripting/scripts/HRI2016.lua b/src/opsoro/data/lua_scripting/HRI2016.lua similarity index 95% rename from src/opsoro/data/lua_scripting/scripts/HRI2016.lua rename to src/opsoro/data/lua_scripting/HRI2016.lua index 610864d..cc382eb 100644 --- a/src/opsoro/data/lua_scripting/scripts/HRI2016.lua +++ b/src/opsoro/data/lua_scripting/HRI2016.lua @@ -35,8 +35,8 @@ function setup() Sound:say_tts("But usually I'm very happy!", true) -- Initialize hardware and expressions - Hardware:servo_init() - Hardware:servo_neutral() + Hardware.Servo:init() + Hardware.Servo:neutral() Expression.dofs.r_e_lid.add_overlay(blink_overlay) Expression.dofs.l_e_lid.add_overlay(blink_overlay) @@ -44,7 +44,7 @@ function setup() Expression:set_emotion_r_phi(1.0, 15, true, 1.5) Expression.update() - Hardware:servo_enable() + Hardware.Servo:enable() -- Run demo scenario while true do @@ -102,5 +102,5 @@ end function quit() -- Called when the script is stopped - Hardware:servo_disable() + Hardware.Servo:disable() end diff --git a/src/opsoro/data/lua_scripting/scripts/HRI2016b.lua b/src/opsoro/data/lua_scripting/HRI2016b.lua similarity index 95% rename from src/opsoro/data/lua_scripting/scripts/HRI2016b.lua rename to src/opsoro/data/lua_scripting/HRI2016b.lua index 610864d..cc382eb 100644 --- a/src/opsoro/data/lua_scripting/scripts/HRI2016b.lua +++ b/src/opsoro/data/lua_scripting/HRI2016b.lua @@ -35,8 +35,8 @@ function setup() Sound:say_tts("But usually I'm very happy!", true) -- Initialize hardware and expressions - Hardware:servo_init() - Hardware:servo_neutral() + Hardware.Servo:init() + Hardware.Servo:neutral() Expression.dofs.r_e_lid.add_overlay(blink_overlay) Expression.dofs.l_e_lid.add_overlay(blink_overlay) @@ -44,7 +44,7 @@ function setup() Expression:set_emotion_r_phi(1.0, 15, true, 1.5) Expression.update() - Hardware:servo_enable() + Hardware.Servo:enable() -- Run demo scenario while true do @@ -102,5 +102,5 @@ end function quit() -- Called when the script is stopped - Hardware:servo_disable() + Hardware.Servo:disable() end diff --git a/src/opsoro/data/lua_scripting/scripts/HelloWorld.lua b/src/opsoro/data/lua_scripting/HelloWorld.lua similarity index 100% rename from src/opsoro/data/lua_scripting/scripts/HelloWorld.lua rename to src/opsoro/data/lua_scripting/HelloWorld.lua diff --git a/src/opsoro/data/lua_scripting/scripts/LedToggle.lua b/src/opsoro/data/lua_scripting/LedToggle.lua similarity index 100% rename from src/opsoro/data/lua_scripting/scripts/LedToggle.lua rename to src/opsoro/data/lua_scripting/LedToggle.lua diff --git a/src/opsoro/data/lua_scripting/NeoBlink.lua b/src/opsoro/data/lua_scripting/NeoBlink.lua new file mode 100644 index 0000000..0fda62d --- /dev/null +++ b/src/opsoro/data/lua_scripting/NeoBlink.lua @@ -0,0 +1,21 @@ +function setup() + -- Called once, when the script is started + print("Starting NeoBlink...") + Hardware.Neopixel:init(8) +end + +function loop() + -- Called repeatedly, put your main program here + Hardware.Neopixel:set_all(75, 75, 0) + Hardware.Neopixel:show() + sleep(1) + Hardware.Neopixel:set_all(0, 75, 75) + Hardware.Neopixel:show() + sleep(1) +end + +function quit() + -- Called when the script is stopped + Hardware.Neopixel:set_all(0, 0, 0) + Hardware.Neopixel:show() +end diff --git a/src/opsoro/data/lua_scripting/NeoButtons.lua b/src/opsoro/data/lua_scripting/NeoButtons.lua new file mode 100644 index 0000000..228db9b --- /dev/null +++ b/src/opsoro/data/lua_scripting/NeoButtons.lua @@ -0,0 +1,47 @@ +function setup() + -- Called once, when the script is started + UI:init() + + UI:add_button("hello", "Hello!", "fa-hand-spock-o", false) + UI:add_button("light", "Light!", "fa-lightbulb-o", false) + + UI:add_key("up") + UI:add_key("down") + UI:add_key("left") + UI:add_key("right") + + Hardware:Neopixel:init(8) + Hardware:Neopixel:set_all(0, 0, 0) + Hardware:Neopixel:show() +end + +function loop() + -- Called repeatedly, put your main program here + if UI:is_key_pressed("up") then + Hardware:Neopixel:set_pixel(0, 75, 0, 0) + else + Hardware:Neopixel:set_pixel(0, 0, 0, 0) + end + if UI:is_key_pressed("down") then + Hardware:Neopixel:set_pixel(1, 75, 75, 0) + else + Hardware:Neopixel:set_pixel(1, 0, 0, 0) + end + if UI:is_key_pressed("left") then + Hardware:Neopixel:set_pixel(2, 0, 75, 0) + else + Hardware:Neopixel:set_pixel(2, 0, 0, 0) + end + if UI:is_key_pressed("right") then + Hardware:Neopixel:set_pixel(3, 0, 75, 75) + else + Hardware:Neopixel:set_pixel(3, 0, 0, 0) + end + Hardware:Neopixel:show() +end + +function quit() + -- Called when the script is stopped + Hardware:Neopixel:set_all(0, 0, 0) + Hardware:Neopixel:show() +end diff --git a/src/opsoro/data/lua_scripting/NeoKeypad.lua b/src/opsoro/data/lua_scripting/NeoKeypad.lua new file mode 100644 index 0000000..0c7f444 --- /dev/null +++ b/src/opsoro/data/lua_scripting/NeoKeypad.lua @@ -0,0 +1,31 @@ +require "bit32" + +num_pixels = 8 +num_electrodes = 12 + +function setup() + -- Called once, when the script is started + print("Starting NeoPixel Keypad...") + Hardware.Neopixel:init(num_pixels) + Hardware.Capacitive:init(num_electrodes) +end + +function loop() + -- Called repeatedly, put your main program here + local touchData = Hardware.Capacitive:get_touched() + + Hardware.Neopixel:set_all(0, 0, 0) + + for i=0,7 do + if bit32.extract(touchData, i) > 0 then + Hardware.Neopixel:set_pixel(i, 75, 75, 0) + end + end + Hardware.Neopixel:show() +end + +function quit() + -- Called when the script is stopped + Hardware.Neopixel:set_all(0, 0, 0) + Hardware.Neopixel:show() +end diff --git a/src/opsoro/data/lua_scripting/scripts/ONA_testing_1_1.lua b/src/opsoro/data/lua_scripting/ONA_testing_1_1.lua similarity index 95% rename from src/opsoro/data/lua_scripting/scripts/ONA_testing_1_1.lua rename to src/opsoro/data/lua_scripting/ONA_testing_1_1.lua index e25c9b6..f8335c9 100644 --- a/src/opsoro/data/lua_scripting/scripts/ONA_testing_1_1.lua +++ b/src/opsoro/data/lua_scripting/ONA_testing_1_1.lua @@ -35,8 +35,8 @@ function setup() Sound:say_tts("I'm very happy today!", true) -- Initialize hardware and expressions - Hardware:servo_init() - Hardware:servo_neutral() + Hardware:Servo:init() + Hardware:Servo:neutral() Expression.dofs.r_e_lid.add_overlay(blink_overlay) Expression.dofs.l_e_lid.add_overlay(blink_overlay) @@ -44,7 +44,7 @@ function setup() Expression:set_emotion_r_phi(1.0, 15, true, 1.5) Expression.update() - Hardware:servo_enable() + Hardware:Servo:enable() -- Run demo scenario lipsync("Hello, my name is Lola", 1.6, {0.1, 0.45, 0.8}) @@ -100,5 +100,5 @@ end function quit() -- Called when the script is stopped - Hardware:servo_disable() + Hardware:Servo:disable() end \ No newline at end of file diff --git a/src/opsoro/data/lua_scripting/scripts/introduction.lua b/src/opsoro/data/lua_scripting/introduction.lua similarity index 95% rename from src/opsoro/data/lua_scripting/scripts/introduction.lua rename to src/opsoro/data/lua_scripting/introduction.lua index 349e93e..e62db85 100644 --- a/src/opsoro/data/lua_scripting/scripts/introduction.lua +++ b/src/opsoro/data/lua_scripting/introduction.lua @@ -35,8 +35,8 @@ function setup() Sound:say_tts("But usually I'm very happy!", true) -- Initialize hardware and expressions - Hardware:servo_init() - Hardware:servo_neutral() + Hardware:Servo:init() + Hardware:Servo:neutral() Expression.dofs.r_e_lid.add_overlay(blink_overlay) Expression.dofs.l_e_lid.add_overlay(blink_overlay) @@ -44,7 +44,7 @@ function setup() Expression:set_emotion_r_phi(1.0, 15, true, 1.5) Expression.update() - Hardware:servo_enable() + Hardware:Servo:enable() -- Run demo scenario lipsync("Hello, my name is Ono", 1.6, {0.1, 0.45, 0.8}) @@ -100,5 +100,5 @@ end function quit() -- Called when the script is stopped - Hardware:servo_disable() + Hardware:Servo:disable() end diff --git a/src/opsoro/data/lua_scripting/scripts/EmotionButton.lua b/src/opsoro/data/lua_scripting/scripts/EmotionButton.lua deleted file mode 100644 index 2cad284..0000000 --- a/src/opsoro/data/lua_scripting/scripts/EmotionButton.lua +++ /dev/null @@ -1,24 +0,0 @@ -function setup() - Hardware:servo_init() - Hardware:servo_enable() - - Expression:set_emotion_r_phi(0.0, 0.00) - Expression:update() -end - -function loop() - if Hardware:ana_read_channel(1) > 1000 then - Expression:set_emotion_r_phi(1.0, 20, true) - Expression:update() - sleep(0.5) - end - if Hardware:ana_read_channel(0) > 1000 then - Expression:set_emotion_r_phi(1.0, 200, true) - Expression:update() - sleep(0.5) - end -end - -function quit() - Hardware:servo_disable() -end diff --git a/src/opsoro/data/lua_scripting/scripts/NeoBlink.lua b/src/opsoro/data/lua_scripting/scripts/NeoBlink.lua deleted file mode 100644 index c4d51f3..0000000 --- a/src/opsoro/data/lua_scripting/scripts/NeoBlink.lua +++ /dev/null @@ -1,21 +0,0 @@ -function setup() - -- Called once, when the script is started - print("Starting NeoBlink...") - Hardware.neo_init(8) -end - -function loop() - -- Called repeatedly, put your main program here - Hardware.neo_set_all(75, 75, 0) - Hardware.neo_show() - sleep(1) - Hardware.neo_set_all(0, 75, 75) - Hardware.neo_show() - sleep(1) -end - -function quit() - -- Called when the script is stopped - Hardware.neo_set_all(0, 0, 0) - Hardware.neo_show() -end diff --git a/src/opsoro/data/lua_scripting/scripts/NeoButtons.lua b/src/opsoro/data/lua_scripting/scripts/NeoButtons.lua deleted file mode 100644 index ad90a0b..0000000 --- a/src/opsoro/data/lua_scripting/scripts/NeoButtons.lua +++ /dev/null @@ -1,47 +0,0 @@ -function setup() - -- Called once, when the script is started - UI:init() - - UI:add_button("hello", "Hello!", "fa-hand-spock-o", false) - UI:add_button("light", "Light!", "fa-lightbulb-o", false) - - UI:add_key("up") - UI:add_key("down") - UI:add_key("left") - UI:add_key("right") - - Hardware:neo_init(8) - Hardware:neo_set_all(0, 0, 0) - Hardware:neo_show() -end - -function loop() - -- Called repeatedly, put your main program here - if UI:is_key_pressed("up") then - Hardware:neo_set_pixel(0, 75, 0, 0) - else - Hardware:neo_set_pixel(0, 0, 0, 0) - end - if UI:is_key_pressed("down") then - Hardware:neo_set_pixel(1, 75, 75, 0) - else - Hardware:neo_set_pixel(1, 0, 0, 0) - end - if UI:is_key_pressed("left") then - Hardware:neo_set_pixel(2, 0, 75, 0) - else - Hardware:neo_set_pixel(2, 0, 0, 0) - end - if UI:is_key_pressed("right") then - Hardware:neo_set_pixel(3, 0, 75, 75) - else - Hardware:neo_set_pixel(3, 0, 0, 0) - end - Hardware:neo_show() -end - -function quit() - -- Called when the script is stopped - Hardware:neo_set_all(0, 0, 0) - Hardware:neo_show() -end diff --git a/src/opsoro/data/lua_scripting/scripts/NeoKeypad.lua b/src/opsoro/data/lua_scripting/scripts/NeoKeypad.lua deleted file mode 100644 index eff1464..0000000 --- a/src/opsoro/data/lua_scripting/scripts/NeoKeypad.lua +++ /dev/null @@ -1,31 +0,0 @@ -require "bit32" - -num_pixels = 8 -num_electrodes = 12 - -function setup() - -- Called once, when the script is started - print("Starting NeoPixel Keypad...") - Hardware:neo_init(num_pixels) - Hardware:cap_init(num_electrodes) -end - -function loop() - -- Called repeatedly, put your main program here - local touchData = Hardware:cap_get_touched() - - Hardware:neo_set_all(0, 0, 0) - - for i=0,7 do - if bit32.extract(touchData, i) > 0 then - Hardware:neo_set_pixel(i, 75, 75, 0) - end - end - Hardware:neo_show() -end - -function quit() - -- Called when the script is stopped - Hardware:neo_set_all(0, 0, 0) - Hardware:neo_show() -end diff --git a/src/opsoro/data/lua_scripting/scripts/old/qsddsqfdssqdf.lua b/src/opsoro/data/lua_scripting/scripts/old/qsddsqfdssqdf.lua deleted file mode 100644 index fce7011..0000000 --- a/src/opsoro/data/lua_scripting/scripts/old/qsddsqfdssqdf.lua +++ /dev/null @@ -1,22 +0,0 @@ -function setup() - -- Called once, when the script is started - UI:init() - UI:add_button("hello", "Hello!", "fa-hand-spock-o", false) - UI:add_button("light", "Light!", "fa-lightbulb-o", false) - UI:add_key("down") - UI:add_key("x") - UI:add_key("space") - Hardware:cap_init(8) -end - -function loop() - -- Called repeatedly, put your main program here - if rising_edge("space", UI:is_key_pressed("space")) then - print("E0: " .. Hardware:cap_get_baseline_data(5)) - end -end - -function quit() - -- Called when the script is stopped - -end diff --git a/src/opsoro/data/lua_scripting/scripts/step0.lua b/src/opsoro/data/lua_scripting/step0.lua similarity index 100% rename from src/opsoro/data/lua_scripting/scripts/step0.lua rename to src/opsoro/data/lua_scripting/step0.lua diff --git a/src/opsoro/data/lua_scripting/scripts/step1.lua b/src/opsoro/data/lua_scripting/step1.lua similarity index 100% rename from src/opsoro/data/lua_scripting/scripts/step1.lua rename to src/opsoro/data/lua_scripting/step1.lua diff --git a/src/opsoro/data/lua_scripting/scripts/step10.lua b/src/opsoro/data/lua_scripting/step10.lua similarity index 85% rename from src/opsoro/data/lua_scripting/scripts/step10.lua rename to src/opsoro/data/lua_scripting/step10.lua index ea8a577..71129ff 100644 --- a/src/opsoro/data/lua_scripting/scripts/step10.lua +++ b/src/opsoro/data/lua_scripting/step10.lua @@ -4,13 +4,13 @@ function setup() UI:add_key("up") UI:add_key("down") - Hardware:servo_init() - Hardware:servo_neutral() + Hardware.Servo:init() + Hardware.Servo:neutral() Expression:set_emotion_val_ar(0.0, 0.0) Expression.update() - Hardware:servo_enable() + Hardware.Servo:enable() end function loop() @@ -30,5 +30,5 @@ end function quit() -- Called when the script is stopped - Hardware:servo_disable() + Hardware.Servo:disable() end diff --git a/src/opsoro/data/lua_scripting/scripts/step11.lua b/src/opsoro/data/lua_scripting/step11.lua similarity index 85% rename from src/opsoro/data/lua_scripting/scripts/step11.lua rename to src/opsoro/data/lua_scripting/step11.lua index a91e024..edf181c 100644 --- a/src/opsoro/data/lua_scripting/scripts/step11.lua +++ b/src/opsoro/data/lua_scripting/step11.lua @@ -4,13 +4,13 @@ function setup() UI:add_key("up") UI:add_key("down") - Hardware:servo_init() - Hardware:servo_neutral() + Hardware:Servo:init() + Hardware:Servo:neutral() Expression:set_emotion_val_ar(0.0, 0.0) Expression.update() - Hardware:servo_enable() + Hardware:Servo:enable() end function loop() @@ -30,5 +30,5 @@ end function quit() -- Called when the script is stopped - Hardware:servo_disable() + Hardware:Servo:disable() end diff --git a/src/opsoro/data/lua_scripting/scripts/step2.lua b/src/opsoro/data/lua_scripting/step2.lua similarity index 100% rename from src/opsoro/data/lua_scripting/scripts/step2.lua rename to src/opsoro/data/lua_scripting/step2.lua diff --git a/src/opsoro/data/lua_scripting/scripts/step3.lua b/src/opsoro/data/lua_scripting/step3.lua similarity index 100% rename from src/opsoro/data/lua_scripting/scripts/step3.lua rename to src/opsoro/data/lua_scripting/step3.lua diff --git a/src/opsoro/data/lua_scripting/scripts/step4.lua b/src/opsoro/data/lua_scripting/step4.lua similarity index 100% rename from src/opsoro/data/lua_scripting/scripts/step4.lua rename to src/opsoro/data/lua_scripting/step4.lua diff --git a/src/opsoro/data/lua_scripting/scripts/step5.lua b/src/opsoro/data/lua_scripting/step5.lua similarity index 100% rename from src/opsoro/data/lua_scripting/scripts/step5.lua rename to src/opsoro/data/lua_scripting/step5.lua diff --git a/src/opsoro/data/lua_scripting/scripts/step6.lua b/src/opsoro/data/lua_scripting/step6.lua similarity index 100% rename from src/opsoro/data/lua_scripting/scripts/step6.lua rename to src/opsoro/data/lua_scripting/step6.lua diff --git a/src/opsoro/data/lua_scripting/scripts/step7.lua b/src/opsoro/data/lua_scripting/step7.lua similarity index 100% rename from src/opsoro/data/lua_scripting/scripts/step7.lua rename to src/opsoro/data/lua_scripting/step7.lua diff --git a/src/opsoro/data/lua_scripting/scripts/step8.lua b/src/opsoro/data/lua_scripting/step8.lua similarity index 100% rename from src/opsoro/data/lua_scripting/scripts/step8.lua rename to src/opsoro/data/lua_scripting/step8.lua diff --git a/src/opsoro/data/lua_scripting/scripts/step9.lua b/src/opsoro/data/lua_scripting/step9.lua similarity index 100% rename from src/opsoro/data/lua_scripting/scripts/step9.lua rename to src/opsoro/data/lua_scripting/step9.lua diff --git a/src/opsoro/data/robot_configurator/Ono.conf b/src/opsoro/data/robot_configurator/Ono.conf new file mode 100644 index 0000000..55195ed --- /dev/null +++ b/src/opsoro/data/robot_configurator/Ono.conf @@ -0,0 +1,96 @@ +{"modules": +[ +{"type": "turn", + "dofs": [{ + "servo": {"max": 300, "mid": "1525", "pin": 14, "min": -200}, + "name": "rotation", + "poly": [0.25, 0.50, 0.70, 0.70, 0.70, 0.70, 0.50, 0.25, -0.50, -0.50, -0.25, 0.25, 0.25, -0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.50]}], + "grid": {"y": 4, "x": 15, "rotation": 270}, + "name": "eyebrow left inner"}, + +{"type": "eye", + "dofs": [ + {"servo": {"max": 350, "mid": "1550", "pin": 13, "min": -350}, + "name": "horizontal", + "poly": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, + {"servo": {"max": 350, "mid": "1525", "pin": 12, "min": -350}, + "name": "vertical", + "poly": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, + {"servo": {"max": 350, "mid": "1225", "pin": 11, "min": -300}, + "name": "lid", + "poly": [ 0.50, 0.50, 0.50, 0.50, 0.50, 0.80, 0.80, 0.80, 0.50, 0.50, 0.50, 0.40, 0.40, 0.40, 0.25, 0.25, 0.50, 0.50, 0.50, 0.50]}], + "grid": {"y": 12, "x": 18, "rotation": 0}, + "name": "eye left"}, + +{"type": "eye", + "dofs": [ + {"servo": {"max": 350, "mid": "1700", "pin": 3, "min": -350}, + "name": "horizontal", + "poly": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, + {"servo": {"max": -350, "mid": "1525", "pin": 2, "min": 350}, + "name": "vertical", + "poly": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, + {"servo": {"max": -350, "mid": "1500", "pin": 4, "min": 300}, + "name": "lid", + "poly": [ 0.50, 0.50, 0.50, 0.50, 0.50, 0.80, 0.80, 0.80, 0.50, 0.50, 0.50, 0.40, 0.40, 0.40, 0.25, 0.25, 0.50, 0.50, 0.50, 0.50]}], + "grid": {"y": 12, "x": 7, "rotation": 0}, + "name": "eye right"}, + +{"type": "turn", + "dofs": [ + {"servo": {"max": 250, "mid": "1625", "pin": 1, "min": -200}, + "name": "rotation", + "poly": [ 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, -0.25, -0.50, -0.25, -0.25, -0.25, -0.25, 0.0, 0.25, 0.25]}], + "grid": {"y": 4, "x": 4, "rotation": 270}, + "name": "eyebrow right outer"}, + +{"type": "speaker", + "dofs": [], + "grid": {"y": 34, "x": 6, "rotation": 0}, + "name": "speaker"}, + +{"type": "heart", + "dofs": [], + "grid": {"y": 34, "x": 18, "rotation": 0}, + "name": "heart"}, + +{"grid": {"y": 4, "x": 10, "rotation": 270}, + "dofs": [ + {"poly": [ 0.25, 0.50, 0.70, 0.70, 0.70, 0.70, 0.50, 0.25, -0.50, -0.50, -0.25, 0.25, 0.25, -0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.50], + "name": "rotation", + "servo": {"max": -300, "mid": "1625", "pin": 0, "min": 200}}], + "type": "turn", + "name": "eyebrow right inner"}, + +{"grid": {"y": 4, "x": 21, "rotation": 270}, + "dofs": [ + {"poly": [0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, -0.25, -0.50, -0.25, -0.25, -0.25, -0.25, 0.0, 0.25, 0.25], + "name": "rotation", + "servo": {"max": -250, "mid": "1550", "pin": 15, "min": 200}}], + "type": "turn", + "name": "eyebrow left outer"}, + +{"grid": {"y": 21, "x": 6, "rotation": 180}, + "dofs": [ + {"poly": [0.50, 0.70, 0.70, 0.40, 0.0, 0.0, -0.50, -0.50, -0.50, -0.50, -0.50, -1.0, -1.0, -0.25, -0.25, 0.25, 0.25, 0.50, 0.50, 0.50], + "name": "rotation", + "servo": {"max": 300, "mid": "1600", "pin": 7, "min": -400}}], + "type": "turn", + "name": "mouth right"}, + +{"grid": {"y": 26, "x": 13, "rotation": 90}, + "dofs": [ + {"poly": [1.0, 0.50, -1.0, -1.0, -0.50, -1.0, -0.80, -0.80, -0.80, 0.50, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], + "name": "rotation", + "servo": {"max": -250, "mid": "1525", "pin": 6, "min": 400}}], + "type": "turn", + "name": "mouth middle"}, + +{"grid": {"y": 21, "x": 20, "rotation": 0}, + "dofs": [ + {"poly": [0.50, 0.70, 0.70, 0.40, 0.0, 0.0, -0.50, -0.50, -0.50, -0.50, -0.50, -1.0, -1.0, -0.25, -0.25, 0.25, 0.25, 0.50, 0.50, 0.50], + "name": "rotation", + "servo": {"max": -300, "mid": "1550", "pin": 5, "min": 400}}], + "type": "turn", + "name": "mouth left"}]} + diff --git a/src/opsoro/data/robot_configurator/basic.conf b/src/opsoro/data/robot_configurator/basic.conf new file mode 100644 index 0000000..143af91 --- /dev/null +++ b/src/opsoro/data/robot_configurator/basic.conf @@ -0,0 +1,389 @@ +{ + "modules": [ + { + "dofs": [ + { + "name": "rotation", + "poly": [ + 0.3, + 0.5, + 0.7, + 0.5, + 0.15, + -0.15, + -0.45, + -0.7, + -1, + -0.65, + -0.35, + 0, + 0.25, + 0.5, + 0.5, + 0.45, + 0.75, + 1, + 0.7, + 0.25 + ], + "servo": { + "max": -300, + "mid": "1500", + "min": 300, + "pin": 11 + } + } + ], + "grid": { + "rotation": 0, + "x": 19, + "y": 8 + }, + "name": "eyebrow left", + "type": "turn" + }, + { + "dofs": [ + { + "name": "horizontal", + "poly": [ + 0, + 0, + 0, + 0, + 0, + 0.6, + 0.4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.35, + -0.25, + 0, + 0 + ], + "servo": { + "max": -300, + "mid": "1500", + "min": 300, + "pin": 15 + } + }, + { + "name": "vertical", + "poly": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.3, + -0.5, + -0.7, + -0.5, + -0.4, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "servo": { + "max": 300, + "mid": "1500", + "min": -300, + "pin": 14 + } + }, + { + "name": "lid", + "poly": [ + 0.7, + 1, + 1, + 0.65, + 0.25, + 0, + 0.05, + -0.05, + 0, + -0.05, + -0.15, + -0.35, + -0.65, + -1, + -0.45, + -0.15, + 0.15, + 0.4, + 0.5, + 0.5 + ], + "servo": { + "max": 200, + "mid": "1500", + "min": -200, + "pin": 13 + } + } + ], + "grid": { + "rotation": 0, + "x": 8, + "y": 13 + }, + "name": "eye left", + "type": "eye" + }, + { + "dofs": [ + { + "name": "horizontal", + "poly": [ + 0, + 0, + 0, + 0, + 0, + -0.6, + -0.4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.35, + 0.25, + 0, + 0 + ], + "servo": { + "max": -300, + "mid": "1500", + "min": 300, + "pin": 0 + } + }, + { + "name": "vertical", + "poly": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.3, + -0.5, + -0.7, + -0.5, + -0.4, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "servo": { + "max": 300, + "mid": "1500", + "min": -300, + "pin": 1 + } + }, + { + "name": "lid", + "poly": [ + 0.7, + 1, + 1, + 0.65, + 0.25, + 0, + 0.05, + -0.05, + 0, + -0.05, + -0.15, + -0.35, + -0.65, + -1, + -0.45, + -0.15, + 0.15, + 0.4, + 0.5, + 0.5 + ], + "servo": { + "max": 200, + "mid": "1500", + "min": -200, + "pin": 2 + } + } + ], + "grid": { + "rotation": 0, + "x": 18, + "y": 13 + }, + "name": "eye right", + "type": "eye" + }, + { + "dofs": [ + { + "name": "rotation", + "poly": [ + -0.3, + -0.5, + -0.7, + -0.5, + -0.15, + 0.15, + 0.45, + 0.7, + 1, + 0.65, + 0.35, + 0, + -0.25, + -0.5, + -0.5, + -0.45, + -0.75, + -1, + -0.7, + -0.25 + ], + "servo": { + "max": -300, + "mid": "1500", + "min": 300, + "pin": 4 + } + } + ], + "grid": { + "rotation": 180, + "x": 7, + "y": 8 + }, + "name": "eyebrow right", + "type": "turn" + }, + { + "dofs": [], + "grid": { + "rotation": 0, + "x": 13, + "y": 28 + }, + "name": "speaker", + "type": "speaker" + }, + { + "dofs": [], + "grid": { + "rotation": 0, + "x": 14, + "y": 34 + }, + "name": "heart", + "type": "heart" + }, + { + "dofs": [ + { + "name": "rotation left", + "poly": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "servo": { + "max": 250, + "mid": 1500, + "min": -250, + "pin": 5 + } + }, + { + "name": "rotation right", + "poly": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "servo": { + "max": 250, + "mid": 1500, + "min": -250, + "pin": 10 + } + } + ], + "grid": { + "rotation": 0, + "x": 13, + "y": 22 + }, + "name": "mouth", + "type": "mouth" + } + ] +} \ No newline at end of file diff --git a/src/opsoro/data/robot_configurator/robot_config.conf b/src/opsoro/data/robot_configurator/robot_config.conf new file mode 100644 index 0000000..2f9b0d8 --- /dev/null +++ b/src/opsoro/data/robot_configurator/robot_config.conf @@ -0,0 +1,389 @@ +{ + "modules": [ + { + "name": "eyebrow left", + "type": "turn", + "grid": { + "x": 19, + "y": 11, + "rotation": 0 + }, + "dofs": [ + { + "name": "rotation", + "servo": { + "pin": 11, + "mid": "1500", + "min": 300, + "max": -300 + }, + "poly": [ + 0.3, + 0.5, + 0.7, + 0.5, + 0.15, + -0.15, + -0.45, + -0.7, + -1, + -0.65, + -0.35, + 0, + 0.25, + 0.5, + 0.5, + 0.45, + 0.75, + 1, + 0.7, + 0.25 + ] + } + ] + }, + { + "name": "eye left", + "type": "eye", + "grid": { + "x": 8, + "y": 16, + "rotation": 0 + }, + "dofs": [ + { + "name": "horizontal", + "servo": { + "pin": 15, + "mid": "1600", + "min": 300, + "max": -300 + }, + "poly": [ + 0, + 0, + 0, + 0, + 0, + 0.6, + 0.4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.35, + -0.25, + 0, + 0 + ] + }, + { + "name": "vertical", + "servo": { + "pin": 14, + "mid": "1500", + "min": -300, + "max": 300 + }, + "poly": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.3, + -0.5, + -0.7, + -0.5, + -0.4, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "name": "lid", + "servo": { + "pin": 13, + "mid": "1550", + "min": -200, + "max": 200 + }, + "poly": [ + 0.7, + 1, + 1, + 0.65, + 0.25, + 0, + 0.05, + -0.05, + 0, + -0.05, + -0.15, + -0.35, + -0.65, + -1, + -0.45, + -0.15, + 0.15, + 0.4, + 0.5, + 0.5 + ] + } + ] + }, + { + "name": "eye right", + "type": "eye", + "grid": { + "x": 18, + "y": 16, + "rotation": 0 + }, + "dofs": [ + { + "name": "horizontal", + "servo": { + "pin": 6, + "mid": "1605", + "min": 300, + "max": -300 + }, + "poly": [ + 0, + 0, + 0, + 0, + 0, + -0.6, + -0.4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.35, + 0.25, + 0, + 0 + ] + }, + { + "name": "vertical", + "servo": { + "pin": 1, + "mid": "1673", + "min": -300, + "max": 300 + }, + "poly": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.3, + -0.5, + -0.7, + -0.5, + -0.4, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "name": "lid", + "servo": { + "pin": 2, + "mid": "1700", + "min": -200, + "max": 200 + }, + "poly": [ + 0.7, + 1, + 1, + 0.65, + 0.25, + 0, + 0.05, + -0.05, + 0, + -0.05, + -0.15, + -0.35, + -0.65, + -1, + -0.45, + -0.15, + 0.15, + 0.4, + 0.5, + 0.5 + ] + } + ] + }, + { + "name": "eyebrow right", + "type": "turn", + "grid": { + "x": 7, + "y": 11, + "rotation": 180 + }, + "dofs": [ + { + "name": "rotation", + "servo": { + "pin": 4, + "mid": "1500", + "min": 300, + "max": -300 + }, + "poly": [ + -0.3, + -0.5, + -0.7, + -0.5, + -0.15, + 0.15, + 0.45, + 0.7, + 1, + 0.65, + 0.35, + 0, + -0.25, + -0.5, + -0.5, + -0.45, + -0.75, + -1, + -0.7, + -0.25 + ] + } + ] + }, + { + "name": "speaker", + "type": "speaker", + "grid": { + "x": 13, + "y": 28, + "rotation": 0 + }, + "dofs": [] + }, + { + "name": "heart", + "type": "heart", + "grid": { + "x": 14, + "y": 34, + "rotation": 0 + }, + "dofs": [] + }, + { + "name": "mouth", + "type": "mouth", + "grid": { + "x": 13, + "y": 22, + "rotation": 0 + }, + "dofs": [ + { + "name": "rotation left", + "servo": { + "pin": 0, + "mid": 1500, + "min": -250, + "max": 250 + }, + "poly": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "name": "rotation right", + "servo": { + "pin": 0, + "mid": 1500, + "min": -250, + "max": 250 + }, + "poly": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/opsoro/data/social_script/scripts/Boeva.soc b/src/opsoro/data/social_script/Boeva.soc similarity index 79% rename from src/opsoro/data/social_script/scripts/Boeva.soc rename to src/opsoro/data/social_script/Boeva.soc index e1681eb..d4d7b6e 100644 --- a/src/opsoro/data/social_script/scripts/Boeva.soc +++ b/src/opsoro/data/social_script/Boeva.soc @@ -1,42 +1,42 @@ { "voice_lines": [ { - "emotion": "Happy", + "emotion": "happy", "output": { "type": "tts", "data": "Hallo BoevaSkwat" } }, { - "emotion": "Wink", + "emotion": "neutral", "output": { "type": "tts", "data": "Hoe gaat het met jou ?" } }, { - "emotion": "Laughing", + "emotion": "laughing", "output": { "type": "tts", "data": "Hallo William" } }, { - "emotion": "Surprised", + "emotion": "surprised", "output": { "type": "wav", "data": "Woohoo.wav" } }, { - "emotion": "Happy", + "emotion": "happy", "output": { "type": "tts", "data": "Mijn naam is Ono ik ben een robot die iedereen zelf kan bouwen" } }, { - "emotion": "Surprised", + "emotion": "surprised", "output": { "type": "wav", "data": "Burp.wav" diff --git a/src/opsoro/data/social_script/Demo.soc b/src/opsoro/data/social_script/Demo.soc new file mode 100644 index 0000000..a723d84 --- /dev/null +++ b/src/opsoro/data/social_script/Demo.soc @@ -0,0 +1,46 @@ +{ + "voice_lines": [ + { + "emotion": "happy", + "output": { + "type": "tts", + "data": "HelloOOO" + } + }, + { + "emotion": "surprised", + "output": { + "type": "wav", + "data": "fart-01.wav" + } + }, + { + "emotion": "afraid", + "output": { + "type": "tts", + "data": "Ouch!" + } + }, + { + "emotion": "angry", + "output": { + "type": "wav", + "data": "smb3_jump.wav" + } + }, + { + "emotion": "disgusted", + "output": { + "type": "tts", + "data": "No!" + } + }, + { + "emotion": "sad", + "output": { + "type": "wav", + "data": "smb_vine.wav" + } + } + ] +} \ No newline at end of file diff --git a/src/opsoro/data/social_script/scripts/Marino.soc b/src/opsoro/data/social_script/Marino.soc similarity index 100% rename from src/opsoro/data/social_script/scripts/Marino.soc rename to src/opsoro/data/social_script/Marino.soc diff --git a/src/opsoro/data/social_script/scripts/Mathis_leren_luisteren.soc b/src/opsoro/data/social_script/Mathis_leren_luisteren.soc similarity index 100% rename from src/opsoro/data/social_script/scripts/Mathis_leren_luisteren.soc rename to src/opsoro/data/social_script/Mathis_leren_luisteren.soc diff --git a/src/opsoro/data/social_script/scripts/PresentingOno.soc b/src/opsoro/data/social_script/PresentingOno.soc similarity index 100% rename from src/opsoro/data/social_script/scripts/PresentingOno.soc rename to src/opsoro/data/social_script/PresentingOno.soc diff --git a/src/opsoro/data/social_script/scripts/Scenario_Easy-Difficult.soc b/src/opsoro/data/social_script/Scenario_Easy-Difficult.soc similarity index 100% rename from src/opsoro/data/social_script/scripts/Scenario_Easy-Difficult.soc rename to src/opsoro/data/social_script/Scenario_Easy-Difficult.soc diff --git a/src/opsoro/data/social_script/scripts/Test.soc b/src/opsoro/data/social_script/Test.soc similarity index 100% rename from src/opsoro/data/social_script/scripts/Test.soc rename to src/opsoro/data/social_script/Test.soc diff --git a/src/opsoro/data/social_script/scripts/Test_Psychotherapeut1.soc b/src/opsoro/data/social_script/Test_Psychotherapeut1.soc similarity index 100% rename from src/opsoro/data/social_script/scripts/Test_Psychotherapeut1.soc rename to src/opsoro/data/social_script/Test_Psychotherapeut1.soc diff --git a/src/opsoro/data/social_script/scripts/Test_test.soc b/src/opsoro/data/social_script/Test_test.soc similarity index 100% rename from src/opsoro/data/social_script/scripts/Test_test.soc rename to src/opsoro/data/social_script/Test_test.soc diff --git a/src/opsoro/data/social_script/basic.soc b/src/opsoro/data/social_script/basic.soc new file mode 100644 index 0000000..800f058 --- /dev/null +++ b/src/opsoro/data/social_script/basic.soc @@ -0,0 +1,46 @@ +{ + "voice_lines": [ + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "Hi guys, welcome back" + } + }, + { + "emotion": "happy", + "output": { + "type": "tts", + "data": "I'm feeling great today how about you?" + } + }, + { + "emotion": "surprised", + "output": { + "type": "wav", + "data": "fart-01.wav" + } + }, + { + "emotion": "afraid", + "output": { + "type": "tts", + "data": "Oh i'm sorry... Hi hi" + } + }, + { + "emotion": "happy", + "output": { + "type": "tts", + "data": "How are you all feeling today?" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "Oh that's nice to hear" + } + } + ] +} \ No newline at end of file diff --git a/src/opsoro/data/social_script/long.soc b/src/opsoro/data/social_script/long.soc new file mode 100644 index 0000000..ec35271 --- /dev/null +++ b/src/opsoro/data/social_script/long.soc @@ -0,0 +1,781 @@ +{ + "voice_lines": [ + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "happy", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "laughing", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + }, + { + "emotion": "neutral", + "output": { + "type": "tts", + "data": "" + } + } + ] +} \ No newline at end of file diff --git a/src/opsoro/data/social_script/scripts/Demo.soc b/src/opsoro/data/social_script/scripts/Demo.soc deleted file mode 100644 index ad64835..0000000 --- a/src/opsoro/data/social_script/scripts/Demo.soc +++ /dev/null @@ -1,46 +0,0 @@ -{ - "voice_lines": [ - { - "emotion": "Happy", - "output": { - "type": "tts", - "data": "Hello" - } - }, - { - "emotion": "Surprised", - "output": { - "type": "wav", - "data": "fart-01.wav" - } - }, - { - "emotion": "Afraid", - "output": { - "type": "tts", - "data": "Ouch!" - } - }, - { - "emotion": "Angry", - "output": { - "type": "wav", - "data": "smb3_jump.wav" - } - }, - { - "emotion": "Disgusted", - "output": { - "type": "tts", - "data": "No!" - } - }, - { - "emotion": "Sad", - "output": { - "type": "wav", - "data": "smb_vine.wav" - } - } - ] -} \ No newline at end of file diff --git a/src/opsoro/data/social_script/scripts/long.soc b/src/opsoro/data/social_script/scripts/long.soc deleted file mode 100644 index e514649..0000000 --- a/src/opsoro/data/social_script/scripts/long.soc +++ /dev/null @@ -1,781 +0,0 @@ -{ - "voice_lines": [ - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - }, - { - "emotion": "Neutral", - "output": { - "type": "tts", - "data": "" - } - } - ] -} \ No newline at end of file diff --git a/src/opsoro/data/visual_programming/scripts/Scenario_Cesar.xml.bak b/src/opsoro/data/visual_programming/scripts/Scenario_Cesar.xml.bak deleted file mode 100644 index 509bc44..0000000 --- a/src/opsoro/data/visual_programming/scripts/Scenario_Cesar.xml.bak +++ /dev/null @@ -1 +0,0 @@ -StateSTARTState_initFALSEscore02ONNEUTRALcola0Qn_C2_B00EQStateSTARTEQStateINTRO_1EQStateINTRO_2EQStateINTRO_3EQStateINTRO_4EQStateINTRO_5EQStateCALCEQStateENDdo_STARTState_init0.5Hi! I am Ohno, the social Robot!, Nice to meet you Braam.6We are going to play a game; 3Score points by giving the correct answer4Let's test this: Press Ah.HAPPY2.5State_initTRUEGT11000smb_coin.wav2SURPRISEVery Good!1.5And now press Bee2GT01000HAPPYsmb_coin.wav2Amazing! Well done Bram!3.5StateINTRO_1State_initFALSE0.5do_INTRO_1State_initWe are going to play a gameNEUTRAL3Here comes question 1: What was my name again?4Is it A: Ohno. Or Bee: Sally?3State_initTRUEGT11000SURPRISEsmb_coin.wav2Well done! You remembered! One point for Bram!4score1Score: score0.5StateINTRO_2State_initFALSEGT01000smb3_jump.wavSAD2Wrong! My name is Ohno. No points scored6StateINTRO_2State_initFALSEdo_INTRO_2State_initQuestion 2. I have drank 7 glasses of Coca Cola today, would that be too much?NEUTRAL7Press Aah for No. Or press Bee for Yes4State_initTRUEGT01000smb_coin.wavHAPPY2Very good! Another point scored! I think you are very smart!6score1Score: score0.5State_initFALSEStateINTRO_3GT11000smb3_jump.wav2DISGUST0.5State_initFALSEStateINTRO_3do_INTRO_3State_initQuestion 3. How many have you drank today?7NEUTRALPress button Bee. slowly as many times as you drank one glass of coca cola5for example: if you had 2 glasses; press button Bee two times but slowlyState_initTRUEGT01000cola10.5Glasses of cola colasmb_coin.wav1GT11000LTcola2LOZ_Secret.wav2Nice! Not only smart, but healthy too!3.5HAPPYscore1Score: score1ANGRY3smb3_jump.wav2Ooh! That's not healthy! You are going to get yellow teeth! haha61State_initFALSEStateINTRO_4do_INTRO_4State_initNEUTRALNext question: How many questions have been asked so far?6for example: if you think Question number 3; press button Bee 3 times but slowly6State_initTRUEGT01000Qn_C2_B010.5Button B pressesQn_C2_B0smb_coin.wav1GT11000EQQn_C2_B04LOZ_Secret.wav2Alright! This is Question number 4 indeed! Another point scored!6HAPPYscore1Score: score13DISGUSTsmb3_jump.wav2Ow, that not correct. No points scored1State_initFALSEStateINTRO_5do_INTRO_5State_initNEUTRALLast question. If i mix Yellow and red, what color do i get?7Press button B for Orange and button Aah for Green.5State_initTRUEGT11000DISGUSTsmb3_jump.wav2Oh that's a shame. It was Orange. Next time better!4State_initFALSEStateCALCGT01000HAPPYsmb_coin.wavscore1Score: score2.5Very good! I bet you will be a great artist one day!6State_initFALSEStateCALCdo_ENDState_initHAPPYCongratulations, you have officially closed your first test with me. A social robot. Did you like it? 10You can just say Yes or No out loud!6SURPRISE5Well, goodbye! See you next time!HAPPYState_initFALSEdo_CALCNEUTRALThe moment of truth! I will calculate your score. Just a moment please5HAPPYEQscore0Your score is 0. I am sure you can do better!EQscore1Your score is 1. I am sure you can do better!EQscore2Your score is 2. Not bad, but I am sure you can do better!EQscore3Your score is 3. Not bad, but I am sure you can do better!EQscore4Your score is 4. Wonderful! That is very good!EQscore5Your score is 5. Amazing! Just Amazing! That is a perfect score! I need to upgrade my difficulty levelsOops! I forgot to keep your score! Want to try again?5State_initFALSEStateENDOFF \ No newline at end of file diff --git a/src/opsoro/data/visual_programming/scripts/currentscript.xml.tmp b/src/opsoro/data/visual_programming/scripts/currentscript.xml.tmp deleted file mode 100644 index 243fffc..0000000 --- a/src/opsoro/data/visual_programming/scripts/currentscript.xml.tmp +++ /dev/null @@ -1 +0,0 @@ -64#ff0000128i0641#000000i#33cc00MINUSi10.1i0641#3333ffi#ff0000MINUSi10.1#000000 \ No newline at end of file diff --git a/src/opsoro/dof/__init__.py b/src/opsoro/dof/__init__.py index 2a5e45e..dccab76 100644 --- a/src/opsoro/dof/__init__.py +++ b/src/opsoro/dof/__init__.py @@ -1,14 +1,14 @@ # from opsoro.hardware import Hardware -from opsoro.console_msg import * +import math +import time from scipy import interpolate from opsoro.animate import Animate +from opsoro.console_msg import * -import math -import time -constrain = lambda n, minn, maxn: max(min(maxn, n), minn) +def constrain(n, minn, maxn): return max(min(maxn, n), minn) class DOF(object): @@ -22,7 +22,9 @@ def __init__(self, name, neutral=0.0, poly=None): """ self.name = name + self.tags = [] self.value = neutral + self.to_value = neutral # Dict to store any extra data from YAML files self.data = {} @@ -49,7 +51,7 @@ def config(self, **args): def __repr__(self): return "DOF(name=%s, neutral=%.2f, poly={...})" \ - % (self.name, self._neutral) + % (self.name, self._neutral) def set_control_polygon(self, neutral=0.0, poly=None): """ @@ -82,8 +84,7 @@ def set_control_polygon(self, neutral=0.0, poly=None): sorted_dofs = map(dofs.__getitem__, indexes) # Create interpolation instance - self._interp_poly = interpolate.interp1d( - phis, sorted_dofs, kind="linear") + self._interp_poly = interpolate.interp1d(phis, sorted_dofs, kind="linear") def calc(self, r, phi, anim_time=-1): """ @@ -104,9 +105,7 @@ def calc(self, r, phi, anim_time=-1): dof_at_max_r = float(self._interp_poly(phi)) # Interpolate between neutral DOF pos and max intensity DOF pos - self.set_value( - float(self._neutral) + (r * (dof_at_max_r - float(self._neutral))), - anim_time) + self.set_value(float(self._neutral) + (r * (dof_at_max_r - float(self._neutral))), anim_time) # # Execute overlays # for overlay_fn in self.overlays: @@ -116,11 +115,7 @@ def calc(self, r, phi, anim_time=-1): # # Not a callable object, or function does not take 2 args # pass - def set_value(self, - dof_value=0, - anim_time=-1, - is_overlay=False, - update_last_set_time=True): + def set_value(self, dof_value=0, anim_time=-1, is_overlay=False, update_last_set_time=True): """ Sets the dof value. @@ -132,6 +127,8 @@ def set_value(self, # print_info('Set value: %d, time: %i' % (dof_value, anim_time)) dof_value = float(constrain(float(dof_value), -1.0, 1.0)) + self.to_value = dof_value + # Apply transition animation if anim_time < 0: anim_time = float(abs(dof_value - float(self.value))) / 1.0 @@ -144,10 +141,7 @@ def set_value(self, if update_last_set_time: self.last_set_time = int(round(time.time() * 1000)) - def set_overlay_value(self, - dof_value=0, - anim_time=-1, - update_last_set_time=True): + def set_overlay_value(self, dof_value=0, anim_time=-1, update_last_set_time=True): """ Sets the overlay value and overwrites the dof position. diff --git a/src/opsoro/dof/servo.py b/src/opsoro/dof/servo.py index d03c3a0..e52c914 100644 --- a/src/opsoro/dof/servo.py +++ b/src/opsoro/dof/servo.py @@ -1,8 +1,10 @@ -from opsoro.hardware import Hardware from opsoro.console_msg import * from opsoro.dof import DOF +from opsoro.hardware import Hardware + + +def constrain(n, minn, maxn): return max(min(maxn, n), minn) -constrain = lambda n, minn, maxn: max(min(maxn, n), minn) class Servo(DOF): def config(self, pin=None, min_range=0, mid_pos=1500, max_range=0): @@ -21,23 +23,16 @@ def config(self, pin=None, min_range=0, mid_pos=1500, max_range=0): self.pin = int(pin) # self.dofname = dofname self.mid_pos = int(constrain(int(mid_pos), min_value, max_value)) - self.min_range = int( - constrain( - int(min_range), min_value - self.mid_pos, max_value - - self.mid_pos)) - self.max_range = int( - constrain( - int(max_range), min_value - self.mid_pos, max_value - - self.mid_pos)) + self.min_range = int(constrain(int(min_range), min_value - self.mid_pos, max_value - self.mid_pos)) + self.max_range = int(constrain(int(max_range), min_value - self.mid_pos, max_value - self.mid_pos)) self.position = int(self.mid_pos) # print_info(self.__repr__()) def __repr__(self): - return "Servo(pin=%d, min_range=%d, mid_pos=%d, max_range=%d)" % ( - self.pin, self.min_range, self.mid_pos, self.max_range) + return "Servo(pin=%d, min_range=%d, mid_pos=%d, max_range=%d)" % (self.pin, self.min_range, self.mid_pos, self.max_range) - def to_us(self, dof_value = None): + def to_us(self, dof_value=None): """ Converts DOF pos to microseconds. @@ -80,8 +75,8 @@ def update(self): # print_info('Servo: pin: %i, pos: %f' % (self.pin, self.position)) - if self.pin is not None: + if self.pin is not None and self.pin >= 0: with Hardware.lock: - Hardware.servo_set(self.pin, self.position) + Hardware.Servo.set(self.pin, self.position) # return True return dof_animation_changed diff --git a/src/opsoro/expression.py b/src/opsoro/expression.py index af4d964..b33e061 100644 --- a/src/opsoro/expression.py +++ b/src/opsoro/expression.py @@ -10,13 +10,23 @@ from __future__ import with_statement import math -import cmath +import os +from functools import partial +import cmath from opsoro.console_msg import * - from opsoro.robot import Robot -constrain = lambda n, minn, maxn: max(min(maxn, n), minn) +try: + import simplejson as json +except ImportError: + import json + + +def constrain(n, minn, maxn): return max(min(maxn, n), minn) + + +get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) class _Expression(object): @@ -24,10 +34,14 @@ def __init__(self): self._emotion = 0 + 0j self._anim = None + self.expressions = [] + + self.load_config() + def set_emotion_e(self, e=0 + 0j, anim_time=-1): """ - Set an emotion with complex number e, within a certain time. - """ + Set an emotion with complex number e, within a certain time. + """ # Print data to log # print_info("Emotion; e: " + str(e) + ", time: " + str(anim_time)) @@ -40,52 +54,47 @@ def set_emotion_e(self, e=0 + 0j, anim_time=-1): phi = cmath.phase(self._emotion) r = abs(self._emotion) - print_info("Set Emotion; r: " + str(r) + ", phi: " + str(phi) + - ", time: " + str(anim_time)) - Robot.apply_poly(r, phi, anim_time) def set_emotion_val_ar(self, valence, arousal, anim_time=-1): """ - Set an emotion with valence and arousal, within a certain time. - """ + Set an emotion with valence and arousal, within a certain time. + """ # Print data to log # print_info("Set Emotion; valence: " + str(valence) + ", arousal: " + # str(arousal) + ", time: " + str(anim_time)) e = 0 + 0j # Emotion from valence and arousal - if valence is not None and arousal is not None: - valence = constrain(valence, -1.0, 1.0) - arousal = constrain(arousal, -1.0, 1.0) - e = valence + arousal * 1j - else: - raise RuntimeError( - "Bad combination of parameters; valence and arousal need to be provided.") + if valence is None or arousal is None: + raise RuntimeError("Bad combination of parameters; valence and arousal need to be provided.") + + valence = constrain(valence, -1.0, 1.0) + arousal = constrain(arousal, -1.0, 1.0) + e = valence + arousal * 1j + self.set_emotion_e(e, anim_time) def set_emotion_r_phi(self, r, phi, degrees=False, anim_time=-1): """ - Set an emotion with r and phi, within a certain time. - """ + Set an emotion with r and phi, within a certain time. + """ # Print data to log # print_info("Set Emotion; r: " + str(r) + ", phi: " + str(phi) + # ", deg: " + str(degrees) + ", time: " + str(anim_time)) e = 0 + 0j # Emotion from r and phi - if r is not None and phi is not None: - if degrees: - phi = phi * math.pi / 180.0 + if r is None or phi is None: + raise RuntimeError("Bad combination of parameters; r and phi need to be provided.") - phi = constrain(phi, 0.0, 2 * math.pi) - r = constrain(r, 0.0, 1.0) - e = cmath.rect(r, phi) - else: - raise RuntimeError( - "Bad combination of parameters; r and phi need to be provided.") + if degrees: + phi = phi * math.pi / 180.0 - self.set_emotion_e(e, anim_time) + phi = constrain(phi, 0.0, 2 * math.pi) + r = constrain(r, 0.0, 1.0) + + Robot.apply_poly(r, phi, anim_time) def update(self): # Still here for backwards compatibility @@ -94,9 +103,116 @@ def update(self): def get_emotion_complex(self): """ - Returns current emotion as a complex number - """ + Returns current emotion as a complex number + """ return self._emotion + def set_emotion_name(self, name, anim_time=-1): + """ + Set an emotion with name if defined in expression list, within a certain time. + """ + + e = 0 + 0j + # Emotion from name in list + if name is None: + raise RuntimeError("Bad combination of parameters; name needs to be provided.") + + index = 0 + for exp in self.expressions: + if 'name' in exp: + if exp['name'] == name: + self.set_emotion_index(index, anim_time) + index += 1 + + def set_emotion_icon(self, icon, anim_time=-1): + """ + Set an emotion with icon if defined in expression list, within a certain time. + """ + + e = 0 + 0j + # Emotion from icon in list + if icon is None: + raise RuntimeError("Bad combination of parameters; icon needs to be provided.") + + index = 0 + for exp in self.expressions: + if 'icon' in exp: + if exp['icon'] == icon: + self.set_emotion_index(index, anim_time) + index += 1 + + def set_emotion_index(self, index, anim_time=-1): + """ + Set an emotion with index in defined expression list, within a certain time. + """ + + e = 0 + 0j + # Emotion from list + if index is None: + raise RuntimeError("Bad combination of parameters; index needs to be provided.") + + index = constrain(index, 0, len(self.expressions) - 1) + + exp = self.expressions[index] + + if 'poly' in exp: + # 20 values in poly, (poly * 2*pi/20) + phi = constrain(exp['poly'] * math.pi / 10, 0.0, 2 * math.pi) + Robot.apply_poly(1.0, phi, anim_time) + + if 'dofs' in exp: + # send dofs directly to the robot + Robot.set_dof_list(exp['dofs'], anim_time) + + def set_config(self, config=None): + if config is not None and len(config) > 0: + save_new_config = (self.expressions != config) + self.expressions = json.loads(config) + # Create all module-objects from data + + if save_new_config: + self.save_config() + + return self.expressions + + def load_config(self, file_name='robot_expressions.conf'): + # Load modules from file + if file_name is None: + return False + + try: + with open(get_path("config/" + file_name)) as f: + self.expressions = f.read() + + if self.expressions is None or len(self.expressions) == 0: + print_warning("Config contains no data: " + file_name) + return False + + self.set_config(self.expressions) + # print module feedback + print_info("%i expressions loaded [%s]" % (len(self.expressions), file_name)) + + except IOError: + self.expressions = {} + print_warning("Could not open " + file_name) + return False + + return True + + def save_config(self, file_name='robot_expressions.conf'): + # Save modules to json file + if file_name is None: + return False + + try: + with open(get_path("config/" + file_name), "w") as f: + f.write(json.dumps(self.expressions)) + print_info("Expressions saved: " + file_name) + except IOError: + print_warning("Could not save " + file_name) + return False + return True + + # Global instance that can be accessed by apps and scripts Expression = _Expression() diff --git a/src/opsoro/hardware/SPI_commands.txt b/src/opsoro/hardware/SPI_commands.txt new file mode 100644 index 0000000..8e0c927 --- /dev/null +++ b/src/opsoro/hardware/SPI_commands.txt @@ -0,0 +1,52 @@ +### SPI COMMANDS + +# > GENERAL IN OUT +CMD_NOP = 0 # 0 0 No operation +CMD_PING = 1 # 0 1 To check connection +CMD_READ = 2 # 0 ? Return result from previous command +CMD_RESET = 3 # 0 0 Reset the ATmega328 +CMD_LEDON = 4 # 0 0 Turn LED on +CMD_LEDOFF = 5 # 0 0 Turn LED off +CMD_NC = 255 # 0 0 Not connected + +# > I2C IN OUT +CMD_I2C_DETECT = 20 # 1 1 Test if there's a device at addr +CMD_I2C_READ8 = 21 # 2 1 Read byte +CMD_I2C_WRITE8 = 22 # 3 0 Write byte +CMD_I2C_READ16 = 23 # 2 2 Read 2 bytes +CMD_I2C_WRITE16 = 24 # 4 0 Write 2 bytes + +# > SERVO IN OUT +CMD_SERVO_INIT = 40 # 0 0 Init PCA9685 +CMD_SERVO_ENABLE = 41 # 0 0 Turn on MOSFET +CMD_SERVO_DISABLE = 42 # 0 0 Turn off MOSFET +CMD_SERVO_NEUTRAL = 43 # 0 0 Set all servos to 1500 +CMD_SERVO_SET = 44 # 3 0 Set 1 servo position +CMD_SERVO_SETALL = 45 # 32 0 Set position of all servos + +# > CAPACITIVE TOUCH IN OUT +CMD_CAP_INIT = 60 # 3 0 Init MPR121 +CMD_CAP_SETTH = 61 # 3 0 Set pin touch/release threshold +CMD_CAP_GETFD = 62 # 0 24 Get pin filtered data (10 bits per electrode) +CMD_CAP_GETBD = 63 # 1 1 Get pin baseline data, high 8 bits of 10 +CMD_CAP_TOUCHED = 64 # 0 2 Get touched status +CMD_CAP_SETGPIO = 65 # 2 0 Set GPIO mode +CMD_CAP_GPIOREAD = 66 # 0 1 Read GPIO pin +CMD_CAP_GPIOWRITE = 67 # 2 0 Write GPIO pin + +# > NEOPIXEL IN OUT +CMD_NEO_INIT = 80 # 1 0 Init Neopixel +CMD_NEO_ENABLE = 81 # 0 0 Turn on MOSFET +CMD_NEO_DISABLE = 82 # 0 0 Turn off MOSFET +CMD_NEO_SETBRIGHT = 83 # 1 0 Set brightness +CMD_NEO_SHOW = 84 # 0 0 Show pixels +CMD_NEO_SET = 85 # 4 0 Set single pixel +CMD_NEO_SETRANGE = 86 # 5 0 Set range of pixels +CMD_NEO_SETALL = 87 # 3 0 Set all pixels +CMD_NEO_SETHSV = 88 # 4 0 Set single pixel HSV +CMD_NEO_SETRANGEHSV = 89 # 5 0 Set range of pixels HSV +CMD_NEO_SETALLHSV = 90 # 3 0 Set all pixels HSV + +# > ANALOG IN OUT +CMD_ANA_GET = 100 # 1 2 Read an analog channel +CMD_ANA_GETALL = 101 # 0 8 Read all analog channels diff --git a/src/opsoro/hardware/__init__.py b/src/opsoro/hardware/__init__.py index 984f276..0e2053c 100644 --- a/src/opsoro/hardware/__init__.py +++ b/src/opsoro/hardware/__init__.py @@ -1,78 +1,23 @@ -""" -This module defines the interface for communicating with the shield. - -.. autoclass:: _Hardware - :members: - :undoc-members: - :show-inheritance: -""" - import time -import spidev import threading -# SPI COMMANDS # > GENERAL IN OUT CMD_NOP = 0 # 0 0 No operation CMD_NC = 255 # 0 0 Not connected CMD_PING = 1 # 0 1 To check connection -CMD_READ = 2 # 0 ? Return result from previous command CMD_RESET = 3 # 0 0 Reset the ATmega328 CMD_LEDON = 4 # 0 0 Turn LED on CMD_LEDOFF = 5 # 0 0 Turn LED off -# > I2C IN OUT -CMD_I2C_DETECT = 20 # 1 1 Test if there's a device at addr -CMD_I2C_READ8 = 21 # 2 1 Read byte -CMD_I2C_WRITE8 = 22 # 3 0 Write byte -CMD_I2C_READ16 = 23 # 2 2 Read 2 bytes -CMD_I2C_WRITE16 = 24 # 4 0 Write 2 bytes - -# > SERVO IN OUT -CMD_SERVO_INIT = 40 # 0 0 Init PCA9685 -CMD_SERVO_ENABLE = 41 # 0 0 Turn on MOSFET -CMD_SERVO_DISABLE = 42 # 0 0 Turn off MOSFET -CMD_SERVO_NEUTRAL = 43 # 0 0 Set all servos to 1500 -CMD_SERVO_SET = 44 # 3 0 Set 1 servo position -CMD_SERVO_SETALL = 45 # 32 0 Set position of all servos - -# > CAPACITIVE TOUCH IN OUT -CMD_CAP_INIT = 60 # 3 0 Init MPR121 -CMD_CAP_SETTH = 61 # 3 0 Set pin touch/release threshold -CMD_CAP_GETFD = 62 # 0 24 Get pin filtered data (10 bits per electrode) -CMD_CAP_GETBD = 63 # 1 1 Get pin baseline data, high 8 bits of 10 -CMD_CAP_TOUCHED = 64 # 0 2 Get touched status -CMD_CAP_SETGPIO = 65 # 2 0 Set GPIO mode -CMD_CAP_GPIOREAD = 66 # 0 1 Read GPIO pin -CMD_CAP_GPIOWRITE = 67 # 2 0 Write GPIO pin - -# > NEOPIXEL IN OUT -CMD_NEO_INIT = 80 # 1 0 Init Neopixel -CMD_NEO_ENABLE = 81 # 0 0 Turn on MOSFET -CMD_NEO_DISABLE = 82 # 0 0 Turn off MOSFET -CMD_NEO_SETBRIGHT = 83 # 1 0 Set brightness -CMD_NEO_SHOW = 84 # 0 0 Show pixels -CMD_NEO_SET = 85 # 4 0 Set single pixel -CMD_NEO_SETRANGE = 86 # 5 0 Set range of pixels -CMD_NEO_SETALL = 87 # 3 0 Set all pixels -CMD_NEO_SETHSV = 88 # 4 0 Set single pixel HSV -CMD_NEO_SETRANGEHSV = 89 # 5 0 Set range of pixels HSV -CMD_NEO_SETALLHSV = 90 # 3 0 Set all pixels HSV -# > ANALOG IN OUT -CMD_ANA_GET = 100 # 1 2 Read an analog channel -CMD_ANA_GETALL = 101 # 0 8 Read all analog channels - -# MPR121 GPIO constants -GPIO_INPUT = 1 -GPIO_INPUT_PU = 2 -GPIO_INPUT_PD = 3 -GPIO_OUTPUT = 4 -GPIO_OUTPUT_HS = 5 -GPIO_OUTPUT_LS = 6 -GPIO_HIGH = True -GPIO_LOW = False +from spi import SPI +from usb_serial import Serial +from . import analog +from . import capacitive +from . import i2c +from . import neopixel +from . import servo class _Hardware(object): def __init__(self): @@ -83,56 +28,18 @@ def __init__(self): # the hardware class from multiple threads. self.lock = threading.Lock() - # Setup SPI - self.spi = spidev.SpiDev() - self.spi.open(0, 0) - self.spi.mode = 0b00 - - # TODO: Further testing of SPI speeds - # NeoKeypad.lua started showing strange behavior at 500kHz. - # Presumably because neo_show() disables interrupts momentarily, - # Causing the ATmega328 to miss SPI interrupts - # Touch app shows spikes at 250kHz, but not at 122kHz. - - #self.spi.max_speed_hz = 50000 # 50kHz - #self.spi.max_speed_hz = 500000 # 500kHz - #self.spi.max_speed_hz = 250000 # 250kHz - self.spi.max_speed_hz = 122000 # 122kHz + # self.analog = + self.Analog = analog.Analog() + self.Capacitive = capacitive.Capacitive() + self.I2C = i2c.I2C() + self.Neopixel = neopixel.Neopixel() + self.Servo = servo.Servo() + self.SPI = SPI + self.Serial = Serial def __del__(self): pass - def spi_command(self, cmd, params=None, returned=0, delay=0): - """ - Send a command over the SPI bus to the ATmega328. - Optionally reads the result buffer and returns those Bytes. - - :param string cmd: spi command - :param strin params: parameters for the command - :param int returned: size of result reading - :param int delay: delay between sending the command and reading the result - - :return: result buffer (Bytes) - :rtype: list - """ - # Send command - if params: - self.spi.xfer2([cmd] + params) - else: - self.spi.xfer2([cmd]) - - # Delay - if delay: - time.sleep(delay) - - # Read result - if returned: - data = self.spi.xfer2([CMD_READ] + [255 for i in range(returned)]) - # First byte is junk, this is due to the way SPI works - return data[1:] - else: - return - # > GENERAL def ping(self): """ @@ -141,371 +48,19 @@ def ping(self): :return: True if shield is connected :rtype: bool """ - return self.spi_command(CMD_PING, returned=1)[0] == 0xAA + return SPI.command(CMD_PING, returned=1)[0] == 0xAA def reset(self): """Resets the ATmega328, MPR121 and PCA9685.""" - self.spi_command(CMD_RESET, delay=2) + SPI.command(CMD_RESET, delay=2) def led_on(self): """Turns status LED on.""" - self.spi_command(CMD_LEDON) + SPI.command(CMD_LEDON) def led_off(self): """Turns status LED off.""" - self.spi_command(CMD_LEDOFF) - - # > I2C - def i2c_detect(self, addr): - """ - Returns True if an I2C device is found at a particular address. - - :param int addr: address of the I2C device. - - :return: I2C device detected - :rtype: bool - """ - return self.spi_command( - CMD_I2C_DETECT, params=[addr], returned=1)[0] == 1 - - def i2c_read8(self, addr, reg): - """ - Read a Byte from an I2C device. - - :param int addr: address of the I2C device. - :param int reg: register address in the I2C device - - :return: what is the function returning? - :rtype: var - """ - return self.spi_command( - CMD_I2C_READ8, params=[addr, reg], returned=1)[0] - - def i2c_write8(self, addr, reg, data): - """ - Write a Byte to an I2C device. - - :param int addr: address of the I2C device. - :param int reg: register address in the I2C device - :param var data: Byte to send - """ - self.spi_command(CMD_I2C_WRITE8, params=[addr, reg, data]) - - def i2c_read16(self, addr, reg): - """ - Read 2 bytes from an I2C device. - - :param int addr: address of the I2C device. - :param int reg: register address in the I2C device - - :return: 2 Bytes - :rtype: var - """ - data = self.spi_command(CMD_I2C_READ16, params=[addr, reg], returned=2) - return (data[0] << 8) | data[1] - - def i2C_write16(self, addr, reg, data): - """ - Write 2 bytes to an I2C device. - - :param int addr: address of the I2C device. - :param int reg: register address in the I2C device - :param var data: Bytes to send - """ - val1 = (data & 0xFF00) >> 8 - val2 = (data & 0x00FF) - - self.spi_command(CMD_I2C_WRITE16, params=[addr, reg, val1, val2]) - - # > SERVO - def servo_init(self): - """Set up the PCA9685 for driving servos.""" - self.spi_command(CMD_SERVO_INIT, delay=0.02) - - def servo_enable(self): - """Turns on the servo power MOSFET, enabling all servos.""" - self.spi_command(CMD_SERVO_ENABLE) - - def servo_disable(self): - """Turns off the servo power MOSFET, disabling all servos.""" - self.spi_command(CMD_SERVO_DISABLE) - - def servo_neutral(self): - """Set all servos to 1500us.""" - self.spi_command(CMD_SERVO_NEUTRAL, delay=0.008) - - def servo_set(self, channel, pos): - """ - Set the position of one servo. - Pos in us, 500 to 2500 - - :param int channel: channel of the servo - :param int pos: position of the servo (500 to 2500) - """ - offtime = (pos + 2) // 4 - self.spi_command( - CMD_SERVO_SET, - params=[channel, offtime >> 8, offtime & 0x00FF], - delay=0.008) - - def servo_set_all(self, pos_list): - """ - Set position of all 16 servos using a list. - - :param list pos_list: list of servo positions - """ - spi_params = [] - i = 0 - for pos in pos_list: - if pos is None: - # Tell FW not to update this servo - spi_params.append(0xFF) - spi_params.append(0xFF) - else: - offtime = (pos + 2) // 4 - spi_params.append(offtime >> 8) - spi_params.append(offtime & 0x0FF) - i = i + 1 - - self.spi_command(CMD_SERVO_SETALL, params=spi_params, delay=0.008) - - # > CAPACITIVE TOUCH - def cap_init(self, electrodes, gpios=0, autoconfig=True): - """ - Initialize the MPR121 capacitive touch sensor. - - :param int electrodes: amount of electrodes - :param int gpios: amount of gpios - :param bool autoconfig: - """ - ac = 1 if autoconfig else 0 - self.spi_command( - CMD_CAP_INIT, params=[electrodes, gpios, ac], delay=0.05) - - def cap_set_threshold(self, electrode, touch, release): - """ - Set an electrode's touch and release threshold. - - :param int electrode: index of electrode - :param int touch: threshold value for touch detection - :param int release: threshold value for release detection - """ - self.spi_command(CMD_CAP_SETTH, params=[electrode, touch, release]) - - def cap_get_filtered_data(self): - """ - Get list of electrode filtered data (10 bits per electrode). - - :return: electrode filtered data (10 bits per electrode). - :rtype: list - """ - data = [] - ret = Hardware.spi_command(CMD_CAP_GETFD, returned=24) - for i in range(12): - data.append(ret[i * 2] + (ret[i * 2 + 1] << 8)) - return data - - def cap_get_baseline_data(self): - """ - Get list of electrode baseline data. - Result is 10 bits, but the 2 least significant bits are set to 0. - - :return: electrode baseline data (10 bits). - :rtype: list - """ - data = Hardware.spi_command(CMD_CAP_GETBD, returned=12) - # High 8 bits of 10 are returned. - # Shift 2 so it's the same order of magnitude as cap_get_filtered_data(). - data = map(lambda x: x << 2, data) - return data - - def cap_get_touched(self): - """ - Returns the values of the touch registers, - each bit corresponds to one electrode. - - :return: values of the touch registers, - :rtype: list - """ - data = self.spi_command(CMD_CAP_TOUCHED, returned=2) - return (data[0] << 8) | data[1] - - def cap_set_gpio_pinmode(self, gpio, pinmode): - """ - Sets a GPIO channel's pin mode. - - :param int gpio: gpio channel - :param int pinmode: pinmode to set - """ - bitmask = 1 << gpio - self.spi_command(CMD_CAP_SETGPIO, params=[bitmask, pinmode]) - - def cap_read_gpio(self): - """ - Returns the status of all GPIO channels, - each bit corresponds to one gpio channel. - - :return: status of all GPIO channels. - :rtype: list - """ - # TODO: Add optional pin parameter - return self.spi_command(CMD_CAP_GPIOREAD) - - def cap_write_gpio(self, gpio, data): - """ - Set GPIO channel value. - - :param int gpio: gpio channel - :param int data: data to write to gpio channel. - """ - bitmask = 1 << gpio - setclr = 1 if data else 0 - self.spi_command(CMD_CAP_GPIOWRITE, params=[bitmask, setclr]) - - # > NEOPIXEL - def neo_init(self, num_leds): - """ - Initialize the NeoPixel library. - - :param int num_leds: number of neopixel leds. - """ - self.spi_command(CMD_NEO_INIT, params=[num_leds]) - - def neo_enable(self): - """ - Turns on the NeoPixel MOSFET, enabling the NeoPixels. - Data is lost when pixels are disabled, so call neo_show() again afterwards. - """ - self.spi_command(CMD_NEO_ENABLE) - - def neo_disable(self): - """ - Turns off the NeoPixel MOSFET, disabling the NeoPixels. - Data is lost when pixels are disabled. - """ - self.spi_command(CMD_NEO_DISABLE) - - def neo_set_brightness(self, brightness): - """ - Set the NeoPixel's global brightness, 0-255. - - :param int brightness: brightness to set (0-255) - """ - self.spi_command(CMD_NEO_SETBRIGHT, params=[brightness]) - - def neo_show(self): - """Sends the pixel data from the ATmega328 to the NeoPixels.""" - self.spi_command(CMD_NEO_SHOW) - - def neo_set_pixel(self, pixel, r, g, b): - """ - Set the color of a single pixel. - - :param int pixel: pixel index - :param int r: red color value (0-255) - :param int g: green color value (0-255) - :param int b: blue color value (0-255) - """ - self.spi_command(CMD_NEO_SET, params=[pixel, r, g, b]) - - def neo_set_range(self, start, end, r, g, b): - """ - Set the color of a range of pixels. - - :param int start: start index of led range - :param int end: end index of led range - :param int r: red color value (0-255) - :param int g: green color value (0-255) - :param int b: blue color value (0-255) - """ - self.spi_command(CMD_NEO_SETRANGE, params=[start, end, r, g, b]) - - def neo_set_all(self, r, g, b): - """ - Set the color of the entire strip. - - :param int r: red color value (0-255) - :param int g: green color value (0-255) - :param int b: blue color value (0-255) - """ - self.spi_command(CMD_NEO_SETALL, params=[r, g, b]) - - def neo_set_pixel_hsv(self, pixel, h, s, v): - """ - Set the HSV color of a single pixel. - - :param int pixel: pixel index - :param int h: hue color value (0-255) - :param int s: saturation color value (0-255) - :param int v: value color value (0-255) - """ - self.spi_command(CMD_NEO_SETHSV, params=[pixel, h, s, v]) - - def neo_set_range_hsv(self, start, end, h, s, v): - """ - Set the HSV color of a range of pixels. - - :param int start: start index of led range - :param int end: end index of led range - :param int h: hue color value (0-255) - :param int s: saturation color value (0-255) - :param int v: value color value (0-255) - """ - self.spi_command(CMD_NEO_SETRANGEHSV, params=[start, end, h, s, v]) - - def neo_set_all_hsv(self, h, s, v): - """ - Set the HSV color of the entire strip. - - :param int h: hue color value (0-255) - :param int s: saturation color value (0-255) - :param int v: value color value (0-255) - """ - self.spi_command(CMD_NEO_SETALLHSV, params=[h, s, v]) - - # > ANALOG - def ana_read_channel(self, channel): - """ - Reads the value of a single analog channel. - - :param int channel: analog channel to read - - :return: analog value of the channel - :rtype: var - """ - data = self.spi_command(CMD_ANA_GET, params=[channel], returned=2) - return data[0] << 8 | data[1] - - def ana_read_all_channels(self): - """ - Reads all analog channels and returns them as a list. - - :return: analog values - :rtype: list - """ - data = self.spi_command(CMD_ANA_GETALL, returned=2) - return [ - data[0] << 8 | data[1], data[2] << 8 | data[3], data[4] << 8 | - data[5], data[6] << 8 | data[7] - ] - - # Methods for backward compatibility - servo_power_on = servo_enable - servo_power_off = servo_disable - set_servo_us = servo_set - - def set_all_servo_us(self, us): - """ - Set all servos to a certain position (us) - - :param int us: position in us - """ - if us == 1500: - self.servo_neutral() - else: - pos_list = [us for i in range(16)] - self.servo_set_all(pos_list) + SPI.command(CMD_LEDOFF) # Global instance that can be accessed by apps and scripts Hardware = _Hardware() -Hardware.spi_command(CMD_RESET) diff --git a/src/opsoro/hardware/analog.py b/src/opsoro/hardware/analog.py new file mode 100644 index 0000000..e8263ab --- /dev/null +++ b/src/opsoro/hardware/analog.py @@ -0,0 +1,33 @@ +from opsoro.hardware.spi import SPI + + +# > ANALOG IN OUT +CMD_ANA_GET = 100 # 1 2 Read an analog channel +CMD_ANA_GETALL = 101 # 0 8 Read all analog channels + +class Analog(object): + # > ANALOG + def read_channel(self, channel): + """ + Reads the value of a single analog channel. + + :param int channel: analog channel to read + + :return: analog value of the channel + :rtype: var + """ + data = SPI.command(CMD_ANA_GET, params=[channel], returned=2) + return data[0] << 8 | data[1] + + def read_all_channels(self): + """ + Reads all analog channels and returns them as a list. + + :return: analog values + :rtype: list + """ + data = SPI.command(CMD_ANA_GETALL, returned=2) + return [ + data[0] << 8 | data[1], data[2] << 8 | data[3], data[4] << 8 | + data[5], data[6] << 8 | data[7] + ] diff --git a/src/opsoro/hardware/capacitive.py b/src/opsoro/hardware/capacitive.py new file mode 100644 index 0000000..d9bd213 --- /dev/null +++ b/src/opsoro/hardware/capacitive.py @@ -0,0 +1,115 @@ +from opsoro.hardware.spi import SPI + +# > CAPACITIVE TOUCH IN OUT +CMD_CAP_INIT = 60 # 3 0 Init MPR121 +CMD_CAP_SETTH = 61 # 3 0 Set pin touch/release threshold +CMD_CAP_GETFD = 62 # 0 24 Get pin filtered data (10 bits per electrode) +CMD_CAP_GETBD = 63 # 1 1 Get pin baseline data, high 8 bits of 10 +CMD_CAP_TOUCHED = 64 # 0 2 Get touched status +CMD_CAP_SETGPIO = 65 # 2 0 Set GPIO mode +CMD_CAP_GPIOREAD = 66 # 0 1 Read GPIO pin +CMD_CAP_GPIOWRITE = 67 # 2 0 Write GPIO pin + + +# MPR121 GPIO constants +GPIO_INPUT = 1 +GPIO_INPUT_PU = 2 +GPIO_INPUT_PD = 3 +GPIO_OUTPUT = 4 +GPIO_OUTPUT_HS = 5 +GPIO_OUTPUT_LS = 6 +GPIO_HIGH = True +GPIO_LOW = False + +class Capacitive(object): + # > CAPACITIVE TOUCH + def init(self, electrodes, gpios=0, autoconfig=True): + """ + Initialize the MPR121 capacitive touch sensor. + + :param int electrodes: amount of electrodes + :param int gpios: amount of gpios + :param bool autoconfig: + """ + ac = 1 if autoconfig else 0 + SPI.command(CMD_CAP_INIT, params=[electrodes, gpios, ac], delay=0.05) + + def set_threshold(self, electrode, touch, release): + """ + Set an electrode's touch and release threshold. + + :param int electrode: index of electrode + :param int touch: threshold value for touch detection + :param int release: threshold value for release detection + """ + SPI.command(CMD_CAP_SETTH, params=[electrode, touch, release]) + + def get_filtered_data(self): + """ + Get list of electrode filtered data (10 bits per electrode). + + :return: electrode filtered data (10 bits per electrode). + :rtype: list + """ + data = [] + ret = SPI.command(CMD_CAP_GETFD, returned=24) + for i in range(12): + data.append(ret[i * 2] + (ret[i * 2 + 1] << 8)) + return data + + def get_baseline_data(self): + """ + Get list of electrode baseline data. + Result is 10 bits, but the 2 least significant bits are set to 0. + + :return: electrode baseline data (10 bits). + :rtype: list + """ + data = SPI.command(CMD_CAP_GETBD, returned=12) + # High 8 bits of 10 are returned. + # Shift 2 so it's the same order of magnitude as cap_get_filtered_data(). + data = map(lambda x: x << 2, data) + return data + + def get_touched(self): + """ + Returns the values of the touch registers, + each bit corresponds to one electrode. + + :return: values of the touch registers, + :rtype: list + """ + data = SPI.command(CMD_CAP_TOUCHED, returned=2) + return (data[0] << 8) | data[1] + + def set_gpio_pinmode(self, gpio, pinmode): + """ + Sets a GPIO channel's pin mode. + + :param int gpio: gpio channel + :param int pinmode: pinmode to set + """ + bitmask = 1 << gpio + SPI.command(CMD_CAP_SETGPIO, params=[bitmask, pinmode]) + + def read_gpio(self): + """ + Returns the status of all GPIO channels, + each bit corresponds to one gpio channel. + + :return: status of all GPIO channels. + :rtype: list + """ + # TODO: Add optional pin parameter + return SPI.command(CMD_CAP_GPIOREAD) + + def write_gpio(self, gpio, data): + """ + Set GPIO channel value. + + :param int gpio: gpio channel + :param int data: data to write to gpio channel. + """ + bitmask = 1 << gpio + setclr = 1 if data else 0 + SPI.command(CMD_CAP_GPIOWRITE, params=[bitmask, setclr]) diff --git a/src/opsoro/hardware/dummy_spidev.py b/src/opsoro/hardware/dummy_spidev.py new file mode 100644 index 0000000..9a76148 --- /dev/null +++ b/src/opsoro/hardware/dummy_spidev.py @@ -0,0 +1,15 @@ +from opsoro.console_msg import print_spi + +class SpiDev(object): + def __init__(self): + self.mode = None + self.max_speed_hz = 0 + print_spi('No SPI installed, using dummy class') + + def open(self,*args): + # print_spi('open: {}'.format(args)) + pass + + def xfer2(self,*args): + # print_spi('transfer: {}'.format(args)) + pass diff --git a/src/opsoro/hardware/i2c.py b/src/opsoro/hardware/i2c.py index 4e05e4a..92d88d3 100644 --- a/src/opsoro/hardware/i2c.py +++ b/src/opsoro/hardware/i2c.py @@ -1,161 +1,70 @@ -#!/usr/bin/python -import re -import smbus +from opsoro.hardware.spi import SPI -# =========================================================================== -# I2C Class -# =========================================================================== +# > I2C IN OUT +CMD_I2C_DETECT = 20 # 1 1 Test if there's a device at addr +CMD_I2C_READ8 = 21 # 2 1 Read byte +CMD_I2C_WRITE8 = 22 # 3 0 Write byte +CMD_I2C_READ16 = 23 # 2 2 Read 2 bytes +CMD_I2C_WRITE16 = 24 # 4 0 Write 2 bytes -class I2C(object): - @staticmethod - def getPiRevision(): - "Gets the version number of the Raspberry Pi board" - # Revision list available at: http://elinux.org/RPi_HardwareHistory#Board_Revision_History - try: - with open('/proc/cpuinfo', 'r') as infile: - for line in infile: - # Match a line of the form "Revision : 0002" while ignoring extra - # info in front of the revsion (like 1000 when the Pi was over-volted). - match = re.match('Revision\s+:\s+.*(\w{4})$', line) - if match and match.group(1) in ['0000', '0002', '0003']: - # Return revision 1 if revision ends with 0000, 0002 or 0003. - return 1 - elif match: - # Assume revision 2 if revision ends with any other 4 chars. - return 2 - # Couldn't find the revision, assume revision 0 like older code for compatibility. - return 0 - except: - return 0 - - @staticmethod - def getPiI2CBusNumber(): - # Gets the I2C bus number /dev/i2c# - return 1 if I2C.getPiRevision() > 1 else 0 - - def __init__(self, address, busnum=-1, debug=False): - self.address = address - # By default, the correct I2C bus is auto-detected using /proc/cpuinfo - # Alternatively, you can hard-code the bus version below: - # self.bus = smbus.SMBus(0); # Force I2C0 (early 256MB Pi's) - # self.bus = smbus.SMBus(1); # Force I2C1 (512MB Pi's) - self.bus = smbus.SMBus(busnum if busnum >= 0 else I2C.getPiI2CBusNumber()) - self.debug = debug - - def reverseByteOrder(self, data): - "Reverses the byte order of an int (16-bit) or long (32-bit) value" - # Courtesy Vishal Sapre - byteCount = len(hex(data)[2:].replace('L','')[::2]) - val = 0 - for i in range(byteCount): - val = (val << 8) | (data & 0xff) - data >>= 8 - return val - - def errMsg(self): - #print "Error accessing 0x%02X: Check your I2C address" % self.address - return -1 - - def write8(self, reg, value): - "Writes an 8-bit value to the specified register/address" - try: - self.bus.write_byte_data(self.address, reg, value) - if self.debug: - print "I2C: Wrote 0x%02X to register 0x%02X" % (value, reg) - except IOError, err: - return self.errMsg() - - def write16(self, reg, value): - "Writes a 16-bit value to the specified register/address pair" - try: - self.bus.write_word_data(self.address, reg, value) - if self.debug: - print ("I2C: Wrote 0x%02X to register pair 0x%02X,0x%02X" % - (value, reg, reg+1)) - except IOError, err: - return self.errMsg() - - def writeRaw8(self, value): - "Writes an 8-bit value on the bus" - try: - self.bus.write_byte(self.address, value) - if self.debug: - print "I2C: Wrote 0x%02X" % value - except IOError, err: - return self.errMsg() - - def writeList(self, reg, list): - "Writes an array of bytes using I2C format" - try: - if self.debug: - print "I2C: Writing list to register 0x%02X:" % reg - print list - self.bus.write_i2c_block_data(self.address, reg, list) - except IOError, err: - return self.errMsg() - - def readList(self, reg, length): - "Read a list of bytes from the I2C device" - try: - results = self.bus.read_i2c_block_data(self.address, reg, length) - if self.debug: - print ("I2C: Device 0x%02X returned the following from reg 0x%02X" % - (self.address, reg)) - print results - return results - except IOError, err: - return self.errMsg() - - def readU8(self, reg): - "Read an unsigned byte from the I2C device" - try: - result = self.bus.read_byte_data(self.address, reg) - if self.debug: - print ("I2C: Device 0x%02X returned 0x%02X from reg 0x%02X" % - (self.address, result & 0xFF, reg)) - return result - except IOError, err: - return self.errMsg() - - def readS8(self, reg): - "Reads a signed byte from the I2C device" - try: - result = self.bus.read_byte_data(self.address, reg) - if result > 127: result -= 256 - if self.debug: - print ("I2C: Device 0x%02X returned 0x%02X from reg 0x%02X" % - (self.address, result & 0xFF, reg)) - return result - except IOError, err: - return self.errMsg() - - def readU16(self, reg, little_endian=True): - "Reads an unsigned 16-bit value from the I2C device" - try: - result = self.bus.read_word_data(self.address,reg) - # Swap bytes if using big endian because read_word_data assumes little - # endian on ARM (little endian) systems. - if not little_endian: - result = ((result << 8) & 0xFF00) + (result >> 8) - if (self.debug): - print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % (self.address, result & 0xFFFF, reg) - return result - except IOError, err: - return self.errMsg() - - def readS16(self, reg, little_endian=True): - "Reads a signed 16-bit value from the I2C device" - try: - result = self.readU16(reg,little_endian) - if result > 32767: result -= 65536 - return result - except IOError, err: - return self.errMsg() - -if __name__ == '__main__': - try: - bus = I2C(address=0) - print "Default I2C bus is accessible" - except: - print "Error accessing default I2C bus" +class I2C(object): + # > I2C + def detect(self, addr): + """ + Returns True if an I2C device is found at a particular address. + + :param int addr: address of the I2C device. + + :return: I2C device detected + :rtype: bool + """ + return SPI.command(CMD_I2C_DETECT, params=[addr], returned=1)[0] == 1 + + def read8(self, addr, reg): + """ + Read a Byte from an I2C device. + + :param int addr: address of the I2C device. + :param int reg: register address in the I2C device + + :return: what is the function returning? + :rtype: var + """ + return SPI.command(CMD_I2C_READ8, params=[addr, reg], returned=1)[0] + + def write8(self, addr, reg, data): + """ + Write a Byte to an I2C device. + + :param int addr: address of the I2C device. + :param int reg: register address in the I2C device + :param var data: Byte to send + """ + SPI.command(CMD_I2C_WRITE8, params=[addr, reg, data]) + + def read16(self, addr, reg): + """ + Read 2 bytes from an I2C device. + + :param int addr: address of the I2C device. + :param int reg: register address in the I2C device + + :return: 2 Bytes + :rtype: var + """ + data = SPI.command(CMD_I2C_READ16, params=[addr, reg], returned=2) + return (data[0] << 8) | data[1] + + def write16(self, addr, reg, data): + """ + Write 2 bytes to an I2C device. + + :param int addr: address of the I2C device. + :param int reg: register address in the I2C device + :param var data: Bytes to send + """ + val1 = (data & 0xFF00) >> 8 + val2 = (data & 0x00FF) + + SPI.command(CMD_I2C_WRITE16, params=[addr, reg, val1, val2]) diff --git a/src/opsoro/hardware/neopixel.py b/src/opsoro/hardware/neopixel.py new file mode 100644 index 0000000..7d2fcca --- /dev/null +++ b/src/opsoro/hardware/neopixel.py @@ -0,0 +1,118 @@ +from opsoro.hardware.spi import SPI + + +# > NEOPIXEL IN OUT +CMD_NEO_INIT = 80 # 1 0 Init Neopixel +CMD_NEO_ENABLE = 81 # 0 0 Turn on MOSFET +CMD_NEO_DISABLE = 82 # 0 0 Turn off MOSFET +CMD_NEO_SETBRIGHT = 83 # 1 0 Set brightness +CMD_NEO_SHOW = 84 # 0 0 Show pixels +CMD_NEO_SET = 85 # 4 0 Set single pixel +CMD_NEO_SETRANGE = 86 # 5 0 Set range of pixels +CMD_NEO_SETALL = 87 # 3 0 Set all pixels +CMD_NEO_SETHSV = 88 # 4 0 Set single pixel HSV +CMD_NEO_SETRANGEHSV = 89 # 5 0 Set range of pixels HSV +CMD_NEO_SETALLHSV = 90 # 3 0 Set all pixels HSV + + +class Neopixel(object): + # > NEOPIXEL + def init(self, num_leds): + """ + Initialize the NeoPixel library. + + :param int num_leds: number of neopixel leds. + """ + SPI.command(CMD_NEO_INIT, params=[num_leds]) + + def enable(self): + """ + Turns on the NeoPixel MOSFET, enabling the NeoPixels. + Data is lost when pixels are disabled, so call show() again afterwards. + """ + SPI.command(CMD_NEO_ENABLE) + + def disable(self): + """ + Turns off the NeoPixel MOSFET, disabling the NeoPixels. + Data is lost when pixels are disabled. + """ + SPI.command(CMD_NEO_DISABLE) + + def set_brightness(self, brightness): + """ + Set the NeoPixel's global brightness, 0-255. + + :param int brightness: brightness to set (0-255) + """ + SPI.command(CMD_NEO_SETBRIGHT, params=[brightness]) + + def show(self): + """Sends the pixel data from the ATmega328 to the NeoPixels.""" + SPI.command(CMD_NEO_SHOW) + + def set_pixel(self, pixel, r, g, b): + """ + Set the color of a single pixel. + + :param int pixel: pixel index + :param int r: red color value (0-255) + :param int g: green color value (0-255) + :param int b: blue color value (0-255) + """ + SPI.command(CMD_NEO_SET, params=[pixel, r, g, b]) + + def set_range(self, start, end, r, g, b): + """ + Set the color of a range of pixels. + + :param int start: start index of led range + :param int end: end index of led range + :param int r: red color value (0-255) + :param int g: green color value (0-255) + :param int b: blue color value (0-255) + """ + SPI.command(CMD_NEO_SETRANGE, params=[start, end, r, g, b]) + + def set_all(self, r, g, b): + """ + Set the color of the entire strip. + + :param int r: red color value (0-255) + :param int g: green color value (0-255) + :param int b: blue color value (0-255) + """ + SPI.command(CMD_NEO_SETALL, params=[r, g, b]) + + def set_pixel_hsv(self, pixel, h, s, v): + """ + Set the HSV color of a single pixel. + + :param int pixel: pixel index + :param int h: hue color value (0-255) + :param int s: saturation color value (0-255) + :param int v: value color value (0-255) + """ + SPI.command(CMD_NEO_SETHSV, params=[pixel, h, s, v]) + + def set_range_hsv(self, start, end, h, s, v): + """ + Set the HSV color of a range of pixels. + + :param int start: start index of led range + :param int end: end index of led range + :param int h: hue color value (0-255) + :param int s: saturation color value (0-255) + :param int v: value color value (0-255) + """ + SPI.command(CMD_NEO_SETRANGEHSV, params=[start, end, h, s, v]) + + def set_all_hsv(self, h, s, v): + """ + Set the HSV color of the entire strip. + + :param int h: hue color value (0-255) + :param int s: saturation color value (0-255) + :param int v: value color value (0-255) + """ + SPI.command(CMD_NEO_SETALLHSV, params=[h, s, v]) diff --git a/src/opsoro/hardware/servo.py b/src/opsoro/hardware/servo.py new file mode 100644 index 0000000..089e7b8 --- /dev/null +++ b/src/opsoro/hardware/servo.py @@ -0,0 +1,72 @@ +from opsoro.hardware.spi import SPI + +# > SERVO IN OUT +CMD_SERVO_INIT = 40 # 0 0 Init PCA9685 +CMD_SERVO_ENABLE = 41 # 0 0 Turn on MOSFET +CMD_SERVO_DISABLE = 42 # 0 0 Turn off MOSFET +CMD_SERVO_NEUTRAL = 43 # 0 0 Set all servos to 1500 +CMD_SERVO_SET = 44 # 3 0 Set 1 servo position +CMD_SERVO_SETALL = 45 # 32 0 Set position of all servos + + +class Servo(object): + # > SERVO + def init(self): + """Set up the PCA9685 for driving servos.""" + SPI.command(CMD_SERVO_INIT, delay=0.02) + + def enable(self): + """Turns on the servo power MOSFET, enabling all servos.""" + SPI.command(CMD_SERVO_ENABLE) + + def disable(self): + """Turns off the servo power MOSFET, disabling all servos.""" + SPI.command(CMD_SERVO_DISABLE) + + def neutral(self): + """Set all servos to 1500us.""" + SPI.command(CMD_SERVO_NEUTRAL, delay=0.008) + + def set(self, channel, pos): + """ + Set the position of one servo. + Pos in us, 500 to 2500 + + :param int channel: channel of the servo + :param int pos: position of the servo (500 to 2500) + """ + offtime = (pos + 2) // 4 + SPI.command(CMD_SERVO_SET, params=[channel, offtime >> 8, offtime & 0x00FF], delay=0.008) + + def set_all_us(self, us): + """ + Set all servos to a certain position (us) + + :param int us: position in us + """ + if us == 1500: + neutral() + else: + pos_list = [us for i in range(16)] + self.set_all(pos_list) + + def set_all(self, pos_list): + """ + Set position of all 16 servos using a list. + + :param list pos_list: list of servo positions + """ + spi_params = [] + i = 0 + for pos in pos_list: + if pos is None: + # Tell FW not to update this servo + spi_params.append(0xFF) + spi_params.append(0xFF) + else: + offtime = (pos + 2) // 4 + spi_params.append(offtime >> 8) + spi_params.append(offtime & 0x0FF) + i = i + 1 + + SPI.command(CMD_SERVO_SETALL, params=spi_params, delay=0.008) diff --git a/src/opsoro/hardware/spi.py b/src/opsoro/hardware/spi.py new file mode 100644 index 0000000..051b661 --- /dev/null +++ b/src/opsoro/hardware/spi.py @@ -0,0 +1,66 @@ +# SPI COMMANDS + +CMD_READ = 2 # 0 ? Return result from previous command +CMD_RESET = 3 # 0 0 Reset the ATmega328 + +import time +try: + import spidev +except ImportError: + import dummy_spidev as spidev + +class _SPI(object): + def __init__(self): + """ + SPI class, used to communicate with the shield. + """ + # Setup SPI + self.spi = spidev.SpiDev() + self.spi.open(0, 0) + self.spi.mode = 0b00 + + # TODO: Further testing of SPI speeds + # NeoKeypad.lua started showing strange behavior at 500kHz. + # Presumably because neo_show() disables interrupts momentarily, + # Causing the ATmega328 to miss SPI interrupts + # Touch app shows spikes at 250kHz, but not at 122kHz. + + #self.spi.max_speed_hz = 50000 # 50kHz + #self.spi.max_speed_hz = 500000 # 500kHz + #self.spi.max_speed_hz = 250000 # 250kHz + self.spi.max_speed_hz = 122000 # 122kHz + + def command(self, cmd, params=None, returned=0, delay=0): + """ + Send a command over the SPI bus to the ATmega328. + Optionally reads the result buffer and returns those Bytes. + + :param string cmd: spi command + :param strin params: parameters for the command + :param int returned: size of result reading + :param int delay: delay between sending the command and reading the result + + :return: result buffer (Bytes) + :rtype: list + """ + # Send command + if params: + self.spi.xfer2([cmd] + params) + else: + self.spi.xfer2([cmd]) + + # Delay + if delay: + time.sleep(delay) + + # Read result + if returned: + data = self.spi.xfer2([CMD_READ] + [255 for i in range(returned)]) + # First byte is junk, this is due to the way SPI works + return data[1:] + else: + return + + +SPI = _SPI() +SPI.command(CMD_RESET) diff --git a/src/opsoro/hardware/test_hardware.py b/src/opsoro/hardware/test_hardware.py new file mode 100644 index 0000000..d39ef73 --- /dev/null +++ b/src/opsoro/hardware/test_hardware.py @@ -0,0 +1,358 @@ +class Dummy_Hardware(object): + def __init__(self): + """ + Hardware class, used to communicate with the shield. + """ + pass + + def __del__(self): + pass + + def spi_command(self, cmd, params=None, returned=0, delay=0): + """ + Send a command over the SPI bus to the ATmega328. + Optionally reads the result buffer and returns those Bytes. + + :param string cmd: spi command + :param strin params: parameters for the command + :param int returned: size of result reading + :param int delay: delay between sending the command and reading the result + + :return: result buffer (Bytes) + :rtype: list + """ + return [] + + # > GENERAL + def ping(self): + """ + Returns True if OPSOROHAT rev3 is connected. + + :return: True if shield is connected + :rtype: bool + """ + return True + + def reset(self): + """Resets the ATmega328, MPR121 and PCA9685.""" + pass + + def led_on(self): + """Turns status LED on.""" + pass + + def led_off(self): + """Turns status LED off.""" + pass + + # > I2C + def i2c_detect(self, addr): + """ + Returns True if an I2C device is found at a particular address. + + :param int addr: address of the I2C device. + + :return: I2C device detected + :rtype: bool + """ + return True + + def i2c_read8(self, addr, reg): + """ + Read a Byte from an I2C device. + + :param int addr: address of the I2C device. + :param int reg: register address in the I2C device + + :return: what is the function returning? + :rtype: var + """ + return 0 + + def i2c_write8(self, addr, reg, data): + """ + Write a Byte to an I2C device. + + :param int addr: address of the I2C device. + :param int reg: register address in the I2C device + :param var data: Byte to send + """ + pass + + def i2c_read16(self, addr, reg): + """ + Read 2 bytes from an I2C device. + + :param int addr: address of the I2C device. + :param int reg: register address in the I2C device + + :return: 2 Bytes + :rtype: var + """ + + return 0 + + def i2C_write16(self, addr, reg, data): + """ + Write 2 bytes to an I2C device. + + :param int addr: address of the I2C device. + :param int reg: register address in the I2C device + :param var data: Bytes to send + """ + pass + + # > SERVO + def servo_init(self): + """Set up the PCA9685 for driving servos.""" + pass + + def servo_enable(self): + """Turns on the servo power MOSFET, enabling all servos.""" + pass + + def servo_disable(self): + """Turns off the servo power MOSFET, disabling all servos.""" + pass + + def servo_neutral(self): + """Set all servos to 1500us.""" + pass + + def servo_set(self, channel, pos): + """ + Set the position of one servo. + Pos in us, 500 to 2500 + + :param int channel: channel of the servo + :param int pos: position of the servo (500 to 2500) + """ + pass + + def servo_set_all(self, pos_list): + """ + Set position of all 16 servos using a list. + + :param list pos_list: list of servo positions + """ + pass + + # > CAPACITIVE TOUCH + def cap_init(self, electrodes, gpios=0, autoconfig=True): + """ + Initialize the MPR121 capacitive touch sensor. + + :param int electrodes: amount of electrodes + :param int gpios: amount of gpios + :param bool autoconfig: + """ + pass + + def cap_set_threshold(self, electrode, touch, release): + """ + Set an electrode's touch and release threshold. + + :param int electrode: index of electrode + :param int touch: threshold value for touch detection + :param int release: threshold value for release detection + """ + pass + + def cap_get_filtered_data(self): + """ + Get list of electrode filtered data (10 bits per electrode). + + :return: electrode filtered data (10 bits per electrode). + :rtype: list + """ + return [] + + def cap_get_baseline_data(self): + """ + Get list of electrode baseline data. + Result is 10 bits, but the 2 least significant bits are set to 0. + + :return: electrode baseline data (10 bits). + :rtype: list + """ + return [] + + def cap_get_touched(self): + """ + Returns the values of the touch registers, + each bit corresponds to one electrode. + + :return: values of the touch registers, + :rtype: list + """ + return [] + + def cap_set_gpio_pinmode(self, gpio, pinmode): + """ + Sets a GPIO channel's pin mode. + + :param int gpio: gpio channel + :param int pinmode: pinmode to set + """ + pass + + def cap_read_gpio(self): + """ + Returns the status of all GPIO channels, + each bit corresponds to one gpio channel. + + :return: status of all GPIO channels. + :rtype: list + """ + return [] + + def cap_write_gpio(self, gpio, data): + """ + Set GPIO channel value. + + :param int gpio: gpio channel + :param int data: data to write to gpio channel. + """ + pass + + # > NEOPIXEL + def neo_init(self, num_leds): + """ + Initialize the NeoPixel library. + + :param int num_leds: number of neopixel leds. + """ + pass + + def neo_enable(self): + """ + Turns on the NeoPixel MOSFET, enabling the NeoPixels. + Data is lost when pixels are disabled, so call neo_show() again afterwards. + """ + pass + + def neo_disable(self): + """ + Turns off the NeoPixel MOSFET, disabling the NeoPixels. + Data is lost when pixels are disabled. + """ + pass + + def neo_set_brightness(self, brightness): + """ + Set the NeoPixel's global brightness, 0-255. + + :param int brightness: brightness to set (0-255) + """ + pass + + def neo_show(self): + """Sends the pixel data from the ATmega328 to the NeoPixels.""" + pass + + def neo_set_pixel(self, pixel, r, g, b): + """ + Set the color of a single pixel. + + :param int pixel: pixel index + :param int r: red color value (0-255) + :param int g: green color value (0-255) + :param int b: blue color value (0-255) + """ + pass + + def neo_set_range(self, start, end, r, g, b): + """ + Set the color of a range of pixels. + + :param int start: start index of led range + :param int end: end index of led range + :param int r: red color value (0-255) + :param int g: green color value (0-255) + :param int b: blue color value (0-255) + """ + pass + + def neo_set_all(self, r, g, b): + """ + Set the color of the entire strip. + + :param int r: red color value (0-255) + :param int g: green color value (0-255) + :param int b: blue color value (0-255) + """ + pass + + def neo_set_pixel_hsv(self, pixel, h, s, v): + """ + Set the HSV color of a single pixel. + + :param int pixel: pixel index + :param int h: hue color value (0-255) + :param int s: saturation color value (0-255) + :param int v: value color value (0-255) + """ + pass + + def neo_set_range_hsv(self, start, end, h, s, v): + """ + Set the HSV color of a range of pixels. + + :param int start: start index of led range + :param int end: end index of led range + :param int h: hue color value (0-255) + :param int s: saturation color value (0-255) + :param int v: value color value (0-255) + """ + pass + + def neo_set_all_hsv(self, h, s, v): + """ + Set the HSV color of the entire strip. + + :param int h: hue color value (0-255) + :param int s: saturation color value (0-255) + :param int v: value color value (0-255) + """ + pass + + # > ANALOG + def ana_read_channel(self, channel): + """ + Reads the value of a single analog channel. + + :param int channel: analog channel to read + + :return: analog value of the channel + :rtype: var + """ + return 0 + + def ana_read_all_channels(self): + """ + Reads all analog channels and returns them as a list. + + :return: analog values + :rtype: list + """ + return [] + + # Methods for backward compatibility + # servo_power_on = servo_enable + # servo_power_off = servo_disable + # set_servo_us = servo_set + + def set_all_servo_us(self, us): + """ + Set all servos to a certain position (us) + + :param int us: position in us + """ + if us == 1500: + self.servo_neutral() + else: + pos_list = [us for i in range(16)] + self.servo_set_all(pos_list) + +# Global instance that can be accessed by apps and scripts +Hardware = Dummy_Hardware() diff --git a/src/opsoro/hardware/usb_serial.py b/src/opsoro/hardware/usb_serial.py new file mode 100644 index 0000000..f26ca51 --- /dev/null +++ b/src/opsoro/hardware/usb_serial.py @@ -0,0 +1,58 @@ +import glob + +import serial as pyserial + +from opsoro.console_msg import * + + +class _Serial(object): + # > SERIAL + def __init__(self): + """ + Initialize serial. + """ + self.ports = [] + self.port = None + self.scan() + + def scan(self): + """ + Scan for serial ports. + """ + visible_ports = glob.glob('/dev/ttyACM[0-9]*') + self.ports = [] + for port in visible_ports: + try: + print_info(port) + s = pyserial.Serial(port) + s.close() + self.ports.append(port) + except Exception as e: + print e + pass + print_info(self.ports) + + # def connect(self, port, baudrate): + # self.port = pyserial.Serial("/dev/ttyACM0", baudrate = 9600, timeout = 2) + # pass + + # def readline(self): + # pass + + def send(self, data, port_id=0, baudrate=9600): + """ + Connect to serial port, send data to the serial port, close the serial port. + + :param string data: data to send to the serial port + :param int port_id: serial port id + :param int baudrate: baudrate + """ + try: + s = pyserial.Serial(self.ports[port_id], baudrate) + s.write(data) + s.close() + except Exception as e: + print_error('Error sending serial command.') + + +Serial = _Serial() diff --git a/src/opsoro/module/__init__.py b/src/opsoro/module/__init__.py index 3e87248..91c58e4 100644 --- a/src/opsoro/module/__init__.py +++ b/src/opsoro/module/__init__.py @@ -1,10 +1,11 @@ -from opsoro.dof.servo import Servo -from opsoro.dof import DOF +import time + from opsoro.console_msg import * +from opsoro.dof import DOF +from opsoro.dof.servo import Servo -import time -constrain = lambda n, minn, maxn: max(min(maxn, n), minn) +def constrain(n, minn, maxn): return max(min(maxn, n), minn) class Module(object): @@ -15,10 +16,10 @@ def __init__(self, data=None): :param dict data: configuration data to setup the module """ self.name = "" + self.position = {} self.size = {} self.dofs = {} - # self.servos = [] if data is not None: self.load_module(data) @@ -52,19 +53,43 @@ def update(self): updated = True return updated - def set_dof_value(self, dof_name, dof_value, anim_time=-1): + def set_dof_value(self, dof_name, value, anim_time=-1): """ - Apply poly values r and phi to the module and calculate dof values + Set the value of a dof with the given name. If no name is provided, all dofs are set with the given value. :param string dof_name: name of the DOF - :param string dof_value: value to set the DOF + :param float value: value to set the DOF :param int anim_time: animation time in ms """ if dof_name is None: for name, dof in self.dofs.iteritems(): - dof.set_value(dof_value, anim_time) + dof.set_value(value, anim_time) else: - self.dofs[dof_name].set_value(dof_value, anim_time) + self.dofs[dof_name].set_value(value, anim_time) + + def set_dof(self, tags=[], value=0, anim_time=-1): + """ + Set the value of a dof with the given tags. If no tags are provided, all dofs are set with the given value. + + :param list tags: name of the DOF + :param float value: value to set the DOF + :param int anim_time: animation time in ms + """ + if type(tags) is not type([]): + try: + tags = tags.split(' ') + except Exception as e: + print_warning('Unknow tag format. Unable to split unicode.') + + for name, dof in self.dofs.iteritems(): + all_tags = True + for tag in tags: + if tag not in dof.tags: + all_tags = False + break + + if all_tags: + dof.set_value(value, anim_time) def load_module(self, data): """ @@ -80,13 +105,10 @@ def load_module(self, data): self.position = {} self.size = {} - if 'canvas' in data: - canvas_data = data['canvas'] + if 'grid' in data: + canvas_data = data['grid'] self.position['x'] = canvas_data['x'] self.position['y'] = canvas_data['y'] - - self.size['width'] = canvas_data['width'] - self.size['height'] = canvas_data['height'] self.size['rotation'] = canvas_data['rotation'] if 'dofs' in data: @@ -100,12 +122,8 @@ def load_module(self, data): neutral = 0.0 poly = None - if 'mapping' in dof_data: - mapping_data = dof_data['mapping'] - if 'neutral' in mapping_data: - neutral = mapping_data['neutral'] - if 'poly' in mapping_data: - poly = mapping_data['poly'] + if 'poly' in dof_data: + poly = dof_data['poly'] dof = None if 'servo' in dof_data: @@ -119,6 +137,11 @@ def load_module(self, data): else: dof = DOF(dof_name, neutral, poly) + # Add type and name as tags + dof.tags.extend(data['type'].split(' ')) + dof.tags.extend(self.name.split(' ')) + dof.tags.extend(dof_name.split(' ')) + self.dofs[dof.name] = dof def alive_trigger(self, count_seed=1): diff --git a/src/opsoro/module/eye/__init__.py b/src/opsoro/module/eye/__init__.py index fabcc43..e34135b 100644 --- a/src/opsoro/module/eye/__init__.py +++ b/src/opsoro/module/eye/__init__.py @@ -1,10 +1,13 @@ -from opsoro.module import Module +import time +from random import randint + +from noise import pnoise1 + from opsoro.console_msg import * +from opsoro.module import Module from opsoro.preferences import Preferences -from noise import pnoise1 -import time -from random import randint + # import math @@ -63,13 +66,13 @@ def look(self, x=0, y=0, z=0): # self.last_look_position = Robot.look_at_position - self.dofs['pupil_horizontal'].set_overlay_value(0.0 + self.last_look_position[0], -1) + self.dofs['horizontal'].set_overlay_value(0.0 + self.last_look_position[0], -1) # float(self.look_speed) / 1000.0) # pupil_vertical # oldDOFvalVER = float(self.dofs['pupil_vertical'].value) + 0.01 - self.dofs['pupil_vertical'].set_overlay_value(0.0 + self.last_look_position[1], -1) + self.dofs['vertical'].set_overlay_value(0.0 + self.last_look_position[1], -1) # float(self.look_speed) / 1000.0) # self.look_delay = randint(self.look_delay_default*0.5, self.look_delay_default*1.5) @@ -88,9 +91,9 @@ def blink(self, anim_time=0.4): currentTime = int(round(time.time() * 1000)) if self.blink_return: # print_info(currentTime - self.last_blink_time) - if (currentTime - self.dofs['eyelid_closure'].last_set_time) > (self.blink_delay + (anim_time * 500)): + if (currentTime - self.dofs['lid'].last_set_time) > (self.blink_delay + (anim_time * 500)): # print_info('alive: blink open: ' + str(self.last_blink_time)) - self.dofs['eyelid_closure'].reset_overlay(float(anim_time) / 2.0) + self.dofs['lid'].reset_overlay(float(anim_time) / 2.0) # self.dofs['eyelid_closure'].set_overlay_value( # 0.5, float(anim_time) / 2.0) self.blink_return = False @@ -99,8 +102,8 @@ def blink(self, anim_time=0.4): return True else: # print_info('alive: blink close: ' + str(self.last_blink_time)) - self.dofs['eyelid_closure'].last_set_time = currentTime - self.blink_delay - self.dofs['eyelid_closure'].set_overlay_value(-1.0, float(anim_time) / 2.0, False) + self.dofs['lid'].last_set_time = currentTime - self.blink_delay + self.dofs['lid'].set_overlay_value(-1.0, float(anim_time) / 2.0, False) self.blink_return = True return True return False @@ -116,12 +119,12 @@ def alive_trigger(self, count_seed): """ currentTime = int(round(time.time() * 1000)) updated = False - if Preferences.get('alive', 'blink', False): - if (currentTime - self.dofs['eyelid_closure'].last_set_time) > self.blink_delay: + if Preferences.get('behaviour', 'blink', False): + if (currentTime - self.dofs['lid'].last_set_time) > self.blink_delay: updated = self.blink(self.blink_speed / 1000.0) - if Preferences.get('alive', 'gaze', False): - if (currentTime - self.dofs['pupil_horizontal'].last_set_time) > self.look_delay: + if Preferences.get('behaviour', 'gaze', False): + if (currentTime - self.dofs['horizontal'].last_set_time) > self.look_delay: # Update random looking position # if Robot.look_at_position == self.last_look_position: for i in range(len(self.last_look_position)): diff --git a/src/opsoro/module/rotation/__init__.py b/src/opsoro/module/rotation/__init__.py deleted file mode 100644 index 966afab..0000000 --- a/src/opsoro/module/rotation/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from opsoro.module import Module - - -class Rotation(Module): - pass diff --git a/src/opsoro/module/turn/__init__.py b/src/opsoro/module/turn/__init__.py new file mode 100644 index 0000000..1ddccac --- /dev/null +++ b/src/opsoro/module/turn/__init__.py @@ -0,0 +1,5 @@ +from opsoro.module import Module + + +class Turn(Module): + pass diff --git a/src/opsoro/module/rotation/img/icon_rotation.svg b/src/opsoro/module/turn/img/icon_turn.svg similarity index 100% rename from src/opsoro/module/rotation/img/icon_rotation.svg rename to src/opsoro/module/turn/img/icon_turn.svg diff --git a/src/opsoro/modules/eye/specs.yaml b/src/opsoro/modules/eye/specs.yaml new file mode 100644 index 0000000..bb35a6f --- /dev/null +++ b/src/opsoro/modules/eye/specs.yaml @@ -0,0 +1,66 @@ +type: eye + +size: + width: 70 + height: 48 + +dofs: + - name: horizontal + servo: + min: -300 + max: 300 + - name: vertical + servo: + min: -300 + max: 300 + - name: lid + servo: + min: -400 + max: 450 + +functions: + close: + params: [time] + async: true + actions: + - dof: lid + value: -1 + time: time + + open: + params: [time] + async: true + actions: + - dof: lid + value: null + time: time + + blink: + params: [time] + sync: false + actions: + - action: close + params: { time: [time/2] } + - action: open + params: { time: [time/2] } + + look: + params: [x, y, z] + async: true + actions: + - dof: horizontal + value: x + time: -1 + - dof: vertical + value: y + time: -1 + +behaviour: + - action: blink + link: true + params: { time: [100, 500] } + delay: [2000, 10000] + - action: look + link: true + params: { x: [-1, 1], y: [-1, 1], z: [-1, 1] } + delay: [1000, 5000] diff --git a/src/opsoro/modules/heart/specs.yaml b/src/opsoro/modules/heart/specs.yaml new file mode 100644 index 0000000..00b6862 --- /dev/null +++ b/src/opsoro/modules/heart/specs.yaml @@ -0,0 +1,5 @@ +type: heart + +size: + width: 121 + height: 45 diff --git a/src/opsoro/modules/mouth/specs.yaml b/src/opsoro/modules/mouth/specs.yaml new file mode 100644 index 0000000..e0c1341 --- /dev/null +++ b/src/opsoro/modules/mouth/specs.yaml @@ -0,0 +1,15 @@ +type: mouth + +size: + width: 121 + height: 38 + +dofs: + - name: rotation left + servo: + min: 250 + max: -250 + - name: rotation right + servo: + min: 250 + max: -250 diff --git a/src/opsoro/modules/speaker/specs.yaml b/src/opsoro/modules/speaker/specs.yaml new file mode 100644 index 0000000..4d497d6 --- /dev/null +++ b/src/opsoro/modules/speaker/specs.yaml @@ -0,0 +1,5 @@ +type: speaker + +size: + width: 57 + height: 47 diff --git a/src/opsoro/modules/turn/specs.yaml b/src/opsoro/modules/turn/specs.yaml new file mode 100644 index 0000000..f8891e4 --- /dev/null +++ b/src/opsoro/modules/turn/specs.yaml @@ -0,0 +1,9 @@ +type: turn + +size: + width: 57 + height: 19 + +dofs: + - name: rotation + servo: diff --git a/src/opsoro/play.py b/src/opsoro/play.py new file mode 100644 index 0000000..13ebf6e --- /dev/null +++ b/src/opsoro/play.py @@ -0,0 +1,59 @@ +import urllib + +import requests + +from opsoro.console_msg import * + +# PLAY_URL = 'https://robot.opsoro.be/' +PLAY_URL = 'https://opsoro.be/' + + +class _Play(object): + def __init__(self): + self.uuid = None + self.token = None + self.username = None + self.password = None + pass + + def is_online(self): + try: + data = urllib.urlopen(PLAY_URL) + return True + except Exception as e: + return False + + def login(self, username=None, password=None): + if username is not None: + self.username = username + if password is not None: + self.password = password + + if not self.is_online(): + return False + + url_login = PLAY_URL + 'accounts/login/' + url_run = PLAY_URL + 'robot/token/' + + # # Use 'with' to ensure the session context is closed after use. + with requests.Session() as s: + s.get(url_login) + csrftoken = s.cookies['csrftoken'] + payload = { + 'username': self.username, + 'password': self.password, + 'csrfmiddlewaretoken': csrftoken, + 'next': url_run + } + p = s.post(url_login, data=payload, headers=dict(Referer=url_login)) + returns = p.text.split('\n') + if len(returns) == 2: + self.uuid = returns[0] + self.token = returns[1] + return True + else: + print_error('Unable to parse play.opsoro uuid and token') + return False + + +Play = _Play() diff --git a/src/opsoro/preferences.py b/src/opsoro/preferences.py index bd9dcda..50a2b63 100644 --- a/src/opsoro/preferences.py +++ b/src/opsoro/preferences.py @@ -14,7 +14,6 @@ import os import subprocess import re -from git import Git, Repo from functools import partial import yaml @@ -36,102 +35,6 @@ def __init__(self): """ self.data = {} self.load_prefs() - self.dir = os.path.abspath( - os.path.join(os.path.dirname(__file__), '..', '..')) + '/' - - self.git = None - self.repo = None - try: - self.git = Git(self.dir) - self.repo = Repo(self.dir) - except: - pass - - def get_current_branch(self): - """ - Retrieves the current git branch of the repository. - - :return: current git branch. - :rtype: string - """ - if self.git is None: - return False - try: - return self.git.branch().split()[-1] - except: - print_error( - "Failed to get current branch, is there a git repo setup?") - return "" - - def get_remote_branches(self): - """ - Retrieve all git branches of the repository. - - :return: branches of the repository. - :rtype: list - """ - if self.git is None: - return False - branches = [] - - try: - # Get all remote branches (not only local) - returnvalue = self.git.ls_remote('--heads').split() - - # Strip data - for i in range(len(returnvalue)): - if i % 2 != 0: - # Get only branch name (last value) - branches.append(returnvalue[i].split("/")[-1]) - except: - print_warning( - "Failed to get remote branches, is there a git repo setup and do you have internet?") - pass - - return branches - - def check_if_update(self): - """ - Checks git repository for available changes. - - :return: True if update is available, False if the command failed or no update available. - :rtype: bool - """ - if self.git is None: - return False - try: - # Update local git data - self.git.fetch() - except: - print_warning( - "Failed to fetch, is there a git repo setup and do you have internet?") - return False - # Retrieve git remote <-> local difference status - status = self.git.status() - # easy check to see if local is behind - if status.find('behind') > 0: - return True - return False - - def update(self): - """ - Creates a update file flag and restarts the service. - """ - if self.git is None: - return False - # Create file to let deamon know it has to update before starting the server - file = open(self.dir + 'update.var', 'w+') - - # restart service - command = ['/usr/sbin/service', 'opsoro', 'restart'] - #shell=FALSE for sudo to work. - subprocess.call(command, shell=False) - - python = sys.executable - os.execl(python, python, *sys.argv) - - # # Reboot system used for user development server run - # os.system('/sbin/shutdown -r now') def load_prefs(self): """ @@ -179,9 +82,7 @@ def save_prefs(self): """ try: with open(get_path("config/preferences.yaml"), "w") as f: - f.write( - yaml.dump( - self.data, default_flow_style=False, Dumper=Dumper)) + f.write(yaml.dump(self.data, default_flow_style=False, Dumper=Dumper)) except IOError: print_warning("Could not save config/preferences.yaml") @@ -212,36 +113,43 @@ def change_conf_setting(txt, name, val): FNULL = open(os.devnull, "w") if update_audio: - vol = self.get("audio", "master_volume", 66) - vol = constrain(vol, 0, 100) - - subprocess.Popen( - ["amixer", "sset", "'Master'", "%d%%" % vol], - stdout=FNULL, - stderr=subprocess.STDOUT) - - if update_wireless: - with open("/etc/hostapd/hostapd.conf", "r+") as f: - lines = f.read() - - ssid = self.get("wireless", "ssid", "OPSORO-bot") - password = self.get("wireless", "password", "opsoro123") - channel = self.get("wireless", "channel", 6) - channel = constrain(int(channel), 1, 11) + try: + vol = self.get("audio", "master_volume", 66) + vol = constrain(vol, 0, 100) - lines = change_conf_setting(lines, "ssid", ssid) - lines = change_conf_setting(lines, "wpa_passphrase", password) - lines = change_conf_setting(lines, "channel", channel) - - f.seek(0) - f.write(lines) - f.truncate() - - if restart_wireless: subprocess.Popen( - ["service", "hostapd", "restart"], + ["amixer", "sset", "'Master'", "%d%%" % vol], stdout=FNULL, stderr=subprocess.STDOUT) + except Exception as e: + print_error('Preferences: audio could not update.') + + if update_wireless: + try: + with open("/etc/hostapd/hostapd.conf", "r+") as f: + lines = f.read() + + ssid = self.get("wireless", "ssid", "OPSORO-bot") + password = self.get("wireless", "password", "opsoro123") + channel = self.get("wireless", "channel", 6) + channel = constrain(int(channel), 1, 11) + + lines = change_conf_setting(lines, "ssid", ssid) + lines = change_conf_setting(lines, "wpa_passphrase", password) + lines = change_conf_setting(lines, "channel", channel) + + f.seek(0) + f.write(lines) + f.truncate() + + if restart_wireless: + subprocess.Popen( + ["service", "hostapd", "restart"], + stdout=FNULL, + stderr=subprocess.STDOUT) + except Exception as e: + print_error('Preferences: wifi could not update.') + if update_dns: with open("/etc/dnsmasq.d/dnsmasq.opsoro.conf", "r+") as f: diff --git a/src/opsoro/robot.py b/src/opsoro/robot.py index f023a7e..13e1987 100644 --- a/src/opsoro/robot.py +++ b/src/opsoro/robot.py @@ -8,35 +8,50 @@ """ +import os +import time +from functools import partial + +from enum import IntEnum +from flask_login import current_user + from opsoro.console_msg import * -from opsoro.stoppable_thread import StoppableThread from opsoro.hardware import Hardware +from opsoro.module import * +from opsoro.module.eye import Eye +from opsoro.module.mouth import Mouth +from opsoro.module.turn import Turn from opsoro.preferences import Preferences - -from functools import partial -import os -import time +from opsoro.stoppable_thread import StoppableThread +from opsoro.users import Users try: import simplejson as json except ImportError: import json + get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) -# Modules -from opsoro.module import * -from opsoro.module.eye import Eye -from opsoro.module.eyebrow import Eyebrow -from opsoro.module.mouth import Mouth -MODULES = {'eye': Eye, 'eyebrow': Eyebrow, 'mouth': Mouth} +MODULES = {'eye': Eye, 'turn': Turn, 'mouth': Mouth} class _Robot(object): + class Activation(IntEnum): + MANUAL = 0 # 0: Manual start/stop + AUTO = 1 # 1: Start robot automatically (alive feature according to preferences) + AUTO_ALIVE = 2 # 2: Start robot automatically and enable alive feature + AUTO_NOT_ALIVE = 3 # 3: Start robot automatically and disable alive feature + + class Connection(IntEnum): + OFFLINE = 0 # 0: No online capability + PARTLY = 1 # 1: Needs online for extras, but works without + ONLINE = 2 # 2: Requires to be online to work + def __init__(self): self.modules = {} - self._config = {} + self.config = {} self.load_config() self._dof_t = None self._alive_t = None @@ -48,21 +63,24 @@ def __init__(self): self._alive_count_seed = 1.0 self._add_seed = 0.2 - def start(self): + def start(self, alive=True): print_info('Start Robot loop') with Hardware.lock: - Hardware.servo_init() + Hardware.Servo.init() self.start_update_loop() - if Preferences.get('alive', 'enabled', False): - self.start_alive_loop() + if alive: + if Preferences.get('behaviour', 'enabled', False): + self.start_alive_loop() def start_update_loop(self): + Users.broadcast_robot({'dofs': self.get_dof_values(False)}, True) + if self._dof_t is not None: self._dof_t.stop() with Hardware.lock: - Hardware.servo_enable() + Hardware.Servo.enable() self._dof_t = StoppableThread(target=self.dof_update_loop) @@ -72,7 +90,7 @@ def stop_update_loop(self): if self.auto_enable_servos: with Hardware.lock: - Hardware.servo_disable() + Hardware.Servo.disable() def start_alive_loop(self): if self._alive_t is not None: @@ -87,47 +105,63 @@ def stop(self): print_info('Stop Robot loop') with Hardware.lock: - Hardware.servo_disable() + Hardware.Servo.disable() self.stop_alive_loop() self.stop_update_loop() - def config(self, config=None): + def set_config(self, config=None): if config is not None and len(config) > 0: - self._config = json.loads(config) + save_new_config = (self.config != config) + self.config = json.loads(config) # Create all module-objects from data self.modules = {} modules_count = {} - for module_data in self._config['modules']: - if module_data['module'] in MODULES: + for module_data in self.config['modules']: + module_type = module_data['type'] + if module_type in MODULES: # Create module object - module = MODULES[module_data['module']](module_data) + module = MODULES[module_type](module_data) # Count different modules - if module_data['module'] not in modules_count: - modules_count[module_data['module']] = 0 - modules_count[module_data['module']] += 1 + if module_type not in modules_count: + modules_count[module_type] = 0 + modules_count[module_type] += 1 + + if module.name in self.modules: + for i in range(1000): + if ('%s %i' % (module.name, i)) not in self.modules: + module.name = ('%s %i' % (module.name, i)) + break + self.modules[module.name] = module # print module feedback print_info("Modules: " + str(modules_count)) - return self._config + + if save_new_config: + self.save_config() + Users.broadcast_robot({'refresh': True}) + return self.config + + def set_dof(self, tags=[], value=0, anim_time=-1): + for name, module in self.modules.iteritems(): + module.set_dof(tags, value, anim_time) + self.start_update_loop() def set_dof_value(self, module_name, dof_name, dof_value, anim_time=-1): if module_name is None: for name, module in self.modules.iteritems(): module.set_dof_value(None, dof_value, anim_time) else: - self.modules[module_name].set_dof_value(dof_name, dof_value, - anim_time) + self.modules[module_name].set_dof_value(dof_name, dof_value, anim_time) self.start_update_loop() def set_dof_values(self, dof_values, anim_time=-1): for module_name, dofs in dof_values.iteritems(): for dof_name, dof_value in dofs.iteritems(): - self.modules[module_name].set_dof_value(dof_name, dof_value, - anim_time) + self.modules[module_name].set_dof_value(dof_name, dof_value, anim_time) self.start_update_loop() @@ -135,25 +169,27 @@ def set_dof_list(self, dof_values, anim_time=-1): for name, module in self.modules.iteritems(): for name, dof in module.dofs.iteritems(): if hasattr(dof, 'pin') and dof.pin is not None: - if dof.pin > 0 and dof.pin < len(dof_values): + if dof.pin >= 0 and dof.pin < len(dof_values): dof.set_value(dof_values[dof.pin], anim_time) self.start_update_loop() - def get_dof_values(self): + def get_dof_values(self, current=True): dofs = [] for i in range(16): dofs.append(0) for module_name, module in self.modules.iteritems(): for dof_name, dof in module.dofs.iteritems(): - if hasattr(dof, 'pin'): - dofs[int(dof.pin)] = float(dof.value) + if hasattr(dof, 'pin') and dof.pin is not None: + if dof.pin >= 0 and dof.pin < len(dofs): + if current: + dofs[dof.pin] = float(dof.value) + else: + dofs[dof.pin] = float(dof.to_value) return dofs def apply_poly(self, r, phi, anim_time=-1): - # print_info('Apply robot poly; r: %f, phi: %f, time: %f' % - # (r, phi, anim_time)) for name, module in self.modules.iteritems(): module.apply_poly(r, phi, anim_time) @@ -190,39 +226,41 @@ def update(self): for name, module in self.modules.iteritems(): if module.update(): updated = True + return updated - def load_config(self, file_name='default.conf'): + def load_config(self, file_name='robot_config.conf'): # Load modules from file if file_name is None: return False try: with open(get_path("config/" + file_name)) as f: - self._config = f.read() + self.config = f.read() - if self._config is None or len(self._config) == 0: + if self.config is None or len(self.config) == 0: print_warning("Config contains no data: " + file_name) return False + + self.set_config(self.config) # print module feedback - print_info("Modules loaded [" + file_name + "]") - self.config(self._config) + print_info("%i modules loaded [%s]" % (len(self.modules), file_name)) except IOError: - self._config = {} + self.config = {} print_warning("Could not open " + file_name) return False return True - def save_config(self, file_name='default.conf'): + def save_config(self, file_name='robot_config.conf'): # Save modules to json file if file_name is None: return False try: with open(get_path("config/" + file_name), "w") as f: - f.write(json.dumps(self._config)) + f.write(json.dumps(self.config)) print_info("Modules saved: " + file_name) except IOError: print_warning("Could not save " + file_name) @@ -234,5 +272,16 @@ def blink(self, speed): if hasattr(module, 'blink'): module.blink(speed) + def sleep(self): + print_info('Night night... ZZZZzzzz....') + self.set_dof(['eye', 'lid'], -1) + pass + + def wake(self): + print_info('I am awake!') + self.set_dof(['eye', 'lid'], 1) + pass + + # Global instance that can be accessed by apps and scripts Robot = _Robot() diff --git a/src/opsoro/server/__init__.py b/src/opsoro/server/__init__.py index e9cf653..c92046c 100644 --- a/src/opsoro/server/__init__.py +++ b/src/opsoro/server/__init__.py @@ -1,417 +1,204 @@ -from flask import Flask, request, render_template, redirect, url_for, flash, session, jsonify, send_from_directory -from flask_babel import Babel -from flask_login import LoginManager, logout_user, current_user, login_required +import atexit +import base64 +import logging +import os +import threading +from functools import partial, wraps -from tornado.wsgi import WSGIContainer -from tornado.ioloop import IOLoop -import tornado.web +import pluginbase import tornado.httpserver -from sockjs.tornado import SockJSRouter, SockJSConnection -from functools import wraps, partial +import tornado.web +from flask import (Flask, flash, jsonify, redirect, render_template, request, + send_from_directory, session, url_for) +from flask_babel import Babel +from flask_login import current_user, logout_user +from sockjs.tornado import SockJSRouter +from tornado import web +from tornado.ioloop import IOLoop +from tornado.wsgi import WSGIContainer -from opsoro.expression import Expression -from opsoro.robot import Robot +from opsoro.apps import Apps from opsoro.console_msg import * +from opsoro.expression import Expression from opsoro.preferences import Preferences +from opsoro.robot import Robot from opsoro.server.request_handlers import RHandler +from opsoro.users import SocketConnection, Users -import pluginbase -import os -import atexit -import threading -import base64 -import logging - -try: - import simplejson as json - print_info("Using simplejson") -except ImportError: - import json - print_info("Simplejson not available, falling back on json") - -dof_positions = {} # Helper function get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) -# Helper class to deal with login -class AdminUser(object): - def is_authenticated(self): - return True +class Server(object): + def __init__(self): + self.request_handler = RHandler(self) + + # Create flask instance for webserver + self.flaskapp = Flask(__name__) + # self.flaskapp.config['DEBUG'] = True + self.flaskapp.config['TEMPLATES_AUTO_RELOAD'] = True - def is_active(self): - return True + # Translation support + self.flaskapp.config.from_pyfile('settings.cfg') + self.babel = Babel(self.flaskapp) - def is_anonymous(self): - return False + # Setup key for sessions + self.flaskapp.secret_key = "5\x075y\xfe$\x1aV\x1c 0: - threads = threading.enumerate() - for thread in threads: - try: - thread.stop() - thread.join() - except AttributeError: - pass - - def setup_user_loader(self): - @self.login_manager.user_loader - def load_user(id): - if id == "admin": - return AdminUser() - else: - return None - - def register_app_blueprint(self, bp): - assert self.apps_can_register_bp, "Apps can only register blueprints at setup!" - - prefix = "/apps/" + self.current_bp_app - self.flaskapp.register_blueprint(bp, url_prefix=prefix) - - def render_template(self, template, **kwargs): - return self.request_handler.render_template(template, **kwargs) - - def run(self): - # Setup SockJS - class OpsoroSocketConnection(SockJSConnection): - def __init__(conn, *args, **kwargs): - super(OpsoroSocketConnection, conn).__init__(*args, **kwargs) - conn._authenticated = False - conn._activeapp = self.activeapp - - def on_message(conn, msg): - # Attempt to decode JSON - try: - message = json.loads(msg) - except ValueError: - conn.send_error("Invalid JSON") - return - - if not conn._authenticated: - # Attempt to authenticate the socket - try: - if message["action"] == "authenticate": - token = base64.b64decode(message["token"]) - if token == self.sockjs_token and self.sockjs_token is not None: - # Auth succeeded - conn._authenticated = True - - # Trigger connect callback - if conn._activeapp in self.sockjs_connect_cb: - self.sockjs_connect_cb[conn._activeapp]( - conn) - - return - - # Auth failed - return - except KeyError: - # Auth failed - return - else: - # Decode action and trigger callback, if it exists. - action = message.pop("action", "") - if conn._activeapp in self.sockjs_message_cb: - if action in self.sockjs_message_cb[conn._activeapp]: - self.sockjs_message_cb[conn._activeapp][action]( - conn, message) - - def on_open(conn, info): - # Connect callback is triggered when socket is authenticated. - pass - - def on_close(conn): - if conn._authenticated: - if conn._activeapp in self.sockjs_disconnect_cb: - self.sockjs_disconnect_cb[conn._activeapp](conn) - - def send_error(conn, message): - return conn.send( - json.dumps({ - "action": "error", - "status": "error", - "message": message - })) - - def send_data(conn, action, data): - msg = {"action": action, "status": "success"} - msg.update(data) - return conn.send(json.dumps(msg)) - - flaskwsgi = WSGIContainer(self.flaskapp) - socketrouter = SockJSRouter(OpsoroSocketConnection, "/sockjs") - - tornado_app = tornado.web.Application(socketrouter.urls + [( - r".*", tornado.web.FallbackHandler, {"fallback": flaskwsgi})]) - tornado_app.listen(80) - - # http_server = tornado.httpserver.HTTPServer(tornado_app, ssl_options={ - # "certfile": "/etc/ssl/certs/server.crt", - # "keyfile": "/etc/ssl/private/server.key", - # }) - # http_server.listen(443) + # Run stop function at exit + atexit.register(self.at_exit) + + def at_exit(self): + print_info('Goodbye!') + + # Sleep robot + Robot.sleep() + + Apps.stop_all() + + if threading.activeCount() > 0: + threads = threading.enumerate() + for thread in threads: try: - IOLoop.instance().start() - except KeyboardInterrupt: - self.stop_current_app() - print "Goodbye!" - - def stop_current_app(self): - Robot.stop() - if self.activeapp in self.apps: - print_appstopped(self.activeapp) - try: - self.apps[self.activeapp].stop(self) - except AttributeError: - print_info("%s has no stop function" % self.activeapp) - self.activeapp = None - - def shutdown(self): - logging.info("Stopping server") - io_loop = IOLoop.instance() - io_loop.stop() - - def protected_view(self, f): - @wraps(f) - def wrapper(*args, **kwargs): - if current_user.is_authenticated: - if current_user.is_admin(): - if session[ - "active_session_key"] == self.active_session_key: - # the actual page - return f(*args, **kwargs) - else: - logout_user() - session.pop("active_session_key", None) - flash( - "You have been logged out because a more recent session is active.") - return redirect(url_for("login")) - else: - flash( - "You do not have permission to access the requested page. Please log in below.") - return redirect(url_for("login")) - else: - flash( - "You do not have permission to access the requested page. Please log in below.") - return redirect(url_for("login")) - - return wrapper - - def app_view(self, f): - appname = f.__module__.split(".")[-1] - - @wraps(f) - def wrapper(*args, **kwargs): - # Protected page - if current_user.is_authenticated: - if current_user.is_admin(): - if session[ - "active_session_key"] != self.active_session_key: - logout_user() - session.pop("active_session_key", None) - flash( - "You have been logged out because a more recent session is active.") - return redirect(url_for("login")) - else: - flash( - "You do not have permission to access the requested page. Please log in below.") - return redirect(url_for("login")) - else: - flash( - "You do not have permission to access the requested page. Please log in below.") - return redirect(url_for("login")) - - # Check if app is active - if appname == self.activeapp: - # This app is active - return f(*args, **kwargs) - else: - # Return app not active page - assert appname in self.apps, "Could not find %s in list of loaded apps." % appname - data = { - "app": {}, - # "appname": appname, - "page_icon": self.apps[appname].config["icon"], - "page_caption": self.apps[appname].config["full_name"] - } - data["title"] = self.request_handler.title - if self.activeapp in self.apps: - # Another app is active - data["app"]["active"] = True - data["app"]["name"] = self.apps[self.activeapp].config[ - "full_name"] - data["app"]["icon"] = self.apps[self.activeapp].config[ - "icon"] - data["title"] += " - %s" % self.apps[ - self.activeapp].config["full_name"] - else: - # No app is active - data["app"]["active"] = False - - return render_template("app_not_active.html", **data) - - return wrapper - - def app_api(self, f): - appname = f.__module__.split(".")[-1] - - @wraps(f) - def wrapper(*args, **kwargs): - # Protected page - if current_user.is_authenticated: - if current_user.is_admin(): - if session[ - "active_session_key"] != self.active_session_key: - logout_user() - session.pop("active_session_key", None) - return jsonify( - status="error", - message="You have been logged out because a more recent session is active.") - else: - return jsonify( - status="error", - message="You do not have permission to access the requested page.") - else: - return jsonify( - status="error", - message="You do not have permission to access the requested page.") - - # Check if app is active - if appname == self.activeapp: - # This app is active - data = f(*args, **kwargs) - if data is None: - data = {} - if "status" not in data: - data["status"] = "success" - - return jsonify(data) - else: - # Return app not active page - assert appname in self.apps, "Could not find %s in list of loaded apps." % appname - - return jsonify( - status="error", message="This app is not active.") - - return wrapper - - def app_socket_connected(self, f): - appname = f.__module__.split(".")[-1] - - self.sockjs_connect_cb[appname] = f - - return f - - def app_socket_disconnected(self, f): - appname = f.__module__.split(".")[-1] - - self.sockjs_disconnect_cb[appname] = f - - return f - - def app_socket_message(self, action=""): - def inner(f): - appname = f.__module__.split(".")[-1] - - # Create new dict for app if necessary - if appname not in self.sockjs_message_cb: - self.sockjs_message_cb[appname] = {} - - self.sockjs_message_cb[appname][action] = f - - return f - - return inner + thread.stop() + thread.join() + except AttributeError: + pass + + def render_template(self, template, **kwargs): + return self.request_handler.render_template(template, **kwargs) + + def run(self): + # Setup SockJS + + flaskwsgi = WSGIContainer(self.flaskapp) + + self.socketrouter = SockJSRouter(SocketConnection, '/sockjs') + + tornado_app = tornado.web.Application(self.socketrouter.urls + [(r".*", tornado.web.FallbackHandler, {"fallback": flaskwsgi})]) + tornado_app.listen(80) + + # Wake up robot + Robot.wake() + + # Start default app + startup_app = Preferences.get('general', 'startup_app', None) + if startup_app in Apps.apps: + self.request_handler.page_openapp(startup_app) + + # SSL security + # http_server = tornado.httpserver.HTTPServer(tornado_app, ssl_options={ + # "certfile": "/etc/ssl/certs/server.crt", + # "keyfile": "/etc/ssl/private/server.key", + # }) + # http_server.listen(443) + + try: + # ioloop.PeriodicCallback(UserSocketConnection.dump_stats, 1000).start() + IOLoop.instance().start() + except KeyboardInterrupt: + print_info('Keyboard interupt') + self.at_exit() + + def shutdown(self): + logging.info("Stopping server") + io_loop = IOLoop.instance() + io_loop.stop() + + def protected_view(self, f): + @wraps(f) + def wrapper(*args, **kwargs): + if current_user.is_authenticated: + if current_user.is_admin: + # the actual page + return f(*args, **kwargs) + else: + flash("You do not have permission to access the requested page. Please log in below.") + return redirect(url_for("login")) + else: + flash("You do not have permission to access the requested page. Please log in below.") + return redirect(url_for("login")) + + return wrapper + + def app_view(self, f): + appname = f.__module__.split(".")[-1] + + @wraps(f) + def wrapper(*args, **kwargs): + # Protected page + if current_user.is_authenticated: + if not current_user.is_admin: + flash("You do not have permission to access the requested page. Please log in below.") + return redirect(url_for("login")) + else: + flash("You do not have permission to access the requested page. Please log in below.") + return redirect(url_for("login")) + + # Check if app is active + if appname in Apps.active_apps: + # This app is active + return f(*args, **kwargs) + else: + # Return app not active page + assert appname in Apps.apps, "Could not find %s in list of loaded apps." % appname + data = { + "app": {}, + # "appname": appname, + "page_icon": Apps.apps[appname].config["icon"], + "page_caption": Apps.apps[appname].config["full_name"] + } + data["title"] = self.request_handler.title + # if self.activeapp in Apps.apps: + # # Another app is active + # data["app"]["active"] = True + # data["app"]["name"] = Apps.apps[self.activeapp].config["full_name"] + # data["app"]["icon"] = Apps.apps[self.activeapp].config["icon"] + # data["title"] += " - %s" % Apps.apps[self.activeapp].config["full_name"] + # else: + # # No app is active + # data["app"]["active"] = False + + return render_template("app_not_active.html", **data) + + return wrapper + + def app_api(self, f): + appname = f.__module__.split(".")[-1] + + @wraps(f) + def wrapper(*args, **kwargs): + # Protected page + if current_user.is_authenticated: + if not current_user.is_admin: + return jsonify(status="error", message="You do not have permission to access the requested page.") + else: + return jsonify(status="error", message="You do not have permission to access the requested page.") + + # Check if app is active + if appname in Apps.active_apps: + # This app is active + data = f(*args, **kwargs) + if data is None: + data = {} + if "status" not in data: + data["status"] = "success" + + return jsonify(data) + else: + # Return app not active page + assert appname in Apps.apps, "Could not find %s in list of loaded apps." % appname + + return jsonify(status="error", message="This app is not active.") + + return wrapper diff --git a/src/opsoro/server/request_handlers/__init__.py b/src/opsoro/server/request_handlers/__init__.py index 1761d6c..bcf2375 100644 --- a/src/opsoro/server/request_handlers/__init__.py +++ b/src/opsoro/server/request_handlers/__init__.py @@ -1,55 +1,42 @@ -from flask import Flask, request, render_template, redirect, url_for, flash, session, send_from_directory -from flask_login import login_user, logout_user, current_user -from werkzeug.exceptions import default_exceptions - +import base64 +import glob +import os +import platform +import random +import subprocess from functools import partial -from opsoro.expression import Expression -from opsoro.robot import Robot +from flask import (Flask, flash, redirect, render_template, request, + send_from_directory, session, url_for) +from flask_login import current_user, login_user, logout_user +from sockjs.tornado import SockJSConnection, SockJSRouter +from werkzeug.exceptions import default_exceptions + +from opsoro.apps import Apps from opsoro.console_msg import * +from opsoro.expression import Expression +from opsoro.play import Play from opsoro.preferences import Preferences +from opsoro.robot import Robot from opsoro.server.request_handlers.opsoro_data_requests import * - -import random -import os -import subprocess -import base64 - -import glob +from opsoro.updater import Updater +from opsoro.users import Users, usertypes try: import simplejson as json except ImportError: import json -dof_positions = {} + # Helper function get_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) -# Helper class to deal with login -class AdminUser(object): - def is_authenticated(self): - return True - - def is_active(self): - return True - - def is_anonymous(self): - return False - - def get_id(self): - return "admin" - - def is_admin(self): - return True - - class RHandler(object): def __init__(self, server): # title self.title = "OPSORO play" - self.robotName = "Ono" + self.robotName = "Robot" self.server = server @@ -57,111 +44,39 @@ def set_urls(self): protect = self.server.protected_view - self.server.flaskapp.add_url_rule("/", - "index", - protect(self.page_index), ) - self.server.flaskapp.add_url_rule( - "/login/", - "login", - self.page_login, - methods=["GET", "POST"], ) - self.server.flaskapp.add_url_rule("/logout/", - "logout", - self.page_logout, ) - # self.server.flaskapp.add_url_rule( - # "/preferences", - # "preferences", - # protect(self.page_preferences), - # methods=["GET", "POST"], ) - self.server.flaskapp.add_url_rule("/sockjstoken/", - "sockjstoken", - self.page_sockjstoken, ) - self.server.flaskapp.add_url_rule("/shutdown/", - "shutdown", - protect(self.page_shutdown), ) - self.server.flaskapp.add_url_rule("/closeapp/", - "closeapp", - protect(self.page_closeapp), ) - self.server.flaskapp.add_url_rule("/openapp//", - "openapp", - protect(self.page_openapp), ) - # self.server.flaskapp.add_url_rule( - # "/app//files/", - # "files", - # protect(self.page_files), - # methods=["GET", "POST"], ) + self.server.flaskapp.add_url_rule("/", "index", protect(self.page_index), ) + self.server.flaskapp.add_url_rule("/login/", "login", self.page_login, methods=["GET", "POST"], ) + self.server.flaskapp.add_url_rule("/logout/", "logout", self.page_logout, ) + self.server.flaskapp.add_url_rule("/sockjstoken/", "sockjstoken", self.page_sockjstoken, ) + self.server.flaskapp.add_url_rule("/shutdown/", "shutdown", protect(self.page_shutdown), ) + self.server.flaskapp.add_url_rule("/restart/", "restart", protect(self.page_restart), ) + self.server.flaskapp.add_url_rule("/app/close//", "closeapp", protect(self.page_closeapp), ) + self.server.flaskapp.add_url_rule("/app/open//", "openapp", protect(self.page_openapp), ) + + self.server.flaskapp.add_url_rule("/blockly/", "blockly", protect(self.page_blockly), ) + # ---------------------------------------------------------------------- # DOCUMENTS # ---------------------------------------------------------------------- - self.server.flaskapp.add_url_rule( - "/docs/data//", - "file_data", - protect(docs_file_data), - methods=["GET"], ) - self.server.flaskapp.add_url_rule( - "/docs/save//", - "file_save", - protect(docs_file_save), - methods=["POST"], ) - self.server.flaskapp.add_url_rule( - "/docs/delete//", - "file_delete", - protect(docs_file_delete), - methods=["POST"], ) - self.server.flaskapp.add_url_rule( - "/docs/list/", - "file_list", - protect(self.page_file_list), - methods=["GET"], ) + self.server.flaskapp.add_url_rule("/docs/data//", "file_data", protect(docs_file_data), methods=["GET"], ) + self.server.flaskapp.add_url_rule("/docs/save//", "file_save", protect(docs_file_save), methods=["POST"], ) + self.server.flaskapp.add_url_rule("/docs/delete//", "file_delete", protect(docs_file_delete), methods=["POST"], ) + self.server.flaskapp.add_url_rule("/docs/list/", "file_list", protect(self.page_file_list), methods=["GET"], ) # ---------------------------------------------------------------------- # ROBOT # ---------------------------------------------------------------------- - self.server.flaskapp.add_url_rule( - "/robot/", - "robot", - self.page_virtual, - methods=["GET", "POST"], ) - self.server.flaskapp.add_url_rule( - "/robot/config/", - "robot_config", - protect(robot_config_data), - methods=["GET", "POST"], ) - self.server.flaskapp.add_url_rule( - "/robot/emotion/", - "robot_emotion", - protect(robot_emotion), - methods=["GET", "POST"], ) - self.server.flaskapp.add_url_rule( - "/robot/dof/", - "robot_dof", - protect(robot_dof_data), - methods=["GET", "POST"], ) - self.server.flaskapp.add_url_rule( - "/robot/dofs/", - "robot_dofs", - protect(robot_dofs_data), - methods=["GET", "POST"], ) - self.server.flaskapp.add_url_rule( - "/robot/tts/", - "robot_tts", - protect(robot_tts), - methods=["GET", "POST"], ) - self.server.flaskapp.add_url_rule( - "/robot/sound/", - "robot_sound", - protect(robot_sound), - methods=["GET", "POST"], ) - self.server.flaskapp.add_url_rule( - "/robot/servo/", - "robot_servo", - protect(robot_servo), - methods=["GET", "POST"], ) - self.server.flaskapp.add_url_rule( - "/robot/stop/", - "robot_stop", - protect(robot_stop), - methods=["GET", "POST"], ) + self.server.flaskapp.add_url_rule("/sound/", "sound", self.sound_data, methods=["GET"], ) + self.server.flaskapp.add_url_rule("/robot/", "robot", self.page_virtual, methods=["GET"], ) + self.server.flaskapp.add_url_rule("/config/robot/", "config_robot", protect(config_robot_data), methods=["GET", "POST"], ) + self.server.flaskapp.add_url_rule("/config/expression/", "config_expression", protect(config_expressions_data), methods=["GET", "POST"], ) + self.server.flaskapp.add_url_rule("/robot/emotion/", "robot_emotion", protect(robot_emotion), methods=["GET", "POST"], ) + self.server.flaskapp.add_url_rule("/robot/dof/", "robot_dof", protect(robot_dof_data), methods=["GET", "POST"], ) + self.server.flaskapp.add_url_rule("/robot/dofs/", "robot_dofs", protect(robot_dofs_data), methods=["GET", "POST"], ) + self.server.flaskapp.add_url_rule("/robot/tts/", "robot_tts", protect(robot_tts), methods=["GET", "POST"], ) + self.server.flaskapp.add_url_rule("/robot/sound/", "robot_sound", protect(robot_sound), methods=["GET", "POST"], ) + self.server.flaskapp.add_url_rule("/robot/servo/", "robot_servo", protect(robot_servo), methods=["GET", "POST"], ) + self.server.flaskapp.add_url_rule("/robot/stop/", "robot_stop", protect(robot_stop), methods=["GET", "POST"], ) for _exc in default_exceptions: self.server.flaskapp.errorhandler(_exc)(self.show_errormessage) @@ -169,28 +84,25 @@ def set_urls(self): self.server.flaskapp.context_processor(self.inject_opsoro_vars) def render_template(self, template, **kwargs): + appname = template.split('.')[0] kwargs["app"] = {} - kwargs["title"] = self.title + kwargs["version"] = random.randint(0, 10000) + kwargs["online"] = Play.is_online() + # Set app variables - if self.server.activeapp in self.server.apps: + if appname in Apps.active_apps: + app = Apps.apps[appname] kwargs["app"]["active"] = True - kwargs["app"]["name"] = self.server.apps[ - self.server.activeapp].config["full_name"].title() - kwargs["app"]["full_name"] = self.server.apps[ - self.server.activeapp].config["full_name"] - kwargs["app"]["formatted_name"] = self.server.apps[ - self.server.activeapp].config["formatted_name"] - kwargs["app"]["icon"] = self.server.apps[ - self.server.activeapp].config["icon"] - kwargs["app"]["color"] = self.server.apps[ - self.server.activeapp].config["color"] - kwargs["title"] += " - %s" % self.server.apps[ - self.server.activeapp].config["full_name"].title() - kwargs["page_icon"] = self.server.apps[ - self.server.activeapp].config["icon"] - kwargs["page_caption"] = self.server.apps[ - self.server.activeapp].config["full_name"] + kwargs["app"]["name"] = app.config["full_name"].title() + kwargs["app"]["full_name"] = app.config["full_name"] + kwargs["app"]["formatted_name"] = app.config["formatted_name"] + kwargs["app"]["author"] = app.config["author"] + kwargs["app"]["icon"] = app.config["icon"] + kwargs["app"]["color"] = app.config["color"] + kwargs["title"] += " - %s" % app.config["full_name"].title() + kwargs["page_icon"] = app.config["icon"] + kwargs["page_caption"] = app.config["full_name"] else: kwargs["app"]["active"] = False @@ -201,165 +113,207 @@ def render_template(self, template, **kwargs): if "closebutton" not in kwargs: kwargs["closebutton"] = True - kwargs["isuser"] = True + kwargs["isuser"] = current_user.is_authenticated return render_template(template, **kwargs) def page_index(self): - data = {"title": self.title, "apps": []} - - if self.server.activeapp in self.server.apps: - app = self.server.apps[self.server.activeapp] - if app.config.has_key('allowed_background'): - if not app.config['allowed_background']: - self.server.stop_current_app() - else: - data["activeapp"] = {"name": self.server.activeapp, - "full_name": app.config["full_name"], - "formatted_name": app.config["formatted_name"], - "icon": app.config["icon"], - "color": app.config['color']} - - for appname in sorted(self.server.apps.keys()): - app = self.server.apps[appname] - data["apps"].append({"name": appname, - "full_name": app.config["full_name"], - "formatted_name": app.config["formatted_name"], - "icon": app.config["icon"], - "color": app.config['color'], - "active": (appname == self.server.activeapp)}) + data = {"title": self.title, "index": True, "apps": {}, "active_apps": [], "other_apps": []} + + for appname in sorted(Apps.active_apps): + app = Apps.apps[appname] + data["active_apps"].append(app.config["full_name"]) + + for appname in sorted(Apps.apps): + app = Apps.apps[appname] + + if not app.config['categories']: + data["other_apps"].append({"name": appname, + "full_name": app.config["full_name"], + "formatted_name": app.config["formatted_name"], + "author": app.config["author"], + "icon": app.config["icon"], + "color": app.config['color'], + "difficulty": app.config['difficulty'], + "tags": app.config['tags'], + "active": (appname in Apps.active_apps), + "connection": app.config['connection'], + "background": app.config['allowed_background'], + }) + + for cat in app.config['categories']: + if cat not in data["apps"]: + data["apps"][cat] = [] + + data["apps"][cat].append({"name": appname, + "full_name": app.config["full_name"], + "formatted_name": app.config["formatted_name"], + "author": app.config["author"], + "icon": app.config["icon"], + "color": app.config['color'], + "difficulty": app.config['difficulty'], + "tags": app.config['tags'], + "active": (appname in Apps.active_apps), + "connection": app.config['connection'], + "background": app.config['allowed_background'], + "category_index": app.config['category_index'], + }) return self.render_template("apps.html", **data) def page_login(self): - if request.method == "GET": - kwargs = {} - kwargs["title"] = self.title + " - Login" - kwargs["isuser"] = False - return render_template("login.html", **kwargs) - - password = request.form["password"] - - if password == Preferences.get( - "general", "password", default="RobotOpsoro"): - login_user(AdminUser()) - self.server.active_session_key = os.urandom(24) - session["active_session_key"] = self.server.active_session_key + if current_user.is_authenticated: return redirect(url_for("index")) + + if Play.is_online(): + print_info('ONLINE MODE') + if request.method == "GET": + kwargs = {} + kwargs["title"] = self.title + " - Login" + kwargs["isbusy"] = False + kwargs["isuser"] = False + kwargs["version"] = random.randint(0, 10000) + + return self.render_template("login.html", **kwargs) + + password = request.form["password"] + + if password == Preferences.get("general", "password", default="opsoro123"): + Users.login_admin() + + return redirect(url_for("index")) + else: + flash("Wrong password.") + return redirect(url_for("login")) else: - flash("Wrong password.") - return redirect(url_for("login")) + print_info('OFFLINE MODE') + Users.login_admin() + # login_user(usertypes.Guest()) + + return redirect(url_for("index")) def page_logout(self): - logout_user() - session.pop("active_session_key", None) + Users.logout() + flash("You have been logged out.") return redirect(url_for("login")) def page_sockjstoken(self): - if current_user.is_authenticated: - if current_user.is_admin(): - if session[ - "active_session_key"] == self.server.active_session_key: - # Valid user, generate a token - self.server.sockjs_token = os.urandom(24) - return base64.b64encode(self.server.sockjs_token) - else: - logout_user() - session.pop("active_session_key", None) - return "" # Not a valid user, return nothing! + return base64.b64encode(current_user.token) def page_shutdown(self): + if current_user is None or not current_user.is_authenticated or not current_user.is_admin: + return message = "" - self.server.stop_current_app() + Apps.stop_all() + Users.broadcast_message('The robot has been shutdown, goodbye!') # Run shutdown command with 5 second delay, returns immediately - subprocess.Popen("sleep 5 && sudo halt", shell=True) + if platform.machine() != 'x86_64': + subprocess.Popen("sleep 5 && sudo halt", shell=True) self.server.shutdown() return message - def page_closeapp(self): - self.server.stop_current_app() - return redirect(url_for("index")) - - def page_openapp(self, appname): - # Check if another app is running, if so, run its stop function - if self.server.activeapp == appname: - return redirect("/apps/%s/" % appname) - - self.server.stop_current_app() - - if appname in self.server.apps: - # robot_state: - # 0: Manual start/stop - # 1: Start robot automatically (alive feature according to preferences) - # 2: Start robot automatically and enable alive feature - # 3: Start robot automatically and disable alive feature - if self.server.apps[appname].config.has_key('robot_state'): - print_info(self.server.apps[appname].config['robot_state']) - if self.server.apps[appname].config['robot_state'] > 0: - Robot.start() + def page_restart(self): + if current_user is None or not current_user.is_authenticated or not current_user.is_admin: + return + message = "" + Apps.stop_all() + Users.broadcast_message('The robot is restarting, please reconnect in a couple of seconds.') - self.server.activeapp = appname + # Run shutdown command with 5 second delay, returns immediately + if platform.machine() != 'x86_64': + subprocess.Popen("sleep 5 && sudo reboot", shell=True) + self.server.shutdown() + return message - try: - print_appstarted(appname) - self.server.apps[appname].start(self.server) - except AttributeError: - print_info("%s has no start function" % self.server.activeapp) + def page_closeapp(self, appname): + Apps.stop(appname) + return redirect(url_for("index")) + def page_openapp(self, appname): + if Apps.start(appname): return redirect("/apps/%s/" % appname) else: return redirect(url_for("index")) def page_file_list(self): data = docs_file_list() - return self.render_template( - "_filelist.html", - title=self.title + " - Files", - # page_caption=appSpecificFolderPath, - page_icon="fa-folder", - **data) + # page_caption=appSpecificFolderPath + return self.render_template("_filelist.html", title=self.title + " - Files", page_icon="fa-folder", **data) + + def sound_data(self): + sound_type = request.args.get('t', None) + sound_file = request.args.get('f', None) + + if sound_type is None or sound_file is None: + return None + + if sound_type == 'tts': + return Sound.get_file(sound_file, True) + else: + return Sound.get_file(sound_file, False) def page_virtual(self): - # clientconn = None - - # def send_stopped(): - # global clientconn - # if clientconn: - # clientconn.send_data("soundStopped", {}) - - # if request.method == "POST": - # dataOnly = request.form.get("getdata", type=int, default=0) - # if dataOnly == 1: - # tempDofs = Robot.dof_values() - # return json.dumps({'success': True, 'dofs': tempDofs}) - # # return Expression.dof_values - # frameOnly = request.form.get("frame", type=int, default=0) - # if frameOnly == 1: - # #return self.render_template("virtual.html", title="Virtual Model", page_caption="Virtual model", page_icon="fa-smile-o", modules=Modules.modules) - # pass - - file_location = get_path('../../config/') - file_name = 'default.conf' - config_data = '' - if os.path.isfile(file_location + file_name): - with open(get_path(file_location + file_name), "r") as f: - config_data = f.read() - # config_data = send_from_directory(file_location, file_name) - # print_info("Default config loaded") - - return self.render_template( - "virtual.html", - title="Virtual Model", - page_caption="Virtual model", - page_icon="fa-smile-o", - modules=Robot.modules, - config=config_data) + data = { + 'actions': {}, + 'data': [], + 'modules': [], + 'svg_codes': {}, + 'configs': {}, + 'specs': {}, + 'skins': [], + 'expressions': {}, + 'icons': [], + } + + modules_folder = '../../modules/' + modules_static_folder = '../static/modules/' + + # get modules + filenames = [] + filenames.extend(glob.glob(get_path(modules_folder + '*/'))) + for filename in filenames: + module_name = filename.split('/')[-2] + data['modules'].append(module_name) + with open(get_path(modules_folder + module_name + '/specs.yaml')) as f: + data['specs'][module_name] = yaml.load(f, Loader=Loader) + + with open(get_path(modules_static_folder + module_name + '/front.svg')) as f: + data['svg_codes'][module_name] = f.read() + + data['configs'] = Robot.config + + return self.render_template('virtual.html', **data) + + def page_blockly(self): + data = {'soundfiles': [], 'configs': {}, 'expressions': {}, 'apps_blockly': {}} + + apps_dir = '../../apps/' + filenames = glob.glob(get_path('../../data/sounds/*.wav')) + for filename in filenames: + data['soundfiles'].append(os.path.split(filename)[1]) + + data['configs'] = Robot.config + data['expressions'] = Expression.expressions + + for appname in sorted(Apps.apps.keys()): + app_blockly_path = get_path(apps_dir + appname + '/blockly/') + if os.path.isdir(app_blockly_path): + if os.path.exists(app_blockly_path + appname + '.xml') and os.path.exists(app_blockly_path + appname + '.js'): + data['apps_blockly'][appname] = {} + data['apps_blockly'][appname]['name'] = Apps.apps[appname].config["full_name"] + with open(app_blockly_path + appname + '.xml') as f: + data['apps_blockly'][appname]['xml'] = f.read() + with open(app_blockly_path + appname + '.js') as f: + data['apps_blockly'][appname]['js'] = f.read() + + return self.render_template('blockly_template.html', **data) def show_errormessage(self, error): print_error(error) - # return redirect("/") + if error.code == 404: + return redirect("/") return "" def inject_opsoro_vars(self): diff --git a/src/opsoro/server/request_handlers/opsoro_data_requests.py b/src/opsoro/server/request_handlers/opsoro_data_requests.py index 3434d45..d67bd65 100644 --- a/src/opsoro/server/request_handlers/opsoro_data_requests.py +++ b/src/opsoro/server/request_handlers/opsoro_data_requests.py @@ -1,201 +1,101 @@ from __future__ import with_statement +import glob +import os +from functools import partial + +import yaml from flask import request, send_from_directory -from opsoro.robot import Robot -from opsoro.hardware import Hardware +from opsoro.console_msg import * +from opsoro.data import Data from opsoro.expression import Expression +from opsoro.hardware import Hardware +from opsoro.robot import Robot from opsoro.sound import Sound -from opsoro.console_msg import * - -import glob -import os -from functools import partial -get_abs_path = partial(os.path.join, - os.path.abspath(os.path.dirname(__file__))) +get_abs_path = partial(os.path.join, os.path.abspath(os.path.dirname(__file__))) try: import simplejson as json except ImportError: import json -import yaml try: from yaml import CLoader as Loader except ImportError: from yaml import Loader -constrain = lambda n, minn, maxn: max(min(maxn, n), minn) + +def constrain(n, minn, maxn): return max(min(maxn, n), minn) # ------------------------------------------------------------------------------ # DOCUMENTS # ------------------------------------------------------------------------------ -docs_data_path = '../../data/' - - -def is_safe_path(path): - if path is None: - return False - if path.find('..') >= 0: - return False - - return True - def docs_file_data(app_name=None): - file_name_ext = None - file_name_ext = request.args.get('f', type=str, default=None) - # if action == 'get': - - if not is_safe_path(file_name_ext): - return json.dumps({'success': False, - 'message': 'Provided data error.'}) + data = Data.read(app_name, file_name_ext) + if data: + return data - file_name_ext.replace('%2F', '/') - - defaultPath = docs_data_path - if app_name is not None: - defaultPath += app_name.lower() - folderPath = get_abs_path(defaultPath + '/') - - if os.path.isfile(folderPath + file_name_ext): - return send_from_directory(folderPath, file_name_ext) return json.dumps({'success': False, 'message': 'File error.'}) def docs_file_save(app_name): - file_name = request.form.get('file_name', type=str, default=None) - file_ext = request.form.get('file_extension', type=str, default=None) - file_data = request.form.get('file_data', type=str, default=None) - - if file_data is None: - return json.dumps({'success': False, - 'message': 'Provided data error.'}) - - if not is_safe_path(file_name) or not is_safe_path(file_ext): - return json.dumps({'success': False, - 'message': 'Provided data error.'}) - - defaultPath = docs_data_path - if app_name is not None: - defaultPath += app_name.lower() - - folderPath = get_abs_path(defaultPath + '/') - - file_name_ext = (file_name + file_ext) + file_name_ext = request.form.get('filename', type=str, default=None) + file_data = request.form.get('data', type=str, default=None) - with open(folderPath + file_name_ext, 'w') as f: - f.write(file_data) + if Data.write(app_name, file_name_ext, file_data): + return json.dumps({'success': True}) - return json.dumps({'success': True}) + return json.dumps({'success': False, 'message': 'Provided data error.'}) def docs_file_delete(app_name): - file_name_ext = request.form.get('file_name_ext', type=str, default=None) - - if not is_safe_path(file_name_ext): - return json.dumps({'success': False, - 'message': 'Provided data error.'}) - - defaultPath = docs_data_path - if app_name is not None: - defaultPath += app_name.lower() - - deleted = False - - file_name_ext = os.path.join(get_abs_path(defaultPath), file_name_ext) - - if os.path.isdir(file_name_ext): - shutil.rmtree(file_name_ext) - deleted = True - - if os.path.isfile(file_name_ext): - os.remove(file_name_ext) - deleted = True + file_name_ext = request.form.get('filename', type=str, default=None) - if not deleted: - return json.dumps({'success': False, - 'message': 'File could not be removed.'}) + if Data.delete(app_name, file_name_ext): + return json.dumps({'success': True}) - return json.dumps({'success': True}) + return json.dumps({'success': False, 'message': 'File could not be removed.'}) def docs_file_list(): - defaultPath = docs_data_path - folderPath = defaultPath + '/' - appSpecificFolderPath = '' - get_ext = '.*' - get_save = 0 - get_folders = 0 - # { a: app.name, p: currentpath, e: extension, f: onlyFolders, s: saveFileView } get_app_name = request.args.get('a', type=str, default=None) - get_path = request.args.get('p', type=str, default=None) get_ext = request.args.get('e', type=str, default='.*') - get_folders = request.args.get('f', type=int, default=0) get_save = request.args.get('s', type=int, default=0) - if is_safe_path(get_app_name): - defaultPath += get_app_name.lower().replace(' ', '_') - folderPath = defaultPath + '/' - - # Make sure the file operations stay within the data folder - if is_safe_path(get_path): - if len(get_path) > 1 and get_path[-1] == '.': - get_path = get_path[0:-1] - - # Make sure the file operations stay within the data folder - if not is_safe_path(get_ext): - get_ext = '' - else: - get_path = '' - - data = {'path': get_path, 'folders': [], 'files': []} - - if get_path != '': - data['previouspath'] = get_path[0:get_path.rfind('/', 0, len(get_path) - - 1)] + '/' - if get_path.rfind('/', 0, len(get_path) - 1) < 0: - data['previouspath'] = '/' + data = {} - get_path = (folderPath + get_path) - - foldernames = glob.glob(get_abs_path(get_path + '*')) - for foldername in foldernames: - if ('.' not in os.path.split(foldername)[1]): - data['folders'].append(os.path.split(foldername)[1] + '/') - data['folders'].sort() + data['files'] = Data.filelist(get_app_name, get_ext) if get_save == 1: data['savefileview'] = get_save - if get_folders != 1: - filenames = glob.glob(get_abs_path(get_path + '*' + get_ext)) - for filename in filenames: - if '.' in os.path.split(filename)[1]: - data['files'].append(os.path.split(filename)[1]) - data['files'].sort() - else: - data['onlyfolders'] = get_folders - return data # ------------------------------------------------------------------------------ # ROBOT # ------------------------------------------------------------------------------ -def robot_config_data(): +def config_robot_data(): config_data = request.form.get('config_data', type=str, default=None) # This function also handles the None value and returns the current configuration - tempConfig = Robot.config(config_data) + tempConfig = Robot.set_config(config_data) + + return json.dumps({'success': True, 'config': tempConfig}) - if config_data is not None: - Robot.save_config() + +def config_expressions_data(): + config_data = request.form.get('config_data', type=str, default=None) + + # This function also handles the None value and returns the current configuration + tempConfig = Expression.set_config(config_data) return json.dumps({'success': True, 'config': tempConfig}) @@ -230,7 +130,10 @@ def robot_dofs_data(): # print(dof_values) if dof_values is not None: dof_values = yaml.load(dof_values, Loader=Loader) - Robot.set_dof_values(dof_values) + if type(dof_values) is dict: + Robot.set_dof_values(dof_values) + elif type(dof_values) is list: + Robot.set_dof_list(dof_values) tempDofs = Robot.get_dof_values() return json.dumps({'success': True, 'dofs': tempDofs}) @@ -238,8 +141,8 @@ def robot_dofs_data(): def robot_tts(): text = request.args.get('t', None) - if is_safe_path(text): - Sound.say_tts(text) + + Sound.say_tts(text) return json.dumps({'success': True}) @@ -247,23 +150,10 @@ def robot_tts(): def robot_sound(): soundfile = request.args.get('s', type=str, default=None) - if not is_safe_path(soundfile): - return json.dumps({'success': False, 'message': 'Unknown file.'}) - - soundfiles = [] - filenames = [] - - filenames = glob.glob(get_abs_path(docs_data_path + 'sounds/*.wav')) - - for filename in filenames: - soundfiles.append(os.path.split(filename)[1]) - - if soundfile in soundfiles: - Sound.play_file(soundfile) - + if Sound.play_file(soundfile): return json.dumps({'success': True}) - else: - return json.dumps({'success': False, 'message': 'Unknown file.'}) + + return json.dumps({'success': False, 'message': 'Unknown file.'}) def robot_servo(): @@ -276,8 +166,8 @@ def robot_servo(): # print_info('pin: ' + str(servo_pin) + ', value: ' + str(servo_value)) with Hardware.lock: - Hardware.servo_enable() - Hardware.servo_set(servo_pin, servo_value) + Hardware.Servo.enable() + Hardware.Servo.set(servo_pin, servo_value) return json.dumps({'success': True}) @@ -294,8 +184,8 @@ def robot_servos(): values.append(constrain(value, 500, 2500)) with Hardware.lock: - Hardware.servo_enable() - Hardware.servo_set_all(values) + Hardware.Servo.enable() + Hardware.Servo.set_all(values) return json.dumps({'success': True}) diff --git a/src/opsoro/server/static/css/font-awesome/_animated.scss b/src/opsoro/server/static/css/font-awesome/_animated.scss new file mode 100644 index 0000000..8a020db --- /dev/null +++ b/src/opsoro/server/static/css/font-awesome/_animated.scss @@ -0,0 +1,34 @@ +// Spinning Icons +// -------------------------- + +.#{$fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.#{$fa-css-prefix}-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); + } +} diff --git a/src/opsoro/server/static/css/font-awesome/_bordered-pulled.scss b/src/opsoro/server/static/css/font-awesome/_bordered-pulled.scss new file mode 100644 index 0000000..d4b85a0 --- /dev/null +++ b/src/opsoro/server/static/css/font-awesome/_bordered-pulled.scss @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.#{$fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em $fa-border-color; + border-radius: .1em; +} + +.#{$fa-css-prefix}-pull-left { float: left; } +.#{$fa-css-prefix}-pull-right { float: right; } + +.#{$fa-css-prefix} { + &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } + &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.#{$fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/src/opsoro/server/static/css/font-awesome/_core.scss b/src/opsoro/server/static/css/font-awesome/_core.scss new file mode 100644 index 0000000..7425ef8 --- /dev/null +++ b/src/opsoro/server/static/css/font-awesome/_core.scss @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.#{$fa-css-prefix} { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/src/opsoro/server/static/css/font-awesome/_fixed-width.scss b/src/opsoro/server/static/css/font-awesome/_fixed-width.scss new file mode 100644 index 0000000..b221c98 --- /dev/null +++ b/src/opsoro/server/static/css/font-awesome/_fixed-width.scss @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.#{$fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/src/opsoro/server/static/css/font-awesome/_icons.scss b/src/opsoro/server/static/css/font-awesome/_icons.scss new file mode 100644 index 0000000..e63e702 --- /dev/null +++ b/src/opsoro/server/static/css/font-awesome/_icons.scss @@ -0,0 +1,789 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } +.#{$fa-css-prefix}-music:before { content: $fa-var-music; } +.#{$fa-css-prefix}-search:before { content: $fa-var-search; } +.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } +.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } +.#{$fa-css-prefix}-star:before { content: $fa-var-star; } +.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } +.#{$fa-css-prefix}-user:before { content: $fa-var-user; } +.#{$fa-css-prefix}-film:before { content: $fa-var-film; } +.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } +.#{$fa-css-prefix}-th:before { content: $fa-var-th; } +.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } +.#{$fa-css-prefix}-check:before { content: $fa-var-check; } +.#{$fa-css-prefix}-remove:before, +.#{$fa-css-prefix}-close:before, +.#{$fa-css-prefix}-times:before { content: $fa-var-times; } +.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } +.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } +.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } +.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } +.#{$fa-css-prefix}-gear:before, +.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } +.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } +.#{$fa-css-prefix}-home:before { content: $fa-var-home; } +.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } +.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } +.#{$fa-css-prefix}-road:before { content: $fa-var-road; } +.#{$fa-css-prefix}-download:before { content: $fa-var-download; } +.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } +.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } +.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } +.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } +.#{$fa-css-prefix}-rotate-right:before, +.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } +.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } +.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } +.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } +.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } +.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } +.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } +.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } +.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } +.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } +.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } +.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } +.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } +.#{$fa-css-prefix}-book:before { content: $fa-var-book; } +.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } +.#{$fa-css-prefix}-print:before { content: $fa-var-print; } +.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } +.#{$fa-css-prefix}-font:before { content: $fa-var-font; } +.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } +.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } +.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } +.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } +.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } +.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } +.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } +.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } +.#{$fa-css-prefix}-list:before { content: $fa-var-list; } +.#{$fa-css-prefix}-dedent:before, +.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } +.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } +.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } +.#{$fa-css-prefix}-photo:before, +.#{$fa-css-prefix}-image:before, +.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } +.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } +.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } +.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } +.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } +.#{$fa-css-prefix}-edit:before, +.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } +.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } +.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } +.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } +.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } +.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } +.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } +.#{$fa-css-prefix}-play:before { content: $fa-var-play; } +.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } +.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } +.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } +.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } +.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } +.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } +.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } +.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } +.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } +.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } +.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } +.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } +.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } +.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } +.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } +.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } +.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } +.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } +.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } +.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } +.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } +.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } +.#{$fa-css-prefix}-mail-forward:before, +.#{$fa-css-prefix}-share:before { content: $fa-var-share; } +.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } +.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } +.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } +.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } +.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } +.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } +.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } +.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } +.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } +.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } +.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } +.#{$fa-css-prefix}-warning:before, +.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } +.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } +.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } +.#{$fa-css-prefix}-random:before { content: $fa-var-random; } +.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } +.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } +.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } +.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } +.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } +.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } +.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } +.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } +.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } +.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } +.#{$fa-css-prefix}-bar-chart-o:before, +.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } +.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } +.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } +.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } +.#{$fa-css-prefix}-key:before { content: $fa-var-key; } +.#{$fa-css-prefix}-gears:before, +.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } +.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } +.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } +.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } +.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } +.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } +.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } +.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } +.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } +.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } +.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } +.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } +.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } +.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } +.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } +.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } +.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } +.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } +.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } +.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } +.#{$fa-css-prefix}-facebook-f:before, +.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } +.#{$fa-css-prefix}-github:before { content: $fa-var-github; } +.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } +.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } +.#{$fa-css-prefix}-feed:before, +.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } +.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } +.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } +.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } +.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } +.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } +.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } +.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } +.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } +.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } +.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } +.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } +.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } +.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } +.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } +.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } +.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } +.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } +.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } +.#{$fa-css-prefix}-group:before, +.#{$fa-css-prefix}-users:before { content: $fa-var-users; } +.#{$fa-css-prefix}-chain:before, +.#{$fa-css-prefix}-link:before { content: $fa-var-link; } +.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } +.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } +.#{$fa-css-prefix}-cut:before, +.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } +.#{$fa-css-prefix}-copy:before, +.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } +.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } +.#{$fa-css-prefix}-save:before, +.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } +.#{$fa-css-prefix}-square:before { content: $fa-var-square; } +.#{$fa-css-prefix}-navicon:before, +.#{$fa-css-prefix}-reorder:before, +.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } +.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } +.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } +.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } +.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } +.#{$fa-css-prefix}-table:before { content: $fa-var-table; } +.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } +.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } +.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } +.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } +.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } +.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } +.#{$fa-css-prefix}-money:before { content: $fa-var-money; } +.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } +.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } +.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } +.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } +.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } +.#{$fa-css-prefix}-unsorted:before, +.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } +.#{$fa-css-prefix}-sort-down:before, +.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } +.#{$fa-css-prefix}-sort-up:before, +.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } +.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } +.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } +.#{$fa-css-prefix}-rotate-left:before, +.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } +.#{$fa-css-prefix}-legal:before, +.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } +.#{$fa-css-prefix}-dashboard:before, +.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } +.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } +.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } +.#{$fa-css-prefix}-flash:before, +.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } +.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } +.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } +.#{$fa-css-prefix}-paste:before, +.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } +.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } +.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } +.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } +.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } +.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } +.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } +.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } +.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } +.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } +.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } +.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } +.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } +.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } +.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } +.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } +.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } +.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } +.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } +.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } +.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } +.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } +.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } +.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } +.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } +.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } +.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } +.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } +.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } +.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } +.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } +.#{$fa-css-prefix}-mobile-phone:before, +.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } +.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } +.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } +.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } +.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } +.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } +.#{$fa-css-prefix}-mail-reply:before, +.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } +.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } +.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } +.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } +.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } +.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } +.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } +.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } +.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } +.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } +.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } +.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } +.#{$fa-css-prefix}-code:before { content: $fa-var-code; } +.#{$fa-css-prefix}-mail-reply-all:before, +.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } +.#{$fa-css-prefix}-star-half-empty:before, +.#{$fa-css-prefix}-star-half-full:before, +.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } +.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } +.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } +.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } +.#{$fa-css-prefix}-unlink:before, +.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } +.#{$fa-css-prefix}-question:before { content: $fa-var-question; } +.#{$fa-css-prefix}-info:before { content: $fa-var-info; } +.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } +.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } +.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } +.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } +.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } +.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } +.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } +.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } +.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } +.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } +.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } +.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } +.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } +.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } +.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } +.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } +.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } +.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } +.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } +.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } +.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } +.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } +.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } +.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } +.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } +.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } +.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } +.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } +.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } +.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } +.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } +.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } +.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } +.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } +.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } +.#{$fa-css-prefix}-toggle-down:before, +.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } +.#{$fa-css-prefix}-toggle-up:before, +.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } +.#{$fa-css-prefix}-toggle-right:before, +.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } +.#{$fa-css-prefix}-euro:before, +.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } +.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } +.#{$fa-css-prefix}-dollar:before, +.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } +.#{$fa-css-prefix}-rupee:before, +.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } +.#{$fa-css-prefix}-cny:before, +.#{$fa-css-prefix}-rmb:before, +.#{$fa-css-prefix}-yen:before, +.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } +.#{$fa-css-prefix}-ruble:before, +.#{$fa-css-prefix}-rouble:before, +.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } +.#{$fa-css-prefix}-won:before, +.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } +.#{$fa-css-prefix}-bitcoin:before, +.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } +.#{$fa-css-prefix}-file:before { content: $fa-var-file; } +.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } +.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } +.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } +.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } +.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } +.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } +.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } +.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } +.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } +.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } +.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } +.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } +.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } +.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } +.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } +.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } +.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } +.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } +.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } +.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } +.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } +.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } +.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } +.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } +.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } +.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } +.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } +.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } +.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } +.#{$fa-css-prefix}-android:before { content: $fa-var-android; } +.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } +.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } +.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } +.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } +.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } +.#{$fa-css-prefix}-female:before { content: $fa-var-female; } +.#{$fa-css-prefix}-male:before { content: $fa-var-male; } +.#{$fa-css-prefix}-gittip:before, +.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } +.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } +.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } +.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } +.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } +.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } +.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } +.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } +.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } +.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } +.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } +.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } +.#{$fa-css-prefix}-toggle-left:before, +.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } +.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } +.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } +.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } +.#{$fa-css-prefix}-turkish-lira:before, +.#{$fa-css-prefix}-try:before { content: $fa-var-try; } +.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } +.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } +.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } +.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } +.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } +.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } +.#{$fa-css-prefix}-institution:before, +.#{$fa-css-prefix}-bank:before, +.#{$fa-css-prefix}-university:before { content: $fa-var-university; } +.#{$fa-css-prefix}-mortar-board:before, +.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } +.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } +.#{$fa-css-prefix}-google:before { content: $fa-var-google; } +.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } +.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } +.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } +.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } +.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } +.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } +.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } +.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } +.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } +.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } +.#{$fa-css-prefix}-language:before { content: $fa-var-language; } +.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } +.#{$fa-css-prefix}-building:before { content: $fa-var-building; } +.#{$fa-css-prefix}-child:before { content: $fa-var-child; } +.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } +.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } +.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } +.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } +.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } +.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } +.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } +.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } +.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } +.#{$fa-css-prefix}-automobile:before, +.#{$fa-css-prefix}-car:before { content: $fa-var-car; } +.#{$fa-css-prefix}-cab:before, +.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } +.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } +.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } +.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } +.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } +.#{$fa-css-prefix}-database:before { content: $fa-var-database; } +.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } +.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } +.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } +.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } +.#{$fa-css-prefix}-file-photo-o:before, +.#{$fa-css-prefix}-file-picture-o:before, +.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } +.#{$fa-css-prefix}-file-zip-o:before, +.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } +.#{$fa-css-prefix}-file-sound-o:before, +.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } +.#{$fa-css-prefix}-file-movie-o:before, +.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } +.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } +.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } +.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } +.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } +.#{$fa-css-prefix}-life-bouy:before, +.#{$fa-css-prefix}-life-buoy:before, +.#{$fa-css-prefix}-life-saver:before, +.#{$fa-css-prefix}-support:before, +.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } +.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } +.#{$fa-css-prefix}-ra:before, +.#{$fa-css-prefix}-resistance:before, +.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } +.#{$fa-css-prefix}-ge:before, +.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } +.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } +.#{$fa-css-prefix}-git:before { content: $fa-var-git; } +.#{$fa-css-prefix}-y-combinator-square:before, +.#{$fa-css-prefix}-yc-square:before, +.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } +.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } +.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } +.#{$fa-css-prefix}-wechat:before, +.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } +.#{$fa-css-prefix}-send:before, +.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } +.#{$fa-css-prefix}-send-o:before, +.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } +.#{$fa-css-prefix}-history:before { content: $fa-var-history; } +.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } +.#{$fa-css-prefix}-header:before { content: $fa-var-header; } +.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } +.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } +.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } +.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } +.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } +.#{$fa-css-prefix}-soccer-ball-o:before, +.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } +.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } +.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } +.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } +.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } +.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } +.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } +.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } +.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } +.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } +.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } +.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } +.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } +.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } +.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } +.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } +.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } +.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } +.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } +.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } +.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } +.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } +.#{$fa-css-prefix}-at:before { content: $fa-var-at; } +.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } +.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } +.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } +.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } +.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } +.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } +.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } +.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } +.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } +.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } +.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } +.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } +.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } +.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } +.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } +.#{$fa-css-prefix}-shekel:before, +.#{$fa-css-prefix}-sheqel:before, +.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } +.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } +.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } +.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } +.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } +.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } +.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } +.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } +.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } +.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } +.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } +.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } +.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } +.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } +.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } +.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } +.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } +.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } +.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } +.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } +.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } +.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } +.#{$fa-css-prefix}-intersex:before, +.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } +.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } +.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } +.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } +.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } +.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } +.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } +.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } +.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } +.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } +.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } +.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } +.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } +.#{$fa-css-prefix}-server:before { content: $fa-var-server; } +.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } +.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } +.#{$fa-css-prefix}-hotel:before, +.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } +.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } +.#{$fa-css-prefix}-train:before { content: $fa-var-train; } +.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } +.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } +.#{$fa-css-prefix}-yc:before, +.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } +.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } +.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } +.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } +.#{$fa-css-prefix}-battery-4:before, +.#{$fa-css-prefix}-battery:before, +.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } +.#{$fa-css-prefix}-battery-3:before, +.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } +.#{$fa-css-prefix}-battery-2:before, +.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } +.#{$fa-css-prefix}-battery-1:before, +.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } +.#{$fa-css-prefix}-battery-0:before, +.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } +.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } +.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } +.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } +.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } +.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } +.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } +.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } +.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } +.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } +.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } +.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } +.#{$fa-css-prefix}-hourglass-1:before, +.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } +.#{$fa-css-prefix}-hourglass-2:before, +.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } +.#{$fa-css-prefix}-hourglass-3:before, +.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } +.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } +.#{$fa-css-prefix}-hand-grab-o:before, +.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } +.#{$fa-css-prefix}-hand-stop-o:before, +.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } +.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } +.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } +.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } +.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } +.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } +.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } +.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } +.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } +.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } +.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } +.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } +.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } +.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } +.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } +.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } +.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } +.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } +.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } +.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } +.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } +.#{$fa-css-prefix}-tv:before, +.#{$fa-css-prefix}-television:before { content: $fa-var-television; } +.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } +.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } +.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } +.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } +.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } +.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } +.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } +.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } +.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } +.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } +.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } +.#{$fa-css-prefix}-map:before { content: $fa-var-map; } +.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } +.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } +.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } +.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } +.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } +.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } +.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } +.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } +.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } +.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } +.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } +.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } +.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } +.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } +.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } +.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } +.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } +.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } +.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } +.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } +.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } +.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } +.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } +.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } +.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } +.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } +.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } +.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } +.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } +.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } +.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } +.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } +.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } +.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } +.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } +.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } +.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } +.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } +.#{$fa-css-prefix}-asl-interpreting:before, +.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } +.#{$fa-css-prefix}-deafness:before, +.#{$fa-css-prefix}-hard-of-hearing:before, +.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } +.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } +.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } +.#{$fa-css-prefix}-signing:before, +.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } +.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } +.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } +.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } +.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } +.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } +.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } +.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } +.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } +.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } +.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } +.#{$fa-css-prefix}-google-plus-circle:before, +.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } +.#{$fa-css-prefix}-fa:before, +.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } +.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; } +.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; } +.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; } +.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; } +.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; } +.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; } +.#{$fa-css-prefix}-vcard:before, +.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; } +.#{$fa-css-prefix}-vcard-o:before, +.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; } +.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; } +.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; } +.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; } +.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; } +.#{$fa-css-prefix}-drivers-license:before, +.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; } +.#{$fa-css-prefix}-drivers-license-o:before, +.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; } +.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; } +.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; } +.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; } +.#{$fa-css-prefix}-thermometer-4:before, +.#{$fa-css-prefix}-thermometer:before, +.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; } +.#{$fa-css-prefix}-thermometer-3:before, +.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; } +.#{$fa-css-prefix}-thermometer-2:before, +.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; } +.#{$fa-css-prefix}-thermometer-1:before, +.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; } +.#{$fa-css-prefix}-thermometer-0:before, +.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; } +.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; } +.#{$fa-css-prefix}-bathtub:before, +.#{$fa-css-prefix}-s15:before, +.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; } +.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; } +.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; } +.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; } +.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; } +.#{$fa-css-prefix}-times-rectangle:before, +.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; } +.#{$fa-css-prefix}-times-rectangle-o:before, +.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; } +.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; } +.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; } +.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; } +.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; } +.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; } +.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; } +.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; } +.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; } +.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; } +.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; } +.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; } diff --git a/src/opsoro/server/static/css/font-awesome/_larger.scss b/src/opsoro/server/static/css/font-awesome/_larger.scss new file mode 100644 index 0000000..41e9a81 --- /dev/null +++ b/src/opsoro/server/static/css/font-awesome/_larger.scss @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.#{$fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.#{$fa-css-prefix}-2x { font-size: 2em; } +.#{$fa-css-prefix}-3x { font-size: 3em; } +.#{$fa-css-prefix}-4x { font-size: 4em; } +.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/src/opsoro/server/static/css/font-awesome/_list.scss b/src/opsoro/server/static/css/font-awesome/_list.scss new file mode 100644 index 0000000..7d1e4d5 --- /dev/null +++ b/src/opsoro/server/static/css/font-awesome/_list.scss @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.#{$fa-css-prefix}-ul { + padding-left: 0; + margin-left: $fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.#{$fa-css-prefix}-li { + position: absolute; + left: -$fa-li-width; + width: $fa-li-width; + top: (2em / 14); + text-align: center; + &.#{$fa-css-prefix}-lg { + left: -$fa-li-width + (4em / 14); + } +} diff --git a/src/opsoro/server/static/css/font-awesome/_mixins.scss b/src/opsoro/server/static/css/font-awesome/_mixins.scss new file mode 100644 index 0000000..c3bbd57 --- /dev/null +++ b/src/opsoro/server/static/css/font-awesome/_mixins.scss @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +@mixin fa-icon() { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +@mixin fa-icon-rotate($degrees, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; + -webkit-transform: rotate($degrees); + -ms-transform: rotate($degrees); + transform: rotate($degrees); +} + +@mixin fa-icon-flip($horiz, $vert, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; + -webkit-transform: scale($horiz, $vert); + -ms-transform: scale($horiz, $vert); + transform: scale($horiz, $vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +@mixin sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +@mixin sr-only-focusable { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/src/opsoro/server/static/css/font-awesome/_path.scss b/src/opsoro/server/static/css/font-awesome/_path.scss new file mode 100644 index 0000000..bb457c2 --- /dev/null +++ b/src/opsoro/server/static/css/font-awesome/_path.scss @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); + src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), + url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), + url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), + url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), + url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); +// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/src/opsoro/server/static/css/font-awesome/_rotated-flipped.scss b/src/opsoro/server/static/css/font-awesome/_rotated-flipped.scss new file mode 100644 index 0000000..a3558fd --- /dev/null +++ b/src/opsoro/server/static/css/font-awesome/_rotated-flipped.scss @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } +.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } +.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } + +.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } +.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .#{$fa-css-prefix}-rotate-90, +:root .#{$fa-css-prefix}-rotate-180, +:root .#{$fa-css-prefix}-rotate-270, +:root .#{$fa-css-prefix}-flip-horizontal, +:root .#{$fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/src/opsoro/server/static/css/font-awesome/_screen-reader.scss b/src/opsoro/server/static/css/font-awesome/_screen-reader.scss new file mode 100644 index 0000000..637426f --- /dev/null +++ b/src/opsoro/server/static/css/font-awesome/_screen-reader.scss @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { @include sr-only(); } +.sr-only-focusable { @include sr-only-focusable(); } diff --git a/src/opsoro/server/static/css/font-awesome/_stacked.scss b/src/opsoro/server/static/css/font-awesome/_stacked.scss new file mode 100644 index 0000000..aef7403 --- /dev/null +++ b/src/opsoro/server/static/css/font-awesome/_stacked.scss @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.#{$fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.#{$fa-css-prefix}-stack-1x { line-height: inherit; } +.#{$fa-css-prefix}-stack-2x { font-size: 2em; } +.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/src/opsoro/server/static/css/font-awesome/_variables.scss b/src/opsoro/server/static/css/font-awesome/_variables.scss new file mode 100644 index 0000000..498fc4a --- /dev/null +++ b/src/opsoro/server/static/css/font-awesome/_variables.scss @@ -0,0 +1,800 @@ +// Variables +// -------------------------- + +$fa-font-path: "../fonts" !default; +$fa-font-size-base: 14px !default; +$fa-line-height-base: 1 !default; +//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly +$fa-css-prefix: fa !default; +$fa-version: "4.7.0" !default; +$fa-border-color: #eee !default; +$fa-inverse: #fff !default; +$fa-li-width: (30em / 14) !default; + +$fa-var-500px: "\f26e"; +$fa-var-address-book: "\f2b9"; +$fa-var-address-book-o: "\f2ba"; +$fa-var-address-card: "\f2bb"; +$fa-var-address-card-o: "\f2bc"; +$fa-var-adjust: "\f042"; +$fa-var-adn: "\f170"; +$fa-var-align-center: "\f037"; +$fa-var-align-justify: "\f039"; +$fa-var-align-left: "\f036"; +$fa-var-align-right: "\f038"; +$fa-var-amazon: "\f270"; +$fa-var-ambulance: "\f0f9"; +$fa-var-american-sign-language-interpreting: "\f2a3"; +$fa-var-anchor: "\f13d"; +$fa-var-android: "\f17b"; +$fa-var-angellist: "\f209"; +$fa-var-angle-double-down: "\f103"; +$fa-var-angle-double-left: "\f100"; +$fa-var-angle-double-right: "\f101"; +$fa-var-angle-double-up: "\f102"; +$fa-var-angle-down: "\f107"; +$fa-var-angle-left: "\f104"; +$fa-var-angle-right: "\f105"; +$fa-var-angle-up: "\f106"; +$fa-var-apple: "\f179"; +$fa-var-archive: "\f187"; +$fa-var-area-chart: "\f1fe"; +$fa-var-arrow-circle-down: "\f0ab"; +$fa-var-arrow-circle-left: "\f0a8"; +$fa-var-arrow-circle-o-down: "\f01a"; +$fa-var-arrow-circle-o-left: "\f190"; +$fa-var-arrow-circle-o-right: "\f18e"; +$fa-var-arrow-circle-o-up: "\f01b"; +$fa-var-arrow-circle-right: "\f0a9"; +$fa-var-arrow-circle-up: "\f0aa"; +$fa-var-arrow-down: "\f063"; +$fa-var-arrow-left: "\f060"; +$fa-var-arrow-right: "\f061"; +$fa-var-arrow-up: "\f062"; +$fa-var-arrows: "\f047"; +$fa-var-arrows-alt: "\f0b2"; +$fa-var-arrows-h: "\f07e"; +$fa-var-arrows-v: "\f07d"; +$fa-var-asl-interpreting: "\f2a3"; +$fa-var-assistive-listening-systems: "\f2a2"; +$fa-var-asterisk: "\f069"; +$fa-var-at: "\f1fa"; +$fa-var-audio-description: "\f29e"; +$fa-var-automobile: "\f1b9"; +$fa-var-backward: "\f04a"; +$fa-var-balance-scale: "\f24e"; +$fa-var-ban: "\f05e"; +$fa-var-bandcamp: "\f2d5"; +$fa-var-bank: "\f19c"; +$fa-var-bar-chart: "\f080"; +$fa-var-bar-chart-o: "\f080"; +$fa-var-barcode: "\f02a"; +$fa-var-bars: "\f0c9"; +$fa-var-bath: "\f2cd"; +$fa-var-bathtub: "\f2cd"; +$fa-var-battery: "\f240"; +$fa-var-battery-0: "\f244"; +$fa-var-battery-1: "\f243"; +$fa-var-battery-2: "\f242"; +$fa-var-battery-3: "\f241"; +$fa-var-battery-4: "\f240"; +$fa-var-battery-empty: "\f244"; +$fa-var-battery-full: "\f240"; +$fa-var-battery-half: "\f242"; +$fa-var-battery-quarter: "\f243"; +$fa-var-battery-three-quarters: "\f241"; +$fa-var-bed: "\f236"; +$fa-var-beer: "\f0fc"; +$fa-var-behance: "\f1b4"; +$fa-var-behance-square: "\f1b5"; +$fa-var-bell: "\f0f3"; +$fa-var-bell-o: "\f0a2"; +$fa-var-bell-slash: "\f1f6"; +$fa-var-bell-slash-o: "\f1f7"; +$fa-var-bicycle: "\f206"; +$fa-var-binoculars: "\f1e5"; +$fa-var-birthday-cake: "\f1fd"; +$fa-var-bitbucket: "\f171"; +$fa-var-bitbucket-square: "\f172"; +$fa-var-bitcoin: "\f15a"; +$fa-var-black-tie: "\f27e"; +$fa-var-blind: "\f29d"; +$fa-var-bluetooth: "\f293"; +$fa-var-bluetooth-b: "\f294"; +$fa-var-bold: "\f032"; +$fa-var-bolt: "\f0e7"; +$fa-var-bomb: "\f1e2"; +$fa-var-book: "\f02d"; +$fa-var-bookmark: "\f02e"; +$fa-var-bookmark-o: "\f097"; +$fa-var-braille: "\f2a1"; +$fa-var-briefcase: "\f0b1"; +$fa-var-btc: "\f15a"; +$fa-var-bug: "\f188"; +$fa-var-building: "\f1ad"; +$fa-var-building-o: "\f0f7"; +$fa-var-bullhorn: "\f0a1"; +$fa-var-bullseye: "\f140"; +$fa-var-bus: "\f207"; +$fa-var-buysellads: "\f20d"; +$fa-var-cab: "\f1ba"; +$fa-var-calculator: "\f1ec"; +$fa-var-calendar: "\f073"; +$fa-var-calendar-check-o: "\f274"; +$fa-var-calendar-minus-o: "\f272"; +$fa-var-calendar-o: "\f133"; +$fa-var-calendar-plus-o: "\f271"; +$fa-var-calendar-times-o: "\f273"; +$fa-var-camera: "\f030"; +$fa-var-camera-retro: "\f083"; +$fa-var-car: "\f1b9"; +$fa-var-caret-down: "\f0d7"; +$fa-var-caret-left: "\f0d9"; +$fa-var-caret-right: "\f0da"; +$fa-var-caret-square-o-down: "\f150"; +$fa-var-caret-square-o-left: "\f191"; +$fa-var-caret-square-o-right: "\f152"; +$fa-var-caret-square-o-up: "\f151"; +$fa-var-caret-up: "\f0d8"; +$fa-var-cart-arrow-down: "\f218"; +$fa-var-cart-plus: "\f217"; +$fa-var-cc: "\f20a"; +$fa-var-cc-amex: "\f1f3"; +$fa-var-cc-diners-club: "\f24c"; +$fa-var-cc-discover: "\f1f2"; +$fa-var-cc-jcb: "\f24b"; +$fa-var-cc-mastercard: "\f1f1"; +$fa-var-cc-paypal: "\f1f4"; +$fa-var-cc-stripe: "\f1f5"; +$fa-var-cc-visa: "\f1f0"; +$fa-var-certificate: "\f0a3"; +$fa-var-chain: "\f0c1"; +$fa-var-chain-broken: "\f127"; +$fa-var-check: "\f00c"; +$fa-var-check-circle: "\f058"; +$fa-var-check-circle-o: "\f05d"; +$fa-var-check-square: "\f14a"; +$fa-var-check-square-o: "\f046"; +$fa-var-chevron-circle-down: "\f13a"; +$fa-var-chevron-circle-left: "\f137"; +$fa-var-chevron-circle-right: "\f138"; +$fa-var-chevron-circle-up: "\f139"; +$fa-var-chevron-down: "\f078"; +$fa-var-chevron-left: "\f053"; +$fa-var-chevron-right: "\f054"; +$fa-var-chevron-up: "\f077"; +$fa-var-child: "\f1ae"; +$fa-var-chrome: "\f268"; +$fa-var-circle: "\f111"; +$fa-var-circle-o: "\f10c"; +$fa-var-circle-o-notch: "\f1ce"; +$fa-var-circle-thin: "\f1db"; +$fa-var-clipboard: "\f0ea"; +$fa-var-clock-o: "\f017"; +$fa-var-clone: "\f24d"; +$fa-var-close: "\f00d"; +$fa-var-cloud: "\f0c2"; +$fa-var-cloud-download: "\f0ed"; +$fa-var-cloud-upload: "\f0ee"; +$fa-var-cny: "\f157"; +$fa-var-code: "\f121"; +$fa-var-code-fork: "\f126"; +$fa-var-codepen: "\f1cb"; +$fa-var-codiepie: "\f284"; +$fa-var-coffee: "\f0f4"; +$fa-var-cog: "\f013"; +$fa-var-cogs: "\f085"; +$fa-var-columns: "\f0db"; +$fa-var-comment: "\f075"; +$fa-var-comment-o: "\f0e5"; +$fa-var-commenting: "\f27a"; +$fa-var-commenting-o: "\f27b"; +$fa-var-comments: "\f086"; +$fa-var-comments-o: "\f0e6"; +$fa-var-compass: "\f14e"; +$fa-var-compress: "\f066"; +$fa-var-connectdevelop: "\f20e"; +$fa-var-contao: "\f26d"; +$fa-var-copy: "\f0c5"; +$fa-var-copyright: "\f1f9"; +$fa-var-creative-commons: "\f25e"; +$fa-var-credit-card: "\f09d"; +$fa-var-credit-card-alt: "\f283"; +$fa-var-crop: "\f125"; +$fa-var-crosshairs: "\f05b"; +$fa-var-css3: "\f13c"; +$fa-var-cube: "\f1b2"; +$fa-var-cubes: "\f1b3"; +$fa-var-cut: "\f0c4"; +$fa-var-cutlery: "\f0f5"; +$fa-var-dashboard: "\f0e4"; +$fa-var-dashcube: "\f210"; +$fa-var-database: "\f1c0"; +$fa-var-deaf: "\f2a4"; +$fa-var-deafness: "\f2a4"; +$fa-var-dedent: "\f03b"; +$fa-var-delicious: "\f1a5"; +$fa-var-desktop: "\f108"; +$fa-var-deviantart: "\f1bd"; +$fa-var-diamond: "\f219"; +$fa-var-digg: "\f1a6"; +$fa-var-dollar: "\f155"; +$fa-var-dot-circle-o: "\f192"; +$fa-var-download: "\f019"; +$fa-var-dribbble: "\f17d"; +$fa-var-drivers-license: "\f2c2"; +$fa-var-drivers-license-o: "\f2c3"; +$fa-var-dropbox: "\f16b"; +$fa-var-drupal: "\f1a9"; +$fa-var-edge: "\f282"; +$fa-var-edit: "\f044"; +$fa-var-eercast: "\f2da"; +$fa-var-eject: "\f052"; +$fa-var-ellipsis-h: "\f141"; +$fa-var-ellipsis-v: "\f142"; +$fa-var-empire: "\f1d1"; +$fa-var-envelope: "\f0e0"; +$fa-var-envelope-o: "\f003"; +$fa-var-envelope-open: "\f2b6"; +$fa-var-envelope-open-o: "\f2b7"; +$fa-var-envelope-square: "\f199"; +$fa-var-envira: "\f299"; +$fa-var-eraser: "\f12d"; +$fa-var-etsy: "\f2d7"; +$fa-var-eur: "\f153"; +$fa-var-euro: "\f153"; +$fa-var-exchange: "\f0ec"; +$fa-var-exclamation: "\f12a"; +$fa-var-exclamation-circle: "\f06a"; +$fa-var-exclamation-triangle: "\f071"; +$fa-var-expand: "\f065"; +$fa-var-expeditedssl: "\f23e"; +$fa-var-external-link: "\f08e"; +$fa-var-external-link-square: "\f14c"; +$fa-var-eye: "\f06e"; +$fa-var-eye-slash: "\f070"; +$fa-var-eyedropper: "\f1fb"; +$fa-var-fa: "\f2b4"; +$fa-var-facebook: "\f09a"; +$fa-var-facebook-f: "\f09a"; +$fa-var-facebook-official: "\f230"; +$fa-var-facebook-square: "\f082"; +$fa-var-fast-backward: "\f049"; +$fa-var-fast-forward: "\f050"; +$fa-var-fax: "\f1ac"; +$fa-var-feed: "\f09e"; +$fa-var-female: "\f182"; +$fa-var-fighter-jet: "\f0fb"; +$fa-var-file: "\f15b"; +$fa-var-file-archive-o: "\f1c6"; +$fa-var-file-audio-o: "\f1c7"; +$fa-var-file-code-o: "\f1c9"; +$fa-var-file-excel-o: "\f1c3"; +$fa-var-file-image-o: "\f1c5"; +$fa-var-file-movie-o: "\f1c8"; +$fa-var-file-o: "\f016"; +$fa-var-file-pdf-o: "\f1c1"; +$fa-var-file-photo-o: "\f1c5"; +$fa-var-file-picture-o: "\f1c5"; +$fa-var-file-powerpoint-o: "\f1c4"; +$fa-var-file-sound-o: "\f1c7"; +$fa-var-file-text: "\f15c"; +$fa-var-file-text-o: "\f0f6"; +$fa-var-file-video-o: "\f1c8"; +$fa-var-file-word-o: "\f1c2"; +$fa-var-file-zip-o: "\f1c6"; +$fa-var-files-o: "\f0c5"; +$fa-var-film: "\f008"; +$fa-var-filter: "\f0b0"; +$fa-var-fire: "\f06d"; +$fa-var-fire-extinguisher: "\f134"; +$fa-var-firefox: "\f269"; +$fa-var-first-order: "\f2b0"; +$fa-var-flag: "\f024"; +$fa-var-flag-checkered: "\f11e"; +$fa-var-flag-o: "\f11d"; +$fa-var-flash: "\f0e7"; +$fa-var-flask: "\f0c3"; +$fa-var-flickr: "\f16e"; +$fa-var-floppy-o: "\f0c7"; +$fa-var-folder: "\f07b"; +$fa-var-folder-o: "\f114"; +$fa-var-folder-open: "\f07c"; +$fa-var-folder-open-o: "\f115"; +$fa-var-font: "\f031"; +$fa-var-font-awesome: "\f2b4"; +$fa-var-fonticons: "\f280"; +$fa-var-fort-awesome: "\f286"; +$fa-var-forumbee: "\f211"; +$fa-var-forward: "\f04e"; +$fa-var-foursquare: "\f180"; +$fa-var-free-code-camp: "\f2c5"; +$fa-var-frown-o: "\f119"; +$fa-var-futbol-o: "\f1e3"; +$fa-var-gamepad: "\f11b"; +$fa-var-gavel: "\f0e3"; +$fa-var-gbp: "\f154"; +$fa-var-ge: "\f1d1"; +$fa-var-gear: "\f013"; +$fa-var-gears: "\f085"; +$fa-var-genderless: "\f22d"; +$fa-var-get-pocket: "\f265"; +$fa-var-gg: "\f260"; +$fa-var-gg-circle: "\f261"; +$fa-var-gift: "\f06b"; +$fa-var-git: "\f1d3"; +$fa-var-git-square: "\f1d2"; +$fa-var-github: "\f09b"; +$fa-var-github-alt: "\f113"; +$fa-var-github-square: "\f092"; +$fa-var-gitlab: "\f296"; +$fa-var-gittip: "\f184"; +$fa-var-glass: "\f000"; +$fa-var-glide: "\f2a5"; +$fa-var-glide-g: "\f2a6"; +$fa-var-globe: "\f0ac"; +$fa-var-google: "\f1a0"; +$fa-var-google-plus: "\f0d5"; +$fa-var-google-plus-circle: "\f2b3"; +$fa-var-google-plus-official: "\f2b3"; +$fa-var-google-plus-square: "\f0d4"; +$fa-var-google-wallet: "\f1ee"; +$fa-var-graduation-cap: "\f19d"; +$fa-var-gratipay: "\f184"; +$fa-var-grav: "\f2d6"; +$fa-var-group: "\f0c0"; +$fa-var-h-square: "\f0fd"; +$fa-var-hacker-news: "\f1d4"; +$fa-var-hand-grab-o: "\f255"; +$fa-var-hand-lizard-o: "\f258"; +$fa-var-hand-o-down: "\f0a7"; +$fa-var-hand-o-left: "\f0a5"; +$fa-var-hand-o-right: "\f0a4"; +$fa-var-hand-o-up: "\f0a6"; +$fa-var-hand-paper-o: "\f256"; +$fa-var-hand-peace-o: "\f25b"; +$fa-var-hand-pointer-o: "\f25a"; +$fa-var-hand-rock-o: "\f255"; +$fa-var-hand-scissors-o: "\f257"; +$fa-var-hand-spock-o: "\f259"; +$fa-var-hand-stop-o: "\f256"; +$fa-var-handshake-o: "\f2b5"; +$fa-var-hard-of-hearing: "\f2a4"; +$fa-var-hashtag: "\f292"; +$fa-var-hdd-o: "\f0a0"; +$fa-var-header: "\f1dc"; +$fa-var-headphones: "\f025"; +$fa-var-heart: "\f004"; +$fa-var-heart-o: "\f08a"; +$fa-var-heartbeat: "\f21e"; +$fa-var-history: "\f1da"; +$fa-var-home: "\f015"; +$fa-var-hospital-o: "\f0f8"; +$fa-var-hotel: "\f236"; +$fa-var-hourglass: "\f254"; +$fa-var-hourglass-1: "\f251"; +$fa-var-hourglass-2: "\f252"; +$fa-var-hourglass-3: "\f253"; +$fa-var-hourglass-end: "\f253"; +$fa-var-hourglass-half: "\f252"; +$fa-var-hourglass-o: "\f250"; +$fa-var-hourglass-start: "\f251"; +$fa-var-houzz: "\f27c"; +$fa-var-html5: "\f13b"; +$fa-var-i-cursor: "\f246"; +$fa-var-id-badge: "\f2c1"; +$fa-var-id-card: "\f2c2"; +$fa-var-id-card-o: "\f2c3"; +$fa-var-ils: "\f20b"; +$fa-var-image: "\f03e"; +$fa-var-imdb: "\f2d8"; +$fa-var-inbox: "\f01c"; +$fa-var-indent: "\f03c"; +$fa-var-industry: "\f275"; +$fa-var-info: "\f129"; +$fa-var-info-circle: "\f05a"; +$fa-var-inr: "\f156"; +$fa-var-instagram: "\f16d"; +$fa-var-institution: "\f19c"; +$fa-var-internet-explorer: "\f26b"; +$fa-var-intersex: "\f224"; +$fa-var-ioxhost: "\f208"; +$fa-var-italic: "\f033"; +$fa-var-joomla: "\f1aa"; +$fa-var-jpy: "\f157"; +$fa-var-jsfiddle: "\f1cc"; +$fa-var-key: "\f084"; +$fa-var-keyboard-o: "\f11c"; +$fa-var-krw: "\f159"; +$fa-var-language: "\f1ab"; +$fa-var-laptop: "\f109"; +$fa-var-lastfm: "\f202"; +$fa-var-lastfm-square: "\f203"; +$fa-var-leaf: "\f06c"; +$fa-var-leanpub: "\f212"; +$fa-var-legal: "\f0e3"; +$fa-var-lemon-o: "\f094"; +$fa-var-level-down: "\f149"; +$fa-var-level-up: "\f148"; +$fa-var-life-bouy: "\f1cd"; +$fa-var-life-buoy: "\f1cd"; +$fa-var-life-ring: "\f1cd"; +$fa-var-life-saver: "\f1cd"; +$fa-var-lightbulb-o: "\f0eb"; +$fa-var-line-chart: "\f201"; +$fa-var-link: "\f0c1"; +$fa-var-linkedin: "\f0e1"; +$fa-var-linkedin-square: "\f08c"; +$fa-var-linode: "\f2b8"; +$fa-var-linux: "\f17c"; +$fa-var-list: "\f03a"; +$fa-var-list-alt: "\f022"; +$fa-var-list-ol: "\f0cb"; +$fa-var-list-ul: "\f0ca"; +$fa-var-location-arrow: "\f124"; +$fa-var-lock: "\f023"; +$fa-var-long-arrow-down: "\f175"; +$fa-var-long-arrow-left: "\f177"; +$fa-var-long-arrow-right: "\f178"; +$fa-var-long-arrow-up: "\f176"; +$fa-var-low-vision: "\f2a8"; +$fa-var-magic: "\f0d0"; +$fa-var-magnet: "\f076"; +$fa-var-mail-forward: "\f064"; +$fa-var-mail-reply: "\f112"; +$fa-var-mail-reply-all: "\f122"; +$fa-var-male: "\f183"; +$fa-var-map: "\f279"; +$fa-var-map-marker: "\f041"; +$fa-var-map-o: "\f278"; +$fa-var-map-pin: "\f276"; +$fa-var-map-signs: "\f277"; +$fa-var-mars: "\f222"; +$fa-var-mars-double: "\f227"; +$fa-var-mars-stroke: "\f229"; +$fa-var-mars-stroke-h: "\f22b"; +$fa-var-mars-stroke-v: "\f22a"; +$fa-var-maxcdn: "\f136"; +$fa-var-meanpath: "\f20c"; +$fa-var-medium: "\f23a"; +$fa-var-medkit: "\f0fa"; +$fa-var-meetup: "\f2e0"; +$fa-var-meh-o: "\f11a"; +$fa-var-mercury: "\f223"; +$fa-var-microchip: "\f2db"; +$fa-var-microphone: "\f130"; +$fa-var-microphone-slash: "\f131"; +$fa-var-minus: "\f068"; +$fa-var-minus-circle: "\f056"; +$fa-var-minus-square: "\f146"; +$fa-var-minus-square-o: "\f147"; +$fa-var-mixcloud: "\f289"; +$fa-var-mobile: "\f10b"; +$fa-var-mobile-phone: "\f10b"; +$fa-var-modx: "\f285"; +$fa-var-money: "\f0d6"; +$fa-var-moon-o: "\f186"; +$fa-var-mortar-board: "\f19d"; +$fa-var-motorcycle: "\f21c"; +$fa-var-mouse-pointer: "\f245"; +$fa-var-music: "\f001"; +$fa-var-navicon: "\f0c9"; +$fa-var-neuter: "\f22c"; +$fa-var-newspaper-o: "\f1ea"; +$fa-var-object-group: "\f247"; +$fa-var-object-ungroup: "\f248"; +$fa-var-odnoklassniki: "\f263"; +$fa-var-odnoklassniki-square: "\f264"; +$fa-var-opencart: "\f23d"; +$fa-var-openid: "\f19b"; +$fa-var-opera: "\f26a"; +$fa-var-optin-monster: "\f23c"; +$fa-var-outdent: "\f03b"; +$fa-var-pagelines: "\f18c"; +$fa-var-paint-brush: "\f1fc"; +$fa-var-paper-plane: "\f1d8"; +$fa-var-paper-plane-o: "\f1d9"; +$fa-var-paperclip: "\f0c6"; +$fa-var-paragraph: "\f1dd"; +$fa-var-paste: "\f0ea"; +$fa-var-pause: "\f04c"; +$fa-var-pause-circle: "\f28b"; +$fa-var-pause-circle-o: "\f28c"; +$fa-var-paw: "\f1b0"; +$fa-var-paypal: "\f1ed"; +$fa-var-pencil: "\f040"; +$fa-var-pencil-square: "\f14b"; +$fa-var-pencil-square-o: "\f044"; +$fa-var-percent: "\f295"; +$fa-var-phone: "\f095"; +$fa-var-phone-square: "\f098"; +$fa-var-photo: "\f03e"; +$fa-var-picture-o: "\f03e"; +$fa-var-pie-chart: "\f200"; +$fa-var-pied-piper: "\f2ae"; +$fa-var-pied-piper-alt: "\f1a8"; +$fa-var-pied-piper-pp: "\f1a7"; +$fa-var-pinterest: "\f0d2"; +$fa-var-pinterest-p: "\f231"; +$fa-var-pinterest-square: "\f0d3"; +$fa-var-plane: "\f072"; +$fa-var-play: "\f04b"; +$fa-var-play-circle: "\f144"; +$fa-var-play-circle-o: "\f01d"; +$fa-var-plug: "\f1e6"; +$fa-var-plus: "\f067"; +$fa-var-plus-circle: "\f055"; +$fa-var-plus-square: "\f0fe"; +$fa-var-plus-square-o: "\f196"; +$fa-var-podcast: "\f2ce"; +$fa-var-power-off: "\f011"; +$fa-var-print: "\f02f"; +$fa-var-product-hunt: "\f288"; +$fa-var-puzzle-piece: "\f12e"; +$fa-var-qq: "\f1d6"; +$fa-var-qrcode: "\f029"; +$fa-var-question: "\f128"; +$fa-var-question-circle: "\f059"; +$fa-var-question-circle-o: "\f29c"; +$fa-var-quora: "\f2c4"; +$fa-var-quote-left: "\f10d"; +$fa-var-quote-right: "\f10e"; +$fa-var-ra: "\f1d0"; +$fa-var-random: "\f074"; +$fa-var-ravelry: "\f2d9"; +$fa-var-rebel: "\f1d0"; +$fa-var-recycle: "\f1b8"; +$fa-var-reddit: "\f1a1"; +$fa-var-reddit-alien: "\f281"; +$fa-var-reddit-square: "\f1a2"; +$fa-var-refresh: "\f021"; +$fa-var-registered: "\f25d"; +$fa-var-remove: "\f00d"; +$fa-var-renren: "\f18b"; +$fa-var-reorder: "\f0c9"; +$fa-var-repeat: "\f01e"; +$fa-var-reply: "\f112"; +$fa-var-reply-all: "\f122"; +$fa-var-resistance: "\f1d0"; +$fa-var-retweet: "\f079"; +$fa-var-rmb: "\f157"; +$fa-var-road: "\f018"; +$fa-var-rocket: "\f135"; +$fa-var-rotate-left: "\f0e2"; +$fa-var-rotate-right: "\f01e"; +$fa-var-rouble: "\f158"; +$fa-var-rss: "\f09e"; +$fa-var-rss-square: "\f143"; +$fa-var-rub: "\f158"; +$fa-var-ruble: "\f158"; +$fa-var-rupee: "\f156"; +$fa-var-s15: "\f2cd"; +$fa-var-safari: "\f267"; +$fa-var-save: "\f0c7"; +$fa-var-scissors: "\f0c4"; +$fa-var-scribd: "\f28a"; +$fa-var-search: "\f002"; +$fa-var-search-minus: "\f010"; +$fa-var-search-plus: "\f00e"; +$fa-var-sellsy: "\f213"; +$fa-var-send: "\f1d8"; +$fa-var-send-o: "\f1d9"; +$fa-var-server: "\f233"; +$fa-var-share: "\f064"; +$fa-var-share-alt: "\f1e0"; +$fa-var-share-alt-square: "\f1e1"; +$fa-var-share-square: "\f14d"; +$fa-var-share-square-o: "\f045"; +$fa-var-shekel: "\f20b"; +$fa-var-sheqel: "\f20b"; +$fa-var-shield: "\f132"; +$fa-var-ship: "\f21a"; +$fa-var-shirtsinbulk: "\f214"; +$fa-var-shopping-bag: "\f290"; +$fa-var-shopping-basket: "\f291"; +$fa-var-shopping-cart: "\f07a"; +$fa-var-shower: "\f2cc"; +$fa-var-sign-in: "\f090"; +$fa-var-sign-language: "\f2a7"; +$fa-var-sign-out: "\f08b"; +$fa-var-signal: "\f012"; +$fa-var-signing: "\f2a7"; +$fa-var-simplybuilt: "\f215"; +$fa-var-sitemap: "\f0e8"; +$fa-var-skyatlas: "\f216"; +$fa-var-skype: "\f17e"; +$fa-var-slack: "\f198"; +$fa-var-sliders: "\f1de"; +$fa-var-slideshare: "\f1e7"; +$fa-var-smile-o: "\f118"; +$fa-var-snapchat: "\f2ab"; +$fa-var-snapchat-ghost: "\f2ac"; +$fa-var-snapchat-square: "\f2ad"; +$fa-var-snowflake-o: "\f2dc"; +$fa-var-soccer-ball-o: "\f1e3"; +$fa-var-sort: "\f0dc"; +$fa-var-sort-alpha-asc: "\f15d"; +$fa-var-sort-alpha-desc: "\f15e"; +$fa-var-sort-amount-asc: "\f160"; +$fa-var-sort-amount-desc: "\f161"; +$fa-var-sort-asc: "\f0de"; +$fa-var-sort-desc: "\f0dd"; +$fa-var-sort-down: "\f0dd"; +$fa-var-sort-numeric-asc: "\f162"; +$fa-var-sort-numeric-desc: "\f163"; +$fa-var-sort-up: "\f0de"; +$fa-var-soundcloud: "\f1be"; +$fa-var-space-shuttle: "\f197"; +$fa-var-spinner: "\f110"; +$fa-var-spoon: "\f1b1"; +$fa-var-spotify: "\f1bc"; +$fa-var-square: "\f0c8"; +$fa-var-square-o: "\f096"; +$fa-var-stack-exchange: "\f18d"; +$fa-var-stack-overflow: "\f16c"; +$fa-var-star: "\f005"; +$fa-var-star-half: "\f089"; +$fa-var-star-half-empty: "\f123"; +$fa-var-star-half-full: "\f123"; +$fa-var-star-half-o: "\f123"; +$fa-var-star-o: "\f006"; +$fa-var-steam: "\f1b6"; +$fa-var-steam-square: "\f1b7"; +$fa-var-step-backward: "\f048"; +$fa-var-step-forward: "\f051"; +$fa-var-stethoscope: "\f0f1"; +$fa-var-sticky-note: "\f249"; +$fa-var-sticky-note-o: "\f24a"; +$fa-var-stop: "\f04d"; +$fa-var-stop-circle: "\f28d"; +$fa-var-stop-circle-o: "\f28e"; +$fa-var-street-view: "\f21d"; +$fa-var-strikethrough: "\f0cc"; +$fa-var-stumbleupon: "\f1a4"; +$fa-var-stumbleupon-circle: "\f1a3"; +$fa-var-subscript: "\f12c"; +$fa-var-subway: "\f239"; +$fa-var-suitcase: "\f0f2"; +$fa-var-sun-o: "\f185"; +$fa-var-superpowers: "\f2dd"; +$fa-var-superscript: "\f12b"; +$fa-var-support: "\f1cd"; +$fa-var-table: "\f0ce"; +$fa-var-tablet: "\f10a"; +$fa-var-tachometer: "\f0e4"; +$fa-var-tag: "\f02b"; +$fa-var-tags: "\f02c"; +$fa-var-tasks: "\f0ae"; +$fa-var-taxi: "\f1ba"; +$fa-var-telegram: "\f2c6"; +$fa-var-television: "\f26c"; +$fa-var-tencent-weibo: "\f1d5"; +$fa-var-terminal: "\f120"; +$fa-var-text-height: "\f034"; +$fa-var-text-width: "\f035"; +$fa-var-th: "\f00a"; +$fa-var-th-large: "\f009"; +$fa-var-th-list: "\f00b"; +$fa-var-themeisle: "\f2b2"; +$fa-var-thermometer: "\f2c7"; +$fa-var-thermometer-0: "\f2cb"; +$fa-var-thermometer-1: "\f2ca"; +$fa-var-thermometer-2: "\f2c9"; +$fa-var-thermometer-3: "\f2c8"; +$fa-var-thermometer-4: "\f2c7"; +$fa-var-thermometer-empty: "\f2cb"; +$fa-var-thermometer-full: "\f2c7"; +$fa-var-thermometer-half: "\f2c9"; +$fa-var-thermometer-quarter: "\f2ca"; +$fa-var-thermometer-three-quarters: "\f2c8"; +$fa-var-thumb-tack: "\f08d"; +$fa-var-thumbs-down: "\f165"; +$fa-var-thumbs-o-down: "\f088"; +$fa-var-thumbs-o-up: "\f087"; +$fa-var-thumbs-up: "\f164"; +$fa-var-ticket: "\f145"; +$fa-var-times: "\f00d"; +$fa-var-times-circle: "\f057"; +$fa-var-times-circle-o: "\f05c"; +$fa-var-times-rectangle: "\f2d3"; +$fa-var-times-rectangle-o: "\f2d4"; +$fa-var-tint: "\f043"; +$fa-var-toggle-down: "\f150"; +$fa-var-toggle-left: "\f191"; +$fa-var-toggle-off: "\f204"; +$fa-var-toggle-on: "\f205"; +$fa-var-toggle-right: "\f152"; +$fa-var-toggle-up: "\f151"; +$fa-var-trademark: "\f25c"; +$fa-var-train: "\f238"; +$fa-var-transgender: "\f224"; +$fa-var-transgender-alt: "\f225"; +$fa-var-trash: "\f1f8"; +$fa-var-trash-o: "\f014"; +$fa-var-tree: "\f1bb"; +$fa-var-trello: "\f181"; +$fa-var-tripadvisor: "\f262"; +$fa-var-trophy: "\f091"; +$fa-var-truck: "\f0d1"; +$fa-var-try: "\f195"; +$fa-var-tty: "\f1e4"; +$fa-var-tumblr: "\f173"; +$fa-var-tumblr-square: "\f174"; +$fa-var-turkish-lira: "\f195"; +$fa-var-tv: "\f26c"; +$fa-var-twitch: "\f1e8"; +$fa-var-twitter: "\f099"; +$fa-var-twitter-square: "\f081"; +$fa-var-umbrella: "\f0e9"; +$fa-var-underline: "\f0cd"; +$fa-var-undo: "\f0e2"; +$fa-var-universal-access: "\f29a"; +$fa-var-university: "\f19c"; +$fa-var-unlink: "\f127"; +$fa-var-unlock: "\f09c"; +$fa-var-unlock-alt: "\f13e"; +$fa-var-unsorted: "\f0dc"; +$fa-var-upload: "\f093"; +$fa-var-usb: "\f287"; +$fa-var-usd: "\f155"; +$fa-var-user: "\f007"; +$fa-var-user-circle: "\f2bd"; +$fa-var-user-circle-o: "\f2be"; +$fa-var-user-md: "\f0f0"; +$fa-var-user-o: "\f2c0"; +$fa-var-user-plus: "\f234"; +$fa-var-user-secret: "\f21b"; +$fa-var-user-times: "\f235"; +$fa-var-users: "\f0c0"; +$fa-var-vcard: "\f2bb"; +$fa-var-vcard-o: "\f2bc"; +$fa-var-venus: "\f221"; +$fa-var-venus-double: "\f226"; +$fa-var-venus-mars: "\f228"; +$fa-var-viacoin: "\f237"; +$fa-var-viadeo: "\f2a9"; +$fa-var-viadeo-square: "\f2aa"; +$fa-var-video-camera: "\f03d"; +$fa-var-vimeo: "\f27d"; +$fa-var-vimeo-square: "\f194"; +$fa-var-vine: "\f1ca"; +$fa-var-vk: "\f189"; +$fa-var-volume-control-phone: "\f2a0"; +$fa-var-volume-down: "\f027"; +$fa-var-volume-off: "\f026"; +$fa-var-volume-up: "\f028"; +$fa-var-warning: "\f071"; +$fa-var-wechat: "\f1d7"; +$fa-var-weibo: "\f18a"; +$fa-var-weixin: "\f1d7"; +$fa-var-whatsapp: "\f232"; +$fa-var-wheelchair: "\f193"; +$fa-var-wheelchair-alt: "\f29b"; +$fa-var-wifi: "\f1eb"; +$fa-var-wikipedia-w: "\f266"; +$fa-var-window-close: "\f2d3"; +$fa-var-window-close-o: "\f2d4"; +$fa-var-window-maximize: "\f2d0"; +$fa-var-window-minimize: "\f2d1"; +$fa-var-window-restore: "\f2d2"; +$fa-var-windows: "\f17a"; +$fa-var-won: "\f159"; +$fa-var-wordpress: "\f19a"; +$fa-var-wpbeginner: "\f297"; +$fa-var-wpexplorer: "\f2de"; +$fa-var-wpforms: "\f298"; +$fa-var-wrench: "\f0ad"; +$fa-var-xing: "\f168"; +$fa-var-xing-square: "\f169"; +$fa-var-y-combinator: "\f23b"; +$fa-var-y-combinator-square: "\f1d4"; +$fa-var-yahoo: "\f19e"; +$fa-var-yc: "\f23b"; +$fa-var-yc-square: "\f1d4"; +$fa-var-yelp: "\f1e9"; +$fa-var-yen: "\f157"; +$fa-var-yoast: "\f2b1"; +$fa-var-youtube: "\f167"; +$fa-var-youtube-play: "\f16a"; +$fa-var-youtube-square: "\f166"; + diff --git a/src/opsoro/server/static/css/font-awesome/font-awesome.scss b/src/opsoro/server/static/css/font-awesome/font-awesome.scss new file mode 100644 index 0000000..f1c83aa --- /dev/null +++ b/src/opsoro/server/static/css/font-awesome/font-awesome.scss @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables"; +@import "mixins"; +@import "path"; +@import "core"; +@import "larger"; +@import "fixed-width"; +@import "list"; +@import "bordered-pulled"; +@import "animated"; +@import "rotated-flipped"; +@import "stacked"; +@import "icons"; +@import "screen-reader"; diff --git a/src/opsoro/server/static/css/foundation.min.css b/src/opsoro/server/static/css/foundation.min.css index 4e0a37d..143fc53 100644 --- a/src/opsoro/server/static/css/foundation.min.css +++ b/src/opsoro/server/static/css/foundation.min.css @@ -1 +1,2 @@ -meta.foundation-version{font-family:"/5.5.0/"}meta.foundation-mq-small{font-family:"/only screen/";width:0}meta.foundation-mq-small-only{font-family:"/only screen and (max-width: 40em)/";width:0}meta.foundation-mq-medium{font-family:"/only screen and (min-width:40.063em)/";width:40.063em}meta.foundation-mq-medium-only{font-family:"/only screen and (min-width:40.063em) and (max-width:64em)/";width:40.063em}meta.foundation-mq-large{font-family:"/only screen and (min-width:64.063em)/";width:64.063em}meta.foundation-mq-large-only{font-family:"/only screen and (min-width:64.063em) and (max-width:90em)/";width:64.063em}meta.foundation-mq-xlarge{font-family:"/only screen and (min-width:90.063em)/";width:90.063em}meta.foundation-mq-xlarge-only{font-family:"/only screen and (min-width:90.063em) and (max-width:120em)/";width:90.063em}meta.foundation-mq-xxlarge{font-family:"/only screen and (min-width:120.063em)/";width:120.063em}meta.foundation-data-attribute-namespace{font-family:false}html,body{height:100%}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{font-size:100%}body{background:#fff;color:#222;padding:0;margin:0;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;font-style:normal;line-height:1.5;position:relative;cursor:auto}a:hover{cursor:pointer}img{max-width:100%;height:auto}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object{max-width:none !important}.left{float:left !important}.right{float:right !important}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.hide{display:none !important;visibility:hidden}.invisible{visibility:hidden}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}.row{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5rem}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-left:0;padding-right:0}.row.collapse .row{margin-left:0;margin-right:0}.row .row{width:auto;margin-left:-0.9375rem;margin-right:-0.9375rem;margin-top:0;margin-bottom:0;max-width:none}.row .row:before,.row .row:after{content:" ";display:table}.row .row:after{clear:both}.row .row.collapse{width:auto;margin:0;max-width:none}.row .row.collapse:before,.row .row.collapse:after{content:" ";display:table}.row .row.collapse:after{clear:both}.column,.columns{padding-left:0.9375rem;padding-right:0.9375rem;width:100%;float:left}[class*="column"]+[class*="column"]:last-child{float:right}[class*="column"]+[class*="column"].end{float:left}@media only screen{.small-push-0{position:relative;left:0%;right:auto}.small-pull-0{position:relative;right:0%;left:auto}.small-push-1{position:relative;left:8.33333%;right:auto}.small-pull-1{position:relative;right:8.33333%;left:auto}.small-push-2{position:relative;left:16.66667%;right:auto}.small-pull-2{position:relative;right:16.66667%;left:auto}.small-push-3{position:relative;left:25%;right:auto}.small-pull-3{position:relative;right:25%;left:auto}.small-push-4{position:relative;left:33.33333%;right:auto}.small-pull-4{position:relative;right:33.33333%;left:auto}.small-push-5{position:relative;left:41.66667%;right:auto}.small-pull-5{position:relative;right:41.66667%;left:auto}.small-push-6{position:relative;left:50%;right:auto}.small-pull-6{position:relative;right:50%;left:auto}.small-push-7{position:relative;left:58.33333%;right:auto}.small-pull-7{position:relative;right:58.33333%;left:auto}.small-push-8{position:relative;left:66.66667%;right:auto}.small-pull-8{position:relative;right:66.66667%;left:auto}.small-push-9{position:relative;left:75%;right:auto}.small-pull-9{position:relative;right:75%;left:auto}.small-push-10{position:relative;left:83.33333%;right:auto}.small-pull-10{position:relative;right:83.33333%;left:auto}.small-push-11{position:relative;left:91.66667%;right:auto}.small-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375rem;padding-right:0.9375rem;float:left}.small-1{width:8.33333%}.small-2{width:16.66667%}.small-3{width:25%}.small-4{width:33.33333%}.small-5{width:41.66667%}.small-6{width:50%}.small-7{width:58.33333%}.small-8{width:66.66667%}.small-9{width:75%}.small-10{width:83.33333%}.small-11{width:91.66667%}.small-12{width:100%}.small-offset-0{margin-left:0% !important}.small-offset-1{margin-left:8.33333% !important}.small-offset-2{margin-left:16.66667% !important}.small-offset-3{margin-left:25% !important}.small-offset-4{margin-left:33.33333% !important}.small-offset-5{margin-left:41.66667% !important}.small-offset-6{margin-left:50% !important}.small-offset-7{margin-left:58.33333% !important}.small-offset-8{margin-left:66.66667% !important}.small-offset-9{margin-left:75% !important}.small-offset-10{margin-left:83.33333% !important}.small-offset-11{margin-left:91.66667% !important}.small-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.small-centered,.columns.small-centered{margin-left:auto;margin-right:auto;float:none}.column.small-uncentered,.columns.small-uncentered{margin-left:0;margin-right:0;float:left}.column.small-centered:last-child,.columns.small-centered:last-child{float:none}.column.small-uncentered:last-child,.columns.small-uncentered:last-child{float:left}.column.small-uncentered.opposite,.columns.small-uncentered.opposite{float:right}.row.small-collapse>.column,.row.small-collapse>.columns{padding-left:0;padding-right:0}.row.small-collapse .row{margin-left:0;margin-right:0}.row.small-uncollapse>.column,.row.small-uncollapse>.columns{padding-left:0.9375rem;padding-right:0.9375rem;float:left}}@media only screen and (min-width: 40.063em){.medium-push-0{position:relative;left:0%;right:auto}.medium-pull-0{position:relative;right:0%;left:auto}.medium-push-1{position:relative;left:8.33333%;right:auto}.medium-pull-1{position:relative;right:8.33333%;left:auto}.medium-push-2{position:relative;left:16.66667%;right:auto}.medium-pull-2{position:relative;right:16.66667%;left:auto}.medium-push-3{position:relative;left:25%;right:auto}.medium-pull-3{position:relative;right:25%;left:auto}.medium-push-4{position:relative;left:33.33333%;right:auto}.medium-pull-4{position:relative;right:33.33333%;left:auto}.medium-push-5{position:relative;left:41.66667%;right:auto}.medium-pull-5{position:relative;right:41.66667%;left:auto}.medium-push-6{position:relative;left:50%;right:auto}.medium-pull-6{position:relative;right:50%;left:auto}.medium-push-7{position:relative;left:58.33333%;right:auto}.medium-pull-7{position:relative;right:58.33333%;left:auto}.medium-push-8{position:relative;left:66.66667%;right:auto}.medium-pull-8{position:relative;right:66.66667%;left:auto}.medium-push-9{position:relative;left:75%;right:auto}.medium-pull-9{position:relative;right:75%;left:auto}.medium-push-10{position:relative;left:83.33333%;right:auto}.medium-pull-10{position:relative;right:83.33333%;left:auto}.medium-push-11{position:relative;left:91.66667%;right:auto}.medium-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375rem;padding-right:0.9375rem;float:left}.medium-1{width:8.33333%}.medium-2{width:16.66667%}.medium-3{width:25%}.medium-4{width:33.33333%}.medium-5{width:41.66667%}.medium-6{width:50%}.medium-7{width:58.33333%}.medium-8{width:66.66667%}.medium-9{width:75%}.medium-10{width:83.33333%}.medium-11{width:91.66667%}.medium-12{width:100%}.medium-offset-0{margin-left:0% !important}.medium-offset-1{margin-left:8.33333% !important}.medium-offset-2{margin-left:16.66667% !important}.medium-offset-3{margin-left:25% !important}.medium-offset-4{margin-left:33.33333% !important}.medium-offset-5{margin-left:41.66667% !important}.medium-offset-6{margin-left:50% !important}.medium-offset-7{margin-left:58.33333% !important}.medium-offset-8{margin-left:66.66667% !important}.medium-offset-9{margin-left:75% !important}.medium-offset-10{margin-left:83.33333% !important}.medium-offset-11{margin-left:91.66667% !important}.medium-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.medium-centered,.columns.medium-centered{margin-left:auto;margin-right:auto;float:none}.column.medium-uncentered,.columns.medium-uncentered{margin-left:0;margin-right:0;float:left}.column.medium-centered:last-child,.columns.medium-centered:last-child{float:none}.column.medium-uncentered:last-child,.columns.medium-uncentered:last-child{float:left}.column.medium-uncentered.opposite,.columns.medium-uncentered.opposite{float:right}.row.medium-collapse>.column,.row.medium-collapse>.columns{padding-left:0;padding-right:0}.row.medium-collapse .row{margin-left:0;margin-right:0}.row.medium-uncollapse>.column,.row.medium-uncollapse>.columns{padding-left:0.9375rem;padding-right:0.9375rem;float:left}.push-0{position:relative;left:0%;right:auto}.pull-0{position:relative;right:0%;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}@media only screen and (min-width: 64.063em){.large-push-0{position:relative;left:0%;right:auto}.large-pull-0{position:relative;right:0%;left:auto}.large-push-1{position:relative;left:8.33333%;right:auto}.large-pull-1{position:relative;right:8.33333%;left:auto}.large-push-2{position:relative;left:16.66667%;right:auto}.large-pull-2{position:relative;right:16.66667%;left:auto}.large-push-3{position:relative;left:25%;right:auto}.large-pull-3{position:relative;right:25%;left:auto}.large-push-4{position:relative;left:33.33333%;right:auto}.large-pull-4{position:relative;right:33.33333%;left:auto}.large-push-5{position:relative;left:41.66667%;right:auto}.large-pull-5{position:relative;right:41.66667%;left:auto}.large-push-6{position:relative;left:50%;right:auto}.large-pull-6{position:relative;right:50%;left:auto}.large-push-7{position:relative;left:58.33333%;right:auto}.large-pull-7{position:relative;right:58.33333%;left:auto}.large-push-8{position:relative;left:66.66667%;right:auto}.large-pull-8{position:relative;right:66.66667%;left:auto}.large-push-9{position:relative;left:75%;right:auto}.large-pull-9{position:relative;right:75%;left:auto}.large-push-10{position:relative;left:83.33333%;right:auto}.large-pull-10{position:relative;right:83.33333%;left:auto}.large-push-11{position:relative;left:91.66667%;right:auto}.large-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375rem;padding-right:0.9375rem;float:left}.large-1{width:8.33333%}.large-2{width:16.66667%}.large-3{width:25%}.large-4{width:33.33333%}.large-5{width:41.66667%}.large-6{width:50%}.large-7{width:58.33333%}.large-8{width:66.66667%}.large-9{width:75%}.large-10{width:83.33333%}.large-11{width:91.66667%}.large-12{width:100%}.large-offset-0{margin-left:0% !important}.large-offset-1{margin-left:8.33333% !important}.large-offset-2{margin-left:16.66667% !important}.large-offset-3{margin-left:25% !important}.large-offset-4{margin-left:33.33333% !important}.large-offset-5{margin-left:41.66667% !important}.large-offset-6{margin-left:50% !important}.large-offset-7{margin-left:58.33333% !important}.large-offset-8{margin-left:66.66667% !important}.large-offset-9{margin-left:75% !important}.large-offset-10{margin-left:83.33333% !important}.large-offset-11{margin-left:91.66667% !important}.large-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.large-centered,.columns.large-centered{margin-left:auto;margin-right:auto;float:none}.column.large-uncentered,.columns.large-uncentered{margin-left:0;margin-right:0;float:left}.column.large-centered:last-child,.columns.large-centered:last-child{float:none}.column.large-uncentered:last-child,.columns.large-uncentered:last-child{float:left}.column.large-uncentered.opposite,.columns.large-uncentered.opposite{float:right}.row.large-collapse>.column,.row.large-collapse>.columns{padding-left:0;padding-right:0}.row.large-collapse .row{margin-left:0;margin-right:0}.row.large-uncollapse>.column,.row.large-uncollapse>.columns{padding-left:0.9375rem;padding-right:0.9375rem;float:left}.push-0{position:relative;left:0%;right:auto}.pull-0{position:relative;right:0%;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}button,.button{border-style:solid;border-width:0;cursor:pointer;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;line-height:normal;margin:0 0 1.25rem;position:relative;text-decoration:none;text-align:center;-webkit-appearance:none;border-radius:0;display:inline-block;padding-top:1rem;padding-right:2rem;padding-bottom:1.0625rem;padding-left:2rem;font-size:1rem;background-color:#008CBA;border-color:#007095;color:#fff;transition:background-color 300ms ease-out}button:hover,button:focus,.button:hover,.button:focus{background-color:#007095}button:hover,button:focus,.button:hover,.button:focus{color:#fff}button.secondary,.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{background-color:#b9b9b9}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{color:#333}button.success,.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{background-color:#368a55}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{color:#fff}button.alert,.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{background-color:#cf2a0e}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{color:#fff}button.warning,.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{background-color:#cf6e0e}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{color:#fff}button.info,.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{background-color:#61b6d9}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{color:#fff}button.large,.button.large{padding-top:1.125rem;padding-right:2.25rem;padding-bottom:1.1875rem;padding-left:2.25rem;font-size:1.25rem}button.small,.button.small{padding-top:0.875rem;padding-right:1.75rem;padding-bottom:0.9375rem;padding-left:1.75rem;font-size:0.8125rem}button.tiny,.button.tiny{padding-top:0.625rem;padding-right:1.25rem;padding-bottom:0.6875rem;padding-left:1.25rem;font-size:0.6875rem}button.expand,.button.expand{padding-right:0;padding-left:0;width:100%}button.left-align,.button.left-align{text-align:left;text-indent:0.75rem}button.right-align,.button.right-align{text-align:right;padding-right:0.75rem}button.radius,.button.radius{border-radius:3px}button.round,.button.round{border-radius:1000px}button.disabled,button[disabled],.button.disabled,.button[disabled]{background-color:#008CBA;border-color:#007095;color:#fff;cursor:default;opacity:0.7;box-shadow:none}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#007095}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{color:#fff}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#008CBA}button.disabled.secondary,button[disabled].secondary,.button.disabled.secondary,.button[disabled].secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333;cursor:default;opacity:0.7;box-shadow:none}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#b9b9b9}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{color:#333}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#e7e7e7}button.disabled.success,button[disabled].success,.button.disabled.success,.button[disabled].success{background-color:#43AC6A;border-color:#368a55;color:#fff;cursor:default;opacity:0.7;box-shadow:none}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#368a55}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{color:#fff}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#43AC6A}button.disabled.alert,button[disabled].alert,.button.disabled.alert,.button[disabled].alert{background-color:#f04124;border-color:#cf2a0e;color:#fff;cursor:default;opacity:0.7;box-shadow:none}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#cf2a0e}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{color:#fff}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#f04124}button.disabled.warning,button[disabled].warning,.button.disabled.warning,.button[disabled].warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff;cursor:default;opacity:0.7;box-shadow:none}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#cf6e0e}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{color:#fff}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#f08a24}button.disabled.info,button[disabled].info,.button.disabled.info,.button[disabled].info{background-color:#a0d3e8;border-color:#61b6d9;color:#333;cursor:default;opacity:0.7;box-shadow:none}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#61b6d9}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{color:#fff}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#a0d3e8}button::-moz-focus-inner{border:0;padding:0}@media only screen and (min-width: 40.063em){button,.button{display:inline-block}}form{margin:0 0 1rem}form .row .row{margin:0 -0.5rem}form .row .row .column,form .row .row .columns{padding:0 0.5rem}form .row .row.collapse{margin:0}form .row .row.collapse .column,form .row .row.collapse .columns{padding:0}form .row .row.collapse input{-webkit-border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-bottom-right-radius:0;border-top-right-radius:0}form .row input.column,form .row input.columns,form .row textarea.column,form .row textarea.columns{padding-left:0.5rem}label{font-size:0.875rem;color:#4d4d4d;cursor:pointer;display:block;font-weight:normal;line-height:1.5;margin-bottom:0}label.right{float:none !important;text-align:right}label.inline{margin:0 0 1rem 0;padding:0.5625rem 0}label small{text-transform:capitalize;color:#676767}.prefix,.postfix{display:block;position:relative;z-index:2;text-align:center;width:100%;padding-top:0;padding-bottom:0;border-style:solid;border-width:1px;overflow:hidden;font-size:0.875rem;height:2.3125rem;line-height:2.3125rem}.postfix.button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;text-align:center;border:none}.prefix.button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;text-align:center;border:none}.prefix.button.radius{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.postfix.button.radius{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.prefix.button.round{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.postfix.button.round{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}span.prefix,label.prefix{background:#f2f2f2;border-right:none;color:#333;border-color:#ccc}span.postfix,label.postfix{background:#f2f2f2;border-left:none;color:#333;border-color:#ccc}input[type="text"],input[type="password"],input[type="date"],input[type="datetime"],input[type="datetime-local"],input[type="month"],input[type="week"],input[type="email"],input[type="number"],input[type="search"],input[type="tel"],input[type="time"],input[type="url"],input[type="color"],textarea{-webkit-appearance:none;border-radius:0;background-color:#fff;font-family:inherit;border-style:solid;border-width:1px;border-color:#ccc;box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);color:rgba(0,0,0,0.75);display:block;font-size:0.875rem;margin:0 0 1rem 0;padding:0.5rem;height:2.3125rem;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:box-shadow 0.45s,border-color 0.45s ease-in-out}input[type="text"]:focus,input[type="password"]:focus,input[type="date"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="month"]:focus,input[type="week"]:focus,input[type="email"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="time"]:focus,input[type="url"]:focus,input[type="color"]:focus,textarea:focus{box-shadow:0 0 5px #999;border-color:#999}input[type="text"]:focus,input[type="password"]:focus,input[type="date"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="month"]:focus,input[type="week"]:focus,input[type="email"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="time"]:focus,input[type="url"]:focus,input[type="color"]:focus,textarea:focus{background:#fafafa;border-color:#999;outline:none}input[type="text"]:disabled,input[type="password"]:disabled,input[type="date"]:disabled,input[type="datetime"]:disabled,input[type="datetime-local"]:disabled,input[type="month"]:disabled,input[type="week"]:disabled,input[type="email"]:disabled,input[type="number"]:disabled,input[type="search"]:disabled,input[type="tel"]:disabled,input[type="time"]:disabled,input[type="url"]:disabled,input[type="color"]:disabled,textarea:disabled{background-color:#ddd;cursor:default}input[type="text"][disabled],input[type="text"][readonly],fieldset[disabled] input[type="text"],input[type="password"][disabled],input[type="password"][readonly],fieldset[disabled] input[type="password"],input[type="date"][disabled],input[type="date"][readonly],fieldset[disabled] input[type="date"],input[type="datetime"][disabled],input[type="datetime"][readonly],fieldset[disabled] input[type="datetime"],input[type="datetime-local"][disabled],input[type="datetime-local"][readonly],fieldset[disabled] input[type="datetime-local"],input[type="month"][disabled],input[type="month"][readonly],fieldset[disabled] input[type="month"],input[type="week"][disabled],input[type="week"][readonly],fieldset[disabled] input[type="week"],input[type="email"][disabled],input[type="email"][readonly],fieldset[disabled] input[type="email"],input[type="number"][disabled],input[type="number"][readonly],fieldset[disabled] input[type="number"],input[type="search"][disabled],input[type="search"][readonly],fieldset[disabled] input[type="search"],input[type="tel"][disabled],input[type="tel"][readonly],fieldset[disabled] input[type="tel"],input[type="time"][disabled],input[type="time"][readonly],fieldset[disabled] input[type="time"],input[type="url"][disabled],input[type="url"][readonly],fieldset[disabled] input[type="url"],input[type="color"][disabled],input[type="color"][readonly],fieldset[disabled] input[type="color"],textarea[disabled],textarea[readonly],fieldset[disabled] textarea{background-color:#ddd;cursor:default}input[type="text"].radius,input[type="password"].radius,input[type="date"].radius,input[type="datetime"].radius,input[type="datetime-local"].radius,input[type="month"].radius,input[type="week"].radius,input[type="email"].radius,input[type="number"].radius,input[type="search"].radius,input[type="tel"].radius,input[type="time"].radius,input[type="url"].radius,input[type="color"].radius,textarea.radius{border-radius:3px}form .row .prefix-radius.row.collapse input,form .row .prefix-radius.row.collapse textarea,form .row .prefix-radius.row.collapse select{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-radius.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse input,form .row .postfix-radius.row.collapse textarea,form .row .postfix-radius.row.collapse select{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-round.row.collapse input,form .row .prefix-round.row.collapse textarea,form .row .prefix-round.row.collapse select{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}form .row .prefix-round.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse input,form .row .postfix-round.row.collapse textarea,form .row .postfix-round.row.collapse select{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}input[type="submit"]{-webkit-appearance:none;border-radius:0}textarea[rows]{height:auto}textarea{max-width:100%}select{-webkit-appearance:none !important;border-radius:0;background-color:#FAFAFA;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeD0iMTJweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzcHgiIHZpZXdCb3g9IjAgMCA2IDMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYgMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSI1Ljk5MiwwIDIuOTkyLDMgLTAuMDA4LDAgIi8+PC9zdmc+);background-position:100% center;background-repeat:no-repeat;border-style:solid;border-width:1px;border-color:#ccc;padding:0.5rem;font-size:0.875rem;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;color:rgba(0,0,0,0.75);line-height:normal;border-radius:0;height:2.3125rem}select::-ms-expand{display:none}select.radius{border-radius:3px}select:hover{background-color:#f3f3f3;border-color:#999}select:disabled{background-color:#ddd;cursor:default}input[type="file"],input[type="checkbox"],input[type="radio"],select{margin:0 0 1rem 0}input[type="checkbox"]+label,input[type="radio"]+label{display:inline-block;margin-left:0.5rem;margin-right:1rem;margin-bottom:0;vertical-align:baseline}input[type="file"]{width:100%}fieldset{border:1px solid #ddd;padding:1.25rem;margin:1.125rem 0}fieldset legend{font-weight:bold;background:#fff;padding:0 0.1875rem;margin:0;margin-left:-0.1875rem}[data-abide] .error small.error,[data-abide] .error span.error,[data-abide] span.error,[data-abide] small.error{display:block;padding:0.375rem 0.5625rem 0.5625rem;margin-top:-1px;margin-bottom:1rem;font-size:0.75rem;font-weight:normal;font-style:italic;background:#f04124;color:#fff}[data-abide] span.error,[data-abide] small.error{display:none}span.error,small.error{display:block;padding:0.375rem 0.5625rem 0.5625rem;margin-top:-1px;margin-bottom:1rem;font-size:0.75rem;font-weight:normal;font-style:italic;background:#f04124;color:#fff}.error input,.error textarea,.error select{margin-bottom:0}.error input[type="checkbox"],.error input[type="radio"]{margin-bottom:1rem}.error label,.error label.error{color:#f04124}.error small.error{display:block;padding:0.375rem 0.5625rem 0.5625rem;margin-top:-1px;margin-bottom:1rem;font-size:0.75rem;font-weight:normal;font-style:italic;background:#f04124;color:#fff}.error>label>small{color:#676767;background:transparent;padding:0;text-transform:capitalize;font-style:normal;font-size:60%;margin:0;display:inline}.error span.error-message{display:block}input.error,textarea.error,select.error{margin-bottom:0}label.error{color:#f04124}meta.foundation-mq-topbar{font-family:"/only screen and (min-width:40.063em)/";width:40.063em}.contain-to-grid{width:100%;background:#333}.contain-to-grid .top-bar{margin-bottom:0}.fixed{width:100%;left:0;position:fixed;top:0;z-index:99}.fixed.expanded:not(.top-bar){overflow-y:auto;height:auto;width:100%;max-height:100%}.fixed.expanded:not(.top-bar) .title-area{position:fixed;width:100%;z-index:99}.fixed.expanded:not(.top-bar) .top-bar-section{z-index:98;margin-top:2.8125rem}.top-bar{overflow:hidden;height:2.8125rem;line-height:2.8125rem;position:relative;background:#333;margin-bottom:0}.top-bar ul{margin-bottom:0;list-style:none}.top-bar .row{max-width:none}.top-bar form,.top-bar input{margin-bottom:0}.top-bar input{height:1.75rem;padding-top:.35rem;padding-bottom:.35rem;font-size:0.75rem}.top-bar .button,.top-bar button{padding-top:0.4125rem;padding-bottom:0.4125rem;margin-bottom:0;font-size:0.75rem}@media only screen and (max-width: 40em){.top-bar .button,.top-bar button{position:relative;top:-1px}}.top-bar .title-area{position:relative;margin:0}.top-bar .name{height:2.8125rem;margin:0;font-size:16px}.top-bar .name h1,.top-bar .name h2,.top-bar .name h3,.top-bar .name h4,.top-bar .name p,.top-bar .name span{line-height:2.8125rem;font-size:1.0625rem;margin:0}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name p a,.top-bar .name span a{font-weight:normal;color:#fff;width:75%;display:block;padding:0 0.9375rem}.top-bar .toggle-topbar{position:absolute;right:0;top:0}.top-bar .toggle-topbar a{color:#fff;text-transform:uppercase;font-size:0.8125rem;font-weight:bold;position:relative;display:block;padding:0 0.9375rem;height:2.8125rem;line-height:2.8125rem}.top-bar .toggle-topbar.menu-icon{top:50%;margin-top:-16px}.top-bar .toggle-topbar.menu-icon a{height:34px;line-height:33px;padding:0 2.5rem 0 0.9375rem;color:#fff;position:relative}.top-bar .toggle-topbar.menu-icon a span::after{content:"";position:absolute;display:block;height:0;top:50%;margin-top:-8px;right:0.9375rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:16px}.top-bar .toggle-topbar.menu-icon a span:hover:after{box-shadow:0 0 0 1px "",0 7px 0 1px "",0 14px 0 1px ""}.top-bar.expanded{height:auto;background:transparent}.top-bar.expanded .title-area{background:#333}.top-bar.expanded .toggle-topbar a{color:#888}.top-bar.expanded .toggle-topbar a span::after{box-shadow:0 0 0 1px #888,0 7px 0 1px #888,0 14px 0 1px #888}.top-bar-section{left:0;position:relative;width:auto;transition:left 300ms ease-out}.top-bar-section ul{padding:0;width:100%;height:auto;display:block;font-size:16px;margin:0}.top-bar-section .divider,.top-bar-section [role="separator"]{border-top:solid 1px #1a1a1a;clear:both;height:1px;width:100%}.top-bar-section ul li{background:#333}.top-bar-section ul li>a{display:block;width:100%;color:#fff;padding:12px 0 12px 0;padding-left:0.9375rem;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:0.8125rem;font-weight:normal;text-transform:none}.top-bar-section ul li>a.button{font-size:0.8125rem;padding-right:0.9375rem;padding-left:0.9375rem;background-color:#008CBA;border-color:#007095;color:#fff}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{background-color:#007095}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{color:#fff}.top-bar-section ul li>a.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{color:#333}.top-bar-section ul li>a.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{background-color:#368a55}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{color:#fff}.top-bar-section ul li>a.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{color:#fff}.top-bar-section ul li>a.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{color:#fff}.top-bar-section ul li>button{font-size:0.8125rem;padding-right:0.9375rem;padding-left:0.9375rem;background-color:#008CBA;border-color:#007095;color:#fff}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{background-color:#007095}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{color:#fff}.top-bar-section ul li>button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{color:#333}.top-bar-section ul li>button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{background-color:#368a55}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{color:#fff}.top-bar-section ul li>button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{color:#fff}.top-bar-section ul li>button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{color:#fff}.top-bar-section ul li:hover:not(.has-form)>a{background-color:#555;background:#333;color:#fff}.top-bar-section ul li.active>a{background:#008CBA;color:#fff}.top-bar-section ul li.active>a:hover{background:#0078a0;color:#fff}.top-bar-section .has-form{padding:0.9375rem}.top-bar-section .has-dropdown{position:relative}.top-bar-section .has-dropdown>a:after{content:"";display:block;width:0;height:0;border:inset 5px;border-color:transparent transparent transparent rgba(255,255,255,0.4);border-left-style:solid;margin-right:0.9375rem;margin-top:-4.5px;position:absolute;top:50%;right:0}.top-bar-section .has-dropdown.moved{position:static}.top-bar-section .has-dropdown.moved>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important;width:100%}.top-bar-section .has-dropdown.moved>a:after{display:none}.top-bar-section .dropdown{padding:0;position:absolute;left:100%;top:0;z-index:99;display:block;position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}.top-bar-section .dropdown li{width:100%;height:auto}.top-bar-section .dropdown li a{font-weight:normal;padding:8px 0.9375rem}.top-bar-section .dropdown li a.parent-link{font-weight:normal}.top-bar-section .dropdown li.title h5,.top-bar-section .dropdown li.parent-link{margin-bottom:0;margin-top:0;font-size:1.125rem}.top-bar-section .dropdown li.title h5 a,.top-bar-section .dropdown li.parent-link a{color:#fff;display:block}.top-bar-section .dropdown li.title h5 a:hover,.top-bar-section .dropdown li.parent-link a:hover{background:none}.top-bar-section .dropdown li.has-form{padding:8px 0.9375rem}.top-bar-section .dropdown li .button,.top-bar-section .dropdown li button{top:auto}.top-bar-section .dropdown label{padding:8px 0.9375rem 2px;margin-bottom:0;text-transform:uppercase;color:#777;font-weight:bold;font-size:0.625rem}.js-generated{display:block}@media only screen and (min-width: 40.063em){.top-bar{background:#333;overflow:visible}.top-bar:before,.top-bar:after{content:" ";display:table}.top-bar:after{clear:both}.top-bar .toggle-topbar{display:none}.top-bar .title-area{float:left}.top-bar .name h1 a{width:auto}.top-bar input,.top-bar .button,.top-bar button{font-size:0.875rem;position:relative;height:1.75rem;top:0.53125rem}.top-bar.expanded{background:#333}.contain-to-grid .top-bar{max-width:62.5rem;margin:0 auto;margin-bottom:0}.top-bar-section{transition:none 0 0;left:0 !important}.top-bar-section ul{width:auto;height:auto !important;display:inline}.top-bar-section ul li{float:left}.top-bar-section ul li .js-generated{display:none}.top-bar-section li.hover>a:not(.button){background-color:#555;background:#333;color:#fff}.top-bar-section li:not(.has-form) a:not(.button){padding:0 0.9375rem;line-height:2.8125rem;background:#333}.top-bar-section li:not(.has-form) a:not(.button):hover{background-color:#555;background:#333}.top-bar-section li.active:not(.has-form) a:not(.button){padding:0 0.9375rem;line-height:2.8125rem;color:#fff;background:#008CBA}.top-bar-section li.active:not(.has-form) a:not(.button):hover{background:#0078a0;color:#fff}.top-bar-section .has-dropdown>a{padding-right:2.1875rem !important}.top-bar-section .has-dropdown>a:after{content:"";display:block;width:0;height:0;border:inset 5px;border-color:rgba(255,255,255,0.4) transparent transparent transparent;border-top-style:solid;margin-top:-2.5px;top:1.40625rem}.top-bar-section .has-dropdown.moved{position:relative}.top-bar-section .has-dropdown.moved>.dropdown{display:block;position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}.top-bar-section .has-dropdown.hover>.dropdown,.top-bar-section .has-dropdown.not-click:hover>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.top-bar-section .has-dropdown>a:focus+.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.top-bar-section .has-dropdown .dropdown li.has-dropdown>a:after{border:none;content:"\00bb";top:1rem;margin-top:-1px;right:5px;line-height:1.2}.top-bar-section .dropdown{left:0;top:auto;background:transparent;min-width:100%}.top-bar-section .dropdown li a{color:#fff;line-height:2.8125rem;white-space:nowrap;padding:12px 0.9375rem;background:#333}.top-bar-section .dropdown li:not(.has-form):not(.active)>a:not(.button){color:#fff;background:#333}.top-bar-section .dropdown li:not(.has-form):not(.active):hover>a:not(.button){color:#fff;background-color:#555;background:#333}.top-bar-section .dropdown li label{white-space:nowrap;background:#333}.top-bar-section .dropdown li .dropdown{left:100%;top:0}.top-bar-section>ul>.divider,.top-bar-section>ul>[role="separator"]{border-bottom:none;border-top:none;border-right:solid 1px #4e4e4e;clear:none;height:2.8125rem;width:0}.top-bar-section .has-form{background:#333;padding:0 0.9375rem;height:2.8125rem}.top-bar-section .right li .dropdown{left:auto;right:0}.top-bar-section .right li .dropdown li .dropdown{right:100%}.top-bar-section .left li .dropdown{right:auto;left:0}.top-bar-section .left li .dropdown li .dropdown{left:100%}.no-js .top-bar-section ul li:hover>a{background-color:#555;background:#333;color:#fff}.no-js .top-bar-section ul li:active>a{background:#008CBA;color:#fff}.no-js .top-bar-section .has-dropdown:hover>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.no-js .top-bar-section .has-dropdown>a:focus+.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}}.breadcrumbs{display:block;padding:0.5625rem 0.875rem 0.5625rem;overflow:hidden;margin-left:0;list-style:none;border-style:solid;border-width:1px;background-color:#f4f4f4;border-color:#dcdcdc;border-radius:3px}.breadcrumbs>*{margin:0;float:left;font-size:0.6875rem;line-height:0.6875rem;text-transform:uppercase;color:#008CBA}.breadcrumbs>*:hover a,.breadcrumbs>*:focus a{text-decoration:underline}.breadcrumbs>* a{color:#008CBA}.breadcrumbs>*.current{cursor:default;color:#333}.breadcrumbs>*.current a{cursor:default;color:#333}.breadcrumbs>*.current:hover,.breadcrumbs>*.current:hover a,.breadcrumbs>*.current:focus,.breadcrumbs>*.current:focus a{text-decoration:none}.breadcrumbs>*.unavailable{color:#999}.breadcrumbs>*.unavailable a{color:#999}.breadcrumbs>*.unavailable:hover,.breadcrumbs>*.unavailable:hover a,.breadcrumbs>*.unavailable:focus,.breadcrumbs>*.unavailable a:focus{text-decoration:none;color:#999;cursor:default}.breadcrumbs>*:before{content:"/";color:#aaa;margin:0 0.75rem;position:relative;top:1px}.breadcrumbs>*:first-child:before{content:" ";margin:0}[aria-label="breadcrumbs"] [aria-hidden="true"]:after{content:"/"}.alert-box{border-style:solid;border-width:1px;display:block;font-weight:normal;margin-bottom:1.25rem;position:relative;padding:0.875rem 1.5rem 0.875rem 0.875rem;font-size:0.8125rem;transition:opacity 300ms ease-out;background-color:#008CBA;border-color:#0078a0;color:#fff}.alert-box .close{font-size:1.375rem;padding:9px 6px 4px;line-height:0;position:absolute;top:50%;margin-top:-0.6875rem;right:0.25rem;color:#333;opacity:0.3;background:inherit}.alert-box .close:hover,.alert-box .close:focus{opacity:0.5}.alert-box.radius{border-radius:3px}.alert-box.round{border-radius:1000px}.alert-box.success{background-color:#43AC6A;border-color:#3a945b;color:#fff}.alert-box.alert{background-color:#f04124;border-color:#de2d0f;color:#fff}.alert-box.secondary{background-color:#e7e7e7;border-color:#c7c7c7;color:#4f4f4f}.alert-box.warning{background-color:#f08a24;border-color:#de770f;color:#fff}.alert-box.info{background-color:#a0d3e8;border-color:#74bfdd;color:#4f4f4f}.alert-box.alert-close{opacity:0}.inline-list{margin:0 auto 1.0625rem auto;margin-left:-1.375rem;margin-right:0;padding:0;list-style:none;overflow:hidden}.inline-list>li{list-style:none;float:left;margin-left:1.375rem;display:block}.inline-list>li>*{display:block}.button-group{list-style:none;margin:0;left:0}.button-group:before,.button-group:after{content:" ";display:table}.button-group:after{clear:both}.button-group>li{margin:0 -2px;display:inline-block}.button-group>li>button,.button-group>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group>li:first-child button,.button-group>li:first-child .button{border-left:0}.button-group.stack>li{margin:0 -2px;display:inline-block;display:block;margin:0;float:none}.button-group.stack>li>button,.button-group.stack>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.stack>li:first-child button,.button-group.stack>li:first-child .button{border-left:0}.button-group.stack>li>button,.button-group.stack>li .button{border-top:1px solid;border-color:rgba(255,255,255,0.5);border-left-width:0;margin:0;display:block}.button-group.stack>li:first-child button,.button-group.stack>li:first-child .button{border-top:0}.button-group.stack-for-small>li{margin:0 -2px;display:inline-block}.button-group.stack-for-small>li>button,.button-group.stack-for-small>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.stack-for-small>li:first-child button,.button-group.stack-for-small>li:first-child .button{border-left:0}@media only screen and (max-width: 40em){.button-group.stack-for-small>li{margin:0 -2px;display:inline-block;display:block;margin:0}.button-group.stack-for-small>li>button,.button-group.stack-for-small>li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.stack-for-small>li:first-child button,.button-group.stack-for-small>li:first-child .button{border-left:0}.button-group.stack-for-small>li>button,.button-group.stack-for-small>li .button{border-top:1px solid;border-color:rgba(255,255,255,0.5);border-left-width:0;margin:0;display:block}.button-group.stack-for-small>li:first-child button,.button-group.stack-for-small>li:first-child .button{border-top:0}}.button-group.radius>*{margin:0 -2px;display:inline-block}.button-group.radius>*>button,.button-group.radius>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius>*:first-child button,.button-group.radius>*:first-child .button{border-left:0}.button-group.radius>*,.button-group.radius>*>a,.button-group.radius>*>button,.button-group.radius>*>.button{border-radius:0}.button-group.radius>*:first-child,.button-group.radius>*:first-child>a,.button-group.radius>*:first-child>button,.button-group.radius>*:first-child>.button{-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.button-group.radius>*:last-child,.button-group.radius>*:last-child>a,.button-group.radius>*:last-child>button,.button-group.radius>*:last-child>.button{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.button-group.radius.stack>*{margin:0 -2px;display:inline-block;display:block;margin:0}.button-group.radius.stack>*>button,.button-group.radius.stack>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius.stack>*:first-child button,.button-group.radius.stack>*:first-child .button{border-left:0}.button-group.radius.stack>*>button,.button-group.radius.stack>* .button{border-top:1px solid;border-color:rgba(255,255,255,0.5);border-left-width:0;margin:0;display:block}.button-group.radius.stack>*:first-child button,.button-group.radius.stack>*:first-child .button{border-top:0}.button-group.radius.stack>*,.button-group.radius.stack>*>a,.button-group.radius.stack>*>button,.button-group.radius.stack>*>.button{border-radius:0}.button-group.radius.stack>*:first-child,.button-group.radius.stack>*:first-child>a,.button-group.radius.stack>*:first-child>button,.button-group.radius.stack>*:first-child>.button{-webkit-top-left-radius:3px;-webkit-top-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px}.button-group.radius.stack>*:last-child,.button-group.radius.stack>*:last-child>a,.button-group.radius.stack>*:last-child>button,.button-group.radius.stack>*:last-child>.button{-webkit-bottom-left-radius:3px;-webkit-bottom-right-radius:3px;border-bottom-left-radius:3px;border-bottom-right-radius:3px}@media only screen and (min-width: 40.063em){.button-group.radius.stack-for-small>*{margin:0 -2px;display:inline-block}.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius.stack-for-small>*:first-child button,.button-group.radius.stack-for-small>*:first-child .button{border-left:0}.button-group.radius.stack-for-small>*,.button-group.radius.stack-for-small>*>a,.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>*>.button{border-radius:0}.button-group.radius.stack-for-small>*:first-child,.button-group.radius.stack-for-small>*:first-child>a,.button-group.radius.stack-for-small>*:first-child>button,.button-group.radius.stack-for-small>*:first-child>.button{-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.button-group.radius.stack-for-small>*:last-child,.button-group.radius.stack-for-small>*:last-child>a,.button-group.radius.stack-for-small>*:last-child>button,.button-group.radius.stack-for-small>*:last-child>.button{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}}@media only screen and (max-width: 40em){.button-group.radius.stack-for-small>*{margin:0 -2px;display:inline-block;display:block;margin:0}.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.radius.stack-for-small>*:first-child button,.button-group.radius.stack-for-small>*:first-child .button{border-left:0}.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>* .button{border-top:1px solid;border-color:rgba(255,255,255,0.5);border-left-width:0;margin:0;display:block}.button-group.radius.stack-for-small>*:first-child button,.button-group.radius.stack-for-small>*:first-child .button{border-top:0}.button-group.radius.stack-for-small>*,.button-group.radius.stack-for-small>*>a,.button-group.radius.stack-for-small>*>button,.button-group.radius.stack-for-small>*>.button{border-radius:0}.button-group.radius.stack-for-small>*:first-child,.button-group.radius.stack-for-small>*:first-child>a,.button-group.radius.stack-for-small>*:first-child>button,.button-group.radius.stack-for-small>*:first-child>.button{-webkit-top-left-radius:3px;-webkit-top-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px}.button-group.radius.stack-for-small>*:last-child,.button-group.radius.stack-for-small>*:last-child>a,.button-group.radius.stack-for-small>*:last-child>button,.button-group.radius.stack-for-small>*:last-child>.button{-webkit-bottom-left-radius:3px;-webkit-bottom-right-radius:3px;border-bottom-left-radius:3px;border-bottom-right-radius:3px}}.button-group.round>*{margin:0 -2px;display:inline-block}.button-group.round>*>button,.button-group.round>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round>*:first-child button,.button-group.round>*:first-child .button{border-left:0}.button-group.round>*,.button-group.round>*>a,.button-group.round>*>button,.button-group.round>*>.button{border-radius:0}.button-group.round>*:first-child,.button-group.round>*:first-child>a,.button-group.round>*:first-child>button,.button-group.round>*:first-child>.button{-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.button-group.round>*:last-child,.button-group.round>*:last-child>a,.button-group.round>*:last-child>button,.button-group.round>*:last-child>.button{-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}.button-group.round.stack>*{margin:0 -2px;display:inline-block;display:block;margin:0}.button-group.round.stack>*>button,.button-group.round.stack>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round.stack>*:first-child button,.button-group.round.stack>*:first-child .button{border-left:0}.button-group.round.stack>*>button,.button-group.round.stack>* .button{border-top:1px solid;border-color:rgba(255,255,255,0.5);border-left-width:0;margin:0;display:block}.button-group.round.stack>*:first-child button,.button-group.round.stack>*:first-child .button{border-top:0}.button-group.round.stack>*,.button-group.round.stack>*>a,.button-group.round.stack>*>button,.button-group.round.stack>*>.button{border-radius:0}.button-group.round.stack>*:first-child,.button-group.round.stack>*:first-child>a,.button-group.round.stack>*:first-child>button,.button-group.round.stack>*:first-child>.button{-webkit-top-left-radius:1rem;-webkit-top-right-radius:1rem;border-top-left-radius:1rem;border-top-right-radius:1rem}.button-group.round.stack>*:last-child,.button-group.round.stack>*:last-child>a,.button-group.round.stack>*:last-child>button,.button-group.round.stack>*:last-child>.button{-webkit-bottom-left-radius:1rem;-webkit-bottom-right-radius:1rem;border-bottom-left-radius:1rem;border-bottom-right-radius:1rem}@media only screen and (min-width: 40.063em){.button-group.round.stack-for-small>*{margin:0 -2px;display:inline-block}.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round.stack-for-small>*:first-child button,.button-group.round.stack-for-small>*:first-child .button{border-left:0}.button-group.round.stack-for-small>*,.button-group.round.stack-for-small>*>a,.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>*>.button{border-radius:0}.button-group.round.stack-for-small>*:first-child,.button-group.round.stack-for-small>*:first-child>a,.button-group.round.stack-for-small>*:first-child>button,.button-group.round.stack-for-small>*:first-child>.button{-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.button-group.round.stack-for-small>*:last-child,.button-group.round.stack-for-small>*:last-child>a,.button-group.round.stack-for-small>*:last-child>button,.button-group.round.stack-for-small>*:last-child>.button{-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}}@media only screen and (max-width: 40em){.button-group.round.stack-for-small>*{margin:0 -2px;display:inline-block;display:block;margin:0}.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>* .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.round.stack-for-small>*:first-child button,.button-group.round.stack-for-small>*:first-child .button{border-left:0}.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>* .button{border-top:1px solid;border-color:rgba(255,255,255,0.5);border-left-width:0;margin:0;display:block}.button-group.round.stack-for-small>*:first-child button,.button-group.round.stack-for-small>*:first-child .button{border-top:0}.button-group.round.stack-for-small>*,.button-group.round.stack-for-small>*>a,.button-group.round.stack-for-small>*>button,.button-group.round.stack-for-small>*>.button{border-radius:0}.button-group.round.stack-for-small>*:first-child,.button-group.round.stack-for-small>*:first-child>a,.button-group.round.stack-for-small>*:first-child>button,.button-group.round.stack-for-small>*:first-child>.button{-webkit-top-left-radius:1rem;-webkit-top-right-radius:1rem;border-top-left-radius:1rem;border-top-right-radius:1rem}.button-group.round.stack-for-small>*:last-child,.button-group.round.stack-for-small>*:last-child>a,.button-group.round.stack-for-small>*:last-child>button,.button-group.round.stack-for-small>*:last-child>.button{-webkit-bottom-left-radius:1rem;-webkit-bottom-right-radius:1rem;border-bottom-left-radius:1rem;border-bottom-right-radius:1rem}}.button-group.even-2 li{margin:0 -2px;display:inline-block;width:50%}.button-group.even-2 li>button,.button-group.even-2 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-2 li:first-child button,.button-group.even-2 li:first-child .button{border-left:0}.button-group.even-2 li button,.button-group.even-2 li .button{width:100%}.button-group.even-3 li{margin:0 -2px;display:inline-block;width:33.33333%}.button-group.even-3 li>button,.button-group.even-3 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-3 li:first-child button,.button-group.even-3 li:first-child .button{border-left:0}.button-group.even-3 li button,.button-group.even-3 li .button{width:100%}.button-group.even-4 li{margin:0 -2px;display:inline-block;width:25%}.button-group.even-4 li>button,.button-group.even-4 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-4 li:first-child button,.button-group.even-4 li:first-child .button{border-left:0}.button-group.even-4 li button,.button-group.even-4 li .button{width:100%}.button-group.even-5 li{margin:0 -2px;display:inline-block;width:20%}.button-group.even-5 li>button,.button-group.even-5 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-5 li:first-child button,.button-group.even-5 li:first-child .button{border-left:0}.button-group.even-5 li button,.button-group.even-5 li .button{width:100%}.button-group.even-6 li{margin:0 -2px;display:inline-block;width:16.66667%}.button-group.even-6 li>button,.button-group.even-6 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-6 li:first-child button,.button-group.even-6 li:first-child .button{border-left:0}.button-group.even-6 li button,.button-group.even-6 li .button{width:100%}.button-group.even-7 li{margin:0 -2px;display:inline-block;width:14.28571%}.button-group.even-7 li>button,.button-group.even-7 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-7 li:first-child button,.button-group.even-7 li:first-child .button{border-left:0}.button-group.even-7 li button,.button-group.even-7 li .button{width:100%}.button-group.even-8 li{margin:0 -2px;display:inline-block;width:12.5%}.button-group.even-8 li>button,.button-group.even-8 li .button{border-left:1px solid;border-color:rgba(255,255,255,0.5)}.button-group.even-8 li:first-child button,.button-group.even-8 li:first-child .button{border-left:0}.button-group.even-8 li button,.button-group.even-8 li .button{width:100%}.button-bar:before,.button-bar:after{content:" ";display:table}.button-bar:after{clear:both}.button-bar .button-group{float:left;margin-right:0.625rem}.button-bar .button-group div{overflow:hidden}.panel{border-style:solid;border-width:1px;border-color:#d8d8d8;margin-bottom:1.25rem;padding:1.25rem;background:#f2f2f2;color:#333}.panel>:first-child{margin-top:0}.panel>:last-child{margin-bottom:0}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6,.panel p,.panel li,.panel dl{color:#333}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6{line-height:1;margin-bottom:0.625rem}.panel h1.subheader,.panel h2.subheader,.panel h3.subheader,.panel h4.subheader,.panel h5.subheader,.panel h6.subheader{line-height:1.4}.panel.callout{border-style:solid;border-width:1px;border-color:#b6edff;margin-bottom:1.25rem;padding:1.25rem;background:#ecfaff;color:#333}.panel.callout>:first-child{margin-top:0}.panel.callout>:last-child{margin-bottom:0}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6,.panel.callout p,.panel.callout li,.panel.callout dl{color:#333}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6{line-height:1;margin-bottom:0.625rem}.panel.callout h1.subheader,.panel.callout h2.subheader,.panel.callout h3.subheader,.panel.callout h4.subheader,.panel.callout h5.subheader,.panel.callout h6.subheader{line-height:1.4}.panel.callout a:not(.button){color:#008CBA}.panel.callout a:not(.button):hover,.panel.callout a:not(.button):focus{color:#0078a0}.panel.radius{border-radius:3px}.dropdown.button,button.dropdown{position:relative;outline:none;padding-right:3.5625rem}.dropdown.button::after,button.dropdown::after{position:absolute;content:"";width:0;height:0;display:block;border-style:solid;border-color:#fff transparent transparent transparent;top:50%}.dropdown.button::after,button.dropdown::after{border-width:0.375rem;right:1.40625rem;margin-top:-0.15625rem}.dropdown.button::after,button.dropdown::after{border-color:#fff transparent transparent transparent}.dropdown.button.tiny,button.dropdown.tiny{padding-right:2.625rem}.dropdown.button.tiny:after,button.dropdown.tiny:after{border-width:0.375rem;right:1.125rem;margin-top:-0.125rem}.dropdown.button.tiny::after,button.dropdown.tiny::after{border-color:#fff transparent transparent transparent}.dropdown.button.small,button.dropdown.small{padding-right:3.0625rem}.dropdown.button.small::after,button.dropdown.small::after{border-width:0.4375rem;right:1.3125rem;margin-top:-0.15625rem}.dropdown.button.small::after,button.dropdown.small::after{border-color:#fff transparent transparent transparent}.dropdown.button.large,button.dropdown.large{padding-right:3.625rem}.dropdown.button.large::after,button.dropdown.large::after{border-width:0.3125rem;right:1.71875rem;margin-top:-0.15625rem}.dropdown.button.large::after,button.dropdown.large::after{border-color:#fff transparent transparent transparent}.dropdown.button.secondary:after,button.dropdown.secondary:after{border-color:#333 transparent transparent transparent}.th{line-height:0;display:inline-block;border:solid 4px #fff;max-width:100%;box-shadow:0 0 0 1px rgba(0,0,0,0.2);transition:all 200ms ease-out}.th:hover,.th:focus{box-shadow:0 0 6px 1px rgba(0,140,186,0.5)}.th.radius{border-radius:3px}.toolbar{background:#333;width:100%;font-size:0;display:inline-block}.toolbar.label-bottom .tab .tab-content i,.toolbar.label-bottom .tab .tab-content img{margin-bottom:10px}.toolbar.label-right .tab .tab-content i,.toolbar.label-right .tab .tab-content img{margin-right:10px;display:inline-block}.toolbar.label-right .tab .tab-content label{display:inline-block}.toolbar.vertical.label-right .tab .tab-content{text-align:left}.toolbar.vertical{height:100%;width:auto}.toolbar.vertical .tab{width:auto;margin:auto;float:none}.toolbar .tab{text-align:center;width:25%;margin:0 auto;display:block;padding:20px;float:left}.toolbar .tab:hover{background:rgba(255,255,255,0.1)}.toolbar .tab-content{font-size:16px;text-align:center}.toolbar .tab-content label{color:#ccc}.toolbar .tab-content i{font-size:30px;display:block;margin:0 auto;color:#ccc;vertical-align:middle}.toolbar .tab-content img{width:30px;height:30px;display:block;margin:0 auto}.pricing-table{border:solid 1px #ddd;margin-left:0;margin-bottom:1.25rem}.pricing-table *{list-style:none;line-height:1}.pricing-table .title{background-color:#333;padding:0.9375rem 1.25rem;text-align:center;color:#eee;font-weight:normal;font-size:1rem;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif}.pricing-table .price{background-color:#F6F6F6;padding:0.9375rem 1.25rem;text-align:center;color:#333;font-weight:normal;font-size:2rem;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif}.pricing-table .description{background-color:#fff;padding:0.9375rem;text-align:center;color:#777;font-size:0.75rem;font-weight:normal;line-height:1.4;border-bottom:dotted 1px #ddd}.pricing-table .bullet-item{background-color:#fff;padding:0.9375rem;text-align:center;color:#333;font-size:0.875rem;font-weight:normal;border-bottom:dotted 1px #ddd}.pricing-table .cta-button{background-color:#fff;text-align:center;padding:1.25rem 1.25rem 0}@-webkit-keyframes rotate{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}@-moz-keyframes rotate{from{-moz-transform:rotate(0deg)}to{-moz-transform:rotate(360deg)}}@-o-keyframes rotate{from{-o-transform:rotate(0deg)}to{-o-transform:rotate(360deg)}}@keyframes rotate{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.slideshow-wrapper{position:relative}.slideshow-wrapper ul{list-style-type:none;margin:0}.slideshow-wrapper ul li,.slideshow-wrapper ul li .orbit-caption{display:none}.slideshow-wrapper ul li:first-child{display:block}.slideshow-wrapper .orbit-container{background-color:transparent}.slideshow-wrapper .orbit-container li{display:block}.slideshow-wrapper .orbit-container li .orbit-caption{display:block}.slideshow-wrapper .orbit-container .orbit-bullets li{display:inline-block}.slideshow-wrapper .preloader{display:block;width:40px;height:40px;position:absolute;top:50%;left:50%;margin-top:-20px;margin-left:-20px;border:solid 3px;border-color:#555 #fff;border-radius:1000px;animation-name:rotate;animation-duration:1.5s;animation-iteration-count:infinite;animation-timing-function:linear}.orbit-container{overflow:hidden;width:100%;position:relative;background:none}.orbit-container .orbit-slides-container{list-style:none;margin:0;padding:0;position:relative;-webkit-transform:translateZ(0)}.orbit-container .orbit-slides-container img{display:block;max-width:100%}.orbit-container .orbit-slides-container>*{position:absolute;top:0;width:100%;margin-left:100%}.orbit-container .orbit-slides-container>*:first-child{margin-left:0}.orbit-container .orbit-slides-container>* .orbit-caption{position:absolute;bottom:0;background-color:rgba(51,51,51,0.8);color:#fff;width:100%;padding:0.625rem 0.875rem;font-size:0.875rem}.orbit-container .orbit-slide-number{position:absolute;top:10px;left:10px;font-size:12px;color:#fff;background:transparent;z-index:10}.orbit-container .orbit-slide-number span{font-weight:700;padding:0.3125rem}.orbit-container .orbit-timer{position:absolute;top:12px;right:10px;height:6px;width:100px;z-index:10}.orbit-container .orbit-timer .orbit-progress{height:3px;background-color:rgba(255,255,255,0.3);display:block;width:0;position:relative;right:20px;top:5px}.orbit-container .orbit-timer>span{display:none;position:absolute;top:0;right:0;width:11px;height:14px;border:solid 4px #fff;border-top:none;border-bottom:none}.orbit-container .orbit-timer.paused>span{right:-4px;top:0;width:11px;height:14px;border:inset 8px;border-left-style:solid;border-color:transparent;border-left-color:#fff}.orbit-container .orbit-timer.paused>span.dark{border-left-color:#333}.orbit-container:hover .orbit-timer>span{display:block}.orbit-container .orbit-prev,.orbit-container .orbit-next{position:absolute;top:45%;margin-top:-25px;width:36px;height:60px;line-height:50px;color:white;background-color:transparent;text-indent:-9999px !important;z-index:10}.orbit-container .orbit-prev:hover,.orbit-container .orbit-next:hover{background-color:rgba(0,0,0,0.3)}.orbit-container .orbit-prev>span,.orbit-container .orbit-next>span{position:absolute;top:50%;margin-top:-10px;display:block;width:0;height:0;border:inset 10px}.orbit-container .orbit-prev{left:0}.orbit-container .orbit-prev>span{border-right-style:solid;border-color:transparent;border-right-color:#fff}.orbit-container .orbit-prev:hover>span{border-right-color:#fff}.orbit-container .orbit-next{right:0}.orbit-container .orbit-next>span{border-color:transparent;border-left-style:solid;border-left-color:#fff;left:50%;margin-left:-4px}.orbit-container .orbit-next:hover>span{border-left-color:#fff}.orbit-bullets-container{text-align:center}.orbit-bullets{margin:0 auto 30px auto;overflow:hidden;position:relative;top:10px;float:none;text-align:center;display:block}.orbit-bullets li{cursor:pointer;display:inline-block;width:0.5625rem;height:0.5625rem;background:#ccc;float:none;margin-right:6px;border-radius:1000px}.orbit-bullets li.active{background:#999}.orbit-bullets li:last-child{margin-right:0}.touch .orbit-container .orbit-prev,.touch .orbit-container .orbit-next{display:none}.touch .orbit-bullets{display:none}@media only screen and (min-width: 40.063em){.touch .orbit-container .orbit-prev,.touch .orbit-container .orbit-next{display:inherit}.touch .orbit-bullets{display:block}}@media only screen and (max-width: 40em){.orbit-stack-on-small .orbit-slides-container{height:auto !important}.orbit-stack-on-small .orbit-slides-container>*{position:relative;margin:0 !important;opacity:1 !important}.orbit-stack-on-small .orbit-slide-number{display:none}.orbit-timer{display:none}.orbit-next,.orbit-prev{display:none}.orbit-bullets{display:none}}[data-magellan-expedition],[data-magellan-expedition-clone]{background:#fff;z-index:50;min-width:100%;padding:10px}[data-magellan-expedition] .sub-nav,[data-magellan-expedition-clone] .sub-nav{margin-bottom:0}[data-magellan-expedition] .sub-nav dd,[data-magellan-expedition-clone] .sub-nav dd{margin-bottom:0}[data-magellan-expedition] .sub-nav a,[data-magellan-expedition-clone] .sub-nav a{line-height:1.8em}.icon-bar{width:100%;font-size:0;display:inline-block;background:#333}.icon-bar>*{text-align:center;font-size:1rem;width:25%;margin:0 auto;display:block;padding:1.25rem;float:left}.icon-bar>* i,.icon-bar>* img{display:block;margin:0 auto}.icon-bar>* i+label,.icon-bar>* img+label{margin-top:.0625rem}.icon-bar>* i{font-size:1.875rem;vertical-align:middle}.icon-bar>* img{width:1.875rem;height:1.875rem}.icon-bar.label-right>* i,.icon-bar.label-right>* img{margin:0 .0625rem 0 0;display:inline-block}.icon-bar.label-right>* i+label,.icon-bar.label-right>* img+label{margin-top:0}.icon-bar.label-right>* label{display:inline-block}.icon-bar.vertical.label-right>*{text-align:left}.icon-bar.vertical,.icon-bar.small-vertical{height:100%;width:auto}.icon-bar.vertical .item,.icon-bar.small-vertical .item{width:auto;margin:auto;float:none}@media only screen and (min-width: 40.063em){.icon-bar.medium-vertical{height:100%;width:auto}.icon-bar.medium-vertical .item{width:auto;margin:auto;float:none}}@media only screen and (min-width: 64.063em){.icon-bar.large-vertical{height:100%;width:auto}.icon-bar.large-vertical .item{width:auto;margin:auto;float:none}}.icon-bar>*{font-size:1rem;padding:1.25rem}.icon-bar>* i+label,.icon-bar>* img+label{margin-top:.0625rem}.icon-bar>* i{font-size:1.875rem}.icon-bar>* img{width:1.875rem;height:1.875rem}.icon-bar>* label{color:#fff}.icon-bar>* i{color:#fff}.icon-bar>a:hover{background:#008CBA}.icon-bar>a:hover label{color:#fff}.icon-bar>a:hover i{color:#fff}.icon-bar>a.active{background:#008CBA}.icon-bar>a.active label{color:#fff}.icon-bar>a.active i{color:#fff}.icon-bar.two-up .item{width:50%}.icon-bar.two-up.vertical .item,.icon-bar.two-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.063em){.icon-bar.two-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.063em){.icon-bar.two-up.large-vertical .item{width:auto}}.icon-bar.three-up .item{width:33.3333%}.icon-bar.three-up.vertical .item,.icon-bar.three-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.063em){.icon-bar.three-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.063em){.icon-bar.three-up.large-vertical .item{width:auto}}.icon-bar.four-up .item{width:25%}.icon-bar.four-up.vertical .item,.icon-bar.four-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.063em){.icon-bar.four-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.063em){.icon-bar.four-up.large-vertical .item{width:auto}}.icon-bar.five-up .item{width:20%}.icon-bar.five-up.vertical .item,.icon-bar.five-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.063em){.icon-bar.five-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.063em){.icon-bar.five-up.large-vertical .item{width:auto}}.icon-bar.six-up .item{width:16.66667%}.icon-bar.six-up.vertical .item,.icon-bar.six-up.small-vertical .item{width:auto}@media only screen and (min-width: 40.063em){.icon-bar.six-up.medium-vertical .item{width:auto}}@media only screen and (min-width: 64.063em){.icon-bar.six-up.large-vertical .item{width:auto}}.tabs{margin-bottom:0 !important;margin-left:0}.tabs:before,.tabs:after{content:" ";display:table}.tabs:after{clear:both}.tabs dd,.tabs .tab-title{position:relative;margin-bottom:0 !important;list-style:none;float:left}.tabs dd>a,.tabs .tab-title>a{outline:none;display:block;background-color:#EFEFEF;color:#222;padding:1rem 2rem;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:1rem}.tabs dd>a:hover,.tabs .tab-title>a:hover{background-color:#e1e1e1}.tabs dd.active a,.tabs .tab-title.active a{background-color:#fff;color:#222}.tabs.radius dd:first-child a,.tabs.radius .tab:first-child a{-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.tabs.radius dd:last-child a,.tabs.radius .tab:last-child a{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.tabs.vertical dd,.tabs.vertical .tab-title{position:inherit;float:none;display:block;top:auto}.tabs-content{margin-bottom:1.5rem;width:100%}.tabs-content:before,.tabs-content:after{content:" ";display:table}.tabs-content:after{clear:both}.tabs-content>.content{display:none;float:left;padding:0.9375rem 0;width:100%}.tabs-content>.content.active{display:block;float:none}.tabs-content>.content.contained{padding:0.9375rem}.tabs-content.vertical{display:block}.tabs-content.vertical>.content{padding:0 0.9375rem}@media only screen and (min-width: 40.063em){.tabs.vertical{width:20%;max-width:20%;float:left;margin:0 0 1.25rem}.tabs-content.vertical{width:80%;max-width:80%;float:left;margin-left:-1px;padding-left:1rem}}.no-js .tabs-content>.content{display:block;float:none}ul.pagination{display:block;min-height:1.5rem;margin-left:-0.3125rem}ul.pagination li{height:1.5rem;color:#222;font-size:0.875rem;margin-left:0.3125rem}ul.pagination li a,ul.pagination li button{display:block;padding:0.0625rem 0.625rem 0.0625rem;color:#999;background:none;border-radius:3px;font-weight:normal;font-size:1em;line-height:inherit;transition:background-color 300ms ease-out}ul.pagination li:hover a,ul.pagination li a:focus,ul.pagination li:hover button,ul.pagination li button:focus{background:#e6e6e6}ul.pagination li.unavailable a,ul.pagination li.unavailable button{cursor:default;color:#999}ul.pagination li.unavailable:hover a,ul.pagination li.unavailable a:focus,ul.pagination li.unavailable:hover button,ul.pagination li.unavailable button:focus{background:transparent}ul.pagination li.current a,ul.pagination li.current button{background:#008CBA;color:#fff;font-weight:bold;cursor:default}ul.pagination li.current a:hover,ul.pagination li.current a:focus,ul.pagination li.current button:hover,ul.pagination li.current button:focus{background:#008CBA}ul.pagination li{float:left;display:block}.pagination-centered{text-align:center}.pagination-centered ul.pagination li{float:none;display:inline-block}.side-nav{display:block;margin:0;padding:0.875rem 0;list-style-type:none;list-style-position:outside;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif}.side-nav li{margin:0 0 0.4375rem 0;font-size:0.875rem;font-weight:normal}.side-nav li a:not(.button){display:block;color:#008CBA;margin:0;padding:0.4375rem 0.875rem}.side-nav li a:not(.button):hover,.side-nav li a:not(.button):focus{background:rgba(0,0,0,0.025);color:#1cc7ff}.side-nav li.active>a:first-child:not(.button){color:#1cc7ff;font-weight:normal;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif}.side-nav li.divider{border-top:1px solid;height:0;padding:0;list-style:none;border-top-color:#fff}.side-nav li.heading{color:#008CBA;font-size:0.875rem;font-weight:bold;text-transform:uppercase}.accordion{margin-bottom:0}.accordion:before,.accordion:after{content:" ";display:table}.accordion:after{clear:both}.accordion .accordion-navigation,.accordion dd{display:block;margin-bottom:0 !important}.accordion .accordion-navigation.active>a,.accordion dd.active>a{background:#e8e8e8}.accordion .accordion-navigation>a,.accordion dd>a{background:#EFEFEF;color:#222;padding:1rem;display:block;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:1rem}.accordion .accordion-navigation>a:hover,.accordion dd>a:hover{background:#e3e3e3}.accordion .accordion-navigation>.content,.accordion dd>.content{display:none;padding:0.9375rem}.accordion .accordion-navigation>.content.active,.accordion dd>.content.active{display:block;background:#fff}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}@media only screen and (max-width: 40em){.small-only-text-left{text-align:left !important}.small-only-text-right{text-align:right !important}.small-only-text-center{text-align:center !important}.small-only-text-justify{text-align:justify !important}}@media only screen{.small-text-left{text-align:left !important}.small-text-right{text-align:right !important}.small-text-center{text-align:center !important}.small-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.063em) and (max-width: 64em){.medium-only-text-left{text-align:left !important}.medium-only-text-right{text-align:right !important}.medium-only-text-center{text-align:center !important}.medium-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.063em){.medium-text-left{text-align:left !important}.medium-text-right{text-align:right !important}.medium-text-center{text-align:center !important}.medium-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.063em) and (max-width: 90em){.large-only-text-left{text-align:left !important}.large-only-text-right{text-align:right !important}.large-only-text-center{text-align:center !important}.large-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.063em){.large-text-left{text-align:left !important}.large-text-right{text-align:right !important}.large-text-center{text-align:center !important}.large-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.063em) and (max-width: 120em){.xlarge-only-text-left{text-align:left !important}.xlarge-only-text-right{text-align:right !important}.xlarge-only-text-center{text-align:center !important}.xlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.063em){.xlarge-text-left{text-align:left !important}.xlarge-text-right{text-align:right !important}.xlarge-text-center{text-align:center !important}.xlarge-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.063em) and (max-width: 99999999em){.xxlarge-only-text-left{text-align:left !important}.xxlarge-only-text-right{text-align:right !important}.xxlarge-only-text-center{text-align:center !important}.xxlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.063em){.xxlarge-text-left{text-align:left !important}.xxlarge-text-right{text-align:right !important}.xxlarge-text-center{text-align:center !important}.xxlarge-text-justify{text-align:justify !important}}div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}a{color:#008CBA;text-decoration:none;line-height:inherit}a:hover,a:focus{color:#0078a0}a img{border:none}p{font-family:inherit;font-weight:normal;font-size:1rem;line-height:1.6;margin-bottom:1.25rem;text-rendering:optimizeLegibility}p.lead{font-size:1.21875rem;line-height:1.6}p aside{font-size:0.875rem;line-height:1.35;font-style:italic}h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;font-style:normal;color:#222;text-rendering:optimizeLegibility;margin-top:0.2rem;margin-bottom:0.5rem;line-height:1.4}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-size:60%;color:#6f6f6f;line-height:0}h1{font-size:2.125rem}h2{font-size:1.6875rem}h3{font-size:1.375rem}h4{font-size:1.125rem}h5{font-size:1.125rem}h6{font-size:1rem}.subheader{line-height:1.4;color:#6f6f6f;font-weight:normal;margin-top:0.2rem;margin-bottom:0.5rem}hr{border:solid #ddd;border-width:1px 0 0;clear:both;margin:1.25rem 0 1.1875rem;height:0}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:bold;line-height:inherit}small{font-size:60%;line-height:inherit}code{font-family:Consolas,"Liberation Mono",Courier,monospace;font-weight:normal;color:#333;background-color:#f8f8f8;border-width:1px;border-style:solid;border-color:#dfdfdf;padding:0.125rem 0.3125rem 0.0625rem}ul,ol,dl{font-size:1rem;line-height:1.6;margin-bottom:1.25rem;list-style-position:outside;font-family:inherit}ul{margin-left:1.1rem}ul.no-bullet{margin-left:0}ul.no-bullet li ul,ul.no-bullet li ol{margin-left:1.25rem;margin-bottom:0;list-style:none}ul li ul,ul li ol{margin-left:1.25rem;margin-bottom:0}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square;margin-left:1.1rem}ul.circle{list-style-type:circle;margin-left:1.1rem}ul.disc{list-style-type:disc;margin-left:1.1rem}ul.no-bullet{list-style:none}ol{margin-left:1.4rem}ol li ul,ol li ol{margin-left:1.25rem;margin-bottom:0}dl dt{margin-bottom:0.3rem;font-weight:bold}dl dd{margin-bottom:0.75rem}abbr,acronym{text-transform:uppercase;font-size:90%;color:#222;cursor:help}abbr{text-transform:none}abbr[title]{border-bottom:1px dotted #ddd}blockquote{margin:0 0 1.25rem;padding:0.5625rem 1.25rem 0 1.1875rem;border-left:1px solid #ddd}blockquote cite{display:block;font-size:0.8125rem;color:#555}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:#555}blockquote,blockquote p{line-height:1.6;color:#6f6f6f}.vcard{display:inline-block;margin:0 0 1.25rem 0;border:1px solid #ddd;padding:0.625rem 0.75rem}.vcard li{margin:0;display:block}.vcard .fn{font-weight:bold;font-size:0.9375rem}.vevent .summary{font-weight:bold}.vevent abbr{cursor:default;text-decoration:none;font-weight:bold;border:none;padding:0 0.0625rem}@media only screen and (min-width: 40.063em){h1,h2,h3,h4,h5,h6{line-height:1.4}h1{font-size:2.75rem}h2{font-size:2.3125rem}h3{font-size:1.6875rem}h4{font-size:1.4375rem}h5{font-size:1.125rem}h6{font-size:1rem}}.print-only{display:none !important}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.hide-on-print{display:none !important}.print-only{display:block !important}.hide-for-print{display:none !important}.show-for-print{display:inherit !important}}.split.button{position:relative;padding-right:5.0625rem}.split.button span{display:block;height:100%;position:absolute;right:0;top:0;border-left:solid 1px}.split.button span:after{position:absolute;content:"";width:0;height:0;display:block;border-style:inset;top:50%;left:50%}.split.button span:active{background-color:rgba(0,0,0,0.1)}.split.button span{border-left-color:rgba(255,255,255,0.5)}.split.button span{width:3.09375rem}.split.button span:after{border-top-style:solid;border-width:0.375rem;top:48%;margin-left:-0.375rem}.split.button span:after{border-color:#fff transparent transparent transparent}.split.button.secondary span{border-left-color:rgba(255,255,255,0.5)}.split.button.secondary span:after{border-color:#fff transparent transparent transparent}.split.button.alert span{border-left-color:rgba(255,255,255,0.5)}.split.button.success span{border-left-color:rgba(255,255,255,0.5)}.split.button.tiny{padding-right:3.75rem}.split.button.tiny span{width:2.25rem}.split.button.tiny span:after{border-top-style:solid;border-width:0.375rem;top:48%;margin-left:-0.375rem}.split.button.small{padding-right:4.375rem}.split.button.small span{width:2.625rem}.split.button.small span:after{border-top-style:solid;border-width:0.4375rem;top:48%;margin-left:-0.375rem}.split.button.large{padding-right:5.5rem}.split.button.large span{width:3.4375rem}.split.button.large span:after{border-top-style:solid;border-width:0.3125rem;top:48%;margin-left:-0.375rem}.split.button.expand{padding-left:2rem}.split.button.secondary span:after{border-color:#333 transparent transparent transparent}.split.button.radius span{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.split.button.round span{-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}.reveal-modal-bg{position:absolute;top:0;bottom:0;left:0;right:0;background:#000;background:rgba(0,0,0,0.45);z-index:1004;display:none;left:0}.reveal-modal,dialog{visibility:hidden;display:none;position:absolute;z-index:1005;width:100vw;top:0;border-radius:3px;left:0;background-color:#fff;padding:1.25rem;border:solid 1px #666;box-shadow:0 0 10px rgba(0,0,0,0.4);padding:1.875rem}@media only screen and (max-width: 40em){.reveal-modal,dialog{min-height:100vh}}.reveal-modal .column,dialog .column,.reveal-modal .columns,dialog .columns{min-width:0}.reveal-modal>:first-child,dialog>:first-child{margin-top:0}.reveal-modal>:last-child,dialog>:last-child{margin-bottom:0}@media only screen and (min-width: 40.063em){.reveal-modal,dialog{width:80%;max-width:62.5rem;left:0;right:0;margin:0 auto}}@media only screen and (min-width: 40.063em){.reveal-modal,dialog{top:6.25rem}}.reveal-modal.radius,dialog.radius{border-radius:3px}.reveal-modal.round,dialog.round{border-radius:1000px}.reveal-modal.collapse,dialog.collapse{padding:0}@media only screen and (min-width: 40.063em){.reveal-modal.tiny,dialog.tiny{width:30%;max-width:62.5rem;left:0;right:0;margin:0 auto}}@media only screen and (min-width: 40.063em){.reveal-modal.small,dialog.small{width:40%;max-width:62.5rem;left:0;right:0;margin:0 auto}}@media only screen and (min-width: 40.063em){.reveal-modal.medium,dialog.medium{width:60%;max-width:62.5rem;left:0;right:0;margin:0 auto}}@media only screen and (min-width: 40.063em){.reveal-modal.large,dialog.large{width:70%;max-width:62.5rem;left:0;right:0;margin:0 auto}}@media only screen and (min-width: 40.063em){.reveal-modal.xlarge,dialog.xlarge{width:95%;max-width:62.5rem;left:0;right:0;margin:0 auto}}.reveal-modal.full,dialog.full{top:0;left:0;height:100%;height:100vh;min-height:100vh;max-width:none !important;margin-left:0 !important}@media only screen and (min-width: 40.063em){.reveal-modal.full,dialog.full{width:100vw;max-width:62.5rem;left:0;right:0;margin:0 auto}}.reveal-modal .close-reveal-modal,dialog .close-reveal-modal{font-size:2.5rem;line-height:1;position:absolute;top:0.625rem;right:1.375rem;color:#aaa;font-weight:bold;cursor:pointer}dialog{display:none}dialog::backdrop,dialog+.backdrop{position:absolute;top:0;bottom:0;left:0;right:0;background:#000;background:rgba(0,0,0,0.45);z-index:auto;display:none;left:0}dialog[open]{display:block}@media print{dialog,.reveal-modal,dialog{display:none;background:#fff !important}}.has-tip{border-bottom:dotted 1px #ccc;cursor:help;font-weight:bold;color:#333}.has-tip:hover,.has-tip:focus{border-bottom:dotted 1px #003f54;color:#008CBA}.has-tip.tip-left,.has-tip.tip-right{float:none !important}.tooltip{display:none;position:absolute;z-index:1006;font-weight:normal;font-size:0.875rem;line-height:1.3;padding:0.75rem;max-width:300px;left:50%;width:100%;color:#fff;background:#333}.tooltip>.nub{display:block;left:5px;position:absolute;width:0;height:0;border:solid 5px;border-color:transparent transparent #333 transparent;top:-10px;pointer-events:none}.tooltip>.nub.rtl{left:auto;right:5px}.tooltip.radius{border-radius:3px}.tooltip.round{border-radius:1000px}.tooltip.round>.nub{left:2rem}.tooltip.opened{color:#008CBA !important;border-bottom:dotted 1px #003f54 !important}.tap-to-close{display:block;font-size:0.625rem;color:#777;font-weight:normal}@media only screen and (min-width: 40.063em){.tooltip>.nub{border-color:transparent transparent #333 transparent;top:-10px}.tooltip.tip-top>.nub{border-color:#333 transparent transparent transparent;top:auto;bottom:-10px}.tooltip.tip-left,.tooltip.tip-right{float:none !important}.tooltip.tip-left>.nub{border-color:transparent transparent transparent #333;right:-10px;left:auto;top:50%;margin-top:-5px}.tooltip.tip-right>.nub{border-color:transparent #333 transparent transparent;right:auto;left:-10px;top:50%;margin-top:-5px}}.clearing-thumbs,[data-clearing]{margin-bottom:0;margin-left:0;list-style:none}.clearing-thumbs:before,.clearing-thumbs:after,[data-clearing]:before,[data-clearing]:after{content:" ";display:table}.clearing-thumbs:after,[data-clearing]:after{clear:both}.clearing-thumbs li,[data-clearing] li{float:left;margin-right:10px}.clearing-thumbs[class*="block-grid-"] li,[data-clearing][class*="block-grid-"] li{margin-right:0}.clearing-blackout{background:#333;position:fixed;width:100%;height:100%;top:0;left:0;z-index:998}.clearing-blackout .clearing-close{display:block}.clearing-container{position:relative;z-index:998;height:100%;overflow:hidden;margin:0}.clearing-touch-label{position:absolute;top:50%;left:50%;color:#aaa;font-size:0.6em}.visible-img{height:95%;position:relative}.visible-img img{position:absolute;left:50%;top:50%;margin-left:-50%;max-height:100%;max-width:100%}.clearing-caption{color:#ccc;font-size:0.875em;line-height:1.3;margin-bottom:0;text-align:center;bottom:0;background:#333;width:100%;padding:10px 30px 20px;position:absolute;left:0}.clearing-close{z-index:999;padding-left:20px;padding-top:10px;font-size:30px;line-height:1;color:#ccc;display:none}.clearing-close:hover,.clearing-close:focus{color:#ccc}.clearing-assembled .clearing-container{height:100%}.clearing-assembled .clearing-container .carousel>ul{display:none}.clearing-feature li{display:none}.clearing-feature li.clearing-featured-img{display:block}@media only screen and (min-width: 40.063em){.clearing-main-prev,.clearing-main-next{position:absolute;height:100%;width:40px;top:0}.clearing-main-prev>span,.clearing-main-next>span{position:absolute;top:50%;display:block;width:0;height:0;border:solid 12px}.clearing-main-prev>span:hover,.clearing-main-next>span:hover{opacity:0.8}.clearing-main-prev{left:0}.clearing-main-prev>span{left:5px;border-color:transparent;border-right-color:#ccc}.clearing-main-next{right:0}.clearing-main-next>span{border-color:transparent;border-left-color:#ccc}.clearing-main-prev.disabled,.clearing-main-next.disabled{opacity:0.3}.clearing-assembled .clearing-container .carousel{background:rgba(51,51,51,0.8);height:120px;margin-top:10px;text-align:center}.clearing-assembled .clearing-container .carousel>ul{display:inline-block;z-index:999;height:100%;position:relative;float:none}.clearing-assembled .clearing-container .carousel>ul li{display:block;width:120px;min-height:inherit;float:left;overflow:hidden;margin-right:0;padding:0;position:relative;cursor:pointer;opacity:0.4;clear:none}.clearing-assembled .clearing-container .carousel>ul li.fix-height img{height:100%;max-width:none}.clearing-assembled .clearing-container .carousel>ul li a.th{border:none;box-shadow:none;display:block}.clearing-assembled .clearing-container .carousel>ul li img{cursor:pointer !important;width:100% !important}.clearing-assembled .clearing-container .carousel>ul li.visible{opacity:1}.clearing-assembled .clearing-container .carousel>ul li:hover{opacity:0.8}.clearing-assembled .clearing-container .visible-img{background:#333;overflow:hidden;height:85%}.clearing-close{position:absolute;top:10px;right:20px;padding-left:0;padding-top:0}}.progress{background-color:#F6F6F6;height:1.5625rem;border:1px solid #fff;padding:0.125rem;margin-bottom:0.625rem}.progress .meter{background:#008CBA;height:100%;display:block}.progress.secondary .meter{background:#e7e7e7;height:100%;display:block}.progress.success .meter{background:#43AC6A;height:100%;display:block}.progress.alert .meter{background:#f04124;height:100%;display:block}.progress.radius{border-radius:3px}.progress.radius .meter{border-radius:2px}.progress.round{border-radius:1000px}.progress.round .meter{border-radius:999px}.sub-nav{display:block;width:auto;overflow:hidden;margin:-0.25rem 0 1.125rem;padding-top:0.25rem}.sub-nav dt{text-transform:uppercase}.sub-nav dt,.sub-nav dd,.sub-nav li{float:left;display:inline;margin-left:1rem;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;font-size:0.875rem;color:#999}.sub-nav dt a,.sub-nav dd a,.sub-nav li a{text-decoration:none;color:#999;padding:0.1875rem 1rem}.sub-nav dt a:hover,.sub-nav dd a:hover,.sub-nav li a:hover{color:#737373}.sub-nav dt.active a,.sub-nav dd.active a,.sub-nav li.active a{border-radius:3px;font-weight:normal;background:#008CBA;padding:0.1875rem 1rem;cursor:default;color:#fff}.sub-nav dt.active a:hover,.sub-nav dd.active a:hover,.sub-nav li.active a:hover{background:#0078a0}.joyride-list{display:none}.joyride-tip-guide{display:none;position:absolute;background:#333;color:#fff;z-index:101;top:0;left:2.5%;font-family:inherit;font-weight:normal;width:95%}.lt-ie9 .joyride-tip-guide{max-width:800px;left:50%;margin-left:-400px}.joyride-content-wrapper{width:100%;padding:1.125rem 1.25rem 1.5rem}.joyride-content-wrapper .button{margin-bottom:0 !important}.joyride-content-wrapper .joyride-prev-tip{margin-right:10px}.joyride-tip-guide .joyride-nub{display:block;position:absolute;left:22px;width:0;height:0;border:10px solid #333}.joyride-tip-guide .joyride-nub.top{border-top-style:solid;border-color:#333;border-top-color:transparent !important;border-left-color:transparent !important;border-right-color:transparent !important;top:-20px}.joyride-tip-guide .joyride-nub.bottom{border-bottom-style:solid;border-color:#333 !important;border-bottom-color:transparent !important;border-left-color:transparent !important;border-right-color:transparent !important;bottom:-20px}.joyride-tip-guide .joyride-nub.right{right:-20px}.joyride-tip-guide .joyride-nub.left{left:-20px}.joyride-tip-guide h1,.joyride-tip-guide h2,.joyride-tip-guide h3,.joyride-tip-guide h4,.joyride-tip-guide h5,.joyride-tip-guide h6{line-height:1.25;margin:0;font-weight:bold;color:#fff}.joyride-tip-guide p{margin:0 0 1.125rem 0;font-size:0.875rem;line-height:1.3}.joyride-timer-indicator-wrap{width:50px;height:3px;border:solid 1px #555;position:absolute;right:1.0625rem;bottom:1rem}.joyride-timer-indicator{display:block;width:0;height:inherit;background:#666}.joyride-close-tip{position:absolute;right:12px;top:10px;color:#777 !important;text-decoration:none;font-size:24px;font-weight:normal;line-height:.5 !important}.joyride-close-tip:hover,.joyride-close-tip:focus{color:#eee !important}.joyride-modal-bg{position:fixed;height:100%;width:100%;background:transparent;background:rgba(0,0,0,0.5);z-index:100;display:none;top:0;left:0;cursor:pointer}.joyride-expose-wrapper{background-color:#fff;position:absolute;border-radius:3px;z-index:102;box-shadow:0 0 15px #fff}.joyride-expose-cover{background:transparent;border-radius:3px;position:absolute;z-index:9999;top:0;left:0}@media only screen and (min-width: 40.063em){.joyride-tip-guide{width:300px;left:inherit}.joyride-tip-guide .joyride-nub.bottom{border-color:#333 !important;border-bottom-color:transparent !important;border-left-color:transparent !important;border-right-color:transparent !important;bottom:-20px}.joyride-tip-guide .joyride-nub.right{border-color:#333 !important;border-top-color:transparent !important;border-right-color:transparent !important;border-bottom-color:transparent !important;top:22px;left:auto;right:-20px}.joyride-tip-guide .joyride-nub.left{border-color:#333 !important;border-top-color:transparent !important;border-left-color:transparent !important;border-bottom-color:transparent !important;top:22px;left:-20px;right:auto}}.label{font-weight:normal;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;text-align:center;text-decoration:none;line-height:1;white-space:nowrap;display:inline-block;position:relative;margin-bottom:auto;padding:0.25rem 0.5rem 0.25rem;font-size:0.6875rem;background-color:#008CBA;color:#fff}.label.radius{border-radius:3px}.label.round{border-radius:1000px}.label.alert{background-color:#f04124;color:#fff}.label.warning{background-color:#f08a24;color:#fff}.label.success{background-color:#43AC6A;color:#fff}.label.secondary{background-color:#e7e7e7;color:#333}.label.info{background-color:#a0d3e8;color:#333}.off-canvas-wrap{-webkit-backface-visibility:hidden;position:relative;width:100%;overflow:hidden}.off-canvas-wrap.move-right,.off-canvas-wrap.move-left{min-height:100%;-webkit-overflow-scrolling:touch}.inner-wrap{position:relative;width:100%;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.inner-wrap:before,.inner-wrap:after{content:" ";display:table}.inner-wrap:after{clear:both}.tab-bar{-webkit-backface-visibility:hidden;background:#333;color:#fff;height:2.8125rem;line-height:2.8125rem;position:relative}.tab-bar h1,.tab-bar h2,.tab-bar h3,.tab-bar h4,.tab-bar h5,.tab-bar h6{color:#fff;font-weight:bold;line-height:2.8125rem;margin:0}.tab-bar h1,.tab-bar h2,.tab-bar h3,.tab-bar h4{font-size:1.125rem}.left-small{width:2.8125rem;height:2.8125rem;position:absolute;top:0;border-right:solid 1px #1a1a1a;left:0}.right-small{width:2.8125rem;height:2.8125rem;position:absolute;top:0;border-left:solid 1px #1a1a1a;right:0}.tab-bar-section{padding:0 0.625rem;position:absolute;text-align:center;height:2.8125rem;top:0}@media only screen and (min-width: 40.063em){.tab-bar-section.left{text-align:left}.tab-bar-section.right{text-align:right}}.tab-bar-section.left{left:0;right:2.8125rem}.tab-bar-section.right{left:2.8125rem;right:0}.tab-bar-section.middle{left:2.8125rem;right:2.8125rem}.tab-bar .menu-icon{text-indent:2.1875rem;width:2.8125rem;height:2.8125rem;display:block;padding:0;color:#fff;position:relative;transform:translate3d(0, 0, 0)}.tab-bar .menu-icon span::after{content:"";position:absolute;display:block;height:0;top:50%;margin-top:-0.5rem;left:0.90625rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:1rem}.tab-bar .menu-icon span:hover:after{box-shadow:0 0 0 1px #b3b3b3,0 7px 0 1px #b3b3b3,0 14px 0 1px #b3b3b3}.left-off-canvas-menu{-webkit-backface-visibility:hidden;width:15.625rem;top:0;bottom:0;position:absolute;overflow-x:hidden;overflow-y:auto;background:#333;z-index:1001;box-sizing:content-box;transition:transform 500ms ease 0s;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;-ms-transform:translate(-100%, 0);-webkit-transform:translate3d(-100%, 0, 0);-moz-transform:translate3d(-100%, 0, 0);-ms-transform:translate3d(-100%, 0, 0);-o-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.left-off-canvas-menu *{-webkit-backface-visibility:hidden}.right-off-canvas-menu{-webkit-backface-visibility:hidden;width:15.625rem;top:0;bottom:0;position:absolute;overflow-x:hidden;overflow-y:auto;background:#333;z-index:1001;box-sizing:content-box;transition:transform 500ms ease 0s;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;-ms-transform:translate(100%, 0);-webkit-transform:translate3d(100%, 0, 0);-moz-transform:translate3d(100%, 0, 0);-ms-transform:translate3d(100%, 0, 0);-o-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);right:0}.right-off-canvas-menu *{-webkit-backface-visibility:hidden}ul.off-canvas-list{list-style-type:none;padding:0;margin:0}ul.off-canvas-list li label{display:block;padding:0.3rem 0.9375rem;color:#999;text-transform:uppercase;font-size:0.75rem;font-weight:bold;background:#444;border-top:1px solid #5e5e5e;border-bottom:none;margin:0}ul.off-canvas-list li a{display:block;padding:0.66667rem;color:rgba(255,255,255,0.7);border-bottom:1px solid #262626;transition:background 300ms ease}ul.off-canvas-list li a:hover{background:#242424}.move-right>.inner-wrap{-ms-transform:translate(15.625rem, 0);-webkit-transform:translate3d(15.625rem, 0, 0);-moz-transform:translate3d(15.625rem, 0, 0);-ms-transform:translate3d(15.625rem, 0, 0);-o-transform:translate3d(15.625rem, 0, 0);transform:translate3d(15.625rem, 0, 0)}.move-right .exit-off-canvas{-webkit-backface-visibility:hidden;transition:background 300ms ease;cursor:pointer;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);display:block;position:absolute;background:rgba(255,255,255,0.2);top:0;bottom:0;left:0;right:0;z-index:1002;-webkit-tap-highlight-color:transparent}@media only screen and (min-width: 40.063em){.move-right .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.move-left>.inner-wrap{-ms-transform:translate(-15.625rem, 0);-webkit-transform:translate3d(-15.625rem, 0, 0);-moz-transform:translate3d(-15.625rem, 0, 0);-ms-transform:translate3d(-15.625rem, 0, 0);-o-transform:translate3d(-15.625rem, 0, 0);transform:translate3d(-15.625rem, 0, 0)}.move-left .exit-off-canvas{-webkit-backface-visibility:hidden;transition:background 300ms ease;cursor:pointer;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);display:block;position:absolute;background:rgba(255,255,255,0.2);top:0;bottom:0;left:0;right:0;z-index:1002;-webkit-tap-highlight-color:transparent}@media only screen and (min-width: 40.063em){.move-left .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.offcanvas-overlap .left-off-canvas-menu,.offcanvas-overlap .right-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap .exit-off-canvas{-webkit-backface-visibility:hidden;transition:background 300ms ease;cursor:pointer;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);display:block;position:absolute;background:rgba(255,255,255,0.2);top:0;bottom:0;left:0;right:0;z-index:1002;-webkit-tap-highlight-color:transparent}@media only screen and (min-width: 40.063em){.offcanvas-overlap .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.offcanvas-overlap-left .right-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-left .exit-off-canvas{-webkit-backface-visibility:hidden;transition:background 300ms ease;cursor:pointer;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);display:block;position:absolute;background:rgba(255,255,255,0.2);top:0;bottom:0;left:0;right:0;z-index:1002;-webkit-tap-highlight-color:transparent}@media only screen and (min-width: 40.063em){.offcanvas-overlap-left .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.offcanvas-overlap-right .left-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-right .exit-off-canvas{-webkit-backface-visibility:hidden;transition:background 300ms ease;cursor:pointer;box-shadow:-4px 0 4px rgba(0,0,0,0.5),4px 0 4px rgba(0,0,0,0.5);display:block;position:absolute;background:rgba(255,255,255,0.2);top:0;bottom:0;left:0;right:0;z-index:1002;-webkit-tap-highlight-color:transparent}@media only screen and (min-width: 40.063em){.offcanvas-overlap-right .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}}.no-csstransforms .left-off-canvas-menu{left:-15.625rem}.no-csstransforms .right-off-canvas-menu{right:-15.625rem}.no-csstransforms .move-left>.inner-wrap{right:15.625rem}.no-csstransforms .move-right>.inner-wrap{left:15.625rem}.left-submenu{-webkit-backface-visibility:hidden;width:15.625rem;top:0;bottom:0;position:absolute;margin:0;overflow-x:hidden;overflow-y:auto;background:#333;z-index:1002;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-transform:translate(-100%, 0);-webkit-transform:translate3d(-100%, 0, 0);-moz-transform:translate3d(-100%, 0, 0);-ms-transform:translate3d(-100%, 0, 0);-o-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.left-submenu *{-webkit-backface-visibility:hidden}.left-submenu .back>a{padding:0.3rem 0.9375rem;color:#999;text-transform:uppercase;font-weight:bold;background:#444;border-top:1px solid #5e5e5e;border-bottom:none;margin:0}.left-submenu .back>a:hover{background:#303030;border-top:1px solid #5e5e5e;border-bottom:none}.left-submenu .back>a:before{content:"\AB";margin-right:0.5rem;display:inline}.left-submenu.move-right,.left-submenu.offcanvas-overlap-right,.left-submenu.offcanvas-overlap{-ms-transform:translate(0%, 0);-webkit-transform:translate3d(0%, 0, 0);-moz-transform:translate3d(0%, 0, 0);-ms-transform:translate3d(0%, 0, 0);-o-transform:translate3d(0%, 0, 0);transform:translate3d(0%, 0, 0)}.right-submenu{-webkit-backface-visibility:hidden;width:15.625rem;top:0;bottom:0;position:absolute;margin:0;overflow-x:hidden;overflow-y:auto;background:#333;z-index:1002;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-transform:translate(100%, 0);-webkit-transform:translate3d(100%, 0, 0);-moz-transform:translate3d(100%, 0, 0);-ms-transform:translate3d(100%, 0, 0);-o-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);right:0;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.right-submenu *{-webkit-backface-visibility:hidden}.right-submenu .back>a{padding:0.3rem 0.9375rem;color:#999;text-transform:uppercase;font-weight:bold;background:#444;border-top:1px solid #5e5e5e;border-bottom:none;margin:0}.right-submenu .back>a:hover{background:#303030;border-top:1px solid #5e5e5e;border-bottom:none}.right-submenu .back>a:after{content:"\BB";margin-left:0.5rem;display:inline}.right-submenu.move-left,.right-submenu.offcanvas-overlap-left,.right-submenu.offcanvas-overlap{-ms-transform:translate(0%, 0);-webkit-transform:translate3d(0%, 0, 0);-moz-transform:translate3d(0%, 0, 0);-ms-transform:translate3d(0%, 0, 0);-o-transform:translate3d(0%, 0, 0);transform:translate3d(0%, 0, 0)}.left-off-canvas-menu ul.off-canvas-list li.has-submenu>a:after{content:"\BB";margin-left:0.5rem;display:inline}.right-off-canvas-menu ul.off-canvas-list li.has-submenu>a:before{content:"\AB";margin-right:0.5rem;display:inline}.f-dropdown{position:absolute;left:-9999px;list-style:none;margin-left:0;outline:none;width:100%;max-height:none;height:auto;background:#fff;border:solid 1px #ccc;font-size:0.875rem;z-index:89;margin-top:2px;max-width:200px}.f-dropdown>*:first-child{margin-top:0}.f-dropdown>*:last-child{margin-bottom:0}.f-dropdown:before{content:"";display:block;width:0;height:0;border:inset 6px;border-color:transparent transparent #fff transparent;border-bottom-style:solid;position:absolute;top:-12px;left:10px;z-index:89}.f-dropdown:after{content:"";display:block;width:0;height:0;border:inset 7px;border-color:transparent transparent #ccc transparent;border-bottom-style:solid;position:absolute;top:-14px;left:9px;z-index:88}.f-dropdown.right:before{left:auto;right:10px}.f-dropdown.right:after{left:auto;right:9px}.f-dropdown.drop-right{position:absolute;left:-9999px;list-style:none;margin-left:0;outline:none;width:100%;max-height:none;height:auto;background:#fff;border:solid 1px #ccc;font-size:0.875rem;z-index:89;margin-top:0;margin-left:2px;max-width:200px}.f-dropdown.drop-right>*:first-child{margin-top:0}.f-dropdown.drop-right>*:last-child{margin-bottom:0}.f-dropdown.drop-right:before{content:"";display:block;width:0;height:0;border:inset 6px;border-color:transparent #fff transparent transparent;border-right-style:solid;position:absolute;top:10px;left:-12px;z-index:89}.f-dropdown.drop-right:after{content:"";display:block;width:0;height:0;border:inset 7px;border-color:transparent #ccc transparent transparent;border-right-style:solid;position:absolute;top:9px;left:-14px;z-index:88}.f-dropdown.drop-left{position:absolute;left:-9999px;list-style:none;margin-left:0;outline:none;width:100%;max-height:none;height:auto;background:#fff;border:solid 1px #ccc;font-size:0.875rem;z-index:89;margin-top:0;margin-left:-2px;max-width:200px}.f-dropdown.drop-left>*:first-child{margin-top:0}.f-dropdown.drop-left>*:last-child{margin-bottom:0}.f-dropdown.drop-left:before{content:"";display:block;width:0;height:0;border:inset 6px;border-color:transparent transparent transparent #fff;border-left-style:solid;position:absolute;top:10px;right:-12px;left:auto;z-index:89}.f-dropdown.drop-left:after{content:"";display:block;width:0;height:0;border:inset 7px;border-color:transparent transparent transparent #ccc;border-left-style:solid;position:absolute;top:9px;right:-14px;left:auto;z-index:88}.f-dropdown.drop-top{position:absolute;left:-9999px;list-style:none;margin-left:0;outline:none;width:100%;max-height:none;height:auto;background:#fff;border:solid 1px #ccc;font-size:0.875rem;z-index:89;margin-top:-2px;margin-left:0;max-width:200px}.f-dropdown.drop-top>*:first-child{margin-top:0}.f-dropdown.drop-top>*:last-child{margin-bottom:0}.f-dropdown.drop-top:before{content:"";display:block;width:0;height:0;border:inset 6px;border-color:#fff transparent transparent transparent;border-top-style:solid;position:absolute;top:auto;bottom:-12px;left:10px;right:auto;z-index:89}.f-dropdown.drop-top:after{content:"";display:block;width:0;height:0;border:inset 7px;border-color:#ccc transparent transparent transparent;border-top-style:solid;position:absolute;top:auto;bottom:-14px;left:9px;right:auto;z-index:88}.f-dropdown li{font-size:0.875rem;cursor:pointer;line-height:1.125rem;margin:0}.f-dropdown li:hover,.f-dropdown li:focus{background:#eee}.f-dropdown li.radius{border-radius:3px}.f-dropdown li a{display:block;padding:0.5rem;color:#555}.f-dropdown.content{position:absolute;left:-9999px;list-style:none;margin-left:0;outline:none;padding:1.25rem;width:100%;height:auto;max-height:none;background:#fff;border:solid 1px #ccc;font-size:0.875rem;z-index:89;max-width:200px}.f-dropdown.content>*:first-child{margin-top:0}.f-dropdown.content>*:last-child{margin-bottom:0}.f-dropdown.tiny{max-width:200px}.f-dropdown.small{max-width:300px}.f-dropdown.medium{max-width:500px}.f-dropdown.large{max-width:800px}.f-dropdown.mega{width:100% !important;max-width:100% !important}.f-dropdown.mega.open{left:0 !important}table{background:#fff;margin-bottom:1.25rem;border:solid 1px #ddd;table-layout:auto}table caption{background:transparent;color:#222;font-size:1rem;font-weight:bold}table thead{background:#F5F5F5}table thead tr th,table thead tr td{padding:0.5rem 0.625rem 0.625rem;font-size:0.875rem;font-weight:bold;color:#222}table tfoot{background:#F5F5F5}table tfoot tr th,table tfoot tr td{padding:0.5rem 0.625rem 0.625rem;font-size:0.875rem;font-weight:bold;color:#222}table tr th,table tr td{padding:0.5625rem 0.625rem;font-size:0.875rem;color:#222;text-align:left}table tr.even,table tr.alt,table tr:nth-of-type(even){background:#F9F9F9}table thead tr th,table tfoot tr th,table tfoot tr td,table tbody tr th,table tbody tr td,table tr td{display:table-cell;line-height:1.125rem}.range-slider{display:block;position:relative;width:100%;height:1rem;border:1px solid #ddd;margin:1.25rem 0;-ms-touch-action:none;touch-action:none;background:#FAFAFA}.range-slider.vertical-range{display:block;position:relative;width:100%;height:1rem;border:1px solid #ddd;margin:1.25rem 0;-ms-touch-action:none;touch-action:none;display:inline-block;width:1rem;height:12.5rem}.range-slider.vertical-range .range-slider-handle{margin-top:0;margin-left:-0.5rem;position:absolute;bottom:-10.5rem}.range-slider.vertical-range .range-slider-active-segment{width:0.875rem;height:auto;bottom:0}.range-slider.radius{background:#FAFAFA;border-radius:3px}.range-slider.radius .range-slider-handle{background:#008CBA;border-radius:3px}.range-slider.radius .range-slider-handle:hover{background:#007ba4}.range-slider.round{background:#FAFAFA;border-radius:1000px}.range-slider.round .range-slider-handle{background:#008CBA;border-radius:1000px}.range-slider.round .range-slider-handle:hover{background:#007ba4}.range-slider.disabled,.range-slider[disabled]{background:#FAFAFA;cursor:default;opacity:0.7}.range-slider.disabled .range-slider-handle,.range-slider[disabled] .range-slider-handle{background:#008CBA;cursor:default;opacity:0.7}.range-slider.disabled .range-slider-handle:hover,.range-slider[disabled] .range-slider-handle:hover{background:#007ba4}.range-slider-active-segment{display:inline-block;position:absolute;height:0.875rem;background:#e5e5e5}.range-slider-handle{display:inline-block;position:absolute;z-index:1;top:-0.3125rem;width:2rem;height:1.375rem;border:1px solid none;cursor:pointer;-ms-touch-action:manipulation;touch-action:manipulation;background:#008CBA}.range-slider-handle:hover{background:#007ba4}[class*="block-grid-"]{display:block;padding:0;margin:0 -0.625rem}[class*="block-grid-"]:before,[class*="block-grid-"]:after{content:" ";display:table}[class*="block-grid-"]:after{clear:both}[class*="block-grid-"]>li{display:block;height:auto;float:left;padding:0 0.625rem 1.25rem}@media only screen{.small-block-grid-1>li{width:100%;list-style:none}.small-block-grid-1>li:nth-of-type(1n){clear:none}.small-block-grid-1>li:nth-of-type(1n+1){clear:both}.small-block-grid-2>li{width:50%;list-style:none}.small-block-grid-2>li:nth-of-type(1n){clear:none}.small-block-grid-2>li:nth-of-type(2n+1){clear:both}.small-block-grid-3>li{width:33.33333%;list-style:none}.small-block-grid-3>li:nth-of-type(1n){clear:none}.small-block-grid-3>li:nth-of-type(3n+1){clear:both}.small-block-grid-4>li{width:25%;list-style:none}.small-block-grid-4>li:nth-of-type(1n){clear:none}.small-block-grid-4>li:nth-of-type(4n+1){clear:both}.small-block-grid-5>li{width:20%;list-style:none}.small-block-grid-5>li:nth-of-type(1n){clear:none}.small-block-grid-5>li:nth-of-type(5n+1){clear:both}.small-block-grid-6>li{width:16.66667%;list-style:none}.small-block-grid-6>li:nth-of-type(1n){clear:none}.small-block-grid-6>li:nth-of-type(6n+1){clear:both}.small-block-grid-7>li{width:14.28571%;list-style:none}.small-block-grid-7>li:nth-of-type(1n){clear:none}.small-block-grid-7>li:nth-of-type(7n+1){clear:both}.small-block-grid-8>li{width:12.5%;list-style:none}.small-block-grid-8>li:nth-of-type(1n){clear:none}.small-block-grid-8>li:nth-of-type(8n+1){clear:both}.small-block-grid-9>li{width:11.11111%;list-style:none}.small-block-grid-9>li:nth-of-type(1n){clear:none}.small-block-grid-9>li:nth-of-type(9n+1){clear:both}.small-block-grid-10>li{width:10%;list-style:none}.small-block-grid-10>li:nth-of-type(1n){clear:none}.small-block-grid-10>li:nth-of-type(10n+1){clear:both}.small-block-grid-11>li{width:9.09091%;list-style:none}.small-block-grid-11>li:nth-of-type(1n){clear:none}.small-block-grid-11>li:nth-of-type(11n+1){clear:both}.small-block-grid-12>li{width:8.33333%;list-style:none}.small-block-grid-12>li:nth-of-type(1n){clear:none}.small-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 40.063em){.medium-block-grid-1>li{width:100%;list-style:none}.medium-block-grid-1>li:nth-of-type(1n){clear:none}.medium-block-grid-1>li:nth-of-type(1n+1){clear:both}.medium-block-grid-2>li{width:50%;list-style:none}.medium-block-grid-2>li:nth-of-type(1n){clear:none}.medium-block-grid-2>li:nth-of-type(2n+1){clear:both}.medium-block-grid-3>li{width:33.33333%;list-style:none}.medium-block-grid-3>li:nth-of-type(1n){clear:none}.medium-block-grid-3>li:nth-of-type(3n+1){clear:both}.medium-block-grid-4>li{width:25%;list-style:none}.medium-block-grid-4>li:nth-of-type(1n){clear:none}.medium-block-grid-4>li:nth-of-type(4n+1){clear:both}.medium-block-grid-5>li{width:20%;list-style:none}.medium-block-grid-5>li:nth-of-type(1n){clear:none}.medium-block-grid-5>li:nth-of-type(5n+1){clear:both}.medium-block-grid-6>li{width:16.66667%;list-style:none}.medium-block-grid-6>li:nth-of-type(1n){clear:none}.medium-block-grid-6>li:nth-of-type(6n+1){clear:both}.medium-block-grid-7>li{width:14.28571%;list-style:none}.medium-block-grid-7>li:nth-of-type(1n){clear:none}.medium-block-grid-7>li:nth-of-type(7n+1){clear:both}.medium-block-grid-8>li{width:12.5%;list-style:none}.medium-block-grid-8>li:nth-of-type(1n){clear:none}.medium-block-grid-8>li:nth-of-type(8n+1){clear:both}.medium-block-grid-9>li{width:11.11111%;list-style:none}.medium-block-grid-9>li:nth-of-type(1n){clear:none}.medium-block-grid-9>li:nth-of-type(9n+1){clear:both}.medium-block-grid-10>li{width:10%;list-style:none}.medium-block-grid-10>li:nth-of-type(1n){clear:none}.medium-block-grid-10>li:nth-of-type(10n+1){clear:both}.medium-block-grid-11>li{width:9.09091%;list-style:none}.medium-block-grid-11>li:nth-of-type(1n){clear:none}.medium-block-grid-11>li:nth-of-type(11n+1){clear:both}.medium-block-grid-12>li{width:8.33333%;list-style:none}.medium-block-grid-12>li:nth-of-type(1n){clear:none}.medium-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 64.063em){.large-block-grid-1>li{width:100%;list-style:none}.large-block-grid-1>li:nth-of-type(1n){clear:none}.large-block-grid-1>li:nth-of-type(1n+1){clear:both}.large-block-grid-2>li{width:50%;list-style:none}.large-block-grid-2>li:nth-of-type(1n){clear:none}.large-block-grid-2>li:nth-of-type(2n+1){clear:both}.large-block-grid-3>li{width:33.33333%;list-style:none}.large-block-grid-3>li:nth-of-type(1n){clear:none}.large-block-grid-3>li:nth-of-type(3n+1){clear:both}.large-block-grid-4>li{width:25%;list-style:none}.large-block-grid-4>li:nth-of-type(1n){clear:none}.large-block-grid-4>li:nth-of-type(4n+1){clear:both}.large-block-grid-5>li{width:20%;list-style:none}.large-block-grid-5>li:nth-of-type(1n){clear:none}.large-block-grid-5>li:nth-of-type(5n+1){clear:both}.large-block-grid-6>li{width:16.66667%;list-style:none}.large-block-grid-6>li:nth-of-type(1n){clear:none}.large-block-grid-6>li:nth-of-type(6n+1){clear:both}.large-block-grid-7>li{width:14.28571%;list-style:none}.large-block-grid-7>li:nth-of-type(1n){clear:none}.large-block-grid-7>li:nth-of-type(7n+1){clear:both}.large-block-grid-8>li{width:12.5%;list-style:none}.large-block-grid-8>li:nth-of-type(1n){clear:none}.large-block-grid-8>li:nth-of-type(8n+1){clear:both}.large-block-grid-9>li{width:11.11111%;list-style:none}.large-block-grid-9>li:nth-of-type(1n){clear:none}.large-block-grid-9>li:nth-of-type(9n+1){clear:both}.large-block-grid-10>li{width:10%;list-style:none}.large-block-grid-10>li:nth-of-type(1n){clear:none}.large-block-grid-10>li:nth-of-type(10n+1){clear:both}.large-block-grid-11>li{width:9.09091%;list-style:none}.large-block-grid-11>li:nth-of-type(1n){clear:none}.large-block-grid-11>li:nth-of-type(11n+1){clear:both}.large-block-grid-12>li{width:8.33333%;list-style:none}.large-block-grid-12>li:nth-of-type(1n){clear:none}.large-block-grid-12>li:nth-of-type(12n+1){clear:both}}.flex-video{position:relative;padding-top:1.5625rem;padding-bottom:67.5%;height:0;margin-bottom:1rem;overflow:hidden}.flex-video.widescreen{padding-bottom:56.34%}.flex-video.vimeo{padding-top:0}.flex-video iframe,.flex-video object,.flex-video embed,.flex-video video{position:absolute;top:0;left:0;width:100%;height:100%}.keystroke,kbd{background-color:#ededed;border-color:#ddd;color:#222;border-style:solid;border-width:1px;margin:0;font-family:"Consolas","Menlo","Courier",monospace;font-size:inherit;padding:0.125rem 0.25rem 0;border-radius:3px}.switch{padding:0;border:none;position:relative;outline:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.switch label{display:block;margin-bottom:1rem;position:relative;color:transparent;background:#ddd;text-indent:100%;width:4rem;height:2rem;cursor:pointer;transition:left 0.15s ease-out}.switch input{opacity:0;position:absolute;top:9px;left:10px;padding:0}.switch input+label{margin-left:0;margin-right:0}.switch label:after{content:"";display:block;background:#fff;position:absolute;top:.25rem;left:.25rem;width:1.5rem;height:1.5rem;-webkit-transition:left 0.15s ease-out;-moz-transition:left 0.15s ease-out;-o-transition:translate3d(0, 0, 0);transition:left 0.15s ease-out;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.switch input:checked+label{background:#008CBA}.switch input:checked+label:after{left:2.25rem}.switch label{width:4rem;height:2rem}.switch label:after{width:1.5rem;height:1.5rem}.switch input:checked+label:after{left:2.25rem}.switch label{color:transparent;background:#ddd}.switch label:after{background:#fff}.switch input:checked+label{background:#008CBA}.switch.large label{width:5rem;height:2.5rem}.switch.large label:after{width:2rem;height:2rem}.switch.large input:checked+label:after{left:2.75rem}.switch.small label{width:3.5rem;height:1.75rem}.switch.small label:after{width:1.25rem;height:1.25rem}.switch.small input:checked+label:after{left:2rem}.switch.tiny label{width:3rem;height:1.5rem}.switch.tiny label:after{width:1rem;height:1rem}.switch.tiny input:checked+label:after{left:1.75rem}.switch.radius label{border-radius:4px}.switch.radius label:after{border-radius:3px}.switch.round{border-radius:1000px}.switch.round label{border-radius:2rem}.switch.round label:after{border-radius:2rem}@media only screen{.show-for-small-only,.show-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.hide-for-small-only,.hide-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.visible-for-small-only,.visible-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.hidden-for-small-only,.hidden-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.show-for-small-only,table.show-for-small-up,table.show-for-small,table.show-for-small-down,table.hide-for-medium-only,table.hide-for-medium-up,table.hide-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.show-for-small-only,thead.show-for-small-up,thead.show-for-small,thead.show-for-small-down,thead.hide-for-medium-only,thead.hide-for-medium-up,thead.hide-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.show-for-small-only,tbody.show-for-small-up,tbody.show-for-small,tbody.show-for-small-down,tbody.hide-for-medium-only,tbody.hide-for-medium-up,tbody.hide-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.show-for-small-only,tr.show-for-small-up,tr.show-for-small,tr.show-for-small-down,tr.hide-for-medium-only,tr.hide-for-medium-up,tr.hide-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row !important}th.show-for-small-only,td.show-for-small-only,th.show-for-small-up,td.show-for-small-up,th.show-for-small,td.show-for-small,th.show-for-small-down,td.show-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.hide-for-medium-up,td.hide-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 40.063em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.show-for-medium-only,table.show-for-medium-up,table.show-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.show-for-medium-only,thead.show-for-medium-up,thead.show-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.show-for-medium-only,tbody.show-for-medium-up,tbody.show-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.show-for-medium-only,tr.show-for-medium-up,tr.show-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row !important}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.show-for-medium-only,td.show-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.show-for-medium,td.show-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 64.063em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.show-for-large-only,table.show-for-large-up,table.show-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.show-for-large-only,thead.show-for-large-up,thead.show-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.show-for-large-only,tbody.show-for-large-up,tbody.show-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.show-for-large-only,tr.show-for-large-up,tr.show-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row !important}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.show-for-large-only,td.show-for-large-only,th.show-for-large-up,td.show-for-large-up,th.show-for-large,td.show-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 90.063em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.show-for-xlarge-only,table.show-for-xlarge-up,table.show-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.show-for-xlarge-only,thead.show-for-xlarge-up,thead.show-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.show-for-xlarge-only,tbody.show-for-xlarge-up,tbody.show-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.show-for-xlarge-only,tr.show-for-xlarge-up,tr.show-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row !important}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.show-for-xlarge-only,td.show-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.show-for-xlarge,td.show-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 120.063em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.hide-for-xlarge-only,.show-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.show-for-xlarge-only,.hide-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.hidden-for-xlarge-only,.visible-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.visible-for-xlarge-only,.hidden-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.hide-for-xlarge-only,table.show-for-xlarge-up,table.hide-for-xlarge,table.hide-for-xlarge-down,table.show-for-xxlarge-only,table.show-for-xxlarge-up,table.show-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.hide-for-xlarge-only,thead.show-for-xlarge-up,thead.hide-for-xlarge,thead.hide-for-xlarge-down,thead.show-for-xxlarge-only,thead.show-for-xxlarge-up,thead.show-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.hide-for-xlarge-only,tbody.show-for-xlarge-up,tbody.hide-for-xlarge,tbody.hide-for-xlarge-down,tbody.show-for-xxlarge-only,tbody.show-for-xxlarge-up,tbody.show-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.hide-for-xlarge-only,tr.show-for-xlarge-up,tr.hide-for-xlarge,tr.hide-for-xlarge-down,tr.show-for-xxlarge-only,tr.show-for-xxlarge-up,tr.show-for-xxlarge,tr.show-for-xxlarge-down{display:table-row !important}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.hide-for-xlarge-down,td.hide-for-xlarge-down,th.show-for-xxlarge-only,td.show-for-xxlarge-only,th.show-for-xxlarge-up,td.show-for-xxlarge-up,th.show-for-xxlarge,td.show-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.hide-for-landscape,table.show-for-portrait{display:table !important}thead.hide-for-landscape,thead.show-for-portrait{display:table-header-group !important}tbody.hide-for-landscape,tbody.show-for-portrait{display:table-row-group !important}tr.hide-for-landscape,tr.show-for-portrait{display:table-row !important}td.hide-for-landscape,td.show-for-portrait,th.hide-for-landscape,th.show-for-portrait{display:table-cell !important}@media only screen and (orientation: landscape){.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.show-for-landscape,table.hide-for-portrait{display:table !important}thead.show-for-landscape,thead.hide-for-portrait{display:table-header-group !important}tbody.show-for-landscape,tbody.hide-for-portrait{display:table-row-group !important}tr.show-for-landscape,tr.hide-for-portrait{display:table-row !important}td.show-for-landscape,td.hide-for-portrait,th.show-for-landscape,th.hide-for-portrait{display:table-cell !important}}@media only screen and (orientation: portrait){.show-for-portrait,.hide-for-landscape{display:inherit !important}.hide-for-portrait,.show-for-landscape{display:none !important}table.show-for-portrait,table.hide-for-landscape{display:table !important}thead.show-for-portrait,thead.hide-for-landscape{display:table-header-group !important}tbody.show-for-portrait,tbody.hide-for-landscape{display:table-row-group !important}tr.show-for-portrait,tr.hide-for-landscape{display:table-row !important}td.show-for-portrait,td.hide-for-landscape,th.show-for-portrait,th.hide-for-landscape{display:table-cell !important}}.show-for-touch{display:none !important}.hide-for-touch{display:inherit !important}.touch .show-for-touch{display:inherit !important}.touch .hide-for-touch{display:none !important}table.hide-for-touch{display:table !important}.touch table.show-for-touch{display:table !important}thead.hide-for-touch{display:table-header-group !important}.touch thead.show-for-touch{display:table-header-group !important}tbody.hide-for-touch{display:table-row-group !important}.touch tbody.show-for-touch{display:table-row-group !important}tr.hide-for-touch{display:table-row !important}.touch tr.show-for-touch{display:table-row !important}td.hide-for-touch{display:table-cell !important}.touch td.show-for-touch{display:table-cell !important}th.hide-for-touch{display:table-cell !important}.touch th.show-for-touch{display:table-cell !important}@media print{.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}} +@charset "UTF-8"; +/*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}main{display:block}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}input{overflow:visible}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;display:table;max-width:100%;padding:0;color:inherit;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}details{display:block}summary{display:list-item}menu{display:block}canvas{display:inline-block}[hidden],template{display:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{box-sizing:border-box;font-size:100%}*,:after,:before{box-sizing:inherit}body{margin:0;padding:0;background:#fefefe;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;color:#0a0a0a;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle;max-width:100%;height:auto;-ms-interpolation-mode:bicubic}textarea{height:auto;min-height:50px}select,textarea{border-radius:3px}select{box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;border-radius:3px;background:transparent;line-height:1}[data-whatinput=mouse] button{outline:0}pre{overflow:auto}.is-visible{display:block!important}.is-hidden{display:none!important}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{margin-bottom:1rem;font-size:inherit;line-height:1.6;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}h1,h2,h3,h4,h5,h6{font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;color:inherit;text-rendering:optimizeLegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{line-height:0;color:#cacaca}h1{font-size:1.5rem}h1,h2{line-height:1.4;margin-top:0;margin-bottom:.5rem}h2{font-size:1.25rem}h3{font-size:1.1875rem}h3,h4{line-height:1.4;margin-top:0;margin-bottom:.5rem}h4{font-size:1.125rem}h5{font-size:1.0625rem}h5,h6{line-height:1.4;margin-top:0;margin-bottom:.5rem}h6{font-size:1rem}@media print,screen and (min-width:40em){h1{font-size:3rem}h2{font-size:2.5rem}h3{font-size:1.9375rem}h4{font-size:1.5625rem}h5{font-size:1.25rem}h6{font-size:1rem}}a{line-height:inherit;color:#2ba6cb;text-decoration:none;cursor:pointer}a:focus,a:hover{color:#258faf}a img{border:0}hr{clear:both;max-width:62.5rem;height:0;margin:1.25rem auto;border-top:0;border-right:0;border-bottom:1px solid #cacaca;border-left:0}dl,ol,ul{margin-bottom:1rem;list-style-position:outside;line-height:1.6}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-left:1.25rem;margin-bottom:0}dl{margin-bottom:1rem}dl dt{margin-bottom:.3rem;font-weight:700}blockquote{margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem;border-left:1px solid #cacaca}blockquote,blockquote p{line-height:1.6;color:#8a8a8a}cite{display:block;font-size:.8125rem;color:#8a8a8a}cite:before{content:"— "}abbr{border-bottom:1px dotted #0a0a0a;color:#0a0a0a;cursor:help}figure{margin:0}code{padding:.125rem .3125rem .0625rem;border:1px solid #cacaca;font-weight:400}code,kbd{background-color:#e6e6e6;font-family:Consolas,Liberation Mono,Courier,monospace;color:#0a0a0a}kbd{margin:0;padding:.125rem .25rem 0;border-radius:3px}.subheader{margin-top:.2rem;margin-bottom:.5rem;font-weight:400;line-height:1.4;color:#8a8a8a}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}.no-bullet{margin-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:transparent!important;box-shadow:none!important;color:#000!important;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{display:block;box-sizing:border-box;width:100%;height:2.4375rem;margin:0 0 1rem;padding:.5rem;border:1px solid #cacaca;border-radius:3px;background-color:#fefefe;box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);font-family:inherit;font-size:1rem;font-weight:400;color:#0a0a0a;transition:box-shadow .5s,border-color .25s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{outline:none;border:1px solid #8a8a8a;background-color:#fefefe;box-shadow:0 0 5px #cacaca;transition:box-shadow .5s,border-color .25s ease-in-out}textarea{max-width:100%}textarea[rows]{height:auto}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#cacaca}input::-moz-placeholder,textarea::-moz-placeholder{color:#cacaca}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#cacaca}input::placeholder,textarea::placeholder{color:#cacaca}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:3px}input[type=search]{box-sizing:border-box}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;vertical-align:baseline;margin-left:.5rem;margin-right:1rem;margin-bottom:0}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{display:block;margin:0;font-size:.875rem;font-weight:400;line-height:1.8;color:#0a0a0a}label.middle{margin:0 0 1rem;padding:.5625rem 0}.help-text{margin-top:-.5rem;font-size:.8125rem;font-style:italic;color:#0a0a0a}.input-group{display:table;width:100%;margin-bottom:1rem}.input-group>:first-child{border-radius:3px 0 0 3px}.input-group>:last-child>*{border-radius:0 3px 3px 0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap;display:table-cell;vertical-align:middle}.input-group-label{padding:0 1rem;border:1px solid #cacaca;background:#e6e6e6;color:#0a0a0a;text-align:center;white-space:nowrap;width:1%;height:100%}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{border-radius:0;height:2.5rem}.input-group-button{padding-top:0;padding-bottom:0;text-align:center;width:1%;height:100%}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{height:2.5rem;padding-top:0;padding-bottom:0;font-size:1rem}.input-group .input-group-button{display:table-cell}fieldset{margin:0;padding:0;border:0}legend{max-width:100%;margin-bottom:.5rem}.fieldset{margin:1.125rem 0;padding:1.25rem;border:1px solid #cacaca}.fieldset legend{margin:0;margin-left:-.1875rem;padding:0 .1875rem;background:#fefefe}select{height:2.4375rem;margin:0 0 1rem;padding:.5rem;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid #cacaca;border-radius:3px;background-color:#fefefe;font-family:inherit;font-size:1rem;line-height:normal;color:#0a0a0a;background-image:url("data:image/svg+xml;utf8,");background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;padding-right:1.5rem;transition:box-shadow .5s,border-color .25s ease-in-out}@media screen and (min-width:0\0){select{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==")}}select:focus{outline:none;border:1px solid #8a8a8a;background-color:#fefefe;box-shadow:0 0 5px #cacaca;transition:box-shadow .5s,border-color .25s ease-in-out}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{height:auto;background-image:none}.is-invalid-input:not(:focus){border-color:#c60f13;background-color:#f8e6e7}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#c60f13}.is-invalid-input:not(:focus)::-moz-placeholder{color:#c60f13}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#c60f13}.form-error,.is-invalid-input:not(:focus)::placeholder,.is-invalid-label{color:#c60f13}.form-error{display:none;margin-top:-.5rem;margin-bottom:1rem;font-size:.75rem;font-weight:700}.form-error.is-visible{display:block}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-right:auto;margin-left:auto}.clearfix:after,.clearfix:before{display:table;content:" "}.clearfix:after{clear:both}.hide{display:none!important}.invisible{visibility:hidden}@media screen and (max-width:39.9375em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.9375em){.show-for-medium{display:none!important}}@media screen and (min-width:40em) and (max-width:63.9375em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.9375em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.9375em){.show-for-large{display:none!important}}@media screen and (min-width:64em) and (max-width:74.9375em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.9375em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}.show-on-focus:active,.show-on-focus:focus{position:static!important;width:auto;height:auto;overflow:visible;clip:auto}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.button{display:inline-block;vertical-align:middle;margin:0 0 1rem;padding:.85em 1em;-webkit-appearance:none;border:1px solid transparent;border-radius:3px;transition:background-color .25s ease-out,color .25s ease-out;font-size:.9rem;line-height:1;text-align:center;cursor:pointer;background-color:#2ba6cb;color:#fefefe}[data-whatinput=mouse] .button{outline:0}.button:focus,.button:hover{background-color:#258dad;color:#fefefe}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;width:100%;margin-right:0;margin-left:0}.button.primary{background-color:#2ba6cb;color:#0a0a0a}.button.primary:focus,.button.primary:hover{background-color:#2285a2;color:#0a0a0a}.button.secondary{background-color:#e9e9e9;color:#0a0a0a}.button.secondary:focus,.button.secondary:hover{background-color:#bababa;color:#0a0a0a}.button.alert{background-color:#c60f13;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#9e0c0f;color:#fefefe}.button.success{background-color:#5da423;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#4a831c;color:#0a0a0a}.button.warning{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.body-font{background-color:#222;color:#fefefe}.button.body-font:focus,.button.body-font:hover{background-color:#1b1b1b;color:#fefefe}.button.header{background-color:#222;color:#fefefe}.button.header:focus,.button.header:hover{background-color:#1b1b1b;color:#fefefe}.button.hollow{border:1px solid #2ba6cb;color:#2ba6cb}.button.hollow,.button.hollow:focus,.button.hollow:hover{background-color:transparent}.button.hollow:focus,.button.hollow:hover{border-color:#165366;color:#165366}.button.hollow.primary{border:1px solid #2ba6cb;color:#2ba6cb}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#165366;color:#165366}.button.hollow.secondary{border:1px solid #e9e9e9;color:#e9e9e9}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#757575;color:#757575}.button.hollow.alert{border:1px solid #c60f13;color:#c60f13}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#63080a;color:#63080a}.button.hollow.success{border:1px solid #5da423;color:#5da423}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#2f5212;color:#2f5212}.button.hollow.warning{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.body-font{border:1px solid #222;color:#222}.button.hollow.body-font:focus,.button.hollow.body-font:hover{border-color:#111;color:#111}.button.hollow.header{border:1px solid #222;color:#222}.button.hollow.header:focus,.button.hollow.header:hover{border-color:#111;color:#111}.button.disabled,.button[disabled]{opacity:.25;cursor:not-allowed}.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#2ba6cb;color:#fefefe}.button.disabled.primary,.button[disabled].primary{opacity:.25;cursor:not-allowed}.button.disabled.primary,.button.disabled.primary:focus,.button.disabled.primary:hover,.button[disabled].primary,.button[disabled].primary:focus,.button[disabled].primary:hover{background-color:#2ba6cb;color:#0a0a0a}.button.disabled.secondary,.button[disabled].secondary{opacity:.25;cursor:not-allowed}.button.disabled.secondary,.button.disabled.secondary:focus,.button.disabled.secondary:hover,.button[disabled].secondary,.button[disabled].secondary:focus,.button[disabled].secondary:hover{background-color:#e9e9e9;color:#0a0a0a}.button.disabled.alert,.button[disabled].alert{opacity:.25;cursor:not-allowed}.button.disabled.alert,.button.disabled.alert:focus,.button.disabled.alert:hover,.button[disabled].alert,.button[disabled].alert:focus,.button[disabled].alert:hover{background-color:#c60f13;color:#fefefe}.button.disabled.success,.button[disabled].success{opacity:.25;cursor:not-allowed}.button.disabled.success,.button.disabled.success:focus,.button.disabled.success:hover,.button[disabled].success,.button[disabled].success:focus,.button[disabled].success:hover{background-color:#5da423;color:#0a0a0a}.button.disabled.warning,.button[disabled].warning{opacity:.25;cursor:not-allowed}.button.disabled.warning,.button.disabled.warning:focus,.button.disabled.warning:hover,.button[disabled].warning,.button[disabled].warning:focus,.button[disabled].warning:hover{background-color:#ffae00;color:#0a0a0a}.button.disabled.body-font,.button[disabled].body-font{opacity:.25;cursor:not-allowed}.button.disabled.body-font,.button.disabled.body-font:focus,.button.disabled.body-font:hover,.button[disabled].body-font,.button[disabled].body-font:focus,.button[disabled].body-font:hover{background-color:#222;color:#fefefe}.button.disabled.header,.button[disabled].header{opacity:.25;cursor:not-allowed}.button.disabled.header,.button.disabled.header:focus,.button.disabled.header:hover,.button[disabled].header,.button[disabled].header:focus,.button[disabled].header:hover{background-color:#222;color:#fefefe}.button.dropdown:after{display:block;width:0;height:0;border:.4em inset;content:"";border-bottom-width:0;border-top-style:solid;border-color:#fefefe transparent transparent;position:relative;top:.4em;display:inline-block;float:right;margin-left:1em}.button.arrow-only:after{top:-.1em;float:none;margin-left:0}.close-button{position:absolute;color:#8a8a8a;cursor:pointer}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{right:.66rem;top:.33em;font-size:1.5em;line-height:1}.close-button,.close-button.medium{right:1rem;top:.5rem;font-size:2em;line-height:1}.button-group{margin-bottom:1rem;font-size:0}.button-group:after,.button-group:before{display:table;content:" "}.button-group:after{clear:both}.button-group .button{margin:0;margin-right:1px;margin-bottom:1px;font-size:.9rem}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded{margin-right:-1px}.button-group.expanded:after,.button-group.expanded:before{display:none}.button-group.expanded .button:first-child:last-child{width:100%}.button-group.expanded .button:first-child:nth-last-child(2),.button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2)~.button{display:inline-block;width:calc(50% - 1px);margin-right:1px}.button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2)~.button:last-child,.button-group.expanded .button:first-child:nth-last-child(2):last-child{margin-right:-6px}.button-group.expanded .button:first-child:nth-last-child(3),.button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3)~.button{display:inline-block;width:calc(33.33333% - 1px);margin-right:1px}.button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3)~.button:last-child,.button-group.expanded .button:first-child:nth-last-child(3):last-child{margin-right:-6px}.button-group.expanded .button:first-child:nth-last-child(4),.button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4)~.button{display:inline-block;width:calc(25% - 1px);margin-right:1px}.button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4)~.button:last-child,.button-group.expanded .button:first-child:nth-last-child(4):last-child{margin-right:-6px}.button-group.expanded .button:first-child:nth-last-child(5),.button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5)~.button{display:inline-block;width:calc(20% - 1px);margin-right:1px}.button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5)~.button:last-child,.button-group.expanded .button:first-child:nth-last-child(5):last-child{margin-right:-6px}.button-group.expanded .button:first-child:nth-last-child(6),.button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6)~.button{display:inline-block;width:calc(16.66667% - 1px);margin-right:1px}.button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6)~.button:last-child,.button-group.expanded .button:first-child:nth-last-child(6):last-child{margin-right:-6px}.button-group.primary .button{background-color:#2ba6cb;color:#0a0a0a}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#2285a2;color:#0a0a0a}.button-group.secondary .button{background-color:#e9e9e9;color:#0a0a0a}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#bababa;color:#0a0a0a}.button-group.alert .button{background-color:#c60f13;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#9e0c0f;color:#fefefe}.button-group.success .button{background-color:#5da423;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#4a831c;color:#0a0a0a}.button-group.warning .button{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.body-font .button{background-color:#222;color:#fefefe}.button-group.body-font .button:focus,.button-group.body-font .button:hover{background-color:#1b1b1b;color:#fefefe}.button-group.header .button{background-color:#222;color:#fefefe}.button-group.header .button:focus,.button-group.header .button:hover{background-color:#1b1b1b;color:#fefefe}.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button,.button-group.stacked .button{width:100%}.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child,.button-group.stacked .button:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{width:auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{width:auto;margin-bottom:0}}@media screen and (max-width:39.9375em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}.slider{position:relative;height:.5rem;margin-top:1.25rem;margin-bottom:2.25rem;background-color:#e6e6e6;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-touch-action:none;touch-action:none}.slider-fill{position:absolute;top:0;left:0;display:inline-block;max-width:100%;height:.5rem;background-color:#cacaca;transition:all .2s ease-in-out}.slider-fill.is-dragging{transition:all 0s linear}.slider-handle{top:50%;transform:translateY(-50%);position:absolute;left:0;z-index:1;display:inline-block;width:1.4rem;height:1.4rem;border-radius:3px;background-color:#2ba6cb;transition:all .2s ease-in-out;-ms-touch-action:manipulation;touch-action:manipulation}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#258dad}.slider-handle.is-dragging{transition:all 0s linear}.slider.disabled,.slider[disabled]{opacity:.25;cursor:not-allowed}.slider.vertical{display:inline-block;width:.5rem;height:12.5rem;margin:0 1.25rem;transform:scaleY(-1)}.slider.vertical .slider-fill{top:0;width:.5rem;max-height:100%}.slider.vertical .slider-handle{position:absolute;top:0;left:50%;width:1.4rem;height:1.4rem;transform:translateX(-50%)}.switch{height:2rem;position:relative;margin-bottom:1rem;outline:0;font-size:.875rem;font-weight:700;color:#fefefe;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{position:absolute;margin-bottom:0;opacity:0}.switch-paddle{position:relative;display:block;width:4rem;height:2rem;border-radius:3px;background:#cacaca;transition:all .25s ease-out;font-weight:inherit;color:inherit;cursor:pointer}input+.switch-paddle{margin:0}.switch-paddle:after{position:absolute;top:.25rem;left:.25rem;display:block;width:1.5rem;height:1.5rem;transform:translateZ(0);border-radius:3px;background:#fefefe;transition:all .25s ease-out;content:""}input:checked~.switch-paddle{background:#2ba6cb}input:checked~.switch-paddle:after{left:2.25rem}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;transform:translateY(-50%)}.switch-active{left:8%;display:none}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{width:3rem;height:1.5rem;font-size:.625rem}.switch.tiny .switch-paddle:after{top:.25rem;left:.25rem;width:1rem;height:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{width:3.5rem;height:1.75rem;font-size:.75rem}.switch.small .switch-paddle:after{top:.25rem;left:.25rem;width:1.25rem;height:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{width:5rem;height:2.5rem;font-size:1rem}.switch.large .switch-paddle:after{top:.25rem;left:.25rem;width:2rem;height:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}.menu{margin:0;list-style-type:none}.menu>li{display:table-cell;vertical-align:middle}[data-whatinput=mouse] .menu>li{outline:0}.menu>li>a{display:block;padding:.7rem 1rem;line-height:1}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu>li>a i,.menu>li>a i+span,.menu>li>a img,.menu>li>a img+span,.menu>li>a svg,.menu>li>a svg+span{vertical-align:middle}.menu>li>a i,.menu>li>a img,.menu>li>a svg{margin-right:.25rem;display:inline-block}.menu.horizontal>li,.menu>li{display:table-cell}.menu.expanded{display:table;width:100%;table-layout:fixed}.menu.expanded>li:first-child:last-child{width:100%}.menu.vertical>li{display:block}@media print,screen and (min-width:40em){.menu.medium-horizontal>li{display:table-cell}.menu.medium-expanded{display:table;width:100%;table-layout:fixed}.menu.medium-expanded>li:first-child:last-child{width:100%}.menu.medium-vertical>li{display:block}}@media print,screen and (min-width:64em){.menu.large-horizontal>li{display:table-cell}.menu.large-expanded{display:table;width:100%;table-layout:fixed}.menu.large-expanded>li:first-child:last-child{width:100%}.menu.large-vertical>li{display:block}}.menu.simple li{display:inline-block;vertical-align:top;line-height:1}.menu.simple a{padding:0}.menu.simple li{margin-left:0;margin-right:1rem}.menu.simple.align-right li{margin-right:0;margin-left:1rem}.menu.align-right:after,.menu.align-right:before{display:table;content:" "}.menu.align-right:after{clear:both}.menu.align-right>li{float:right}.menu.icon-top>li>a{text-align:center}.menu.icon-top>li>a i,.menu.icon-top>li>a img,.menu.icon-top>li>a svg{display:block;margin:0 auto .25rem}.menu.icon-top.vertical a>span{margin:auto}.menu.nested{margin-left:1rem}.menu .active>a{background:#2ba6cb;color:#fefefe}.menu.menu-bordered li{border:1px solid #e6e6e6}.menu.menu-bordered li:not(:first-child){border-top:0}.menu.menu-hover li:hover{background-color:#e6e6e6}.menu-text{padding-top:0;padding-bottom:0;padding:.7rem 1rem;font-weight:700;line-height:1;color:inherit}.menu-centered{text-align:center}.menu-centered>.menu{display:inline-block;vertical-align:top}.no-js [data-responsive-menu] ul{display:none}.is-drilldown{position:relative;overflow:hidden}.is-drilldown li{display:block}.is-drilldown.animate-height{transition:height .5s}.is-drilldown-submenu{position:absolute;top:0;left:100%;z-index:-1;width:100%;background:#fefefe;transition:transform .15s linear}.is-drilldown-submenu.is-active{z-index:1;display:block;transform:translateX(-100%)}.is-drilldown-submenu.is-closing{transform:translateX(100%)}.drilldown-submenu-cover-previous{min-height:100%}.is-drilldown-submenu-parent>a{position:relative}.is-drilldown-submenu-parent>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #2ba6cb;position:absolute;top:50%;margin-top:-6px;right:1rem}.js-drilldown-back>a:before{display:block;width:0;height:0;border:6px inset;content:"";border-right-style:solid;border-color:transparent #2ba6cb transparent transparent;display:inline-block;vertical-align:middle;margin-right:.75rem;border-left-width:0}.is-accordion-submenu-parent>a{position:relative}.is-accordion-submenu-parent>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-bottom-width:0;border-top-style:solid;border-color:#2ba6cb transparent transparent;position:absolute;top:50%;margin-top:-3px;right:1rem}.is-accordion-submenu-parent[aria-expanded=true]>a:after{transform:rotate(180deg);transform-origin:50% 50%}.dropdown.menu>li.opens-left>.is-dropdown-submenu{top:100%;right:0;left:auto}.dropdown.menu>li.opens-right>.is-dropdown-submenu{top:100%;right:auto;left:0}.dropdown.menu>li.is-dropdown-submenu-parent>a{position:relative;padding-right:1.5rem}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-bottom-width:0;border-top-style:solid;border-color:#2ba6cb transparent transparent;right:5px;margin-top:-3px}[data-whatinput=mouse] .dropdown.menu a{outline:0}.no-js .dropdown.menu ul{display:none}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{right:100%;left:auto}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{right:auto;left:100%}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-left-width:0;border-right-style:solid;border-color:transparent #2ba6cb transparent transparent}.dropdown.menu.vertical>li.opens-right>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #2ba6cb}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{top:100%;right:0;left:auto}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{top:100%;right:auto;left:0}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{position:relative;padding-right:1.5rem}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-bottom-width:0;border-top-style:solid;border-color:#2ba6cb transparent transparent;right:5px;margin-top:-3px}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{right:100%;left:auto}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{right:auto;left:100%}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-left-width:0;border-right-style:solid;border-color:transparent #2ba6cb transparent transparent}.dropdown.menu.medium-vertical>li.opens-right>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #2ba6cb}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{top:100%;right:0;left:auto}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{top:100%;right:auto;left:0}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{position:relative;padding-right:1.5rem}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-bottom-width:0;border-top-style:solid;border-color:#2ba6cb transparent transparent;right:5px;margin-top:-3px}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{right:100%;left:auto}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{right:auto;left:100%}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-left-width:0;border-right-style:solid;border-color:transparent #2ba6cb transparent transparent}.dropdown.menu.large-vertical>li.opens-right>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #2ba6cb}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{top:100%;right:0;left:auto}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{position:absolute;top:50%;right:5px;margin-top:-6px}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{top:100%;left:auto}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{right:100%;left:auto}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{right:auto;left:100%}.is-dropdown-submenu{position:absolute;top:0;left:100%;z-index:1;display:none;min-width:200px;border:1px solid #cacaca;background:#fefefe}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-left-width:0;border-right-style:solid;border-color:transparent #2ba6cb transparent transparent}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{display:block;width:0;height:0;border:6px inset;content:"";border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #2ba6cb}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.title-bar{padding:.5rem;background:#0a0a0a;color:#fefefe}.title-bar:after,.title-bar:before{display:table;content:" "}.title-bar:after{clear:both}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left{float:left}.title-bar-right{float:right;text-align:right}.title-bar-title{display:inline-block;vertical-align:middle;font-weight:700}.top-bar{padding:.5rem}.top-bar:after,.top-bar:before{display:table;content:" "}.top-bar:after{clear:both}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{max-width:200px;margin-right:1rem}.top-bar .input-group-field{width:100%;margin-right:0}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{width:100%}@media print,screen and (min-width:40em){.top-bar .top-bar-left,.top-bar .top-bar-right{width:auto}}@media screen and (max-width:63.9375em){.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{width:100%}}@media screen and (max-width:74.9375em){.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{width:100%}}.top-bar-title{display:inline-block;float:left;padding:.5rem 1rem .5rem 0}.top-bar-title .menu-icon{bottom:2px}.top-bar-left{float:left}.top-bar-right{float:right}.breadcrumbs{margin:0 0 1rem;list-style:none}.breadcrumbs:after,.breadcrumbs:before{display:table;content:" "}.breadcrumbs:after{clear:both}.breadcrumbs li{float:left;font-size:.6875rem;color:#0a0a0a;cursor:default;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{position:relative;top:1px;margin:0 .75rem;opacity:1;content:"/";color:#cacaca}.breadcrumbs a{color:#2ba6cb}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.pagination{margin-left:0;margin-bottom:1rem}.pagination:after,.pagination:before{display:table;content:" "}.pagination:after{clear:both}.pagination li{margin-right:.0625rem;border-radius:3px;font-size:.875rem;display:none}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{display:block;padding:.1875rem .625rem;border-radius:3px;color:#0a0a0a}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{padding:.1875rem .625rem;background:#2ba6cb;color:#fefefe;cursor:default}.pagination .disabled{padding:.1875rem .625rem;color:#cacaca;cursor:not-allowed}.pagination .disabled:hover{background:transparent}.pagination .ellipsis:after{padding:.1875rem .625rem;content:"\2026";color:#0a0a0a}.pagination-previous.disabled:before,.pagination-previous a:before{display:inline-block;margin-right:.5rem;content:"\00ab"}.pagination-next.disabled:after,.pagination-next a:after{display:inline-block;margin-left:.5rem;content:"\00bb"}.accordion{margin-left:0;background:#fefefe;list-style-type:none}.accordion-item:first-child>:first-child{border-radius:3px 3px 0 0}.accordion-item:last-child>:last-child{border-radius:0 0 3px 3px}.accordion-title{position:relative;display:block;padding:1.25rem 1rem;border:1px solid #e6e6e6;border-bottom:0;font-size:.75rem;line-height:1;color:#2ba6cb}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0 0 3px 3px}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{position:absolute;top:50%;right:1rem;margin-top:-.5rem;content:"+"}.is-active>.accordion-title:before{content:"\2013"}.accordion-content{display:none;padding:1rem;border:1px solid #e6e6e6;border-bottom:0;background-color:#fefefe;color:#0a0a0a}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.dropdown-pane{position:absolute;z-index:10;display:block;width:300px;padding:1rem;visibility:hidden;border:1px solid #cacaca;border-radius:3px;background-color:#fefefe;font-size:1rem}.dropdown-pane.is-open{visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{position:absolute;top:0;left:0;width:100%;height:100%;transition:opacity .5s ease,visibility .5s ease;background:hsla(0,0%,100%,.25);opacity:0;visibility:hidden;overflow:hidden}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{position:relative;overflow:hidden}.off-canvas{position:fixed;z-index:1;transition:transform .5s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-overlap{z-index:10}.off-canvas.is-transition-overlap.is-open{box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{transform:translate(0)}.off-canvas-absolute{position:absolute;z-index:1;transition:transform .5s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-overlap{z-index:10}.off-canvas-absolute.is-transition-overlap.is-open{box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{transform:translate(0)}.position-left{top:0;left:0;width:250px;height:100%;transform:translateX(-250px);overflow-y:auto}.position-left.is-open~.off-canvas-content{transform:translateX(250px)}.position-left.is-transition-push:after{position:absolute;top:0;right:0;height:100%;width:1px;box-shadow:0 0 10px hsla(0,0%,4%,.7);content:" "}.position-left.is-transition-overlap.is-open~.off-canvas-content{transform:none}.position-right{top:0;right:0;width:250px;height:100%;transform:translateX(250px);overflow-y:auto}.position-right.is-open~.off-canvas-content{transform:translateX(-250px)}.position-right.is-transition-push:after{position:absolute;top:0;left:0;height:100%;width:1px;box-shadow:0 0 10px hsla(0,0%,4%,.7);content:" "}.position-right.is-transition-overlap.is-open~.off-canvas-content{transform:none}.position-top{top:0;left:0;width:100%;height:250px;transform:translateY(-250px);overflow-x:auto}.position-top.is-open~.off-canvas-content{transform:translateY(250px)}.position-top.is-transition-push:after{position:absolute;bottom:0;left:0;height:1px;width:100%;box-shadow:0 0 10px hsla(0,0%,4%,.7);content:" "}.position-top.is-transition-overlap.is-open~.off-canvas-content{transform:none}.position-bottom{bottom:0;left:0;width:100%;height:250px;transform:translateY(250px);overflow-x:auto}.position-bottom.is-open~.off-canvas-content{transform:translateY(-250px)}.position-bottom.is-transition-push:after{position:absolute;top:0;left:0;height:1px;width:100%;box-shadow:0 0 10px hsla(0,0%,4%,.7);content:" "}.position-bottom.is-transition-overlap.is-open~.off-canvas-content{transform:none}.off-canvas-content{transition:transform .5s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{transform:none;z-index:1}.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{transform:none;z-index:1}.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{transform:none;z-index:1}.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{transform:none;z-index:1}.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{transform:none;z-index:1}.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{transform:none;z-index:1}.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{transform:none;z-index:1}.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{transform:none;z-index:1}.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}.tabs{margin:0;border:1px solid #e6e6e6;background:#fefefe;list-style-type:none}.tabs:after,.tabs:before{display:table;content:" "}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:transparent}.tabs.primary{background:#2ba6cb}.tabs.primary>li>a{color:#0a0a0a}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#299ec1}.tabs-title{float:left}.tabs-title>a{display:block;padding:1.25rem 1.5rem;font-size:.75rem;line-height:1;color:#2ba6cb}.tabs-title>a:hover{background:#fefefe;color:#258faf}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#2ba6cb}.tabs-content{border:1px solid #e6e6e6;border-top:0;background:#fefefe;color:#0a0a0a;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel[aria-hidden=false]{display:block}.callout{position:relative;margin:0 0 1rem;padding:1rem;border:1px solid hsla(0,0%,4%,.25);border-radius:3px;background-color:#fff;color:#0a0a0a}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#def2f8;color:#0a0a0a}.callout.secondary{background-color:#fcfcfc;color:#0a0a0a}.callout.alert{background-color:#fcd6d6;color:#0a0a0a}.callout.success{background-color:#e6f7d9;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.body-font,.callout.header{background-color:#dedede;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{margin-bottom:1rem;border:1px solid #e6e6e6;border-radius:3px;background:#fefefe;box-shadow:none;overflow:hidden;color:#0a0a0a}.card>:last-child{margin-bottom:0}.card-divider{padding:1rem;background:#e6e6e6}.card-divider>:last-child{margin-bottom:0}.card-section{padding:1rem}.card-section>:last-child{margin-bottom:0}.media-object{display:block;margin-bottom:1rem}.media-object img{max-width:none}@media screen and (max-width:39.9375em){.media-object.stack-for-small .media-object-section{padding:0;padding-bottom:1rem;display:block}.media-object.stack-for-small .media-object-section img{width:100%}}.media-object-section{display:table-cell;vertical-align:top}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}.media-object-section.middle{vertical-align:middle}.media-object-section.bottom{vertical-align:bottom}body.is-reveal-open{overflow:hidden}html.is-reveal-open,html.is-reveal-open body{min-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reveal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1005;display:none;background-color:hsla(0,0%,4%,.45);overflow-y:scroll}.reveal{z-index:1006;-webkit-backface-visibility:hidden;backface-visibility:hidden;display:none;padding:1rem;border:1px solid #cacaca;border-radius:3px;background-color:#fefefe;position:relative;top:100px;margin-right:auto;margin-left:auto;overflow-y:auto}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column,.reveal .columns{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{width:600px;max-width:62.5rem}}@media print,screen and (min-width:40em){.reveal .reveal{right:auto;left:auto;margin:0 auto}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{width:30%;max-width:62.5rem}}@media print,screen and (min-width:40em){.reveal.small{width:50%;max-width:62.5rem}}@media print,screen and (min-width:40em){.reveal.large{width:90%;max-width:62.5rem}}.reveal.full{top:0;left:0;width:100%;max-width:none;height:100%;height:100vh;min-height:100vh;margin-left:0;border:0;border-radius:0}@media screen and (max-width:39.9375em){.reveal{top:0;left:0;width:100%;max-width:none;height:100%;height:100vh;min-height:100vh;margin-left:0;border:0;border-radius:0}}.reveal.without-overlay{position:fixed}table{width:100%;margin-bottom:1rem;border-radius:3px}table tbody,table tfoot,table thead{border:1px solid #f1f1f1;background-color:#fefefe}table caption{padding:.5rem .625rem .625rem;font-weight:700}table thead{background:#f8f8f8;color:#0a0a0a}table tfoot{background:#f1f1f1;color:#0a0a0a}table tfoot tr,table thead tr{background:transparent}table tfoot td,table tfoot th,table thead td,table thead th{padding:.5rem .625rem .625rem;font-weight:700;text-align:left}table tbody td,table tbody th{padding:.5rem .625rem .625rem}table tbody tr:nth-child(even){border-bottom:0;background-color:#f1f1f1}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{border-bottom:0;border-bottom:1px solid #f1f1f1;background-color:#fefefe}@media screen and (max-width:63.9375em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;width:100%;overflow-x:auto}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(even):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.table-scroll table{width:auto}.badge{display:inline-block;min-width:2.1em;padding:.3em;border-radius:50%;font-size:.6rem;text-align:center;background:#2ba6cb;color:#fefefe}.badge.primary{background:#2ba6cb;color:#0a0a0a}.badge.secondary{background:#e9e9e9;color:#0a0a0a}.badge.alert{background:#c60f13;color:#fefefe}.badge.success{background:#5da423;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.body-font,.badge.header{background:#222;color:#fefefe}.label{display:inline-block;padding:.33333rem .5rem;border-radius:3px;font-size:.8rem;line-height:1;white-space:nowrap;cursor:default;background:#2ba6cb;color:#fefefe}.label.primary{background:#2ba6cb;color:#0a0a0a}.label.secondary{background:#e9e9e9;color:#0a0a0a}.label.alert{background:#c60f13;color:#fefefe}.label.success{background:#5da423;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.body-font,.label.header{background:#222;color:#fefefe}.progress{height:1rem;margin-bottom:1rem;border-radius:3px;background-color:#cacaca}.progress.primary .progress-meter{background-color:#2ba6cb}.progress.secondary .progress-meter{background-color:#e9e9e9}.progress.alert .progress-meter{background-color:#c60f13}.progress.success .progress-meter{background-color:#5da423}.progress.warning .progress-meter{background-color:#ffae00}.progress.body-font .progress-meter,.progress.header .progress-meter{background-color:#222}.progress-meter{position:relative;display:block;width:0;height:100%;background-color:#2ba6cb;border-radius:3px}.progress-meter-text{top:50%;left:50%;transform:translate(-50%,-50%);position:absolute;margin:0;font-size:.75rem;font-weight:700;color:#fefefe;white-space:nowrap;border-radius:3px}.has-tip{position:relative;display:inline-block;border-bottom:1px dotted #8a8a8a;font-weight:700;cursor:help}.tooltip{position:absolute;top:calc(100% + .6495rem);z-index:1200;max-width:10rem;padding:.75rem;border-radius:3px;background-color:#0a0a0a;font-size:80%;color:#fefefe}.tooltip:before{border:.75rem inset;border-top-width:0;border-bottom-style:solid;border-color:transparent transparent #0a0a0a;position:absolute;bottom:100%;left:50%;transform:translateX(-50%)}.tooltip.top:before,.tooltip:before{display:block;width:0;height:0;content:""}.tooltip.top:before{border:.75rem inset;border-bottom-width:0;border-top-style:solid;border-color:#0a0a0a transparent transparent;top:100%;bottom:auto}.tooltip.left:before{border:.75rem inset;border-right-width:0;border-left-style:solid;border-color:transparent transparent transparent #0a0a0a;left:100%}.tooltip.left:before,.tooltip.right:before{display:block;width:0;height:0;content:"";top:50%;bottom:auto;transform:translateY(-50%)}.tooltip.right:before{border:.75rem inset;border-left-width:0;border-right-style:solid;border-color:transparent #0a0a0a transparent transparent;right:100%;left:auto}.flex-video,.responsive-embed{position:relative;height:0;margin-bottom:1rem;padding-bottom:75%;overflow:hidden}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{position:absolute;top:0;left:0;width:100%;height:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.orbit,.orbit-container{position:relative}.orbit-container{height:0;margin:0;list-style:none;overflow:hidden}.orbit-slide{width:100%}.orbit-slide.no-motionui.is-active{top:0;left:0}.orbit-figure{margin:0}.orbit-image{width:100%;max-width:100%;margin:0}.orbit-caption{bottom:0;width:100%;margin-bottom:0;background-color:hsla(0,0%,4%,.5)}.orbit-caption,.orbit-next,.orbit-previous{position:absolute;padding:1rem;color:#fefefe}.orbit-next,.orbit-previous{top:50%;transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{position:relative;margin-top:.8rem;margin-bottom:.8rem;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{width:1.2rem;height:1.2rem;margin:.1rem;border-radius:50%;background-color:#cacaca}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.thumbnail{display:inline-block;max-width:100%;margin-bottom:1rem;border:4px solid #fefefe;border-radius:3px;box-shadow:0 0 0 1px hsla(0,0%,4%,.2);line-height:0}a.thumbnail{transition:box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{box-shadow:0 0 6px 1px rgba(43,166,203,.5)}a.thumbnail image{box-shadow:none}.sticky,.sticky-container{position:relative}.sticky{z-index:0;transform:translateZ(0)}.sticky.is-stuck{position:fixed;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{position:relative;right:auto;left:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.row{max-width:62.5rem;margin-right:auto;margin-left:auto}.row:after,.row:before{display:table;content:" "}.row:after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-right:0;padding-left:0}.row .row{margin-right:-.9375rem;margin-left:-.9375rem}@media print,screen and (min-width:40em){.row .row{margin-right:-.9375rem;margin-left:-.9375rem}}@media print,screen and (min-width:64em){.row .row{margin-right:-.9375rem;margin-left:-.9375rem}}.row .row.collapse{margin-right:0;margin-left:0}.row.expanded{max-width:none}.row.expanded .row{margin-right:auto;margin-left:auto}.row:not(.expanded) .row{max-width:none}.column,.columns{width:100%;float:left;padding-right:.9375rem;padding-left:.9375rem}.column:last-child:not(:first-child),.columns:last-child:not(:first-child){float:right}.column.end:last-child:last-child,.end.columns:last-child:last-child{float:left}.column.row.row,.row.row.columns{float:none}.row .column.row.row,.row .row.row.columns{margin-right:0;margin-left:0;padding-right:0;padding-left:0}.small-1{width:8.33333%}.small-push-1{position:relative;left:8.33333%}.small-pull-1{position:relative;left:-8.33333%}.small-offset-0{margin-left:0}.small-2{width:16.66667%}.small-push-2{position:relative;left:16.66667%}.small-pull-2{position:relative;left:-16.66667%}.small-offset-1{margin-left:8.33333%}.small-3{width:25%}.small-push-3{position:relative;left:25%}.small-pull-3{position:relative;left:-25%}.small-offset-2{margin-left:16.66667%}.small-4{width:33.33333%}.small-push-4{position:relative;left:33.33333%}.small-pull-4{position:relative;left:-33.33333%}.small-offset-3{margin-left:25%}.small-5{width:41.66667%}.small-push-5{position:relative;left:41.66667%}.small-pull-5{position:relative;left:-41.66667%}.small-offset-4{margin-left:33.33333%}.small-6{width:50%}.small-push-6{position:relative;left:50%}.small-pull-6{position:relative;left:-50%}.small-offset-5{margin-left:41.66667%}.small-7{width:58.33333%}.small-push-7{position:relative;left:58.33333%}.small-pull-7{position:relative;left:-58.33333%}.small-offset-6{margin-left:50%}.small-8{width:66.66667%}.small-push-8{position:relative;left:66.66667%}.small-pull-8{position:relative;left:-66.66667%}.small-offset-7{margin-left:58.33333%}.small-9{width:75%}.small-push-9{position:relative;left:75%}.small-pull-9{position:relative;left:-75%}.small-offset-8{margin-left:66.66667%}.small-10{width:83.33333%}.small-push-10{position:relative;left:83.33333%}.small-pull-10{position:relative;left:-83.33333%}.small-offset-9{margin-left:75%}.small-11{width:91.66667%}.small-push-11{position:relative;left:91.66667%}.small-pull-11{position:relative;left:-91.66667%}.small-offset-10{margin-left:83.33333%}.small-12{width:100%}.small-offset-11{margin-left:91.66667%}.small-up-1>.column,.small-up-1>.columns{float:left;width:100%}.small-up-1>.column:nth-of-type(1n),.small-up-1>.columns:nth-of-type(1n){clear:none}.small-up-1>.column:nth-of-type(1n+1),.small-up-1>.columns:nth-of-type(1n+1){clear:both}.small-up-1>.column:last-child,.small-up-1>.columns:last-child{float:left}.small-up-2>.column,.small-up-2>.columns{float:left;width:50%}.small-up-2>.column:nth-of-type(1n),.small-up-2>.columns:nth-of-type(1n){clear:none}.small-up-2>.column:nth-of-type(2n+1),.small-up-2>.columns:nth-of-type(2n+1){clear:both}.small-up-2>.column:last-child,.small-up-2>.columns:last-child{float:left}.small-up-3>.column,.small-up-3>.columns{float:left;width:33.33333%}.small-up-3>.column:nth-of-type(1n),.small-up-3>.columns:nth-of-type(1n){clear:none}.small-up-3>.column:nth-of-type(3n+1),.small-up-3>.columns:nth-of-type(3n+1){clear:both}.small-up-3>.column:last-child,.small-up-3>.columns:last-child{float:left}.small-up-4>.column,.small-up-4>.columns{float:left;width:25%}.small-up-4>.column:nth-of-type(1n),.small-up-4>.columns:nth-of-type(1n){clear:none}.small-up-4>.column:nth-of-type(4n+1),.small-up-4>.columns:nth-of-type(4n+1){clear:both}.small-up-4>.column:last-child,.small-up-4>.columns:last-child{float:left}.small-up-5>.column,.small-up-5>.columns{float:left;width:20%}.small-up-5>.column:nth-of-type(1n),.small-up-5>.columns:nth-of-type(1n){clear:none}.small-up-5>.column:nth-of-type(5n+1),.small-up-5>.columns:nth-of-type(5n+1){clear:both}.small-up-5>.column:last-child,.small-up-5>.columns:last-child{float:left}.small-up-6>.column,.small-up-6>.columns{float:left;width:16.66667%}.small-up-6>.column:nth-of-type(1n),.small-up-6>.columns:nth-of-type(1n){clear:none}.small-up-6>.column:nth-of-type(6n+1),.small-up-6>.columns:nth-of-type(6n+1){clear:both}.small-up-6>.column:last-child,.small-up-6>.columns:last-child{float:left}.small-up-7>.column,.small-up-7>.columns{float:left;width:14.28571%}.small-up-7>.column:nth-of-type(1n),.small-up-7>.columns:nth-of-type(1n){clear:none}.small-up-7>.column:nth-of-type(7n+1),.small-up-7>.columns:nth-of-type(7n+1){clear:both}.small-up-7>.column:last-child,.small-up-7>.columns:last-child{float:left}.small-up-8>.column,.small-up-8>.columns{float:left;width:12.5%}.small-up-8>.column:nth-of-type(1n),.small-up-8>.columns:nth-of-type(1n){clear:none}.small-up-8>.column:nth-of-type(8n+1),.small-up-8>.columns:nth-of-type(8n+1){clear:both}.small-up-8>.column:last-child,.small-up-8>.columns:last-child{float:left}.small-collapse>.column,.small-collapse>.columns{padding-right:0;padding-left:0}.expanded.row .small-collapse.row,.small-collapse .row{margin-right:0;margin-left:0}.small-uncollapse>.column,.small-uncollapse>.columns{padding-right:.9375rem;padding-left:.9375rem}.small-centered{margin-right:auto;margin-left:auto}.small-centered,.small-centered:last-child:not(:first-child){float:none;clear:both}.small-pull-0,.small-push-0,.small-uncentered{position:static;float:left;margin-right:0;margin-left:0}@media print,screen and (min-width:40em){.medium-1{width:8.33333%}.medium-push-1{position:relative;left:8.33333%}.medium-pull-1{position:relative;left:-8.33333%}.medium-offset-0{margin-left:0}.medium-2{width:16.66667%}.medium-push-2{position:relative;left:16.66667%}.medium-pull-2{position:relative;left:-16.66667%}.medium-offset-1{margin-left:8.33333%}.medium-3{width:25%}.medium-push-3{position:relative;left:25%}.medium-pull-3{position:relative;left:-25%}.medium-offset-2{margin-left:16.66667%}.medium-4{width:33.33333%}.medium-push-4{position:relative;left:33.33333%}.medium-pull-4{position:relative;left:-33.33333%}.medium-offset-3{margin-left:25%}.medium-5{width:41.66667%}.medium-push-5{position:relative;left:41.66667%}.medium-pull-5{position:relative;left:-41.66667%}.medium-offset-4{margin-left:33.33333%}.medium-6{width:50%}.medium-push-6{position:relative;left:50%}.medium-pull-6{position:relative;left:-50%}.medium-offset-5{margin-left:41.66667%}.medium-7{width:58.33333%}.medium-push-7{position:relative;left:58.33333%}.medium-pull-7{position:relative;left:-58.33333%}.medium-offset-6{margin-left:50%}.medium-8{width:66.66667%}.medium-push-8{position:relative;left:66.66667%}.medium-pull-8{position:relative;left:-66.66667%}.medium-offset-7{margin-left:58.33333%}.medium-9{width:75%}.medium-push-9{position:relative;left:75%}.medium-pull-9{position:relative;left:-75%}.medium-offset-8{margin-left:66.66667%}.medium-10{width:83.33333%}.medium-push-10{position:relative;left:83.33333%}.medium-pull-10{position:relative;left:-83.33333%}.medium-offset-9{margin-left:75%}.medium-11{width:91.66667%}.medium-push-11{position:relative;left:91.66667%}.medium-pull-11{position:relative;left:-91.66667%}.medium-offset-10{margin-left:83.33333%}.medium-12{width:100%}.medium-offset-11{margin-left:91.66667%}.medium-up-1>.column,.medium-up-1>.columns{float:left;width:100%}.medium-up-1>.column:nth-of-type(1n),.medium-up-1>.columns:nth-of-type(1n){clear:none}.medium-up-1>.column:nth-of-type(1n+1),.medium-up-1>.columns:nth-of-type(1n+1){clear:both}.medium-up-1>.column:last-child,.medium-up-1>.columns:last-child{float:left}.medium-up-2>.column,.medium-up-2>.columns{float:left;width:50%}.medium-up-2>.column:nth-of-type(1n),.medium-up-2>.columns:nth-of-type(1n){clear:none}.medium-up-2>.column:nth-of-type(2n+1),.medium-up-2>.columns:nth-of-type(2n+1){clear:both}.medium-up-2>.column:last-child,.medium-up-2>.columns:last-child{float:left}.medium-up-3>.column,.medium-up-3>.columns{float:left;width:33.33333%}.medium-up-3>.column:nth-of-type(1n),.medium-up-3>.columns:nth-of-type(1n){clear:none}.medium-up-3>.column:nth-of-type(3n+1),.medium-up-3>.columns:nth-of-type(3n+1){clear:both}.medium-up-3>.column:last-child,.medium-up-3>.columns:last-child{float:left}.medium-up-4>.column,.medium-up-4>.columns{float:left;width:25%}.medium-up-4>.column:nth-of-type(1n),.medium-up-4>.columns:nth-of-type(1n){clear:none}.medium-up-4>.column:nth-of-type(4n+1),.medium-up-4>.columns:nth-of-type(4n+1){clear:both}.medium-up-4>.column:last-child,.medium-up-4>.columns:last-child{float:left}.medium-up-5>.column,.medium-up-5>.columns{float:left;width:20%}.medium-up-5>.column:nth-of-type(1n),.medium-up-5>.columns:nth-of-type(1n){clear:none}.medium-up-5>.column:nth-of-type(5n+1),.medium-up-5>.columns:nth-of-type(5n+1){clear:both}.medium-up-5>.column:last-child,.medium-up-5>.columns:last-child{float:left}.medium-up-6>.column,.medium-up-6>.columns{float:left;width:16.66667%}.medium-up-6>.column:nth-of-type(1n),.medium-up-6>.columns:nth-of-type(1n){clear:none}.medium-up-6>.column:nth-of-type(6n+1),.medium-up-6>.columns:nth-of-type(6n+1){clear:both}.medium-up-6>.column:last-child,.medium-up-6>.columns:last-child{float:left}.medium-up-7>.column,.medium-up-7>.columns{float:left;width:14.28571%}.medium-up-7>.column:nth-of-type(1n),.medium-up-7>.columns:nth-of-type(1n){clear:none}.medium-up-7>.column:nth-of-type(7n+1),.medium-up-7>.columns:nth-of-type(7n+1){clear:both}.medium-up-7>.column:last-child,.medium-up-7>.columns:last-child{float:left}.medium-up-8>.column,.medium-up-8>.columns{float:left;width:12.5%}.medium-up-8>.column:nth-of-type(1n),.medium-up-8>.columns:nth-of-type(1n){clear:none}.medium-up-8>.column:nth-of-type(8n+1),.medium-up-8>.columns:nth-of-type(8n+1){clear:both}.medium-up-8>.column:last-child,.medium-up-8>.columns:last-child{float:left}.medium-collapse>.column,.medium-collapse>.columns{padding-right:0;padding-left:0}.expanded.row .medium-collapse.row,.medium-collapse .row{margin-right:0;margin-left:0}.medium-uncollapse>.column,.medium-uncollapse>.columns{padding-right:.9375rem;padding-left:.9375rem}.medium-centered{margin-right:auto;margin-left:auto}.medium-centered,.medium-centered:last-child:not(:first-child){float:none;clear:both}.medium-pull-0,.medium-push-0,.medium-uncentered{position:static;float:left;margin-right:0;margin-left:0}}@media print,screen and (min-width:64em){.large-1{width:8.33333%}.large-push-1{position:relative;left:8.33333%}.large-pull-1{position:relative;left:-8.33333%}.large-offset-0{margin-left:0}.large-2{width:16.66667%}.large-push-2{position:relative;left:16.66667%}.large-pull-2{position:relative;left:-16.66667%}.large-offset-1{margin-left:8.33333%}.large-3{width:25%}.large-push-3{position:relative;left:25%}.large-pull-3{position:relative;left:-25%}.large-offset-2{margin-left:16.66667%}.large-4{width:33.33333%}.large-push-4{position:relative;left:33.33333%}.large-pull-4{position:relative;left:-33.33333%}.large-offset-3{margin-left:25%}.large-5{width:41.66667%}.large-push-5{position:relative;left:41.66667%}.large-pull-5{position:relative;left:-41.66667%}.large-offset-4{margin-left:33.33333%}.large-6{width:50%}.large-push-6{position:relative;left:50%}.large-pull-6{position:relative;left:-50%}.large-offset-5{margin-left:41.66667%}.large-7{width:58.33333%}.large-push-7{position:relative;left:58.33333%}.large-pull-7{position:relative;left:-58.33333%}.large-offset-6{margin-left:50%}.large-8{width:66.66667%}.large-push-8{position:relative;left:66.66667%}.large-pull-8{position:relative;left:-66.66667%}.large-offset-7{margin-left:58.33333%}.large-9{width:75%}.large-push-9{position:relative;left:75%}.large-pull-9{position:relative;left:-75%}.large-offset-8{margin-left:66.66667%}.large-10{width:83.33333%}.large-push-10{position:relative;left:83.33333%}.large-pull-10{position:relative;left:-83.33333%}.large-offset-9{margin-left:75%}.large-11{width:91.66667%}.large-push-11{position:relative;left:91.66667%}.large-pull-11{position:relative;left:-91.66667%}.large-offset-10{margin-left:83.33333%}.large-12{width:100%}.large-offset-11{margin-left:91.66667%}.large-up-1>.column,.large-up-1>.columns{float:left;width:100%}.large-up-1>.column:nth-of-type(1n),.large-up-1>.columns:nth-of-type(1n){clear:none}.large-up-1>.column:nth-of-type(1n+1),.large-up-1>.columns:nth-of-type(1n+1){clear:both}.large-up-1>.column:last-child,.large-up-1>.columns:last-child{float:left}.large-up-2>.column,.large-up-2>.columns{float:left;width:50%}.large-up-2>.column:nth-of-type(1n),.large-up-2>.columns:nth-of-type(1n){clear:none}.large-up-2>.column:nth-of-type(2n+1),.large-up-2>.columns:nth-of-type(2n+1){clear:both}.large-up-2>.column:last-child,.large-up-2>.columns:last-child{float:left}.large-up-3>.column,.large-up-3>.columns{float:left;width:33.33333%}.large-up-3>.column:nth-of-type(1n),.large-up-3>.columns:nth-of-type(1n){clear:none}.large-up-3>.column:nth-of-type(3n+1),.large-up-3>.columns:nth-of-type(3n+1){clear:both}.large-up-3>.column:last-child,.large-up-3>.columns:last-child{float:left}.large-up-4>.column,.large-up-4>.columns{float:left;width:25%}.large-up-4>.column:nth-of-type(1n),.large-up-4>.columns:nth-of-type(1n){clear:none}.large-up-4>.column:nth-of-type(4n+1),.large-up-4>.columns:nth-of-type(4n+1){clear:both}.large-up-4>.column:last-child,.large-up-4>.columns:last-child{float:left}.large-up-5>.column,.large-up-5>.columns{float:left;width:20%}.large-up-5>.column:nth-of-type(1n),.large-up-5>.columns:nth-of-type(1n){clear:none}.large-up-5>.column:nth-of-type(5n+1),.large-up-5>.columns:nth-of-type(5n+1){clear:both}.large-up-5>.column:last-child,.large-up-5>.columns:last-child{float:left}.large-up-6>.column,.large-up-6>.columns{float:left;width:16.66667%}.large-up-6>.column:nth-of-type(1n),.large-up-6>.columns:nth-of-type(1n){clear:none}.large-up-6>.column:nth-of-type(6n+1),.large-up-6>.columns:nth-of-type(6n+1){clear:both}.large-up-6>.column:last-child,.large-up-6>.columns:last-child{float:left}.large-up-7>.column,.large-up-7>.columns{float:left;width:14.28571%}.large-up-7>.column:nth-of-type(1n),.large-up-7>.columns:nth-of-type(1n){clear:none}.large-up-7>.column:nth-of-type(7n+1),.large-up-7>.columns:nth-of-type(7n+1){clear:both}.large-up-7>.column:last-child,.large-up-7>.columns:last-child{float:left}.large-up-8>.column,.large-up-8>.columns{float:left;width:12.5%}.large-up-8>.column:nth-of-type(1n),.large-up-8>.columns:nth-of-type(1n){clear:none}.large-up-8>.column:nth-of-type(8n+1),.large-up-8>.columns:nth-of-type(8n+1){clear:both}.large-up-8>.column:last-child,.large-up-8>.columns:last-child{float:left}.large-collapse>.column,.large-collapse>.columns{padding-right:0;padding-left:0}.expanded.row .large-collapse.row,.large-collapse .row{margin-right:0;margin-left:0}.large-uncollapse>.column,.large-uncollapse>.columns{padding-right:.9375rem;padding-left:.9375rem}.large-centered{margin-right:auto;margin-left:auto}.large-centered,.large-centered:last-child:not(:first-child){float:none;clear:both}.large-pull-0,.large-push-0,.large-uncentered{position:static;float:left;margin-right:0;margin-left:0}}.column-block{margin-bottom:1.875rem}.column-block>:last-child{margin-bottom:0}.menu-icon{position:relative;display:inline-block;vertical-align:middle;width:20px;height:16px;cursor:pointer}.menu-icon:after{position:absolute;top:0;left:0;display:block;width:100%;height:2px;background:#fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:""}.menu-icon:hover:after{background:#cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{position:relative;display:inline-block;vertical-align:middle;width:20px;height:16px;cursor:pointer}.menu-icon.dark:after{position:absolute;top:0;left:0;display:block;width:100%;height:2px;background:#0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:""}.menu-icon.dark:hover:after{background:#8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.slide-in-down.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:translateY(-100%);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-in-down.mui-enter.mui-enter-active{transform:translateY(0)}.slide-in-left.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:translateX(-100%);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-in-left.mui-enter.mui-enter-active{transform:translateX(0)}.slide-in-up.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:translateY(100%);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-in-up.mui-enter.mui-enter-active{transform:translateY(0)}.slide-in-right.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:translateX(100%);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-in-right.mui-enter.mui-enter-active{transform:translateX(0)}.slide-out-down.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:translateY(0);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-out-down.mui-leave.mui-leave-active{transform:translateY(100%)}.slide-out-right.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:translateX(0);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-out-right.mui-leave.mui-leave-active{transform:translateX(100%)}.slide-out-up.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:translateY(0);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-out-up.mui-leave.mui-leave-active{transform:translateY(-100%)}.slide-out-left.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:translateX(0);transition-property:transform,opacity;-webkit-backface-visibility:hidden;backface-visibility:hidden}.slide-out-left.mui-leave.mui-leave-active{transform:translateX(-100%)}.fade-in.mui-enter{transition-duration:.5s;transition-timing-function:linear;opacity:0;transition-property:opacity}.fade-in.mui-enter.mui-enter-active{opacity:1}.fade-out.mui-leave{transition-duration:.5s;transition-timing-function:linear;opacity:1;transition-property:opacity}.fade-out.mui-leave.mui-leave-active{opacity:0}.hinge-in-from-top.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotateX(-90deg);transform-origin:top;transition-property:transform,opacity;opacity:0}.hinge-in-from-top.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-right.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotateY(-90deg);transform-origin:right;transition-property:transform,opacity;opacity:0}.hinge-in-from-right.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-bottom.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotateX(90deg);transform-origin:bottom;transition-property:transform,opacity;opacity:0}.hinge-in-from-bottom.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-left.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotateY(90deg);transform-origin:left;transition-property:transform,opacity;opacity:0}.hinge-in-from-left.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-middle-x.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotateX(-90deg);transform-origin:center;transition-property:transform,opacity;opacity:0}.hinge-in-from-middle-x.mui-enter.mui-enter-active{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-in-from-middle-y.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotateY(-90deg);transform-origin:center;transition-property:transform,opacity;opacity:0}.hinge-in-from-middle-y.mui-enter.mui-enter-active,.hinge-out-from-top.mui-leave{transform:perspective(2000px) rotate(0deg);opacity:1}.hinge-out-from-top.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform-origin:top;transition-property:transform,opacity}.hinge-out-from-top.mui-leave.mui-leave-active{transform:perspective(2000px) rotateX(-90deg);opacity:0}.hinge-out-from-right.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:right;transition-property:transform,opacity;opacity:1}.hinge-out-from-right.mui-leave.mui-leave-active{transform:perspective(2000px) rotateY(-90deg);opacity:0}.hinge-out-from-bottom.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:bottom;transition-property:transform,opacity;opacity:1}.hinge-out-from-bottom.mui-leave.mui-leave-active{transform:perspective(2000px) rotateX(90deg);opacity:0}.hinge-out-from-left.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:left;transition-property:transform,opacity;opacity:1}.hinge-out-from-left.mui-leave.mui-leave-active{transform:perspective(2000px) rotateY(90deg);opacity:0}.hinge-out-from-middle-x.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:center;transition-property:transform,opacity;opacity:1}.hinge-out-from-middle-x.mui-leave.mui-leave-active{transform:perspective(2000px) rotateX(-90deg);opacity:0}.hinge-out-from-middle-y.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:perspective(2000px) rotate(0deg);transform-origin:center;transition-property:transform,opacity;opacity:1}.hinge-out-from-middle-y.mui-leave.mui-leave-active{transform:perspective(2000px) rotateY(-90deg);opacity:0}.scale-in-up.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:scale(.5);transition-property:transform,opacity;opacity:0}.scale-in-up.mui-enter.mui-enter-active{transform:scale(1);opacity:1}.scale-in-down.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:scale(1.5);transition-property:transform,opacity;opacity:0}.scale-in-down.mui-enter.mui-enter-active,.scale-out-up.mui-leave{transform:scale(1);opacity:1}.scale-out-up.mui-leave{transition-duration:.5s;transition-timing-function:linear;transition-property:transform,opacity}.scale-out-up.mui-leave.mui-leave-active{transform:scale(1.5);opacity:0}.scale-out-down.mui-leave{transition-duration:.5s;transition-timing-function:linear;transform:scale(1);transition-property:transform,opacity;opacity:1}.scale-out-down.mui-leave.mui-leave-active{transform:scale(.5);opacity:0}.spin-in.mui-enter{transition-duration:.5s;transition-timing-function:linear;transform:rotate(-270deg);transition-property:transform,opacity;opacity:0}.spin-in.mui-enter.mui-enter-active,.spin-out.mui-leave{transform:rotate(0);opacity:1}.spin-out.mui-leave{transition-duration:.5s;transition-timing-function:linear;transition-property:transform,opacity}.spin-in-ccw.mui-enter,.spin-out.mui-leave.mui-leave-active{transform:rotate(270deg);opacity:0}.spin-in-ccw.mui-enter{transition-duration:.5s;transition-timing-function:linear;transition-property:transform,opacity}.spin-in-ccw.mui-enter.mui-enter-active,.spin-out-ccw.mui-leave{transform:rotate(0);opacity:1}.spin-out-ccw.mui-leave{transition-duration:.5s;transition-timing-function:linear;transition-property:transform,opacity}.spin-out-ccw.mui-leave.mui-leave-active{transform:rotate(-270deg);opacity:0}.slow{transition-duration:.75s!important}.fast{transition-duration:.25s!important}.linear{transition-timing-function:linear!important}.ease{transition-timing-function:ease!important}.ease-in{transition-timing-function:ease-in!important}.ease-out{transition-timing-function:ease-out!important}.ease-in-out{transition-timing-function:ease-in-out!important}.bounce-in{transition-timing-function:cubic-bezier(.485,.155,.24,1.245)!important}.bounce-out{transition-timing-function:cubic-bezier(.485,.155,.515,.845)!important}.bounce-in-out{transition-timing-function:cubic-bezier(.76,-.245,.24,1.245)!important}.short-delay{transition-delay:.3s!important}.long-delay{transition-delay:.7s!important}.shake{animation-name:a}@keyframes a{0%,10%,20%,30%,40%,50%,60%,70%,80%,90%{transform:translateX(7%)}5%,15%,25%,35%,45%,55%,65%,75%,85%,95%{transform:translateX(-7%)}}.spin-ccw,.spin-cw{animation-name:b}@keyframes b{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.wiggle{animation-name:c}@keyframes c{40%,50%,60%{transform:rotate(7deg)}35%,45%,55%,65%{transform:rotate(-7deg)}0%,30%,70%,to{transform:rotate(0)}}.shake,.spin-ccw,.spin-cw,.wiggle{animation-duration:.5s}.infinite{animation-iteration-count:infinite}.slow{animation-duration:.75s!important}.fast{animation-duration:.25s!important}.linear{animation-timing-function:linear!important}.ease{animation-timing-function:ease!important}.ease-in{animation-timing-function:ease-in!important}.ease-out{animation-timing-function:ease-out!important}.ease-in-out{animation-timing-function:ease-in-out!important}.bounce-in{animation-timing-function:cubic-bezier(.485,.155,.24,1.245)!important}.bounce-out{animation-timing-function:cubic-bezier(.485,.155,.515,.845)!important}.bounce-in-out{animation-timing-function:cubic-bezier(.76,-.245,.24,1.245)!important}.short-delay{animation-delay:.3s!important}.long-delay{animation-delay:.7s!important} diff --git a/src/opsoro/server/static/css/opsoro.css b/src/opsoro/server/static/css/opsoro.css index e8f1a8b..48684ec 100644 --- a/src/opsoro/server/static/css/opsoro.css +++ b/src/opsoro/server/static/css/opsoro.css @@ -1,32 +1,2377 @@ +@charset "UTF-8"; +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url("../fonts/fontawesome-webfont.eot?v=4.7.0"); + src: url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"), url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"), url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"), url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"), url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg"); + font-weight: normal; + font-style: normal; } + +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333em; + line-height: 0.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.28571em; + text-align: center; } + +.fa-ul { + padding-left: 0; + margin-left: 2.14286em; + list-style-type: none; } + .fa-ul > li { + position: relative; } + +.fa-li { + position: absolute; + left: -2.14286em; + width: 2.14286em; + top: 0.14286em; + text-align: center; } + .fa-li.fa-lg { + left: -1.85714em; } + +.fa-border { + padding: .2em .25em .15em; + border: solid 0.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; } + +/* Deprecated as of 4.4.0 */ +.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 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-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 { + -ms-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; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: ""; } + +.fa-music:before { + content: ""; } + +.fa-search:before { + content: ""; } + +.fa-envelope-o:before { + content: ""; } + +.fa-heart:before { + content: ""; } + +.fa-star:before { + content: ""; } + +.fa-star-o:before { + content: ""; } + +.fa-user:before { + content: ""; } + +.fa-film:before { + content: ""; } + +.fa-th-large:before { + content: ""; } + +.fa-th:before { + content: ""; } + +.fa-th-list:before { + content: ""; } + +.fa-check:before { + content: ""; } + +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: ""; } + +.fa-search-plus:before { + content: ""; } + +.fa-search-minus:before { + content: ""; } + +.fa-power-off:before { + content: ""; } + +.fa-signal:before { + content: ""; } + +.fa-gear:before, +.fa-cog:before { + content: ""; } + +.fa-trash-o:before { + content: ""; } + +.fa-home:before { + content: ""; } + +.fa-file-o:before { + content: ""; } + +.fa-clock-o:before { + content: ""; } + +.fa-road:before { + content: ""; } + +.fa-download:before { + content: ""; } + +.fa-arrow-circle-o-down:before { + content: ""; } + +.fa-arrow-circle-o-up:before { + content: ""; } + +.fa-inbox:before { + content: ""; } + +.fa-play-circle-o:before { + content: ""; } + +.fa-rotate-right:before, +.fa-repeat:before { + content: ""; } + +.fa-refresh:before { + content: ""; } + +.fa-list-alt:before { + content: ""; } + +.fa-lock:before { + content: ""; } + +.fa-flag:before { + content: ""; } + +.fa-headphones:before { + content: ""; } + +.fa-volume-off:before { + content: ""; } + +.fa-volume-down:before { + content: ""; } + +.fa-volume-up:before { + content: ""; } + +.fa-qrcode:before { + content: ""; } + +.fa-barcode:before { + content: ""; } + +.fa-tag:before { + content: ""; } + +.fa-tags:before { + content: ""; } + +.fa-book:before { + content: ""; } + +.fa-bookmark:before { + content: ""; } + +.fa-print:before { + content: ""; } + +.fa-camera:before { + content: ""; } + +.fa-font:before { + content: ""; } + +.fa-bold:before { + content: ""; } + +.fa-italic:before { + content: ""; } + +.fa-text-height:before { + content: ""; } + +.fa-text-width:before { + content: ""; } + +.fa-align-left:before { + content: ""; } + +.fa-align-center:before { + content: ""; } + +.fa-align-right:before { + content: ""; } + +.fa-align-justify:before { + content: ""; } + +.fa-list:before { + content: ""; } + +.fa-dedent:before, +.fa-outdent:before { + content: ""; } + +.fa-indent:before { + content: ""; } + +.fa-video-camera:before { + content: ""; } + +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: ""; } + +.fa-pencil:before { + content: ""; } + +.fa-map-marker:before { + content: ""; } + +.fa-adjust:before { + content: ""; } + +.fa-tint:before { + content: ""; } + +.fa-edit:before, +.fa-pencil-square-o:before { + content: ""; } + +.fa-share-square-o:before { + content: ""; } + +.fa-check-square-o:before { + content: ""; } + +.fa-arrows:before { + content: ""; } + +.fa-step-backward:before { + content: ""; } + +.fa-fast-backward:before { + content: ""; } + +.fa-backward:before { + content: ""; } + +.fa-play:before { + content: ""; } + +.fa-pause:before { + content: ""; } + +.fa-stop:before { + content: ""; } + +.fa-forward:before { + content: ""; } + +.fa-fast-forward:before { + content: ""; } + +.fa-step-forward:before { + content: ""; } + +.fa-eject:before { + content: ""; } + +.fa-chevron-left:before { + content: ""; } + +.fa-chevron-right:before { + content: ""; } + +.fa-plus-circle:before { + content: ""; } + +.fa-minus-circle:before { + content: ""; } + +.fa-times-circle:before { + content: ""; } + +.fa-check-circle:before { + content: ""; } + +.fa-question-circle:before { + content: ""; } + +.fa-info-circle:before { + content: ""; } + +.fa-crosshairs:before { + content: ""; } + +.fa-times-circle-o:before { + content: ""; } + +.fa-check-circle-o:before { + content: ""; } + +.fa-ban:before { + content: ""; } + +.fa-arrow-left:before { + content: ""; } + +.fa-arrow-right:before { + content: ""; } + +.fa-arrow-up:before { + content: ""; } + +.fa-arrow-down:before { + content: ""; } + +.fa-mail-forward:before, +.fa-share:before { + content: ""; } + +.fa-expand:before { + content: ""; } + +.fa-compress:before { + content: ""; } + +.fa-plus:before { + content: ""; } + +.fa-minus:before { + content: ""; } + +.fa-asterisk:before { + content: ""; } + +.fa-exclamation-circle:before { + content: ""; } + +.fa-gift:before { + content: ""; } + +.fa-leaf:before { + content: ""; } + +.fa-fire:before { + content: ""; } + +.fa-eye:before { + content: ""; } + +.fa-eye-slash:before { + content: ""; } + +.fa-warning:before, +.fa-exclamation-triangle:before { + content: ""; } + +.fa-plane:before { + content: ""; } + +.fa-calendar:before { + content: ""; } + +.fa-random:before { + content: ""; } + +.fa-comment:before { + content: ""; } + +.fa-magnet:before { + content: ""; } + +.fa-chevron-up:before { + content: ""; } + +.fa-chevron-down:before { + content: ""; } + +.fa-retweet:before { + content: ""; } + +.fa-shopping-cart:before { + content: ""; } + +.fa-folder:before { + content: ""; } + +.fa-folder-open:before { + content: ""; } + +.fa-arrows-v:before { + content: ""; } + +.fa-arrows-h:before { + content: ""; } + +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: ""; } + +.fa-twitter-square:before { + content: ""; } + +.fa-facebook-square:before { + content: ""; } + +.fa-camera-retro:before { + content: ""; } + +.fa-key:before { + content: ""; } + +.fa-gears:before, +.fa-cogs:before { + content: ""; } + +.fa-comments:before { + content: ""; } + +.fa-thumbs-o-up:before { + content: ""; } + +.fa-thumbs-o-down:before { + content: ""; } + +.fa-star-half:before { + content: ""; } + +.fa-heart-o:before { + content: ""; } + +.fa-sign-out:before { + content: ""; } + +.fa-linkedin-square:before { + content: ""; } + +.fa-thumb-tack:before { + content: ""; } + +.fa-external-link:before { + content: ""; } + +.fa-sign-in:before { + content: ""; } + +.fa-trophy:before { + content: ""; } + +.fa-github-square:before { + content: ""; } + +.fa-upload:before { + content: ""; } + +.fa-lemon-o:before { + content: ""; } + +.fa-phone:before { + content: ""; } + +.fa-square-o:before { + content: ""; } + +.fa-bookmark-o:before { + content: ""; } + +.fa-phone-square:before { + content: ""; } + +.fa-twitter:before { + content: ""; } + +.fa-facebook-f:before, +.fa-facebook:before { + content: ""; } + +.fa-github:before { + content: ""; } + +.fa-unlock:before { + content: ""; } + +.fa-credit-card:before { + content: ""; } + +.fa-feed:before, +.fa-rss:before { + content: ""; } + +.fa-hdd-o:before { + content: ""; } + +.fa-bullhorn:before { + content: ""; } + +.fa-bell:before { + content: ""; } + +.fa-certificate:before { + content: ""; } + +.fa-hand-o-right:before { + content: ""; } + +.fa-hand-o-left:before { + content: ""; } + +.fa-hand-o-up:before { + content: ""; } + +.fa-hand-o-down:before { + content: ""; } + +.fa-arrow-circle-left:before { + content: ""; } + +.fa-arrow-circle-right:before { + content: ""; } + +.fa-arrow-circle-up:before { + content: ""; } + +.fa-arrow-circle-down:before { + content: ""; } + +.fa-globe:before { + content: ""; } + +.fa-wrench:before { + content: ""; } + +.fa-tasks:before { + content: ""; } + +.fa-filter:before { + content: ""; } + +.fa-briefcase:before { + content: ""; } + +.fa-arrows-alt:before { + content: ""; } + +.fa-group:before, +.fa-users:before { + content: ""; } + +.fa-chain:before, +.fa-link:before { + content: ""; } + +.fa-cloud:before { + content: ""; } + +.fa-flask:before { + content: ""; } + +.fa-cut:before, +.fa-scissors:before { + content: ""; } + +.fa-copy:before, +.fa-files-o:before { + content: ""; } + +.fa-paperclip:before { + content: ""; } + +.fa-save:before, +.fa-floppy-o:before { + content: ""; } + +.fa-square:before { + content: ""; } + +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: ""; } + +.fa-list-ul:before { + content: ""; } + +.fa-list-ol:before { + content: ""; } + +.fa-strikethrough:before { + content: ""; } + +.fa-underline:before { + content: ""; } + +.fa-table:before { + content: ""; } + +.fa-magic:before { + content: ""; } + +.fa-truck:before { + content: ""; } + +.fa-pinterest:before { + content: ""; } + +.fa-pinterest-square:before { + content: ""; } + +.fa-google-plus-square:before { + content: ""; } + +.fa-google-plus:before { + content: ""; } + +.fa-money:before { + content: ""; } + +.fa-caret-down:before { + content: ""; } + +.fa-caret-up:before { + content: ""; } + +.fa-caret-left:before { + content: ""; } + +.fa-caret-right:before { + content: ""; } + +.fa-columns:before { + content: ""; } + +.fa-unsorted:before, +.fa-sort:before { + content: ""; } + +.fa-sort-down:before, +.fa-sort-desc:before { + content: ""; } + +.fa-sort-up:before, +.fa-sort-asc:before { + content: ""; } + +.fa-envelope:before { + content: ""; } + +.fa-linkedin:before { + content: ""; } + +.fa-rotate-left:before, +.fa-undo:before { + content: ""; } + +.fa-legal:before, +.fa-gavel:before { + content: ""; } + +.fa-dashboard:before, +.fa-tachometer:before { + content: ""; } + +.fa-comment-o:before { + content: ""; } + +.fa-comments-o:before { + content: ""; } + +.fa-flash:before, +.fa-bolt:before { + content: ""; } + +.fa-sitemap:before { + content: ""; } + +.fa-umbrella:before { + content: ""; } + +.fa-paste:before, +.fa-clipboard:before { + content: ""; } + +.fa-lightbulb-o:before { + content: ""; } + +.fa-exchange:before { + content: ""; } + +.fa-cloud-download:before { + content: ""; } + +.fa-cloud-upload:before { + content: ""; } + +.fa-user-md:before { + content: ""; } + +.fa-stethoscope:before { + content: ""; } + +.fa-suitcase:before { + content: ""; } + +.fa-bell-o:before { + content: ""; } + +.fa-coffee:before { + content: ""; } + +.fa-cutlery:before { + content: ""; } + +.fa-file-text-o:before { + content: ""; } + +.fa-building-o:before { + content: ""; } + +.fa-hospital-o:before { + content: ""; } + +.fa-ambulance:before { + content: ""; } + +.fa-medkit:before { + content: ""; } + +.fa-fighter-jet:before { + content: ""; } + +.fa-beer:before { + content: ""; } + +.fa-h-square:before { + content: ""; } + +.fa-plus-square:before { + content: ""; } + +.fa-angle-double-left:before { + content: ""; } + +.fa-angle-double-right:before { + content: ""; } + +.fa-angle-double-up:before { + content: ""; } + +.fa-angle-double-down:before { + content: ""; } + +.fa-angle-left:before { + content: ""; } + +.fa-angle-right:before { + content: ""; } + +.fa-angle-up:before { + content: ""; } + +.fa-angle-down:before { + content: ""; } + +.fa-desktop:before { + content: ""; } + +.fa-laptop:before { + content: ""; } + +.fa-tablet:before { + content: ""; } + +.fa-mobile-phone:before, +.fa-mobile:before { + content: ""; } + +.fa-circle-o:before { + content: ""; } + +.fa-quote-left:before { + content: ""; } + +.fa-quote-right:before { + content: ""; } + +.fa-spinner:before { + content: ""; } + +.fa-circle:before { + content: ""; } + +.fa-mail-reply:before, +.fa-reply:before { + content: ""; } + +.fa-github-alt:before { + content: ""; } + +.fa-folder-o:before { + content: ""; } + +.fa-folder-open-o:before { + content: ""; } + +.fa-smile-o:before { + content: ""; } + +.fa-frown-o:before { + content: ""; } + +.fa-meh-o:before { + content: ""; } + +.fa-gamepad:before { + content: ""; } + +.fa-keyboard-o:before { + content: ""; } + +.fa-flag-o:before { + content: ""; } + +.fa-flag-checkered:before { + content: ""; } + +.fa-terminal:before { + content: ""; } + +.fa-code:before { + content: ""; } + +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: ""; } + +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: ""; } + +.fa-location-arrow:before { + content: ""; } + +.fa-crop:before { + content: ""; } + +.fa-code-fork:before { + content: ""; } + +.fa-unlink:before, +.fa-chain-broken:before { + content: ""; } + +.fa-question:before { + content: ""; } + +.fa-info:before { + content: ""; } + +.fa-exclamation:before { + content: ""; } + +.fa-superscript:before { + content: ""; } + +.fa-subscript:before { + content: ""; } + +.fa-eraser:before { + content: ""; } + +.fa-puzzle-piece:before { + content: ""; } + +.fa-microphone:before { + content: ""; } + +.fa-microphone-slash:before { + content: ""; } + +.fa-shield:before { + content: ""; } + +.fa-calendar-o:before { + content: ""; } + +.fa-fire-extinguisher:before { + content: ""; } + +.fa-rocket:before { + content: ""; } + +.fa-maxcdn:before { + content: ""; } + +.fa-chevron-circle-left:before { + content: ""; } + +.fa-chevron-circle-right:before { + content: ""; } + +.fa-chevron-circle-up:before { + content: ""; } + +.fa-chevron-circle-down:before { + content: ""; } + +.fa-html5:before { + content: ""; } + +.fa-css3:before { + content: ""; } + +.fa-anchor:before { + content: ""; } + +.fa-unlock-alt:before { + content: ""; } + +.fa-bullseye:before { + content: ""; } + +.fa-ellipsis-h:before { + content: ""; } + +.fa-ellipsis-v:before { + content: ""; } + +.fa-rss-square:before { + content: ""; } + +.fa-play-circle:before { + content: ""; } + +.fa-ticket:before { + content: ""; } + +.fa-minus-square:before { + content: ""; } + +.fa-minus-square-o:before { + content: ""; } + +.fa-level-up:before { + content: ""; } + +.fa-level-down:before { + content: ""; } + +.fa-check-square:before { + content: ""; } + +.fa-pencil-square:before { + content: ""; } + +.fa-external-link-square:before { + content: ""; } + +.fa-share-square:before { + content: ""; } + +.fa-compass:before { + content: ""; } + +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: ""; } + +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: ""; } + +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: ""; } + +.fa-euro:before, +.fa-eur:before { + content: ""; } + +.fa-gbp:before { + content: ""; } + +.fa-dollar:before, +.fa-usd:before { + content: ""; } + +.fa-rupee:before, +.fa-inr:before { + content: ""; } + +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: ""; } + +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: ""; } + +.fa-won:before, +.fa-krw:before { + content: ""; } + +.fa-bitcoin:before, +.fa-btc:before { + content: ""; } + +.fa-file:before { + content: ""; } + +.fa-file-text:before { + content: ""; } + +.fa-sort-alpha-asc:before { + content: ""; } + +.fa-sort-alpha-desc:before { + content: ""; } + +.fa-sort-amount-asc:before { + content: ""; } + +.fa-sort-amount-desc:before { + content: ""; } + +.fa-sort-numeric-asc:before { + content: ""; } + +.fa-sort-numeric-desc:before { + content: ""; } + +.fa-thumbs-up:before { + content: ""; } + +.fa-thumbs-down:before { + content: ""; } + +.fa-youtube-square:before { + content: ""; } + +.fa-youtube:before { + content: ""; } + +.fa-xing:before { + content: ""; } + +.fa-xing-square:before { + content: ""; } + +.fa-youtube-play:before { + content: ""; } + +.fa-dropbox:before { + content: ""; } + +.fa-stack-overflow:before { + content: ""; } + +.fa-instagram:before { + content: ""; } + +.fa-flickr:before { + content: ""; } + +.fa-adn:before { + content: ""; } + +.fa-bitbucket:before { + content: ""; } + +.fa-bitbucket-square:before { + content: ""; } + +.fa-tumblr:before { + content: ""; } + +.fa-tumblr-square:before { + content: ""; } + +.fa-long-arrow-down:before { + content: ""; } + +.fa-long-arrow-up:before { + content: ""; } + +.fa-long-arrow-left:before { + content: ""; } + +.fa-long-arrow-right:before { + content: ""; } + +.fa-apple:before { + content: ""; } + +.fa-windows:before { + content: ""; } + +.fa-android:before { + content: ""; } + +.fa-linux:before { + content: ""; } + +.fa-dribbble:before { + content: ""; } + +.fa-skype:before { + content: ""; } + +.fa-foursquare:before { + content: ""; } + +.fa-trello:before { + content: ""; } + +.fa-female:before { + content: ""; } + +.fa-male:before { + content: ""; } + +.fa-gittip:before, +.fa-gratipay:before { + content: ""; } + +.fa-sun-o:before { + content: ""; } + +.fa-moon-o:before { + content: ""; } + +.fa-archive:before { + content: ""; } + +.fa-bug:before { + content: ""; } + +.fa-vk:before { + content: ""; } + +.fa-weibo:before { + content: ""; } + +.fa-renren:before { + content: ""; } + +.fa-pagelines:before { + content: ""; } + +.fa-stack-exchange:before { + content: ""; } + +.fa-arrow-circle-o-right:before { + content: ""; } + +.fa-arrow-circle-o-left:before { + content: ""; } + +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: ""; } + +.fa-dot-circle-o:before { + content: ""; } + +.fa-wheelchair:before { + content: ""; } + +.fa-vimeo-square:before { + content: ""; } + +.fa-turkish-lira:before, +.fa-try:before { + content: ""; } + +.fa-plus-square-o:before { + content: ""; } + +.fa-space-shuttle:before { + content: ""; } + +.fa-slack:before { + content: ""; } + +.fa-envelope-square:before { + content: ""; } + +.fa-wordpress:before { + content: ""; } + +.fa-openid:before { + content: ""; } + +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: ""; } + +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: ""; } + +.fa-yahoo:before { + content: ""; } + +.fa-google:before { + content: ""; } + +.fa-reddit:before { + content: ""; } + +.fa-reddit-square:before { + content: ""; } + +.fa-stumbleupon-circle:before { + content: ""; } + +.fa-stumbleupon:before { + content: ""; } + +.fa-delicious:before { + content: ""; } + +.fa-digg:before { + content: ""; } + +.fa-pied-piper-pp:before { + content: ""; } + +.fa-pied-piper-alt:before { + content: ""; } + +.fa-drupal:before { + content: ""; } + +.fa-joomla:before { + content: ""; } + +.fa-language:before { + content: ""; } + +.fa-fax:before { + content: ""; } + +.fa-building:before { + content: ""; } + +.fa-child:before { + content: ""; } + +.fa-paw:before { + content: ""; } + +.fa-spoon:before { + content: ""; } + +.fa-cube:before { + content: ""; } + +.fa-cubes:before { + content: ""; } + +.fa-behance:before { + content: ""; } + +.fa-behance-square:before { + content: ""; } + +.fa-steam:before { + content: ""; } + +.fa-steam-square:before { + content: ""; } + +.fa-recycle:before { + content: ""; } + +.fa-automobile:before, +.fa-car:before { + content: ""; } + +.fa-cab:before, +.fa-taxi:before { + content: ""; } + +.fa-tree:before { + content: ""; } + +.fa-spotify:before { + content: ""; } + +.fa-deviantart:before { + content: ""; } + +.fa-soundcloud:before { + content: ""; } + +.fa-database:before { + content: ""; } + +.fa-file-pdf-o:before { + content: ""; } + +.fa-file-word-o:before { + content: ""; } + +.fa-file-excel-o:before { + content: ""; } + +.fa-file-powerpoint-o:before { + content: ""; } + +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: ""; } + +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: ""; } + +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: ""; } + +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: ""; } + +.fa-file-code-o:before { + content: ""; } + +.fa-vine:before { + content: ""; } + +.fa-codepen:before { + content: ""; } + +.fa-jsfiddle:before { + content: ""; } + +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: ""; } + +.fa-circle-o-notch:before { + content: ""; } + +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: ""; } + +.fa-ge:before, +.fa-empire:before { + content: ""; } + +.fa-git-square:before { + content: ""; } + +.fa-git:before { + content: ""; } + +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: ""; } + +.fa-tencent-weibo:before { + content: ""; } + +.fa-qq:before { + content: ""; } + +.fa-wechat:before, +.fa-weixin:before { + content: ""; } + +.fa-send:before, +.fa-paper-plane:before { + content: ""; } + +.fa-send-o:before, +.fa-paper-plane-o:before { + content: ""; } + +.fa-history:before { + content: ""; } + +.fa-circle-thin:before { + content: ""; } + +.fa-header:before { + content: ""; } + +.fa-paragraph:before { + content: ""; } + +.fa-sliders:before { + content: ""; } + +.fa-share-alt:before { + content: ""; } + +.fa-share-alt-square:before { + content: ""; } + +.fa-bomb:before { + content: ""; } + +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: ""; } + +.fa-tty:before { + content: ""; } + +.fa-binoculars:before { + content: ""; } + +.fa-plug:before { + content: ""; } + +.fa-slideshare:before { + content: ""; } + +.fa-twitch:before { + content: ""; } + +.fa-yelp:before { + content: ""; } + +.fa-newspaper-o:before { + content: ""; } + +.fa-wifi:before { + content: ""; } + +.fa-calculator:before { + content: ""; } + +.fa-paypal:before { + content: ""; } + +.fa-google-wallet:before { + content: ""; } + +.fa-cc-visa:before { + content: ""; } + +.fa-cc-mastercard:before { + content: ""; } + +.fa-cc-discover:before { + content: ""; } + +.fa-cc-amex:before { + content: ""; } + +.fa-cc-paypal:before { + content: ""; } + +.fa-cc-stripe:before { + content: ""; } + +.fa-bell-slash:before { + content: ""; } + +.fa-bell-slash-o:before { + content: ""; } + +.fa-trash:before { + content: ""; } + +.fa-copyright:before { + content: ""; } + +.fa-at:before { + content: ""; } + +.fa-eyedropper:before { + content: ""; } + +.fa-paint-brush:before { + content: ""; } + +.fa-birthday-cake:before { + content: ""; } + +.fa-area-chart:before { + content: ""; } + +.fa-pie-chart:before { + content: ""; } + +.fa-line-chart:before { + content: ""; } + +.fa-lastfm:before { + content: ""; } + +.fa-lastfm-square:before { + content: ""; } + +.fa-toggle-off:before { + content: ""; } + +.fa-toggle-on:before { + content: ""; } + +.fa-bicycle:before { + content: ""; } + +.fa-bus:before { + content: ""; } + +.fa-ioxhost:before { + content: ""; } + +.fa-angellist:before { + content: ""; } + +.fa-cc:before { + content: ""; } + +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: ""; } + +.fa-meanpath:before { + content: ""; } + +.fa-buysellads:before { + content: ""; } + +.fa-connectdevelop:before { + content: ""; } + +.fa-dashcube:before { + content: ""; } + +.fa-forumbee:before { + content: ""; } + +.fa-leanpub:before { + content: ""; } + +.fa-sellsy:before { + content: ""; } + +.fa-shirtsinbulk:before { + content: ""; } + +.fa-simplybuilt:before { + content: ""; } + +.fa-skyatlas:before { + content: ""; } + +.fa-cart-plus:before { + content: ""; } + +.fa-cart-arrow-down:before { + content: ""; } + +.fa-diamond:before { + content: ""; } + +.fa-ship:before { + content: ""; } + +.fa-user-secret:before { + content: ""; } + +.fa-motorcycle:before { + content: ""; } + +.fa-street-view:before { + content: ""; } + +.fa-heartbeat:before { + content: ""; } + +.fa-venus:before { + content: ""; } + +.fa-mars:before { + content: ""; } + +.fa-mercury:before { + content: ""; } + +.fa-intersex:before, +.fa-transgender:before { + content: ""; } + +.fa-transgender-alt:before { + content: ""; } + +.fa-venus-double:before { + content: ""; } + +.fa-mars-double:before { + content: ""; } + +.fa-venus-mars:before { + content: ""; } + +.fa-mars-stroke:before { + content: ""; } + +.fa-mars-stroke-v:before { + content: ""; } + +.fa-mars-stroke-h:before { + content: ""; } + +.fa-neuter:before { + content: ""; } + +.fa-genderless:before { + content: ""; } + +.fa-facebook-official:before { + content: ""; } + +.fa-pinterest-p:before { + content: ""; } + +.fa-whatsapp:before { + content: ""; } + +.fa-server:before { + content: ""; } + +.fa-user-plus:before { + content: ""; } + +.fa-user-times:before { + content: ""; } + +.fa-hotel:before, +.fa-bed:before { + content: ""; } + +.fa-viacoin:before { + content: ""; } + +.fa-train:before { + content: ""; } + +.fa-subway:before { + content: ""; } + +.fa-medium:before { + content: ""; } + +.fa-yc:before, +.fa-y-combinator:before { + content: ""; } + +.fa-optin-monster:before { + content: ""; } + +.fa-opencart:before { + content: ""; } + +.fa-expeditedssl:before { + content: ""; } + +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: ""; } + +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: ""; } + +.fa-battery-2:before, +.fa-battery-half:before { + content: ""; } + +.fa-battery-1:before, +.fa-battery-quarter:before { + content: ""; } + +.fa-battery-0:before, +.fa-battery-empty:before { + content: ""; } + +.fa-mouse-pointer:before { + content: ""; } + +.fa-i-cursor:before { + content: ""; } + +.fa-object-group:before { + content: ""; } + +.fa-object-ungroup:before { + content: ""; } + +.fa-sticky-note:before { + content: ""; } + +.fa-sticky-note-o:before { + content: ""; } + +.fa-cc-jcb:before { + content: ""; } + +.fa-cc-diners-club:before { + content: ""; } + +.fa-clone:before { + content: ""; } + +.fa-balance-scale:before { + content: ""; } + +.fa-hourglass-o:before { + content: ""; } + +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: ""; } + +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: ""; } + +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: ""; } + +.fa-hourglass:before { + content: ""; } + +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: ""; } + +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: ""; } + +.fa-hand-scissors-o:before { + content: ""; } + +.fa-hand-lizard-o:before { + content: ""; } + +.fa-hand-spock-o:before { + content: ""; } + +.fa-hand-pointer-o:before { + content: ""; } + +.fa-hand-peace-o:before { + content: ""; } + +.fa-trademark:before { + content: ""; } + +.fa-registered:before { + content: ""; } + +.fa-creative-commons:before { + content: ""; } + +.fa-gg:before { + content: ""; } + +.fa-gg-circle:before { + content: ""; } + +.fa-tripadvisor:before { + content: ""; } + +.fa-odnoklassniki:before { + content: ""; } + +.fa-odnoklassniki-square:before { + content: ""; } + +.fa-get-pocket:before { + content: ""; } + +.fa-wikipedia-w:before { + content: ""; } + +.fa-safari:before { + content: ""; } + +.fa-chrome:before { + content: ""; } + +.fa-firefox:before { + content: ""; } + +.fa-opera:before { + content: ""; } + +.fa-internet-explorer:before { + content: ""; } + +.fa-tv:before, +.fa-television:before { + content: ""; } + +.fa-contao:before { + content: ""; } + +.fa-500px:before { + content: ""; } + +.fa-amazon:before { + content: ""; } + +.fa-calendar-plus-o:before { + content: ""; } + +.fa-calendar-minus-o:before { + content: ""; } + +.fa-calendar-times-o:before { + content: ""; } + +.fa-calendar-check-o:before { + content: ""; } + +.fa-industry:before { + content: ""; } + +.fa-map-pin:before { + content: ""; } + +.fa-map-signs:before { + content: ""; } + +.fa-map-o:before { + content: ""; } + +.fa-map:before { + content: ""; } + +.fa-commenting:before { + content: ""; } + +.fa-commenting-o:before { + content: ""; } + +.fa-houzz:before { + content: ""; } + +.fa-vimeo:before { + content: ""; } + +.fa-black-tie:before { + content: ""; } + +.fa-fonticons:before { + content: ""; } + +.fa-reddit-alien:before { + content: ""; } + +.fa-edge:before { + content: ""; } + +.fa-credit-card-alt:before { + content: ""; } + +.fa-codiepie:before { + content: ""; } + +.fa-modx:before { + content: ""; } + +.fa-fort-awesome:before { + content: ""; } + +.fa-usb:before { + content: ""; } + +.fa-product-hunt:before { + content: ""; } + +.fa-mixcloud:before { + content: ""; } + +.fa-scribd:before { + content: ""; } + +.fa-pause-circle:before { + content: ""; } + +.fa-pause-circle-o:before { + content: ""; } + +.fa-stop-circle:before { + content: ""; } + +.fa-stop-circle-o:before { + content: ""; } + +.fa-shopping-bag:before { + content: ""; } + +.fa-shopping-basket:before { + content: ""; } + +.fa-hashtag:before { + content: ""; } + +.fa-bluetooth:before { + content: ""; } + +.fa-bluetooth-b:before { + content: ""; } + +.fa-percent:before { + content: ""; } + +.fa-gitlab:before { + content: ""; } + +.fa-wpbeginner:before { + content: ""; } + +.fa-wpforms:before { + content: ""; } + +.fa-envira:before { + content: ""; } + +.fa-universal-access:before { + content: ""; } + +.fa-wheelchair-alt:before { + content: ""; } + +.fa-question-circle-o:before { + content: ""; } + +.fa-blind:before { + content: ""; } + +.fa-audio-description:before { + content: ""; } + +.fa-volume-control-phone:before { + content: ""; } + +.fa-braille:before { + content: ""; } + +.fa-assistive-listening-systems:before { + content: ""; } + +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: ""; } + +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: ""; } + +.fa-glide:before { + content: ""; } + +.fa-glide-g:before { + content: ""; } + +.fa-signing:before, +.fa-sign-language:before { + content: ""; } + +.fa-low-vision:before { + content: ""; } + +.fa-viadeo:before { + content: ""; } + +.fa-viadeo-square:before { + content: ""; } + +.fa-snapchat:before { + content: ""; } + +.fa-snapchat-ghost:before { + content: ""; } + +.fa-snapchat-square:before { + content: ""; } + +.fa-pied-piper:before { + content: ""; } + +.fa-first-order:before { + content: ""; } + +.fa-yoast:before { + content: ""; } + +.fa-themeisle:before { + content: ""; } + +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: ""; } + +.fa-fa:before, +.fa-font-awesome:before { + content: ""; } + +.fa-handshake-o:before { + content: ""; } + +.fa-envelope-open:before { + content: ""; } + +.fa-envelope-open-o:before { + content: ""; } + +.fa-linode:before { + content: ""; } + +.fa-address-book:before { + content: ""; } + +.fa-address-book-o:before { + content: ""; } + +.fa-vcard:before, +.fa-address-card:before { + content: ""; } + +.fa-vcard-o:before, +.fa-address-card-o:before { + content: ""; } + +.fa-user-circle:before { + content: ""; } + +.fa-user-circle-o:before { + content: ""; } + +.fa-user-o:before { + content: ""; } + +.fa-id-badge:before { + content: ""; } + +.fa-drivers-license:before, +.fa-id-card:before { + content: ""; } + +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: ""; } + +.fa-quora:before { + content: ""; } + +.fa-free-code-camp:before { + content: ""; } + +.fa-telegram:before { + content: ""; } + +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: ""; } + +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: ""; } + +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: ""; } + +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: ""; } + +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: ""; } + +.fa-shower:before { + content: ""; } + +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: ""; } + +.fa-podcast:before { + content: ""; } + +.fa-window-maximize:before { + content: ""; } + +.fa-window-minimize:before { + content: ""; } + +.fa-window-restore:before { + content: ""; } + +.fa-times-rectangle:before, +.fa-window-close:before { + content: ""; } + +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: ""; } + +.fa-bandcamp:before { + content: ""; } + +.fa-grav:before { + content: ""; } + +.fa-etsy:before { + content: ""; } + +.fa-imdb:before { + content: ""; } + +.fa-ravelry:before { + content: ""; } + +.fa-eercast:before { + content: ""; } + +.fa-microchip:before { + content: ""; } + +.fa-snowflake-o:before { + content: ""; } + +.fa-superpowers:before { + content: ""; } + +.fa-wpexplorer:before { + content: ""; } + +.fa-meetup:before { + content: ""; } + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; } + @font-face { font-family: 'Avenir Next'; src: url("../fonts/AvenirNext-Regular.ttf") format("truetype"); font-style: normal; - font-weight: normal; -} + font-weight: normal; } @font-face { font-family: 'Avenir Next'; src: url("../fonts/AvenirNext-DemiBold.ttf") format("truetype"); font-weight: 500; - font-style: normal; -} + font-style: normal; } @font-face { font-family: 'Avenir Next'; src: url("../fonts/AvenirNext-Bold.ttf") format("truetype"); font-weight: 700; - font-style: normal; -} + font-style: normal; } + +@font-face { + font-family: 'EmojiOne'; + src: url("../fonts/emojione-svg.woff2") format("truetype"); + font-weight: 700; + font-style: normal; } + +/* Heart beat animation */ +@keyframes beat { + to { + transform: scale(0.8); } } + +html { + height: 100%; + min-height: 100%; } body { - height: auto; color: #27292a; - background: #F2F2F2; - background-image: url("../images/background/bg_tiled_dark.png"); - font-family: 'Avenir Next' !important; - font-size: 1.1rem; -} + background: #FFF; + font-family: "Avenir Next" !important; + font-size: 1rem; + height: 100%; + min-height: 100%; } + +body > div { + height: 100%; + min-height: 100%; } article, div, @@ -39,16 +2384,18 @@ h6, p, section, span { - font-family: 'Avenir Next'; -} + font-family: "Avenir Next"; } hr { - margin: 0; -} + width: 100%; + font-size: 10rem; + font-weight: bold; + border: 0; + border-bottom: 1px solid #ccc; + background: #999; } a { - outline: 0; -} + outline: 0; } svg { -webkit-touch-callout: none; @@ -62,322 +2409,390 @@ svg { -ms-user-select: none; /* Internet Explorer/Edge */ user-select: none; - /* Non-prefixed version, currently - not supported by any browser */ -} + /* Non-prefixed version, currently not supported by any browser */ } -footer { - height: 4rem; -} +.wrapper { + min-height: calc(100vh - 6.5rem); } -footer .container { - margin-top: 0; -} +footer { + font-size: 0.8rem; + background-color: #313334; + height: 6.5rem; + clear: both; + overflow: hidden; } + footer section { + margin-bottom: 0; + padding-top: 1.2rem; + padding-bottom: 1.2rem; + color: #DDD; } + footer a { + color: #DDD; + font-weight: normal; } + footer a:hover { + color: #DDD !important; + text-decoration: underline; } + footer .footer-col { + padding: 0 5rem; + height: 8rem; } + footer .footer-col > div { + padding: 0 1.2rem; } + footer ul { + list-style-type: none; } + footer h1 { + font-size: 1rem; + color: #888; + text-align: left; + text-transform: uppercase; } + footer form { + margin-top: 1rem; } + footer form input[type=text] { + font-size: 0.8rem; + height: 1.8rem; + background-color: #1C1D1D; + border: none; + padding-left: 0.8rem; + -webkit-border-top-left-radius: 0.9rem; + -webkit-border-bottom-left-radius: 0.9rem; + -moz-border-radius-topleft: 0.9rem; + -moz-border-radius-bottomleft: 0.9rem; + border-top-left-radius: 0.9rem; + border-bottom-left-radius: 0.9rem; } + footer form input[type=text]:focus { + box-shadow: none; + background-color: #888; } + footer form input[type=text]:focus::-webkit-input-placeholder { + color: #313334; } + footer form input[type=text]:focus:-moz-placeholder { + color: #313334; } + footer form input[type=text]:focus::-moz-placeholder { + color: #313334; } + footer form input[type=text]:focus:-ms-input-placeholder { + color: #313334; } + footer form .button { + background-color: #1C1D1D; + color: #DDD; + font-size: 1rem; + height: 1.8rem; + padding: 0.3rem 0.8rem 0.3rem 0.5rem; + -webkit-border-top-right-radius: 0.9rem; + -webkit-border-bottom-right-radius: 0.9rem; + -moz-border-radius-topright: 0.9rem; + -moz-border-radius-bottomright: 0.9rem; + border-top-right-radius: 0.9rem; + border-bottom-right-radius: 0.9rem; } + footer form .button:hover { + color: #fff; + background-color: #FF517E; } + footer .logo { + margin: 0; + width: 100%; + max-width: 100%; + background-color: #1C1D1D; + text-align: center; + padding: 1rem; + color: #666; + font-size: 0.8rem; } + footer .logo img { + max-width: 3.5rem; + margin-bottom: 0.5rem; } -footer img { - display: block; - width: 8rem; - margin: 0.5rem auto; - opacity: 0.75; -} +h1, +h2 { + text-transform: uppercase; } h1 { - font-size: 3rem; + font-size: 2rem; text-align: center; font-weight: bold; - color: #6e00ff; -} + color: #313334; } h2 { + text-align: left; margin: 0.5rem 0; font-size: 2rem; font-weight: bold; - color: #27292a; -} + color: #313334; } h3 { font-size: 1.2rem; - font-weight: bold; -} + font-weight: bold; } img { margin-left: auto; margin-right: auto; - padding: 0; -} + padding: 0; } + +section { + margin: 0 auto 4rem; } article { padding: 1rem; margin: 0 auto; - text-align: justify; -} + text-align: justify; } p { - padding: 0 1rem; - margin: 0.5rem 0; -} + padding: 0; + margin: 0.5rem 0; } a { text-decoration: none; font-weight: bold; - color: #27292a; - outline: medium none !important; -} - -a:active, a:focus, a:hover { - text-decoration: none; - color: #15e678 !important; -} - -a:visited { - text-decoration: none; -} + color: #27292a; } fieldset legend { background-color: transparent; -} + margin: 0; } + +fieldset { + margin-top: 1rem !important; + padding: 0 0.5rem; } + +.tabs { + width: 100% !important; + max-width: 100% !important; } + .tabs .tab-title > a { + padding: 1rem; } + +.tabs-content .content { + padding-top: 0; } .nav { - width: 100%; -} + width: 100%; } + .nav img { + float: left; } + .nav ul { + float: right; } + .nav ul li { + float: left; + margin: 1rem; + list-style-type: none; } + .nav ul li a, + .nav ul li a:visited { + font-size: 1rem; + font-weight: bold; + text-decoration: none; + text-transform: uppercase; + color: #FFF; } -.nav img { - float: left; -} +.row { + max-width: 75rem; } -.nav ul { - float: right; -} +.background_green { + background-color: #00E58B !important; } -.nav ul li { - float: left; - margin: 1rem; - list-style-type: none; -} +.background_blue { + background-color: #0095FF !important; } -.nav ul li a, -.nav ul li a:visited { - font-size: 1rem; - font-weight: bold; - text-decoration: none; - text-transform: uppercase; - color: #FFF; -} +.background_orange { + background-color: #FFAF19 !important; } -.row { - max-width: 75rem; -} +.background_red { + background-color: #FF517E !important; } -.active, -.active:visited { - text-decoration: none; - color: #15e678 !important; -} +.background_yellow { + background-color: #FFF222 !important; } + +.background_gray_light { + background-color: #C7C8C9 !important; } + +.background_gray_dark { + background-color: #313334 !important; } .color_green { - color: #15e678; -} + color: #00E58B; } .color_blue { - color: #36c9ff; -} + color: #0095FF; } .color_orange { - color: #ffaf19; -} + color: #FFAF19; } .color_red { - color: #ff517e; -} - -.color_purple { - color: #6e00ff; -} + color: #FF517E; } .color_yellow { - color: #fff000; -} + color: #FFF222; } .color_gray_light { - color: #F2F2F2; - background-color: #27292a; -} + color: #C7C8C9; + background-color: #313334; } .color_gray_light h1 { - color: #F2F2F2; -} + color: #C7C8C9; } .color_gray_light a { - color: #F2F2F2; -} + color: #C7C8C9; } .color_gray_dark { - color: #27292a; -} + color: #313334; } .color_white { - color: #FFF; -} + color: #FFF; } .text_caps { - text-transform: uppercase; -} + text-transform: uppercase; } .text_center { text-align: center; - vertical-align: middle; -} + vertical-align: middle; } .box_center { float: none; margin-left: auto; - margin-right: auto; -} + margin-right: auto; } .side_right { float: right; - text-align: right; -} + text-align: right; } .full_width { - max-width: 100%; -} + max-width: 100%; } .full_width * { max-width: 75rem; margin-left: auto; - margin-right: auto; -} + margin-right: auto; } .nopadding { - padding: 0; -} + padding: 0; } .circle { -webkit-border-radius: 50%; -moz-border-radius: 50%; - border-radius: 50%; -} + border-radius: 50%; } .rectangle { -webkit-border-radius: 1rem; -moz-border-radius: 1rem; - border-radius: 1rem; -} + border-radius: 1rem; } .btn { - font-size: 1rem; - padding: 0.5rem 2rem; - height: 2.3125rem; - background-color: #6e00ff; - color: #F2F2F2; + font-size: 1.5rem; + padding: 0.5rem 1.5rem; + background-color: #0095FF; + color: #C7C8C9; font-weight: bold; -} - -.col-md-1, -.col-md-10, -.col-md-11, -.col-md-12, -.col-md-2, -.col-md-3, -.col-md-4, -.col-md-5, -.col-md-6, -.col-md-7, -.col-md-8, -.col-md-9 { - float: none; - margin-left: auto; - margin-right: auto; -} + -webkit-border-radius: 0.7rem; + -moz-border-radius: 0.7rem; + border-radius: 0.7rem; + white-space: nowrap; + overflow: hidden; } + +.online { + color: #00E58B; } -.columns + .columns:last-child { - float: left; -} +.offline { + color: #FF517E; } + +#header_main { + position: fixed; + top: 0; + left: 0; + overflow: hidden; + width: 100%; + height: 3.5rem; + padding: 0 1rem; + background-color: #313334; + z-index: 9; } + #header_main nav .logo { + width: 2.5rem; + height: 2rem; + margin: 0.75rem 0.75rem 0.75rem 0; + display: inline-block; + background-image: url("../images/logo/opsoro_icon_light.png"); + background-size: cover; } + #header_main nav a.active, + #header_main nav a.active:visited { + border-bottom: 2px solid; } + +#header_main.on-top { + background: none; } + #header_main.on-top nav ul li a { + color: #313334; } + #header_main.on-top nav .logo { + background-image: url("../images/logo/opsoro_icon_dark.png"); } #header_play { position: relative; - top: 0; + top: 0.8rem; overflow: hidden; max-width: 75rem; - margin-left: auto; - margin-right: auto; - background-color: #FFF; - color: #27292a; - padding: 0 0.7rem; - border-bottom-left-radius: 1rem; - border-bottom-right-radius: 1rem; - -webkit-box-shadow: 2px 2px 3px 1px rgba(0, 0, 0, 0.75); - -moz-box-shadow: 2px 2px 3px 1px rgba(0, 0, 0, 0.75); - box-shadow: 2px 2px 3px 1px rgba(0, 0, 0, 0.75); -} - -#header_play div { - float: left; - padding: 0; -} - -#header_play i { - float: left; -} - -#header_play p { - float: left; - padding: 0; -} - -#header_play .side_right { - float: right; -} - -#header_play .text_center { - float: none; - margin-left: auto; - margin-right: auto; - width: 10rem; -} - -#header_play ul { - text-align: center; - margin: 0; -} - -#header_play ul li { - margin: 0; -} - -#header_play i { - margin: 0.5rem 0.5rem 0 0; - font-size: 3.3rem; -} - -#header_play #status { - text-transform: uppercase; - font-weight: bold; -} - -#header_play #comment i { - margin: 0.2rem 0.2rem 0 0; - font-size: 1.1rem; -} - -#header_play a { - margin: 0; - padding: 0; - color: #27292a; -} - -#header_play a i { - margin: 1rem 0 0.5rem 1rem; - font-size: 2.3rem; -} - -#header_play .status { - margin: 0.5rem 0; -} - -.sidebar_left, -.sidebar_right { + height: 4rem; + margin: 0 auto 1rem; + background-color: #F2F2F2; + color: #313334; + padding: 0.2rem 1.4rem 0; + z-index: 9; + -webkit-border-radius: 2.5rem; + -moz-border-radius: 2.5rem; + border-radius: 2.5rem; } + #header_play div { + padding: 0; } + #header_play .icon { + float: left; } + #header_play p { + line-height: normal; + float: left; + padding: 0; } + #header_play input[type=text] { + font-weight: bold; + font-size: 1rem; + height: 2.6rem; + background-color: #FFF; + border: none; + padding-left: 1rem; + margin-top: 0.5rem; + color: #313334; + -webkit-border-radius: 1.3rem; + -moz-border-radius: 1.3rem; + border-radius: 1.3rem; } + #header_play input[type=text]::-webkit-input-placeholder { + color: #313334; } + #header_play input[type=text]:-moz-placeholder { + color: #313334; } + #header_play input[type=text]::-moz-placeholder { + color: #313334; } + #header_play input[type=text]:-ms-input-placeholder { + color: #313334; } + #header_play input[type=text]:focus { + box-shadow: none; + background-color: #C7C8C9; } + #header_play input[type=text]:focus::-webkit-input-placeholder { + color: #313334; } + #header_play input[type=text]:focus:-moz-placeholder { + color: #313334; } + #header_play input[type=text]:focus::-moz-placeholder { + color: #313334; } + #header_play input[type=text]:focus:-ms-input-placeholder { + color: #313334; } + #header_play ul { + text-align: center; + margin: 0; } + #header_play ul li { + margin: 0; } + #header_play .icon { + margin: 0.6rem 0.5rem 0 0; + font-size: 2.4rem; } + #header_play #status { + text-transform: uppercase; + font-weight: bold; } + #header_play #comment .icon { + margin: 0.1rem 0.2rem 0 0; + font-size: 1.1rem; } + #header_play a { + margin: 0; + padding: 0; + color: #313334; } + #header_play a .icon { + margin: 0.6rem 0 0.5rem 1rem; + font-size: 2.3rem; } + #header_play a:hover { + color: #000; } + #header_play .status { + margin: 0.5rem 0; } + +.sidebar-left, +.sidebar-right { position: fixed; /*padding-top: 1rem;*/ z-index: 8; @@ -397,18 +2812,14 @@ fieldset legend { /*background-color: #fff;*/ -webkit-box-shadow: 0 0 3px 1px; -moz-box-shadow: 0 0 3px 1px; - box-shadow: 0 0 3px 1px; -} - -.sidebar_left:empty, -.sidebar_right:empty { - display: none; -} + box-shadow: 0 0 3px 1px; } + .sidebar-left:empty, + .sidebar-right:empty { + display: none; } .sidebar_right { right: 0; - left: auto; -} + left: auto; } .container { position: relative; @@ -416,8 +2827,7 @@ fieldset legend { margin-top: 0.5rem; margin-right: auto; margin-left: auto; - padding: 0; -} + padding: 0 1rem; } .announcements { position: fixed; @@ -428,8 +2838,7 @@ fieldset legend { display: block; width: 100%; /*padding-top: 1rem;*/ - text-align: center; -} + text-align: center; } .announcement { position: relative; @@ -451,248 +2860,263 @@ fieldset legend { background-color: #333; -webkit-box-shadow: 0 0 3px 1px; -moz-box-shadow: 0 0 3px 1px; - box-shadow: 0 0 3px 1px; -} - -.announcement .btn { - font-size: 2rem; - position: absolute; - top: 0; - right: 0; - display: block; - width: 2.75rem; - height: 2.75rem; - padding: 0; - color: #fff; - border-style: none; - background-color: transparent; -} - -.announcement .btn:active, .announcement .btn:hover { - font-size: 2.1rem; - color: #fff; - border-style: none; - background-color: transparent; -} + box-shadow: 0 0 3px 1px; } + .announcement .btn { + font-size: 2rem; + position: absolute; + top: 0; + right: 0; + display: block; + width: 2.75rem; + height: 2.75rem; + padding: 0; + color: #fff; + border-style: none; + background-color: transparent; } + .announcement .btn:active, .announcement .btn:hover { + font-size: 2.1rem; + color: #fff; + border-style: none; + background-color: transparent; } .apps { max-width: 100%; margin-right: auto; margin-left: auto; - padding: 0; -} - -.apps .app_container { - margin: 0 auto 1rem; -} - -.apps .app_container a { - float: none; - color: #27292a; -} - -.apps .app_container a:hover { - text-decoration: none; - color: #27292a !important; -} - -.apps .app_container a:hover .app_icon { - font-size: 5.5rem; - margin: 1.75rem auto; -} - -.apps .app_container .app_button { - position: relative; - display: block; - overflow: hidden; - width: 9rem; - height: 9rem; - margin: 0.5rem auto; - text-align: center; - vertical-align: middle; - opacity: 1; - background-color: #FFF; - border-radius: 0.8rem; - -webkit-box-shadow: 2px 2px 3px 1px rgba(0, 0, 0, 0.75); - -moz-box-shadow: 2px 2px 3px 1px rgba(0, 0, 0, 0.75); - box-shadow: 2px 2px 3px 1px rgba(0, 0, 0, 0.75); -} - -.apps .app_container .app_button .app_icon { - font: normal normal normal 14px/1 FontAwesome; - font-size: 5rem; - display: inline-block; - width: 100%; - margin: 2rem auto; -} - -.apps .app_container .app_button .app_banner { + padding: 0; } + .apps .app-category { + position: relative; + margin: 2rem 1rem; + display: block; + width: 100%; } + .apps .app-category h3 { + margin: 1rem 0 0; + font-size: 1.3rem; } + .apps .app-container { + position: relative; + display: inline-block; + overflow: hidden; + padding: 0; + margin: .8rem .8rem 0 0; } + .apps .app-container .app-button { + margin: 0; + text-align: left; + width: 11rem; + height: 11rem; + padding: 3.8rem 1rem 1rem; + background-color: #313334; + -webkit-border-radius: 0.7rem; + -moz-border-radius: 0.7rem; + border-radius: 0.7rem; + vertical-align: text-bottom; } + .apps .app-container .app-button:hover { + text-decoration: none; } + .apps .app-container .app-button:hover .app-icon { + font-size: 2.5rem; + right: .95rem; + top: .95rem; } + .apps .app-container .app-button .app-icon { + position: absolute; + right: 1.2rem; + top: 1.2rem; + text-align: right; + color: #FFF !important; + font: normal normal normal 14px/1 FontAwesome; + font-size: 2rem; + display: block; + height: 3rem; + padding: 0; + margin: 0; } + .apps .app-container .app-button .app-label { + display: table-cell; + width: 100%; + height: 4rem; + color: #FFF; + font-size: 1.2rem; + font-weight: bold; + text-align: left; + line-height: 2rem; + overflow: hidden; + vertical-align: bottom; } + .apps .app-container .app-button .app-banner { + position: absolute; + display: inline-block; + bottom: 0rem; + left: 0rem; + padding: 0 .7rem; + background-color: rgba(0, 0, 0, 0.15); + color: #FFF; + width: 100%; + height: 2.3rem; + -webkit-border-bottom-left-radius: 0.7rem; + -webkit-border-bottom-right-radius: 0.7rem; + -moz-border-radius-bottomleft: 0.7rem; + -moz-border-radius-bottomright: 0.7rem; + border-bottom-left-radius: 0.7rem; + border-bottom-right-radius: 0.7rem; + font-size: .7rem; + font-weight: normal; } + .apps .app-container .app-button .app-banner .app-beat { + animation: beat 0.5s infinite alternate; + transform-origin: center; } + .apps .app-container .app-button .app-banner .app-opsoro { + display: inline-block; + width: 2.1rem; + height: 1.8rem; + margin: .25rem 0; } + .apps .app-container .app-button .app-banner .app-by { + display: inline-block; + margin: .8rem 0; } + .apps .app-container .app-button .app-banner .app-author { + font-weight: bold; + display: inline-block; + margin: .8rem 0; } + .apps .app-container .app-button .app-banner .app-status { + display: inline-block; + float: right; + margin: .65rem 0; } + .apps .app-container .app-button .app-banner .app-status * { + display: inline-block; + vertical-align: middle; + font: normal normal normal 14px/1 FontAwesome; + font-size: 1rem; } + +.reveal { position: absolute; - display: block; - bottom: 0; left: 0; - width: 100%; - height: 1rem; -} - -.apps .app_container .app_label { - font-size: 1.2rem; - font-weight: normal; - overflow: hidden; - width: 100%; - text-align: center; -} - -.reveal-modal { - position: absolute; + right: 0; top: 1rem; - right: 1rem; - left: 1rem; margin-right: auto; margin-left: auto; padding: 0; color: #4d4d4d; border: 0; border-radius: 0.75rem; - background: #fff; - -webkit-box-shadow: 0.5rem 0.5rem 0 0 rgba(50, 50, 50, 0.75); - -moz-box-shadow: 0.5rem 0.5rem 0 0 rgba(50, 50, 50, 0.75); - box-shadow: 0.5rem 0.5rem 0 0 rgba(50, 50, 50, 0.75); -} - -.reveal-modal .titlebar { - font-size: 2rem; - font-weight: bold; - position: relative; - padding: 0.5rem; - text-align: center; - color: #fff; - border-bottom: 0.25rem solid #545454; - -webkit-border-top-left-radius: 0.5rem; - -moz-border-radius-topleft: 0.5rem; - border-top-left-radius: 0.5rem; - -webkit-border-top-right-radius: 0.5rem; - -moz-border-radius-topright: 0.5rem; - border-top-right-radius: 0.5rem; - background: #b2afa1; -} - -.reveal-modal .titlebar.red { - border-bottom: 0.25rem solid #79261d; - background: #b2382a; -} - -.reveal-modal .titlebar.green { - border-bottom: 0.25rem solid #26791d; - background: #38b22a; -} - -.reveal-modal .content { - padding: 1rem; -} - -.reveal-modal .close-reveal { - font-size: 2rem; - font-weight: normal; - position: absolute; - top: 1rem; - right: auto; - left: 1rem; - cursor: pointer; - color: #fff; -} - -.reveal-modal .close-reveal:hover { - font-size: 2.5rem; - top: 0.75rem; - left: 0.75rem; -} - -.reveal-modal .btnClose { - font-size: 2rem; - font-weight: normal; - position: absolute; - top: 0.5rem; - right: auto; - left: 1rem; - cursor: pointer; - color: #fff; -} - -.reveal-modal .btnClose:hover { - font-size: 2.5rem; - top: 0.25rem; - left: 0.75rem; -} + -webkit-border-radius: 0.7rem; + -moz-border-radius: 0.7rem; + border-radius: 0.7rem; + background: #FFF; + -webkit-box-shadow: 0px 1px 4px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0px 1px 4px 2px rgba(0, 0, 0, 0.1); + box-shadow: 0px 1px 4px 2px rgba(0, 0, 0, 0.1); } + .reveal .titlebar { + font-size: 1.5rem; + font-weight: bold; + position: relative; + padding: 0.5rem; + text-align: center; + color: #313334; + background: #FFF; } + .reveal .titlebar.red { + border-bottom: 0.25rem solid #79261d; + background: #FF517E; } + .reveal .titlebar.green { + border-bottom: 0.25rem solid #26791d; + background: #22774D; } + .reveal .content { + padding: 1rem; } + .reveal .close-button { + font-size: 2rem; + font-weight: normal; + position: absolute; + top: 0.5rem; + right: 1rem; + cursor: pointer; + color: #313334; } + .reveal .close-button:hover { + font-size: 2.5rem; + top: 0.25rem; + right: 0.75rem; } + .reveal .big-button { + width: 7rem; + height: 7rem; + background-color: #313334; + -webkit-border-radius: 0.7rem; + -moz-border-radius: 0.7rem; + border-radius: 0.7rem; } + .reveal .big-button .icon { + color: #FFF !important; + font: normal normal normal 14px/1 FontAwesome; + font-size: 3rem; + display: inline-block; + width: 100%; + margin: 0.5rem auto; } + .reveal .big-button .text { + color: #FFF; + font-weight: normal; + overflow: hidden; + width: 100%; + text-align: center; } + .reveal .big-button:hover { + text-decoration: underline; + color: #FFF !important; } + .reveal .big-button:hover .app-icon { + color: #FFF !important; + font-size: 4rem; + margin: 0 auto; } .float_right { - float: right; -} + float: right; } .actionbar { min-height: 4rem; - margin: -.5rem 0 1rem; - padding: 0.5rem 1rem; - background: #23774e; - border-radius: 0.5rem; -} - -.actionbar .action { - display: inline-block; - min-width: 3rem; - padding: 0 0.5rem; - text-align: center; - color: #fff; - -webkit-border-radius: 0.25rem; - -moz-border-radius: 0.25rem; - border-radius: 0.25rem; -} - -.actionbar .action .text { - font-size: 0.75rem; - font-weight: bold; - text-transform: uppercase; -} - -.actionbar .action.active, -.actionbar .action:hover { - color: #4d4d4d; - background: #fff; -} - -.actionbar .spacer { - display: inline-block; - width: 2rem; -} - -.actionbar .filebox { - display: inline-block; - overflow: hidden; - min-width: 7rem; - max-width: 20rem; - white-space: nowrap; - text-overflow: ellipsis; - color: #fff; -} - -.actionbar .filebox .filename { - font-weight: bold; - text-transform: uppercase; -} - -.actionbar .filebox .status { - font-size: 0.75rem; - font-weight: bold; - text-transform: uppercase; -} - -.actionbar:empty { - display: none; -} + margin: 0 -1rem 1rem; + padding: 0.5rem 1.5rem 0.3rem; + color: #FFF; + background: #DDD; + -webkit-border-radius: 2.5rem; + -moz-border-radius: 2.5rem; + border-radius: 2.5rem; } + .actionbar .action { + display: inline-block; + min-width: 3rem; + padding: 0 0.5rem; + text-align: center; + color: #FFF; + float: right; + -webkit-border-radius: 0.25rem; + -moz-border-radius: 0.25rem; + border-radius: 0.25rem; } + .actionbar .action .text { + color: #FFF; + font-size: 0.75rem; + font-weight: bold; + text-transform: uppercase; } + .actionbar .action.active, + .actionbar .action:hover { + color: #F2F2F2; } + .actionbar .icon { + color: #FFF; + vertical-align: top; + display: inline-block; + font-size: 3rem; + margin: 0 0.8rem 0 0; } + .actionbar .spacer { + display: inline-block; + width: 2rem; + float: right; + margin: 0; + padding: 0.5rem; } + .actionbar .filebox { + display: inline-block; + overflow: hidden; + min-width: 7rem; + max-width: 20rem; + white-space: nowrap; + text-overflow: ellipsis; + color: #FFF; } + .actionbar .filebox .filename { + font-weight: bold; + text-transform: uppercase; } + .actionbar .filebox .status { + font-size: 0.75rem; + font-weight: bold; + text-transform: uppercase; } + .actionbar:empty { + display: none; } .contentwrapper * { - font: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace !important; -} + font: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace !important; } .fullscreen { position: fixed; @@ -700,121 +3124,143 @@ fieldset legend { left: 0; width: 100vw; height: 100vh; - background-color: #F2F2F2; + background-color: #C7C8C9; padding: 0; margin: 0; - z-index: 9; -} - -.fullscreen .contentwrapper { - height: calc(100vh - 4rem - 4.15rem); -} - -.fullscreen .console { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.fullscreen .actionbar { - margin: 0; - border-radius: 0; -} - -.fullscreen .container { - margin: 0; - padding: 0; - max-width: 100%; - width: 100%; - height: 100%; -} + z-index: 9; } + .fullscreen .contentwrapper { + height: calc(100vh - 4rem - 4.15rem); } + .fullscreen .console { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + .fullscreen .actionbar { + margin: 0; + border-radius: 0; } + .fullscreen .container { + margin: 0; + padding: 0; + max-width: 100%; + width: 100%; + height: 100%; } .filebrowser { position: fixed; - /*top: 5rem;*/ - right: 1rem; bottom: 3rem; - left: 1rem; -} - -.filebrowser .content { - position: absolute; - top: 4rem; - bottom: 0; - width: 100%; -} + -webkit-touch-callout: none; + /* iOS Safari */ + -webkit-user-select: none; + /* Chrome/Safari/Opera */ + -khtml-user-select: none; + /* Konqueror */ + -moz-user-select: none; + /* Firefox */ + -ms-user-select: none; + /* Internet Explorer/Edge */ + user-select: none; + /* Non-prefixed version, currently not supported by any browser */ } + .filebrowser .content { + position: absolute; + top: 4rem; + bottom: 0; + width: 100%; + padding: 0; } + .filebrowser .actionbar .actionBarItem { + position: relative; + float: left; + min-width: 4rem; } + .filebrowser .foldercontent { + position: absolute; + top: 0.5rem; + bottom: 0.5rem; + left: 0; + overflow-x: hidden; + overflow-y: scroll; + width: 100%; + padding: 0 1rem 1rem; } + .filebrowser .foldercontent .browseritem { + width: 100%; + text-align: left; + margin: 0; + padding: 0.2rem 1rem; + border-radius: 0.25rem; + background-color: #FFF; + color: #1C1D1D; + overflow-x: hidden; + white-space: nowrap; } + .filebrowser .foldercontent .browseritem:hover .browseritemname { + color: #00E58B; } + .filebrowser .foldercontent .browseritem:hover .browseritemoptions { + opacity: 1; } + .filebrowser .foldercontent .browseritem .icon { + vertical-align: middle; + color: #00E58B; + font-size: 1.5rem; } + .filebrowser .foldercontent .browseritem .browseritemname { + color: #313334; + font-size: 1rem; + font-weight: bold; + margin-left: 1rem; + overflow-x: hidden; } + .filebrowser .foldercontent .browseritem .browseritemoptions { + float: right; + padding: 0.15rem; + -webkit-transition: opacity 0.1s ease-in-out; + -moz-transition: opacity 0.1s ease-in-out; + transition: opacity 0.1s ease-in-out; + opacity: 0; } + .filebrowser .foldercontent .browseritem .browseritemoptions .button { + color: #C7C8C9; + background-color: transparent; + margin: 0; + padding: 0; + font-size: 1rem; } + .filebrowser .foldercontent .browseritem .browseritemoptions .button:hover { + color: #000; } -.filebrowser .actionbar .actionBarItem { +#message_popup .content .buttons { position: relative; - float: left; - min-width: 4rem; -} - -.filebrowser .foldercontent { - position: absolute; - top: 4.5rem; - bottom: 0.5rem; - left: 0; - overflow-x: hidden; - overflow-y: scroll; - width: 100%; - padding: 0 3rem 3rem; -} - -.filebrowser .foldercontent .button { - font-size: 1.5rem; - width: 5rem; - margin-left: 0.5rem; - padding: 0; -} - -.filebrowser .foldercontent .alert { - width: 2.5rem; -} - -.filebrowser .foldercontent .browseritem { - width: 100%; - min-height: 2rem; - margin: 0.1rem; - padding: 0.2rem; - border-radius: 0.25rem; -} + text-align: center; } + #message_popup .content .buttons .button { + margin-right: 1rem; + margin-left: 1rem; } -.filebrowser .foldercontent .browseritem:hover { - background-color: #f2f2f2; -} +.clickedit span { + font-size: 1.4rem; } -.filebrowser .foldercontent .browseritem:hover .browseritemoptions { - opacity: 1; -} - -.filebrowser .foldercontent .browseritem a { - margin: 0; -} - -.filebrowser .foldercontent .browseritem .browseritemname { - font-size: 1.5rem; - font-weight: bold; - margin-left: 2rem; -} +.clickedit span.fa-pencil { + margin-left: 0.2rem; + display: none; + color: #888; } -.filebrowser .foldercontent .browseritem .browseritemoptions { - float: right; - padding: 0.15rem; -} +.clickedit input { + height: 2.1rem; } -.filebrowser .foldercontent .browseritem .browseritemoptions { - -webkit-transition: opacity 0.1s ease-in-out; - -moz-transition: opacity 0.1s ease-in-out; - transition: opacity 0.1s ease-in-out; - opacity: 0; -} +.clickedit:hover span.fa-pencil { + display: inline; } -#message_popup .content .buttons { - position: relative; +.emoji { + font-family: 'EmojiOne' !important; + font-size: 3rem; text-align: center; -} - -#message_popup .content .buttons .button { - margin-right: 1rem; - margin-left: 1rem; -} + display: inline-block; + background-image: url("/static/images/emoji_background.png"); + background-size: contain; + background-repeat: no-repeat; + line-height: 1; } + +.draggable { + cursor: move; } + +.selected_module path, +.selected_module rect { + stroke: #FFCE39 !important; } + +.slider .slider-handle { + background-color: #0095FF; } + +.button { + background-color: #0095FF; } + .button.alert { + background-color: #FF517E; } + .button.success { + background-color: #00E58B; } diff --git a/src/opsoro/server/static/css/opsoro.min.css b/src/opsoro/server/static/css/opsoro.min.css index d65551a..ed62f87 100644 --- a/src/opsoro/server/static/css/opsoro.min.css +++ b/src/opsoro/server/static/css/opsoro.min.css @@ -1 +1,4 @@ -@font-face{font-family:'Avenir Next';src:url("../fonts/AvenirNext-Regular.ttf") format("truetype");font-style:normal;font-weight:normal}@font-face{font-family:'Avenir Next';src:url("../fonts/AvenirNext-DemiBold.ttf") format("truetype");font-weight:500;font-style:normal}@font-face{font-family:'Avenir Next';src:url("../fonts/AvenirNext-Bold.ttf") format("truetype");font-weight:700;font-style:normal}body{height:auto;color:#27292a;background:#F2F2F2;background-image:url("../images/background/bg_tiled_dark.png");font-family:'Avenir Next' !important;font-size:1.1rem}article,div,h1,h2,h3,h4,h5,h6,p,section,span{font-family:'Avenir Next'}hr{margin:0}a{outline:0}svg{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}footer{height:4rem}footer .container{margin-top:0}footer img{display:block;width:8rem;margin:0.5rem auto;opacity:0.75}h1{font-size:3rem;text-align:center;font-weight:bold;color:#6e00ff}h2{margin:0.5rem 0;font-size:2rem;font-weight:bold;color:#27292a}h3{font-size:1.2rem;font-weight:bold}img{margin-left:auto;margin-right:auto;padding:0}article{padding:1rem;margin:0 auto;text-align:justify}p{padding:0 1rem;margin:0.5rem 0}a{text-decoration:none;font-weight:bold;color:#27292a;outline:medium none !important}a:active,a:focus,a:hover{text-decoration:none;color:#15e678 !important}a:visited{text-decoration:none}fieldset legend{background-color:transparent}.nav{width:100%}.nav img{float:left}.nav ul{float:right}.nav ul li{float:left;margin:1rem;list-style-type:none}.nav ul li a,.nav ul li a:visited{font-size:1rem;font-weight:bold;text-decoration:none;text-transform:uppercase;color:#fff}.row{max-width:75rem}.active,.active:visited{text-decoration:none;color:#15e678 !important}.color_green{color:#15e678}.color_blue{color:#36c9ff}.color_orange{color:#ffaf19}.color_red{color:#ff517e}.color_purple{color:#6e00ff}.color_yellow{color:#fff000}.color_gray_light{color:#F2F2F2;background-color:#27292a}.color_gray_light h1{color:#F2F2F2}.color_gray_light a{color:#F2F2F2}.color_gray_dark{color:#27292a}.color_white{color:#fff}.text_caps{text-transform:uppercase}.text_center{text-align:center;vertical-align:middle}.box_center{float:none;margin-left:auto;margin-right:auto}.side_right{float:right;text-align:right}.full_width{max-width:100%}.full_width *{max-width:75rem;margin-left:auto;margin-right:auto}.nopadding{padding:0}.circle{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%}.rectangle{-webkit-border-radius:1rem;-moz-border-radius:1rem;border-radius:1rem}.btn{font-size:1rem;padding:0.5rem 2rem;height:2.3125rem;background-color:#6e00ff;color:#F2F2F2;font-weight:bold}.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:none;margin-left:auto;margin-right:auto}.columns+.columns:last-child{float:left}#header_play{position:relative;top:0;overflow:hidden;max-width:75rem;margin-left:auto;margin-right:auto;background-color:#fff;color:#27292a;padding:0 0.7rem;border-bottom-left-radius:1rem;border-bottom-right-radius:1rem;-webkit-box-shadow:2px 2px 3px 1px rgba(0,0,0,0.75);-moz-box-shadow:2px 2px 3px 1px rgba(0,0,0,0.75);box-shadow:2px 2px 3px 1px rgba(0,0,0,0.75)}#header_play div{float:left;padding:0}#header_play i{float:left}#header_play p{float:left;padding:0}#header_play .side_right{float:right}#header_play .text_center{float:none;margin-left:auto;margin-right:auto;width:10rem}#header_play ul{text-align:center;margin:0}#header_play ul li{margin:0}#header_play i{margin:0.5rem 0.5rem 0 0;font-size:3.3rem}#header_play #status{text-transform:uppercase;font-weight:bold}#header_play #comment i{margin:0.2rem 0.2rem 0 0;font-size:1.1rem}#header_play a{margin:0;padding:0;color:#27292a}#header_play a i{margin:1rem 0 0.5rem 1rem;font-size:2.3rem}#header_play .status{margin:0.5rem 0}.sidebar_left,.sidebar_right{position:fixed;z-index:8;top:50px;bottom:0;left:0;display:block;overflow:visible;overflow:auto;max-width:13rem;padding:1rem;color:#000;background-color:rgba(255,255,255,0.5);-webkit-box-shadow:0 0 3px 1px;-moz-box-shadow:0 0 3px 1px;box-shadow:0 0 3px 1px}.sidebar_left:empty,.sidebar_right:empty{display:none}.sidebar_right{right:0;left:auto}.container{position:relative;max-width:75rem;margin-top:0.5rem;margin-right:auto;margin-left:auto;padding:0}.announcements{position:fixed;z-index:10;right:0;bottom:0;left:0;display:block;width:100%;text-align:center}.announcement{position:relative;max-width:40rem;margin-top:1rem;margin-right:auto;margin-left:auto;padding:0.75rem;text-align:center;-webkit-border-top-left-radius:0.8rem;-moz-border-radius-topleft:0.8rem;border-top-left-radius:0.8rem;-webkit-border-top-right-radius:0.8rem;-moz-border-radius-topright:0.8rem;border-top-right-radius:0.8rem;color:#fff;background-color:#333;-webkit-box-shadow:0 0 3px 1px;-moz-box-shadow:0 0 3px 1px;box-shadow:0 0 3px 1px}.announcement .btn{font-size:2rem;position:absolute;top:0;right:0;display:block;width:2.75rem;height:2.75rem;padding:0;color:#fff;border-style:none;background-color:transparent}.announcement .btn:active,.announcement .btn:hover{font-size:2.1rem;color:#fff;border-style:none;background-color:transparent}.apps{max-width:100%;margin-right:auto;margin-left:auto;padding:0}.apps .app_container{margin:0 auto 1rem}.apps .app_container a{float:none;color:#27292a}.apps .app_container a:hover{text-decoration:none;color:#27292a !important}.apps .app_container a:hover .app_icon{font-size:5.5rem;margin:1.75rem auto}.apps .app_container .app_button{position:relative;display:block;overflow:hidden;width:9rem;height:9rem;margin:0.5rem auto;text-align:center;vertical-align:middle;opacity:1;background-color:#fff;border-radius:0.8rem;-webkit-box-shadow:2px 2px 3px 1px rgba(0,0,0,0.75);-moz-box-shadow:2px 2px 3px 1px rgba(0,0,0,0.75);box-shadow:2px 2px 3px 1px rgba(0,0,0,0.75)}.apps .app_container .app_button .app_icon{font:normal normal normal 14px/1 FontAwesome;font-size:5rem;display:inline-block;width:100%;margin:2rem auto}.apps .app_container .app_button .app_banner{position:absolute;display:block;bottom:0;left:0;width:100%;height:1rem}.apps .app_container .app_label{font-size:1.2rem;font-weight:normal;overflow:hidden;width:100%;text-align:center}.reveal-modal{position:absolute;top:1rem;right:1rem;left:1rem;margin-right:auto;margin-left:auto;padding:0;color:#4d4d4d;border:0;border-radius:0.75rem;background:#fff;-webkit-box-shadow:0.5rem 0.5rem 0 0 rgba(50,50,50,0.75);-moz-box-shadow:0.5rem 0.5rem 0 0 rgba(50,50,50,0.75);box-shadow:0.5rem 0.5rem 0 0 rgba(50,50,50,0.75)}.reveal-modal .titlebar{font-size:2rem;font-weight:bold;position:relative;padding:0.5rem;text-align:center;color:#fff;border-bottom:0.25rem solid #545454;-webkit-border-top-left-radius:0.5rem;-moz-border-radius-topleft:0.5rem;border-top-left-radius:0.5rem;-webkit-border-top-right-radius:0.5rem;-moz-border-radius-topright:0.5rem;border-top-right-radius:0.5rem;background:#b2afa1}.reveal-modal .titlebar.red{border-bottom:0.25rem solid #79261d;background:#b2382a}.reveal-modal .titlebar.green{border-bottom:0.25rem solid #26791d;background:#38b22a}.reveal-modal .content{padding:1rem}.reveal-modal .close-reveal{font-size:2rem;font-weight:normal;position:absolute;top:1rem;right:auto;left:1rem;cursor:pointer;color:#fff}.reveal-modal .close-reveal:hover{font-size:2.5rem;top:0.75rem;left:0.75rem}.reveal-modal .btnClose{font-size:2rem;font-weight:normal;position:absolute;top:0.5rem;right:auto;left:1rem;cursor:pointer;color:#fff}.reveal-modal .btnClose:hover{font-size:2.5rem;top:0.25rem;left:0.75rem}.float_right{float:right}.actionbar{min-height:4rem;margin:-.5rem 0 1rem;padding:0.5rem 1rem;background:#23774e;border-radius:0.5rem}.actionbar .action{display:inline-block;min-width:3rem;padding:0 0.5rem;text-align:center;color:#fff;-webkit-border-radius:0.25rem;-moz-border-radius:0.25rem;border-radius:0.25rem}.actionbar .action .text{font-size:0.75rem;font-weight:bold;text-transform:uppercase}.actionbar .action.active,.actionbar .action:hover{color:#4d4d4d;background:#fff}.actionbar .spacer{display:inline-block;width:2rem}.actionbar .filebox{display:inline-block;overflow:hidden;min-width:7rem;max-width:20rem;white-space:nowrap;text-overflow:ellipsis;color:#fff}.actionbar .filebox .filename{font-weight:bold;text-transform:uppercase}.actionbar .filebox .status{font-size:0.75rem;font-weight:bold;text-transform:uppercase}.actionbar:empty{display:none}.contentwrapper *{font:12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace !important}.fullscreen{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#F2F2F2;padding:0;margin:0;z-index:9}.fullscreen .contentwrapper{height:calc(100vh - 4rem - 4.15rem)}.fullscreen .console{border-bottom-right-radius:0;border-bottom-left-radius:0}.fullscreen .actionbar{margin:0;border-radius:0}.fullscreen .container{margin:0;padding:0;max-width:100%;width:100%;height:100%}.filebrowser{position:fixed;right:1rem;bottom:3rem;left:1rem}.filebrowser .content{position:absolute;top:4rem;bottom:0;width:100%}.filebrowser .actionbar .actionBarItem{position:relative;float:left;min-width:4rem}.filebrowser .foldercontent{position:absolute;top:4.5rem;bottom:0.5rem;left:0;overflow-x:hidden;overflow-y:scroll;width:100%;padding:0 3rem 3rem}.filebrowser .foldercontent .button{font-size:1.5rem;width:5rem;margin-left:0.5rem;padding:0}.filebrowser .foldercontent .alert{width:2.5rem}.filebrowser .foldercontent .browseritem{width:100%;min-height:2rem;margin:0.1rem;padding:0.2rem;border-radius:0.25rem}.filebrowser .foldercontent .browseritem:hover{background-color:#f2f2f2}.filebrowser .foldercontent .browseritem:hover .browseritemoptions{opacity:1}.filebrowser .foldercontent .browseritem a{margin:0}.filebrowser .foldercontent .browseritem .browseritemname{font-size:1.5rem;font-weight:bold;margin-left:2rem}.filebrowser .foldercontent .browseritem .browseritemoptions{float:right;padding:0.15rem}.filebrowser .foldercontent .browseritem .browseritemoptions{-webkit-transition:opacity 0.1s ease-in-out;-moz-transition:opacity 0.1s ease-in-out;transition:opacity 0.1s ease-in-out;opacity:0}#message_popup .content .buttons{position:relative;text-align:center}#message_popup .content .buttons .button{margin-right:1rem;margin-left:1rem} +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.7.0");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"),url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;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.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid 0.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{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-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{-ms-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:""}.fa-music:before{content:""}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before{content:""}.fa-check-circle:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:""}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-signing:before,.fa-sign-language:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-vcard:before,.fa-address-card:before{content:""}.fa-vcard-o:before,.fa-address-card-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@font-face{font-family:'Avenir Next';src:url("../fonts/AvenirNext-Regular.ttf") format("truetype");font-style:normal;font-weight:normal}@font-face{font-family:'Avenir Next';src:url("../fonts/AvenirNext-DemiBold.ttf") format("truetype");font-weight:500;font-style:normal}@font-face{font-family:'Avenir Next';src:url("../fonts/AvenirNext-Bold.ttf") format("truetype");font-weight:700;font-style:normal}@font-face{font-family:'EmojiOne';src:url("../fonts/emojione-svg.woff2") format("truetype");font-weight:700;font-style:normal}@keyframes beat{to{transform:scale(0.8)}}html{height:100%;min-height:100%}body{color:#27292a;background:#fff;font-family:"Avenir Next" !important;font-size:1rem;height:100%;min-height:100%}body>div{height:100%;min-height:100%}article,div,h1,h2,h3,h4,h5,h6,p,section,span{font-family:"Avenir Next"}hr{width:100%;font-size:10rem;font-weight:bold;border:0;border-bottom:1px solid #ccc;background:#999}a{outline:0}svg{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.wrapper{min-height:calc(100vh - 6.5rem)}footer{font-size:0.8rem;background-color:#313334;height:6.5rem;clear:both;overflow:hidden}footer section{margin-bottom:0;padding-top:1.2rem;padding-bottom:1.2rem;color:#DDD}footer a{color:#DDD;font-weight:normal}footer a:hover{color:#DDD !important;text-decoration:underline}footer .footer-col{padding:0 5rem;height:8rem}footer .footer-col>div{padding:0 1.2rem}footer ul{list-style-type:none}footer h1{font-size:1rem;color:#888;text-align:left;text-transform:uppercase}footer form{margin-top:1rem}footer form input[type=text]{font-size:0.8rem;height:1.8rem;background-color:#1C1D1D;border:none;padding-left:0.8rem;-webkit-border-top-left-radius:.9rem;-webkit-border-bottom-left-radius:.9rem;-moz-border-radius-topleft:.9rem;-moz-border-radius-bottomleft:.9rem;border-top-left-radius:.9rem;border-bottom-left-radius:.9rem}footer form input[type=text]:focus{box-shadow:none;background-color:#888}footer form input[type=text]:focus::-webkit-input-placeholder{color:#313334}footer form input[type=text]:focus:-moz-placeholder{color:#313334}footer form input[type=text]:focus::-moz-placeholder{color:#313334}footer form input[type=text]:focus:-ms-input-placeholder{color:#313334}footer form .button{background-color:#1C1D1D;color:#DDD;font-size:1rem;height:1.8rem;padding:0.3rem 0.8rem 0.3rem 0.5rem;-webkit-border-top-right-radius:.9rem;-webkit-border-bottom-right-radius:.9rem;-moz-border-radius-topright:.9rem;-moz-border-radius-bottomright:.9rem;border-top-right-radius:.9rem;border-bottom-right-radius:.9rem}footer form .button:hover{color:#fff;background-color:#FF517E}footer .logo{margin:0;width:100%;max-width:100%;background-color:#1C1D1D;text-align:center;padding:1rem;color:#666;font-size:0.8rem}footer .logo img{max-width:3.5rem;margin-bottom:0.5rem}h1,h2{text-transform:uppercase}h1{font-size:2rem;text-align:center;font-weight:bold;color:#313334}h2{text-align:left;margin:0.5rem 0;font-size:2rem;font-weight:bold;color:#313334}h3{font-size:1.2rem;font-weight:bold}img{margin-left:auto;margin-right:auto;padding:0}section{margin:0 auto 4rem}article{padding:1rem;margin:0 auto;text-align:justify}p{padding:0;margin:0.5rem 0}a{text-decoration:none;font-weight:bold;color:#27292a}fieldset legend{background-color:transparent;margin:0}fieldset{margin-top:1rem !important;padding:0 0.5rem}.tabs{width:100% !important;max-width:100% !important}.tabs .tab-title>a{padding:1rem}.tabs-content .content{padding-top:0}.nav{width:100%}.nav img{float:left}.nav ul{float:right}.nav ul li{float:left;margin:1rem;list-style-type:none}.nav ul li a,.nav ul li a:visited{font-size:1rem;font-weight:bold;text-decoration:none;text-transform:uppercase;color:#fff}.row{max-width:75rem}.background_green{background-color:#00E58B !important}.background_blue{background-color:#0095FF !important}.background_orange{background-color:#FFAF19 !important}.background_red{background-color:#FF517E !important}.background_yellow{background-color:#FFF222 !important}.background_gray_light{background-color:#C7C8C9 !important}.background_gray_dark{background-color:#313334 !important}.color_green{color:#00E58B}.color_blue{color:#0095FF}.color_orange{color:#FFAF19}.color_red{color:#FF517E}.color_yellow{color:#FFF222}.color_gray_light{color:#C7C8C9;background-color:#313334}.color_gray_light h1{color:#C7C8C9}.color_gray_light a{color:#C7C8C9}.color_gray_dark{color:#313334}.color_white{color:#fff}.text_caps{text-transform:uppercase}.text_center{text-align:center;vertical-align:middle}.box_center{float:none;margin-left:auto;margin-right:auto}.side_right{float:right;text-align:right}.full_width{max-width:100%}.full_width *{max-width:75rem;margin-left:auto;margin-right:auto}.nopadding{padding:0}.circle{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%}.rectangle{-webkit-border-radius:1rem;-moz-border-radius:1rem;border-radius:1rem}.btn{font-size:1.5rem;padding:0.5rem 1.5rem;background-color:#0095FF;color:#C7C8C9;font-weight:bold;-webkit-border-radius:.7rem;-moz-border-radius:.7rem;border-radius:.7rem;white-space:nowrap;overflow:hidden}.online{color:#00E58B}.offline{color:#FF517E}#header_main{position:fixed;top:0;left:0;overflow:hidden;width:100%;height:3.5rem;padding:0 1rem;background-color:#313334;z-index:9}#header_main nav .logo{width:2.5rem;height:2rem;margin:0.75rem 0.75rem 0.75rem 0;display:inline-block;background-image:url("../images/logo/opsoro_icon_light.png");background-size:cover}#header_main nav a.active,#header_main nav a.active:visited{border-bottom:2px solid}#header_main.on-top{background:none}#header_main.on-top nav ul li a{color:#313334}#header_main.on-top nav .logo{background-image:url("../images/logo/opsoro_icon_dark.png")}#header_play{position:relative;top:0.8rem;overflow:hidden;max-width:75rem;height:4rem;margin:0 auto 1rem;background-color:#F2F2F2;color:#313334;padding:0.2rem 1.4rem 0;z-index:9;-webkit-border-radius:2.5rem;-moz-border-radius:2.5rem;border-radius:2.5rem}#header_play div{padding:0}#header_play .icon{float:left}#header_play p{line-height:normal;float:left;padding:0}#header_play input[type=text]{font-weight:bold;font-size:1rem;height:2.6rem;background-color:#fff;border:none;padding-left:1rem;margin-top:0.5rem;color:#313334;-webkit-border-radius:1.3rem;-moz-border-radius:1.3rem;border-radius:1.3rem}#header_play input[type=text]::-webkit-input-placeholder{color:#313334}#header_play input[type=text]:-moz-placeholder{color:#313334}#header_play input[type=text]::-moz-placeholder{color:#313334}#header_play input[type=text]:-ms-input-placeholder{color:#313334}#header_play input[type=text]:focus{box-shadow:none;background-color:#C7C8C9}#header_play input[type=text]:focus::-webkit-input-placeholder{color:#313334}#header_play input[type=text]:focus:-moz-placeholder{color:#313334}#header_play input[type=text]:focus::-moz-placeholder{color:#313334}#header_play input[type=text]:focus:-ms-input-placeholder{color:#313334}#header_play ul{text-align:center;margin:0}#header_play ul li{margin:0}#header_play .icon{margin:0.6rem 0.5rem 0 0;font-size:2.4rem}#header_play #status{text-transform:uppercase;font-weight:bold}#header_play #comment .icon{margin:0.1rem 0.2rem 0 0;font-size:1.1rem}#header_play a{margin:0;padding:0;color:#313334}#header_play a .icon{margin:0.6rem 0 0.5rem 1rem;font-size:2.3rem}#header_play a:hover{color:#000}#header_play .status{margin:0.5rem 0}.sidebar-left,.sidebar-right{position:fixed;z-index:8;top:50px;bottom:0;left:0;display:block;overflow:visible;overflow:auto;max-width:13rem;padding:1rem;color:#000;background-color:rgba(255,255,255,0.5);-webkit-box-shadow:0 0 3px 1px;-moz-box-shadow:0 0 3px 1px;box-shadow:0 0 3px 1px}.sidebar-left:empty,.sidebar-right:empty{display:none}.sidebar_right{right:0;left:auto}.container{position:relative;max-width:75rem;margin-top:0.5rem;margin-right:auto;margin-left:auto;padding:0 1rem}.announcements{position:fixed;z-index:10;right:0;bottom:0;left:0;display:block;width:100%;text-align:center}.announcement{position:relative;max-width:40rem;margin-top:1rem;margin-right:auto;margin-left:auto;padding:0.75rem;text-align:center;-webkit-border-top-left-radius:0.8rem;-moz-border-radius-topleft:0.8rem;border-top-left-radius:0.8rem;-webkit-border-top-right-radius:0.8rem;-moz-border-radius-topright:0.8rem;border-top-right-radius:0.8rem;color:#fff;background-color:#333;-webkit-box-shadow:0 0 3px 1px;-moz-box-shadow:0 0 3px 1px;box-shadow:0 0 3px 1px}.announcement .btn{font-size:2rem;position:absolute;top:0;right:0;display:block;width:2.75rem;height:2.75rem;padding:0;color:#fff;border-style:none;background-color:transparent}.announcement .btn:active,.announcement .btn:hover{font-size:2.1rem;color:#fff;border-style:none;background-color:transparent}.apps{max-width:100%;margin-right:auto;margin-left:auto;padding:0}.apps .app-category{position:relative;margin:2rem 1rem;display:block;width:100%}.apps .app-category h3{margin:1rem 0 0;font-size:1.3rem}.apps .app-container{position:relative;display:inline-block;overflow:hidden;padding:0;margin:.8rem .8rem 0 0}.apps .app-container .app-button{margin:0;text-align:left;width:11rem;height:11rem;padding:3.8rem 1rem 1rem;background-color:#313334;-webkit-border-radius:.7rem;-moz-border-radius:.7rem;border-radius:.7rem;vertical-align:text-bottom}.apps .app-container .app-button:hover{text-decoration:none}.apps .app-container .app-button:hover .app-icon{font-size:2.5rem;right:.95rem;top:.95rem}.apps .app-container .app-button .app-icon{position:absolute;right:1.2rem;top:1.2rem;text-align:right;color:#fff !important;font:normal normal normal 14px/1 FontAwesome;font-size:2rem;display:block;height:3rem;padding:0;margin:0}.apps .app-container .app-button .app-label{display:table-cell;width:100%;height:4rem;color:#fff;font-size:1.2rem;font-weight:bold;text-align:left;line-height:2rem;overflow:hidden;vertical-align:bottom}.apps .app-container .app-button .app-banner{position:absolute;display:inline-block;bottom:0rem;left:0rem;padding:0 .7rem;background-color:rgba(0,0,0,0.15);color:#fff;width:100%;height:2.3rem;-webkit-border-bottom-left-radius:.7rem;-webkit-border-bottom-right-radius:.7rem;-moz-border-radius-bottomleft:.7rem;-moz-border-radius-bottomright:.7rem;border-bottom-left-radius:.7rem;border-bottom-right-radius:.7rem;font-size:.7rem;font-weight:normal}.apps .app-container .app-button .app-banner .app-beat{animation:beat .5s infinite alternate;transform-origin:center}.apps .app-container .app-button .app-banner .app-opsoro{display:inline-block;width:2.1rem;height:1.8rem;margin:.25rem 0}.apps .app-container .app-button .app-banner .app-by{display:inline-block;margin:.8rem 0}.apps .app-container .app-button .app-banner .app-author{font-weight:bold;display:inline-block;margin:.8rem 0}.apps .app-container .app-button .app-banner .app-status{display:inline-block;float:right;margin:.65rem 0}.apps .app-container .app-button .app-banner .app-status *{display:inline-block;vertical-align:middle;font:normal normal normal 14px/1 FontAwesome;font-size:1rem}.reveal{position:absolute;left:0;right:0;top:1rem;margin-right:auto;margin-left:auto;padding:0;color:#4d4d4d;border:0;border-radius:0.75rem;-webkit-border-radius:.7rem;-moz-border-radius:.7rem;border-radius:.7rem;background:#fff;-webkit-box-shadow:0px 1px 4px 2px rgba(0,0,0,0.1);-moz-box-shadow:0px 1px 4px 2px rgba(0,0,0,0.1);box-shadow:0px 1px 4px 2px rgba(0,0,0,0.1)}.reveal .titlebar{font-size:1.5rem;font-weight:bold;position:relative;padding:0.5rem;text-align:center;color:#313334;background:#fff}.reveal .titlebar.red{border-bottom:0.25rem solid #79261d;background:#FF517E}.reveal .titlebar.green{border-bottom:0.25rem solid #26791d;background:#22774D}.reveal .content{padding:1rem}.reveal .close-button{font-size:2rem;font-weight:normal;position:absolute;top:0.5rem;right:1rem;cursor:pointer;color:#313334}.reveal .close-button:hover{font-size:2.5rem;top:0.25rem;right:0.75rem}.reveal .big-button{width:7rem;height:7rem;background-color:#313334;-webkit-border-radius:.7rem;-moz-border-radius:.7rem;border-radius:.7rem}.reveal .big-button .icon{color:#fff !important;font:normal normal normal 14px/1 FontAwesome;font-size:3rem;display:inline-block;width:100%;margin:0.5rem auto}.reveal .big-button .text{color:#fff;font-weight:normal;overflow:hidden;width:100%;text-align:center}.reveal .big-button:hover{text-decoration:underline;color:#fff !important}.reveal .big-button:hover .app-icon{color:#fff !important;font-size:4rem;margin:0 auto}.float_right{float:right}.actionbar{min-height:4rem;margin:0 -1rem 1rem;padding:0.5rem 1.5rem 0.3rem;color:#fff;background:#DDD;-webkit-border-radius:2.5rem;-moz-border-radius:2.5rem;border-radius:2.5rem}.actionbar .action{display:inline-block;min-width:3rem;padding:0 0.5rem;text-align:center;color:#fff;float:right;-webkit-border-radius:.25rem;-moz-border-radius:.25rem;border-radius:.25rem}.actionbar .action .text{color:#fff;font-size:0.75rem;font-weight:bold;text-transform:uppercase}.actionbar .action.active,.actionbar .action:hover{color:#F2F2F2}.actionbar .icon{color:#fff;vertical-align:top;display:inline-block;font-size:3rem;margin:0 0.8rem 0 0}.actionbar .spacer{display:inline-block;width:2rem;float:right;margin:0;padding:0.5rem}.actionbar .filebox{display:inline-block;overflow:hidden;min-width:7rem;max-width:20rem;white-space:nowrap;text-overflow:ellipsis;color:#fff}.actionbar .filebox .filename{font-weight:bold;text-transform:uppercase}.actionbar .filebox .status{font-size:0.75rem;font-weight:bold;text-transform:uppercase}.actionbar:empty{display:none}.contentwrapper *{font:12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace !important}.fullscreen{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#C7C8C9;padding:0;margin:0;z-index:9}.fullscreen .contentwrapper{height:calc(100vh - 4rem - 4.15rem)}.fullscreen .console{border-bottom-right-radius:0;border-bottom-left-radius:0}.fullscreen .actionbar{margin:0;border-radius:0}.fullscreen .container{margin:0;padding:0;max-width:100%;width:100%;height:100%}.filebrowser{position:fixed;bottom:3rem;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.filebrowser .content{position:absolute;top:4rem;bottom:0;width:100%;padding:0}.filebrowser .actionbar .actionBarItem{position:relative;float:left;min-width:4rem}.filebrowser .foldercontent{position:absolute;top:0.5rem;bottom:0.5rem;left:0;overflow-x:hidden;overflow-y:scroll;width:100%;padding:0 1rem 1rem}.filebrowser .foldercontent .browseritem{width:100%;text-align:left;margin:0;padding:0.2rem 1rem;border-radius:0.25rem;background-color:#fff;color:#1C1D1D;overflow-x:hidden;white-space:nowrap}.filebrowser .foldercontent .browseritem:hover .browseritemname{color:#00E58B}.filebrowser .foldercontent .browseritem:hover .browseritemoptions{opacity:1}.filebrowser .foldercontent .browseritem .icon{vertical-align:middle;color:#00E58B;font-size:1.5rem}.filebrowser .foldercontent .browseritem .browseritemname{color:#313334;font-size:1rem;font-weight:bold;margin-left:1rem;overflow-x:hidden}.filebrowser .foldercontent .browseritem .browseritemoptions{float:right;padding:0.15rem;-webkit-transition:opacity 0.1s ease-in-out;-moz-transition:opacity 0.1s ease-in-out;transition:opacity 0.1s ease-in-out;opacity:0}.filebrowser .foldercontent .browseritem .browseritemoptions .button{color:#C7C8C9;background-color:transparent;margin:0;padding:0;font-size:1rem}.filebrowser .foldercontent .browseritem .browseritemoptions .button:hover{color:#000}#message_popup .content .buttons{position:relative;text-align:center}#message_popup .content .buttons .button{margin-right:1rem;margin-left:1rem}.clickedit span{font-size:1.4rem}.clickedit span.fa-pencil{margin-left:0.2rem;display:none;color:#888}.clickedit input{height:2.1rem}.clickedit:hover span.fa-pencil{display:inline}.emoji{font-family:'EmojiOne' !important;font-size:3rem;text-align:center;display:inline-block;background-image:url("/static/images/emoji_background.png");background-size:contain;background-repeat:no-repeat;line-height:1}.draggable{cursor:move}.selected_module path,.selected_module rect{stroke:#FFCE39 !important}.slider .slider-handle{background-color:#0095FF}.button{background-color:#0095FF}.button.alert{background-color:#FF517E}.button.success{background-color:#00E58B} diff --git a/src/opsoro/server/static/css/opsoro.scss b/src/opsoro/server/static/css/opsoro.scss index 156259b..d1d9547 100644 --- a/src/opsoro/server/static/css/opsoro.scss +++ b/src/opsoro/server/static/css/opsoro.scss @@ -1,70 +1,27 @@ -$color_green: #15e678; -$color_blue: #36c9ff; -$color_orange: #ffaf19; -$color_red: #ff517e; -$color_purple: #6e00ff; -$color_yellow: #fff000; -$color_gray_light: #F2F2F2; -$color_gray_dark: #27292a; -$color_white: #FFF; -$color_font_default: #27292a; -$color_button_background: #FFF; -$rounding_small: 0.7rem; -$rounding_medium: 1rem; -@mixin no_selection() { - -webkit-touch-callout: none; - /* iOS Safari */ - -webkit-user-select: none; - /* Chrome/Safari/Opera */ - -khtml-user-select: none; - /* Konqueror */ - -moz-user-select: none; - /* Firefox */ - -ms-user-select: none; - /* Internet Explorer/Edge */ - user-select: none; - /* Non-prefixed version, currently - not supported by any browser */ -} -@mixin round_border($rounding) { - -webkit-border-radius: $rounding; - -moz-border-radius: $rounding; - border-radius: $rounding; -} -@mixin shadow() { - // box-shadow: 0 0 8px rgba(0, 0, 0, .8); - // -webkit-box-shadow: 0 0 8px rgba(0, 0, 0, .8); - // -moz-box-shadow: 0 0 8px rgba(0, 0, 0, .8); - -webkit-box-shadow: 3px 3px 2px rgba(0, 0, 0, .8); - -moz-box-shadow: 3px 3px 2px rgba(0, 0, 0, .8); - box-shadow: 3px 3px 2px rgba(0, 0, 0, .8); -} -@font-face { - font-family: 'Avenir Next'; - src: url('../fonts/AvenirNext-Regular.ttf') format('truetype'); - font-style: normal; - font-weight: normal; -} -@font-face { - font-family: 'Avenir Next'; - src: url('../fonts/AvenirNext-DemiBold.ttf') format('truetype'); - font-weight: 500; - font-style: normal; -} -@font-face { - font-family: 'Avenir Next'; - src: url('../fonts/AvenirNext-Bold.ttf') format('truetype'); - font-weight: 700; - font-style: normal; +// Compile this! +@import 'font-awesome/font-awesome'; +@import 'opsoro/colors'; +@import 'opsoro/fonts'; +@import 'opsoro/mixins'; +@import 'opsoro/animations'; + +html { + height: 100%; + min-height: 100%; } body { - height: auto; - color: $color_font_default; - background: $color_gray_light; - background-image: url('../images/background/bg_tiled_dark.png'); - font-family: 'Avenir Next' !important; - font-size: 1.1rem; + color: color(global_text); + background: color(global_background); + font-family: font(text) !important; + font-size: 1rem; + height: 100%; + min-height: 100%; +} + +body > div { + height: 100%; + min-height: 100%; } article, @@ -78,196 +35,330 @@ h6, p, section, span { - font-family: 'Avenir Next'; + font-family: font(text); } hr { - // display: none; - margin: 0; + width: 100%; + font-size: 10rem; + font-weight: bold; + border: 0; + border-bottom: 1px solid #ccc; + background: #999; } a { - outline: 0; + outline: 0; } svg { @include no_selection(); } +.wrapper { + min-height: calc(100vh - 6.5rem); +} + footer { - height: 4rem; + font-size: 0.8rem; + background-color: color(gray_dark); + height: 6.5rem; + clear: both; + overflow: hidden; + + section { + margin-bottom: 0; + padding-top: 1.2rem; + padding-bottom: 1.2rem; + color: color(gray); + } + + a { + color: color(gray); + font-weight: normal; + } + + a:hover { + color: color(gray) !important; + text-decoration: underline; + } + + .footer-col { + padding: 0 5rem; + height: 8rem; + } + + .footer-col > div { + padding: 0 1.2rem; + } + + ul { + list-style-type: none; + } + + h1 { + font-size: 1rem; + color: #888; + text-align: left; + text-transform: uppercase; + } + // newsletter email form + form { + margin-top: 1rem; + + input[type=text] { + font-size: 0.8rem; + height: 1.8rem; + background-color: color(gray_darker); + border: none; + padding-left: 0.8rem; + @include round-corners-left(0.9rem); + } + + input[type=text]:focus { + box-shadow: none; + background-color: #888; + @include placeholder { + color: color(gray_dark); + } + } - .container { - margin-top: 0; + .button { + background-color: color(gray_darker); + color: color(gray); + font-size: 1rem; + height: 1.8rem; + //width: 3rem; + padding: 0.3rem 0.8rem 0.3rem 0.5rem; + @include round-corners-right(0.9rem); + } + + .button:hover { + color: #fff; + background-color: color(red); } + } + + .logo { + margin: 0; + width: 100%; + max-width: 100%; + background-color: color(gray_darker); + text-align: center; + padding: 1rem; + color: #666; + font-size: 0.8rem; img { - display: block; - width: 8rem; - margin: 0.5rem auto; - opacity: 0.75; + max-width: 3.5rem; + margin-bottom: 0.5rem; } + } +} + +h1, +h2 { + text-transform: uppercase; } h1 { - font-size: 3rem; - text-align: center; - font-weight: bold; - color: $color_purple; + font-size: 2rem; + text-align: center; + font-weight: bold; + color: color(gray_dark); } h2 { - margin: 0.5rem 0; - font-size: 2rem; - font-weight: bold; - color: $color_gray_dark; + text-align: left; + margin: 0.5rem 0; + font-size: 2rem; + font-weight: bold; + color: color(gray_dark); } h3 { - font-size: 1.2rem; - font-weight: bold; + font-size: 1.2rem; + font-weight: bold; } img { - // margin: 1rem; - margin-left: auto; - margin-right: auto; - padding: 0; + // margin: 1rem; + margin-left: auto; + margin-right: auto; + padding: 0; } section { - // margin: 0 auto 1rem; - // padding: 2rem; + margin: 0 auto 4rem; + //padding: 2rem; } article { - padding: 1rem; - margin: 0 auto; - text-align: justify; -} - -div { - // padding: 0 1rem; + padding: 1rem; + margin: 0 auto; + text-align: justify; } p { - padding: 0 1rem; - margin: 0.5rem 0; + padding: 0; + margin: 0.5rem 0; } a { - text-decoration: none; - font-weight: bold; - color: $color_font_default; - outline: medium none !important; + text-decoration: none; + font-weight: bold; + color: color(global_text); + // outline: medium none !important; + &:active, + &:focus, + &:hover { + // text-decoration: none; + // color: color(green) !important; + } + + &:visited { + // text-decoration: none; + } +} - &:active, - &:focus, - &:hover { - text-decoration: none; - color: $color_green !important; - } +fieldset legend { + background-color: transparent; + margin: 0; +} - &:visited { - text-decoration: none; - // color: $color_font_default; +fieldset { + // border: 1px solid silver; + margin-top: 1rem !important; + padding: 0 0.5rem; +} + +.tabs { + width: 100% !important; + max-width: 100% !important; + + .tab-title { + // border-width: 1px; + // border-style: solid; + > a { + padding: 1rem; } + } } +// -fieldset legend { - background-color: transparent; +.tabs-content { + .content { + padding-top: 0; + } } .nav { - width: 100%; + width: 100%; - img { - float: left; - } + img { + float: left; + } - ul { - float: right; + ul { + float: right; - li { - float: left; - margin: 1rem; - list-style-type: none; - - a, - a:visited { - font-size: 1rem; - font-weight: bold; - text-decoration: none; - text-transform: uppercase; - color: $color_white; - } - } + li { + float: left; + margin: 1rem; + list-style-type: none; + + a, + a:visited { + font-size: 1rem; + font-weight: bold; + text-decoration: none; + text-transform: uppercase; + color: color(white); + } } + } +} + +.row { + max-width: 75rem; +} + +.background_green { + background-color: color(green) !important; +} + +.background_blue { + background-color: color(blue) !important; +} + +.background_orange { + background-color: color(orange) !important; +} + +.background_red { + background-color: color(red) !important; +} + +.background_yellow { + background-color: color(yellow) !important; } -.row -{ - max-width: 75rem; +.background_gray_light { + background-color: color(gray_light) !important; } -.active, -.active:visited { - text-decoration: none; - color: $color_green !important; +.background_gray_dark { + background-color: color(gray_dark) !important; } .color_green { - color: $color_green; + color: color(green); } .color_blue { - color: $color_blue; + color: color(blue); } .color_orange { - color: $color_orange; + color: color(orange); } .color_red { - color: $color_red; -} - -.color_purple { - color: $color_purple; + color: color(red); } .color_yellow { - color: $color_yellow; + color: color(yellow); } .color_gray_light { - color: $color_gray_light; - background-color: $color_gray_dark; + color: color(gray_light); + background-color: color(gray_dark); } .color_gray_light h1 { - color: $color_gray_light; + color: color(gray_light); } .color_gray_light a { - color: $color_gray_light; + color: color(gray_light); } .color_gray_dark { - color: $color_gray_dark; + color: color(gray_dark); } .color_white { - color: $color_white; + color: color(white); } .text_caps { - text-transform: uppercase; + text-transform: uppercase; } .text_center { - text-align: center; - vertical-align: middle; + text-align: center; + vertical-align: middle; } .box_center { @@ -277,599 +368,801 @@ fieldset legend { } .side_right { - float: right; - text-align: right; + float: right; + text-align: right; } .full_width { - max-width: 100%; + max-width: 100%; } .full_width * { - max-width: 75rem; - margin-left: auto; - margin-right: auto; + max-width: 75rem; + margin-left: auto; + margin-right: auto; } .nopadding { - padding: 0; + padding: 0; } .circle { - @include round_border(50%); + @include round-corners(50%); } .rectangle { - @include round_border($rounding_medium); + @include round-corners(rounding(medium)); } .btn { - font-size: 1rem; - padding: 0.5rem 2rem; - height: 2.3125rem; - // display: block; - background-color: $color_purple; - color: $color_gray_light; - font-weight: bold; - // width: 10rem; - // @include round_border($rounding_small); + font-size: 1.5rem; + padding: 0.5rem 1.5rem; + // height: 2.3125rem; + // display: block; + background-color: color(blue); + color: color(gray_light); + font-weight: bold; + // width: 10rem;border-style: none; + @include round-corners(rounding(small)); + white-space: nowrap; + overflow: hidden; } -// --------------------------------------------------------------------------------------------------------------------------- -.col-md-1, -.col-md-10, -.col-md-11, -.col-md-12, -.col-md-2, -.col-md-3, -.col-md-4, -.col-md-5, -.col-md-6, -.col-md-7, -.col-md-8, -.col-md-9 { - float: none; - margin-left: auto; - margin-right: auto; -} - -.columns + .columns:last-child { - float: left; +.online { + color: color(green); } -#header_play { - position: relative; - top: 0; - overflow: hidden; - max-width: 75rem; - margin-left: auto; - margin-right: auto; - background-color: $color_white; - color: $color_gray_dark; - padding: 0 0.7rem; - border-bottom-left-radius: 1rem; - border-bottom-right-radius: 1rem; - -webkit-box-shadow: 2px 2px 3px 1px rgba(0, 0, 0, .75); - -moz-box-shadow: 2px 2px 3px 1px rgba(0, 0, 0, .75); - box-shadow: 2px 2px 3px 1px rgba(0, 0, 0, .75); - - div { - float: left; - padding: 0; +.offline { + color: color(red); +} +// --------------------------------------------------------------------------------------------------------------------------- + +#header_main { + // menu bar + position: fixed; + top: 0; + left: 0; + overflow: hidden; + width: 100%; + height: 3.5rem; + padding: 0 1rem; + background-color: color(gray_dark); + z-index: 9; + + nav { + .logo { + width: 2.5rem; + height: 2rem; + margin: 0.75rem 0.75rem 0.75rem 0; + display: inline-block; + background-image: url("../images/logo/opsoro_icon_light.png"); + background-size: cover; } - i { - float: left; + a.active, + a.active:visited { + border-bottom: 2px solid; } + } +} - p { - float: left; - padding: 0; +#header_main.on-top { + background: none; + + nav { + ul li a { + // background: #f00; + color: color(gray_dark); } - .side_right { - float: right; + .logo { + background-image: url("../images/logo/opsoro_icon_dark.png"); } + } +} - .text_center { - // float: left; - float: none; - margin-left: auto; - margin-right: auto; - width: 10rem; +#header_play { + position: relative; + top: 0.8rem; + overflow: hidden; + max-width: 75rem; + height: 4rem; + margin: 0 auto 1rem; + background-color: color(statusbar_background); + color: color(statusbar_text); + padding: 0.2rem 1.4rem 0; + z-index: 9; + @include round-corners(2.5rem); + // -webkit-box-shadow: 2px 2px 3px 1px rgba(0, 0, 0, .75); + // -moz-box-shadow: 2px 2px 3px 1px rgba(0, 0, 0, .75); + // box-shadow: 2px 2px 3px 1px rgba(0, 0, 0, .75); + // @include shadow(); + div { + padding: 0; + } + + .icon { + float: left; + } + + p { + line-height: normal; + float: left; + padding: 0; + } + + input[type=text] { + font-weight: bold; + font-size: 1rem; + height: 2.6rem; + background-color: color(white); + border: none; + padding-left: 1rem; + margin-top: 0.5rem; + color: color(gray_dark); + @include placeholder { + color: color(gray_dark); + } + @include round-corners(1.3rem); + + &:focus { + box-shadow: none; + background-color: color(gray_light); + @include placeholder { + color: color(gray_dark); + } } + } - ul { - text-align: center; - margin: 0; + ul { + text-align: center; + margin: 0; - li { - margin: 0; - // margin-left: 1.5rem; - &:last-child { - i { - // margin-right: 0; - } - } + li { + margin: 0; + // margin-left: 1.5rem; + &:last-child { + .icon { + // margin-right: 0; } + } } + } - i { - margin: 0.5rem 0.5rem 0 0; - font-size: 3.3rem; - } + .icon { + margin: 0.6rem 0.5rem 0 0; + font-size: 2.4rem; + } - #status { - text-transform: uppercase; - font-weight: bold; - } + #status { + text-transform: uppercase; + font-weight: bold; + } - #comment { - i { - margin: 0.2rem 0.2rem 0 0; - font-size: 1.1rem; - } + #comment { + .icon { + margin: 0.1rem 0.2rem 0 0; + font-size: 1.1rem; } + } - a { - // display: block; - // width: 3rem; - // height: 3rem; - // display: inline; - margin: 0; - padding: 0; - color: $color_gray_dark; + a { + // display: block; + // width: 3rem; + // height: 3rem; + // display: inline; + margin: 0; + padding: 0; + color: color(statusbar_text); - i { - margin: 1rem 0 0.5rem 1rem; - font-size: 2.3rem; - } + .icon { + margin: 0.6rem 0 0.5rem 1rem; + font-size: 2.3rem; } - .status { - margin: 0.5rem 0; + &:hover { + color: color(statusbar_text_hover); } + } + + .status { + margin: 0.5rem 0; + } } -.sidebar_left, -.sidebar_right { - position: fixed; - /*padding-top: 1rem;*/ - z-index: 8; - top: 50px; - bottom: 0; - left: 0; - display: block; - overflow: visible; - overflow: auto; - max-width: 13rem; - padding: 1rem; - /*width: 15rem;*/ - /*text-align: justify;*/ - /*opacity: .3;*/ - color: #000; - background-color: rgba(255,255,255,.5); - /*background-color: #fff;*/ - -webkit-box-shadow: 0 0 3px 1px; - -moz-box-shadow: 0 0 3px 1px; - box-shadow: 0 0 3px 1px; - - &:empty { - display: none; - } +.sidebar-left, +.sidebar-right { + position: fixed; + /*padding-top: 1rem;*/ + z-index: 8; + top: 50px; + bottom: 0; + left: 0; + display: block; + overflow: visible; + overflow: auto; + max-width: 13rem; + padding: 1rem; + /*width: 15rem;*/ + /*text-align: justify;*/ + /*opacity: .3;*/ + color: #000; + background-color: rgba(255,255,255,.5); + /*background-color: #fff;*/ + -webkit-box-shadow: 0 0 3px 1px; + -moz-box-shadow: 0 0 3px 1px; + box-shadow: 0 0 3px 1px; + + &:empty { + display: none; + } } .sidebar_right { - right: 0; - left: auto; + right: 0; + left: auto; } .container { - position: relative; - max-width: 75rem; - margin-top: 0.5rem; - margin-right: auto; - margin-left: auto; - padding: 0; + position: relative; + max-width: 75rem; + margin-top: 0.5rem; + margin-right: auto; + margin-left: auto; + padding: 0 1rem; } .announcements { - position: fixed; - z-index: 10; - right: 0; - bottom: 0; - left: 0; - display: block; - width: 100%; - /*padding-top: 1rem;*/ - text-align: center; + position: fixed; + z-index: 10; + right: 0; + bottom: 0; + left: 0; + display: block; + width: 100%; + /*padding-top: 1rem;*/ + text-align: center; } .announcement { - position: relative; - /*z-index: 2;*/ - /*float: right;*/ - max-width: 40rem; - margin-top: 1rem; - margin-right: auto; - margin-left: auto; - padding: 0.75rem; - text-align: center; - -webkit-border-top-left-radius: 0.8rem; - -moz-border-radius-topleft: 0.8rem; - border-top-left-radius: 0.8rem; - -webkit-border-top-right-radius: 0.8rem; - -moz-border-radius-topright: 0.8rem; - border-top-right-radius: 0.8rem; + position: relative; + /*z-index: 2;*/ + /*float: right;*/ + max-width: 40rem; + margin-top: 1rem; + margin-right: auto; + margin-left: auto; + padding: 0.75rem; + text-align: center; + -webkit-border-top-left-radius: 0.8rem; + -moz-border-radius-topleft: 0.8rem; + border-top-left-radius: 0.8rem; + -webkit-border-top-right-radius: 0.8rem; + -moz-border-radius-topright: 0.8rem; + border-top-right-radius: 0.8rem; + color: #fff; + background-color: #333; + -webkit-box-shadow: 0 0 3px 1px; + -moz-box-shadow: 0 0 3px 1px; + box-shadow: 0 0 3px 1px; + + .btn { + font-size: 2rem; + position: absolute; + top: 0; + right: 0; + display: block; + width: 2.75rem; + height: 2.75rem; + padding: 0; color: #fff; - background-color: #333; - -webkit-box-shadow: 0 0 3px 1px; - -moz-box-shadow: 0 0 3px 1px; - box-shadow: 0 0 3px 1px; + border-style: none; + background-color: transparent; - .btn { - font-size: 2rem; - position: absolute; - top: 0; - right: 0; - display: block; - width: 2.75rem; - height: 2.75rem; - padding: 0; - color: #fff; - border-style: none; - background-color: transparent; - - &:active, - &:hover { - font-size: 2.1rem; - color: #fff; - border-style: none; - background-color: transparent; - } + &:active, + &:hover { + font-size: 2.1rem; + color: #fff; + border-style: none; + background-color: transparent; } + } } .apps { - max-width: 100%; - margin-right: auto; - margin-left: auto; + max-width: 100%; + margin-right: auto; + margin-left: auto; + padding: 0; + + .app-category { + position: relative; + margin: 2rem 1rem; + display: block; + width: 100%; + + h3 { + margin: 1rem 0 0; + font-size: 1.3rem; + } + } + + .app-container { + position: relative; + display: inline-block; + overflow: hidden; padding: 0; + margin: .8rem .8rem 0 0; + + .app-button { + margin: 0; + text-align: left; + width: 11rem; + height: 11rem; + padding: 3.8rem 1rem 1rem; + background-color: color(button_background); + @include round-corners(rounding(app)); + vertical-align: text-bottom; + + &:hover { + text-decoration: none; + .app-icon { + font-size: 2.5rem; + right: .95rem; + top: .95rem; + } + } + + .app-icon { + position: absolute; + right: 1.2rem; + top: 1.2rem; + text-align: right; + color: color(button_icon) !important; + font: font(awesome); + font-size: 2rem; + display: block; + height: 3rem; + padding: 0; + margin: 0; + } + + .app-label { + display: table-cell; + width: 100%; + height: 4rem; + color: color(button_text); + font-size: 1.2rem; + font-weight: bold; + text-align: left; + line-height: 2rem; + overflow: hidden; + vertical-align: bottom; + } + + .app-banner { + position: absolute; + display: inline-block; + bottom: 0rem; + left: 0rem; + padding: 0 .7rem; + background-color: rgba(0, 0, 0, .15); + color: color(button_icon); + width: 100%; + height: 2.3rem; - .app_container { - margin: 0 auto 1rem; + @include round-corners-bottom(rounding(app)); - a { - float: none; - color: $color_gray_dark; + font-size: .7rem; + font-weight: normal; - &:hover { - text-decoration: none; - color: $color_gray_dark !important; + .app-beat { + @include heartbeat(speed(fast)); + } - .app_icon { - font-size: 5.5rem; - margin: 1.75rem auto; - } - } + .app-opsoro { + display: inline-block; + width: 2.1rem; + height: 1.8rem; + margin: .25rem 0; } - .app_button { - position: relative; - display: block; - overflow: hidden; - width: 9rem; - height: 9rem; - margin: 0.5rem auto; - text-align: center; - vertical-align: middle; - opacity: 1; - background-color: $color_button_background; - border-radius: 0.8rem; - -webkit-box-shadow: 2px 2px 3px 1px rgba(0, 0, 0, .75); - -moz-box-shadow: 2px 2px 3px 1px rgba(0, 0, 0, .75); - box-shadow: 2px 2px 3px 1px rgba(0, 0, 0, .75); - - .app_icon { - font: normal normal normal 14px/1 FontAwesome; - font-size: 5rem; - display: inline-block; - width: 100%; - margin: 2rem auto; - } - - .app_banner { - position: absolute; - display: block; - bottom: 0; - left: 0; - width: 100%; - height: 1rem; - } + .app-by { + display: inline-block; + margin: .8rem 0; } - .app_label { - font-size: 1.2rem; - font-weight: normal; - overflow: hidden; - width: 100%; - text-align: center; + .app-author { + font-weight: bold; + display: inline-block; + margin: .8rem 0; } + + .app-status { + display: inline-block; + float: right; + margin: .65rem 0; + + * { + display: inline-block; + vertical-align: middle; + font: font(awesome); + font-size: 1rem; + } + } + } } + } } -.reveal-modal { +.reveal { + position: absolute; + left: 0; + right: 0; + top: 1rem; + margin-right: auto; + margin-left: auto; + padding: 0; + color: #4d4d4d; + border: 0; + border-radius: 0.75rem; + @include round-corners(rounding(small)); + background: color(white); + // -webkit-box-shadow: 0.5rem 0.5rem 0 0 rgba(50, 50, 50, .75); + // -moz-box-shadow: 0.5rem 0.5rem 0 0 rgba(50, 50, 50, .75); + // box-shadow: 0.5rem 0.5rem 0 0 rgba(50, 50, 50, .75); + @include light-shadow(); + + .titlebar { + font-size: 1.5rem; + font-weight: bold; + position: relative; + padding: 0.5rem; + text-align: center; + color: color(reveal_text); + // border-bottom: 0.25rem solid #545454; + // -webkit-border-top-left-radius: 0.5rem; + // -moz-border-radius-topleft: 0.5rem; + // border-top-left-radius: 0.5rem; + // -webkit-border-top-right-radius: 0.5rem; + // -moz-border-radius-topright: 0.5rem; + // border-top-right-radius: 0.5rem; + background: color(reveal_background); + + &.red { + border-bottom: 0.25rem solid #79261d; + background: color(reveal_red); + } + + &.green { + border-bottom: 0.25rem solid #26791d; + background: color(reveal_green); + } + } + + .content { + padding: 1rem; + } + + .close-button { + font-size: 2rem; + font-weight: normal; position: absolute; - top: 1rem; + top: 0.5rem; + // right: auto; right: 1rem; - left: 1rem; - margin-right: auto; - margin-left: auto; - padding: 0; - color: #4d4d4d; - border: 0; - border-radius: 0.75rem; - background: #fff; - -webkit-box-shadow: 0.5rem 0.5rem 0 0 rgba(50, 50, 50, .75); - -moz-box-shadow: 0.5rem 0.5rem 0 0 rgba(50, 50, 50, .75); - box-shadow: 0.5rem 0.5rem 0 0 rgba(50, 50, 50, .75); - - .titlebar { - font-size: 2rem; - font-weight: bold; - position: relative; - padding: 0.5rem; - text-align: center; - color: #fff; - border-bottom: 0.25rem solid #545454; - -webkit-border-top-left-radius: 0.5rem; - -moz-border-radius-topleft: 0.5rem; - border-top-left-radius: 0.5rem; - -webkit-border-top-right-radius: 0.5rem; - -moz-border-radius-topright: 0.5rem; - border-top-right-radius: 0.5rem; - background: #b2afa1; - - &.red { - border-bottom: 0.25rem solid #79261d; - background: #b2382a; - } + cursor: pointer; + color: color(reveal_text); - &.green { - border-bottom: 0.25rem solid #26791d; - background: #38b22a; - } + &:hover { + font-size: 2.5rem; + top: 0.25rem; + right: 0.75rem; } - - .content { - padding: 1rem; + } + + .big-button { + width: 7rem; + height: 7rem; + background-color: color(button_background); + @include round-corners(rounding(small)); + + .icon { + color: color(button_icon) !important; + font: font(awesome); + font-size: 3rem; + display: inline-block; + width: 100%; + margin: 0.5rem auto; } - .close-reveal { - font-size: 2rem; - font-weight: normal; - position: absolute; - top: 1rem; - right: auto; - left: 1rem; - cursor: pointer; - color: #fff; - - &:hover { - font-size: 2.5rem; - top: 0.75rem; - left: 0.75rem; - } + .text { + color: color(white); + font-weight: normal; + overflow: hidden; + width: 100%; + text-align: center; } - .btnClose { - font-size: 2rem; - font-weight: normal; - position: absolute; - top: 0.5rem; - right: auto; - left: 1rem; - cursor: pointer; - color: #fff; - - &:hover { - font-size: 2.5rem; - top: 0.25rem; - left: 0.75rem; - } + &:hover { + text-decoration: underline; + color: color(button_text) !important; + + .app-icon { + color: color(button_icon) !important; + font-size: 4rem; + margin: 0 auto; + } } + } } .float_right { - float: right; + float: right; } .actionbar { - min-height: 4rem; - margin: -.5rem 0 1rem; // 1rem; - padding: 0.5rem 1rem; - background: #23774e; - border-radius: 0.5rem; + min-height: 4rem; + margin: 0 -1rem 1rem; // 1rem; + padding: 0.5rem 1.5rem 0.3rem; + color: color(actionbar_text); + background: color(actionbar_background); + // @include round-corners(rounding(all)); + @include round-corners(2.5rem); + + .action { + display: inline-block; + min-width: 3rem; + padding: 0 0.5rem; + text-align: center; + color: color(actionbar_text); + float: right; + @include round-corners(rounding(micro)); - .action { - display: inline-block; - min-width: 3rem; - padding: 0 0.5rem; - text-align: center; - color: #fff; - -webkit-border-radius: 0.25rem; - -moz-border-radius: 0.25rem; - border-radius: 0.25rem; - - .text { - font-size: 0.75rem; - font-weight: bold; - text-transform: uppercase; - } + .text { + color: color(actionbar_text); + font-size: 0.75rem; + font-weight: bold; + text-transform: uppercase; } + } + + .action.active, + .action:hover { + color: color(actionbar_text_hover); + // background: #fff; + } + + .icon { + color: color(actionbar_text); + vertical-align: top; + display: inline-block; + font-size: 3rem; + margin: 0 0.8rem 0 0; + } - .action.active, - .action:hover { - color: #4d4d4d; - background: #fff; - } + .spacer { + display: inline-block; + width: 2rem; + float: right; + margin: 0; + padding: 0.5rem; + } - .spacer { - display: inline-block; - width: 2rem; + .filebox { + display: inline-block; + overflow: hidden; + min-width: 7rem; + max-width: 20rem; + white-space: nowrap; + text-overflow: ellipsis; + color: color(actionbar_text); + + .filename { + font-weight: bold; + text-transform: uppercase; } - .filebox { - display: inline-block; - overflow: hidden; - min-width: 7rem; - max-width: 20rem; - white-space: nowrap; - text-overflow: ellipsis; - color: #fff; - - .filename { - font-weight: bold; - text-transform: uppercase; - } - - .status { - font-size: 0.75rem; - font-weight: bold; - text-transform: uppercase; - } + .status { + font-size: 0.75rem; + font-weight: bold; + text-transform: uppercase; } + } - &:empty { - display: none; - } + &:empty { + display: none; + } } .contentwrapper * { - font: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace !important; + font: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace !important; } .fullscreen { - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - background-color: $color_gray_light; - padding: 0; + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: color(gray_light); + padding: 0; + margin: 0; + z-index: 9; + + .contentwrapper { + height: calc(100vh - 4rem - 4.15rem); + } + + .console { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + + .actionbar { margin: 0; - z-index: 9; - - .contentwrapper { - height: calc(100vh - 4rem - 4.15rem); - } - - .console { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; - } - - .actionbar { - margin: 0; - border-radius: 0; - } + border-radius: 0; + } - .container { - margin: 0; - padding: 0; - max-width: 100%; - width: 100%; - height: 100%; - } + .container { + margin: 0; + padding: 0; + max-width: 100%; + width: 100%; + height: 100%; + } } .filebrowser { - position: fixed; - /*top: 5rem;*/ - right: 1rem; - bottom: 3rem; - left: 1rem; - - .content { - position: absolute; - top: 4rem; - bottom: 0; - width: 100%; - } + position: fixed; + bottom: 3rem; + @include no_selection(); - .actionbar .actionBarItem { - position: relative; - float: left; - min-width: 4rem; - } + .content { + position: absolute; + top: 4rem; + bottom: 0; + width: 100%; + padding: 0; + } - .foldercontent { - position: absolute; - top: 4.5rem; - bottom: 0.5rem; - left: 0; - overflow-x: hidden; - overflow-y: scroll; - width: 100%; - padding: 0 3rem 3rem; + .actionbar .actionBarItem { + position: relative; + float: left; + min-width: 4rem; + } - .button { - font-size: 1.5rem; - width: 5rem; - margin-left: 0.5rem; - padding: 0; + .foldercontent { + position: absolute; + top: 0.5rem; + bottom: 0.5rem; + left: 0; + overflow-x: hidden; + overflow-y: scroll; + width: 100%; + padding: 0 1rem 1rem; + + .browseritem { + width: 100%; + text-align: left; + margin: 0; + padding: 0.2rem 1rem; + border-radius: 0.25rem; + background-color: color(white); + color: color(gray_darker); + overflow-x: hidden; + white-space: nowrap; + + &:hover { + .browseritemname { + color: color(green); } - - .alert { - width: 2.5rem; + .browseritemoptions { + opacity: 1; } + } - .browseritem { - width: 100%; - min-height: 2rem; - margin: 0.1rem; - padding: 0.2rem; - border-radius: 0.25rem; - - &:hover { - background-color: #f2f2f2; - - .browseritemoptions { - opacity: 1; - } - } - - a { - margin: 0; - } - - .browseritemname { - font-size: 1.5rem; - font-weight: bold; - margin-left: 2rem; - } - - .browseritemoptions { - float: right; - padding: 0.15rem; - } - - .browseritemoptions { - -webkit-transition: opacity 0.1s ease-in-out; - -moz-transition: opacity 0.1s ease-in-out; - transition: opacity 0.1s ease-in-out; - opacity: 0; - } + .icon { + vertical-align: middle; + color: color(green); + font-size: 1.5rem; + } + + .browseritemname { + color: color(reveal_text); + font-size: 1rem; + font-weight: bold; + margin-left: 1rem; + overflow-x: hidden; + } + + .browseritemoptions { + float: right; + padding: 0.15rem; + -webkit-transition: opacity 0.1s ease-in-out; + -moz-transition: opacity 0.1s ease-in-out; + transition: opacity 0.1s ease-in-out; + opacity: 0; + + .button { + color: color(gray_light); + background-color: transparent; + margin: 0; + padding: 0; + font-size: 1rem; + + &:hover { + color: color(reveal_text_hover); + } } + } } + } } #message_popup .content .buttons { - position: relative; - text-align: center; + position: relative; + text-align: center; - .button { - margin-right: 1rem; - margin-left: 1rem; - } + .button { + margin-right: 1rem; + margin-left: 1rem; + } +} + +.clickedit span { + font-size: 1.4rem; +} + +.clickedit span.fa-pencil { + margin-left: 0.2rem; + display: none; + color: #888; +} + +.clickedit input { + height: 2.1rem; +} + +.clickedit:hover span.fa-pencil { + display: inline; +} + +.emoji { + font-family: 'EmojiOne' !important; + font-size: 3rem; + text-align: center; + display: inline-block; + // Fix chrome transparent background + background-image: url("/static/images/emoji_background.png"); + background-size: contain; + background-repeat: no-repeat; + line-height: 1; +} + +.draggable { + cursor: move; +} + +.selected_module path, +.selected_module rect { + stroke: #FFCE39 !important; +} + +.slider { + .slider-handle { + background-color: color(slider_handle); + } +} + +.button { + background-color: color(default_button); + + &.alert { + background-color: color(alert_button); + } + + &.success { + background-color: color(success_button); + } } diff --git a/src/opsoro/server/static/css/opsoro/_animations.scss b/src/opsoro/server/static/css/opsoro/_animations.scss new file mode 100644 index 0000000..eb7287e --- /dev/null +++ b/src/opsoro/server/static/css/opsoro/_animations.scss @@ -0,0 +1,28 @@ + +$speed: ( + fastest : .1s, + faster : .2s, + fast : .5s, + slow : 1s, + slower : 1.5s, +); + + +@mixin heartbeat($speed) { + animation: beat $speed infinite alternate; + transform-origin: center; +} + +/* Heart beat animation */ +@keyframes beat { + to { transform: scale(.8); } +} + +@function speed($key) { + @if map-has-key($speed, $key) { + @return map-get($speed, $key); + } + + @warn "Unknown `#{$key}` in $speed."; + @return .5s; +} diff --git a/src/opsoro/server/static/css/opsoro/_colors.scss b/src/opsoro/server/static/css/opsoro/_colors.scss new file mode 100644 index 0000000..eb0d54e --- /dev/null +++ b/src/opsoro/server/static/css/opsoro/_colors.scss @@ -0,0 +1,58 @@ +$green : #00E58B; +$orange : #FFAF19; +$red : #FF517E; +$blue : #0095FF; +$yellow : #FFF222; +$purple : #8200E5; +$white : #FFF; +$black : #000; +$gray_lighter : #F2F2F2; +$gray_light : #C7C8C9; +$gray : #DDD; +$gray_dark : #313334; //27292a +$gray_darker : #1C1D1D; //27292a + +$colors: ( + green : $green, //22b472 + green_dark : #22774D, + blue : $blue, //36c9ff + orange : $orange, + red : $red, + yellow : $yellow, + purple : $purple, + gray_lighter : $gray_lighter, + gray_light : $gray_light, + gray : $gray, + gray_dark : $gray_dark, //27292a + gray_darker : $gray_darker, //27292a + white : $white, + button_icon : $white, + button_text : $white, + button_background : $gray_dark, + global_text : #27292a, + global_background : $white, + statusbar_text : $gray_dark, + statusbar_text_hover: $black, + statusbar_background: $gray_lighter, + actionbar_text : $white, + actionbar_text_hover: $gray_lighter, + actionbar_background: $gray, + reveal_text : $gray_dark, + reveal_text_hover : $black, + reveal_background : $white, + reveal_red : $red, + reveal_green : #22774D, + alert_button : $red, + default_button : $blue, + success_button : $green, + slider_handle : $blue, +); + +@function color($key) { + @if map-has-key($colors, $key) { + @return map-get($colors, $key); + } + + @warn "Unknown `#{$key}` in $colors."; + @return #000; +} diff --git a/src/opsoro/server/static/css/opsoro/_fonts.scss b/src/opsoro/server/static/css/opsoro/_fonts.scss new file mode 100644 index 0000000..a053c74 --- /dev/null +++ b/src/opsoro/server/static/css/opsoro/_fonts.scss @@ -0,0 +1,40 @@ +$fonts: ( + header : 'Avenir Next', + text : 'Avenir Next', + emoji : 'EmojiOne', + awesome : normal normal normal 14px/1 FontAwesome, +); + +@font-face { + font-family: 'Avenir Next'; + src: url('../fonts/AvenirNext-Regular.ttf') format('truetype'); + font-style: normal; + font-weight: normal; +} +@font-face { + font-family: 'Avenir Next'; + src: url('../fonts/AvenirNext-DemiBold.ttf') format('truetype'); + font-weight: 500; + font-style: normal; +} +@font-face { + font-family: 'Avenir Next'; + src: url('../fonts/AvenirNext-Bold.ttf') format('truetype'); + font-weight: 700; + font-style: normal; +} +@font-face { + font-family: 'EmojiOne'; + src: url('../fonts/emojione-svg.woff2') format('truetype'); + font-weight: 700; + font-style: normal; +} + +@function font($key) { + @if map-has-key($fonts, $key) { + @return map-get($fonts, $key); + } + + @warn "Unknown `#{$key}` in $fonts."; + @return 'Avenir Next'; +} diff --git a/src/opsoro/server/static/css/opsoro/_mixins.scss b/src/opsoro/server/static/css/opsoro/_mixins.scss new file mode 100644 index 0000000..0d51b41 --- /dev/null +++ b/src/opsoro/server/static/css/opsoro/_mixins.scss @@ -0,0 +1,113 @@ +$rounding: ( + micro : .25rem, + mini : .5rem, + small : .7rem, + medium : 1rem, + large : 1.5rem, + all : 50%, + app : .7rem, +); + +@mixin no_selection() { + -webkit-touch-callout: none; /* iOS Safari */ + -webkit-user-select: none; /* Chrome/Safari/Opera */ + -khtml-user-select: none; /* Konqueror */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* Internet Explorer/Edge */ + user-select: none; /* Non-prefixed version, currently not supported by any browser */ +} + +@mixin round-corners($radius) { + -webkit-border-radius: $radius; + -moz-border-radius: $radius; + border-radius: $radius; +} + +@mixin round-corners-left($radius) { + -webkit-border-top-left-radius: $radius; + -webkit-border-bottom-left-radius: $radius; + -moz-border-radius-topleft: $radius; + -moz-border-radius-bottomleft: $radius; + border-top-left-radius: $radius; + border-bottom-left-radius: $radius; +} + +@mixin round-corners-right($radius) { + -webkit-border-top-right-radius: $radius; + -webkit-border-bottom-right-radius: $radius; + -moz-border-radius-topright: $radius; + -moz-border-radius-bottomright: $radius; + border-top-right-radius: $radius; + border-bottom-right-radius: $radius; +} + +@mixin round-corners-top($radius) { + -webkit-border-top-left-radius: $radius; + -webkit-border-top-right-radius: $radius; + -moz-border-radius-topleft: $radius; + -moz-border-radius-topright: $radius; + border-top-left-radius: $radius; + border-top-right-radius: $radius; +} + +@mixin round-corners-bottom($radius) { + -webkit-border-bottom-left-radius: $radius; + -webkit-border-bottom-right-radius: $radius; + -moz-border-radius-bottomleft: $radius; + -moz-border-radius-bottomright: $radius; + border-bottom-left-radius: $radius; + border-bottom-right-radius: $radius; +} + +@mixin shadow() { // OLD OLD OLD + // box-shadow: 0 0 8px rgba(0, 0, 0, .8); + // -webkit-box-shadow: 0 0 8px rgba(0, 0, 0, .8); + // -moz-box-shadow: 0 0 8px rgba(0, 0, 0, .8); + -webkit-box-shadow: 3px 3px 2px rgba(0, 0, 0, .8); + -moz-box-shadow: 3px 3px 2px rgba(0, 0, 0, .8); + box-shadow: 3px 3px 2px rgba(0, 0, 0, .8); +} + +@mixin light-shadow() { + -webkit-box-shadow: 0px 1px 4px 2px rgba(0, 0, 0, .1); + -moz-box-shadow: 0px 1px 4px 2px rgba(0, 0, 0, .1); + box-shadow: 0px 1px 4px 2px rgba(0, 0, 0, .1); +} +@mixin app-shadow() { + // -webkit-box-shadow: 0px 1px 8px 2px rgba(0, 0, 0, .1); + // -moz-box-shadow: 0px 1px 8px 2px rgba(0, 0, 0, .1); + // box-shadow: 0px 1px 4px 8px rgba(0, 0, 0, .1); + + -webkit-box-shadow: 0px 10px 20px 2px rgba(0, 0, 0, .8); + -moz-box-shadow: 0px 10px 20px 2px rgba(0, 0, 0, .8); + box-shadow: 0px 10px 20px 2px rgba(0, 0, 0, .8); +} + +@mixin optional-at-root($sel) { + @at-root #{if(not &, $sel, selector-append(&, $sel))} { + @content; + } +} +@mixin placeholder { + @include optional-at-root('::-webkit-input-placeholder') { + @content; + } + @include optional-at-root(':-moz-placeholder') { + @content; + } + @include optional-at-root('::-moz-placeholder') { + @content; + } + @include optional-at-root(':-ms-input-placeholder') { + @content; + } +} + +@function rounding($key) { + @if map-has-key($rounding, $key) { + @return map-get($rounding, $key); + } + + @warn "Unknown `#{$key}` in $rounding."; + @return ''; +} diff --git a/src/opsoro/server/static/css/opsoro_old.css b/src/opsoro/server/static/css/opsoro_old.css index 231bfb8..c12374e 100644 --- a/src/opsoro/server/static/css/opsoro_old.css +++ b/src/opsoro/server/static/css/opsoro_old.css @@ -709,17 +709,17 @@ fieldset legend margin: 0; padding: 0; } -#errors .alert-box +#errors .callout { margin: 0 2rem .5rem 2rem; border-radius: .25rem; } -#errors .alert-box .close +#errors .callout .close { opacity: .8; }*/ -#errors .alert-box +#errors .callout { margin-bottom: 0; } diff --git a/src/opsoro/server/static/fonts/emojione-svg.woff2 b/src/opsoro/server/static/fonts/emojione-svg.woff2 new file mode 100644 index 0000000..a8d4903 Binary files /dev/null and b/src/opsoro/server/static/fonts/emojione-svg.woff2 differ diff --git a/src/opsoro/server/static/images/emoji_background.png b/src/opsoro/server/static/images/emoji_background.png new file mode 100644 index 0000000..3a87622 Binary files /dev/null and b/src/opsoro/server/static/images/emoji_background.png differ diff --git a/src/opsoro/server/static/images/emojione/1f600.svg b/src/opsoro/server/static/images/emojione/1f600.svg new file mode 100644 index 0000000..0b3afa8 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f600.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f601.svg b/src/opsoro/server/static/images/emojione/1f601.svg new file mode 100644 index 0000000..beed5e4 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f601.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f602.svg b/src/opsoro/server/static/images/emojione/1f602.svg new file mode 100644 index 0000000..3f4683f --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f602.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f603.svg b/src/opsoro/server/static/images/emojione/1f603.svg new file mode 100644 index 0000000..c0bd601 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f603.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f604.svg b/src/opsoro/server/static/images/emojione/1f604.svg new file mode 100644 index 0000000..2d49f8a --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f604.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f605.svg b/src/opsoro/server/static/images/emojione/1f605.svg new file mode 100644 index 0000000..323760e --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f605.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f606.svg b/src/opsoro/server/static/images/emojione/1f606.svg new file mode 100644 index 0000000..13e4949 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f606.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f607.svg b/src/opsoro/server/static/images/emojione/1f607.svg new file mode 100644 index 0000000..49d7cb3 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f607.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f608.svg b/src/opsoro/server/static/images/emojione/1f608.svg new file mode 100644 index 0000000..ce43439 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f608.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f609.svg b/src/opsoro/server/static/images/emojione/1f609.svg new file mode 100644 index 0000000..1f9feb1 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f609.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f60a.svg b/src/opsoro/server/static/images/emojione/1f60a.svg new file mode 100644 index 0000000..5a8ebe1 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f60a.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f60b.svg b/src/opsoro/server/static/images/emojione/1f60b.svg new file mode 100644 index 0000000..7b5e4d6 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f60b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f60c.svg b/src/opsoro/server/static/images/emojione/1f60c.svg new file mode 100644 index 0000000..9e6cf42 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f60c.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f60d.svg b/src/opsoro/server/static/images/emojione/1f60d.svg new file mode 100644 index 0000000..d8c1138 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f60d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f60e.svg b/src/opsoro/server/static/images/emojione/1f60e.svg new file mode 100644 index 0000000..5689040 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f60e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f60f.svg b/src/opsoro/server/static/images/emojione/1f60f.svg new file mode 100644 index 0000000..abc639a --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f60f.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f610.svg b/src/opsoro/server/static/images/emojione/1f610.svg new file mode 100644 index 0000000..2f9f63f --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f610.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f611.svg b/src/opsoro/server/static/images/emojione/1f611.svg new file mode 100644 index 0000000..4c28b48 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f611.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f612.svg b/src/opsoro/server/static/images/emojione/1f612.svg new file mode 100644 index 0000000..04ecc66 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f612.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f613.svg b/src/opsoro/server/static/images/emojione/1f613.svg new file mode 100644 index 0000000..c4c63e3 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f613.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f614.svg b/src/opsoro/server/static/images/emojione/1f614.svg new file mode 100644 index 0000000..8c6e2c4 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f614.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f615.svg b/src/opsoro/server/static/images/emojione/1f615.svg new file mode 100644 index 0000000..515bc19 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f615.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f616.svg b/src/opsoro/server/static/images/emojione/1f616.svg new file mode 100644 index 0000000..9fa2350 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f616.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f617.svg b/src/opsoro/server/static/images/emojione/1f617.svg new file mode 100644 index 0000000..32b7d8f --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f617.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f618.svg b/src/opsoro/server/static/images/emojione/1f618.svg new file mode 100644 index 0000000..b428910 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f618.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f619.svg b/src/opsoro/server/static/images/emojione/1f619.svg new file mode 100644 index 0000000..c0d590b --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f619.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f61a.svg b/src/opsoro/server/static/images/emojione/1f61a.svg new file mode 100644 index 0000000..0825d75 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f61a.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f61b.svg b/src/opsoro/server/static/images/emojione/1f61b.svg new file mode 100644 index 0000000..419eaab --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f61b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f61c.svg b/src/opsoro/server/static/images/emojione/1f61c.svg new file mode 100644 index 0000000..6400204 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f61c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f61d.svg b/src/opsoro/server/static/images/emojione/1f61d.svg new file mode 100644 index 0000000..ead29d9 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f61d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f61e.svg b/src/opsoro/server/static/images/emojione/1f61e.svg new file mode 100644 index 0000000..c933515 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f61e.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f61f.svg b/src/opsoro/server/static/images/emojione/1f61f.svg new file mode 100644 index 0000000..bba93b7 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f61f.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f620.svg b/src/opsoro/server/static/images/emojione/1f620.svg new file mode 100644 index 0000000..74cb59e --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f620.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f621.svg b/src/opsoro/server/static/images/emojione/1f621.svg new file mode 100644 index 0000000..8581790 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f621.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f622.svg b/src/opsoro/server/static/images/emojione/1f622.svg new file mode 100644 index 0000000..9b75a67 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f622.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f623.svg b/src/opsoro/server/static/images/emojione/1f623.svg new file mode 100644 index 0000000..77793c6 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f623.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f624.svg b/src/opsoro/server/static/images/emojione/1f624.svg new file mode 100644 index 0000000..f6cc578 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f624.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f625.svg b/src/opsoro/server/static/images/emojione/1f625.svg new file mode 100644 index 0000000..fa36147 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f625.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f626.svg b/src/opsoro/server/static/images/emojione/1f626.svg new file mode 100644 index 0000000..7f7cc0d --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f626.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f627.svg b/src/opsoro/server/static/images/emojione/1f627.svg new file mode 100644 index 0000000..b397318 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f627.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f628.svg b/src/opsoro/server/static/images/emojione/1f628.svg new file mode 100644 index 0000000..1a57a7a --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f628.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f629.svg b/src/opsoro/server/static/images/emojione/1f629.svg new file mode 100644 index 0000000..7cc1df1 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f629.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f62a.svg b/src/opsoro/server/static/images/emojione/1f62a.svg new file mode 100644 index 0000000..544b6fa --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f62a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f62b.svg b/src/opsoro/server/static/images/emojione/1f62b.svg new file mode 100644 index 0000000..16cff88 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f62b.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f62c.svg b/src/opsoro/server/static/images/emojione/1f62c.svg new file mode 100644 index 0000000..6da86a7 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f62c.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f62d.svg b/src/opsoro/server/static/images/emojione/1f62d.svg new file mode 100644 index 0000000..0cb8326 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f62d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f62e.svg b/src/opsoro/server/static/images/emojione/1f62e.svg new file mode 100644 index 0000000..997d282 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f62e.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f62f.svg b/src/opsoro/server/static/images/emojione/1f62f.svg new file mode 100644 index 0000000..3a94920 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f62f.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f630.svg b/src/opsoro/server/static/images/emojione/1f630.svg new file mode 100644 index 0000000..7a68cc7 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f630.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f631.svg b/src/opsoro/server/static/images/emojione/1f631.svg new file mode 100644 index 0000000..0060281 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f631.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f632.svg b/src/opsoro/server/static/images/emojione/1f632.svg new file mode 100644 index 0000000..b5fd14e --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f632.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f633.svg b/src/opsoro/server/static/images/emojione/1f633.svg new file mode 100644 index 0000000..4e193ad --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f633.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f634.svg b/src/opsoro/server/static/images/emojione/1f634.svg new file mode 100644 index 0000000..b546481 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f634.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f635.svg b/src/opsoro/server/static/images/emojione/1f635.svg new file mode 100644 index 0000000..661cfc5 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f635.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f636.svg b/src/opsoro/server/static/images/emojione/1f636.svg new file mode 100644 index 0000000..8ba407a --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f636.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f637.svg b/src/opsoro/server/static/images/emojione/1f637.svg new file mode 100644 index 0000000..7cac8e8 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f637.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f641.svg b/src/opsoro/server/static/images/emojione/1f641.svg new file mode 100644 index 0000000..0a6675a --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f641.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f642.svg b/src/opsoro/server/static/images/emojione/1f642.svg new file mode 100644 index 0000000..6a9851d --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f642.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f643.svg b/src/opsoro/server/static/images/emojione/1f643.svg new file mode 100644 index 0000000..71f3f2d --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f643.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f644.svg b/src/opsoro/server/static/images/emojione/1f644.svg new file mode 100644 index 0000000..f6190db --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f644.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f910.svg b/src/opsoro/server/static/images/emojione/1f910.svg new file mode 100644 index 0000000..0956985 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f910.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f911.svg b/src/opsoro/server/static/images/emojione/1f911.svg new file mode 100644 index 0000000..1b2b88b --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f911.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f912.svg b/src/opsoro/server/static/images/emojione/1f912.svg new file mode 100644 index 0000000..971005c --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f912.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f913.svg b/src/opsoro/server/static/images/emojione/1f913.svg new file mode 100644 index 0000000..040b14f --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f913.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f914.svg b/src/opsoro/server/static/images/emojione/1f914.svg new file mode 100644 index 0000000..00ee9b3 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f914.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f915.svg b/src/opsoro/server/static/images/emojione/1f915.svg new file mode 100644 index 0000000..ddf8eb2 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f915.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f917.svg b/src/opsoro/server/static/images/emojione/1f917.svg new file mode 100644 index 0000000..d8c9fb5 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f917.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f922.svg b/src/opsoro/server/static/images/emojione/1f922.svg new file mode 100644 index 0000000..2c451d8 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f922.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f924.svg b/src/opsoro/server/static/images/emojione/1f924.svg new file mode 100644 index 0000000..866e97b --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f924.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f925.svg b/src/opsoro/server/static/images/emojione/1f925.svg new file mode 100644 index 0000000..b864be6 --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f925.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/emojione/1f927.svg b/src/opsoro/server/static/images/emojione/1f927.svg new file mode 100644 index 0000000..e52ab7a --- /dev/null +++ b/src/opsoro/server/static/images/emojione/1f927.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/500px.svg b/src/opsoro/server/static/images/fontawesome/black/svg/500px.svg new file mode 100644 index 0000000..9a45130 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/500px.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/adjust.svg b/src/opsoro/server/static/images/fontawesome/black/svg/adjust.svg new file mode 100644 index 0000000..069898d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/adjust.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/adn.svg b/src/opsoro/server/static/images/fontawesome/black/svg/adn.svg new file mode 100644 index 0000000..36bc6ae --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/adn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/align-center.svg b/src/opsoro/server/static/images/fontawesome/black/svg/align-center.svg new file mode 100644 index 0000000..15bfe9a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/align-center.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/align-justify.svg b/src/opsoro/server/static/images/fontawesome/black/svg/align-justify.svg new file mode 100644 index 0000000..05cd8f3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/align-justify.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/align-left.svg b/src/opsoro/server/static/images/fontawesome/black/svg/align-left.svg new file mode 100644 index 0000000..9683648 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/align-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/align-right.svg b/src/opsoro/server/static/images/fontawesome/black/svg/align-right.svg new file mode 100644 index 0000000..abaf71d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/align-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/amazon.svg b/src/opsoro/server/static/images/fontawesome/black/svg/amazon.svg new file mode 100644 index 0000000..ccc5407 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/amazon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/ambulance.svg b/src/opsoro/server/static/images/fontawesome/black/svg/ambulance.svg new file mode 100644 index 0000000..8856895 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/ambulance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/anchor.svg b/src/opsoro/server/static/images/fontawesome/black/svg/anchor.svg new file mode 100644 index 0000000..d5c87b2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/anchor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/android.svg b/src/opsoro/server/static/images/fontawesome/black/svg/android.svg new file mode 100644 index 0000000..6a2f5f6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/android.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/angellist.svg b/src/opsoro/server/static/images/fontawesome/black/svg/angellist.svg new file mode 100644 index 0000000..f1fc4cc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/angellist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/angle-double-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/angle-double-down.svg new file mode 100644 index 0000000..1cc6e77 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/angle-double-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/angle-double-left.svg b/src/opsoro/server/static/images/fontawesome/black/svg/angle-double-left.svg new file mode 100644 index 0000000..e1045db --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/angle-double-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/angle-double-right.svg b/src/opsoro/server/static/images/fontawesome/black/svg/angle-double-right.svg new file mode 100644 index 0000000..df123b4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/angle-double-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/angle-double-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/angle-double-up.svg new file mode 100644 index 0000000..9361e7c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/angle-double-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/angle-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/angle-down.svg new file mode 100644 index 0000000..ac44b2a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/angle-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/angle-left.svg b/src/opsoro/server/static/images/fontawesome/black/svg/angle-left.svg new file mode 100644 index 0000000..5c6c5a9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/angle-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/angle-right.svg b/src/opsoro/server/static/images/fontawesome/black/svg/angle-right.svg new file mode 100644 index 0000000..8824cf8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/angle-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/angle-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/angle-up.svg new file mode 100644 index 0000000..4018041 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/angle-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/apple.svg b/src/opsoro/server/static/images/fontawesome/black/svg/apple.svg new file mode 100644 index 0000000..bae6d85 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/apple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/archive.svg b/src/opsoro/server/static/images/fontawesome/black/svg/archive.svg new file mode 100644 index 0000000..074dcdf --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/archive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/area-chart.svg b/src/opsoro/server/static/images/fontawesome/black/svg/area-chart.svg new file mode 100644 index 0000000..cf8b4a3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/area-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-down.svg new file mode 100644 index 0000000..eb01a49 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-left.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-left.svg new file mode 100644 index 0000000..525ea28 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-o-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-o-down.svg new file mode 100644 index 0000000..276b9f9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-o-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-o-left.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-o-left.svg new file mode 100644 index 0000000..0abf2b9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-o-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-o-right.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-o-right.svg new file mode 100644 index 0000000..5e977a6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-o-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-o-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-o-up.svg new file mode 100644 index 0000000..aafa5eb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-o-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-right.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-right.svg new file mode 100644 index 0000000..ad16407 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-up.svg new file mode 100644 index 0000000..3c00d8e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-circle-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrow-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-down.svg new file mode 100644 index 0000000..dd7c679 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrow-left.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-left.svg new file mode 100644 index 0000000..8b759ad --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrow-right.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-right.svg new file mode 100644 index 0000000..458853e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrow-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-up.svg new file mode 100644 index 0000000..8993021 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrow-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrows-alt.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrows-alt.svg new file mode 100644 index 0000000..a3debe1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrows-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrows-h.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrows-h.svg new file mode 100644 index 0000000..f781c7b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrows-h.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrows-v.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrows-v.svg new file mode 100644 index 0000000..2bd5159 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrows-v.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/arrows.svg b/src/opsoro/server/static/images/fontawesome/black/svg/arrows.svg new file mode 100644 index 0000000..501d6c1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/arrows.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/asterisk.svg b/src/opsoro/server/static/images/fontawesome/black/svg/asterisk.svg new file mode 100644 index 0000000..869f2af --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/asterisk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/at.svg b/src/opsoro/server/static/images/fontawesome/black/svg/at.svg new file mode 100644 index 0000000..4228a19 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/at.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/automobile.svg b/src/opsoro/server/static/images/fontawesome/black/svg/automobile.svg new file mode 100644 index 0000000..d4c7c33 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/automobile.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/backward.svg b/src/opsoro/server/static/images/fontawesome/black/svg/backward.svg new file mode 100644 index 0000000..ad4b7cb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/backward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/balance-scale.svg b/src/opsoro/server/static/images/fontawesome/black/svg/balance-scale.svg new file mode 100644 index 0000000..2a0e47e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/balance-scale.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/ban.svg b/src/opsoro/server/static/images/fontawesome/black/svg/ban.svg new file mode 100644 index 0000000..e606e0f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/ban.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bank.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bank.svg new file mode 100644 index 0000000..566f80d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bank.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bar-chart-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bar-chart-o.svg new file mode 100644 index 0000000..589b57d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bar-chart-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bar-chart.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bar-chart.svg new file mode 100644 index 0000000..589b57d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bar-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/barcode.svg b/src/opsoro/server/static/images/fontawesome/black/svg/barcode.svg new file mode 100644 index 0000000..eb9e204 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/barcode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bars.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bars.svg new file mode 100644 index 0000000..a3cd72b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/battery-0.svg b/src/opsoro/server/static/images/fontawesome/black/svg/battery-0.svg new file mode 100644 index 0000000..7dfb237 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/battery-0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/battery-1.svg b/src/opsoro/server/static/images/fontawesome/black/svg/battery-1.svg new file mode 100644 index 0000000..b9659d5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/battery-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/battery-2.svg b/src/opsoro/server/static/images/fontawesome/black/svg/battery-2.svg new file mode 100644 index 0000000..95cf953 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/battery-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/battery-3.svg b/src/opsoro/server/static/images/fontawesome/black/svg/battery-3.svg new file mode 100644 index 0000000..c543be3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/battery-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/battery-4.svg b/src/opsoro/server/static/images/fontawesome/black/svg/battery-4.svg new file mode 100644 index 0000000..31421fa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/battery-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/battery-empty.svg b/src/opsoro/server/static/images/fontawesome/black/svg/battery-empty.svg new file mode 100644 index 0000000..7dfb237 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/battery-empty.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/battery-full.svg b/src/opsoro/server/static/images/fontawesome/black/svg/battery-full.svg new file mode 100644 index 0000000..31421fa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/battery-full.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/battery-half.svg b/src/opsoro/server/static/images/fontawesome/black/svg/battery-half.svg new file mode 100644 index 0000000..95cf953 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/battery-half.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/battery-quarter.svg b/src/opsoro/server/static/images/fontawesome/black/svg/battery-quarter.svg new file mode 100644 index 0000000..b9659d5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/battery-quarter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/battery-three-quarters.svg b/src/opsoro/server/static/images/fontawesome/black/svg/battery-three-quarters.svg new file mode 100644 index 0000000..c543be3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/battery-three-quarters.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bed.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bed.svg new file mode 100644 index 0000000..e3f295c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/beer.svg b/src/opsoro/server/static/images/fontawesome/black/svg/beer.svg new file mode 100644 index 0000000..cb64a6d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/beer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/behance-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/behance-square.svg new file mode 100644 index 0000000..e22d5fc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/behance-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/behance.svg b/src/opsoro/server/static/images/fontawesome/black/svg/behance.svg new file mode 100644 index 0000000..680ee1f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/behance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bell-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bell-o.svg new file mode 100644 index 0000000..fa360a3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bell-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bell-slash-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bell-slash-o.svg new file mode 100644 index 0000000..afa2707 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bell-slash-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bell-slash.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bell-slash.svg new file mode 100644 index 0000000..1bf8fa3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bell-slash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bell.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bell.svg new file mode 100644 index 0000000..0746b05 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bicycle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bicycle.svg new file mode 100644 index 0000000..b338272 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bicycle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/binoculars.svg b/src/opsoro/server/static/images/fontawesome/black/svg/binoculars.svg new file mode 100644 index 0000000..36fce41 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/binoculars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/birthday-cake.svg b/src/opsoro/server/static/images/fontawesome/black/svg/birthday-cake.svg new file mode 100644 index 0000000..14f2b03 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/birthday-cake.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bitbucket-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bitbucket-square.svg new file mode 100644 index 0000000..73a3bb4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bitbucket-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bitbucket.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bitbucket.svg new file mode 100644 index 0000000..cd5f0b2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bitbucket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bitcoin.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bitcoin.svg new file mode 100644 index 0000000..e37edac --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bitcoin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/black-tie.svg b/src/opsoro/server/static/images/fontawesome/black/svg/black-tie.svg new file mode 100644 index 0000000..2e44722 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/black-tie.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bluetooth-b.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bluetooth-b.svg new file mode 100644 index 0000000..383f7f0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bluetooth-b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bluetooth.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bluetooth.svg new file mode 100644 index 0000000..aa5f7d8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bluetooth.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bold.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bold.svg new file mode 100644 index 0000000..656d81d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bold.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bolt.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bolt.svg new file mode 100644 index 0000000..7104cc7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bolt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bomb.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bomb.svg new file mode 100644 index 0000000..a07140f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bomb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/book.svg b/src/opsoro/server/static/images/fontawesome/black/svg/book.svg new file mode 100644 index 0000000..2c1ee42 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/book.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bookmark-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bookmark-o.svg new file mode 100644 index 0000000..3c9ca0c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bookmark-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bookmark.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bookmark.svg new file mode 100644 index 0000000..06ac708 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bookmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/briefcase.svg b/src/opsoro/server/static/images/fontawesome/black/svg/briefcase.svg new file mode 100644 index 0000000..cbd231d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/briefcase.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/btc.svg b/src/opsoro/server/static/images/fontawesome/black/svg/btc.svg new file mode 100644 index 0000000..e37edac --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/btc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bug.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bug.svg new file mode 100644 index 0000000..0d6bfb9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/building-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/building-o.svg new file mode 100644 index 0000000..51c989d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/building-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/building.svg b/src/opsoro/server/static/images/fontawesome/black/svg/building.svg new file mode 100644 index 0000000..7741219 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/building.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bullhorn.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bullhorn.svg new file mode 100644 index 0000000..b5a4a0f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bullhorn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bullseye.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bullseye.svg new file mode 100644 index 0000000..f583f5c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bullseye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/bus.svg b/src/opsoro/server/static/images/fontawesome/black/svg/bus.svg new file mode 100644 index 0000000..0bf44dc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/bus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/buysellads.svg b/src/opsoro/server/static/images/fontawesome/black/svg/buysellads.svg new file mode 100644 index 0000000..107ab22 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/buysellads.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cab.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cab.svg new file mode 100644 index 0000000..4b56629 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/calculator.svg b/src/opsoro/server/static/images/fontawesome/black/svg/calculator.svg new file mode 100644 index 0000000..c5dff72 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/calculator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/calendar-check-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/calendar-check-o.svg new file mode 100644 index 0000000..d258f14 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/calendar-check-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/calendar-minus-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/calendar-minus-o.svg new file mode 100644 index 0000000..1a418a2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/calendar-minus-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/calendar-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/calendar-o.svg new file mode 100644 index 0000000..89f2e81 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/calendar-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/calendar-plus-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/calendar-plus-o.svg new file mode 100644 index 0000000..7b30328 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/calendar-plus-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/calendar-times-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/calendar-times-o.svg new file mode 100644 index 0000000..7876635 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/calendar-times-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/calendar.svg b/src/opsoro/server/static/images/fontawesome/black/svg/calendar.svg new file mode 100644 index 0000000..a277882 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/calendar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/camera-retro.svg b/src/opsoro/server/static/images/fontawesome/black/svg/camera-retro.svg new file mode 100644 index 0000000..39955f7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/camera-retro.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/camera.svg b/src/opsoro/server/static/images/fontawesome/black/svg/camera.svg new file mode 100644 index 0000000..7daddc1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/car.svg b/src/opsoro/server/static/images/fontawesome/black/svg/car.svg new file mode 100644 index 0000000..d4c7c33 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/car.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/caret-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/caret-down.svg new file mode 100644 index 0000000..38a1a25 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/caret-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/caret-left.svg b/src/opsoro/server/static/images/fontawesome/black/svg/caret-left.svg new file mode 100644 index 0000000..4f14858 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/caret-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/caret-right.svg b/src/opsoro/server/static/images/fontawesome/black/svg/caret-right.svg new file mode 100644 index 0000000..02a55b7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/caret-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/caret-square-o-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/caret-square-o-down.svg new file mode 100644 index 0000000..30d3f51 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/caret-square-o-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/caret-square-o-left.svg b/src/opsoro/server/static/images/fontawesome/black/svg/caret-square-o-left.svg new file mode 100644 index 0000000..f6182aa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/caret-square-o-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/caret-square-o-right.svg b/src/opsoro/server/static/images/fontawesome/black/svg/caret-square-o-right.svg new file mode 100644 index 0000000..2de803f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/caret-square-o-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/caret-square-o-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/caret-square-o-up.svg new file mode 100644 index 0000000..f0531c9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/caret-square-o-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/caret-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/caret-up.svg new file mode 100644 index 0000000..40e98f0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/caret-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cart-arrow-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cart-arrow-down.svg new file mode 100644 index 0000000..d0bbd76 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cart-arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cart-plus.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cart-plus.svg new file mode 100644 index 0000000..58b5b9e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cart-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cc-amex.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cc-amex.svg new file mode 100644 index 0000000..bb8cc3e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cc-amex.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cc-diners-club.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cc-diners-club.svg new file mode 100644 index 0000000..078a98f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cc-diners-club.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cc-discover.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cc-discover.svg new file mode 100644 index 0000000..4c3ecac --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cc-discover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cc-jcb.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cc-jcb.svg new file mode 100644 index 0000000..c0585a8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cc-jcb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cc-mastercard.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cc-mastercard.svg new file mode 100644 index 0000000..3a74583 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cc-mastercard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cc-paypal.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cc-paypal.svg new file mode 100644 index 0000000..944378e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cc-paypal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cc-stripe.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cc-stripe.svg new file mode 100644 index 0000000..9e5291e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cc-stripe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cc-visa.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cc-visa.svg new file mode 100644 index 0000000..e401a60 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cc-visa.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cc.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cc.svg new file mode 100644 index 0000000..3fe4223 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/certificate.svg b/src/opsoro/server/static/images/fontawesome/black/svg/certificate.svg new file mode 100644 index 0000000..27219e1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/certificate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/chain-broken.svg b/src/opsoro/server/static/images/fontawesome/black/svg/chain-broken.svg new file mode 100644 index 0000000..08f8b34 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/chain-broken.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/chain.svg b/src/opsoro/server/static/images/fontawesome/black/svg/chain.svg new file mode 100644 index 0000000..6999b47 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/chain.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/check-circle-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/check-circle-o.svg new file mode 100644 index 0000000..e694378 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/check-circle-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/check-circle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/check-circle.svg new file mode 100644 index 0000000..d3d9b0b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/check-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/check-square-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/check-square-o.svg new file mode 100644 index 0000000..df51ee3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/check-square-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/check-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/check-square.svg new file mode 100644 index 0000000..c5d8696 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/check-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/check.svg b/src/opsoro/server/static/images/fontawesome/black/svg/check.svg new file mode 100644 index 0000000..916c749 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/chevron-circle-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-circle-down.svg new file mode 100644 index 0000000..b7989fa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-circle-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/chevron-circle-left.svg b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-circle-left.svg new file mode 100644 index 0000000..c02d839 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-circle-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/chevron-circle-right.svg b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-circle-right.svg new file mode 100644 index 0000000..680b6fb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-circle-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/chevron-circle-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-circle-up.svg new file mode 100644 index 0000000..958c70b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-circle-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/chevron-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-down.svg new file mode 100644 index 0000000..8177dc9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/chevron-left.svg b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-left.svg new file mode 100644 index 0000000..7da6f10 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/chevron-right.svg b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-right.svg new file mode 100644 index 0000000..d96a6ec --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/chevron-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-up.svg new file mode 100644 index 0000000..563a644 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/chevron-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/child.svg b/src/opsoro/server/static/images/fontawesome/black/svg/child.svg new file mode 100644 index 0000000..301637a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/child.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/chrome.svg b/src/opsoro/server/static/images/fontawesome/black/svg/chrome.svg new file mode 100644 index 0000000..21446a1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/chrome.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/circle-o-notch.svg b/src/opsoro/server/static/images/fontawesome/black/svg/circle-o-notch.svg new file mode 100644 index 0000000..9a19284 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/circle-o-notch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/circle-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/circle-o.svg new file mode 100644 index 0000000..b2e3f8d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/circle-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/circle-thin.svg b/src/opsoro/server/static/images/fontawesome/black/svg/circle-thin.svg new file mode 100644 index 0000000..34fb8cf --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/circle-thin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/circle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/circle.svg new file mode 100644 index 0000000..49289c4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/clipboard.svg b/src/opsoro/server/static/images/fontawesome/black/svg/clipboard.svg new file mode 100644 index 0000000..00655a4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/clipboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/clock-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/clock-o.svg new file mode 100644 index 0000000..09269ef --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/clock-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/clone.svg b/src/opsoro/server/static/images/fontawesome/black/svg/clone.svg new file mode 100644 index 0000000..92e3d52 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/clone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/close.svg b/src/opsoro/server/static/images/fontawesome/black/svg/close.svg new file mode 100644 index 0000000..f063b3d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cloud-download.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cloud-download.svg new file mode 100644 index 0000000..91d0117 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cloud-download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cloud-upload.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cloud-upload.svg new file mode 100644 index 0000000..bd454e5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cloud-upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cloud.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cloud.svg new file mode 100644 index 0000000..8b78c2e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cny.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cny.svg new file mode 100644 index 0000000..a5b47e2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cny.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/code-fork.svg b/src/opsoro/server/static/images/fontawesome/black/svg/code-fork.svg new file mode 100644 index 0000000..8347dce --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/code-fork.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/code.svg b/src/opsoro/server/static/images/fontawesome/black/svg/code.svg new file mode 100644 index 0000000..1bacd56 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/codepen.svg b/src/opsoro/server/static/images/fontawesome/black/svg/codepen.svg new file mode 100644 index 0000000..ae7b2f1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/codepen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/codiepie.svg b/src/opsoro/server/static/images/fontawesome/black/svg/codiepie.svg new file mode 100644 index 0000000..f5be087 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/codiepie.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/coffee.svg b/src/opsoro/server/static/images/fontawesome/black/svg/coffee.svg new file mode 100644 index 0000000..27743be --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/coffee.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cog.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cog.svg new file mode 100644 index 0000000..c8705ea --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cog.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cogs.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cogs.svg new file mode 100644 index 0000000..e7f37a9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cogs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/columns.svg b/src/opsoro/server/static/images/fontawesome/black/svg/columns.svg new file mode 100644 index 0000000..243a87e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/columns.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/comment-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/comment-o.svg new file mode 100644 index 0000000..55807f0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/comment-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/comment.svg b/src/opsoro/server/static/images/fontawesome/black/svg/comment.svg new file mode 100644 index 0000000..43fca70 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/comment.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/commenting-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/commenting-o.svg new file mode 100644 index 0000000..38cc918 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/commenting-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/commenting.svg b/src/opsoro/server/static/images/fontawesome/black/svg/commenting.svg new file mode 100644 index 0000000..1e66820 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/commenting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/comments-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/comments-o.svg new file mode 100644 index 0000000..73ddf26 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/comments-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/comments.svg b/src/opsoro/server/static/images/fontawesome/black/svg/comments.svg new file mode 100644 index 0000000..adb2d71 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/comments.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/compass.svg b/src/opsoro/server/static/images/fontawesome/black/svg/compass.svg new file mode 100644 index 0000000..d20e9fe --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/compass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/compress.svg b/src/opsoro/server/static/images/fontawesome/black/svg/compress.svg new file mode 100644 index 0000000..550bfea --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/compress.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/connectdevelop.svg b/src/opsoro/server/static/images/fontawesome/black/svg/connectdevelop.svg new file mode 100644 index 0000000..0541f61 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/connectdevelop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/contao.svg b/src/opsoro/server/static/images/fontawesome/black/svg/contao.svg new file mode 100644 index 0000000..ba32d92 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/contao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/copy.svg b/src/opsoro/server/static/images/fontawesome/black/svg/copy.svg new file mode 100644 index 0000000..86e0d1e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/copyright.svg b/src/opsoro/server/static/images/fontawesome/black/svg/copyright.svg new file mode 100644 index 0000000..0324f34 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/copyright.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/creative-commons.svg b/src/opsoro/server/static/images/fontawesome/black/svg/creative-commons.svg new file mode 100644 index 0000000..b8d4737 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/creative-commons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/credit-card-alt.svg b/src/opsoro/server/static/images/fontawesome/black/svg/credit-card-alt.svg new file mode 100644 index 0000000..09feeb5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/credit-card-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/credit-card.svg b/src/opsoro/server/static/images/fontawesome/black/svg/credit-card.svg new file mode 100644 index 0000000..e2828e8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/credit-card.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/crop.svg b/src/opsoro/server/static/images/fontawesome/black/svg/crop.svg new file mode 100644 index 0000000..83c6d9c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/crop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/crosshairs.svg b/src/opsoro/server/static/images/fontawesome/black/svg/crosshairs.svg new file mode 100644 index 0000000..29317fd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/crosshairs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/css3.svg b/src/opsoro/server/static/images/fontawesome/black/svg/css3.svg new file mode 100644 index 0000000..14a4ad3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/css3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cube.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cube.svg new file mode 100644 index 0000000..65bc4c7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cubes.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cubes.svg new file mode 100644 index 0000000..0311acc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cubes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cut.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cut.svg new file mode 100644 index 0000000..4edddfa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cut.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/cutlery.svg b/src/opsoro/server/static/images/fontawesome/black/svg/cutlery.svg new file mode 100644 index 0000000..fcaa27c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/cutlery.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/dashboard.svg b/src/opsoro/server/static/images/fontawesome/black/svg/dashboard.svg new file mode 100644 index 0000000..c52e58f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/dashcube.svg b/src/opsoro/server/static/images/fontawesome/black/svg/dashcube.svg new file mode 100644 index 0000000..87b97e7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/dashcube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/database.svg b/src/opsoro/server/static/images/fontawesome/black/svg/database.svg new file mode 100644 index 0000000..e42a416 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/database.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/dedent.svg b/src/opsoro/server/static/images/fontawesome/black/svg/dedent.svg new file mode 100644 index 0000000..9758bca --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/dedent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/delicious.svg b/src/opsoro/server/static/images/fontawesome/black/svg/delicious.svg new file mode 100644 index 0000000..7b883f7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/delicious.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/desktop.svg b/src/opsoro/server/static/images/fontawesome/black/svg/desktop.svg new file mode 100644 index 0000000..60cf341 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/desktop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/deviantart.svg b/src/opsoro/server/static/images/fontawesome/black/svg/deviantart.svg new file mode 100644 index 0000000..2e8a984 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/deviantart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/diamond.svg b/src/opsoro/server/static/images/fontawesome/black/svg/diamond.svg new file mode 100644 index 0000000..60eaff6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/diamond.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/digg.svg b/src/opsoro/server/static/images/fontawesome/black/svg/digg.svg new file mode 100644 index 0000000..af26fda --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/digg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/dollar.svg b/src/opsoro/server/static/images/fontawesome/black/svg/dollar.svg new file mode 100644 index 0000000..1d2f19c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/dollar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/dot-circle-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/dot-circle-o.svg new file mode 100644 index 0000000..cb7d120 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/dot-circle-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/download.svg b/src/opsoro/server/static/images/fontawesome/black/svg/download.svg new file mode 100644 index 0000000..f6c92c4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/dribbble.svg b/src/opsoro/server/static/images/fontawesome/black/svg/dribbble.svg new file mode 100644 index 0000000..00391cf --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/dribbble.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/dropbox.svg b/src/opsoro/server/static/images/fontawesome/black/svg/dropbox.svg new file mode 100644 index 0000000..0f00e75 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/dropbox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/drupal.svg b/src/opsoro/server/static/images/fontawesome/black/svg/drupal.svg new file mode 100644 index 0000000..c0cc913 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/drupal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/edge.svg b/src/opsoro/server/static/images/fontawesome/black/svg/edge.svg new file mode 100644 index 0000000..c3a648b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/edge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/edit.svg b/src/opsoro/server/static/images/fontawesome/black/svg/edit.svg new file mode 100644 index 0000000..1432beb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/eject.svg b/src/opsoro/server/static/images/fontawesome/black/svg/eject.svg new file mode 100644 index 0000000..0f5ee46 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/eject.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/ellipsis-h.svg b/src/opsoro/server/static/images/fontawesome/black/svg/ellipsis-h.svg new file mode 100644 index 0000000..5079c7f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/ellipsis-h.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/ellipsis-v.svg b/src/opsoro/server/static/images/fontawesome/black/svg/ellipsis-v.svg new file mode 100644 index 0000000..a1e574c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/ellipsis-v.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/empire.svg b/src/opsoro/server/static/images/fontawesome/black/svg/empire.svg new file mode 100644 index 0000000..b42d549 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/empire.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/envelope-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/envelope-o.svg new file mode 100644 index 0000000..f4c5ba0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/envelope-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/envelope-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/envelope-square.svg new file mode 100644 index 0000000..3331e27 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/envelope-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/envelope.svg b/src/opsoro/server/static/images/fontawesome/black/svg/envelope.svg new file mode 100644 index 0000000..bf36822 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/envelope.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/eraser.svg b/src/opsoro/server/static/images/fontawesome/black/svg/eraser.svg new file mode 100644 index 0000000..492aeb6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/eraser.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/eur.svg b/src/opsoro/server/static/images/fontawesome/black/svg/eur.svg new file mode 100644 index 0000000..c7315c9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/eur.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/euro.svg b/src/opsoro/server/static/images/fontawesome/black/svg/euro.svg new file mode 100644 index 0000000..c7315c9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/euro.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/exchange.svg b/src/opsoro/server/static/images/fontawesome/black/svg/exchange.svg new file mode 100644 index 0000000..cc878a5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/exchange.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/exclamation-circle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/exclamation-circle.svg new file mode 100644 index 0000000..107a487 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/exclamation-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/exclamation-triangle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/exclamation-triangle.svg new file mode 100644 index 0000000..42836e9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/exclamation-triangle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/exclamation.svg b/src/opsoro/server/static/images/fontawesome/black/svg/exclamation.svg new file mode 100644 index 0000000..cc25513 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/exclamation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/expand.svg b/src/opsoro/server/static/images/fontawesome/black/svg/expand.svg new file mode 100644 index 0000000..e792e8a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/expand.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/expeditedssl.svg b/src/opsoro/server/static/images/fontawesome/black/svg/expeditedssl.svg new file mode 100644 index 0000000..61bbb90 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/expeditedssl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/external-link-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/external-link-square.svg new file mode 100644 index 0000000..a23d906 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/external-link-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/external-link.svg b/src/opsoro/server/static/images/fontawesome/black/svg/external-link.svg new file mode 100644 index 0000000..99f755c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/external-link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/eye-slash.svg b/src/opsoro/server/static/images/fontawesome/black/svg/eye-slash.svg new file mode 100644 index 0000000..ec11594 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/eye-slash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/eye.svg b/src/opsoro/server/static/images/fontawesome/black/svg/eye.svg new file mode 100644 index 0000000..929710d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/eyedropper.svg b/src/opsoro/server/static/images/fontawesome/black/svg/eyedropper.svg new file mode 100644 index 0000000..2d88de6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/eyedropper.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/facebook-f.svg b/src/opsoro/server/static/images/fontawesome/black/svg/facebook-f.svg new file mode 100644 index 0000000..5e3c014 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/facebook-f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/facebook-official.svg b/src/opsoro/server/static/images/fontawesome/black/svg/facebook-official.svg new file mode 100644 index 0000000..e61b6ea --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/facebook-official.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/facebook-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/facebook-square.svg new file mode 100644 index 0000000..3337723 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/facebook-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/facebook.svg b/src/opsoro/server/static/images/fontawesome/black/svg/facebook.svg new file mode 100644 index 0000000..5e3c014 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/facebook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/fast-backward.svg b/src/opsoro/server/static/images/fontawesome/black/svg/fast-backward.svg new file mode 100644 index 0000000..96b1fd7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/fast-backward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/fast-forward.svg b/src/opsoro/server/static/images/fontawesome/black/svg/fast-forward.svg new file mode 100644 index 0000000..7df876a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/fast-forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/fax.svg b/src/opsoro/server/static/images/fontawesome/black/svg/fax.svg new file mode 100644 index 0000000..de9eeec --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/fax.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/feed.svg b/src/opsoro/server/static/images/fontawesome/black/svg/feed.svg new file mode 100644 index 0000000..392e520 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/feed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/female.svg b/src/opsoro/server/static/images/fontawesome/black/svg/female.svg new file mode 100644 index 0000000..0aa60df --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/female.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/fighter-jet.svg b/src/opsoro/server/static/images/fontawesome/black/svg/fighter-jet.svg new file mode 100644 index 0000000..024228d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/fighter-jet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-archive-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-archive-o.svg new file mode 100644 index 0000000..5b665ea --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-archive-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-audio-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-audio-o.svg new file mode 100644 index 0000000..4d8cddb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-audio-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-code-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-code-o.svg new file mode 100644 index 0000000..139e557 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-code-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-excel-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-excel-o.svg new file mode 100644 index 0000000..6c16917 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-excel-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-image-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-image-o.svg new file mode 100644 index 0000000..ae2b0ca --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-image-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-movie-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-movie-o.svg new file mode 100644 index 0000000..bb9669b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-movie-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-o.svg new file mode 100644 index 0000000..d660e7f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-pdf-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-pdf-o.svg new file mode 100644 index 0000000..00b00a7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-pdf-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-photo-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-photo-o.svg new file mode 100644 index 0000000..ae2b0ca --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-photo-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-picture-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-picture-o.svg new file mode 100644 index 0000000..ae2b0ca --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-picture-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-powerpoint-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-powerpoint-o.svg new file mode 100644 index 0000000..edf0647 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-powerpoint-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-sound-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-sound-o.svg new file mode 100644 index 0000000..4d8cddb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-sound-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-text-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-text-o.svg new file mode 100644 index 0000000..9c49f71 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-text-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-text.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-text.svg new file mode 100644 index 0000000..1eade0e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-video-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-video-o.svg new file mode 100644 index 0000000..bb9669b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-video-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-word-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-word-o.svg new file mode 100644 index 0000000..28cf27e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-word-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file-zip-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file-zip-o.svg new file mode 100644 index 0000000..5b665ea --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file-zip-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/file.svg b/src/opsoro/server/static/images/fontawesome/black/svg/file.svg new file mode 100644 index 0000000..70ce88b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/files-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/files-o.svg new file mode 100644 index 0000000..86e0d1e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/files-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/film.svg b/src/opsoro/server/static/images/fontawesome/black/svg/film.svg new file mode 100644 index 0000000..c7de8bb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/film.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/filter.svg b/src/opsoro/server/static/images/fontawesome/black/svg/filter.svg new file mode 100644 index 0000000..03d9fca --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/filter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/fire-extinguisher.svg b/src/opsoro/server/static/images/fontawesome/black/svg/fire-extinguisher.svg new file mode 100644 index 0000000..5abdd10 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/fire-extinguisher.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/fire.svg b/src/opsoro/server/static/images/fontawesome/black/svg/fire.svg new file mode 100644 index 0000000..726d7f3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/fire.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/firefox.svg b/src/opsoro/server/static/images/fontawesome/black/svg/firefox.svg new file mode 100644 index 0000000..027a418 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/firefox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/flag-checkered.svg b/src/opsoro/server/static/images/fontawesome/black/svg/flag-checkered.svg new file mode 100644 index 0000000..a135f6b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/flag-checkered.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/flag-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/flag-o.svg new file mode 100644 index 0000000..2803dfc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/flag-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/flag.svg b/src/opsoro/server/static/images/fontawesome/black/svg/flag.svg new file mode 100644 index 0000000..2dd565e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/flag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/flash.svg b/src/opsoro/server/static/images/fontawesome/black/svg/flash.svg new file mode 100644 index 0000000..7104cc7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/flash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/flask.svg b/src/opsoro/server/static/images/fontawesome/black/svg/flask.svg new file mode 100644 index 0000000..bb3df25 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/flask.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/flickr.svg b/src/opsoro/server/static/images/fontawesome/black/svg/flickr.svg new file mode 100644 index 0000000..5e28b69 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/flickr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/floppy-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/floppy-o.svg new file mode 100644 index 0000000..3b6b910 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/floppy-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/folder-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/folder-o.svg new file mode 100644 index 0000000..257d205 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/folder-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/folder-open-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/folder-open-o.svg new file mode 100644 index 0000000..ce685f2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/folder-open-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/folder-open.svg b/src/opsoro/server/static/images/fontawesome/black/svg/folder-open.svg new file mode 100644 index 0000000..96c551a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/folder-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/folder.svg b/src/opsoro/server/static/images/fontawesome/black/svg/folder.svg new file mode 100644 index 0000000..89252a6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/font.svg b/src/opsoro/server/static/images/fontawesome/black/svg/font.svg new file mode 100644 index 0000000..43838c5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/font.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/fonticons.svg b/src/opsoro/server/static/images/fontawesome/black/svg/fonticons.svg new file mode 100644 index 0000000..01faaea --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/fonticons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/fort-awesome.svg b/src/opsoro/server/static/images/fontawesome/black/svg/fort-awesome.svg new file mode 100644 index 0000000..94fcd67 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/fort-awesome.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/forumbee.svg b/src/opsoro/server/static/images/fontawesome/black/svg/forumbee.svg new file mode 100644 index 0000000..97a348c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/forumbee.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/forward.svg b/src/opsoro/server/static/images/fontawesome/black/svg/forward.svg new file mode 100644 index 0000000..ae036b9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/foursquare.svg b/src/opsoro/server/static/images/fontawesome/black/svg/foursquare.svg new file mode 100644 index 0000000..76b148a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/foursquare.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/frown-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/frown-o.svg new file mode 100644 index 0000000..352204d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/frown-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/futbol-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/futbol-o.svg new file mode 100644 index 0000000..b966838 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/futbol-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/gamepad.svg b/src/opsoro/server/static/images/fontawesome/black/svg/gamepad.svg new file mode 100644 index 0000000..4770341 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/gamepad.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/gavel.svg b/src/opsoro/server/static/images/fontawesome/black/svg/gavel.svg new file mode 100644 index 0000000..b4c3d2c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/gavel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/gbp.svg b/src/opsoro/server/static/images/fontawesome/black/svg/gbp.svg new file mode 100644 index 0000000..cf38698 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/gbp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/ge.svg b/src/opsoro/server/static/images/fontawesome/black/svg/ge.svg new file mode 100644 index 0000000..b42d549 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/ge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/gear.svg b/src/opsoro/server/static/images/fontawesome/black/svg/gear.svg new file mode 100644 index 0000000..c8705ea --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/gear.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/gears.svg b/src/opsoro/server/static/images/fontawesome/black/svg/gears.svg new file mode 100644 index 0000000..e7f37a9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/gears.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/genderless.svg b/src/opsoro/server/static/images/fontawesome/black/svg/genderless.svg new file mode 100644 index 0000000..3d93273 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/genderless.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/get-pocket.svg b/src/opsoro/server/static/images/fontawesome/black/svg/get-pocket.svg new file mode 100644 index 0000000..a3060a7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/get-pocket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/gg-circle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/gg-circle.svg new file mode 100644 index 0000000..3f85ece --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/gg-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/gg.svg b/src/opsoro/server/static/images/fontawesome/black/svg/gg.svg new file mode 100644 index 0000000..34171d5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/gg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/gift.svg b/src/opsoro/server/static/images/fontawesome/black/svg/gift.svg new file mode 100644 index 0000000..209ea14 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/gift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/git-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/git-square.svg new file mode 100644 index 0000000..09c1b90 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/git-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/git.svg b/src/opsoro/server/static/images/fontawesome/black/svg/git.svg new file mode 100644 index 0000000..efde187 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/git.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/github-alt.svg b/src/opsoro/server/static/images/fontawesome/black/svg/github-alt.svg new file mode 100644 index 0000000..ff368a4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/github-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/github-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/github-square.svg new file mode 100644 index 0000000..8f06184 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/github-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/github.svg b/src/opsoro/server/static/images/fontawesome/black/svg/github.svg new file mode 100644 index 0000000..b78a3ff --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/gittip.svg b/src/opsoro/server/static/images/fontawesome/black/svg/gittip.svg new file mode 100644 index 0000000..d6986d1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/gittip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/glass.svg b/src/opsoro/server/static/images/fontawesome/black/svg/glass.svg new file mode 100644 index 0000000..3658516 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/glass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/globe.svg b/src/opsoro/server/static/images/fontawesome/black/svg/globe.svg new file mode 100644 index 0000000..4ab90c1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/google-plus-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/google-plus-square.svg new file mode 100644 index 0000000..8ea68fa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/google-plus-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/google-plus.svg b/src/opsoro/server/static/images/fontawesome/black/svg/google-plus.svg new file mode 100644 index 0000000..2347259 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/google-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/google-wallet.svg b/src/opsoro/server/static/images/fontawesome/black/svg/google-wallet.svg new file mode 100644 index 0000000..88d6748 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/google-wallet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/google.svg b/src/opsoro/server/static/images/fontawesome/black/svg/google.svg new file mode 100644 index 0000000..9ddded0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/google.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/graduation-cap.svg b/src/opsoro/server/static/images/fontawesome/black/svg/graduation-cap.svg new file mode 100644 index 0000000..87c68ea --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/graduation-cap.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/gratipay.svg b/src/opsoro/server/static/images/fontawesome/black/svg/gratipay.svg new file mode 100644 index 0000000..d6986d1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/gratipay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/group.svg b/src/opsoro/server/static/images/fontawesome/black/svg/group.svg new file mode 100644 index 0000000..53afd1d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/group.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/h-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/h-square.svg new file mode 100644 index 0000000..bbcfd4d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/h-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hacker-news.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hacker-news.svg new file mode 100644 index 0000000..6829ec0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hacker-news.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hand-grab-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hand-grab-o.svg new file mode 100644 index 0000000..f683b52 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hand-grab-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hand-lizard-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hand-lizard-o.svg new file mode 100644 index 0000000..1e1b9fc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hand-lizard-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hand-o-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hand-o-down.svg new file mode 100644 index 0000000..56207c1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hand-o-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hand-o-left.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hand-o-left.svg new file mode 100644 index 0000000..925cd0b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hand-o-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hand-o-right.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hand-o-right.svg new file mode 100644 index 0000000..3cb3286 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hand-o-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hand-o-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hand-o-up.svg new file mode 100644 index 0000000..4aaaeb2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hand-o-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hand-paper-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hand-paper-o.svg new file mode 100644 index 0000000..662ca0b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hand-paper-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hand-peace-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hand-peace-o.svg new file mode 100644 index 0000000..cd3bf9b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hand-peace-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hand-pointer-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hand-pointer-o.svg new file mode 100644 index 0000000..2a4b30a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hand-pointer-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hand-rock-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hand-rock-o.svg new file mode 100644 index 0000000..f683b52 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hand-rock-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hand-scissors-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hand-scissors-o.svg new file mode 100644 index 0000000..e3903b8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hand-scissors-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hand-spock-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hand-spock-o.svg new file mode 100644 index 0000000..cb20562 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hand-spock-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hand-stop-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hand-stop-o.svg new file mode 100644 index 0000000..662ca0b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hand-stop-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hashtag.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hashtag.svg new file mode 100644 index 0000000..d39c303 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hashtag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hdd-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hdd-o.svg new file mode 100644 index 0000000..9d23c3a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hdd-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/header.svg b/src/opsoro/server/static/images/fontawesome/black/svg/header.svg new file mode 100644 index 0000000..e7f6c6f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/header.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/headphones.svg b/src/opsoro/server/static/images/fontawesome/black/svg/headphones.svg new file mode 100644 index 0000000..cb58ea5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/headphones.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/heart-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/heart-o.svg new file mode 100644 index 0000000..887ce47 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/heart-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/heart.svg b/src/opsoro/server/static/images/fontawesome/black/svg/heart.svg new file mode 100644 index 0000000..68a826d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/heart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/heartbeat.svg b/src/opsoro/server/static/images/fontawesome/black/svg/heartbeat.svg new file mode 100644 index 0000000..f8f0ff3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/heartbeat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/history.svg b/src/opsoro/server/static/images/fontawesome/black/svg/history.svg new file mode 100644 index 0000000..167dacc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/history.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/home.svg b/src/opsoro/server/static/images/fontawesome/black/svg/home.svg new file mode 100644 index 0000000..87f26bb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hospital-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hospital-o.svg new file mode 100644 index 0000000..f387f90 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hospital-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hotel.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hotel.svg new file mode 100644 index 0000000..e3f295c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hotel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-1.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-1.svg new file mode 100644 index 0000000..e2b34eb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-2.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-2.svg new file mode 100644 index 0000000..52fe69b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-3.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-3.svg new file mode 100644 index 0000000..aab2acb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-end.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-end.svg new file mode 100644 index 0000000..aab2acb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-end.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-half.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-half.svg new file mode 100644 index 0000000..52fe69b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-half.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-o.svg new file mode 100644 index 0000000..3101af3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-start.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-start.svg new file mode 100644 index 0000000..e2b34eb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass-start.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/hourglass.svg b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass.svg new file mode 100644 index 0000000..cea9ca5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/hourglass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/houzz.svg b/src/opsoro/server/static/images/fontawesome/black/svg/houzz.svg new file mode 100644 index 0000000..7ad46a6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/houzz.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/html5.svg b/src/opsoro/server/static/images/fontawesome/black/svg/html5.svg new file mode 100644 index 0000000..d0d251c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/html5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/i-cursor.svg b/src/opsoro/server/static/images/fontawesome/black/svg/i-cursor.svg new file mode 100644 index 0000000..f79fd76 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/i-cursor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/ils.svg b/src/opsoro/server/static/images/fontawesome/black/svg/ils.svg new file mode 100644 index 0000000..18654c6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/ils.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/image.svg b/src/opsoro/server/static/images/fontawesome/black/svg/image.svg new file mode 100644 index 0000000..7e0b869 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/inbox.svg b/src/opsoro/server/static/images/fontawesome/black/svg/inbox.svg new file mode 100644 index 0000000..c3079fc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/inbox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/indent.svg b/src/opsoro/server/static/images/fontawesome/black/svg/indent.svg new file mode 100644 index 0000000..2f70a0c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/indent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/industry.svg b/src/opsoro/server/static/images/fontawesome/black/svg/industry.svg new file mode 100644 index 0000000..9c714b7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/industry.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/info-circle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/info-circle.svg new file mode 100644 index 0000000..df27fca --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/info-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/info.svg b/src/opsoro/server/static/images/fontawesome/black/svg/info.svg new file mode 100644 index 0000000..7206c1a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/inr.svg b/src/opsoro/server/static/images/fontawesome/black/svg/inr.svg new file mode 100644 index 0000000..24c5cfa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/inr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/instagram.svg b/src/opsoro/server/static/images/fontawesome/black/svg/instagram.svg new file mode 100644 index 0000000..f0ec2ca --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/instagram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/institution.svg b/src/opsoro/server/static/images/fontawesome/black/svg/institution.svg new file mode 100644 index 0000000..566f80d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/institution.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/internet-explorer.svg b/src/opsoro/server/static/images/fontawesome/black/svg/internet-explorer.svg new file mode 100644 index 0000000..dd3bd46 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/internet-explorer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/intersex.svg b/src/opsoro/server/static/images/fontawesome/black/svg/intersex.svg new file mode 100644 index 0000000..5241dbb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/intersex.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/ioxhost.svg b/src/opsoro/server/static/images/fontawesome/black/svg/ioxhost.svg new file mode 100644 index 0000000..abdb2c0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/ioxhost.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/italic.svg b/src/opsoro/server/static/images/fontawesome/black/svg/italic.svg new file mode 100644 index 0000000..8691a38 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/italic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/joomla.svg b/src/opsoro/server/static/images/fontawesome/black/svg/joomla.svg new file mode 100644 index 0000000..69d5d06 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/joomla.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/jpy.svg b/src/opsoro/server/static/images/fontawesome/black/svg/jpy.svg new file mode 100644 index 0000000..a5b47e2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/jpy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/jsfiddle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/jsfiddle.svg new file mode 100644 index 0000000..6804f18 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/jsfiddle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/key.svg b/src/opsoro/server/static/images/fontawesome/black/svg/key.svg new file mode 100644 index 0000000..0d3f3d9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/key.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/keyboard-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/keyboard-o.svg new file mode 100644 index 0000000..c2ea337 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/keyboard-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/krw.svg b/src/opsoro/server/static/images/fontawesome/black/svg/krw.svg new file mode 100644 index 0000000..305ccff --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/krw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/language.svg b/src/opsoro/server/static/images/fontawesome/black/svg/language.svg new file mode 100644 index 0000000..82eaaaa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/laptop.svg b/src/opsoro/server/static/images/fontawesome/black/svg/laptop.svg new file mode 100644 index 0000000..43757bc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/laptop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/lastfm-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/lastfm-square.svg new file mode 100644 index 0000000..2ca519d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/lastfm-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/lastfm.svg b/src/opsoro/server/static/images/fontawesome/black/svg/lastfm.svg new file mode 100644 index 0000000..328d578 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/lastfm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/leaf.svg b/src/opsoro/server/static/images/fontawesome/black/svg/leaf.svg new file mode 100644 index 0000000..c032435 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/leaf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/leanpub.svg b/src/opsoro/server/static/images/fontawesome/black/svg/leanpub.svg new file mode 100644 index 0000000..e9078ee --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/leanpub.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/legal.svg b/src/opsoro/server/static/images/fontawesome/black/svg/legal.svg new file mode 100644 index 0000000..b4c3d2c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/legal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/lemon-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/lemon-o.svg new file mode 100644 index 0000000..24dbabc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/lemon-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/level-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/level-down.svg new file mode 100644 index 0000000..d77a5f3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/level-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/level-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/level-up.svg new file mode 100644 index 0000000..838c2d7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/level-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/life-bouy.svg b/src/opsoro/server/static/images/fontawesome/black/svg/life-bouy.svg new file mode 100644 index 0000000..c2164c0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/life-bouy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/life-buoy.svg b/src/opsoro/server/static/images/fontawesome/black/svg/life-buoy.svg new file mode 100644 index 0000000..c2164c0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/life-buoy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/life-ring.svg b/src/opsoro/server/static/images/fontawesome/black/svg/life-ring.svg new file mode 100644 index 0000000..c2164c0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/life-ring.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/life-saver.svg b/src/opsoro/server/static/images/fontawesome/black/svg/life-saver.svg new file mode 100644 index 0000000..c2164c0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/life-saver.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/lightbulb-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/lightbulb-o.svg new file mode 100644 index 0000000..3076662 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/lightbulb-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/line-chart.svg b/src/opsoro/server/static/images/fontawesome/black/svg/line-chart.svg new file mode 100644 index 0000000..7075135 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/line-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/link.svg b/src/opsoro/server/static/images/fontawesome/black/svg/link.svg new file mode 100644 index 0000000..6999b47 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/linkedin-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/linkedin-square.svg new file mode 100644 index 0000000..551c9a8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/linkedin-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/linkedin.svg b/src/opsoro/server/static/images/fontawesome/black/svg/linkedin.svg new file mode 100644 index 0000000..88ff922 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/linkedin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/linux.svg b/src/opsoro/server/static/images/fontawesome/black/svg/linux.svg new file mode 100644 index 0000000..3d3ebf0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/linux.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/list-alt.svg b/src/opsoro/server/static/images/fontawesome/black/svg/list-alt.svg new file mode 100644 index 0000000..0ebc4c3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/list-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/list-ol.svg b/src/opsoro/server/static/images/fontawesome/black/svg/list-ol.svg new file mode 100644 index 0000000..ab39084 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/list-ol.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/list-ul.svg b/src/opsoro/server/static/images/fontawesome/black/svg/list-ul.svg new file mode 100644 index 0000000..ecbe586 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/list-ul.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/list.svg b/src/opsoro/server/static/images/fontawesome/black/svg/list.svg new file mode 100644 index 0000000..0723400 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/location-arrow.svg b/src/opsoro/server/static/images/fontawesome/black/svg/location-arrow.svg new file mode 100644 index 0000000..de58e96 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/location-arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/lock.svg b/src/opsoro/server/static/images/fontawesome/black/svg/lock.svg new file mode 100644 index 0000000..70bee8f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/long-arrow-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/long-arrow-down.svg new file mode 100644 index 0000000..5224ce4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/long-arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/long-arrow-left.svg b/src/opsoro/server/static/images/fontawesome/black/svg/long-arrow-left.svg new file mode 100644 index 0000000..493959e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/long-arrow-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/long-arrow-right.svg b/src/opsoro/server/static/images/fontawesome/black/svg/long-arrow-right.svg new file mode 100644 index 0000000..7fcea48 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/long-arrow-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/long-arrow-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/long-arrow-up.svg new file mode 100644 index 0000000..2c551b6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/long-arrow-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/magic.svg b/src/opsoro/server/static/images/fontawesome/black/svg/magic.svg new file mode 100644 index 0000000..c1c2af8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/magic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/magnet.svg b/src/opsoro/server/static/images/fontawesome/black/svg/magnet.svg new file mode 100644 index 0000000..da2f411 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/magnet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/mail-forward.svg b/src/opsoro/server/static/images/fontawesome/black/svg/mail-forward.svg new file mode 100644 index 0000000..0f2acaa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/mail-forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/mail-reply-all.svg b/src/opsoro/server/static/images/fontawesome/black/svg/mail-reply-all.svg new file mode 100644 index 0000000..6e62c8d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/mail-reply-all.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/mail-reply.svg b/src/opsoro/server/static/images/fontawesome/black/svg/mail-reply.svg new file mode 100644 index 0000000..6758ab2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/mail-reply.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/male.svg b/src/opsoro/server/static/images/fontawesome/black/svg/male.svg new file mode 100644 index 0000000..5ca0c6f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/male.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/map-marker.svg b/src/opsoro/server/static/images/fontawesome/black/svg/map-marker.svg new file mode 100644 index 0000000..38c8a7f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/map-marker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/map-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/map-o.svg new file mode 100644 index 0000000..10233b9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/map-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/map-pin.svg b/src/opsoro/server/static/images/fontawesome/black/svg/map-pin.svg new file mode 100644 index 0000000..5f960e7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/map-pin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/map-signs.svg b/src/opsoro/server/static/images/fontawesome/black/svg/map-signs.svg new file mode 100644 index 0000000..1e65cdf --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/map-signs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/map.svg b/src/opsoro/server/static/images/fontawesome/black/svg/map.svg new file mode 100644 index 0000000..15b074c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/map.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/mars-double.svg b/src/opsoro/server/static/images/fontawesome/black/svg/mars-double.svg new file mode 100644 index 0000000..4d2b71b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/mars-double.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/mars-stroke-h.svg b/src/opsoro/server/static/images/fontawesome/black/svg/mars-stroke-h.svg new file mode 100644 index 0000000..3c51970 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/mars-stroke-h.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/mars-stroke-v.svg b/src/opsoro/server/static/images/fontawesome/black/svg/mars-stroke-v.svg new file mode 100644 index 0000000..f08b002 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/mars-stroke-v.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/mars-stroke.svg b/src/opsoro/server/static/images/fontawesome/black/svg/mars-stroke.svg new file mode 100644 index 0000000..76e8c00 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/mars-stroke.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/mars.svg b/src/opsoro/server/static/images/fontawesome/black/svg/mars.svg new file mode 100644 index 0000000..32584a4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/mars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/maxcdn.svg b/src/opsoro/server/static/images/fontawesome/black/svg/maxcdn.svg new file mode 100644 index 0000000..170a527 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/maxcdn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/meanpath.svg b/src/opsoro/server/static/images/fontawesome/black/svg/meanpath.svg new file mode 100644 index 0000000..ff632d5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/meanpath.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/medium.svg b/src/opsoro/server/static/images/fontawesome/black/svg/medium.svg new file mode 100644 index 0000000..9fdf7fb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/medium.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/medkit.svg b/src/opsoro/server/static/images/fontawesome/black/svg/medkit.svg new file mode 100644 index 0000000..cea51e7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/medkit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/meh-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/meh-o.svg new file mode 100644 index 0000000..4994d00 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/meh-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/mercury.svg b/src/opsoro/server/static/images/fontawesome/black/svg/mercury.svg new file mode 100644 index 0000000..9362dab --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/mercury.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/microphone-slash.svg b/src/opsoro/server/static/images/fontawesome/black/svg/microphone-slash.svg new file mode 100644 index 0000000..5a9c228 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/microphone-slash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/microphone.svg b/src/opsoro/server/static/images/fontawesome/black/svg/microphone.svg new file mode 100644 index 0000000..de9eb96 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/microphone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/minus-circle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/minus-circle.svg new file mode 100644 index 0000000..c6407f9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/minus-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/minus-square-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/minus-square-o.svg new file mode 100644 index 0000000..3b6a182 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/minus-square-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/minus-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/minus-square.svg new file mode 100644 index 0000000..1d1d9e6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/minus-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/minus.svg b/src/opsoro/server/static/images/fontawesome/black/svg/minus.svg new file mode 100644 index 0000000..0c54505 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/minus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/mixcloud.svg b/src/opsoro/server/static/images/fontawesome/black/svg/mixcloud.svg new file mode 100644 index 0000000..1d51c92 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/mixcloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/mobile-phone.svg b/src/opsoro/server/static/images/fontawesome/black/svg/mobile-phone.svg new file mode 100644 index 0000000..17f01ba --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/mobile-phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/mobile.svg b/src/opsoro/server/static/images/fontawesome/black/svg/mobile.svg new file mode 100644 index 0000000..17f01ba --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/mobile.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/modx.svg b/src/opsoro/server/static/images/fontawesome/black/svg/modx.svg new file mode 100644 index 0000000..ef5f98d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/modx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/money.svg b/src/opsoro/server/static/images/fontawesome/black/svg/money.svg new file mode 100644 index 0000000..dd0ba66 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/moon-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/moon-o.svg new file mode 100644 index 0000000..9429778 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/moon-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/mortar-board.svg b/src/opsoro/server/static/images/fontawesome/black/svg/mortar-board.svg new file mode 100644 index 0000000..87c68ea --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/mortar-board.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/motorcycle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/motorcycle.svg new file mode 100644 index 0000000..1ef1646 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/motorcycle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/mouse-pointer.svg b/src/opsoro/server/static/images/fontawesome/black/svg/mouse-pointer.svg new file mode 100644 index 0000000..f74831d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/mouse-pointer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/music.svg b/src/opsoro/server/static/images/fontawesome/black/svg/music.svg new file mode 100644 index 0000000..12d2947 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/music.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/navicon.svg b/src/opsoro/server/static/images/fontawesome/black/svg/navicon.svg new file mode 100644 index 0000000..a3cd72b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/navicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/neuter.svg b/src/opsoro/server/static/images/fontawesome/black/svg/neuter.svg new file mode 100644 index 0000000..de7a82e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/neuter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/newspaper-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/newspaper-o.svg new file mode 100644 index 0000000..ef58c78 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/newspaper-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/object-group.svg b/src/opsoro/server/static/images/fontawesome/black/svg/object-group.svg new file mode 100644 index 0000000..a7aed08 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/object-group.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/object-ungroup.svg b/src/opsoro/server/static/images/fontawesome/black/svg/object-ungroup.svg new file mode 100644 index 0000000..a5b7854 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/object-ungroup.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/odnoklassniki-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/odnoklassniki-square.svg new file mode 100644 index 0000000..40a09b7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/odnoklassniki-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/odnoklassniki.svg b/src/opsoro/server/static/images/fontawesome/black/svg/odnoklassniki.svg new file mode 100644 index 0000000..c1d07a1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/odnoklassniki.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/opencart.svg b/src/opsoro/server/static/images/fontawesome/black/svg/opencart.svg new file mode 100644 index 0000000..c218d6a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/opencart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/openid.svg b/src/opsoro/server/static/images/fontawesome/black/svg/openid.svg new file mode 100644 index 0000000..16c0172 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/openid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/opera.svg b/src/opsoro/server/static/images/fontawesome/black/svg/opera.svg new file mode 100644 index 0000000..5562d66 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/opera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/optin-monster.svg b/src/opsoro/server/static/images/fontawesome/black/svg/optin-monster.svg new file mode 100644 index 0000000..a45d380 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/optin-monster.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/outdent.svg b/src/opsoro/server/static/images/fontawesome/black/svg/outdent.svg new file mode 100644 index 0000000..9758bca --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/outdent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/pagelines.svg b/src/opsoro/server/static/images/fontawesome/black/svg/pagelines.svg new file mode 100644 index 0000000..a157959 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/pagelines.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/paint-brush.svg b/src/opsoro/server/static/images/fontawesome/black/svg/paint-brush.svg new file mode 100644 index 0000000..ec9a948 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/paint-brush.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/paper-plane-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/paper-plane-o.svg new file mode 100644 index 0000000..38867d3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/paper-plane-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/paper-plane.svg b/src/opsoro/server/static/images/fontawesome/black/svg/paper-plane.svg new file mode 100644 index 0000000..9e82799 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/paper-plane.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/paperclip.svg b/src/opsoro/server/static/images/fontawesome/black/svg/paperclip.svg new file mode 100644 index 0000000..b887c51 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/paperclip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/paragraph.svg b/src/opsoro/server/static/images/fontawesome/black/svg/paragraph.svg new file mode 100644 index 0000000..e20ae9f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/paragraph.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/paste.svg b/src/opsoro/server/static/images/fontawesome/black/svg/paste.svg new file mode 100644 index 0000000..00655a4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/paste.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/pause-circle-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/pause-circle-o.svg new file mode 100644 index 0000000..0ea0679 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/pause-circle-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/pause-circle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/pause-circle.svg new file mode 100644 index 0000000..8f87b33 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/pause-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/pause.svg b/src/opsoro/server/static/images/fontawesome/black/svg/pause.svg new file mode 100644 index 0000000..7ca81f8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/pause.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/paw.svg b/src/opsoro/server/static/images/fontawesome/black/svg/paw.svg new file mode 100644 index 0000000..55cf2a0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/paw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/paypal.svg b/src/opsoro/server/static/images/fontawesome/black/svg/paypal.svg new file mode 100644 index 0000000..0c02f33 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/paypal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/pencil-square-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/pencil-square-o.svg new file mode 100644 index 0000000..1432beb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/pencil-square-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/pencil-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/pencil-square.svg new file mode 100644 index 0000000..a10c5d2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/pencil-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/pencil.svg b/src/opsoro/server/static/images/fontawesome/black/svg/pencil.svg new file mode 100644 index 0000000..5d78ebd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/pencil.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/percent.svg b/src/opsoro/server/static/images/fontawesome/black/svg/percent.svg new file mode 100644 index 0000000..75debde --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/percent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/phone-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/phone-square.svg new file mode 100644 index 0000000..bf87adc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/phone-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/phone.svg b/src/opsoro/server/static/images/fontawesome/black/svg/phone.svg new file mode 100644 index 0000000..b96c462 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/photo.svg b/src/opsoro/server/static/images/fontawesome/black/svg/photo.svg new file mode 100644 index 0000000..7e0b869 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/photo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/picture-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/picture-o.svg new file mode 100644 index 0000000..7e0b869 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/picture-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/pie-chart.svg b/src/opsoro/server/static/images/fontawesome/black/svg/pie-chart.svg new file mode 100644 index 0000000..6790b01 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/pie-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/pied-piper-alt.svg b/src/opsoro/server/static/images/fontawesome/black/svg/pied-piper-alt.svg new file mode 100644 index 0000000..a2a66bb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/pied-piper-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/pied-piper.svg b/src/opsoro/server/static/images/fontawesome/black/svg/pied-piper.svg new file mode 100644 index 0000000..f7b0d41 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/pied-piper.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/pinterest-p.svg b/src/opsoro/server/static/images/fontawesome/black/svg/pinterest-p.svg new file mode 100644 index 0000000..6ecf1c5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/pinterest-p.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/pinterest-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/pinterest-square.svg new file mode 100644 index 0000000..35d8bcd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/pinterest-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/pinterest.svg b/src/opsoro/server/static/images/fontawesome/black/svg/pinterest.svg new file mode 100644 index 0000000..4779c8f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/pinterest.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/plane.svg b/src/opsoro/server/static/images/fontawesome/black/svg/plane.svg new file mode 100644 index 0000000..08db1ea --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/plane.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/play-circle-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/play-circle-o.svg new file mode 100644 index 0000000..ea18cee --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/play-circle-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/play-circle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/play-circle.svg new file mode 100644 index 0000000..72e9bb1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/play-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/play.svg b/src/opsoro/server/static/images/fontawesome/black/svg/play.svg new file mode 100644 index 0000000..9c56408 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/plug.svg b/src/opsoro/server/static/images/fontawesome/black/svg/plug.svg new file mode 100644 index 0000000..08cacf3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/plug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/plus-circle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/plus-circle.svg new file mode 100644 index 0000000..42fbce8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/plus-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/plus-square-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/plus-square-o.svg new file mode 100644 index 0000000..3fb783f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/plus-square-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/plus-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/plus-square.svg new file mode 100644 index 0000000..344952f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/plus-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/plus.svg b/src/opsoro/server/static/images/fontawesome/black/svg/plus.svg new file mode 100644 index 0000000..3f6a9da --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/power-off.svg b/src/opsoro/server/static/images/fontawesome/black/svg/power-off.svg new file mode 100644 index 0000000..3473078 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/power-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/print.svg b/src/opsoro/server/static/images/fontawesome/black/svg/print.svg new file mode 100644 index 0000000..daa9ee9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/print.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/product-hunt.svg b/src/opsoro/server/static/images/fontawesome/black/svg/product-hunt.svg new file mode 100644 index 0000000..9161f22 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/product-hunt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/puzzle-piece.svg b/src/opsoro/server/static/images/fontawesome/black/svg/puzzle-piece.svg new file mode 100644 index 0000000..95b5584 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/puzzle-piece.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/qq.svg b/src/opsoro/server/static/images/fontawesome/black/svg/qq.svg new file mode 100644 index 0000000..fb86f84 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/qq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/qrcode.svg b/src/opsoro/server/static/images/fontawesome/black/svg/qrcode.svg new file mode 100644 index 0000000..e4f6b54 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/qrcode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/question-circle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/question-circle.svg new file mode 100644 index 0000000..57e438e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/question-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/question.svg b/src/opsoro/server/static/images/fontawesome/black/svg/question.svg new file mode 100644 index 0000000..bef3009 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/question.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/quote-left.svg b/src/opsoro/server/static/images/fontawesome/black/svg/quote-left.svg new file mode 100644 index 0000000..44dad4b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/quote-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/quote-right.svg b/src/opsoro/server/static/images/fontawesome/black/svg/quote-right.svg new file mode 100644 index 0000000..5be3399 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/quote-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/ra.svg b/src/opsoro/server/static/images/fontawesome/black/svg/ra.svg new file mode 100644 index 0000000..83c0a1f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/ra.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/random.svg b/src/opsoro/server/static/images/fontawesome/black/svg/random.svg new file mode 100644 index 0000000..6f55b60 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/random.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/rebel.svg b/src/opsoro/server/static/images/fontawesome/black/svg/rebel.svg new file mode 100644 index 0000000..83c0a1f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/rebel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/recycle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/recycle.svg new file mode 100644 index 0000000..bcad171 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/recycle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/reddit-alien.svg b/src/opsoro/server/static/images/fontawesome/black/svg/reddit-alien.svg new file mode 100644 index 0000000..95d6791 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/reddit-alien.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/reddit-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/reddit-square.svg new file mode 100644 index 0000000..9557bc9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/reddit-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/reddit.svg b/src/opsoro/server/static/images/fontawesome/black/svg/reddit.svg new file mode 100644 index 0000000..4b9e293 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/reddit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/refresh.svg b/src/opsoro/server/static/images/fontawesome/black/svg/refresh.svg new file mode 100644 index 0000000..826a990 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/refresh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/registered.svg b/src/opsoro/server/static/images/fontawesome/black/svg/registered.svg new file mode 100644 index 0000000..d671648 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/registered.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/remove.svg b/src/opsoro/server/static/images/fontawesome/black/svg/remove.svg new file mode 100644 index 0000000..f063b3d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/remove.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/renren.svg b/src/opsoro/server/static/images/fontawesome/black/svg/renren.svg new file mode 100644 index 0000000..6dc2480 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/renren.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/reorder.svg b/src/opsoro/server/static/images/fontawesome/black/svg/reorder.svg new file mode 100644 index 0000000..a3cd72b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/reorder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/repeat.svg b/src/opsoro/server/static/images/fontawesome/black/svg/repeat.svg new file mode 100644 index 0000000..0c4c52c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/repeat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/reply-all.svg b/src/opsoro/server/static/images/fontawesome/black/svg/reply-all.svg new file mode 100644 index 0000000..6e62c8d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/reply-all.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/reply.svg b/src/opsoro/server/static/images/fontawesome/black/svg/reply.svg new file mode 100644 index 0000000..6758ab2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/reply.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/retweet.svg b/src/opsoro/server/static/images/fontawesome/black/svg/retweet.svg new file mode 100644 index 0000000..a3fbf93 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/retweet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/rmb.svg b/src/opsoro/server/static/images/fontawesome/black/svg/rmb.svg new file mode 100644 index 0000000..a5b47e2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/rmb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/road.svg b/src/opsoro/server/static/images/fontawesome/black/svg/road.svg new file mode 100644 index 0000000..ee7f805 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/road.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/rocket.svg b/src/opsoro/server/static/images/fontawesome/black/svg/rocket.svg new file mode 100644 index 0000000..23b4bad --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/rocket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/rotate-left.svg b/src/opsoro/server/static/images/fontawesome/black/svg/rotate-left.svg new file mode 100644 index 0000000..5e33cd8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/rotate-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/rotate-right.svg b/src/opsoro/server/static/images/fontawesome/black/svg/rotate-right.svg new file mode 100644 index 0000000..0c4c52c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/rotate-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/rouble.svg b/src/opsoro/server/static/images/fontawesome/black/svg/rouble.svg new file mode 100644 index 0000000..088b198 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/rouble.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/rss-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/rss-square.svg new file mode 100644 index 0000000..6060888 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/rss-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/rss.svg b/src/opsoro/server/static/images/fontawesome/black/svg/rss.svg new file mode 100644 index 0000000..392e520 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/rub.svg b/src/opsoro/server/static/images/fontawesome/black/svg/rub.svg new file mode 100644 index 0000000..088b198 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/rub.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/ruble.svg b/src/opsoro/server/static/images/fontawesome/black/svg/ruble.svg new file mode 100644 index 0000000..088b198 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/ruble.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/rupee.svg b/src/opsoro/server/static/images/fontawesome/black/svg/rupee.svg new file mode 100644 index 0000000..24c5cfa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/rupee.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/safari.svg b/src/opsoro/server/static/images/fontawesome/black/svg/safari.svg new file mode 100644 index 0000000..d81b946 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/safari.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/save.svg b/src/opsoro/server/static/images/fontawesome/black/svg/save.svg new file mode 100644 index 0000000..3b6b910 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/scissors.svg b/src/opsoro/server/static/images/fontawesome/black/svg/scissors.svg new file mode 100644 index 0000000..4edddfa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/scissors.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/scribd.svg b/src/opsoro/server/static/images/fontawesome/black/svg/scribd.svg new file mode 100644 index 0000000..168a582 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/scribd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/search-minus.svg b/src/opsoro/server/static/images/fontawesome/black/svg/search-minus.svg new file mode 100644 index 0000000..a9f1bda --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/search-minus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/search-plus.svg b/src/opsoro/server/static/images/fontawesome/black/svg/search-plus.svg new file mode 100644 index 0000000..cb48bfd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/search-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/search.svg b/src/opsoro/server/static/images/fontawesome/black/svg/search.svg new file mode 100644 index 0000000..67bdb50 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sellsy.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sellsy.svg new file mode 100644 index 0000000..1a88ce5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sellsy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/send-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/send-o.svg new file mode 100644 index 0000000..38867d3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/send-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/send.svg b/src/opsoro/server/static/images/fontawesome/black/svg/send.svg new file mode 100644 index 0000000..9e82799 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/send.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/server.svg b/src/opsoro/server/static/images/fontawesome/black/svg/server.svg new file mode 100644 index 0000000..a1f4c11 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/share-alt-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/share-alt-square.svg new file mode 100644 index 0000000..e526eff --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/share-alt-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/share-alt.svg b/src/opsoro/server/static/images/fontawesome/black/svg/share-alt.svg new file mode 100644 index 0000000..6740bc6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/share-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/share-square-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/share-square-o.svg new file mode 100644 index 0000000..8f1047f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/share-square-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/share-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/share-square.svg new file mode 100644 index 0000000..f6b88f8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/share-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/share.svg b/src/opsoro/server/static/images/fontawesome/black/svg/share.svg new file mode 100644 index 0000000..0f2acaa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/shekel.svg b/src/opsoro/server/static/images/fontawesome/black/svg/shekel.svg new file mode 100644 index 0000000..18654c6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/shekel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sheqel.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sheqel.svg new file mode 100644 index 0000000..18654c6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sheqel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/shield.svg b/src/opsoro/server/static/images/fontawesome/black/svg/shield.svg new file mode 100644 index 0000000..5fc8b51 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/shield.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/ship.svg b/src/opsoro/server/static/images/fontawesome/black/svg/ship.svg new file mode 100644 index 0000000..6aa4563 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/ship.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/shirtsinbulk.svg b/src/opsoro/server/static/images/fontawesome/black/svg/shirtsinbulk.svg new file mode 100644 index 0000000..8ccc234 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/shirtsinbulk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/shopping-bag.svg b/src/opsoro/server/static/images/fontawesome/black/svg/shopping-bag.svg new file mode 100644 index 0000000..d71bcd1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/shopping-bag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/shopping-basket.svg b/src/opsoro/server/static/images/fontawesome/black/svg/shopping-basket.svg new file mode 100644 index 0000000..2a669f1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/shopping-basket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/shopping-cart.svg b/src/opsoro/server/static/images/fontawesome/black/svg/shopping-cart.svg new file mode 100644 index 0000000..031fc21 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/shopping-cart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sign-in.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sign-in.svg new file mode 100644 index 0000000..e2db8c1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sign-in.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sign-out.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sign-out.svg new file mode 100644 index 0000000..931197d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sign-out.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/signal.svg b/src/opsoro/server/static/images/fontawesome/black/svg/signal.svg new file mode 100644 index 0000000..86f3e67 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/signal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/simplybuilt.svg b/src/opsoro/server/static/images/fontawesome/black/svg/simplybuilt.svg new file mode 100644 index 0000000..262ea8f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/simplybuilt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sitemap.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sitemap.svg new file mode 100644 index 0000000..4c82bbd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sitemap.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/skyatlas.svg b/src/opsoro/server/static/images/fontawesome/black/svg/skyatlas.svg new file mode 100644 index 0000000..4ffbc73 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/skyatlas.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/skype.svg b/src/opsoro/server/static/images/fontawesome/black/svg/skype.svg new file mode 100644 index 0000000..fdac214 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/skype.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/slack.svg b/src/opsoro/server/static/images/fontawesome/black/svg/slack.svg new file mode 100644 index 0000000..dc274a3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/slack.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sliders.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sliders.svg new file mode 100644 index 0000000..97d775d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sliders.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/slideshare.svg b/src/opsoro/server/static/images/fontawesome/black/svg/slideshare.svg new file mode 100644 index 0000000..2b384fc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/slideshare.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/smile-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/smile-o.svg new file mode 100644 index 0000000..25162eb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/smile-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/soccer-ball-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/soccer-ball-o.svg new file mode 100644 index 0000000..b966838 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/soccer-ball-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sort-alpha-asc.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sort-alpha-asc.svg new file mode 100644 index 0000000..1e33b1c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sort-alpha-asc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sort-alpha-desc.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sort-alpha-desc.svg new file mode 100644 index 0000000..2b66fcd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sort-alpha-desc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sort-amount-asc.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sort-amount-asc.svg new file mode 100644 index 0000000..c9865b3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sort-amount-asc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sort-amount-desc.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sort-amount-desc.svg new file mode 100644 index 0000000..38264c6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sort-amount-desc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sort-asc.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sort-asc.svg new file mode 100644 index 0000000..415b289 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sort-asc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sort-desc.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sort-desc.svg new file mode 100644 index 0000000..d5aae5a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sort-desc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sort-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sort-down.svg new file mode 100644 index 0000000..d5aae5a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sort-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sort-numeric-asc.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sort-numeric-asc.svg new file mode 100644 index 0000000..a926a7a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sort-numeric-asc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sort-numeric-desc.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sort-numeric-desc.svg new file mode 100644 index 0000000..18fb046 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sort-numeric-desc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sort-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sort-up.svg new file mode 100644 index 0000000..415b289 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sort-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sort.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sort.svg new file mode 100644 index 0000000..a9bce82 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sort.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/soundcloud.svg b/src/opsoro/server/static/images/fontawesome/black/svg/soundcloud.svg new file mode 100644 index 0000000..10b301b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/soundcloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/space-shuttle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/space-shuttle.svg new file mode 100644 index 0000000..d193efa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/space-shuttle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/spinner.svg b/src/opsoro/server/static/images/fontawesome/black/svg/spinner.svg new file mode 100644 index 0000000..5a83f26 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/spinner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/spoon.svg b/src/opsoro/server/static/images/fontawesome/black/svg/spoon.svg new file mode 100644 index 0000000..35bfe66 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/spoon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/spotify.svg b/src/opsoro/server/static/images/fontawesome/black/svg/spotify.svg new file mode 100644 index 0000000..e36ffc3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/spotify.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/square-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/square-o.svg new file mode 100644 index 0000000..e8588a5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/square-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/square.svg new file mode 100644 index 0000000..d13d16f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/stack-exchange.svg b/src/opsoro/server/static/images/fontawesome/black/svg/stack-exchange.svg new file mode 100644 index 0000000..dd64e79 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/stack-exchange.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/stack-overflow.svg b/src/opsoro/server/static/images/fontawesome/black/svg/stack-overflow.svg new file mode 100644 index 0000000..6cc85fb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/stack-overflow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/star-half-empty.svg b/src/opsoro/server/static/images/fontawesome/black/svg/star-half-empty.svg new file mode 100644 index 0000000..0fcdac3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/star-half-empty.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/star-half-full.svg b/src/opsoro/server/static/images/fontawesome/black/svg/star-half-full.svg new file mode 100644 index 0000000..0fcdac3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/star-half-full.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/star-half-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/star-half-o.svg new file mode 100644 index 0000000..0fcdac3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/star-half-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/star-half.svg b/src/opsoro/server/static/images/fontawesome/black/svg/star-half.svg new file mode 100644 index 0000000..6093d01 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/star-half.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/star-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/star-o.svg new file mode 100644 index 0000000..88fa8d3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/star-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/star.svg b/src/opsoro/server/static/images/fontawesome/black/svg/star.svg new file mode 100644 index 0000000..e550b36 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/steam-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/steam-square.svg new file mode 100644 index 0000000..20c5d4a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/steam-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/steam.svg b/src/opsoro/server/static/images/fontawesome/black/svg/steam.svg new file mode 100644 index 0000000..e23b988 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/steam.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/step-backward.svg b/src/opsoro/server/static/images/fontawesome/black/svg/step-backward.svg new file mode 100644 index 0000000..8587bbf --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/step-backward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/step-forward.svg b/src/opsoro/server/static/images/fontawesome/black/svg/step-forward.svg new file mode 100644 index 0000000..1eca42f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/step-forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/stethoscope.svg b/src/opsoro/server/static/images/fontawesome/black/svg/stethoscope.svg new file mode 100644 index 0000000..584a79b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/stethoscope.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sticky-note-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sticky-note-o.svg new file mode 100644 index 0000000..1e332de --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sticky-note-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sticky-note.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sticky-note.svg new file mode 100644 index 0000000..3fd2582 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sticky-note.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/stop-circle-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/stop-circle-o.svg new file mode 100644 index 0000000..672e77f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/stop-circle-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/stop-circle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/stop-circle.svg new file mode 100644 index 0000000..5e820bf --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/stop-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/stop.svg b/src/opsoro/server/static/images/fontawesome/black/svg/stop.svg new file mode 100644 index 0000000..25fab57 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/stop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/street-view.svg b/src/opsoro/server/static/images/fontawesome/black/svg/street-view.svg new file mode 100644 index 0000000..6338201 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/street-view.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/strikethrough.svg b/src/opsoro/server/static/images/fontawesome/black/svg/strikethrough.svg new file mode 100644 index 0000000..cfe467e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/strikethrough.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/stumbleupon-circle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/stumbleupon-circle.svg new file mode 100644 index 0000000..d452cfc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/stumbleupon-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/stumbleupon.svg b/src/opsoro/server/static/images/fontawesome/black/svg/stumbleupon.svg new file mode 100644 index 0000000..4328d5c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/stumbleupon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/subscript.svg b/src/opsoro/server/static/images/fontawesome/black/svg/subscript.svg new file mode 100644 index 0000000..cfc5924 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/subscript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/subway.svg b/src/opsoro/server/static/images/fontawesome/black/svg/subway.svg new file mode 100644 index 0000000..c965e47 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/subway.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/suitcase.svg b/src/opsoro/server/static/images/fontawesome/black/svg/suitcase.svg new file mode 100644 index 0000000..6a1c5a0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/suitcase.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/sun-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/sun-o.svg new file mode 100644 index 0000000..7171ac9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/sun-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/superscript.svg b/src/opsoro/server/static/images/fontawesome/black/svg/superscript.svg new file mode 100644 index 0000000..edf2e5c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/superscript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/support.svg b/src/opsoro/server/static/images/fontawesome/black/svg/support.svg new file mode 100644 index 0000000..c2164c0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/support.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/table.svg b/src/opsoro/server/static/images/fontawesome/black/svg/table.svg new file mode 100644 index 0000000..3a272d2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/tablet.svg b/src/opsoro/server/static/images/fontawesome/black/svg/tablet.svg new file mode 100644 index 0000000..b7aa9c5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/tablet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/tachometer.svg b/src/opsoro/server/static/images/fontawesome/black/svg/tachometer.svg new file mode 100644 index 0000000..c52e58f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/tachometer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/tag.svg b/src/opsoro/server/static/images/fontawesome/black/svg/tag.svg new file mode 100644 index 0000000..12efb70 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/tags.svg b/src/opsoro/server/static/images/fontawesome/black/svg/tags.svg new file mode 100644 index 0000000..b146dd6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/tags.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/tasks.svg b/src/opsoro/server/static/images/fontawesome/black/svg/tasks.svg new file mode 100644 index 0000000..91f33f2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/tasks.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/taxi.svg b/src/opsoro/server/static/images/fontawesome/black/svg/taxi.svg new file mode 100644 index 0000000..4b56629 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/taxi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/television.svg b/src/opsoro/server/static/images/fontawesome/black/svg/television.svg new file mode 100644 index 0000000..d8bc8b5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/television.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/tencent-weibo.svg b/src/opsoro/server/static/images/fontawesome/black/svg/tencent-weibo.svg new file mode 100644 index 0000000..e49be76 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/tencent-weibo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/terminal.svg b/src/opsoro/server/static/images/fontawesome/black/svg/terminal.svg new file mode 100644 index 0000000..0ba7198 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/terminal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/text-height.svg b/src/opsoro/server/static/images/fontawesome/black/svg/text-height.svg new file mode 100644 index 0000000..ad477b3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/text-height.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/text-width.svg b/src/opsoro/server/static/images/fontawesome/black/svg/text-width.svg new file mode 100644 index 0000000..82d53b8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/text-width.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/th-large.svg b/src/opsoro/server/static/images/fontawesome/black/svg/th-large.svg new file mode 100644 index 0000000..e840927 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/th-large.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/th-list.svg b/src/opsoro/server/static/images/fontawesome/black/svg/th-list.svg new file mode 100644 index 0000000..26d4ae4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/th-list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/th.svg b/src/opsoro/server/static/images/fontawesome/black/svg/th.svg new file mode 100644 index 0000000..4959f6f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/th.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/thumb-tack.svg b/src/opsoro/server/static/images/fontawesome/black/svg/thumb-tack.svg new file mode 100644 index 0000000..8931fcf --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/thumb-tack.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/thumbs-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/thumbs-down.svg new file mode 100644 index 0000000..c560799 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/thumbs-o-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/thumbs-o-down.svg new file mode 100644 index 0000000..d601481 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/thumbs-o-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/thumbs-o-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/thumbs-o-up.svg new file mode 100644 index 0000000..23c851a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/thumbs-o-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/thumbs-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/thumbs-up.svg new file mode 100644 index 0000000..17127cd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/ticket.svg b/src/opsoro/server/static/images/fontawesome/black/svg/ticket.svg new file mode 100644 index 0000000..a15696a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/ticket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/times-circle-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/times-circle-o.svg new file mode 100644 index 0000000..12f8174 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/times-circle-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/times-circle.svg b/src/opsoro/server/static/images/fontawesome/black/svg/times-circle.svg new file mode 100644 index 0000000..b835699 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/times-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/times.svg b/src/opsoro/server/static/images/fontawesome/black/svg/times.svg new file mode 100644 index 0000000..f063b3d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/times.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/tint.svg b/src/opsoro/server/static/images/fontawesome/black/svg/tint.svg new file mode 100644 index 0000000..58c2136 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/tint.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/toggle-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/toggle-down.svg new file mode 100644 index 0000000..30d3f51 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/toggle-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/toggle-left.svg b/src/opsoro/server/static/images/fontawesome/black/svg/toggle-left.svg new file mode 100644 index 0000000..f6182aa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/toggle-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/toggle-off.svg b/src/opsoro/server/static/images/fontawesome/black/svg/toggle-off.svg new file mode 100644 index 0000000..7b61e6e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/toggle-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/toggle-on.svg b/src/opsoro/server/static/images/fontawesome/black/svg/toggle-on.svg new file mode 100644 index 0000000..b19d8be --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/toggle-on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/toggle-right.svg b/src/opsoro/server/static/images/fontawesome/black/svg/toggle-right.svg new file mode 100644 index 0000000..2de803f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/toggle-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/toggle-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/toggle-up.svg new file mode 100644 index 0000000..f0531c9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/toggle-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/trademark.svg b/src/opsoro/server/static/images/fontawesome/black/svg/trademark.svg new file mode 100644 index 0000000..3686808 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/trademark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/train.svg b/src/opsoro/server/static/images/fontawesome/black/svg/train.svg new file mode 100644 index 0000000..4f3e736 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/train.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/transgender-alt.svg b/src/opsoro/server/static/images/fontawesome/black/svg/transgender-alt.svg new file mode 100644 index 0000000..def105c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/transgender-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/transgender.svg b/src/opsoro/server/static/images/fontawesome/black/svg/transgender.svg new file mode 100644 index 0000000..5241dbb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/transgender.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/trash-o.svg b/src/opsoro/server/static/images/fontawesome/black/svg/trash-o.svg new file mode 100644 index 0000000..ea073d7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/trash-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/trash.svg b/src/opsoro/server/static/images/fontawesome/black/svg/trash.svg new file mode 100644 index 0000000..e7c9806 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/trash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/tree.svg b/src/opsoro/server/static/images/fontawesome/black/svg/tree.svg new file mode 100644 index 0000000..e54b3db --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/trello.svg b/src/opsoro/server/static/images/fontawesome/black/svg/trello.svg new file mode 100644 index 0000000..6febc42 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/trello.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/tripadvisor.svg b/src/opsoro/server/static/images/fontawesome/black/svg/tripadvisor.svg new file mode 100644 index 0000000..3149c61 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/tripadvisor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/trophy.svg b/src/opsoro/server/static/images/fontawesome/black/svg/trophy.svg new file mode 100644 index 0000000..7c1ba24 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/trophy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/truck.svg b/src/opsoro/server/static/images/fontawesome/black/svg/truck.svg new file mode 100644 index 0000000..5f91d3a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/truck.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/try.svg b/src/opsoro/server/static/images/fontawesome/black/svg/try.svg new file mode 100644 index 0000000..7c981b4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/try.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/tty.svg b/src/opsoro/server/static/images/fontawesome/black/svg/tty.svg new file mode 100644 index 0000000..9a7e486 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/tty.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/tumblr-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/tumblr-square.svg new file mode 100644 index 0000000..84ba26f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/tumblr-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/tumblr.svg b/src/opsoro/server/static/images/fontawesome/black/svg/tumblr.svg new file mode 100644 index 0000000..5dbc315 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/tumblr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/turkish-lira.svg b/src/opsoro/server/static/images/fontawesome/black/svg/turkish-lira.svg new file mode 100644 index 0000000..7c981b4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/turkish-lira.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/tv.svg b/src/opsoro/server/static/images/fontawesome/black/svg/tv.svg new file mode 100644 index 0000000..d8bc8b5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/tv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/twitch.svg b/src/opsoro/server/static/images/fontawesome/black/svg/twitch.svg new file mode 100644 index 0000000..040d806 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/twitch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/twitter-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/twitter-square.svg new file mode 100644 index 0000000..abfab4e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/twitter-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/twitter.svg b/src/opsoro/server/static/images/fontawesome/black/svg/twitter.svg new file mode 100644 index 0000000..dab6084 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/twitter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/umbrella.svg b/src/opsoro/server/static/images/fontawesome/black/svg/umbrella.svg new file mode 100644 index 0000000..1739efc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/umbrella.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/underline.svg b/src/opsoro/server/static/images/fontawesome/black/svg/underline.svg new file mode 100644 index 0000000..7acc33f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/underline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/undo.svg b/src/opsoro/server/static/images/fontawesome/black/svg/undo.svg new file mode 100644 index 0000000..5e33cd8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/undo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/university.svg b/src/opsoro/server/static/images/fontawesome/black/svg/university.svg new file mode 100644 index 0000000..566f80d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/university.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/unlink.svg b/src/opsoro/server/static/images/fontawesome/black/svg/unlink.svg new file mode 100644 index 0000000..08f8b34 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/unlink.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/unlock-alt.svg b/src/opsoro/server/static/images/fontawesome/black/svg/unlock-alt.svg new file mode 100644 index 0000000..87c553d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/unlock-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/unlock.svg b/src/opsoro/server/static/images/fontawesome/black/svg/unlock.svg new file mode 100644 index 0000000..f62b4a3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/unlock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/unsorted.svg b/src/opsoro/server/static/images/fontawesome/black/svg/unsorted.svg new file mode 100644 index 0000000..a9bce82 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/unsorted.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/upload.svg b/src/opsoro/server/static/images/fontawesome/black/svg/upload.svg new file mode 100644 index 0000000..d0322b8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/usb.svg b/src/opsoro/server/static/images/fontawesome/black/svg/usb.svg new file mode 100644 index 0000000..484a4cf --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/usb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/usd.svg b/src/opsoro/server/static/images/fontawesome/black/svg/usd.svg new file mode 100644 index 0000000..1d2f19c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/usd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/user-md.svg b/src/opsoro/server/static/images/fontawesome/black/svg/user-md.svg new file mode 100644 index 0000000..a7cc91a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/user-md.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/user-plus.svg b/src/opsoro/server/static/images/fontawesome/black/svg/user-plus.svg new file mode 100644 index 0000000..2c5429c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/user-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/user-secret.svg b/src/opsoro/server/static/images/fontawesome/black/svg/user-secret.svg new file mode 100644 index 0000000..dfb39f6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/user-secret.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/user-times.svg b/src/opsoro/server/static/images/fontawesome/black/svg/user-times.svg new file mode 100644 index 0000000..aa0288e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/user-times.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/user.svg b/src/opsoro/server/static/images/fontawesome/black/svg/user.svg new file mode 100644 index 0000000..5d34471 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/users.svg b/src/opsoro/server/static/images/fontawesome/black/svg/users.svg new file mode 100644 index 0000000..53afd1d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/users.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/venus-double.svg b/src/opsoro/server/static/images/fontawesome/black/svg/venus-double.svg new file mode 100644 index 0000000..f5448fd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/venus-double.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/venus-mars.svg b/src/opsoro/server/static/images/fontawesome/black/svg/venus-mars.svg new file mode 100644 index 0000000..284d92b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/venus-mars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/venus.svg b/src/opsoro/server/static/images/fontawesome/black/svg/venus.svg new file mode 100644 index 0000000..5a7a51f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/venus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/viacoin.svg b/src/opsoro/server/static/images/fontawesome/black/svg/viacoin.svg new file mode 100644 index 0000000..a6134a2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/viacoin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/video-camera.svg b/src/opsoro/server/static/images/fontawesome/black/svg/video-camera.svg new file mode 100644 index 0000000..e834a2a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/video-camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/vimeo-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/vimeo-square.svg new file mode 100644 index 0000000..c9a9daf --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/vimeo-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/vimeo.svg b/src/opsoro/server/static/images/fontawesome/black/svg/vimeo.svg new file mode 100644 index 0000000..9541583 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/vimeo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/vine.svg b/src/opsoro/server/static/images/fontawesome/black/svg/vine.svg new file mode 100644 index 0000000..76c8120 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/vine.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/vk.svg b/src/opsoro/server/static/images/fontawesome/black/svg/vk.svg new file mode 100644 index 0000000..9f7e960 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/vk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/volume-down.svg b/src/opsoro/server/static/images/fontawesome/black/svg/volume-down.svg new file mode 100644 index 0000000..f41ae42 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/volume-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/volume-off.svg b/src/opsoro/server/static/images/fontawesome/black/svg/volume-off.svg new file mode 100644 index 0000000..93fecb6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/volume-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/volume-up.svg b/src/opsoro/server/static/images/fontawesome/black/svg/volume-up.svg new file mode 100644 index 0000000..62f2c1b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/volume-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/warning.svg b/src/opsoro/server/static/images/fontawesome/black/svg/warning.svg new file mode 100644 index 0000000..42836e9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/wechat.svg b/src/opsoro/server/static/images/fontawesome/black/svg/wechat.svg new file mode 100644 index 0000000..217931c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/wechat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/weibo.svg b/src/opsoro/server/static/images/fontawesome/black/svg/weibo.svg new file mode 100644 index 0000000..20c335c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/weibo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/weixin.svg b/src/opsoro/server/static/images/fontawesome/black/svg/weixin.svg new file mode 100644 index 0000000..217931c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/weixin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/whatsapp.svg b/src/opsoro/server/static/images/fontawesome/black/svg/whatsapp.svg new file mode 100644 index 0000000..9acb3fd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/whatsapp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/wheelchair.svg b/src/opsoro/server/static/images/fontawesome/black/svg/wheelchair.svg new file mode 100644 index 0000000..fad49ae --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/wheelchair.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/wifi.svg b/src/opsoro/server/static/images/fontawesome/black/svg/wifi.svg new file mode 100644 index 0000000..708a468 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/wifi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/wikipedia-w.svg b/src/opsoro/server/static/images/fontawesome/black/svg/wikipedia-w.svg new file mode 100644 index 0000000..3ae5367 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/wikipedia-w.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/windows.svg b/src/opsoro/server/static/images/fontawesome/black/svg/windows.svg new file mode 100644 index 0000000..02e9b2d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/windows.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/won.svg b/src/opsoro/server/static/images/fontawesome/black/svg/won.svg new file mode 100644 index 0000000..305ccff --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/won.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/wordpress.svg b/src/opsoro/server/static/images/fontawesome/black/svg/wordpress.svg new file mode 100644 index 0000000..e730e4c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/wordpress.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/wrench.svg b/src/opsoro/server/static/images/fontawesome/black/svg/wrench.svg new file mode 100644 index 0000000..a55a15f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/wrench.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/xing-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/xing-square.svg new file mode 100644 index 0000000..dfa8cef --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/xing-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/xing.svg b/src/opsoro/server/static/images/fontawesome/black/svg/xing.svg new file mode 100644 index 0000000..2a8bd9e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/xing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/y-combinator-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/y-combinator-square.svg new file mode 100644 index 0000000..6829ec0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/y-combinator-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/y-combinator.svg b/src/opsoro/server/static/images/fontawesome/black/svg/y-combinator.svg new file mode 100644 index 0000000..7534cd7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/y-combinator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/yahoo.svg b/src/opsoro/server/static/images/fontawesome/black/svg/yahoo.svg new file mode 100644 index 0000000..44f440e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/yahoo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/yc-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/yc-square.svg new file mode 100644 index 0000000..6829ec0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/yc-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/yc.svg b/src/opsoro/server/static/images/fontawesome/black/svg/yc.svg new file mode 100644 index 0000000..7534cd7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/yc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/yelp.svg b/src/opsoro/server/static/images/fontawesome/black/svg/yelp.svg new file mode 100644 index 0000000..649b380 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/yelp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/yen.svg b/src/opsoro/server/static/images/fontawesome/black/svg/yen.svg new file mode 100644 index 0000000..a5b47e2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/yen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/youtube-play.svg b/src/opsoro/server/static/images/fontawesome/black/svg/youtube-play.svg new file mode 100644 index 0000000..7e50b1e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/youtube-play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/youtube-square.svg b/src/opsoro/server/static/images/fontawesome/black/svg/youtube-square.svg new file mode 100644 index 0000000..4e2a877 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/youtube-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/black/svg/youtube.svg b/src/opsoro/server/static/images/fontawesome/black/svg/youtube.svg new file mode 100644 index 0000000..4f3d55b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/black/svg/youtube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/500px.svg b/src/opsoro/server/static/images/fontawesome/white/svg/500px.svg new file mode 100644 index 0000000..800065a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/500px.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/adjust.svg b/src/opsoro/server/static/images/fontawesome/white/svg/adjust.svg new file mode 100644 index 0000000..2e0bb26 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/adjust.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/adn.svg b/src/opsoro/server/static/images/fontawesome/white/svg/adn.svg new file mode 100644 index 0000000..6385c05 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/adn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/align-center.svg b/src/opsoro/server/static/images/fontawesome/white/svg/align-center.svg new file mode 100644 index 0000000..29f5217 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/align-center.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/align-justify.svg b/src/opsoro/server/static/images/fontawesome/white/svg/align-justify.svg new file mode 100644 index 0000000..ec8d965 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/align-justify.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/align-left.svg b/src/opsoro/server/static/images/fontawesome/white/svg/align-left.svg new file mode 100644 index 0000000..5323276 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/align-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/align-right.svg b/src/opsoro/server/static/images/fontawesome/white/svg/align-right.svg new file mode 100644 index 0000000..885b29f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/align-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/amazon.svg b/src/opsoro/server/static/images/fontawesome/white/svg/amazon.svg new file mode 100644 index 0000000..76d801f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/amazon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/ambulance.svg b/src/opsoro/server/static/images/fontawesome/white/svg/ambulance.svg new file mode 100644 index 0000000..72515f2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/ambulance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/anchor.svg b/src/opsoro/server/static/images/fontawesome/white/svg/anchor.svg new file mode 100644 index 0000000..7a3ac83 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/anchor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/android.svg b/src/opsoro/server/static/images/fontawesome/white/svg/android.svg new file mode 100644 index 0000000..7bdd492 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/android.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/angellist.svg b/src/opsoro/server/static/images/fontawesome/white/svg/angellist.svg new file mode 100644 index 0000000..d758db6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/angellist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/angle-double-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/angle-double-down.svg new file mode 100644 index 0000000..b7d8aa6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/angle-double-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/angle-double-left.svg b/src/opsoro/server/static/images/fontawesome/white/svg/angle-double-left.svg new file mode 100644 index 0000000..e9c7c44 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/angle-double-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/angle-double-right.svg b/src/opsoro/server/static/images/fontawesome/white/svg/angle-double-right.svg new file mode 100644 index 0000000..0fc3545 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/angle-double-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/angle-double-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/angle-double-up.svg new file mode 100644 index 0000000..37b6a68 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/angle-double-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/angle-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/angle-down.svg new file mode 100644 index 0000000..64ad657 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/angle-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/angle-left.svg b/src/opsoro/server/static/images/fontawesome/white/svg/angle-left.svg new file mode 100644 index 0000000..f67dc65 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/angle-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/angle-right.svg b/src/opsoro/server/static/images/fontawesome/white/svg/angle-right.svg new file mode 100644 index 0000000..3298753 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/angle-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/angle-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/angle-up.svg new file mode 100644 index 0000000..8c136b3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/angle-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/apple.svg b/src/opsoro/server/static/images/fontawesome/white/svg/apple.svg new file mode 100644 index 0000000..7971f24 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/apple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/archive.svg b/src/opsoro/server/static/images/fontawesome/white/svg/archive.svg new file mode 100644 index 0000000..146f07c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/archive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/area-chart.svg b/src/opsoro/server/static/images/fontawesome/white/svg/area-chart.svg new file mode 100644 index 0000000..0024b6c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/area-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-down.svg new file mode 100644 index 0000000..d84f8bc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-left.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-left.svg new file mode 100644 index 0000000..f6e1467 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-o-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-o-down.svg new file mode 100644 index 0000000..c443fad --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-o-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-o-left.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-o-left.svg new file mode 100644 index 0000000..5c56f88 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-o-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-o-right.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-o-right.svg new file mode 100644 index 0000000..1f77845 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-o-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-o-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-o-up.svg new file mode 100644 index 0000000..9f24bb2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-o-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-right.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-right.svg new file mode 100644 index 0000000..648d748 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-up.svg new file mode 100644 index 0000000..c3b08c6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-circle-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrow-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-down.svg new file mode 100644 index 0000000..efb85c3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrow-left.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-left.svg new file mode 100644 index 0000000..5aed64d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrow-right.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-right.svg new file mode 100644 index 0000000..452bc75 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrow-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-up.svg new file mode 100644 index 0000000..51b7780 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrow-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrows-alt.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrows-alt.svg new file mode 100644 index 0000000..437384d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrows-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrows-h.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrows-h.svg new file mode 100644 index 0000000..d0ea94d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrows-h.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrows-v.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrows-v.svg new file mode 100644 index 0000000..0700bc6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrows-v.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/arrows.svg b/src/opsoro/server/static/images/fontawesome/white/svg/arrows.svg new file mode 100644 index 0000000..28e2b28 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/arrows.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/asterisk.svg b/src/opsoro/server/static/images/fontawesome/white/svg/asterisk.svg new file mode 100644 index 0000000..1627e85 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/asterisk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/at.svg b/src/opsoro/server/static/images/fontawesome/white/svg/at.svg new file mode 100644 index 0000000..80be283 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/at.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/automobile.svg b/src/opsoro/server/static/images/fontawesome/white/svg/automobile.svg new file mode 100644 index 0000000..6991599 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/automobile.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/backward.svg b/src/opsoro/server/static/images/fontawesome/white/svg/backward.svg new file mode 100644 index 0000000..44ca855 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/backward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/balance-scale.svg b/src/opsoro/server/static/images/fontawesome/white/svg/balance-scale.svg new file mode 100644 index 0000000..e775c69 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/balance-scale.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/ban.svg b/src/opsoro/server/static/images/fontawesome/white/svg/ban.svg new file mode 100644 index 0000000..a0dc3e1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/ban.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bank.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bank.svg new file mode 100644 index 0000000..00960b2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bank.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bar-chart-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bar-chart-o.svg new file mode 100644 index 0000000..c550544 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bar-chart-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bar-chart.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bar-chart.svg new file mode 100644 index 0000000..c550544 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bar-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/barcode.svg b/src/opsoro/server/static/images/fontawesome/white/svg/barcode.svg new file mode 100644 index 0000000..b916914 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/barcode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bars.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bars.svg new file mode 100644 index 0000000..ed120c5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/battery-0.svg b/src/opsoro/server/static/images/fontawesome/white/svg/battery-0.svg new file mode 100644 index 0000000..0a3afc3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/battery-0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/battery-1.svg b/src/opsoro/server/static/images/fontawesome/white/svg/battery-1.svg new file mode 100644 index 0000000..c13e5d8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/battery-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/battery-2.svg b/src/opsoro/server/static/images/fontawesome/white/svg/battery-2.svg new file mode 100644 index 0000000..134445e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/battery-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/battery-3.svg b/src/opsoro/server/static/images/fontawesome/white/svg/battery-3.svg new file mode 100644 index 0000000..5e4cd10 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/battery-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/battery-4.svg b/src/opsoro/server/static/images/fontawesome/white/svg/battery-4.svg new file mode 100644 index 0000000..70036bd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/battery-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/battery-empty.svg b/src/opsoro/server/static/images/fontawesome/white/svg/battery-empty.svg new file mode 100644 index 0000000..0a3afc3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/battery-empty.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/battery-full.svg b/src/opsoro/server/static/images/fontawesome/white/svg/battery-full.svg new file mode 100644 index 0000000..70036bd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/battery-full.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/battery-half.svg b/src/opsoro/server/static/images/fontawesome/white/svg/battery-half.svg new file mode 100644 index 0000000..134445e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/battery-half.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/battery-quarter.svg b/src/opsoro/server/static/images/fontawesome/white/svg/battery-quarter.svg new file mode 100644 index 0000000..c13e5d8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/battery-quarter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/battery-three-quarters.svg b/src/opsoro/server/static/images/fontawesome/white/svg/battery-three-quarters.svg new file mode 100644 index 0000000..5e4cd10 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/battery-three-quarters.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bed.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bed.svg new file mode 100644 index 0000000..253ee7a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/beer.svg b/src/opsoro/server/static/images/fontawesome/white/svg/beer.svg new file mode 100644 index 0000000..f9b515c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/beer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/behance-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/behance-square.svg new file mode 100644 index 0000000..994cfba --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/behance-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/behance.svg b/src/opsoro/server/static/images/fontawesome/white/svg/behance.svg new file mode 100644 index 0000000..247d480 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/behance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bell-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bell-o.svg new file mode 100644 index 0000000..98c7b9d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bell-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bell-slash-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bell-slash-o.svg new file mode 100644 index 0000000..3d4f4f2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bell-slash-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bell-slash.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bell-slash.svg new file mode 100644 index 0000000..bf03844 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bell-slash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bell.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bell.svg new file mode 100644 index 0000000..38d8b0e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bicycle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bicycle.svg new file mode 100644 index 0000000..ef9c3e4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bicycle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/binoculars.svg b/src/opsoro/server/static/images/fontawesome/white/svg/binoculars.svg new file mode 100644 index 0000000..cfdaa30 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/binoculars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/birthday-cake.svg b/src/opsoro/server/static/images/fontawesome/white/svg/birthday-cake.svg new file mode 100644 index 0000000..82037a7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/birthday-cake.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bitbucket-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bitbucket-square.svg new file mode 100644 index 0000000..43a53a0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bitbucket-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bitbucket.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bitbucket.svg new file mode 100644 index 0000000..2355b9b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bitbucket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bitcoin.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bitcoin.svg new file mode 100644 index 0000000..8fa8443 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bitcoin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/black-tie.svg b/src/opsoro/server/static/images/fontawesome/white/svg/black-tie.svg new file mode 100644 index 0000000..eec5975 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/black-tie.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bluetooth-b.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bluetooth-b.svg new file mode 100644 index 0000000..259114c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bluetooth-b.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bluetooth.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bluetooth.svg new file mode 100644 index 0000000..85d481b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bluetooth.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bold.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bold.svg new file mode 100644 index 0000000..dd01b78 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bold.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bolt.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bolt.svg new file mode 100644 index 0000000..ee43756 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bolt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bomb.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bomb.svg new file mode 100644 index 0000000..7c379e3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bomb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/book.svg b/src/opsoro/server/static/images/fontawesome/white/svg/book.svg new file mode 100644 index 0000000..6c7b5ca --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/book.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bookmark-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bookmark-o.svg new file mode 100644 index 0000000..3a48629 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bookmark-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bookmark.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bookmark.svg new file mode 100644 index 0000000..e5d8c66 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bookmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/briefcase.svg b/src/opsoro/server/static/images/fontawesome/white/svg/briefcase.svg new file mode 100644 index 0000000..a796cad --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/briefcase.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/btc.svg b/src/opsoro/server/static/images/fontawesome/white/svg/btc.svg new file mode 100644 index 0000000..8fa8443 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/btc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bug.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bug.svg new file mode 100644 index 0000000..b4c86b5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/building-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/building-o.svg new file mode 100644 index 0000000..95dcf09 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/building-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/building.svg b/src/opsoro/server/static/images/fontawesome/white/svg/building.svg new file mode 100644 index 0000000..410d987 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/building.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bullhorn.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bullhorn.svg new file mode 100644 index 0000000..90ebe4e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bullhorn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bullseye.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bullseye.svg new file mode 100644 index 0000000..8a29b1d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bullseye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/bus.svg b/src/opsoro/server/static/images/fontawesome/white/svg/bus.svg new file mode 100644 index 0000000..48f53f3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/bus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/buysellads.svg b/src/opsoro/server/static/images/fontawesome/white/svg/buysellads.svg new file mode 100644 index 0000000..2c7d6d0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/buysellads.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cab.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cab.svg new file mode 100644 index 0000000..7775add --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/calculator.svg b/src/opsoro/server/static/images/fontawesome/white/svg/calculator.svg new file mode 100644 index 0000000..ba95f3e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/calculator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/calendar-check-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/calendar-check-o.svg new file mode 100644 index 0000000..831f5d5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/calendar-check-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/calendar-minus-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/calendar-minus-o.svg new file mode 100644 index 0000000..b49e963 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/calendar-minus-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/calendar-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/calendar-o.svg new file mode 100644 index 0000000..e13a3ef --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/calendar-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/calendar-plus-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/calendar-plus-o.svg new file mode 100644 index 0000000..d7d7fe2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/calendar-plus-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/calendar-times-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/calendar-times-o.svg new file mode 100644 index 0000000..e97a289 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/calendar-times-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/calendar.svg b/src/opsoro/server/static/images/fontawesome/white/svg/calendar.svg new file mode 100644 index 0000000..7cea058 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/calendar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/camera-retro.svg b/src/opsoro/server/static/images/fontawesome/white/svg/camera-retro.svg new file mode 100644 index 0000000..26b8d5f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/camera-retro.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/camera.svg b/src/opsoro/server/static/images/fontawesome/white/svg/camera.svg new file mode 100644 index 0000000..1aa5420 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/car.svg b/src/opsoro/server/static/images/fontawesome/white/svg/car.svg new file mode 100644 index 0000000..6991599 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/car.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/caret-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/caret-down.svg new file mode 100644 index 0000000..7583f78 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/caret-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/caret-left.svg b/src/opsoro/server/static/images/fontawesome/white/svg/caret-left.svg new file mode 100644 index 0000000..e0bb32b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/caret-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/caret-right.svg b/src/opsoro/server/static/images/fontawesome/white/svg/caret-right.svg new file mode 100644 index 0000000..4ffa242 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/caret-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/caret-square-o-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/caret-square-o-down.svg new file mode 100644 index 0000000..857a299 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/caret-square-o-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/caret-square-o-left.svg b/src/opsoro/server/static/images/fontawesome/white/svg/caret-square-o-left.svg new file mode 100644 index 0000000..258aecf --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/caret-square-o-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/caret-square-o-right.svg b/src/opsoro/server/static/images/fontawesome/white/svg/caret-square-o-right.svg new file mode 100644 index 0000000..3019b1c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/caret-square-o-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/caret-square-o-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/caret-square-o-up.svg new file mode 100644 index 0000000..756c66f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/caret-square-o-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/caret-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/caret-up.svg new file mode 100644 index 0000000..ec5511e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/caret-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cart-arrow-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cart-arrow-down.svg new file mode 100644 index 0000000..360fcf1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cart-arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cart-plus.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cart-plus.svg new file mode 100644 index 0000000..2080941 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cart-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cc-amex.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cc-amex.svg new file mode 100644 index 0000000..f53a164 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cc-amex.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cc-diners-club.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cc-diners-club.svg new file mode 100644 index 0000000..982c48b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cc-diners-club.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cc-discover.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cc-discover.svg new file mode 100644 index 0000000..64475d6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cc-discover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cc-jcb.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cc-jcb.svg new file mode 100644 index 0000000..10d5f70 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cc-jcb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cc-mastercard.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cc-mastercard.svg new file mode 100644 index 0000000..8733d12 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cc-mastercard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cc-paypal.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cc-paypal.svg new file mode 100644 index 0000000..f8ffc98 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cc-paypal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cc-stripe.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cc-stripe.svg new file mode 100644 index 0000000..9a8e5de --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cc-stripe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cc-visa.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cc-visa.svg new file mode 100644 index 0000000..2419e8f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cc-visa.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cc.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cc.svg new file mode 100644 index 0000000..c603dd7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/certificate.svg b/src/opsoro/server/static/images/fontawesome/white/svg/certificate.svg new file mode 100644 index 0000000..cd4e8e0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/certificate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/chain-broken.svg b/src/opsoro/server/static/images/fontawesome/white/svg/chain-broken.svg new file mode 100644 index 0000000..85901c3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/chain-broken.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/chain.svg b/src/opsoro/server/static/images/fontawesome/white/svg/chain.svg new file mode 100644 index 0000000..f2b6b5f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/chain.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/check-circle-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/check-circle-o.svg new file mode 100644 index 0000000..cf11fed --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/check-circle-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/check-circle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/check-circle.svg new file mode 100644 index 0000000..d87a05d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/check-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/check-square-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/check-square-o.svg new file mode 100644 index 0000000..8b6471c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/check-square-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/check-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/check-square.svg new file mode 100644 index 0000000..b22937c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/check-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/check.svg b/src/opsoro/server/static/images/fontawesome/white/svg/check.svg new file mode 100644 index 0000000..557ef4c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/chevron-circle-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-circle-down.svg new file mode 100644 index 0000000..1898d50 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-circle-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/chevron-circle-left.svg b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-circle-left.svg new file mode 100644 index 0000000..d126f07 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-circle-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/chevron-circle-right.svg b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-circle-right.svg new file mode 100644 index 0000000..3ff5227 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-circle-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/chevron-circle-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-circle-up.svg new file mode 100644 index 0000000..464d46b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-circle-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/chevron-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-down.svg new file mode 100644 index 0000000..aab1fb3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/chevron-left.svg b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-left.svg new file mode 100644 index 0000000..bbba1a9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/chevron-right.svg b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-right.svg new file mode 100644 index 0000000..19d1076 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/chevron-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-up.svg new file mode 100644 index 0000000..892a8a1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/chevron-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/child.svg b/src/opsoro/server/static/images/fontawesome/white/svg/child.svg new file mode 100644 index 0000000..d28bb4c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/child.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/chrome.svg b/src/opsoro/server/static/images/fontawesome/white/svg/chrome.svg new file mode 100644 index 0000000..d476581 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/chrome.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/circle-o-notch.svg b/src/opsoro/server/static/images/fontawesome/white/svg/circle-o-notch.svg new file mode 100644 index 0000000..3e48c67 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/circle-o-notch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/circle-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/circle-o.svg new file mode 100644 index 0000000..e94568f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/circle-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/circle-thin.svg b/src/opsoro/server/static/images/fontawesome/white/svg/circle-thin.svg new file mode 100644 index 0000000..9f977f4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/circle-thin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/circle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/circle.svg new file mode 100644 index 0000000..1e1b567 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/clipboard.svg b/src/opsoro/server/static/images/fontawesome/white/svg/clipboard.svg new file mode 100644 index 0000000..b194427 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/clipboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/clock-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/clock-o.svg new file mode 100644 index 0000000..b7b3674 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/clock-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/clone.svg b/src/opsoro/server/static/images/fontawesome/white/svg/clone.svg new file mode 100644 index 0000000..6b5e87f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/clone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/close.svg b/src/opsoro/server/static/images/fontawesome/white/svg/close.svg new file mode 100644 index 0000000..cd7f259 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cloud-download.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cloud-download.svg new file mode 100644 index 0000000..19acb19 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cloud-download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cloud-upload.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cloud-upload.svg new file mode 100644 index 0000000..4eac0d5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cloud-upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cloud.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cloud.svg new file mode 100644 index 0000000..c4273a9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cny.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cny.svg new file mode 100644 index 0000000..1a7839d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cny.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/code-fork.svg b/src/opsoro/server/static/images/fontawesome/white/svg/code-fork.svg new file mode 100644 index 0000000..53b6c51 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/code-fork.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/code.svg b/src/opsoro/server/static/images/fontawesome/white/svg/code.svg new file mode 100644 index 0000000..63b94d4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/codepen.svg b/src/opsoro/server/static/images/fontawesome/white/svg/codepen.svg new file mode 100644 index 0000000..7a93256 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/codepen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/codiepie.svg b/src/opsoro/server/static/images/fontawesome/white/svg/codiepie.svg new file mode 100644 index 0000000..43771b2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/codiepie.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/coffee.svg b/src/opsoro/server/static/images/fontawesome/white/svg/coffee.svg new file mode 100644 index 0000000..714bf5f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/coffee.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cog.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cog.svg new file mode 100644 index 0000000..8582ee3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cog.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cogs.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cogs.svg new file mode 100644 index 0000000..74b8cb9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cogs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/columns.svg b/src/opsoro/server/static/images/fontawesome/white/svg/columns.svg new file mode 100644 index 0000000..352f3bd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/columns.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/comment-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/comment-o.svg new file mode 100644 index 0000000..0d68038 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/comment-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/comment.svg b/src/opsoro/server/static/images/fontawesome/white/svg/comment.svg new file mode 100644 index 0000000..1331515 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/comment.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/commenting-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/commenting-o.svg new file mode 100644 index 0000000..d2ad812 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/commenting-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/commenting.svg b/src/opsoro/server/static/images/fontawesome/white/svg/commenting.svg new file mode 100644 index 0000000..97c4d07 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/commenting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/comments-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/comments-o.svg new file mode 100644 index 0000000..e2913c1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/comments-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/comments.svg b/src/opsoro/server/static/images/fontawesome/white/svg/comments.svg new file mode 100644 index 0000000..3f898e7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/comments.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/compass.svg b/src/opsoro/server/static/images/fontawesome/white/svg/compass.svg new file mode 100644 index 0000000..3f761ab --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/compass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/compress.svg b/src/opsoro/server/static/images/fontawesome/white/svg/compress.svg new file mode 100644 index 0000000..fd31bff --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/compress.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/connectdevelop.svg b/src/opsoro/server/static/images/fontawesome/white/svg/connectdevelop.svg new file mode 100644 index 0000000..8b1f8a5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/connectdevelop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/contao.svg b/src/opsoro/server/static/images/fontawesome/white/svg/contao.svg new file mode 100644 index 0000000..a62e873 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/contao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/copy.svg b/src/opsoro/server/static/images/fontawesome/white/svg/copy.svg new file mode 100644 index 0000000..d2cd405 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/copyright.svg b/src/opsoro/server/static/images/fontawesome/white/svg/copyright.svg new file mode 100644 index 0000000..f2c224d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/copyright.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/creative-commons.svg b/src/opsoro/server/static/images/fontawesome/white/svg/creative-commons.svg new file mode 100644 index 0000000..c0d1991 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/creative-commons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/credit-card-alt.svg b/src/opsoro/server/static/images/fontawesome/white/svg/credit-card-alt.svg new file mode 100644 index 0000000..7411e8b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/credit-card-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/credit-card.svg b/src/opsoro/server/static/images/fontawesome/white/svg/credit-card.svg new file mode 100644 index 0000000..95d7fa2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/credit-card.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/crop.svg b/src/opsoro/server/static/images/fontawesome/white/svg/crop.svg new file mode 100644 index 0000000..660bebb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/crop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/crosshairs.svg b/src/opsoro/server/static/images/fontawesome/white/svg/crosshairs.svg new file mode 100644 index 0000000..d22ca26 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/crosshairs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/css3.svg b/src/opsoro/server/static/images/fontawesome/white/svg/css3.svg new file mode 100644 index 0000000..16c1e40 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/css3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cube.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cube.svg new file mode 100644 index 0000000..6042e9c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cubes.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cubes.svg new file mode 100644 index 0000000..ae8472e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cubes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cut.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cut.svg new file mode 100644 index 0000000..57c505c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cut.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/cutlery.svg b/src/opsoro/server/static/images/fontawesome/white/svg/cutlery.svg new file mode 100644 index 0000000..980b418 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/cutlery.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/dashboard.svg b/src/opsoro/server/static/images/fontawesome/white/svg/dashboard.svg new file mode 100644 index 0000000..55b35e0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/dashcube.svg b/src/opsoro/server/static/images/fontawesome/white/svg/dashcube.svg new file mode 100644 index 0000000..29da1a8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/dashcube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/database.svg b/src/opsoro/server/static/images/fontawesome/white/svg/database.svg new file mode 100644 index 0000000..7c4ab4a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/database.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/dedent.svg b/src/opsoro/server/static/images/fontawesome/white/svg/dedent.svg new file mode 100644 index 0000000..7d1c45d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/dedent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/delicious.svg b/src/opsoro/server/static/images/fontawesome/white/svg/delicious.svg new file mode 100644 index 0000000..dcdeaeb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/delicious.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/desktop.svg b/src/opsoro/server/static/images/fontawesome/white/svg/desktop.svg new file mode 100644 index 0000000..c812e6e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/desktop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/deviantart.svg b/src/opsoro/server/static/images/fontawesome/white/svg/deviantart.svg new file mode 100644 index 0000000..ea1442a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/deviantart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/diamond.svg b/src/opsoro/server/static/images/fontawesome/white/svg/diamond.svg new file mode 100644 index 0000000..8e60d00 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/diamond.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/digg.svg b/src/opsoro/server/static/images/fontawesome/white/svg/digg.svg new file mode 100644 index 0000000..d854af1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/digg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/dollar.svg b/src/opsoro/server/static/images/fontawesome/white/svg/dollar.svg new file mode 100644 index 0000000..61d02d8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/dollar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/dot-circle-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/dot-circle-o.svg new file mode 100644 index 0000000..a7366bb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/dot-circle-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/download.svg b/src/opsoro/server/static/images/fontawesome/white/svg/download.svg new file mode 100644 index 0000000..0d19110 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/dribbble.svg b/src/opsoro/server/static/images/fontawesome/white/svg/dribbble.svg new file mode 100644 index 0000000..aabe62f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/dribbble.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/dropbox.svg b/src/opsoro/server/static/images/fontawesome/white/svg/dropbox.svg new file mode 100644 index 0000000..252d475 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/dropbox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/drupal.svg b/src/opsoro/server/static/images/fontawesome/white/svg/drupal.svg new file mode 100644 index 0000000..bcdff6e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/drupal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/edge.svg b/src/opsoro/server/static/images/fontawesome/white/svg/edge.svg new file mode 100644 index 0000000..3253ae6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/edge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/edit.svg b/src/opsoro/server/static/images/fontawesome/white/svg/edit.svg new file mode 100644 index 0000000..c8d2c4b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/eject.svg b/src/opsoro/server/static/images/fontawesome/white/svg/eject.svg new file mode 100644 index 0000000..3646361 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/eject.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/ellipsis-h.svg b/src/opsoro/server/static/images/fontawesome/white/svg/ellipsis-h.svg new file mode 100644 index 0000000..772fd78 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/ellipsis-h.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/ellipsis-v.svg b/src/opsoro/server/static/images/fontawesome/white/svg/ellipsis-v.svg new file mode 100644 index 0000000..030d74a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/ellipsis-v.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/empire.svg b/src/opsoro/server/static/images/fontawesome/white/svg/empire.svg new file mode 100644 index 0000000..4d909fe --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/empire.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/envelope-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/envelope-o.svg new file mode 100644 index 0000000..dbf5b6d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/envelope-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/envelope-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/envelope-square.svg new file mode 100644 index 0000000..702133f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/envelope-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/envelope.svg b/src/opsoro/server/static/images/fontawesome/white/svg/envelope.svg new file mode 100644 index 0000000..4a2b9db --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/envelope.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/eraser.svg b/src/opsoro/server/static/images/fontawesome/white/svg/eraser.svg new file mode 100644 index 0000000..1aaf906 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/eraser.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/eur.svg b/src/opsoro/server/static/images/fontawesome/white/svg/eur.svg new file mode 100644 index 0000000..48968a6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/eur.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/euro.svg b/src/opsoro/server/static/images/fontawesome/white/svg/euro.svg new file mode 100644 index 0000000..48968a6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/euro.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/exchange.svg b/src/opsoro/server/static/images/fontawesome/white/svg/exchange.svg new file mode 100644 index 0000000..53d9216 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/exchange.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/exclamation-circle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/exclamation-circle.svg new file mode 100644 index 0000000..b5c77a8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/exclamation-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/exclamation-triangle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/exclamation-triangle.svg new file mode 100644 index 0000000..f788dd4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/exclamation-triangle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/exclamation.svg b/src/opsoro/server/static/images/fontawesome/white/svg/exclamation.svg new file mode 100644 index 0000000..7e20f71 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/exclamation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/expand.svg b/src/opsoro/server/static/images/fontawesome/white/svg/expand.svg new file mode 100644 index 0000000..bcd955d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/expand.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/expeditedssl.svg b/src/opsoro/server/static/images/fontawesome/white/svg/expeditedssl.svg new file mode 100644 index 0000000..c00ee5b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/expeditedssl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/external-link-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/external-link-square.svg new file mode 100644 index 0000000..e227869 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/external-link-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/external-link.svg b/src/opsoro/server/static/images/fontawesome/white/svg/external-link.svg new file mode 100644 index 0000000..8981ef4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/external-link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/eye-slash.svg b/src/opsoro/server/static/images/fontawesome/white/svg/eye-slash.svg new file mode 100644 index 0000000..fa2d608 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/eye-slash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/eye.svg b/src/opsoro/server/static/images/fontawesome/white/svg/eye.svg new file mode 100644 index 0000000..a567070 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/eyedropper.svg b/src/opsoro/server/static/images/fontawesome/white/svg/eyedropper.svg new file mode 100644 index 0000000..015ad52 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/eyedropper.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/facebook-f.svg b/src/opsoro/server/static/images/fontawesome/white/svg/facebook-f.svg new file mode 100644 index 0000000..37ca55d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/facebook-f.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/facebook-official.svg b/src/opsoro/server/static/images/fontawesome/white/svg/facebook-official.svg new file mode 100644 index 0000000..4c3359b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/facebook-official.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/facebook-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/facebook-square.svg new file mode 100644 index 0000000..7af64d7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/facebook-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/facebook.svg b/src/opsoro/server/static/images/fontawesome/white/svg/facebook.svg new file mode 100644 index 0000000..37ca55d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/facebook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/fast-backward.svg b/src/opsoro/server/static/images/fontawesome/white/svg/fast-backward.svg new file mode 100644 index 0000000..36e0c40 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/fast-backward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/fast-forward.svg b/src/opsoro/server/static/images/fontawesome/white/svg/fast-forward.svg new file mode 100644 index 0000000..f09c31b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/fast-forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/fax.svg b/src/opsoro/server/static/images/fontawesome/white/svg/fax.svg new file mode 100644 index 0000000..28fb543 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/fax.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/feed.svg b/src/opsoro/server/static/images/fontawesome/white/svg/feed.svg new file mode 100644 index 0000000..adc2827 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/feed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/female.svg b/src/opsoro/server/static/images/fontawesome/white/svg/female.svg new file mode 100644 index 0000000..72f3c36 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/female.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/fighter-jet.svg b/src/opsoro/server/static/images/fontawesome/white/svg/fighter-jet.svg new file mode 100644 index 0000000..c50763e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/fighter-jet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-archive-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-archive-o.svg new file mode 100644 index 0000000..a2b6ed6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-archive-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-audio-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-audio-o.svg new file mode 100644 index 0000000..f2d886d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-audio-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-code-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-code-o.svg new file mode 100644 index 0000000..78d404c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-code-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-excel-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-excel-o.svg new file mode 100644 index 0000000..742bd0e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-excel-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-image-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-image-o.svg new file mode 100644 index 0000000..121449f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-image-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-movie-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-movie-o.svg new file mode 100644 index 0000000..6e0faa6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-movie-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-o.svg new file mode 100644 index 0000000..9612318 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-pdf-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-pdf-o.svg new file mode 100644 index 0000000..1aaff66 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-pdf-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-photo-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-photo-o.svg new file mode 100644 index 0000000..121449f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-photo-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-picture-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-picture-o.svg new file mode 100644 index 0000000..121449f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-picture-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-powerpoint-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-powerpoint-o.svg new file mode 100644 index 0000000..b311742 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-powerpoint-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-sound-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-sound-o.svg new file mode 100644 index 0000000..f2d886d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-sound-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-text-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-text-o.svg new file mode 100644 index 0000000..0ea9d61 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-text-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-text.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-text.svg new file mode 100644 index 0000000..be21c50 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-video-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-video-o.svg new file mode 100644 index 0000000..6e0faa6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-video-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-word-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-word-o.svg new file mode 100644 index 0000000..9762091 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-word-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file-zip-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file-zip-o.svg new file mode 100644 index 0000000..a2b6ed6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file-zip-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/file.svg b/src/opsoro/server/static/images/fontawesome/white/svg/file.svg new file mode 100644 index 0000000..51b1b52 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/files-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/files-o.svg new file mode 100644 index 0000000..d2cd405 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/files-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/film.svg b/src/opsoro/server/static/images/fontawesome/white/svg/film.svg new file mode 100644 index 0000000..974406b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/film.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/filter.svg b/src/opsoro/server/static/images/fontawesome/white/svg/filter.svg new file mode 100644 index 0000000..1472466 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/filter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/fire-extinguisher.svg b/src/opsoro/server/static/images/fontawesome/white/svg/fire-extinguisher.svg new file mode 100644 index 0000000..801487c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/fire-extinguisher.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/fire.svg b/src/opsoro/server/static/images/fontawesome/white/svg/fire.svg new file mode 100644 index 0000000..1e6f7cc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/fire.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/firefox.svg b/src/opsoro/server/static/images/fontawesome/white/svg/firefox.svg new file mode 100644 index 0000000..467f8a9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/firefox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/flag-checkered.svg b/src/opsoro/server/static/images/fontawesome/white/svg/flag-checkered.svg new file mode 100644 index 0000000..b70d8c7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/flag-checkered.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/flag-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/flag-o.svg new file mode 100644 index 0000000..a82dc85 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/flag-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/flag.svg b/src/opsoro/server/static/images/fontawesome/white/svg/flag.svg new file mode 100644 index 0000000..4f41490 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/flag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/flash.svg b/src/opsoro/server/static/images/fontawesome/white/svg/flash.svg new file mode 100644 index 0000000..ee43756 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/flash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/flask.svg b/src/opsoro/server/static/images/fontawesome/white/svg/flask.svg new file mode 100644 index 0000000..602c302 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/flask.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/flickr.svg b/src/opsoro/server/static/images/fontawesome/white/svg/flickr.svg new file mode 100644 index 0000000..0a91bc6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/flickr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/floppy-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/floppy-o.svg new file mode 100644 index 0000000..1377b1b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/floppy-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/folder-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/folder-o.svg new file mode 100644 index 0000000..4b7faf0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/folder-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/folder-open-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/folder-open-o.svg new file mode 100644 index 0000000..3a94a1c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/folder-open-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/folder-open.svg b/src/opsoro/server/static/images/fontawesome/white/svg/folder-open.svg new file mode 100644 index 0000000..729a21c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/folder-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/folder.svg b/src/opsoro/server/static/images/fontawesome/white/svg/folder.svg new file mode 100644 index 0000000..b7503d2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/font.svg b/src/opsoro/server/static/images/fontawesome/white/svg/font.svg new file mode 100644 index 0000000..703c592 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/font.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/fonticons.svg b/src/opsoro/server/static/images/fontawesome/white/svg/fonticons.svg new file mode 100644 index 0000000..4a47e48 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/fonticons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/fort-awesome.svg b/src/opsoro/server/static/images/fontawesome/white/svg/fort-awesome.svg new file mode 100644 index 0000000..d419f8c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/fort-awesome.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/forumbee.svg b/src/opsoro/server/static/images/fontawesome/white/svg/forumbee.svg new file mode 100644 index 0000000..e1391a6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/forumbee.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/forward.svg b/src/opsoro/server/static/images/fontawesome/white/svg/forward.svg new file mode 100644 index 0000000..95c161c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/foursquare.svg b/src/opsoro/server/static/images/fontawesome/white/svg/foursquare.svg new file mode 100644 index 0000000..3cce1c7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/foursquare.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/frown-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/frown-o.svg new file mode 100644 index 0000000..990a4ea --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/frown-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/futbol-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/futbol-o.svg new file mode 100644 index 0000000..9ad64f0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/futbol-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/gamepad.svg b/src/opsoro/server/static/images/fontawesome/white/svg/gamepad.svg new file mode 100644 index 0000000..26fa6c6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/gamepad.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/gavel.svg b/src/opsoro/server/static/images/fontawesome/white/svg/gavel.svg new file mode 100644 index 0000000..1f49172 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/gavel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/gbp.svg b/src/opsoro/server/static/images/fontawesome/white/svg/gbp.svg new file mode 100644 index 0000000..e08eca3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/gbp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/ge.svg b/src/opsoro/server/static/images/fontawesome/white/svg/ge.svg new file mode 100644 index 0000000..4d909fe --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/ge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/gear.svg b/src/opsoro/server/static/images/fontawesome/white/svg/gear.svg new file mode 100644 index 0000000..8582ee3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/gear.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/gears.svg b/src/opsoro/server/static/images/fontawesome/white/svg/gears.svg new file mode 100644 index 0000000..74b8cb9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/gears.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/genderless.svg b/src/opsoro/server/static/images/fontawesome/white/svg/genderless.svg new file mode 100644 index 0000000..ee69556 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/genderless.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/get-pocket.svg b/src/opsoro/server/static/images/fontawesome/white/svg/get-pocket.svg new file mode 100644 index 0000000..0923e4e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/get-pocket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/gg-circle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/gg-circle.svg new file mode 100644 index 0000000..cb13cf9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/gg-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/gg.svg b/src/opsoro/server/static/images/fontawesome/white/svg/gg.svg new file mode 100644 index 0000000..5e95b80 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/gg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/gift.svg b/src/opsoro/server/static/images/fontawesome/white/svg/gift.svg new file mode 100644 index 0000000..cc35bc8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/gift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/git-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/git-square.svg new file mode 100644 index 0000000..bb77d93 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/git-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/git.svg b/src/opsoro/server/static/images/fontawesome/white/svg/git.svg new file mode 100644 index 0000000..88f98c8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/git.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/github-alt.svg b/src/opsoro/server/static/images/fontawesome/white/svg/github-alt.svg new file mode 100644 index 0000000..db27dff --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/github-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/github-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/github-square.svg new file mode 100644 index 0000000..9e72cd2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/github-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/github.svg b/src/opsoro/server/static/images/fontawesome/white/svg/github.svg new file mode 100644 index 0000000..ccace98 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/gittip.svg b/src/opsoro/server/static/images/fontawesome/white/svg/gittip.svg new file mode 100644 index 0000000..498267c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/gittip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/glass.svg b/src/opsoro/server/static/images/fontawesome/white/svg/glass.svg new file mode 100644 index 0000000..2643c34 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/glass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/globe.svg b/src/opsoro/server/static/images/fontawesome/white/svg/globe.svg new file mode 100644 index 0000000..34921d4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/google-plus-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/google-plus-square.svg new file mode 100644 index 0000000..bd8df6c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/google-plus-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/google-plus.svg b/src/opsoro/server/static/images/fontawesome/white/svg/google-plus.svg new file mode 100644 index 0000000..803b929 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/google-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/google-wallet.svg b/src/opsoro/server/static/images/fontawesome/white/svg/google-wallet.svg new file mode 100644 index 0000000..7bab6c9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/google-wallet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/google.svg b/src/opsoro/server/static/images/fontawesome/white/svg/google.svg new file mode 100644 index 0000000..4eb82ba --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/google.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/graduation-cap.svg b/src/opsoro/server/static/images/fontawesome/white/svg/graduation-cap.svg new file mode 100644 index 0000000..aa965df --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/graduation-cap.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/gratipay.svg b/src/opsoro/server/static/images/fontawesome/white/svg/gratipay.svg new file mode 100644 index 0000000..498267c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/gratipay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/group.svg b/src/opsoro/server/static/images/fontawesome/white/svg/group.svg new file mode 100644 index 0000000..1a9bb39 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/group.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/h-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/h-square.svg new file mode 100644 index 0000000..9fd0c63 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/h-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hacker-news.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hacker-news.svg new file mode 100644 index 0000000..b784233 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hacker-news.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hand-grab-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hand-grab-o.svg new file mode 100644 index 0000000..2200f90 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hand-grab-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hand-lizard-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hand-lizard-o.svg new file mode 100644 index 0000000..b638289 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hand-lizard-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hand-o-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hand-o-down.svg new file mode 100644 index 0000000..5e9eecc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hand-o-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hand-o-left.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hand-o-left.svg new file mode 100644 index 0000000..c9c4f82 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hand-o-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hand-o-right.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hand-o-right.svg new file mode 100644 index 0000000..54c198d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hand-o-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hand-o-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hand-o-up.svg new file mode 100644 index 0000000..a94f236 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hand-o-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hand-paper-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hand-paper-o.svg new file mode 100644 index 0000000..ee8b146 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hand-paper-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hand-peace-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hand-peace-o.svg new file mode 100644 index 0000000..0813d72 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hand-peace-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hand-pointer-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hand-pointer-o.svg new file mode 100644 index 0000000..f6b1c2e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hand-pointer-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hand-rock-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hand-rock-o.svg new file mode 100644 index 0000000..2200f90 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hand-rock-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hand-scissors-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hand-scissors-o.svg new file mode 100644 index 0000000..0adccbb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hand-scissors-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hand-spock-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hand-spock-o.svg new file mode 100644 index 0000000..810cc2a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hand-spock-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hand-stop-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hand-stop-o.svg new file mode 100644 index 0000000..ee8b146 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hand-stop-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hashtag.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hashtag.svg new file mode 100644 index 0000000..97d1cb8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hashtag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hdd-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hdd-o.svg new file mode 100644 index 0000000..7d57bcc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hdd-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/header.svg b/src/opsoro/server/static/images/fontawesome/white/svg/header.svg new file mode 100644 index 0000000..5b82035 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/header.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/headphones.svg b/src/opsoro/server/static/images/fontawesome/white/svg/headphones.svg new file mode 100644 index 0000000..ae792c4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/headphones.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/heart-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/heart-o.svg new file mode 100644 index 0000000..486c0e5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/heart-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/heart.svg b/src/opsoro/server/static/images/fontawesome/white/svg/heart.svg new file mode 100644 index 0000000..70e1484 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/heart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/heartbeat.svg b/src/opsoro/server/static/images/fontawesome/white/svg/heartbeat.svg new file mode 100644 index 0000000..7e7abf3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/heartbeat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/history.svg b/src/opsoro/server/static/images/fontawesome/white/svg/history.svg new file mode 100644 index 0000000..1a60381 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/history.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/home.svg b/src/opsoro/server/static/images/fontawesome/white/svg/home.svg new file mode 100644 index 0000000..0bbcd63 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hospital-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hospital-o.svg new file mode 100644 index 0000000..49cb1c8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hospital-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hotel.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hotel.svg new file mode 100644 index 0000000..253ee7a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hotel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-1.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-1.svg new file mode 100644 index 0000000..75c618d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-2.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-2.svg new file mode 100644 index 0000000..1f9c2ed --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-3.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-3.svg new file mode 100644 index 0000000..3dbc176 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-end.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-end.svg new file mode 100644 index 0000000..3dbc176 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-end.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-half.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-half.svg new file mode 100644 index 0000000..1f9c2ed --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-half.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-o.svg new file mode 100644 index 0000000..fed3192 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-start.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-start.svg new file mode 100644 index 0000000..75c618d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass-start.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/hourglass.svg b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass.svg new file mode 100644 index 0000000..888ebe0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/hourglass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/houzz.svg b/src/opsoro/server/static/images/fontawesome/white/svg/houzz.svg new file mode 100644 index 0000000..e3ca53a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/houzz.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/html5.svg b/src/opsoro/server/static/images/fontawesome/white/svg/html5.svg new file mode 100644 index 0000000..76bd2d7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/html5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/i-cursor.svg b/src/opsoro/server/static/images/fontawesome/white/svg/i-cursor.svg new file mode 100644 index 0000000..5212916 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/i-cursor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/ils.svg b/src/opsoro/server/static/images/fontawesome/white/svg/ils.svg new file mode 100644 index 0000000..f0d3f0a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/ils.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/image.svg b/src/opsoro/server/static/images/fontawesome/white/svg/image.svg new file mode 100644 index 0000000..50ce410 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/inbox.svg b/src/opsoro/server/static/images/fontawesome/white/svg/inbox.svg new file mode 100644 index 0000000..0d6685a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/inbox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/indent.svg b/src/opsoro/server/static/images/fontawesome/white/svg/indent.svg new file mode 100644 index 0000000..8810887 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/indent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/industry.svg b/src/opsoro/server/static/images/fontawesome/white/svg/industry.svg new file mode 100644 index 0000000..c8fc20e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/industry.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/info-circle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/info-circle.svg new file mode 100644 index 0000000..0447e49 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/info-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/info.svg b/src/opsoro/server/static/images/fontawesome/white/svg/info.svg new file mode 100644 index 0000000..1c150a6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/inr.svg b/src/opsoro/server/static/images/fontawesome/white/svg/inr.svg new file mode 100644 index 0000000..643ee46 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/inr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/instagram.svg b/src/opsoro/server/static/images/fontawesome/white/svg/instagram.svg new file mode 100644 index 0000000..438076f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/instagram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/institution.svg b/src/opsoro/server/static/images/fontawesome/white/svg/institution.svg new file mode 100644 index 0000000..00960b2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/institution.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/internet-explorer.svg b/src/opsoro/server/static/images/fontawesome/white/svg/internet-explorer.svg new file mode 100644 index 0000000..b55c704 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/internet-explorer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/intersex.svg b/src/opsoro/server/static/images/fontawesome/white/svg/intersex.svg new file mode 100644 index 0000000..8e2875c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/intersex.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/ioxhost.svg b/src/opsoro/server/static/images/fontawesome/white/svg/ioxhost.svg new file mode 100644 index 0000000..e43b2aa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/ioxhost.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/italic.svg b/src/opsoro/server/static/images/fontawesome/white/svg/italic.svg new file mode 100644 index 0000000..9eb5564 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/italic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/joomla.svg b/src/opsoro/server/static/images/fontawesome/white/svg/joomla.svg new file mode 100644 index 0000000..b36da16 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/joomla.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/jpy.svg b/src/opsoro/server/static/images/fontawesome/white/svg/jpy.svg new file mode 100644 index 0000000..1a7839d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/jpy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/jsfiddle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/jsfiddle.svg new file mode 100644 index 0000000..074fb6e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/jsfiddle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/key.svg b/src/opsoro/server/static/images/fontawesome/white/svg/key.svg new file mode 100644 index 0000000..29630fd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/key.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/keyboard-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/keyboard-o.svg new file mode 100644 index 0000000..0e46ed3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/keyboard-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/krw.svg b/src/opsoro/server/static/images/fontawesome/white/svg/krw.svg new file mode 100644 index 0000000..8a1e3aa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/krw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/language.svg b/src/opsoro/server/static/images/fontawesome/white/svg/language.svg new file mode 100644 index 0000000..d4a46b3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/laptop.svg b/src/opsoro/server/static/images/fontawesome/white/svg/laptop.svg new file mode 100644 index 0000000..25f6abe --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/laptop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/lastfm-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/lastfm-square.svg new file mode 100644 index 0000000..f72bbd2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/lastfm-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/lastfm.svg b/src/opsoro/server/static/images/fontawesome/white/svg/lastfm.svg new file mode 100644 index 0000000..b8ebabd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/lastfm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/leaf.svg b/src/opsoro/server/static/images/fontawesome/white/svg/leaf.svg new file mode 100644 index 0000000..30a5cea --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/leaf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/leanpub.svg b/src/opsoro/server/static/images/fontawesome/white/svg/leanpub.svg new file mode 100644 index 0000000..a976ba3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/leanpub.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/legal.svg b/src/opsoro/server/static/images/fontawesome/white/svg/legal.svg new file mode 100644 index 0000000..1f49172 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/legal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/lemon-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/lemon-o.svg new file mode 100644 index 0000000..5e04358 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/lemon-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/level-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/level-down.svg new file mode 100644 index 0000000..f7ffa47 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/level-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/level-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/level-up.svg new file mode 100644 index 0000000..1a75e2a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/level-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/life-bouy.svg b/src/opsoro/server/static/images/fontawesome/white/svg/life-bouy.svg new file mode 100644 index 0000000..4c4c05a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/life-bouy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/life-buoy.svg b/src/opsoro/server/static/images/fontawesome/white/svg/life-buoy.svg new file mode 100644 index 0000000..4c4c05a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/life-buoy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/life-ring.svg b/src/opsoro/server/static/images/fontawesome/white/svg/life-ring.svg new file mode 100644 index 0000000..4c4c05a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/life-ring.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/life-saver.svg b/src/opsoro/server/static/images/fontawesome/white/svg/life-saver.svg new file mode 100644 index 0000000..4c4c05a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/life-saver.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/lightbulb-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/lightbulb-o.svg new file mode 100644 index 0000000..c0f8754 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/lightbulb-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/line-chart.svg b/src/opsoro/server/static/images/fontawesome/white/svg/line-chart.svg new file mode 100644 index 0000000..41ffe27 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/line-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/link.svg b/src/opsoro/server/static/images/fontawesome/white/svg/link.svg new file mode 100644 index 0000000..f2b6b5f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/linkedin-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/linkedin-square.svg new file mode 100644 index 0000000..bd9a6a8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/linkedin-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/linkedin.svg b/src/opsoro/server/static/images/fontawesome/white/svg/linkedin.svg new file mode 100644 index 0000000..5333423 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/linkedin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/linux.svg b/src/opsoro/server/static/images/fontawesome/white/svg/linux.svg new file mode 100644 index 0000000..08ea261 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/linux.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/list-alt.svg b/src/opsoro/server/static/images/fontawesome/white/svg/list-alt.svg new file mode 100644 index 0000000..b89dd61 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/list-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/list-ol.svg b/src/opsoro/server/static/images/fontawesome/white/svg/list-ol.svg new file mode 100644 index 0000000..7ce0a03 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/list-ol.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/list-ul.svg b/src/opsoro/server/static/images/fontawesome/white/svg/list-ul.svg new file mode 100644 index 0000000..9cc33a1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/list-ul.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/list.svg b/src/opsoro/server/static/images/fontawesome/white/svg/list.svg new file mode 100644 index 0000000..c45319b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/location-arrow.svg b/src/opsoro/server/static/images/fontawesome/white/svg/location-arrow.svg new file mode 100644 index 0000000..3652d2a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/location-arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/lock.svg b/src/opsoro/server/static/images/fontawesome/white/svg/lock.svg new file mode 100644 index 0000000..0c4ce6a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/long-arrow-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/long-arrow-down.svg new file mode 100644 index 0000000..cd9c286 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/long-arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/long-arrow-left.svg b/src/opsoro/server/static/images/fontawesome/white/svg/long-arrow-left.svg new file mode 100644 index 0000000..8d01472 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/long-arrow-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/long-arrow-right.svg b/src/opsoro/server/static/images/fontawesome/white/svg/long-arrow-right.svg new file mode 100644 index 0000000..5088ed7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/long-arrow-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/long-arrow-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/long-arrow-up.svg new file mode 100644 index 0000000..c8bcd6d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/long-arrow-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/magic.svg b/src/opsoro/server/static/images/fontawesome/white/svg/magic.svg new file mode 100644 index 0000000..7bc042c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/magic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/magnet.svg b/src/opsoro/server/static/images/fontawesome/white/svg/magnet.svg new file mode 100644 index 0000000..07f4d27 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/magnet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/mail-forward.svg b/src/opsoro/server/static/images/fontawesome/white/svg/mail-forward.svg new file mode 100644 index 0000000..08ee1d5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/mail-forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/mail-reply-all.svg b/src/opsoro/server/static/images/fontawesome/white/svg/mail-reply-all.svg new file mode 100644 index 0000000..32b61c1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/mail-reply-all.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/mail-reply.svg b/src/opsoro/server/static/images/fontawesome/white/svg/mail-reply.svg new file mode 100644 index 0000000..7996cc3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/mail-reply.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/male.svg b/src/opsoro/server/static/images/fontawesome/white/svg/male.svg new file mode 100644 index 0000000..092c790 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/male.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/map-marker.svg b/src/opsoro/server/static/images/fontawesome/white/svg/map-marker.svg new file mode 100644 index 0000000..8e0096a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/map-marker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/map-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/map-o.svg new file mode 100644 index 0000000..5c6433a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/map-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/map-pin.svg b/src/opsoro/server/static/images/fontawesome/white/svg/map-pin.svg new file mode 100644 index 0000000..91230a2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/map-pin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/map-signs.svg b/src/opsoro/server/static/images/fontawesome/white/svg/map-signs.svg new file mode 100644 index 0000000..992568c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/map-signs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/map.svg b/src/opsoro/server/static/images/fontawesome/white/svg/map.svg new file mode 100644 index 0000000..c4fc267 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/map.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/mars-double.svg b/src/opsoro/server/static/images/fontawesome/white/svg/mars-double.svg new file mode 100644 index 0000000..42a1354 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/mars-double.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/mars-stroke-h.svg b/src/opsoro/server/static/images/fontawesome/white/svg/mars-stroke-h.svg new file mode 100644 index 0000000..613c27f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/mars-stroke-h.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/mars-stroke-v.svg b/src/opsoro/server/static/images/fontawesome/white/svg/mars-stroke-v.svg new file mode 100644 index 0000000..e5f01ac --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/mars-stroke-v.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/mars-stroke.svg b/src/opsoro/server/static/images/fontawesome/white/svg/mars-stroke.svg new file mode 100644 index 0000000..4142b9c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/mars-stroke.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/mars.svg b/src/opsoro/server/static/images/fontawesome/white/svg/mars.svg new file mode 100644 index 0000000..0e24173 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/mars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/maxcdn.svg b/src/opsoro/server/static/images/fontawesome/white/svg/maxcdn.svg new file mode 100644 index 0000000..f83b415 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/maxcdn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/meanpath.svg b/src/opsoro/server/static/images/fontawesome/white/svg/meanpath.svg new file mode 100644 index 0000000..7d1d2bd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/meanpath.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/medium.svg b/src/opsoro/server/static/images/fontawesome/white/svg/medium.svg new file mode 100644 index 0000000..1326b4d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/medium.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/medkit.svg b/src/opsoro/server/static/images/fontawesome/white/svg/medkit.svg new file mode 100644 index 0000000..2a8ddee --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/medkit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/meh-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/meh-o.svg new file mode 100644 index 0000000..b5dbec3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/meh-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/mercury.svg b/src/opsoro/server/static/images/fontawesome/white/svg/mercury.svg new file mode 100644 index 0000000..94b0977 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/mercury.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/microphone-slash.svg b/src/opsoro/server/static/images/fontawesome/white/svg/microphone-slash.svg new file mode 100644 index 0000000..ced215c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/microphone-slash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/microphone.svg b/src/opsoro/server/static/images/fontawesome/white/svg/microphone.svg new file mode 100644 index 0000000..ae24ca9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/microphone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/minus-circle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/minus-circle.svg new file mode 100644 index 0000000..9fb005b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/minus-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/minus-square-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/minus-square-o.svg new file mode 100644 index 0000000..1e12adb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/minus-square-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/minus-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/minus-square.svg new file mode 100644 index 0000000..7d6a87a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/minus-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/minus.svg b/src/opsoro/server/static/images/fontawesome/white/svg/minus.svg new file mode 100644 index 0000000..06eb07e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/minus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/mixcloud.svg b/src/opsoro/server/static/images/fontawesome/white/svg/mixcloud.svg new file mode 100644 index 0000000..db44446 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/mixcloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/mobile-phone.svg b/src/opsoro/server/static/images/fontawesome/white/svg/mobile-phone.svg new file mode 100644 index 0000000..20586bb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/mobile-phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/mobile.svg b/src/opsoro/server/static/images/fontawesome/white/svg/mobile.svg new file mode 100644 index 0000000..20586bb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/mobile.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/modx.svg b/src/opsoro/server/static/images/fontawesome/white/svg/modx.svg new file mode 100644 index 0000000..0f39668 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/modx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/money.svg b/src/opsoro/server/static/images/fontawesome/white/svg/money.svg new file mode 100644 index 0000000..4366d04 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/moon-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/moon-o.svg new file mode 100644 index 0000000..ca36965 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/moon-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/mortar-board.svg b/src/opsoro/server/static/images/fontawesome/white/svg/mortar-board.svg new file mode 100644 index 0000000..aa965df --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/mortar-board.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/motorcycle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/motorcycle.svg new file mode 100644 index 0000000..b3a22ba --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/motorcycle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/mouse-pointer.svg b/src/opsoro/server/static/images/fontawesome/white/svg/mouse-pointer.svg new file mode 100644 index 0000000..332554b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/mouse-pointer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/music.svg b/src/opsoro/server/static/images/fontawesome/white/svg/music.svg new file mode 100644 index 0000000..cff4773 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/music.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/navicon.svg b/src/opsoro/server/static/images/fontawesome/white/svg/navicon.svg new file mode 100644 index 0000000..ed120c5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/navicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/neuter.svg b/src/opsoro/server/static/images/fontawesome/white/svg/neuter.svg new file mode 100644 index 0000000..ae3f152 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/neuter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/newspaper-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/newspaper-o.svg new file mode 100644 index 0000000..6d8a7c8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/newspaper-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/object-group.svg b/src/opsoro/server/static/images/fontawesome/white/svg/object-group.svg new file mode 100644 index 0000000..b79f69e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/object-group.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/object-ungroup.svg b/src/opsoro/server/static/images/fontawesome/white/svg/object-ungroup.svg new file mode 100644 index 0000000..2028a7d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/object-ungroup.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/odnoklassniki-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/odnoklassniki-square.svg new file mode 100644 index 0000000..127942d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/odnoklassniki-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/odnoklassniki.svg b/src/opsoro/server/static/images/fontawesome/white/svg/odnoklassniki.svg new file mode 100644 index 0000000..b0684f2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/odnoklassniki.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/opencart.svg b/src/opsoro/server/static/images/fontawesome/white/svg/opencart.svg new file mode 100644 index 0000000..f98988c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/opencart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/openid.svg b/src/opsoro/server/static/images/fontawesome/white/svg/openid.svg new file mode 100644 index 0000000..481f336 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/openid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/opera.svg b/src/opsoro/server/static/images/fontawesome/white/svg/opera.svg new file mode 100644 index 0000000..f43581d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/opera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/optin-monster.svg b/src/opsoro/server/static/images/fontawesome/white/svg/optin-monster.svg new file mode 100644 index 0000000..3902a0f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/optin-monster.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/outdent.svg b/src/opsoro/server/static/images/fontawesome/white/svg/outdent.svg new file mode 100644 index 0000000..7d1c45d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/outdent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/pagelines.svg b/src/opsoro/server/static/images/fontawesome/white/svg/pagelines.svg new file mode 100644 index 0000000..a141d89 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/pagelines.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/paint-brush.svg b/src/opsoro/server/static/images/fontawesome/white/svg/paint-brush.svg new file mode 100644 index 0000000..dc2ad8e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/paint-brush.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/paper-plane-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/paper-plane-o.svg new file mode 100644 index 0000000..3b9fb56 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/paper-plane-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/paper-plane.svg b/src/opsoro/server/static/images/fontawesome/white/svg/paper-plane.svg new file mode 100644 index 0000000..a5c7052 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/paper-plane.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/paperclip.svg b/src/opsoro/server/static/images/fontawesome/white/svg/paperclip.svg new file mode 100644 index 0000000..0375d22 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/paperclip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/paragraph.svg b/src/opsoro/server/static/images/fontawesome/white/svg/paragraph.svg new file mode 100644 index 0000000..9ef7f80 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/paragraph.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/paste.svg b/src/opsoro/server/static/images/fontawesome/white/svg/paste.svg new file mode 100644 index 0000000..b194427 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/paste.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/pause-circle-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/pause-circle-o.svg new file mode 100644 index 0000000..e360a0a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/pause-circle-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/pause-circle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/pause-circle.svg new file mode 100644 index 0000000..db14d9b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/pause-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/pause.svg b/src/opsoro/server/static/images/fontawesome/white/svg/pause.svg new file mode 100644 index 0000000..8f9336e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/pause.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/paw.svg b/src/opsoro/server/static/images/fontawesome/white/svg/paw.svg new file mode 100644 index 0000000..569f275 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/paw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/paypal.svg b/src/opsoro/server/static/images/fontawesome/white/svg/paypal.svg new file mode 100644 index 0000000..1ffb769 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/paypal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/pencil-square-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/pencil-square-o.svg new file mode 100644 index 0000000..c8d2c4b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/pencil-square-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/pencil-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/pencil-square.svg new file mode 100644 index 0000000..3edb7fe --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/pencil-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/pencil.svg b/src/opsoro/server/static/images/fontawesome/white/svg/pencil.svg new file mode 100644 index 0000000..d3f7750 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/pencil.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/percent.svg b/src/opsoro/server/static/images/fontawesome/white/svg/percent.svg new file mode 100644 index 0000000..ed94a80 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/percent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/phone-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/phone-square.svg new file mode 100644 index 0000000..0341fda --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/phone-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/phone.svg b/src/opsoro/server/static/images/fontawesome/white/svg/phone.svg new file mode 100644 index 0000000..05a554c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/photo.svg b/src/opsoro/server/static/images/fontawesome/white/svg/photo.svg new file mode 100644 index 0000000..50ce410 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/photo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/picture-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/picture-o.svg new file mode 100644 index 0000000..50ce410 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/picture-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/pie-chart.svg b/src/opsoro/server/static/images/fontawesome/white/svg/pie-chart.svg new file mode 100644 index 0000000..0c9f7c0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/pie-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/pied-piper-alt.svg b/src/opsoro/server/static/images/fontawesome/white/svg/pied-piper-alt.svg new file mode 100644 index 0000000..c545eb8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/pied-piper-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/pied-piper.svg b/src/opsoro/server/static/images/fontawesome/white/svg/pied-piper.svg new file mode 100644 index 0000000..4b3dd82 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/pied-piper.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/pinterest-p.svg b/src/opsoro/server/static/images/fontawesome/white/svg/pinterest-p.svg new file mode 100644 index 0000000..8c39637 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/pinterest-p.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/pinterest-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/pinterest-square.svg new file mode 100644 index 0000000..04a2a34 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/pinterest-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/pinterest.svg b/src/opsoro/server/static/images/fontawesome/white/svg/pinterest.svg new file mode 100644 index 0000000..abe922b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/pinterest.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/plane.svg b/src/opsoro/server/static/images/fontawesome/white/svg/plane.svg new file mode 100644 index 0000000..b203e6f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/plane.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/play-circle-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/play-circle-o.svg new file mode 100644 index 0000000..51b6115 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/play-circle-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/play-circle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/play-circle.svg new file mode 100644 index 0000000..211177e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/play-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/play.svg b/src/opsoro/server/static/images/fontawesome/white/svg/play.svg new file mode 100644 index 0000000..39abb89 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/plug.svg b/src/opsoro/server/static/images/fontawesome/white/svg/plug.svg new file mode 100644 index 0000000..f26fa61 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/plug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/plus-circle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/plus-circle.svg new file mode 100644 index 0000000..9af3293 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/plus-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/plus-square-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/plus-square-o.svg new file mode 100644 index 0000000..633b848 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/plus-square-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/plus-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/plus-square.svg new file mode 100644 index 0000000..4127fdd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/plus-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/plus.svg b/src/opsoro/server/static/images/fontawesome/white/svg/plus.svg new file mode 100644 index 0000000..fec32e5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/power-off.svg b/src/opsoro/server/static/images/fontawesome/white/svg/power-off.svg new file mode 100644 index 0000000..adf3c56 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/power-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/print.svg b/src/opsoro/server/static/images/fontawesome/white/svg/print.svg new file mode 100644 index 0000000..6db7cd6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/print.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/product-hunt.svg b/src/opsoro/server/static/images/fontawesome/white/svg/product-hunt.svg new file mode 100644 index 0000000..6a6df97 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/product-hunt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/puzzle-piece.svg b/src/opsoro/server/static/images/fontawesome/white/svg/puzzle-piece.svg new file mode 100644 index 0000000..902b14a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/puzzle-piece.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/qq.svg b/src/opsoro/server/static/images/fontawesome/white/svg/qq.svg new file mode 100644 index 0000000..708ee74 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/qq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/qrcode.svg b/src/opsoro/server/static/images/fontawesome/white/svg/qrcode.svg new file mode 100644 index 0000000..e48766a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/qrcode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/question-circle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/question-circle.svg new file mode 100644 index 0000000..1bef9b4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/question-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/question.svg b/src/opsoro/server/static/images/fontawesome/white/svg/question.svg new file mode 100644 index 0000000..eec8f41 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/question.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/quote-left.svg b/src/opsoro/server/static/images/fontawesome/white/svg/quote-left.svg new file mode 100644 index 0000000..50ae3a5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/quote-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/quote-right.svg b/src/opsoro/server/static/images/fontawesome/white/svg/quote-right.svg new file mode 100644 index 0000000..0c6c2c7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/quote-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/ra.svg b/src/opsoro/server/static/images/fontawesome/white/svg/ra.svg new file mode 100644 index 0000000..be7a04c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/ra.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/random.svg b/src/opsoro/server/static/images/fontawesome/white/svg/random.svg new file mode 100644 index 0000000..4e789cf --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/random.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/rebel.svg b/src/opsoro/server/static/images/fontawesome/white/svg/rebel.svg new file mode 100644 index 0000000..be7a04c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/rebel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/recycle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/recycle.svg new file mode 100644 index 0000000..618c5ed --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/recycle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/reddit-alien.svg b/src/opsoro/server/static/images/fontawesome/white/svg/reddit-alien.svg new file mode 100644 index 0000000..34dfbb6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/reddit-alien.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/reddit-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/reddit-square.svg new file mode 100644 index 0000000..912f98d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/reddit-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/reddit.svg b/src/opsoro/server/static/images/fontawesome/white/svg/reddit.svg new file mode 100644 index 0000000..1f661a8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/reddit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/refresh.svg b/src/opsoro/server/static/images/fontawesome/white/svg/refresh.svg new file mode 100644 index 0000000..8a751dd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/refresh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/registered.svg b/src/opsoro/server/static/images/fontawesome/white/svg/registered.svg new file mode 100644 index 0000000..2c2342f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/registered.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/remove.svg b/src/opsoro/server/static/images/fontawesome/white/svg/remove.svg new file mode 100644 index 0000000..cd7f259 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/remove.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/renren.svg b/src/opsoro/server/static/images/fontawesome/white/svg/renren.svg new file mode 100644 index 0000000..39082ef --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/renren.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/reorder.svg b/src/opsoro/server/static/images/fontawesome/white/svg/reorder.svg new file mode 100644 index 0000000..ed120c5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/reorder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/repeat.svg b/src/opsoro/server/static/images/fontawesome/white/svg/repeat.svg new file mode 100644 index 0000000..cec3fe9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/repeat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/reply-all.svg b/src/opsoro/server/static/images/fontawesome/white/svg/reply-all.svg new file mode 100644 index 0000000..32b61c1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/reply-all.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/reply.svg b/src/opsoro/server/static/images/fontawesome/white/svg/reply.svg new file mode 100644 index 0000000..7996cc3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/reply.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/retweet.svg b/src/opsoro/server/static/images/fontawesome/white/svg/retweet.svg new file mode 100644 index 0000000..aa618a0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/retweet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/rmb.svg b/src/opsoro/server/static/images/fontawesome/white/svg/rmb.svg new file mode 100644 index 0000000..1a7839d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/rmb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/road.svg b/src/opsoro/server/static/images/fontawesome/white/svg/road.svg new file mode 100644 index 0000000..840da4d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/road.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/rocket.svg b/src/opsoro/server/static/images/fontawesome/white/svg/rocket.svg new file mode 100644 index 0000000..584f17b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/rocket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/rotate-left.svg b/src/opsoro/server/static/images/fontawesome/white/svg/rotate-left.svg new file mode 100644 index 0000000..af9ceea --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/rotate-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/rotate-right.svg b/src/opsoro/server/static/images/fontawesome/white/svg/rotate-right.svg new file mode 100644 index 0000000..cec3fe9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/rotate-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/rouble.svg b/src/opsoro/server/static/images/fontawesome/white/svg/rouble.svg new file mode 100644 index 0000000..d247fff --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/rouble.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/rss-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/rss-square.svg new file mode 100644 index 0000000..ee1e1a0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/rss-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/rss.svg b/src/opsoro/server/static/images/fontawesome/white/svg/rss.svg new file mode 100644 index 0000000..adc2827 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/rub.svg b/src/opsoro/server/static/images/fontawesome/white/svg/rub.svg new file mode 100644 index 0000000..d247fff --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/rub.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/ruble.svg b/src/opsoro/server/static/images/fontawesome/white/svg/ruble.svg new file mode 100644 index 0000000..d247fff --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/ruble.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/rupee.svg b/src/opsoro/server/static/images/fontawesome/white/svg/rupee.svg new file mode 100644 index 0000000..643ee46 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/rupee.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/safari.svg b/src/opsoro/server/static/images/fontawesome/white/svg/safari.svg new file mode 100644 index 0000000..39ad977 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/safari.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/save.svg b/src/opsoro/server/static/images/fontawesome/white/svg/save.svg new file mode 100644 index 0000000..1377b1b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/scissors.svg b/src/opsoro/server/static/images/fontawesome/white/svg/scissors.svg new file mode 100644 index 0000000..57c505c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/scissors.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/scribd.svg b/src/opsoro/server/static/images/fontawesome/white/svg/scribd.svg new file mode 100644 index 0000000..21edf37 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/scribd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/search-minus.svg b/src/opsoro/server/static/images/fontawesome/white/svg/search-minus.svg new file mode 100644 index 0000000..8e3e9d1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/search-minus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/search-plus.svg b/src/opsoro/server/static/images/fontawesome/white/svg/search-plus.svg new file mode 100644 index 0000000..5605470 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/search-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/search.svg b/src/opsoro/server/static/images/fontawesome/white/svg/search.svg new file mode 100644 index 0000000..596f77a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sellsy.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sellsy.svg new file mode 100644 index 0000000..b2dfdd7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sellsy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/send-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/send-o.svg new file mode 100644 index 0000000..3b9fb56 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/send-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/send.svg b/src/opsoro/server/static/images/fontawesome/white/svg/send.svg new file mode 100644 index 0000000..a5c7052 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/send.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/server.svg b/src/opsoro/server/static/images/fontawesome/white/svg/server.svg new file mode 100644 index 0000000..22aa104 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/share-alt-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/share-alt-square.svg new file mode 100644 index 0000000..8dceafd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/share-alt-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/share-alt.svg b/src/opsoro/server/static/images/fontawesome/white/svg/share-alt.svg new file mode 100644 index 0000000..3bbce04 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/share-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/share-square-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/share-square-o.svg new file mode 100644 index 0000000..d7a3bc5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/share-square-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/share-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/share-square.svg new file mode 100644 index 0000000..f9daaad --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/share-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/share.svg b/src/opsoro/server/static/images/fontawesome/white/svg/share.svg new file mode 100644 index 0000000..08ee1d5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/shekel.svg b/src/opsoro/server/static/images/fontawesome/white/svg/shekel.svg new file mode 100644 index 0000000..f0d3f0a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/shekel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sheqel.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sheqel.svg new file mode 100644 index 0000000..f0d3f0a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sheqel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/shield.svg b/src/opsoro/server/static/images/fontawesome/white/svg/shield.svg new file mode 100644 index 0000000..4dbc50f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/shield.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/ship.svg b/src/opsoro/server/static/images/fontawesome/white/svg/ship.svg new file mode 100644 index 0000000..7b53730 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/ship.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/shirtsinbulk.svg b/src/opsoro/server/static/images/fontawesome/white/svg/shirtsinbulk.svg new file mode 100644 index 0000000..b753f36 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/shirtsinbulk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/shopping-bag.svg b/src/opsoro/server/static/images/fontawesome/white/svg/shopping-bag.svg new file mode 100644 index 0000000..df4c0db --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/shopping-bag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/shopping-basket.svg b/src/opsoro/server/static/images/fontawesome/white/svg/shopping-basket.svg new file mode 100644 index 0000000..e6e5e5d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/shopping-basket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/shopping-cart.svg b/src/opsoro/server/static/images/fontawesome/white/svg/shopping-cart.svg new file mode 100644 index 0000000..83c3126 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/shopping-cart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sign-in.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sign-in.svg new file mode 100644 index 0000000..0405278 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sign-in.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sign-out.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sign-out.svg new file mode 100644 index 0000000..3d6f234 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sign-out.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/signal.svg b/src/opsoro/server/static/images/fontawesome/white/svg/signal.svg new file mode 100644 index 0000000..d0a4350 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/signal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/simplybuilt.svg b/src/opsoro/server/static/images/fontawesome/white/svg/simplybuilt.svg new file mode 100644 index 0000000..2b7e6e4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/simplybuilt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sitemap.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sitemap.svg new file mode 100644 index 0000000..c22077f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sitemap.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/skyatlas.svg b/src/opsoro/server/static/images/fontawesome/white/svg/skyatlas.svg new file mode 100644 index 0000000..e9453dc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/skyatlas.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/skype.svg b/src/opsoro/server/static/images/fontawesome/white/svg/skype.svg new file mode 100644 index 0000000..97972c0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/skype.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/slack.svg b/src/opsoro/server/static/images/fontawesome/white/svg/slack.svg new file mode 100644 index 0000000..da449ba --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/slack.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sliders.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sliders.svg new file mode 100644 index 0000000..fc9db3f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sliders.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/slideshare.svg b/src/opsoro/server/static/images/fontawesome/white/svg/slideshare.svg new file mode 100644 index 0000000..2b61b93 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/slideshare.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/smile-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/smile-o.svg new file mode 100644 index 0000000..9ad7da1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/smile-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/soccer-ball-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/soccer-ball-o.svg new file mode 100644 index 0000000..9ad64f0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/soccer-ball-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sort-alpha-asc.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sort-alpha-asc.svg new file mode 100644 index 0000000..d9bd1b0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sort-alpha-asc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sort-alpha-desc.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sort-alpha-desc.svg new file mode 100644 index 0000000..0de76db --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sort-alpha-desc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sort-amount-asc.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sort-amount-asc.svg new file mode 100644 index 0000000..7be7dae --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sort-amount-asc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sort-amount-desc.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sort-amount-desc.svg new file mode 100644 index 0000000..52dd472 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sort-amount-desc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sort-asc.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sort-asc.svg new file mode 100644 index 0000000..de3f61b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sort-asc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sort-desc.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sort-desc.svg new file mode 100644 index 0000000..bdd6a76 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sort-desc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sort-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sort-down.svg new file mode 100644 index 0000000..bdd6a76 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sort-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sort-numeric-asc.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sort-numeric-asc.svg new file mode 100644 index 0000000..0ee20c7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sort-numeric-asc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sort-numeric-desc.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sort-numeric-desc.svg new file mode 100644 index 0000000..62ae40e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sort-numeric-desc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sort-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sort-up.svg new file mode 100644 index 0000000..de3f61b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sort-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sort.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sort.svg new file mode 100644 index 0000000..ddda05f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sort.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/soundcloud.svg b/src/opsoro/server/static/images/fontawesome/white/svg/soundcloud.svg new file mode 100644 index 0000000..0525357 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/soundcloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/space-shuttle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/space-shuttle.svg new file mode 100644 index 0000000..376fe4a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/space-shuttle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/spinner.svg b/src/opsoro/server/static/images/fontawesome/white/svg/spinner.svg new file mode 100644 index 0000000..af6bba5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/spinner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/spoon.svg b/src/opsoro/server/static/images/fontawesome/white/svg/spoon.svg new file mode 100644 index 0000000..b92aacb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/spoon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/spotify.svg b/src/opsoro/server/static/images/fontawesome/white/svg/spotify.svg new file mode 100644 index 0000000..bc12c06 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/spotify.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/square-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/square-o.svg new file mode 100644 index 0000000..5ff1908 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/square-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/square.svg new file mode 100644 index 0000000..dd931de --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/stack-exchange.svg b/src/opsoro/server/static/images/fontawesome/white/svg/stack-exchange.svg new file mode 100644 index 0000000..66e36ff --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/stack-exchange.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/stack-overflow.svg b/src/opsoro/server/static/images/fontawesome/white/svg/stack-overflow.svg new file mode 100644 index 0000000..ffae0d3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/stack-overflow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/star-half-empty.svg b/src/opsoro/server/static/images/fontawesome/white/svg/star-half-empty.svg new file mode 100644 index 0000000..03bbf45 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/star-half-empty.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/star-half-full.svg b/src/opsoro/server/static/images/fontawesome/white/svg/star-half-full.svg new file mode 100644 index 0000000..03bbf45 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/star-half-full.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/star-half-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/star-half-o.svg new file mode 100644 index 0000000..03bbf45 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/star-half-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/star-half.svg b/src/opsoro/server/static/images/fontawesome/white/svg/star-half.svg new file mode 100644 index 0000000..912deba --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/star-half.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/star-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/star-o.svg new file mode 100644 index 0000000..6db3216 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/star-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/star.svg b/src/opsoro/server/static/images/fontawesome/white/svg/star.svg new file mode 100644 index 0000000..f30b0cc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/steam-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/steam-square.svg new file mode 100644 index 0000000..c81349a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/steam-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/steam.svg b/src/opsoro/server/static/images/fontawesome/white/svg/steam.svg new file mode 100644 index 0000000..81527c8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/steam.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/step-backward.svg b/src/opsoro/server/static/images/fontawesome/white/svg/step-backward.svg new file mode 100644 index 0000000..d364940 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/step-backward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/step-forward.svg b/src/opsoro/server/static/images/fontawesome/white/svg/step-forward.svg new file mode 100644 index 0000000..46e375f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/step-forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/stethoscope.svg b/src/opsoro/server/static/images/fontawesome/white/svg/stethoscope.svg new file mode 100644 index 0000000..fe052ca --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/stethoscope.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sticky-note-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sticky-note-o.svg new file mode 100644 index 0000000..08af78f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sticky-note-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sticky-note.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sticky-note.svg new file mode 100644 index 0000000..7e4479c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sticky-note.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/stop-circle-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/stop-circle-o.svg new file mode 100644 index 0000000..2203879 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/stop-circle-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/stop-circle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/stop-circle.svg new file mode 100644 index 0000000..83d896e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/stop-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/stop.svg b/src/opsoro/server/static/images/fontawesome/white/svg/stop.svg new file mode 100644 index 0000000..434e947 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/stop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/street-view.svg b/src/opsoro/server/static/images/fontawesome/white/svg/street-view.svg new file mode 100644 index 0000000..ba0991f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/street-view.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/strikethrough.svg b/src/opsoro/server/static/images/fontawesome/white/svg/strikethrough.svg new file mode 100644 index 0000000..07a8c57 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/strikethrough.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/stumbleupon-circle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/stumbleupon-circle.svg new file mode 100644 index 0000000..6a1306a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/stumbleupon-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/stumbleupon.svg b/src/opsoro/server/static/images/fontawesome/white/svg/stumbleupon.svg new file mode 100644 index 0000000..0e98eb0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/stumbleupon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/subscript.svg b/src/opsoro/server/static/images/fontawesome/white/svg/subscript.svg new file mode 100644 index 0000000..2ef41b7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/subscript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/subway.svg b/src/opsoro/server/static/images/fontawesome/white/svg/subway.svg new file mode 100644 index 0000000..a3a1e60 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/subway.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/suitcase.svg b/src/opsoro/server/static/images/fontawesome/white/svg/suitcase.svg new file mode 100644 index 0000000..77b4f3e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/suitcase.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/sun-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/sun-o.svg new file mode 100644 index 0000000..a5cbfb4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/sun-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/superscript.svg b/src/opsoro/server/static/images/fontawesome/white/svg/superscript.svg new file mode 100644 index 0000000..71479a6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/superscript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/support.svg b/src/opsoro/server/static/images/fontawesome/white/svg/support.svg new file mode 100644 index 0000000..4c4c05a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/support.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/table.svg b/src/opsoro/server/static/images/fontawesome/white/svg/table.svg new file mode 100644 index 0000000..7ebdd4f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/tablet.svg b/src/opsoro/server/static/images/fontawesome/white/svg/tablet.svg new file mode 100644 index 0000000..29fa1f4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/tablet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/tachometer.svg b/src/opsoro/server/static/images/fontawesome/white/svg/tachometer.svg new file mode 100644 index 0000000..55b35e0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/tachometer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/tag.svg b/src/opsoro/server/static/images/fontawesome/white/svg/tag.svg new file mode 100644 index 0000000..def3088 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/tags.svg b/src/opsoro/server/static/images/fontawesome/white/svg/tags.svg new file mode 100644 index 0000000..6012b1b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/tags.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/tasks.svg b/src/opsoro/server/static/images/fontawesome/white/svg/tasks.svg new file mode 100644 index 0000000..54460a5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/tasks.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/taxi.svg b/src/opsoro/server/static/images/fontawesome/white/svg/taxi.svg new file mode 100644 index 0000000..7775add --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/taxi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/television.svg b/src/opsoro/server/static/images/fontawesome/white/svg/television.svg new file mode 100644 index 0000000..fa80f2f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/television.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/tencent-weibo.svg b/src/opsoro/server/static/images/fontawesome/white/svg/tencent-weibo.svg new file mode 100644 index 0000000..9534ebc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/tencent-weibo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/terminal.svg b/src/opsoro/server/static/images/fontawesome/white/svg/terminal.svg new file mode 100644 index 0000000..8dd65b5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/terminal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/text-height.svg b/src/opsoro/server/static/images/fontawesome/white/svg/text-height.svg new file mode 100644 index 0000000..33a4351 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/text-height.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/text-width.svg b/src/opsoro/server/static/images/fontawesome/white/svg/text-width.svg new file mode 100644 index 0000000..268a89b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/text-width.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/th-large.svg b/src/opsoro/server/static/images/fontawesome/white/svg/th-large.svg new file mode 100644 index 0000000..6dc5c23 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/th-large.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/th-list.svg b/src/opsoro/server/static/images/fontawesome/white/svg/th-list.svg new file mode 100644 index 0000000..f9ede12 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/th-list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/th.svg b/src/opsoro/server/static/images/fontawesome/white/svg/th.svg new file mode 100644 index 0000000..24cf36a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/th.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/thumb-tack.svg b/src/opsoro/server/static/images/fontawesome/white/svg/thumb-tack.svg new file mode 100644 index 0000000..76820f2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/thumb-tack.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/thumbs-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/thumbs-down.svg new file mode 100644 index 0000000..17a53e0 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/thumbs-o-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/thumbs-o-down.svg new file mode 100644 index 0000000..d51821b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/thumbs-o-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/thumbs-o-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/thumbs-o-up.svg new file mode 100644 index 0000000..223f4af --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/thumbs-o-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/thumbs-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/thumbs-up.svg new file mode 100644 index 0000000..2b6e4c9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/ticket.svg b/src/opsoro/server/static/images/fontawesome/white/svg/ticket.svg new file mode 100644 index 0000000..ac8c139 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/ticket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/times-circle-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/times-circle-o.svg new file mode 100644 index 0000000..96633c1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/times-circle-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/times-circle.svg b/src/opsoro/server/static/images/fontawesome/white/svg/times-circle.svg new file mode 100644 index 0000000..1de25ac --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/times-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/times.svg b/src/opsoro/server/static/images/fontawesome/white/svg/times.svg new file mode 100644 index 0000000..cd7f259 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/times.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/tint.svg b/src/opsoro/server/static/images/fontawesome/white/svg/tint.svg new file mode 100644 index 0000000..22eb372 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/tint.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/toggle-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/toggle-down.svg new file mode 100644 index 0000000..857a299 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/toggle-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/toggle-left.svg b/src/opsoro/server/static/images/fontawesome/white/svg/toggle-left.svg new file mode 100644 index 0000000..258aecf --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/toggle-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/toggle-off.svg b/src/opsoro/server/static/images/fontawesome/white/svg/toggle-off.svg new file mode 100644 index 0000000..efb03b6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/toggle-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/toggle-on.svg b/src/opsoro/server/static/images/fontawesome/white/svg/toggle-on.svg new file mode 100644 index 0000000..e257d08 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/toggle-on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/toggle-right.svg b/src/opsoro/server/static/images/fontawesome/white/svg/toggle-right.svg new file mode 100644 index 0000000..3019b1c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/toggle-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/toggle-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/toggle-up.svg new file mode 100644 index 0000000..756c66f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/toggle-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/trademark.svg b/src/opsoro/server/static/images/fontawesome/white/svg/trademark.svg new file mode 100644 index 0000000..c1a95cd --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/trademark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/train.svg b/src/opsoro/server/static/images/fontawesome/white/svg/train.svg new file mode 100644 index 0000000..2d588f7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/train.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/transgender-alt.svg b/src/opsoro/server/static/images/fontawesome/white/svg/transgender-alt.svg new file mode 100644 index 0000000..1d80bc9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/transgender-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/transgender.svg b/src/opsoro/server/static/images/fontawesome/white/svg/transgender.svg new file mode 100644 index 0000000..8e2875c --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/transgender.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/trash-o.svg b/src/opsoro/server/static/images/fontawesome/white/svg/trash-o.svg new file mode 100644 index 0000000..a906b7e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/trash-o.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/trash.svg b/src/opsoro/server/static/images/fontawesome/white/svg/trash.svg new file mode 100644 index 0000000..57a2a47 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/trash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/tree.svg b/src/opsoro/server/static/images/fontawesome/white/svg/tree.svg new file mode 100644 index 0000000..a5c3ed1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/trello.svg b/src/opsoro/server/static/images/fontawesome/white/svg/trello.svg new file mode 100644 index 0000000..3bc5066 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/trello.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/tripadvisor.svg b/src/opsoro/server/static/images/fontawesome/white/svg/tripadvisor.svg new file mode 100644 index 0000000..52ce2d6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/tripadvisor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/trophy.svg b/src/opsoro/server/static/images/fontawesome/white/svg/trophy.svg new file mode 100644 index 0000000..fa47b72 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/trophy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/truck.svg b/src/opsoro/server/static/images/fontawesome/white/svg/truck.svg new file mode 100644 index 0000000..0948cf8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/truck.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/try.svg b/src/opsoro/server/static/images/fontawesome/white/svg/try.svg new file mode 100644 index 0000000..5a81857 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/try.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/tty.svg b/src/opsoro/server/static/images/fontawesome/white/svg/tty.svg new file mode 100644 index 0000000..445d535 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/tty.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/tumblr-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/tumblr-square.svg new file mode 100644 index 0000000..7b1bcee --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/tumblr-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/tumblr.svg b/src/opsoro/server/static/images/fontawesome/white/svg/tumblr.svg new file mode 100644 index 0000000..410180a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/tumblr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/turkish-lira.svg b/src/opsoro/server/static/images/fontawesome/white/svg/turkish-lira.svg new file mode 100644 index 0000000..5a81857 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/turkish-lira.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/tv.svg b/src/opsoro/server/static/images/fontawesome/white/svg/tv.svg new file mode 100644 index 0000000..fa80f2f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/tv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/twitch.svg b/src/opsoro/server/static/images/fontawesome/white/svg/twitch.svg new file mode 100644 index 0000000..fc90e4e --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/twitch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/twitter-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/twitter-square.svg new file mode 100644 index 0000000..914f9e1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/twitter-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/twitter.svg b/src/opsoro/server/static/images/fontawesome/white/svg/twitter.svg new file mode 100644 index 0000000..59a658a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/twitter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/umbrella.svg b/src/opsoro/server/static/images/fontawesome/white/svg/umbrella.svg new file mode 100644 index 0000000..ce4afa3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/umbrella.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/underline.svg b/src/opsoro/server/static/images/fontawesome/white/svg/underline.svg new file mode 100644 index 0000000..954d9f7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/underline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/undo.svg b/src/opsoro/server/static/images/fontawesome/white/svg/undo.svg new file mode 100644 index 0000000..af9ceea --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/undo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/university.svg b/src/opsoro/server/static/images/fontawesome/white/svg/university.svg new file mode 100644 index 0000000..00960b2 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/university.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/unlink.svg b/src/opsoro/server/static/images/fontawesome/white/svg/unlink.svg new file mode 100644 index 0000000..85901c3 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/unlink.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/unlock-alt.svg b/src/opsoro/server/static/images/fontawesome/white/svg/unlock-alt.svg new file mode 100644 index 0000000..5830630 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/unlock-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/unlock.svg b/src/opsoro/server/static/images/fontawesome/white/svg/unlock.svg new file mode 100644 index 0000000..7c1062a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/unlock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/unsorted.svg b/src/opsoro/server/static/images/fontawesome/white/svg/unsorted.svg new file mode 100644 index 0000000..ddda05f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/unsorted.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/upload.svg b/src/opsoro/server/static/images/fontawesome/white/svg/upload.svg new file mode 100644 index 0000000..cfbe7bc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/usb.svg b/src/opsoro/server/static/images/fontawesome/white/svg/usb.svg new file mode 100644 index 0000000..2d05414 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/usb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/usd.svg b/src/opsoro/server/static/images/fontawesome/white/svg/usd.svg new file mode 100644 index 0000000..61d02d8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/usd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/user-md.svg b/src/opsoro/server/static/images/fontawesome/white/svg/user-md.svg new file mode 100644 index 0000000..f118c72 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/user-md.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/user-plus.svg b/src/opsoro/server/static/images/fontawesome/white/svg/user-plus.svg new file mode 100644 index 0000000..dc1e79f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/user-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/user-secret.svg b/src/opsoro/server/static/images/fontawesome/white/svg/user-secret.svg new file mode 100644 index 0000000..f3a14cb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/user-secret.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/user-times.svg b/src/opsoro/server/static/images/fontawesome/white/svg/user-times.svg new file mode 100644 index 0000000..0207ee6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/user-times.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/user.svg b/src/opsoro/server/static/images/fontawesome/white/svg/user.svg new file mode 100644 index 0000000..c6a06aa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/users.svg b/src/opsoro/server/static/images/fontawesome/white/svg/users.svg new file mode 100644 index 0000000..1a9bb39 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/users.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/venus-double.svg b/src/opsoro/server/static/images/fontawesome/white/svg/venus-double.svg new file mode 100644 index 0000000..2eeaf32 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/venus-double.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/venus-mars.svg b/src/opsoro/server/static/images/fontawesome/white/svg/venus-mars.svg new file mode 100644 index 0000000..60d2ad1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/venus-mars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/venus.svg b/src/opsoro/server/static/images/fontawesome/white/svg/venus.svg new file mode 100644 index 0000000..d359921 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/venus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/viacoin.svg b/src/opsoro/server/static/images/fontawesome/white/svg/viacoin.svg new file mode 100644 index 0000000..7e13fd9 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/viacoin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/video-camera.svg b/src/opsoro/server/static/images/fontawesome/white/svg/video-camera.svg new file mode 100644 index 0000000..fe5ce70 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/video-camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/vimeo-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/vimeo-square.svg new file mode 100644 index 0000000..270f3e8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/vimeo-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/vimeo.svg b/src/opsoro/server/static/images/fontawesome/white/svg/vimeo.svg new file mode 100644 index 0000000..3a5f678 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/vimeo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/vine.svg b/src/opsoro/server/static/images/fontawesome/white/svg/vine.svg new file mode 100644 index 0000000..86bec06 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/vine.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/vk.svg b/src/opsoro/server/static/images/fontawesome/white/svg/vk.svg new file mode 100644 index 0000000..9e0990b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/vk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/volume-down.svg b/src/opsoro/server/static/images/fontawesome/white/svg/volume-down.svg new file mode 100644 index 0000000..586f894 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/volume-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/volume-off.svg b/src/opsoro/server/static/images/fontawesome/white/svg/volume-off.svg new file mode 100644 index 0000000..94200c5 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/volume-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/volume-up.svg b/src/opsoro/server/static/images/fontawesome/white/svg/volume-up.svg new file mode 100644 index 0000000..9d8d40f --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/volume-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/warning.svg b/src/opsoro/server/static/images/fontawesome/white/svg/warning.svg new file mode 100644 index 0000000..f788dd4 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/wechat.svg b/src/opsoro/server/static/images/fontawesome/white/svg/wechat.svg new file mode 100644 index 0000000..ed06fa8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/wechat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/weibo.svg b/src/opsoro/server/static/images/fontawesome/white/svg/weibo.svg new file mode 100644 index 0000000..ba65af1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/weibo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/weixin.svg b/src/opsoro/server/static/images/fontawesome/white/svg/weixin.svg new file mode 100644 index 0000000..ed06fa8 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/weixin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/whatsapp.svg b/src/opsoro/server/static/images/fontawesome/white/svg/whatsapp.svg new file mode 100644 index 0000000..2977ec1 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/whatsapp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/wheelchair.svg b/src/opsoro/server/static/images/fontawesome/white/svg/wheelchair.svg new file mode 100644 index 0000000..bf0dafc --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/wheelchair.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/wifi.svg b/src/opsoro/server/static/images/fontawesome/white/svg/wifi.svg new file mode 100644 index 0000000..45b91d6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/wifi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/wikipedia-w.svg b/src/opsoro/server/static/images/fontawesome/white/svg/wikipedia-w.svg new file mode 100644 index 0000000..d76ac9a --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/wikipedia-w.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/windows.svg b/src/opsoro/server/static/images/fontawesome/white/svg/windows.svg new file mode 100644 index 0000000..da416ad --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/windows.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/won.svg b/src/opsoro/server/static/images/fontawesome/white/svg/won.svg new file mode 100644 index 0000000..8a1e3aa --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/won.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/wordpress.svg b/src/opsoro/server/static/images/fontawesome/white/svg/wordpress.svg new file mode 100644 index 0000000..8bc6e48 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/wordpress.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/wrench.svg b/src/opsoro/server/static/images/fontawesome/white/svg/wrench.svg new file mode 100644 index 0000000..a6f3cac --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/wrench.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/xing-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/xing-square.svg new file mode 100644 index 0000000..0c0e18b --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/xing-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/xing.svg b/src/opsoro/server/static/images/fontawesome/white/svg/xing.svg new file mode 100644 index 0000000..b38a4d7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/xing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/y-combinator-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/y-combinator-square.svg new file mode 100644 index 0000000..b784233 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/y-combinator-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/y-combinator.svg b/src/opsoro/server/static/images/fontawesome/white/svg/y-combinator.svg new file mode 100644 index 0000000..b8b3404 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/y-combinator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/yahoo.svg b/src/opsoro/server/static/images/fontawesome/white/svg/yahoo.svg new file mode 100644 index 0000000..d61a2d7 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/yahoo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/yc-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/yc-square.svg new file mode 100644 index 0000000..b784233 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/yc-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/yc.svg b/src/opsoro/server/static/images/fontawesome/white/svg/yc.svg new file mode 100644 index 0000000..b8b3404 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/yc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/yelp.svg b/src/opsoro/server/static/images/fontawesome/white/svg/yelp.svg new file mode 100644 index 0000000..ec12110 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/yelp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/yen.svg b/src/opsoro/server/static/images/fontawesome/white/svg/yen.svg new file mode 100644 index 0000000..1a7839d --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/yen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/youtube-play.svg b/src/opsoro/server/static/images/fontawesome/white/svg/youtube-play.svg new file mode 100644 index 0000000..b7caf49 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/youtube-play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/youtube-square.svg b/src/opsoro/server/static/images/fontawesome/white/svg/youtube-square.svg new file mode 100644 index 0000000..3d16bcb --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/youtube-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/fontawesome/white/svg/youtube.svg b/src/opsoro/server/static/images/fontawesome/white/svg/youtube.svg new file mode 100644 index 0000000..5894cf6 --- /dev/null +++ b/src/opsoro/server/static/images/fontawesome/white/svg/youtube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/opsoro/server/static/images/logo/opsoro_full_dark.png b/src/opsoro/server/static/images/logo/opsoro_full_dark.png index ca7cdd9..7a7f86b 100644 Binary files a/src/opsoro/server/static/images/logo/opsoro_full_dark.png and b/src/opsoro/server/static/images/logo/opsoro_full_dark.png differ diff --git a/src/opsoro/server/static/images/logo/opsoro_full_light.png b/src/opsoro/server/static/images/logo/opsoro_full_light.png index 2506bf9..9e0a131 100644 Binary files a/src/opsoro/server/static/images/logo/opsoro_full_light.png and b/src/opsoro/server/static/images/logo/opsoro_full_light.png differ diff --git a/src/opsoro/server/static/images/logo/opsoro_icon_dark.png b/src/opsoro/server/static/images/logo/opsoro_icon_dark.png index 12c9bbc..2048acc 100644 Binary files a/src/opsoro/server/static/images/logo/opsoro_icon_dark.png and b/src/opsoro/server/static/images/logo/opsoro_icon_dark.png differ diff --git a/src/opsoro/server/static/images/logo/opsoro_icon_light.png b/src/opsoro/server/static/images/logo/opsoro_icon_light.png index c50a9c2..5fa8e7b 100644 Binary files a/src/opsoro/server/static/images/logo/opsoro_icon_light.png and b/src/opsoro/server/static/images/logo/opsoro_icon_light.png differ diff --git a/src/opsoro/server/static/images/logo/opsoro_icon_medium.png b/src/opsoro/server/static/images/logo/opsoro_icon_medium.png new file mode 100644 index 0000000..9ba2699 Binary files /dev/null and b/src/opsoro/server/static/images/logo/opsoro_icon_medium.png differ diff --git a/src/opsoro/server/static/images/robot/arms/small_arm_2.svg b/src/opsoro/server/static/images/robot/arms/small_arm_2.svg new file mode 100644 index 0000000..01be4dd --- /dev/null +++ b/src/opsoro/server/static/images/robot/arms/small_arm_2.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/opsoro/server/static/images/robot/grids/A4_portrait.svg b/src/opsoro/server/static/images/robot/grids/A4_portrait.svg new file mode 100644 index 0000000..0a09112 --- /dev/null +++ b/src/opsoro/server/static/images/robot/grids/A4_portrait.svg @@ -0,0 +1,659 @@ + + + + + + diff --git a/src/opsoro/server/static/js/blockly/.eslintignore b/src/opsoro/server/static/js/blockly/.eslintignore new file mode 100644 index 0000000..5131e62 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/.eslintignore @@ -0,0 +1,10 @@ +*_compressed*.js +*_uncompressed*.js +/msg/* +/core/css.js +/tests/jsunit/* +/tests/generators/* +/generators/* +/demos/* +/accessible/* +/appengine/* \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/.eslintrc b/src/opsoro/server/static/js/blockly/.eslintrc new file mode 100644 index 0000000..bba9e1b --- /dev/null +++ b/src/opsoro/server/static/js/blockly/.eslintrc @@ -0,0 +1,28 @@ +{ + "rules": { + "curly": ["error", "multi-line"], + "eol-last": ["error"], + "indent": ["error", 2, {"SwitchCase": 1}], # Blockly/Google use 2-space indents + "linebreak-style": ["error", "unix"], + "max-len": ["error", 120, 4], + "no-trailing-spaces": ["error", { "skipBlankLines": true }], + "no-unused-vars": ["error", {"args": "after-used", "varsIgnorePattern": "^_"}], + "no-use-before-define": ["error"], + "quotes": ["off"], # Blockly mixes single and double quotes + "semi": ["error", "always"], + "space-before-function-paren": ["error", "never"], # Blockly doesn't have space before function paren + "strict": ["off"], # Blockly uses 'use strict' in files + "no-cond-assign": ["off"], # Blockly often uses cond-assignment in loops + "no-redeclare": ["off"], # Closure style allows redeclarations + "valid-jsdoc": ["error", {"requireReturn": false}], + "no-console": ["off"] + }, + "env": { + "browser": true + }, + "globals": { + "Blockly": true, # Blockly global + "goog": true # goog closure libraries/includes + }, + "extends": "eslint:recommended" +} diff --git a/src/opsoro/apps/visual_programming/static/blockly/.gitignore b/src/opsoro/server/static/js/blockly/.gitignore similarity index 80% rename from src/opsoro/apps/visual_programming/static/blockly/.gitignore rename to src/opsoro/server/static/js/blockly/.gitignore index 00504a0..53eebc8 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/.gitignore +++ b/src/opsoro/server/static/js/blockly/.gitignore @@ -5,3 +5,4 @@ npm-debug.log .project *.pyc *.komodoproject +/nbproject/private/ \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/.jshintignore b/src/opsoro/server/static/js/blockly/.jshintignore similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/.jshintignore rename to src/opsoro/server/static/js/blockly/.jshintignore diff --git a/src/opsoro/server/static/js/blockly/.npmrc b/src/opsoro/server/static/js/blockly/.npmrc new file mode 100644 index 0000000..214c29d --- /dev/null +++ b/src/opsoro/server/static/js/blockly/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org/ diff --git a/src/opsoro/server/static/js/blockly/.travis.yml b/src/opsoro/server/static/js/blockly/.travis.yml new file mode 100644 index 0000000..35b3b12 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/.travis.yml @@ -0,0 +1,32 @@ +language: node_js +node_js: +- "4" +- "stable" +sudo: required +dist: trusty +addons: + apt: + sources: + - google-chrome + packages: + - google-chrome-stable + +before_install: +- npm install google-closure-library +# Symlink closure library +- ln -s $(npm root)/google-closure-library ../closure-library + +before_script: + - export CHROME_BIN=/usr/bin/google-chrome + - export DISPLAY=:99.0 + - sh -e /etc/init.d/xvfb start +script: + - set -x + - scripts/get_geckdriver.sh + - scripts/get_selenium.sh + - scripts/get_chromedriver.sh + - scripts/selenium_connect.sh & + - node tests/jsunit/test_runner.js + +os: + - linux diff --git a/src/opsoro/server/static/js/blockly/CONTRIBUTING.md b/src/opsoro/server/static/js/blockly/CONTRIBUTING.md new file mode 100644 index 0000000..8cfd551 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/CONTRIBUTING.md @@ -0,0 +1,5 @@ +# Contributing to Blockly + +Please make pull requests against develop, not master. If your patch needs to go into master immediately, include a note in your PR. + +For more information, head over to the [Blockly Developers site](https://developers.google.com/blockly/guides/modify/contributing). diff --git a/src/opsoro/apps/visual_programming/static/blockly/COPYING b/src/opsoro/server/static/js/blockly/LICENSE similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/COPYING rename to src/opsoro/server/static/js/blockly/LICENSE diff --git a/src/opsoro/server/static/js/blockly/README.md b/src/opsoro/server/static/js/blockly/README.md new file mode 100644 index 0000000..71b4e32 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/README.md @@ -0,0 +1,11 @@ +# Blockly [![Build Status]( https://travis-ci.org/google/blockly.svg?branch=master)](https://travis-ci.org/google/blockly) + + +Google's Blockly is a web-based, visual programming editor. Users can drag +blocks together to build programs. All code is free and open source. + +**The project page is https://developers.google.com/blockly/** + +![](https://developers.google.com/blockly/images/sample.png) + +Blockly has an active [developer forum](https://groups.google.com/forum/#!forum/blockly). Please drop by and say hello. Show us your prototypes early; collectively we have a lot of experience and can offer hints which will save you time. diff --git a/src/opsoro/server/static/js/blockly/accessible/README.md b/src/opsoro/server/static/js/blockly/accessible/README.md new file mode 100644 index 0000000..a69fa66 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/README.md @@ -0,0 +1,54 @@ +Accessible Blockly +================== + +Google's Blockly is a web-based, visual programming editor that is accessible +to blind users. + +The code in this directory renders a version of the Blockly toolbox and +workspace that is fully keyboard-navigable, and compatible with most screen +readers. It is optimized for NVDA on Firefox. + +In the future, Accessible Blockly may be modified to suit accessibility needs +other than visual impairments. Note that deaf users are expected to continue +using Blockly over Accessible Blockly. + + +Using Accessible Blockly in Your Web App +---------------------------------------- +The demo at blockly/demos/accessible covers the absolute minimum required to +import Accessible Blockly into your web app. You will need to import the files +in the same order as in the demo: utils.service.js will need to be the first +Angular file imported. + +When the DOMContentLoaded event fires, call ng.platform.browser.bootstrap() on +the main component to be loaded. This will usually be blocklyApp.AppComponent, +but if you have another component that wraps it, use that one instead. + + +Customizing the Sidebar and Audio +--------------------------------- +The Accessible Blockly workspace comes with a customizable sidebar. + +To customize the sidebar, you will need to declare an ACCESSIBLE_GLOBALS object +in the global scope that looks like this: + + var ACCESSIBLE_GLOBALS = { + mediaPathPrefix: null, + customSidebarButtons: [] + }; + +The value of mediaPathPrefix should be the location of the accessible/media +folder. + +The value of 'customSidebarButtons' should be a list of objects, each +representing buttons on the sidebar. Each of these objects should have the +following keys: + - 'text' (the text to display on the button) + - 'action' (the function that gets run when the button is clicked) + - 'id' (optional; the id of the button) + + +Limitations +----------- +- We do not support having multiple Accessible Blockly apps in a single webpage. +- Accessible Blockly does not support the use of shadow blocks. diff --git a/src/opsoro/server/static/js/blockly/accessible/app.component.js b/src/opsoro/server/static/js/blockly/accessible/app.component.js new file mode 100644 index 0000000..737d392 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/app.component.js @@ -0,0 +1,82 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Top-level component for the Accessible Blockly application. + * @author madeeha@google.com (Madeeha Ghori) + */ + +blocklyApp.workspace = new Blockly.Workspace(); + +blocklyApp.AppComponent = ng.core.Component({ + selector: 'blockly-app', + template: ` + + + +
        + {{getAriaLiveReadout()}} +
        + + + + + + + + `, + directives: [ + blocklyApp.BlockOptionsModalComponent, + blocklyApp.SidebarComponent, + blocklyApp.ToolboxModalComponent, + blocklyApp.VariableModalComponent, + blocklyApp.WorkspaceComponent + ], + pipes: [blocklyApp.TranslatePipe], + // All services are declared here, so that all components in the application + // use the same instance of the service. + // https://www.sitepoint.com/angular-2-components-providers-classes-factories-values/ + providers: [ + blocklyApp.AudioService, + blocklyApp.BlockConnectionService, + blocklyApp.BlockOptionsModalService, + blocklyApp.KeyboardInputService, + blocklyApp.NotificationsService, + blocklyApp.ToolboxModalService, + blocklyApp.TreeService, + blocklyApp.UtilsService, + blocklyApp.VariableModalService + ] +}) +.Class({ + constructor: [ + blocklyApp.NotificationsService, function(notificationsService) { + this.notificationsService = notificationsService; + } + ], + getAriaLiveReadout: function() { + return this.notificationsService.getDisplayedMessage(); + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/audio.service.js b/src/opsoro/server/static/js/blockly/accessible/audio.service.js new file mode 100644 index 0000000..1225bb6 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/audio.service.js @@ -0,0 +1,91 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 Service for playing audio files. + * @author sll@google.com (Sean Lip) + */ + +blocklyApp.AudioService = ng.core.Class({ + constructor: [ + blocklyApp.NotificationsService, function(notificationsService) { + this.notificationsService = notificationsService; + + // We do not play any audio unless a media path prefix is specified. + this.canPlayAudio = false; + + if (ACCESSIBLE_GLOBALS.hasOwnProperty('mediaPathPrefix')) { + this.canPlayAudio = true; + var mediaPathPrefix = ACCESSIBLE_GLOBALS['mediaPathPrefix']; + this.AUDIO_PATHS_ = { + 'connect': mediaPathPrefix + 'click.mp3', + 'delete': mediaPathPrefix + 'delete.mp3', + 'oops': mediaPathPrefix + 'oops.mp3' + }; + } + + this.cachedAudioFiles_ = {}; + // Store callback references here so that they can be removed if a new + // call to this.play_() comes in. + this.onEndedCallbacks_ = { + 'connect': [], + 'delete': [], + 'oops': [] + }; + } + ], + play_: function(audioId, onEndedCallback) { + if (this.canPlayAudio) { + if (!this.cachedAudioFiles_.hasOwnProperty(audioId)) { + this.cachedAudioFiles_[audioId] = new Audio(this.AUDIO_PATHS_[audioId]); + } + + if (onEndedCallback) { + this.onEndedCallbacks_[audioId].push(onEndedCallback); + this.cachedAudioFiles_[audioId].addEventListener( + 'ended', onEndedCallback); + } else { + var that = this; + this.onEndedCallbacks_[audioId].forEach(function(callback) { + that.cachedAudioFiles_[audioId].removeEventListener( + 'ended', callback); + }); + this.onEndedCallbacks_[audioId].length = 0; + } + + this.cachedAudioFiles_[audioId].play(); + } + }, + playConnectSound: function() { + this.play_('connect'); + }, + playDeleteSound: function() { + this.play_('delete'); + }, + playOopsSound: function(optionalStatusMessage) { + if (optionalStatusMessage) { + var that = this; + this.play_('oops', function() { + that.notificationsService.speak(optionalStatusMessage); + }); + } else { + this.play_('oops'); + } + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/block-connection.service.js b/src/opsoro/server/static/js/blockly/accessible/block-connection.service.js new file mode 100644 index 0000000..930ef6f --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/block-connection.service.js @@ -0,0 +1,129 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 Service for handling the mechanics of how blocks + * get connected to each other. + * @author sll@google.com (Sean Lip) + */ + +blocklyApp.BlockConnectionService = ng.core.Class({ + constructor: [ + blocklyApp.NotificationsService, blocklyApp.AudioService, + function(_notificationsService, _audioService) { + this.notificationsService = _notificationsService; + this.audioService = _audioService; + + // When a user "adds a link" to a block, the connection representing this + // link is stored here. + this.markedConnection_ = null; + }], + findCompatibleConnection_: function(block, targetConnection) { + // Locates and returns a connection on the given block that is compatible + // with the target connection, if one exists. Returns null if no such + // connection exists. + // Note: the targetConnection is assumed to be the markedConnection_, or + // possibly its counterpart (in the case where the marked connection is + // currently attached to another connection). This method therefore ignores + // input connections on the given block, since one doesn't usually mark an + // output connection and attach a block to it. + if (!targetConnection || !targetConnection.getSourceBlock().workspace) { + return null; + } + + var desiredType = Blockly.OPPOSITE_TYPE[targetConnection.type]; + var potentialConnection = ( + desiredType == Blockly.OUTPUT_VALUE ? block.outputConnection : + desiredType == Blockly.PREVIOUS_STATEMENT ? block.previousConnection : + desiredType == Blockly.NEXT_STATEMENT ? block.nextConnection : + null); + + if (potentialConnection && + potentialConnection.checkType_(targetConnection)) { + return potentialConnection; + } else { + return null; + } + }, + isAnyConnectionMarked: function() { + return Boolean(this.markedConnection_); + }, + getMarkedConnectionSourceBlock: function() { + return this.markedConnection_ ? + this.markedConnection_.getSourceBlock() : null; + }, + canBeAttachedToMarkedConnection: function(block) { + return Boolean( + this.findCompatibleConnection_(block, this.markedConnection_)); + }, + canBeMovedToMarkedConnection: function(block) { + if (!this.markedConnection_) { + return false; + } + + // It should not be possible to move any ancestor of the block containing + // the marked connection to the marked connection. + var ancestorBlock = this.getMarkedConnectionSourceBlock(); + while (ancestorBlock) { + if (ancestorBlock.id == block.id) { + return false; + } + ancestorBlock = ancestorBlock.getParent(); + } + + return this.canBeAttachedToMarkedConnection(block); + }, + markConnection: function(connection) { + this.markedConnection_ = connection; + this.notificationsService.speak(Blockly.Msg.ADDED_LINK_MSG); + }, + attachToMarkedConnection: function(block) { + var xml = Blockly.Xml.blockToDom(block); + var reconstitutedBlock = Blockly.Xml.domToBlock(blocklyApp.workspace, xml); + + var targetConnection = null; + if (this.markedConnection_.targetBlock() && + this.markedConnection_.type == Blockly.PREVIOUS_STATEMENT) { + // Is the marked connection a 'previous' connection that is already + // connected? If so, find the block that's currently connected to it, and + // use that block's 'next' connection as the new marked connection. + // Otherwise, splicing does not happen correctly, and inserting a block + // in the middle of a group of two linked blocks will split the group. + targetConnection = this.markedConnection_.targetConnection; + } else { + targetConnection = this.markedConnection_; + } + + var connection = this.findCompatibleConnection_( + reconstitutedBlock, targetConnection); + if (connection) { + targetConnection.connect(connection); + + this.markedConnection_ = null; + this.audioService.playConnectSound(); + return reconstitutedBlock.id; + } else { + // We throw an error here, because we expect any UI controls that would + // result in a non-connection to be disabled or hidden. + throw Error( + 'Unable to connect block to marked connection. This should not ' + + 'happen.'); + } + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/block-options-modal.component.js b/src/opsoro/server/static/js/blockly/accessible/block-options-modal.component.js new file mode 100644 index 0000000..8f0d532 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/block-options-modal.component.js @@ -0,0 +1,173 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 Component that represents the block options modal. + * + * @author sll@google.com (Sean Lip) + */ + +blocklyApp.BlockOptionsModalComponent = ng.core.Component({ + selector: 'blockly-block-options-modal', + template: ` +
        + +
        +

        {{'BLOCK_OPTIONS'|translate}}

        +
        +
        + +
        +
        + +
        + +
        +
        +
        + `, + pipes: [blocklyApp.TranslatePipe] +}) +.Class({ + constructor: [ + blocklyApp.BlockOptionsModalService, blocklyApp.KeyboardInputService, + blocklyApp.AudioService, + function(blockOptionsModalService_, keyboardInputService_, audioService_) { + this.blockOptionsModalService = blockOptionsModalService_; + this.keyboardInputService = keyboardInputService_; + this.audioService = audioService_; + + this.modalIsVisible = false; + this.actionButtonsInfo = []; + this.activeActionButtonIndex = -1; + this.onDismissCallback = null; + + var that = this; + this.blockOptionsModalService.registerPreShowHook( + function(newActionButtonsInfo, onDismissCallback) { + that.modalIsVisible = true; + that.actionButtonsInfo = newActionButtonsInfo; + that.activeActionButtonIndex = -1; + that.onDismissCallback = onDismissCallback; + + that.keyboardInputService.setOverride({ + // Tab key: navigates to the previous or next item in the list. + '9': function(evt) { + evt.preventDefault(); + evt.stopPropagation(); + + if (evt.shiftKey) { + // Move to the previous item in the list. + if (that.activeActionButtonIndex <= 0) { + that.activeActionButtonIndex = 0; + that.audioService.playOopsSound(); + } else { + that.activeActionButtonIndex--; + } + } else { + // Move to the next item in the list. + if (that.activeActionButtonIndex == + that.actionButtonsInfo.length) { + that.audioService.playOopsSound(); + } else { + that.activeActionButtonIndex++; + } + } + + that.focusOnOption(that.activeActionButtonIndex); + }, + // Enter key: selects an action, performs it, and closes the modal. + '13': function(evt) { + evt.preventDefault(); + evt.stopPropagation(); + + if (that.activeActionButtonIndex == -1) { + return; + } + + var button = document.getElementById( + that.getOptionId(that.activeActionButtonIndex)); + if (that.activeActionButtonIndex < + that.actionButtonsInfo.length) { + that.actionButtonsInfo[that.activeActionButtonIndex].action(); + } else { + that.dismissModal(); + } + + that.hideModal(); + }, + // Escape key: closes the modal. + '27': function() { + that.dismissModal(); + }, + // Up key: no-op. + '38': function(evt) { + // Prevent the page from scrolling. + evt.preventDefault(); + }, + // Down key: no-op. + '40': function(evt) { + // Prevent the page from scrolling. + evt.preventDefault(); + } + }); + + setTimeout(function() { + document.getElementById('blockOptionsModal').focus(); + }, 150); + } + ); + } + ], + focusOnOption: function(index) { + var button = document.getElementById(this.getOptionId(index)); + button.focus(); + }, + // Returns the ID for the corresponding option button. + getOptionId: function(index) { + return 'block-options-modal-option-' + index; + }, + // Returns the ID for the "cancel" option button. + getCancelOptionId: function() { + return this.getOptionId(this.actionButtonsInfo.length); + }, + dismissModal: function() { + this.onDismissCallback(); + this.hideModal(); + }, + // Closes the modal. + hideModal: function() { + this.modalIsVisible = false; + this.keyboardInputService.clearOverride(); + this.blockOptionsModalService.hideModal(); + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/block-options-modal.service.js b/src/opsoro/server/static/js/blockly/accessible/block-options-modal.service.js new file mode 100644 index 0000000..c7b068d --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/block-options-modal.service.js @@ -0,0 +1,59 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 Service for the block options modal. + * + * @author sll@google.com (Sean Lip) + */ + +blocklyApp.BlockOptionsModalService = ng.core.Class({ + constructor: [function() { + this.actionButtonsInfo = []; + // The aim of the pre-show hook is to populate the modal component with the + // information it needs to display the modal (e.g., which action buttons to + // display). + this.preShowHook = function() { + throw Error( + 'A pre-show hook must be defined for the block options modal ' + + 'before it can be shown.'); + }; + this.modalIsShown = false; + this.onDismissCallback = null; + }], + registerPreShowHook: function(preShowHook) { + var that = this; + this.preShowHook = function() { + preShowHook(that.actionButtonsInfo, that.onDismissCallback); + }; + }, + isModalShown: function() { + return this.modalIsShown; + }, + showModal: function(actionButtonsInfo, onDismissCallback) { + this.actionButtonsInfo = actionButtonsInfo; + this.onDismissCallback = onDismissCallback; + + this.preShowHook(); + this.modalIsShown = true; + }, + hideModal: function() { + this.modalIsShown = false; + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/field-segment.component.js b/src/opsoro/server/static/js/blockly/accessible/field-segment.component.js new file mode 100644 index 0000000..71a025d --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/field-segment.component.js @@ -0,0 +1,177 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 Component that renders a "field segment" (a group + * of non-editable Blockly.Field followed by 0 or 1 editable Blockly.Field) + * in a block. Also handles any interactions with the field. + * @author madeeha@google.com (Madeeha Ghori) + */ + +blocklyApp.FieldSegmentComponent = ng.core.Component({ + selector: 'blockly-field-segment', + template: ` + + + + `, + inputs: ['prefixFields', 'mainField', 'mainFieldId', 'level'], + pipes: [blocklyApp.TranslatePipe] +}) +.Class({ + constructor: [ + blocklyApp.NotificationsService, + blocklyApp.VariableModalService, + function(notificationsService, variableModalService) { + this.notificationsService = notificationsService; + this.variableModalService = variableModalService; + this.dropdownOptions = []; + this.rawOptions = []; + }], + // Angular2 hook - called to check if the cached component needs an update. + ngDoCheck: function() { + if (this.isDropdown() && this.shouldBreakCache()) { + this.optionValue = this.mainField.getValue(); + this.rawOptions = this.mainField.getOptions(); + this.dropdownOptions = this.rawOptions.map(function(valueAndText) { + return { + text: valueAndText[0], + value: valueAndText[1] + }; + }); + } + }, + // Returns whether the mutable, cached information needs to be refreshed. + shouldBreakCache: function() { + var newOptions = this.mainField.getOptions(); + if (newOptions.length != this.rawOptions.length) { + return true; + } + + for (var i = 0; i < this.rawOptions.length; i++) { + // Compare the value of the cached options with the values in the field. + if (newOptions[i][1] != this.rawOptions[i][1]) { + return true; + } + } + + return false; + }, + // Gets the prefix text, to be printed before a field. + getPrefixText: function() { + var prefixTexts = this.prefixFields.map(function(prefixField) { + return prefixField.getText(); + }); + return prefixTexts.join(' '); + }, + // Gets the description, for labeling a field. + getFieldDescription: function() { + var description = this.mainField.getText(); + if (this.prefixFields.length > 0) { + description = this.getPrefixText() + ': ' + description; + } + return description; + }, + // Returns true if the field is text input, false otherwise. + isTextInput: function() { + return this.mainField instanceof Blockly.FieldTextInput && + !(this.mainField instanceof Blockly.FieldNumber); + }, + // Returns true if the field is number input, false otherwise. + isNumberInput: function() { + return this.mainField instanceof Blockly.FieldNumber; + }, + // Returns true if the field is a dropdown, false otherwise. + isDropdown: function() { + return this.mainField instanceof Blockly.FieldDropdown; + }, + // Sets the text value on the underlying field. + setTextValue: function(newValue) { + this.mainField.setValue(newValue); + }, + // Sets the number value on the underlying field. + setNumberValue: function(newValue) { + // Do not permit a residual value of NaN after a backspace event. + this.mainField.setValue(newValue || 0); + }, + // Confirm a selection for dropdown fields. + selectOption: function() { + if (this.optionValue == Blockly.Msg.RENAME_VARIABLE) { + this.variableModalService.showModal_(this.mainField.getValue()); + } + }, + // Sets the value on a dropdown input. + setDropdownValue: function(optionValue) { + this.optionValue = optionValue + if (this.optionValue == 'NO_ACTION') { + return; + } + + if (this.optionValue != Blockly.Msg.RENAME_VARIABLE) { + this.mainField.setValue(this.optionValue); + } + + var optionText = undefined; + for (var i = 0; i < this.dropdownOptions.length; i++) { + if (this.dropdownOptions[i].value == optionValue) { + optionText = this.dropdownOptions[i].text; + break; + } + } + + if (!optionText) { + throw Error( + 'There is no option text corresponding to the value: ' + + this.optionValue); + } + + this.notificationsService.speak('Selected option ' + optionText); + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/keyboard-input.service.js b/src/opsoro/server/static/js/blockly/accessible/keyboard-input.service.js new file mode 100644 index 0000000..3af10cc --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/keyboard-input.service.js @@ -0,0 +1,52 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 Service for handling keyboard input. + * + * @author sll@google.com (Sean Lip) + */ + +blocklyApp.KeyboardInputService = ng.core.Class({ + constructor: [function() { + // Default custom actions for global keystrokes. The keys of this object + // are string representations of the key codes. + this.keysToActions = {}; + // Override for the default keysToActions mapping (e.g. in a modal + // context). + this.keysToActionsOverride = null; + + // Attach a keydown handler to the entire window. + var that = this; + document.addEventListener('keydown', function(evt) { + var stringifiedKeycode = String(evt.keyCode); + var actionsObject = that.keysToActionsOverride || that.keysToActions; + + if (actionsObject.hasOwnProperty(stringifiedKeycode)) { + actionsObject[stringifiedKeycode](evt); + } + }); + }], + setOverride: function(newKeysToActions) { + this.keysToActionsOverride = newKeysToActions; + }, + clearOverride: function() { + this.keysToActionsOverride = null; + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/libs/README b/src/opsoro/server/static/js/blockly/accessible/libs/README new file mode 100644 index 0000000..ebf4d96 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/libs/README @@ -0,0 +1,15 @@ +This folder contains the following dependencies for accessible Blockly: + +* Angular2 (angular2-all.umd.min.js, angular2-polyfills.min.js) +* RxJava (Rx.umd.min) + +Used for data binding between the core Blockly workspace and accessible Blockly. +RxJava is required by Angular2. +Fetched from https://code.angularjs.org/ +The current version is 2.0.0-beta.16. + +* ES6 Shim + +Required by Angular2, for Javascript files. +Fetched from https://github.com/paulmillr/es6-shim +The current version is 0.35.1. diff --git a/src/opsoro/server/static/js/blockly/accessible/libs/Rx.umd.min.js b/src/opsoro/server/static/js/blockly/accessible/libs/Rx.umd.min.js new file mode 100644 index 0000000..38c0666 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/libs/Rx.umd.min.js @@ -0,0 +1,748 @@ +/** + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015-2016 Netflix, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ +/** + @license + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015-2016 Netflix, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + **/ +(function(w){"object"===typeof exports&&"undefined"!==typeof module?module.exports=w():"function"===typeof define&&define.amd?define([],w):("undefined"!==typeof window?window:"undefined"!==typeof global?global:"undefined"!==typeof self?self:this).Rx=w()})(function(){return function a(b,f,g){function k(e,d){if(!f[e]){if(!b[e]){var c="function"==typeof require&&require;if(!d&&c)return c(e,!0);if(l)return l(e,!0);c=Error("Cannot find module '"+e+"'");throw c.code="MODULE_NOT_FOUND",c;}c=f[e]={exports:{}}; +b[e][0].call(c.exports,function(a){var c=b[e][1][a];return k(c?c:a)},c,c.exports,a,b,f,g)}return f[e].exports}for(var l="function"==typeof require&&require,h=0;h=n?h.complete():(c=b?b(c[e],e):c[e],h.next(c),a.index=e+1,this.schedule(a)))};e.prototype._subscribe=function(a){var c=this.arrayLike,m=this.mapFn, +n=this.scheduler,b=c.length;if(n)return n.schedule(e.dispatch,0,{arrayLike:c,index:0,length:b,mapFn:m,subscriber:a});for(n=0;n=a.count?b.complete():(b.next(d[e]),b.isUnsubscribed||(a.index=e+1,this.schedule(a)))};d.prototype._subscribe=function(a){var e=this.array,n=e.length,b=this.scheduler;if(b)return b.schedule(d.dispatch,0,{array:e,index:0,count:n,subscriber:a});for(b=0;bd)this.period=0;c&&"function"===typeof c.schedule||(this.scheduler=l.asap)}g(e,a);e.create=function(a,c){void 0===a&&(a=0);void 0===c&&(c=l.asap);return new e(a,c)};e.dispatch=function(a){var c=a.subscriber,e=a.period;c.next(a.index);c.isUnsubscribed||(a.index+=1,this.schedule(a,e))};e.prototype._subscribe=function(a){var c=this.period;a.add(this.scheduler.schedule(e.dispatch,c,{index:0,subscriber:a,period:c}))};return e}(b.Observable);f.IntervalObservable=a},{"../Observable":3,"../scheduler/asap":224, +"../util/isNumeric":243}],128:[function(a,b,f){var g=this&&this.__extends||function(a,c){function d(){this.constructor=a}for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e]);a.prototype=null===c?Object.create(c):(d.prototype=c.prototype,new d)},k=a("../util/root"),l=a("../util/isObject"),h=a("../util/tryCatch");b=a("../Observable");var e=a("../util/isFunction"),d=a("../util/SymbolShim"),c=a("../util/errorObject");a=function(a){function b(c,h,f,q){a.call(this);if(null==c)throw Error("iterator cannot be null."); +if(l.isObject(h))this.thisArg=h,this.scheduler=f;else if(e.isFunction(h))this.project=h,this.thisArg=f,this.scheduler=q;else if(null!=h)throw Error("When provided, `project` must be a function.");if((h=c[d.SymbolShim.iterator])||"string"!==typeof c)if(h||void 0===c.length){if(!h)throw new TypeError("Object is not iterable");c=c[d.SymbolShim.iterator]()}else c=new n(c);else c=new m(c);this.iterator=c}g(b,a);b.create=function(a,c,d,e){return new b(a,c,d,e)};b.dispatch=function(a){var d=a.index,e=a.thisArg, +m=a.project,b=a.iterator,n=a.subscriber;a.hasError?n.error(a.error):(b=b.next(),b.done?n.complete():(m?(b=h.tryCatch(m).call(e,b.value,d),b===c.errorObject?(a.error=c.errorObject.e,a.hasError=!0):(n.next(b),a.index=d+1)):(n.next(b.value),a.index=d+1),n.isUnsubscribed||this.schedule(a)))};b.prototype._subscribe=function(a){var d=0,e=this.iterator,m=this.project,n=this.thisArg,f=this.scheduler;if(f)return f.schedule(b.dispatch,0,{index:d,thisArg:n,project:m,iterator:e,subscriber:a});do{f=e.next();if(f.done){a.complete(); +break}else if(m){f=h.tryCatch(m).call(n,f.value,d++);if(f===c.errorObject){a.error(c.errorObject.e);break}a.next(f)}else a.next(f.value);if(a.isUnsubscribed)break}while(1)};return b}(b.Observable);f.IteratorObservable=a;var m=function(){function a(c,d,e){void 0===d&&(d=0);void 0===e&&(e=c.length);this.str=c;this.idx=d;this.len=e}a.prototype[d.SymbolShim.iterator]=function(){return this};a.prototype.next=function(){return this.idxm?-1:1;e=m*Math.floor(Math.abs(e));e=0>=e?0:e>q?q:e}this.arr=c;this.idx=d;this.len=e}a.prototype[d.SymbolShim.iterator]=function(){return this};a.prototype.next=function(){return this.idx=a.end?c.complete():(c.next(e),c.isUnsubscribed||(a.index=d+1,a.start=e+1,this.schedule(a)))};b.prototype._subscribe=function(a){var e=0,d=this.start,c=this.end,m=this.scheduler;if(m)return m.schedule(b.dispatch, +0,{index:e,end:c,start:d,subscriber:a});do{if(e++>=c){a.complete();break}a.next(d++);if(a.isUnsubscribed)break}while(1)};return b}(a("../Observable").Observable);f.RangeObservable=a},{"../Observable":3}],132:[function(a,b,f){var g=this&&this.__extends||function(a,b){function h(){this.constructor=a}for(var e in b)b.hasOwnProperty(e)&&(a[e]=b[e]);a.prototype=null===b?Object.create(b):(h.prototype=b.prototype,new h)};a=function(a){function b(h,e){a.call(this);this.value=h;this.scheduler=e;this._isScalar= +!0}g(b,a);b.create=function(a,e){return new b(a,e)};b.dispatch=function(a){var e=a.value,d=a.subscriber;a.done?d.complete():(d.next(e),d.isUnsubscribed||(a.done=!0,this.schedule(a)))};b.prototype._subscribe=function(a){var e=this.value,d=this.scheduler;if(d)return d.schedule(b.dispatch,0,{done:!1,value:e,subscriber:a});a.next(e);a.isUnsubscribed||a.complete()};return b}(a("../Observable").Observable);f.ScalarObservable=a},{"../Observable":3}],133:[function(a,b,f){var g=this&&this.__extends||function(a, +e){function d(){this.constructor=a}for(var c in e)e.hasOwnProperty(c)&&(a[c]=e[c]);a.prototype=null===e?Object.create(e):(d.prototype=e.prototype,new d)};b=a("../Observable");var k=a("../scheduler/asap"),l=a("../util/isNumeric");a=function(a){function e(d,c,e){void 0===c&&(c=0);void 0===e&&(e=k.asap);a.call(this);this.source=d;this.delayTime=c;this.scheduler=e;if(!l.isNumeric(c)||0>c)this.delayTime=0;e&&"function"===typeof e.schedule||(this.scheduler=k.asap)}g(e,a);e.create=function(a,c,m){void 0=== +c&&(c=0);void 0===m&&(m=k.asap);return new e(a,c,m)};e.dispatch=function(a){return a.source.subscribe(a.subscriber)};e.prototype._subscribe=function(a){return this.scheduler.schedule(e.dispatch,this.delayTime,{source:this.source,subscriber:a})};return e}(b.Observable);f.SubscribeOnObservable=a},{"../Observable":3,"../scheduler/asap":224,"../util/isNumeric":243}],134:[function(a,b,f){var g=this&&this.__extends||function(a,c){function e(){this.constructor=a}for(var b in c)c.hasOwnProperty(b)&&(a[b]= +c[b]);a.prototype=null===c?Object.create(c):(e.prototype=c.prototype,new e)},k=a("../util/isNumeric");b=a("../Observable");var l=a("../scheduler/asap"),h=a("../util/isScheduler"),e=a("../util/isDate");a=function(a){function c(c,b,f){void 0===c&&(c=0);a.call(this);this.period=-1;this.dueTime=0;k.isNumeric(b)?this.period=1>+b&&1||+b:h.isScheduler(b)&&(f=b);h.isScheduler(f)||(f=l.asap);this.scheduler=f;this.dueTime=e.isDate(c)?+c-this.scheduler.now():c}g(c,a);c.create=function(a,d,e){void 0===a&&(a= +0);return new c(a,d,e)};c.dispatch=function(a){var c=a.index,d=a.period,e=a.subscriber;e.next(c);if(!e.isUnsubscribed){if(-1===d)return e.complete();a.index=c+1;this.schedule(a,d)}};c.prototype._subscribe=function(a){return this.scheduler.schedule(c.dispatch,this.dueTime,{index:0,period:this.period,subscriber:a})};return c}(b.Observable);f.TimerObservable=a},{"../Observable":3,"../scheduler/asap":224,"../util/isDate":241,"../util/isNumeric":243,"../util/isScheduler":246}],135:[function(a,b,f){var g= +this&&this.__extends||function(a,d){function c(){this.constructor=a}for(var b in d)d.hasOwnProperty(b)&&(a[b]=d[b]);a.prototype=null===d?Object.create(d):(c.prototype=d.prototype,new c)};b=a("../OuterSubscriber");var k=a("../util/subscribeToResult");f.buffer=function(a){return this.lift(new l(a))};var l=function(){function a(d){this.closingNotifier=d}a.prototype.call=function(a){return new h(a,this.closingNotifier)};return a}(),h=function(a){function d(c,d){a.call(this,c);this.buffer=[];this.add(k.subscribeToResult(this, +d))}g(d,a);d.prototype._next=function(a){this.buffer.push(a)};d.prototype.notifyNext=function(a,d,e,b,h){a=this.buffer;this.buffer=[];this.destination.next(a)};return d}(b.OuterSubscriber)},{"../OuterSubscriber":6,"../util/subscribeToResult":250}],136:[function(a,b,f){var g=this&&this.__extends||function(a,e){function d(){this.constructor=a}for(var c in e)e.hasOwnProperty(c)&&(a[c]=e[c]);a.prototype=null===e?Object.create(e):(d.prototype=e.prototype,new d)};a=a("../Subscriber");f.bufferCount=function(a, +e){void 0===e&&(e=null);return this.lift(new k(a,e))};var k=function(){function a(e,d){this.bufferSize=e;this.startBufferEvery=d}a.prototype.call=function(a){return new l(a,this.bufferSize,this.startBufferEvery)};return a}(),l=function(a){function e(d,c,e){a.call(this,d);this.bufferSize=c;this.startBufferEvery=e;this.buffers=[[]];this.count=0}g(e,a);e.prototype._next=function(a){var c=this.count+=1,e=this.destination,b=this.bufferSize,h=this.buffers,f=h.length,k=-1;0===c%(null==this.startBufferEvery? +b:this.startBufferEvery)&&h.push([]);for(c=0;c=d[0].time-e.now();)d.shift().notification.observe(b);0(d||0)?Number.POSITIVE_INFINITY:d;return this.lift(new e(a,d,b))};var e=function(){function a(c,d,e){this.project=c;this.concurrent=d;this.scheduler=e}a.prototype.call=function(a){return new d(a,this.project,this.concurrent,this.scheduler)};return a}();f.ExpandOperator=e;var d=function(a){function d(e,b,m,h){a.call(this, +e);this.project=b;this.concurrent=m;this.scheduler=h;this.active=this.index=0;this.hasCompleted=!1;ma?this.lift(new l(-1,this)):this.lift(new l(a-1,this))};var l=function(){function a(d,c){this.count=d;this.source=c}a.prototype.call=function(a){return new h(a, +this.count,this.source)};return a}(),h=function(a){function d(c,d,b){a.call(this,c);this.count=d;this.source=b}g(d,a);d.prototype.complete=function(){if(!this.isStopped){var c=this.source,d=this.count;if(0===d)return a.prototype.complete.call(this);-1this.total&&this.destination.next(a)};return b}(a.Subscriber)},{"../Subscriber":9}],194:[function(a,b,f){var g=this&&this.__extends||function(a,d){function c(){this.constructor=a}for(var b in d)d.hasOwnProperty(b)&&(a[b]=d[b]);a.prototype=null===d?Object.create(d):(c.prototype=d.prototype,new c)};b=a("../OuterSubscriber"); +var k=a("../util/subscribeToResult");f.skipUntil=function(a){return this.lift(new l(a))};var l=function(){function a(d){this.notifier=d}a.prototype.call=function(a){return new h(a,this.notifier)};return a}(),h=function(a){function d(c,d){a.call(this,c);this.isInnerStopped=this.hasValue=!1;this.add(k.subscribeToResult(this,d))}g(d,a);d.prototype._next=function(c){this.hasValue&&a.prototype._next.call(this,c)};d.prototype._complete=function(){this.isInnerStopped?a.prototype._complete.call(this):this.unsubscribe()}; +d.prototype.notifyNext=function(a,d,b,e,f){this.hasValue=!0};d.prototype.notifyComplete=function(){this.isInnerStopped=!0;this.isStopped&&a.prototype._complete.call(this)};return d}(b.OuterSubscriber)},{"../OuterSubscriber":6,"../util/subscribeToResult":250}],195:[function(a,b,f){var g=this&&this.__extends||function(a,b){function d(){this.constructor=a}for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);a.prototype=null===b?Object.create(b):(d.prototype=b.prototype,new d)};a=a("../Subscriber");f.skipWhile= +function(a){return this.lift(new k(a))};var k=function(){function a(b){this.predicate=b}a.prototype.call=function(a){return new l(a,this.predicate)};return a}(),l=function(a){function b(d,c){a.call(this,d);this.predicate=c;this.skipping=!0;this.index=0}g(b,a);b.prototype._next=function(a){var c=this.destination;this.skipping&&this.tryCallPredicate(a);this.skipping||c.next(a)};b.prototype.tryCallPredicate=function(a){try{this.skipping=!!this.predicate(a,this.index++)}catch(c){this.destination.error(c)}}; +return b}(a.Subscriber)},{"../Subscriber":9}],196:[function(a,b,f){var g=a("../observable/ArrayObservable"),k=a("../observable/ScalarObservable"),l=a("../observable/EmptyObservable"),h=a("./concat"),e=a("../util/isScheduler");f.startWith=function(){for(var a=[],c=0;cthis.total)throw new k.ArgumentOutOfRangeError;}a.prototype.call= +function(a){return new e(a,this.total)};return a}(),e=function(a){function c(c,b){a.call(this,c);this.total=b;this.count=0}g(c,a);c.prototype._next=function(a){var c=this.total;++this.count<=c&&(this.destination.next(a),this.count===c&&this.destination.complete())};return c}(b.Subscriber)},{"../Subscriber":9,"../observable/EmptyObservable":121,"../util/ArgumentOutOfRangeError":231}],202:[function(a,b,f){var g=this&&this.__extends||function(a,c){function b(){this.constructor=a}for(var e in c)c.hasOwnProperty(e)&& +(a[e]=c[e]);a.prototype=null===c?Object.create(c):(b.prototype=c.prototype,new b)};b=a("../Subscriber");var k=a("../util/ArgumentOutOfRangeError"),l=a("../observable/EmptyObservable");f.takeLast=function(a){return 0===a?new l.EmptyObservable:this.lift(new h(a))};var h=function(){function a(c){this.total=c;if(0>this.total)throw new k.ArgumentOutOfRangeError;}a.prototype.call=function(a){return new e(a,this.total)};return a}(),e=function(a){function c(c,b){a.call(this,c);this.total=b;this.index=this.count= +0;this.ring=Array(b)}g(c,a);c.prototype._next=function(a){var c=this.index,d=this.ring,b=this.total,e=this.count;1this.index};a.prototype.hasCompleted=function(){return this.array.length===this.index};return a}(),u=function(a){function b(c,d,e,f){a.call(this,c);this.parent=d;this.observable=e;this.index=f;this.stillUnsubscribed=!0;this.buffer=[];this.isComplete=!1}k(b,a);b.prototype[c.SymbolShim.iterator]=function(){return this};b.prototype.next= +function(){var a=this.buffer;return 0===a.length&&this.isComplete?{done:!0}:{value:a.shift(),done:!1}};b.prototype.hasValue=function(){return 0=b?this.scheduleNow(a,d):this.scheduleLater(a,b,d)};a.prototype.scheduleNow=function(a,b){return(new g.QueueAction(this,a)).schedule(b)};a.prototype.scheduleLater=function(a,b,d){return(new k.FutureAction(this,a)).schedule(d,b)};return a}(); +f.QueueScheduler=a},{"./FutureAction":221,"./QueueAction":222}],224:[function(a,b,f){a=a("./AsapScheduler");f.asap=new a.AsapScheduler},{"./AsapScheduler":220}],225:[function(a,b,f){a=a("./QueueScheduler");f.queue=new a.QueueScheduler},{"./QueueScheduler":223}],226:[function(a,b,f){var g=this&&this.__extends||function(a,b){function f(){this.constructor=a}for(var e in b)b.hasOwnProperty(e)&&(a[e]=b[e]);a.prototype=null===b?Object.create(b):(f.prototype=b.prototype,new f)};a=function(a){function b(){a.apply(this, +arguments);this.value=null;this.hasNext=!1}g(b,a);b.prototype._subscribe=function(b){this.hasCompleted&&this.hasNext&&b.next(this.value);return a.prototype._subscribe.call(this,b)};b.prototype._next=function(a){this.value=a;this.hasNext=!0};b.prototype._complete=function(){var a=-1,b=this.observers,d=b.length;this.isUnsubscribed=!0;if(this.hasNext)for(;++ac?1:c; +this._windowTime=1>d?1:d}g(b,a);b.prototype._next=function(b){var d=this._getNow();this.events.push(new h(d,b));this._trimBufferThenGetEvents(d);a.prototype._next.call(this,b)};b.prototype._subscribe=function(b){var d=this._trimBufferThenGetEvents(this._getNow()),f=this.scheduler;f&&b.add(b=new l.ObserveOnSubscriber(b,f));for(var f=-1,g=d.length;++fb&&(g=Math.max(g,f-b));0o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(5),a=n(6),u=n(7),c=function(t){function e(e){t.call(this),this.attributeName=e}return r(e,t),Object.defineProperty(e.prototype,"token",{get:function(){return this},enumerable:!0,configurable:!0}),e.prototype.toString=function(){return"@Attribute("+s.stringify(this.attributeName)+")"},e=i([s.CONST(),o("design:paramtypes",[String])],e)}(u.DependencyMetadata);e.AttributeMetadata=c;var p=function(t){function e(e,n){var r=void 0===n?{}:n,i=r.descendants,o=void 0===i?!1:i,s=r.first,a=void 0===s?!1:s,u=r.read,c=void 0===u?null:u;t.call(this),this._selector=e,this.descendants=o,this.first=a,this.read=c}return r(e,t),Object.defineProperty(e.prototype,"isViewQuery",{get:function(){return!1},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"selector",{get:function(){return a.resolveForwardRef(this._selector)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isVarBindingQuery",{get:function(){return s.isString(this.selector)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"varBindings",{get:function(){return this.selector.split(",")},enumerable:!0,configurable:!0}),e.prototype.toString=function(){return"@Query("+s.stringify(this.selector)+")"},e=i([s.CONST(),o("design:paramtypes",[Object,Object])],e)}(u.DependencyMetadata);e.QueryMetadata=p;var l=function(t){function e(e,n){var r=void 0===n?{}:n,i=r.descendants,o=void 0===i?!1:i,s=r.read,a=void 0===s?null:s;t.call(this,e,{descendants:o,read:a})}return r(e,t),e=i([s.CONST(),o("design:paramtypes",[Object,Object])],e)}(p);e.ContentChildrenMetadata=l;var h=function(t){function e(e,n){var r=(void 0===n?{}:n).read,i=void 0===r?null:r;t.call(this,e,{descendants:!0,first:!0,read:i})}return r(e,t),e=i([s.CONST(),o("design:paramtypes",[Object,Object])],e)}(p);e.ContentChildMetadata=h;var f=function(t){function e(e,n){var r=void 0===n?{}:n,i=r.descendants,o=void 0===i?!1:i,s=r.first,a=void 0===s?!1:s,u=r.read,c=void 0===u?null:u;t.call(this,e,{descendants:o,first:a,read:c})}return r(e,t),Object.defineProperty(e.prototype,"isViewQuery",{get:function(){return!0},enumerable:!0,configurable:!0}),e.prototype.toString=function(){return"@ViewQuery("+s.stringify(this.selector)+")"},e=i([s.CONST(),o("design:paramtypes",[Object,Object])],e)}(p);e.ViewQueryMetadata=f;var d=function(t){function e(e,n){var r=(void 0===n?{}:n).read,i=void 0===r?null:r;t.call(this,e,{descendants:!0,read:i})}return r(e,t),e=i([s.CONST(),o("design:paramtypes",[Object,Object])],e)}(f);e.ViewChildrenMetadata=d;var v=function(t){function e(e,n){var r=(void 0===n?{}:n).read,i=void 0===r?null:r;t.call(this,e,{descendants:!0,first:!0,read:i})}return r(e,t),e=i([s.CONST(),o("design:paramtypes",[Object,Object])],e)}(f);e.ViewChildMetadata=v},function(t,e){(function(t){"use strict";function n(t){Zone.current.scheduleMicroTask("scheduleMicrotask",t)}function r(t){return t.name?t.name:typeof t}function i(){H=!0}function o(){if(H)throw"Cannot enable prod mode after platform setup.";W=!1}function s(){return W}function a(t){return t}function u(){return function(t){return t}}function c(t){return void 0!==t&&null!==t}function p(t){return void 0===t||null===t}function l(t){return"boolean"==typeof t}function h(t){return"number"==typeof t}function f(t){return"string"==typeof t}function d(t){return"function"==typeof t}function v(t){return d(t)}function y(t){return"object"==typeof t&&null!==t}function m(t){return t instanceof U.Promise}function g(t){return Array.isArray(t)}function _(t){return t instanceof e.Date&&!isNaN(t.valueOf())}function b(){}function P(t){if("string"==typeof t)return t;if(void 0===t||null===t)return""+t;if(t.name)return t.name;if(t.overriddenName)return t.overriddenName;var e=t.toString(),n=e.indexOf("\n");return-1===n?e:e.substring(0,n)}function E(t){return t}function w(t,e){return t}function C(t,e){return t[e]}function R(t,e){return t===e||"number"==typeof t&&"number"==typeof e&&isNaN(t)&&isNaN(e)}function S(t){return t}function O(t){return p(t)?null:t}function T(t){return p(t)?!1:t}function x(t){return null!==t&&("function"==typeof t||"object"==typeof t)}function A(t){console.log(t)}function I(t,e,n){for(var r=e.split("."),i=t;r.length>1;){var o=r.shift();i=i.hasOwnProperty(o)&&c(i[o])?i[o]:i[o]={}}(void 0===i||null===i)&&(i={}),i[r.shift()]=n}function M(){if(p(Y))if(c(Symbol)&&c(Symbol.iterator))Y=Symbol.iterator;else for(var t=Object.getOwnPropertyNames(Map.prototype),e=0;e=0&&t[r]==e;r--)n--;t=t.substring(0,n)}return t},t.replace=function(t,e,n){return t.replace(e,n)},t.replaceAll=function(t,e,n){return t.replace(e,n)},t.slice=function(t,e,n){return void 0===e&&(e=0),void 0===n&&(n=null),t.slice(e,null===n?void 0:n)},t.replaceAllMapped=function(t,e,n){return t.replace(e,function(){for(var t=[],e=0;et?-1:t>e?1:0},t}();e.StringWrapper=X;var q=function(){function t(t){void 0===t&&(t=[]),this.parts=t}return t.prototype.add=function(t){this.parts.push(t)},t.prototype.toString=function(){return this.parts.join("")},t}();e.StringJoiner=q;var G=function(t){function e(e){t.call(this),this.message=e}return F(e,t),e.prototype.toString=function(){return this.message},e}(Error);e.NumberParseError=G;var z=function(){function t(){}return t.toFixed=function(t,e){return t.toFixed(e)},t.equal=function(t,e){return t===e},t.parseIntAutoRadix=function(t){var e=parseInt(t);if(isNaN(e))throw new G("Invalid integer literal when parsing "+t);return e},t.parseInt=function(t,e){if(10==e){if(/^(\-|\+)?[0-9]+$/.test(t))return parseInt(t,e)}else if(16==e){if(/^(\-|\+)?[0-9ABCDEFabcdef]+$/.test(t))return parseInt(t,e)}else{var n=parseInt(t,e);if(!isNaN(n))return n}throw new G("Invalid integer literal when parsing "+t+" in base "+e)},t.parseFloat=function(t){return parseFloat(t)},Object.defineProperty(t,"NaN",{get:function(){return NaN},enumerable:!0,configurable:!0}),t.isNaN=function(t){return isNaN(t)},t.isInteger=function(t){return Number.isInteger(t)},t}();e.NumberWrapper=z,e.RegExp=U.RegExp;var K=function(){function t(){}return t.create=function(t,e){return void 0===e&&(e=""),e=e.replace(/g/g,""),new U.RegExp(t,e+"g")},t.firstMatch=function(t,e){return t.lastIndex=0,t.exec(e)},t.test=function(t,e){return t.lastIndex=0,t.test(e)},t.matcher=function(t,e){return t.lastIndex=0,{re:t,input:e}},t.replaceAll=function(t,e,n){var r=t.exec(e),i="";t.lastIndex=0;for(var o=0;r;)i+=e.substring(o,r.index),i+=n(r),o=r.index+r[0].length,t.lastIndex=o,r=t.exec(e);return i+=e.substring(o)},t}();e.RegExpWrapper=K;var $=function(){function t(){}return t.next=function(t){return t.re.exec(t.input)},t}();e.RegExpMatcherWrapper=$;var Q=function(){function t(){}return t.apply=function(t,e){return t.apply(null,e)},t}();e.FunctionWrapper=Q,e.looseIdentical=R,e.getMapKey=S,e.normalizeBlank=O,e.normalizeBool=T,e.isJsObject=x,e.print=A;var J=function(){function t(){}return t.parse=function(t){return U.JSON.parse(t)},t.stringify=function(t){return U.JSON.stringify(t,null,2)},t}();e.Json=J;var Z=function(){function t(){}return t.create=function(t,n,r,i,o,s,a){return void 0===n&&(n=1),void 0===r&&(r=1),void 0===i&&(i=0),void 0===o&&(o=0),void 0===s&&(s=0),void 0===a&&(a=0),new e.Date(t,n-1,r,i,o,s,a)},t.fromISOString=function(t){return new e.Date(t)},t.fromMillis=function(t){return new e.Date(t)},t.toMillis=function(t){return t.getTime()},t.now=function(){return new e.Date},t.toJson=function(t){return t.toJSON()},t}();e.DateWrapper=Z,e.setValueOnPath=I;var Y=null;e.getSymbolIterator=M,e.evalExpression=k,e.isPrimitive=N,e.hasConstructor=D,e.bitWiseOr=V,e.bitWiseAnd=j,e.escape=L}).call(e,function(){return this}())},function(t,e,n){"use strict";function r(t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n])}var i=n(7);e.InjectMetadata=i.InjectMetadata,e.OptionalMetadata=i.OptionalMetadata,e.InjectableMetadata=i.InjectableMetadata,e.SelfMetadata=i.SelfMetadata,e.HostMetadata=i.HostMetadata,e.SkipSelfMetadata=i.SkipSelfMetadata,e.DependencyMetadata=i.DependencyMetadata,r(n(8));var o=n(10);e.forwardRef=o.forwardRef,e.resolveForwardRef=o.resolveForwardRef;var s=n(11);e.Injector=s.Injector;var a=n(16);e.ReflectiveInjector=a.ReflectiveInjector;var u=n(24);e.Binding=u.Binding,e.ProviderBuilder=u.ProviderBuilder,e.bind=u.bind,e.Provider=u.Provider,e.provide=u.provide;var c=n(17);e.ResolvedReflectiveFactory=c.ResolvedReflectiveFactory,e.ReflectiveDependency=c.ReflectiveDependency;var p=n(22);e.ReflectiveKey=p.ReflectiveKey;var l=n(23);e.NoProviderError=l.NoProviderError,e.AbstractProviderError=l.AbstractProviderError,e.CyclicDependencyError=l.CyclicDependencyError,e.InstantiationError=l.InstantiationError,e.InvalidProviderError=l.InvalidProviderError,e.NoAnnotationError=l.NoAnnotationError,e.OutOfBoundsError=l.OutOfBoundsError;var h=n(25);e.OpaqueToken=h.OpaqueToken},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=function(){function t(t){this.token=t}return t.prototype.toString=function(){return"@Inject("+o.stringify(this.token)+")"},t=r([o.CONST(),i("design:paramtypes",[Object])],t)}();e.InjectMetadata=s;var a=function(){function t(){}return t.prototype.toString=function(){return"@Optional()"},t=r([o.CONST(),i("design:paramtypes",[])],t)}();e.OptionalMetadata=a;var u=function(){function t(){}return Object.defineProperty(t.prototype,"token",{get:function(){return null},enumerable:!0,configurable:!0}),t=r([o.CONST(),i("design:paramtypes",[])],t)}();e.DependencyMetadata=u;var c=function(){function t(){}return t=r([o.CONST(),i("design:paramtypes",[])],t)}();e.InjectableMetadata=c;var p=function(){function t(){}return t.prototype.toString=function(){return"@Self()"},t=r([o.CONST(),i("design:paramtypes",[])],t)}();e.SelfMetadata=p;var l=function(){function t(){}return t.prototype.toString=function(){return"@SkipSelf()"},t=r([o.CONST(),i("design:paramtypes",[])],t)}();e.SkipSelfMetadata=l;var h=function(){function t(){}return t.prototype.toString=function(){return"@Host()"},t=r([o.CONST(),i("design:paramtypes",[])],t)}();e.HostMetadata=h},function(t,e,n){"use strict";var r=n(7),i=n(9);e.Inject=i.makeParamDecorator(r.InjectMetadata),e.Optional=i.makeParamDecorator(r.OptionalMetadata),e.Injectable=i.makeDecorator(r.InjectableMetadata),e.Self=i.makeParamDecorator(r.SelfMetadata),e.Host=i.makeParamDecorator(r.HostMetadata),e.SkipSelf=i.makeParamDecorator(r.SkipSelfMetadata)},function(t,e,n){"use strict";function r(t){return c.isFunction(t)&&t.hasOwnProperty("annotation")&&(t=t.annotation),t}function i(t,e){if(t===Object||t===String||t===Function||t===Number||t===Array)throw new Error("Can not use native "+c.stringify(t)+" as constructor");if(c.isFunction(t))return t;if(t instanceof Array){var n=t,i=t[t.length-1];if(!c.isFunction(i))throw new Error("Last position of Class method array must be Function in key "+e+" was '"+c.stringify(i)+"'");var o=n.length-1;if(o!=i.length)throw new Error("Number of annotations ("+o+") does not match number of arguments ("+i.length+") in the function: "+c.stringify(i));for(var s=[],a=0,u=n.length-1;u>a;a++){var p=[];s.push(p);var h=n[a];if(h instanceof Array)for(var f=0;f-1?(t.splice(n,1),!0):!1},t.clear=function(t){t.length=0},t.isEmpty=function(t){return 0==t.length},t.fill=function(t,e,n,r){void 0===n&&(n=0),void 0===r&&(r=null),t.fill(e,n,null===r?t.length:r)},t.equals=function(t,e){if(t.length!=e.length)return!1;for(var n=0;nr&&(n=o,r=s)}}return n},t.flatten=function(t){var e=[];return r(t,e),e},t.addAll=function(t,e){for(var n=0;n0&&(this.provider0=e[0],this.keyId0=e[0].key.id),n>1&&(this.provider1=e[1],this.keyId1=e[1].key.id),n>2&&(this.provider2=e[2],this.keyId2=e[2].key.id),n>3&&(this.provider3=e[3],this.keyId3=e[3].key.id),n>4&&(this.provider4=e[4],this.keyId4=e[4].key.id),n>5&&(this.provider5=e[5],this.keyId5=e[5].key.id),n>6&&(this.provider6=e[6],this.keyId6=e[6].key.id),n>7&&(this.provider7=e[7],this.keyId7=e[7].key.id),n>8&&(this.provider8=e[8],this.keyId8=e[8].key.id),n>9&&(this.provider9=e[9],this.keyId9=e[9].key.id)}return t.prototype.getProviderAtIndex=function(t){if(0==t)return this.provider0;if(1==t)return this.provider1;if(2==t)return this.provider2;if(3==t)return this.provider3;if(4==t)return this.provider4;if(5==t)return this.provider5;if(6==t)return this.provider6;if(7==t)return this.provider7;if(8==t)return this.provider8;if(9==t)return this.provider9;throw new s.OutOfBoundsError(t)},t.prototype.createInjectorStrategy=function(t){return new m(t,this)},t}();e.ReflectiveProtoInjectorInlineStrategy=d;var v=function(){function t(t,e){this.providers=e;var n=e.length;this.keyIds=i.ListWrapper.createFixedSize(n);for(var r=0;n>r;r++)this.keyIds[r]=e[r].key.id}return t.prototype.getProviderAtIndex=function(t){if(0>t||t>=this.providers.length)throw new s.OutOfBoundsError(t);return this.providers[t]},t.prototype.createInjectorStrategy=function(t){return new g(this,t)},t}();e.ReflectiveProtoInjectorDynamicStrategy=v;var y=function(){function t(t){this.numberOfProviders=t.length,this._strategy=t.length>h?new v(this,t):new d(this,t)}return t.fromResolvedProviders=function(e){return new t(e)},t.prototype.getProviderAtIndex=function(t){return this._strategy.getProviderAtIndex(t); +},t}();e.ReflectiveProtoInjector=y;var m=function(){function t(t,e){this.injector=t,this.protoStrategy=e,this.obj0=f,this.obj1=f,this.obj2=f,this.obj3=f,this.obj4=f,this.obj5=f,this.obj6=f,this.obj7=f,this.obj8=f,this.obj9=f}return t.prototype.resetConstructionCounter=function(){this.injector._constructionCounter=0},t.prototype.instantiateProvider=function(t){return this.injector._new(t)},t.prototype.getObjByKeyId=function(t){var e=this.protoStrategy,n=this.injector;return e.keyId0===t?(this.obj0===f&&(this.obj0=n._new(e.provider0)),this.obj0):e.keyId1===t?(this.obj1===f&&(this.obj1=n._new(e.provider1)),this.obj1):e.keyId2===t?(this.obj2===f&&(this.obj2=n._new(e.provider2)),this.obj2):e.keyId3===t?(this.obj3===f&&(this.obj3=n._new(e.provider3)),this.obj3):e.keyId4===t?(this.obj4===f&&(this.obj4=n._new(e.provider4)),this.obj4):e.keyId5===t?(this.obj5===f&&(this.obj5=n._new(e.provider5)),this.obj5):e.keyId6===t?(this.obj6===f&&(this.obj6=n._new(e.provider6)),this.obj6):e.keyId7===t?(this.obj7===f&&(this.obj7=n._new(e.provider7)),this.obj7):e.keyId8===t?(this.obj8===f&&(this.obj8=n._new(e.provider8)),this.obj8):e.keyId9===t?(this.obj9===f&&(this.obj9=n._new(e.provider9)),this.obj9):f},t.prototype.getObjAtIndex=function(t){if(0==t)return this.obj0;if(1==t)return this.obj1;if(2==t)return this.obj2;if(3==t)return this.obj3;if(4==t)return this.obj4;if(5==t)return this.obj5;if(6==t)return this.obj6;if(7==t)return this.obj7;if(8==t)return this.obj8;if(9==t)return this.obj9;throw new s.OutOfBoundsError(t)},t.prototype.getMaxNumberOfObjects=function(){return h},t}();e.ReflectiveInjectorInlineStrategy=m;var g=function(){function t(t,e){this.protoStrategy=t,this.injector=e,this.objs=i.ListWrapper.createFixedSize(t.providers.length),i.ListWrapper.fill(this.objs,f)}return t.prototype.resetConstructionCounter=function(){this.injector._constructionCounter=0},t.prototype.instantiateProvider=function(t){return this.injector._new(t)},t.prototype.getObjByKeyId=function(t){for(var e=this.protoStrategy,n=0;nt||t>=this.objs.length)throw new s.OutOfBoundsError(t);return this.objs[t]},t.prototype.getMaxNumberOfObjects=function(){return this.objs.length},t}();e.ReflectiveInjectorDynamicStrategy=g;var _=function(){function t(){}return t.resolve=function(t){return o.resolveReflectiveProviders(t)},t.resolveAndCreate=function(e,n){void 0===n&&(n=null);var r=t.resolve(e);return t.fromResolvedProviders(r,n)},t.fromResolvedProviders=function(t,e){return void 0===e&&(e=null),new b(y.fromResolvedProviders(t),e)},t.fromResolvedBindings=function(e){return t.fromResolvedProviders(e)},Object.defineProperty(t.prototype,"parent",{get:function(){return u.unimplemented()},enumerable:!0,configurable:!0}),t.prototype.debugContext=function(){return null},t.prototype.resolveAndCreateChild=function(t){return u.unimplemented()},t.prototype.createChildFromResolved=function(t){return u.unimplemented()},t.prototype.resolveAndInstantiate=function(t){return u.unimplemented()},t.prototype.instantiateResolved=function(t){return u.unimplemented()},t}();e.ReflectiveInjector=_;var b=function(){function t(t,e,n){void 0===e&&(e=null),void 0===n&&(n=null),this._debugContext=n,this._constructionCounter=0,this._proto=t,this._parent=e,this._strategy=t._strategy.createInjectorStrategy(this)}return t.prototype.debugContext=function(){return this._debugContext()},t.prototype.get=function(t,e){return void 0===e&&(e=l.THROW_IF_NOT_FOUND),this._getByKey(c.ReflectiveKey.get(t),null,null,e)},t.prototype.getAt=function(t){return this._strategy.getObjAtIndex(t)},Object.defineProperty(t.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"internalStrategy",{get:function(){return this._strategy},enumerable:!0,configurable:!0}),t.prototype.resolveAndCreateChild=function(t){var e=_.resolve(t);return this.createChildFromResolved(e)},t.prototype.createChildFromResolved=function(e){var n=new y(e),r=new t(n);return r._parent=this,r},t.prototype.resolveAndInstantiate=function(t){return this.instantiateResolved(_.resolve([t])[0])},t.prototype.instantiateResolved=function(t){return this._instantiateProvider(t)},t.prototype._new=function(t){if(this._constructionCounter++>this._strategy.getMaxNumberOfObjects())throw new s.CyclicDependencyError(this,t.key);return this._instantiateProvider(t)},t.prototype._instantiateProvider=function(t){if(t.multiProvider){for(var e=i.ListWrapper.createFixedSize(t.resolvedFactories.length),n=0;n0?this._getByReflectiveDependency(t,R[0]):null,r=S>1?this._getByReflectiveDependency(t,R[1]):null,i=S>2?this._getByReflectiveDependency(t,R[2]):null,o=S>3?this._getByReflectiveDependency(t,R[3]):null,a=S>4?this._getByReflectiveDependency(t,R[4]):null,c=S>5?this._getByReflectiveDependency(t,R[5]):null,p=S>6?this._getByReflectiveDependency(t,R[6]):null,l=S>7?this._getByReflectiveDependency(t,R[7]):null,h=S>8?this._getByReflectiveDependency(t,R[8]):null,f=S>9?this._getByReflectiveDependency(t,R[9]):null,d=S>10?this._getByReflectiveDependency(t,R[10]):null,v=S>11?this._getByReflectiveDependency(t,R[11]):null,y=S>12?this._getByReflectiveDependency(t,R[12]):null,m=S>13?this._getByReflectiveDependency(t,R[13]):null,g=S>14?this._getByReflectiveDependency(t,R[14]):null,_=S>15?this._getByReflectiveDependency(t,R[15]):null,b=S>16?this._getByReflectiveDependency(t,R[16]):null,P=S>17?this._getByReflectiveDependency(t,R[17]):null,E=S>18?this._getByReflectiveDependency(t,R[18]):null,w=S>19?this._getByReflectiveDependency(t,R[19]):null}catch(O){throw(O instanceof s.AbstractProviderError||O instanceof s.InstantiationError)&&O.addKey(this,t.key),O}var T;try{switch(S){case 0:T=C();break;case 1:T=C(n);break;case 2:T=C(n,r);break;case 3:T=C(n,r,i);break;case 4:T=C(n,r,i,o);break;case 5:T=C(n,r,i,o,a);break;case 6:T=C(n,r,i,o,a,c);break;case 7:T=C(n,r,i,o,a,c,p);break;case 8:T=C(n,r,i,o,a,c,p,l);break;case 9:T=C(n,r,i,o,a,c,p,l,h);break;case 10:T=C(n,r,i,o,a,c,p,l,h,f);break;case 11:T=C(n,r,i,o,a,c,p,l,h,f,d);break;case 12:T=C(n,r,i,o,a,c,p,l,h,f,d,v);break;case 13:T=C(n,r,i,o,a,c,p,l,h,f,d,v,y);break;case 14:T=C(n,r,i,o,a,c,p,l,h,f,d,v,y,m);break;case 15:T=C(n,r,i,o,a,c,p,l,h,f,d,v,y,m,g);break;case 16:T=C(n,r,i,o,a,c,p,l,h,f,d,v,y,m,g,_);break;case 17:T=C(n,r,i,o,a,c,p,l,h,f,d,v,y,m,g,_,b);break;case 18:T=C(n,r,i,o,a,c,p,l,h,f,d,v,y,m,g,_,b,P);break;case 19:T=C(n,r,i,o,a,c,p,l,h,f,d,v,y,m,g,_,b,P,E);break;case 20:T=C(n,r,i,o,a,c,p,l,h,f,d,v,y,m,g,_,b,P,E,w);break;default:throw new u.BaseException("Cannot instantiate '"+t.key.displayName+"' because it has more than 20 dependencies")}}catch(O){throw new s.InstantiationError(this,O,O.stack,t.key)}return T},t.prototype._getByReflectiveDependency=function(t,e){return this._getByKey(e.key,e.lowerBoundVisibility,e.upperBoundVisibility,e.optional?null:l.THROW_IF_NOT_FOUND)},t.prototype._getByKey=function(t,e,n,r){return t===P?this:n instanceof p.SelfMetadata?this._getByKeySelf(t,r):this._getByKeyDefault(t,r,e)},t.prototype._throwOrNull=function(t,e){if(e!==l.THROW_IF_NOT_FOUND)return e;throw new s.NoProviderError(this,t)},t.prototype._getByKeySelf=function(t,e){var n=this._strategy.getObjByKeyId(t.id);return n!==f?n:this._throwOrNull(t,e)},t.prototype._getByKeyDefault=function(e,n,r){var i;for(i=r instanceof p.SkipSelfMetadata?this._parent:this;i instanceof t;){var o=i,s=o._strategy.getObjByKeyId(e.id);if(s!==f)return s;i=o._parent}return null!==i?i.get(e.token,n):this._throwOrNull(e,n)},Object.defineProperty(t.prototype,"displayName",{get:function(){return"ReflectiveInjector(providers: ["+r(this,function(t){return' "'+t.key.displayName+'" '}).join(", ")+"])"},enumerable:!0,configurable:!0}),t.prototype.toString=function(){return this.displayName},t}();e.ReflectiveInjector_=b;var P=c.ReflectiveKey.get(l.Injector)},function(t,e,n){"use strict";function r(t){var e,n;if(h.isPresent(t.useClass)){var r=g.resolveForwardRef(t.useClass);e=d.reflector.factory(r),n=c(r)}else h.isPresent(t.useExisting)?(e=function(t){return t},n=[b.fromKey(v.ReflectiveKey.get(t.useExisting))]):h.isPresent(t.useFactory)?(e=t.useFactory,n=u(t.useFactory,t.dependencies)):(e=function(){return t.useValue},n=P);return new w(e,n)}function i(t){return new E(v.ReflectiveKey.get(t.token),[r(t)],t.multi)}function o(t){var e=a(t,[]),n=e.map(i);return f.MapWrapper.values(s(n,new Map))}function s(t,e){for(var n=0;n1){var e=r(s.ListWrapper.reversed(t)),n=e.map(function(t){return a.stringify(t.token)});return" ("+n.join(" -> ")+")"}return""}var o=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},s=n(15),a=n(5),u=n(12),c=function(t){function e(e,n,r){t.call(this,"DI Exception"),this.keys=[n],this.injectors=[e],this.constructResolvingMessage=r,this.message=this.constructResolvingMessage(this.keys)}return o(e,t),e.prototype.addKey=function(t,e){this.injectors.push(t),this.keys.push(e),this.message=this.constructResolvingMessage(this.keys)},Object.defineProperty(e.prototype,"context",{get:function(){return this.injectors[this.injectors.length-1].debugContext()},enumerable:!0,configurable:!0}),e}(u.BaseException);e.AbstractProviderError=c;var p=function(t){function e(e,n){t.call(this,e,n,function(t){var e=a.stringify(s.ListWrapper.first(t).token);return"No provider for "+e+"!"+i(t)})}return o(e,t),e}(c);e.NoProviderError=p;var l=function(t){function e(e,n){t.call(this,e,n,function(t){return"Cannot instantiate cyclic dependency!"+i(t)})}return o(e,t),e}(c);e.CyclicDependencyError=l;var h=function(t){function e(e,n,r,i){t.call(this,"DI Exception",n,r,null),this.keys=[i],this.injectors=[e]}return o(e,t),e.prototype.addKey=function(t,e){this.injectors.push(t),this.keys.push(e)},Object.defineProperty(e.prototype,"wrapperMessage",{get:function(){var t=a.stringify(s.ListWrapper.first(this.keys).token);return"Error during instantiation of "+t+"!"+i(this.keys)+"."},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"causeKey",{get:function(){return this.keys[0]},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"context",{get:function(){return this.injectors[this.injectors.length-1].debugContext()},enumerable:!0,configurable:!0}),e}(u.WrappedException);e.InstantiationError=h;var f=function(t){function e(e){t.call(this,"Invalid provider - only instances of Provider and Type are allowed, got: "+e.toString())}return o(e,t),e}(u.BaseException);e.InvalidProviderError=f;var d=function(t){function e(n,r){t.call(this,e._genMessage(n,r))}return o(e,t),e._genMessage=function(t,e){for(var n=[],r=0,i=e.length;i>r;r++){var o=e[r];a.isBlank(o)||0==o.length?n.push("?"):n.push(o.map(a.stringify).join(" "))}return"Cannot resolve all parameters for '"+a.stringify(t)+"'("+n.join(", ")+"). Make sure that all the parameters are decorated with Inject or have valid type annotations and that '"+a.stringify(t)+"' is decorated with Injectable."},e}(u.BaseException);e.NoAnnotationError=d;var v=function(t){function e(e){t.call(this,"Index "+e+" is out-of-bounds.")}return o(e,t),e}(u.BaseException);e.OutOfBoundsError=v;var y=function(t){function e(e,n){t.call(this,"Cannot mix multi providers and regular providers, got: "+e.toString()+" "+n.toString())}return o(e,t),e}(u.BaseException);e.MixingMultiProvidersWithRegularProvidersError=y},function(t,e,n){"use strict";function r(t){return new h(t)}function i(t,e){var n=e.useClass,r=e.useValue,i=e.useExisting,o=e.useFactory,s=e.deps,a=e.multi;return new p(t,{useClass:n,useValue:r,useExisting:i,useFactory:o,deps:s,multi:a})}var o=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},s=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},a=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},u=n(5),c=n(12),p=function(){function t(t,e){var n=e.useClass,r=e.useValue,i=e.useExisting,o=e.useFactory,s=e.deps,a=e.multi;this.token=t,this.useClass=n,this.useValue=r,this.useExisting=i,this.useFactory=o,this.dependencies=s,this._multi=a}return Object.defineProperty(t.prototype,"multi",{get:function(){return u.normalizeBool(this._multi)},enumerable:!0,configurable:!0}),t=s([u.CONST(),a("design:paramtypes",[Object,Object])],t)}();e.Provider=p;var l=function(t){function e(e,n){var r=n.toClass,i=n.toValue,o=n.toAlias,s=n.toFactory,a=n.deps,u=n.multi;t.call(this,e,{useClass:r,useValue:i,useExisting:o,useFactory:s,deps:a,multi:u})}return o(e,t),Object.defineProperty(e.prototype,"toClass",{get:function(){return this.useClass},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"toAlias",{get:function(){return this.useExisting},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"toFactory",{get:function(){return this.useFactory},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"toValue",{get:function(){return this.useValue},enumerable:!0,configurable:!0}),e=s([u.CONST(),a("design:paramtypes",[Object,Object])],e)}(p);e.Binding=l,e.bind=r;var h=function(){function t(t){this.token=t}return t.prototype.toClass=function(t){if(!u.isType(t))throw new c.BaseException('Trying to create a class provider but "'+u.stringify(t)+'" is not a class!');return new p(this.token,{useClass:t})},t.prototype.toValue=function(t){return new p(this.token,{useValue:t})},t.prototype.toAlias=function(t){if(u.isBlank(t))throw new c.BaseException("Can not alias "+u.stringify(this.token)+" to a blank value!");return new p(this.token,{useExisting:t})},t.prototype.toFactory=function(t,e){if(!u.isFunction(t))throw new c.BaseException('Trying to create a factory provider but "'+u.stringify(t)+'" is not a function!');return new p(this.token,{useFactory:t,deps:e})},t}();e.ProviderBuilder=h,e.provide=i},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=function(){function t(t){this._desc=t}return t.prototype.toString=function(){return"Token "+this._desc},t=r([o.CONST(),i("design:paramtypes",[String])],t)}();e.OpaqueToken=s},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(5),a=n(7),u=n(27),c=function(t){function e(e){var n=void 0===e?{}:e,r=n.selector,i=n.inputs,o=n.outputs,s=n.properties,a=n.events,u=n.host,c=n.bindings,p=n.providers,l=n.exportAs,h=n.queries;t.call(this),this.selector=r,this._inputs=i,this._properties=s,this._outputs=o,this._events=a,this.host=u,this.exportAs=l,this.queries=h,this._providers=p,this._bindings=c}return r(e,t),Object.defineProperty(e.prototype,"inputs",{get:function(){return s.isPresent(this._properties)&&this._properties.length>0?this._properties:this._inputs},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"properties",{get:function(){return this.inputs},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"outputs",{get:function(){return s.isPresent(this._events)&&this._events.length>0?this._events:this._outputs},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"events",{get:function(){return this.outputs},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"providers",{get:function(){return s.isPresent(this._bindings)&&this._bindings.length>0?this._bindings:this._providers},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"bindings",{get:function(){return this.providers},enumerable:!0,configurable:!0}),e=i([s.CONST(),o("design:paramtypes",[Object])],e)}(a.InjectableMetadata);e.DirectiveMetadata=c;var p=function(t){function e(e){var n=void 0===e?{}:e,r=n.selector,i=n.inputs,o=n.outputs,s=n.properties,a=n.events,c=n.host,p=n.exportAs,l=n.moduleId,h=n.bindings,f=n.providers,d=n.viewBindings,v=n.viewProviders,y=n.changeDetection,m=void 0===y?u.ChangeDetectionStrategy.Default:y,g=n.queries,_=n.templateUrl,b=n.template,P=n.styleUrls,E=n.styles,w=n.directives,C=n.pipes,R=n.encapsulation;t.call(this,{selector:r,inputs:i,outputs:o,properties:s,events:a,host:c,exportAs:p,bindings:h,providers:f,queries:g}),this.changeDetection=m,this._viewProviders=v,this._viewBindings=d,this.templateUrl=_,this.template=b,this.styleUrls=P,this.styles=E,this.directives=w,this.pipes=C,this.encapsulation=R,this.moduleId=l}return r(e,t),Object.defineProperty(e.prototype,"viewProviders",{get:function(){return s.isPresent(this._viewBindings)&&this._viewBindings.length>0?this._viewBindings:this._viewProviders},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"viewBindings",{get:function(){return this.viewProviders},enumerable:!0,configurable:!0}),e=i([s.CONST(),o("design:paramtypes",[Object])],e)}(c);e.ComponentMetadata=p;var l=function(t){function e(e){var n=e.name,r=e.pure;t.call(this),this.name=n,this._pure=r}return r(e,t),Object.defineProperty(e.prototype,"pure",{get:function(){return s.isPresent(this._pure)?this._pure:!0},enumerable:!0,configurable:!0}),e=i([s.CONST(),o("design:paramtypes",[Object])],e)}(a.InjectableMetadata);e.PipeMetadata=l;var h=function(){function t(t){this.bindingPropertyName=t}return t=i([s.CONST(),o("design:paramtypes",[String])],t)}();e.InputMetadata=h;var f=function(){function t(t){this.bindingPropertyName=t}return t=i([s.CONST(),o("design:paramtypes",[String])],t)}();e.OutputMetadata=f;var d=function(){function t(t){this.hostPropertyName=t}return t=i([s.CONST(),o("design:paramtypes",[String])],t)}();e.HostBindingMetadata=d;var v=function(){function t(t,e){this.eventName=t,this.args=e}return t=i([s.CONST(),o("design:paramtypes",[String,Array])],t)}();e.HostListenerMetadata=v},function(t,e,n){"use strict";var r=n(28);e.ChangeDetectionStrategy=r.ChangeDetectionStrategy,e.ChangeDetectorRef=r.ChangeDetectorRef,e.WrappedValue=r.WrappedValue,e.SimpleChange=r.SimpleChange,e.IterableDiffers=r.IterableDiffers,e.KeyValueDiffers=r.KeyValueDiffers,e.CollectionChangeRecord=r.CollectionChangeRecord,e.KeyValueChangeRecord=r.KeyValueChangeRecord},function(t,e,n){"use strict";var r=n(29),i=n(30),o=n(31),s=n(32),a=n(5),u=n(32);e.DefaultKeyValueDifferFactory=u.DefaultKeyValueDifferFactory,e.KeyValueChangeRecord=u.KeyValueChangeRecord;var c=n(30);e.DefaultIterableDifferFactory=c.DefaultIterableDifferFactory,e.CollectionChangeRecord=c.CollectionChangeRecord;var p=n(33);e.ChangeDetectionStrategy=p.ChangeDetectionStrategy,e.CHANGE_DETECTION_STRATEGY_VALUES=p.CHANGE_DETECTION_STRATEGY_VALUES,e.ChangeDetectorState=p.ChangeDetectorState,e.CHANGE_DETECTOR_STATE_VALUES=p.CHANGE_DETECTOR_STATE_VALUES,e.isDefaultChangeDetectionStrategy=p.isDefaultChangeDetectionStrategy;var l=n(34);e.ChangeDetectorRef=l.ChangeDetectorRef;var h=n(29);e.IterableDiffers=h.IterableDiffers;var f=n(31);e.KeyValueDiffers=f.KeyValueDiffers;var d=n(35);e.WrappedValue=d.WrappedValue,e.ValueUnwrapper=d.ValueUnwrapper,e.SimpleChange=d.SimpleChange,e.devModeEqual=d.devModeEqual,e.looseIdentical=d.looseIdentical,e.uninitialized=d.uninitialized,e.keyValDiff=a.CONST_EXPR([a.CONST_EXPR(new s.DefaultKeyValueDifferFactory)]),e.iterableDiff=a.CONST_EXPR([a.CONST_EXPR(new i.DefaultIterableDifferFactory)]),e.defaultIterableDiffers=a.CONST_EXPR(new r.IterableDiffers(e.iterableDiff)),e.defaultKeyValueDiffers=a.CONST_EXPR(new o.KeyValueDiffers(e.keyValDiff))},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s); +return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=n(12),a=n(15),u=n(6),c=function(){function t(t){this.factories=t}return t.create=function(e,n){if(o.isPresent(n)){var r=a.ListWrapper.clone(n.factories);return e=e.concat(r),new t(e)}return new t(e)},t.extend=function(e){return new u.Provider(t,{useFactory:function(n){if(o.isBlank(n))throw new s.BaseException("Cannot extend IterableDiffers without a parent injector");return t.create(e,n)},deps:[[t,new u.SkipSelfMetadata,new u.OptionalMetadata]]})},t.prototype.find=function(t){var e=this.factories.find(function(e){return e.supports(t)});if(o.isPresent(e))return e;throw new s.BaseException("Cannot find a differ supporting object '"+t+"' of type '"+o.getTypeNameForDebugging(t)+"'")},t=r([o.CONST(),i("design:paramtypes",[Array])],t)}();e.IterableDiffers=c},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=n(12),a=n(15),u=n(5),c=function(){function t(){}return t.prototype.supports=function(t){return a.isListLikeIterable(t)},t.prototype.create=function(t,e){return new l(e)},t=r([o.CONST(),i("design:paramtypes",[])],t)}();e.DefaultIterableDifferFactory=c;var p=function(t,e){return e},l=function(){function t(t){this._trackByFn=t,this._length=null,this._collection=null,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=u.isPresent(this._trackByFn)?this._trackByFn:p}return Object.defineProperty(t.prototype,"collection",{get:function(){return this._collection},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"length",{get:function(){return this._length},enumerable:!0,configurable:!0}),t.prototype.forEachItem=function(t){var e;for(e=this._itHead;null!==e;e=e._next)t(e)},t.prototype.forEachPreviousItem=function(t){var e;for(e=this._previousItHead;null!==e;e=e._nextPrevious)t(e)},t.prototype.forEachAddedItem=function(t){var e;for(e=this._additionsHead;null!==e;e=e._nextAdded)t(e)},t.prototype.forEachMovedItem=function(t){var e;for(e=this._movesHead;null!==e;e=e._nextMoved)t(e)},t.prototype.forEachRemovedItem=function(t){var e;for(e=this._removalsHead;null!==e;e=e._nextRemoved)t(e)},t.prototype.forEachIdentityChange=function(t){var e;for(e=this._identityChangesHead;null!==e;e=e._nextIdentityChange)t(e)},t.prototype.diff=function(t){if(u.isBlank(t)&&(t=[]),!a.isListLikeIterable(t))throw new s.BaseException("Error trying to diff '"+t+"'");return this.check(t)?this:null},t.prototype.onDestroy=function(){},t.prototype.check=function(t){var e=this;this._reset();var n,r,i,o=this._itHead,s=!1;if(u.isArray(t)){var c=t;for(this._length=t.length,n=0;n"+u.stringify(this.currentIndex)+"]"},t}();e.CollectionChangeRecord=h;var f=function(){function t(){this._head=null,this._tail=null}return t.prototype.add=function(t){null===this._head?(this._head=this._tail=t,t._nextDup=null,t._prevDup=null):(this._tail._nextDup=t,t._prevDup=this._tail,t._nextDup=null,this._tail=t)},t.prototype.get=function(t,e){var n;for(n=this._head;null!==n;n=n._nextDup)if((null===e||eo?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=n(12),a=n(15),u=n(6),c=function(){function t(t){this.factories=t}return t.create=function(e,n){if(o.isPresent(n)){var r=a.ListWrapper.clone(n.factories);return e=e.concat(r),new t(e)}return new t(e)},t.extend=function(e){return new u.Provider(t,{useFactory:function(n){if(o.isBlank(n))throw new s.BaseException("Cannot extend KeyValueDiffers without a parent injector");return t.create(e,n)},deps:[[t,new u.SkipSelfMetadata,new u.OptionalMetadata]]})},t.prototype.find=function(t){var e=this.factories.find(function(e){return e.supports(t)});if(o.isPresent(e))return e;throw new s.BaseException("Cannot find a differ supporting object '"+t+"'")},t=r([o.CONST(),i("design:paramtypes",[Array])],t)}();e.KeyValueDiffers=c},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(15),s=n(5),a=n(12),u=function(){function t(){}return t.prototype.supports=function(t){return t instanceof Map||s.isJsObject(t)},t.prototype.create=function(t){return new c},t=r([s.CONST(),i("design:paramtypes",[])],t)}();e.DefaultKeyValueDifferFactory=u;var c=function(){function t(){this._records=new Map,this._mapHead=null,this._previousMapHead=null,this._changesHead=null,this._changesTail=null,this._additionsHead=null,this._additionsTail=null,this._removalsHead=null,this._removalsTail=null}return Object.defineProperty(t.prototype,"isDirty",{get:function(){return null!==this._additionsHead||null!==this._changesHead||null!==this._removalsHead},enumerable:!0,configurable:!0}),t.prototype.forEachItem=function(t){var e;for(e=this._mapHead;null!==e;e=e._next)t(e)},t.prototype.forEachPreviousItem=function(t){var e;for(e=this._previousMapHead;null!==e;e=e._nextPrevious)t(e)},t.prototype.forEachChangedItem=function(t){var e;for(e=this._changesHead;null!==e;e=e._nextChanged)t(e)},t.prototype.forEachAddedItem=function(t){var e;for(e=this._additionsHead;null!==e;e=e._nextAdded)t(e)},t.prototype.forEachRemovedItem=function(t){var e;for(e=this._removalsHead;null!==e;e=e._nextRemoved)t(e)},t.prototype.diff=function(t){if(s.isBlank(t)&&(t=o.MapWrapper.createFromPairs([])),!(t instanceof Map||s.isJsObject(t)))throw new a.BaseException("Error trying to diff '"+t+"'");return this.check(t)?this:null},t.prototype.onDestroy=function(){},t.prototype.check=function(t){var e=this;this._reset();var n=this._records,r=this._mapHead,i=null,o=null,a=!1;return this._forEach(t,function(t,u){var c;null!==r&&u===r.key?(c=r,s.looseIdentical(t,r.currentValue)||(r.previousValue=r.currentValue,r.currentValue=t,e._addToChanges(r))):(a=!0,null!==r&&(r._next=null,e._removeFromSeq(i,r),e._addToRemovals(r)),n.has(u)?c=n.get(u):(c=new p(u),n.set(u,c),c.currentValue=t,e._addToAdditions(c))),a&&(e._isInRemovals(c)&&e._removeFromRemovals(c),null==o?e._mapHead=c:o._next=c),i=r,o=c,r=null===r?null:r._next}),this._truncate(i,r),this.isDirty},t.prototype._reset=function(){if(this.isDirty){var t;for(t=this._previousMapHead=this._mapHead;null!==t;t=t._next)t._nextPrevious=t._next;for(t=this._changesHead;null!==t;t=t._nextChanged)t.previousValue=t.currentValue;for(t=this._additionsHead;null!=t;t=t._nextAdded)t.previousValue=t.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=this._removalsTail=null}},t.prototype._truncate=function(t,e){for(;null!==e;){null===t?this._mapHead=null:t._next=null;var n=e._next;this._addToRemovals(e),t=e,e=n}for(var r=this._removalsHead;null!==r;r=r._nextRemoved)r.previousValue=r.currentValue,r.currentValue=null,this._records["delete"](r.key)},t.prototype._isInRemovals=function(t){return t===this._removalsHead||null!==t._nextRemoved||null!==t._prevRemoved},t.prototype._addToRemovals=function(t){null===this._removalsHead?this._removalsHead=this._removalsTail=t:(this._removalsTail._nextRemoved=t,t._prevRemoved=this._removalsTail,this._removalsTail=t)},t.prototype._removeFromSeq=function(t,e){var n=e._next;null===t?this._mapHead=n:t._next=n},t.prototype._removeFromRemovals=function(t){var e=t._prevRemoved,n=t._nextRemoved;null===e?this._removalsHead=n:e._nextRemoved=n,null===n?this._removalsTail=e:n._prevRemoved=e,t._prevRemoved=t._nextRemoved=null},t.prototype._addToAdditions=function(t){null===this._additionsHead?this._additionsHead=this._additionsTail=t:(this._additionsTail._nextAdded=t,this._additionsTail=t)},t.prototype._addToChanges=function(t){null===this._changesHead?this._changesHead=this._changesTail=t:(this._changesTail._nextChanged=t,this._changesTail=t)},t.prototype.toString=function(){var t,e=[],n=[],r=[],i=[],o=[];for(t=this._mapHead;null!==t;t=t._next)e.push(s.stringify(t));for(t=this._previousMapHead;null!==t;t=t._nextPrevious)n.push(s.stringify(t));for(t=this._changesHead;null!==t;t=t._nextChanged)r.push(s.stringify(t));for(t=this._additionsHead;null!==t;t=t._nextAdded)i.push(s.stringify(t));for(t=this._removalsHead;null!==t;t=t._nextRemoved)o.push(s.stringify(t));return"map: "+e.join(", ")+"\nprevious: "+n.join(", ")+"\nadditions: "+i.join(", ")+"\nchanges: "+r.join(", ")+"\nremovals: "+o.join(", ")+"\n"},t.prototype._forEach=function(t,e){t instanceof Map?t.forEach(e):o.StringMapWrapper.forEach(t,e)},t}();e.DefaultKeyValueDiffer=c;var p=function(){function t(t){this.key=t,this.previousValue=null,this.currentValue=null,this._nextPrevious=null,this._next=null,this._nextAdded=null,this._nextRemoved=null,this._prevRemoved=null,this._nextChanged=null}return t.prototype.toString=function(){return s.looseIdentical(this.previousValue,this.currentValue)?s.stringify(this.key):s.stringify(this.key)+"["+s.stringify(this.previousValue)+"->"+s.stringify(this.currentValue)+"]"},t}();e.KeyValueChangeRecord=p},function(t,e,n){"use strict";function r(t){return i.isBlank(t)||t===s.Default}var i=n(5);!function(t){t[t.NeverChecked=0]="NeverChecked",t[t.CheckedBefore=1]="CheckedBefore",t[t.Errored=2]="Errored"}(e.ChangeDetectorState||(e.ChangeDetectorState={}));var o=e.ChangeDetectorState;!function(t){t[t.CheckOnce=0]="CheckOnce",t[t.Checked=1]="Checked",t[t.CheckAlways=2]="CheckAlways",t[t.Detached=3]="Detached",t[t.OnPush=4]="OnPush",t[t.Default=5]="Default"}(e.ChangeDetectionStrategy||(e.ChangeDetectionStrategy={}));var s=e.ChangeDetectionStrategy;e.CHANGE_DETECTION_STRATEGY_VALUES=[s.CheckOnce,s.Checked,s.CheckAlways,s.Detached,s.OnPush,s.Default],e.CHANGE_DETECTOR_STATE_VALUES=[o.NeverChecked,o.CheckedBefore,o.Errored],e.isDefaultChangeDetectionStrategy=r},function(t,e){"use strict";var n=function(){function t(){}return t}();e.ChangeDetectorRef=n},function(t,e,n){"use strict";function r(t,e){return o.isListLikeIterable(t)&&o.isListLikeIterable(e)?o.areIterablesEqual(t,e,r):o.isListLikeIterable(t)||i.isPrimitive(t)||o.isListLikeIterable(e)||i.isPrimitive(e)?i.looseIdentical(t,e):!0}var i=n(5),o=n(15),s=n(5);e.looseIdentical=s.looseIdentical,e.uninitialized=i.CONST_EXPR(new Object),e.devModeEqual=r;var a=function(){function t(t){this.wrapped=t}return t.wrap=function(e){return new t(e)},t}();e.WrappedValue=a;var u=function(){function t(){this.hasWrappedValue=!1}return t.prototype.unwrap=function(t){return t instanceof a?(this.hasWrappedValue=!0,t.wrapped):t},t.prototype.reset=function(){this.hasWrappedValue=!1},t}();e.ValueUnwrapper=u;var c=function(){function t(t,e){this.previousValue=t,this.currentValue=e}return t.prototype.isFirstChange=function(){return this.previousValue===e.uninitialized},t}();e.SimpleChange=c},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5);!function(t){t[t.Emulated=0]="Emulated",t[t.Native=1]="Native",t[t.None=2]="None"}(e.ViewEncapsulation||(e.ViewEncapsulation={}));var s=e.ViewEncapsulation;e.VIEW_ENCAPSULATION_VALUES=[s.Emulated,s.Native,s.None];var a=function(){function t(t){var e=void 0===t?{}:t,n=e.templateUrl,r=e.template,i=e.directives,o=e.pipes,s=e.encapsulation,a=e.styles,u=e.styleUrls;this.templateUrl=n,this.template=r,this.styleUrls=u,this.styles=a,this.directives=i,this.pipes=o,this.encapsulation=s}return t=r([o.CONST(),i("design:paramtypes",[Object])],t)}();e.ViewMetadata=a},function(t,e,n){"use strict";var r=n(9);e.Class=r.Class},function(t,e,n){"use strict";var r=n(5);e.enableProdMode=r.enableProdMode},function(t,e,n){"use strict";var r=n(5);e.Type=r.Type;var i=n(40);e.EventEmitter=i.EventEmitter;var o=n(12);e.WrappedException=o.WrappedException;var s=n(14);e.ExceptionHandler=s.ExceptionHandler},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=n(5),o=n(41);e.PromiseWrapper=o.PromiseWrapper,e.PromiseCompleter=o.PromiseCompleter;var s=n(42),a=n(43),u=n(58),c=n(42);e.Observable=c.Observable;var p=n(42);e.Subject=p.Subject;var l=function(){function t(){}return t.setTimeout=function(t,e){return i.global.setTimeout(t,e)},t.clearTimeout=function(t){i.global.clearTimeout(t)},t.setInterval=function(t,e){return i.global.setInterval(t,e)},t.clearInterval=function(t){i.global.clearInterval(t)},t}();e.TimerWrapper=l;var h=function(){function t(){}return t.subscribe=function(t,e,n,r){return void 0===r&&(r=function(){}),n="function"==typeof n&&n||i.noop,r="function"==typeof r&&r||i.noop,t.subscribe({next:e,error:n,complete:r})},t.isObservable=function(t){return!!t.subscribe},t.hasSubscribers=function(t){return t.observers.length>0},t.dispose=function(t){t.unsubscribe()},t.callNext=function(t,e){t.next(e)},t.callEmit=function(t,e){t.emit(e)},t.callError=function(t,e){t.error(e)},t.callComplete=function(t){t.complete()},t.fromPromise=function(t){return a.PromiseObservable.create(t)},t.toPromise=function(t){return u.toPromise.call(t)},t}();e.ObservableWrapper=h;var f=function(t){function e(e){void 0===e&&(e=!0),t.call(this),this._isAsync=e}return r(e,t),e.prototype.emit=function(e){t.prototype.next.call(this,e)},e.prototype.next=function(e){t.prototype.next.call(this,e)},e.prototype.subscribe=function(e,n,r){var i,o=function(t){return null},s=function(){return null};return e&&"object"==typeof e?(i=this._isAsync?function(t){setTimeout(function(){return e.next(t)})}:function(t){e.next(t)},e.error&&(o=this._isAsync?function(t){setTimeout(function(){return e.error(t)})}:function(t){e.error(t)}),e.complete&&(s=this._isAsync?function(){setTimeout(function(){return e.complete()})}:function(){e.complete()})):(i=this._isAsync?function(t){setTimeout(function(){return e(t)})}:function(t){e(t)},n&&(o=this._isAsync?function(t){setTimeout(function(){return n(t)})}:function(t){n(t)}),r&&(s=this._isAsync?function(){setTimeout(function(){return r()})}:function(){r()})),t.prototype.subscribe.call(this,i,o,s)},e}(s.Subject);e.EventEmitter=f},function(t,e){"use strict";var n=function(){function t(){var t=this;this.promise=new Promise(function(e,n){t.resolve=e,t.reject=n})}return t}();e.PromiseCompleter=n;var r=function(){function t(){}return t.resolve=function(t){return Promise.resolve(t)},t.reject=function(t,e){return Promise.reject(t)},t.catchError=function(t,e){return t["catch"](e)},t.all=function(t){return 0==t.length?Promise.resolve([]):Promise.all(t)},t.then=function(t,e,n){return t.then(e,n)},t.wrap=function(t){return new Promise(function(e,n){try{e(t())}catch(r){n(r)}})},t.scheduleMicrotask=function(e){t.then(t.resolve(null),e,function(t){})},t.isPromise=function(t){return t instanceof Promise},t.completer=function(){return new n},t}();e.PromiseWrapper=r},function(e,n){e.exports=t},function(t,e,n){"use strict";function r(t){var e=t.value,n=t.subscriber;n.isUnsubscribed||(n.next(e),n.complete())}function i(t){var e=t.err,n=t.subscriber;n.isUnsubscribed||n.error(e)}var o=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},s=n(44),a=n(46),u=function(t){function e(e,n){void 0===n&&(n=null),t.call(this),this.promise=e,this.scheduler=n}return o(e,t),e.create=function(t,n){return void 0===n&&(n=null),new e(t,n)},e.prototype._subscribe=function(t){var e=this,n=this.promise,o=this.scheduler;if(null==o)this._isScalar?t.isUnsubscribed||(t.next(this.value),t.complete()):n.then(function(n){e.value=n,e._isScalar=!0,t.isUnsubscribed||(t.next(n),t.complete())},function(e){t.isUnsubscribed||t.error(e)}).then(null,function(t){s.root.setTimeout(function(){throw t})});else if(this._isScalar){if(!t.isUnsubscribed)return o.schedule(r,0,{value:this.value,subscriber:t})}else n.then(function(n){e.value=n,e._isScalar=!0,t.isUnsubscribed||t.add(o.schedule(r,0,{value:n,subscriber:t}))},function(e){t.isUnsubscribed||t.add(o.schedule(i,0,{err:e,subscriber:t}))}).then(null,function(t){s.root.setTimeout(function(){throw t})})},e}(a.Observable);e.PromiseObservable=u},function(t,e,n){(function(t,n){"use strict";var r={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1};e.root=r[typeof self]&&self||r[typeof window]&&window;var i=(r[typeof e]&&e&&!e.nodeType&&e,r[typeof t]&&t&&!t.nodeType&&t,r[typeof n]&&n);!i||i.global!==i&&i.window!==i||(e.root=i)}).call(e,n(45)(t),function(){return this}())},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}},function(t,e,n){"use strict";var r=n(44),i=n(47),o=n(48),s=n(54),a=n(55),u=function(){function t(t){this._isScalar=!1,t&&(this._subscribe=t)}return t.prototype.lift=function(e){var n=new t;return n.source=this,n.operator=e,n},t.prototype.subscribe=function(t,e,n){var r=this.operator,i=o.toSubscriber(t,e,n);if(r?i.add(this._subscribe(r.call(i))):i.add(this._subscribe(i)),i.syncErrorThrowable&&(i.syncErrorThrowable=!1,i.syncErrorThrown))throw i.syncErrorValue;return i},t.prototype.forEach=function(t,e,n){if(n||(r.root.Rx&&r.root.Rx.config&&r.root.Rx.config.Promise?n=r.root.Rx.config.Promise:r.root.Promise&&(n=r.root.Promise)),!n)throw new Error("no Promise impl found");var i=this;return new n(function(n,r){i.subscribe(function(n){var i=s.tryCatch(t).call(e,n);i===a.errorObject&&r(a.errorObject.e)},r,n)})},t.prototype._subscribe=function(t){return this.source.subscribe(t)},t.prototype[i.SymbolShim.observable]=function(){return this},t.create=function(e){return new t(e)},t}();e.Observable=u},function(t,e,n){"use strict";function r(t){var e=o(t);return a(e,t),u(e),i(e),e}function i(t){t["for"]||(t["for"]=s)}function o(t){return t.Symbol||(t.Symbol=function(t){return"@@Symbol("+t+"):"+p++}),t.Symbol}function s(t){return"@@"+t}function a(t,e){if(!t.iterator)if("function"==typeof t["for"])t.iterator=t["for"]("iterator");else if(e.Set&&"function"==typeof(new e.Set)["@@iterator"])t.iterator="@@iterator";else if(e.Map)for(var n=Object.getOwnPropertyNames(e.Map.prototype),r=0;ro?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},h=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},f=n(60),d=n(5),v=n(6),y=n(62),m=n(40),g=n(15),_=n(63),b=n(64),P=n(12),E=n(75),w=n(71);e.createNgZone=r;var C,R=!1;e.createPlatform=i,e.assertPlatform=o,e.disposePlatform=s,e.getPlatform=a,e.coreBootstrap=u,e.coreLoadAndBootstrap=c;var S=function(){function t(){}return Object.defineProperty(t.prototype,"injector",{get:function(){throw P.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"disposed",{get:function(){throw P.unimplemented()},enumerable:!0,configurable:!0}),t}();e.PlatformRef=S;var O=function(t){function e(e){if(t.call(this),this._injector=e,this._applications=[],this._disposeListeners=[],this._disposed=!1,!R)throw new P.BaseException("Platforms have to be created via `createPlatform`!");var n=e.get(y.PLATFORM_INITIALIZER,null);d.isPresent(n)&&n.forEach(function(t){return t()})}return p(e,t),e.prototype.registerDisposeListener=function(t){this._disposeListeners.push(t)},Object.defineProperty(e.prototype,"injector",{get:function(){return this._injector},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"disposed",{get:function(){return this._disposed},enumerable:!0,configurable:!0}),e.prototype.addApplication=function(t){this._applications.push(t)},e.prototype.dispose=function(){g.ListWrapper.clone(this._applications).forEach(function(t){return t.dispose()}),this._disposeListeners.forEach(function(t){return t()}),this._disposed=!0},e.prototype._applicationDisposed=function(t){g.ListWrapper.remove(this._applications,t)},e=l([v.Injectable(),h("design:paramtypes",[v.Injector])],e)}(S);e.PlatformRef_=O;var T=function(){function t(){}return Object.defineProperty(t.prototype,"injector",{get:function(){return P.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"zone",{get:function(){return P.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"componentTypes",{get:function(){return P.unimplemented()},enumerable:!0,configurable:!0}),t}();e.ApplicationRef=T;var x=function(t){function e(e,n,r){var i=this;t.call(this),this._platform=e,this._zone=n,this._injector=r,this._bootstrapListeners=[],this._disposeListeners=[],this._rootComponents=[],this._rootComponentTypes=[],this._changeDetectorRefs=[],this._runningTick=!1,this._enforceNoNewChanges=!1;var o=r.get(f.NgZone);this._enforceNoNewChanges=d.assertionsEnabled(),o.run(function(){i._exceptionHandler=r.get(P.ExceptionHandler)}),this._asyncInitDonePromise=this.run(function(){var t,e=r.get(y.APP_INITIALIZER,null),n=[];if(d.isPresent(e))for(var o=0;o0?(t=m.PromiseWrapper.all(n).then(function(t){return i._asyncInitDone=!0}),i._asyncInitDone=!1):(i._asyncInitDone=!0,t=m.PromiseWrapper.resolve(!0)),t}),m.ObservableWrapper.subscribe(o.onError,function(t){i._exceptionHandler.call(t.error,t.stackTrace)}),m.ObservableWrapper.subscribe(this._zone.onMicrotaskEmpty,function(t){i._zone.run(function(){i.tick()})})}return p(e,t),e.prototype.registerBootstrapListener=function(t){this._bootstrapListeners.push(t)},e.prototype.registerDisposeListener=function(t){this._disposeListeners.push(t)},e.prototype.registerChangeDetector=function(t){this._changeDetectorRefs.push(t)},e.prototype.unregisterChangeDetector=function(t){g.ListWrapper.remove(this._changeDetectorRefs,t)},e.prototype.waitForAsyncInitializers=function(){return this._asyncInitDonePromise},e.prototype.run=function(t){var e,n=this,r=this.injector.get(f.NgZone),i=m.PromiseWrapper.completer();return r.run(function(){try{e=t(),d.isPromise(e)&&m.PromiseWrapper.then(e,function(t){i.resolve(t)},function(t,e){i.reject(t,e),n._exceptionHandler.call(t,e)})}catch(r){throw n._exceptionHandler.call(r,r.stack),r}}),d.isPromise(e)?i.promise:e},e.prototype.bootstrap=function(t){var e=this;if(!this._asyncInitDone)throw new P.BaseException("Cannot bootstrap as there are still asynchronous initializers running. Wait for them using waitForAsyncInitializers().");return this.run(function(){e._rootComponentTypes.push(t.componentType);var n=t.create(e._injector,[],t.selector);n.onDestroy(function(){e._unloadComponent(n)});var r=n.injector.get(_.Testability,null);d.isPresent(r)&&n.injector.get(_.TestabilityRegistry).registerApplication(n.location.nativeElement,r),e._loadComponent(n);var i=e._injector.get(E.Console);return d.assertionsEnabled()&&i.log("Angular 2 is running in the development mode. Call enableProdMode() to enable the production mode."),n})},e.prototype._loadComponent=function(t){this._changeDetectorRefs.push(t.changeDetectorRef),this.tick(),this._rootComponents.push(t),this._bootstrapListeners.forEach(function(e){return e(t)})},e.prototype._unloadComponent=function(t){g.ListWrapper.contains(this._rootComponents,t)&&(this.unregisterChangeDetector(t.changeDetectorRef),g.ListWrapper.remove(this._rootComponents,t))},Object.defineProperty(e.prototype,"injector",{get:function(){return this._injector},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"zone",{get:function(){return this._zone},enumerable:!0,configurable:!0}),e.prototype.tick=function(){if(this._runningTick)throw new P.BaseException("ApplicationRef.tick is called recursively");var t=e._tickScope();try{this._runningTick=!0,this._changeDetectorRefs.forEach(function(t){return t.detectChanges()}),this._enforceNoNewChanges&&this._changeDetectorRefs.forEach(function(t){return t.checkNoChanges()})}finally{this._runningTick=!1,w.wtfLeave(t)}},e.prototype.dispose=function(){g.ListWrapper.clone(this._rootComponents).forEach(function(t){return t.destroy()}),this._disposeListeners.forEach(function(t){return t()}),this._platform._applicationDisposed(this)},Object.defineProperty(e.prototype,"componentTypes",{get:function(){return this._rootComponentTypes},enumerable:!0,configurable:!0}),e._tickScope=w.wtfCreateScope("ApplicationRef#tick()"),e=l([v.Injectable(),h("design:paramtypes",[O,f.NgZone,v.Injector])],e)}(T);e.ApplicationRef_=x,e.PLATFORM_CORE_PROVIDERS=d.CONST_EXPR([O,d.CONST_EXPR(new v.Provider(S,{useExisting:O}))]),e.APPLICATION_CORE_PROVIDERS=d.CONST_EXPR([d.CONST_EXPR(new v.Provider(f.NgZone,{useFactory:r,deps:d.CONST_EXPR([])})),x,d.CONST_EXPR(new v.Provider(T,{useExisting:x}))])},function(t,e,n){"use strict";var r=n(40),i=n(61),o=n(12),s=n(61);e.NgZoneError=s.NgZoneError;var a=function(){function t(t){var e=this,n=t.enableLongStackTrace,o=void 0===n?!1:n;this._hasPendingMicrotasks=!1,this._hasPendingMacrotasks=!1,this._isStable=!0,this._nesting=0,this._onUnstable=new r.EventEmitter(!1),this._onMicrotaskEmpty=new r.EventEmitter(!1),this._onStable=new r.EventEmitter(!1),this._onErrorEvents=new r.EventEmitter(!1),this._zoneImpl=new i.NgZoneImpl({trace:o,onEnter:function(){e._nesting++,e._isStable&&(e._isStable=!1,e._onUnstable.emit(null))},onLeave:function(){e._nesting--,e._checkStable()},setMicrotask:function(t){e._hasPendingMicrotasks=t,e._checkStable()},setMacrotask:function(t){e._hasPendingMacrotasks=t},onError:function(t){return e._onErrorEvents.emit(t)}})}return t.isInAngularZone=function(){return i.NgZoneImpl.isInAngularZone()},t.assertInAngularZone=function(){if(!i.NgZoneImpl.isInAngularZone())throw new o.BaseException("Expected to be in Angular Zone, but it is not!")},t.assertNotInAngularZone=function(){if(i.NgZoneImpl.isInAngularZone())throw new o.BaseException("Expected to not be in Angular Zone, but it is!")},t.prototype._checkStable=function(){var t=this;if(0==this._nesting&&!this._hasPendingMicrotasks&&!this._isStable)try{this._nesting++,this._onMicrotaskEmpty.emit(null)}finally{if(this._nesting--,!this._hasPendingMicrotasks)try{this.runOutsideAngular(function(){return t._onStable.emit(null)})}finally{this._isStable=!0}}},Object.defineProperty(t.prototype,"onUnstable",{get:function(){return this._onUnstable},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"onMicrotaskEmpty",{get:function(){return this._onMicrotaskEmpty},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"onStable",{get:function(){return this._onStable},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"onError",{get:function(){return this._onErrorEvents},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hasPendingMicrotasks",{get:function(){return this._hasPendingMicrotasks},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hasPendingMacrotasks",{get:function(){return this._hasPendingMacrotasks},enumerable:!0,configurable:!0}),t.prototype.run=function(t){return this._zoneImpl.runInner(t)},t.prototype.runGuarded=function(t){return this._zoneImpl.runInnerGuarded(t)},t.prototype.runOutsideAngular=function(t){return this._zoneImpl.runOuter(t)},t}();e.NgZone=a},function(t,e){"use strict";var n=function(){function t(t,e){this.error=t,this.stackTrace=e}return t}();e.NgZoneError=n;var r=function(){function t(t){var e=this,r=t.trace,i=t.onEnter,o=t.onLeave,s=t.setMicrotask,a=t.setMacrotask,u=t.onError;if(this.onEnter=i,this.onLeave=o,this.setMicrotask=s,this.setMacrotask=a,this.onError=u,!Zone)throw new Error("Angular2 needs to be run with Zone.js polyfill.");this.outer=this.inner=Zone.current,Zone.wtfZoneSpec&&(this.inner=this.inner.fork(Zone.wtfZoneSpec)),r&&Zone.longStackTraceZoneSpec&&(this.inner=this.inner.fork(Zone.longStackTraceZoneSpec)),this.inner=this.inner.fork({name:"angular",properties:{isAngularZone:!0},onInvokeTask:function(t,n,r,i,o,s){try{return e.onEnter(),t.invokeTask(r,i,o,s)}finally{e.onLeave()}},onInvoke:function(t,n,r,i,o,s,a){try{return e.onEnter(),t.invoke(r,i,o,s,a)}finally{e.onLeave()}},onHasTask:function(t,n,r,i){t.hasTask(r,i),n==r&&("microTask"==i.change?e.setMicrotask(i.microTask):"macroTask"==i.change&&e.setMacrotask(i.macroTask))},onHandleError:function(t,r,i,o){return t.handleError(i,o),e.onError(new n(o,o.stack)),!1}})}return t.isInAngularZone=function(){return Zone.current.get("isAngularZone")===!0},t.prototype.runInner=function(t){return this.inner.run(t)},t.prototype.runInnerGuarded=function(t){return this.inner.runGuarded(t)},t.prototype.runOuter=function(t){return this.outer.run(t)},t}();e.NgZoneImpl=r},function(t,e,n){"use strict";function r(){return""+i()+i()+i()}function i(){return s.StringWrapper.fromCharCode(97+s.Math.floor(25*s.Math.random()))}var o=n(6),s=n(5);e.APP_ID=s.CONST_EXPR(new o.OpaqueToken("AppId")),e.APP_ID_RANDOM_PROVIDER=s.CONST_EXPR(new o.Provider(e.APP_ID,{useFactory:r,deps:[]})),e.PLATFORM_INITIALIZER=s.CONST_EXPR(new o.OpaqueToken("Platform Initializer")),e.APP_INITIALIZER=s.CONST_EXPR(new o.OpaqueToken("Application Initializer")),e.PACKAGE_ROOT_URL=s.CONST_EXPR(new o.OpaqueToken("Application Packages Root URL"))},function(t,e,n){"use strict";function r(t){v=t}var i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(6),a=n(15),u=n(5),c=n(12),p=n(60),l=n(40),h=function(){function t(t){this._ngZone=t,this._pendingCount=0,this._isZoneStable=!0,this._didWork=!1,this._callbacks=[],this._watchAngularEvents()}return t.prototype._watchAngularEvents=function(){var t=this;l.ObservableWrapper.subscribe(this._ngZone.onUnstable,function(e){t._didWork=!0,t._isZoneStable=!1}),this._ngZone.runOutsideAngular(function(){l.ObservableWrapper.subscribe(t._ngZone.onStable,function(e){p.NgZone.assertNotInAngularZone(),u.scheduleMicroTask(function(){t._isZoneStable=!0,t._runCallbacksIfReady()})})})},t.prototype.increasePendingRequestCount=function(){return this._pendingCount+=1,this._didWork=!0,this._pendingCount},t.prototype.decreasePendingRequestCount=function(){if(this._pendingCount-=1,this._pendingCount<0)throw new c.BaseException("pending async requests below zero");return this._runCallbacksIfReady(),this._pendingCount},t.prototype.isStable=function(){return this._isZoneStable&&0==this._pendingCount&&!this._ngZone.hasPendingMacrotasks},t.prototype._runCallbacksIfReady=function(){var t=this;this.isStable()?u.scheduleMicroTask(function(){for(;0!==t._callbacks.length;)t._callbacks.pop()(t._didWork);t._didWork=!1}):this._didWork=!0},t.prototype.whenStable=function(t){this._callbacks.push(t),this._runCallbacksIfReady()},t.prototype.getPendingRequestCount=function(){return this._pendingCount},t.prototype.findBindings=function(t,e,n){return[]},t.prototype.findProviders=function(t,e,n){return[]},t=i([s.Injectable(),o("design:paramtypes",[p.NgZone])],t)}();e.Testability=h;var f=function(){function t(){this._applications=new a.Map,v.addToWindow(this)}return t.prototype.registerApplication=function(t,e){this._applications.set(t,e)},t.prototype.getTestability=function(t){return this._applications.get(t)},t.prototype.getAllTestabilities=function(){return a.MapWrapper.values(this._applications)},t.prototype.getAllRootElements=function(){return a.MapWrapper.keys(this._applications)},t.prototype.findTestabilityInTree=function(t,e){return void 0===e&&(e=!0),v.findTestabilityInTree(this,t,e)},t=i([s.Injectable(),o("design:paramtypes",[])],t)}();e.TestabilityRegistry=f;var d=function(){function t(){}return t.prototype.addToWindow=function(t){},t.prototype.findTestabilityInTree=function(t,e,n){return null},t=i([u.CONST(),o("design:paramtypes",[])],t)}();e.setTestabilityGetter=r;var v=u.CONST_EXPR(new d)},function(t,e,n){"use strict";function r(t){return t instanceof h.ComponentFactory}var i=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},o=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},s=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},a=n(6),u=n(5),c=n(12),p=n(40),l=n(18),h=n(65),f=function(){function t(){}return t}();e.ComponentResolver=f;var d=function(t){function e(){t.apply(this,arguments)}return i(e,t),e.prototype.resolveComponent=function(t){var e=l.reflector.annotations(t),n=e.find(r);if(u.isBlank(n))throw new c.BaseException("No precompiled component "+u.stringify(t)+" found");return p.PromiseWrapper.resolve(n)},e.prototype.clearCache=function(){},e=o([a.Injectable(),s("design:paramtypes",[])],e)}(f);e.ReflectorComponentResolver=d},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(5),a=n(12),u=n(66),c=function(){function t(){}return Object.defineProperty(t.prototype,"location",{get:function(){return a.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"injector",{get:function(){return a.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"instance",{get:function(){return a.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hostView",{get:function(){return a.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"changeDetectorRef",{get:function(){return a.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"componentType",{get:function(){return a.unimplemented()},enumerable:!0,configurable:!0}),t}();e.ComponentRef=c;var p=function(t){function e(e,n){t.call(this),this._hostElement=e,this._componentType=n}return r(e,t),Object.defineProperty(e.prototype,"location",{get:function(){return this._hostElement.elementRef},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"injector",{get:function(){return this._hostElement.injector},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"instance",{get:function(){return this._hostElement.component},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hostView",{get:function(){return this._hostElement.parentView.ref},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"changeDetectorRef",{get:function(){return this.hostView},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"componentType",{get:function(){return this._componentType},enumerable:!0,configurable:!0}),e.prototype.destroy=function(){this._hostElement.parentView.destroy()},e.prototype.onDestroy=function(t){this.hostView.onDestroy(t)},e}(c);e.ComponentRef_=p;var l=function(){function t(t,e,n){this.selector=t,this._viewFactory=e,this._componentType=n}return Object.defineProperty(t.prototype,"componentType",{get:function(){return this._componentType},enumerable:!0,configurable:!0}),t.prototype.create=function(t,e,n){void 0===e&&(e=null),void 0===n&&(n=null);var r=t.get(u.ViewUtils);s.isBlank(e)&&(e=[]);var i=this._viewFactory(r,t,null),o=i.create(e,n);return new p(o,this._componentType)},t=i([s.CONST(),o("design:paramtypes",[String,Function,s.Type])],t)}();e.ComponentFactory=l},function(t,e,n){"use strict";function r(t){return i(t,[])}function i(t,e){for(var n=0;ni;i++)n[i]=r>i?t[i]:D}else n=t;return n}function s(t,e,n,r,i,o,s,u,c,p,l,h,f,d,v,y,m,g,_,b){switch(t){case 1:return e+a(n)+r;case 2:return e+a(n)+r+a(i)+o;case 3:return e+a(n)+r+a(i)+o+a(s)+u;case 4:return e+a(n)+r+a(i)+o+a(s)+u+a(c)+p;case 5:return e+a(n)+r+a(i)+o+a(s)+u+a(c)+p+a(l)+h;case 6:return e+a(n)+r+a(i)+o+a(s)+u+a(c)+p+a(l)+h+a(f)+d;case 7:return e+a(n)+r+a(i)+o+a(s)+u+a(c)+p+a(l)+h+a(f)+d+a(v)+y;case 8:return e+a(n)+r+a(i)+o+a(s)+u+a(c)+p+a(l)+h+a(f)+d+a(v)+y+a(m)+g;case 9:return e+a(n)+r+a(i)+o+a(s)+u+a(c)+p+a(l)+h+a(f)+d+a(v)+y+a(m)+g+a(_)+b;default:throw new O.BaseException("Does not support more than 9 expressions")}}function a(t){return null!=t?t.toString():""}function u(t,e,n){if(t){if(!A.devModeEqual(e,n))throw new x.ExpressionChangedAfterItHasBeenCheckedException(e,n,null);return!1}return!R.looseIdentical(e,n)}function c(t,e){if(t.length!=e.length)return!1;for(var n=0;no?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},w=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},C=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},R=n(5),S=n(15),O=n(12),T=n(67),x=n(73),A=n(28),I=n(6),M=n(74),k=n(62),N=function(){function t(t,e){this._renderer=t,this._appId=e,this._nextCompTypeId=0}return t.prototype.createRenderComponentType=function(t,e,n,r){return new M.RenderComponentType(this._appId+"-"+this._nextCompTypeId++,t,e,n,r)},t.prototype.renderComponent=function(t){return this._renderer.renderComponent(t)},t=E([I.Injectable(),C(1,I.Inject(k.APP_ID)),w("design:paramtypes",[M.RootRenderer,String])],t)}();e.ViewUtils=N,e.flattenNestedViewRenderNodes=r;var D=R.CONST_EXPR([]);e.ensureSlotCount=o,e.MAX_INTERPOLATION_VALUES=9,e.interpolate=s,e.checkBinding=u,e.arrayLooseIdentical=c,e.mapLooseIdentical=p,e.castByValue=l,e.pureProxy1=h,e.pureProxy2=f,e.pureProxy3=d,e.pureProxy4=v,e.pureProxy5=y,e.pureProxy6=m,e.pureProxy7=g,e.pureProxy8=_,e.pureProxy9=b,e.pureProxy10=P},function(t,e,n){"use strict";var r=n(5),i=n(15),o=n(12),s=n(68),a=n(69),u=n(70),c=function(){function t(t,e,n,r){this.index=t,this.parentIndex=e,this.parentView=n,this.nativeElement=r,this.nestedViews=null,this.componentView=null}return Object.defineProperty(t.prototype,"elementRef",{get:function(){return new a.ElementRef(this.nativeElement)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"vcRef",{get:function(){return new u.ViewContainerRef_(this)},enumerable:!0,configurable:!0}),t.prototype.initComponent=function(t,e,n){this.component=t,this.componentConstructorViewQueries=e,this.componentView=n},Object.defineProperty(t.prototype,"parentInjector",{get:function(){return this.parentView.injector(this.parentIndex)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"injector",{get:function(){return this.parentView.injector(this.index)},enumerable:!0,configurable:!0}),t.prototype.mapNestedViews=function(t,e){var n=[];return r.isPresent(this.nestedViews)&&this.nestedViews.forEach(function(r){r.clazz===t&&n.push(e(r))}),n},t.prototype.attachView=function(t,e){if(t.type===s.ViewType.COMPONENT)throw new o.BaseException("Component views can't be moved!");var n=this.nestedViews;null==n&&(n=[],this.nestedViews=n),i.ListWrapper.insert(n,e,t);var a;if(e>0){var u=n[e-1];a=u.lastRootNode}else a=this.nativeElement;r.isPresent(a)&&t.renderer.attachViewAfter(a,t.flatRootNodes),t.addToContentChildren(this)},t.prototype.detachView=function(t){var e=i.ListWrapper.removeAt(this.nestedViews,t);if(e.type===s.ViewType.COMPONENT)throw new o.BaseException("Component views can't be moved!");return e.renderer.detachView(e.flatRootNodes),e.removeFromContentChildren(this),e},t}();e.AppElement=c},function(t,e){"use strict";!function(t){t[t.HOST=0]="HOST",t[t.COMPONENT=1]="COMPONENT",t[t.EMBEDDED=2]="EMBEDDED"}(e.ViewType||(e.ViewType={}));e.ViewType},function(t,e){"use strict";var n=function(){function t(t){this.nativeElement=t}return t}();e.ElementRef=n},function(t,e,n){"use strict";var r=n(15),i=n(12),o=n(5),s=n(71),a=function(){function t(){}return Object.defineProperty(t.prototype,"element",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"injector",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentInjector",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"length",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),t}();e.ViewContainerRef=a;var u=function(){function t(t){this._element=t,this._createComponentInContainerScope=s.wtfCreateScope("ViewContainerRef#createComponent()"),this._insertScope=s.wtfCreateScope("ViewContainerRef#insert()"),this._removeScope=s.wtfCreateScope("ViewContainerRef#remove()"),this._detachScope=s.wtfCreateScope("ViewContainerRef#detach()")}return t.prototype.get=function(t){return this._element.nestedViews[t].ref},Object.defineProperty(t.prototype,"length",{get:function(){var t=this._element.nestedViews;return o.isPresent(t)?t.length:0},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"element",{get:function(){return this._element.elementRef},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"injector",{get:function(){return this._element.injector},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentInjector",{get:function(){return this._element.parentInjector},enumerable:!0,configurable:!0}),t.prototype.createEmbeddedView=function(t,e){void 0===e&&(e=-1);var n=t.createEmbeddedView();return this.insert(n,e),n},t.prototype.createComponent=function(t,e,n,r){void 0===e&&(e=-1),void 0===n&&(n=null),void 0===r&&(r=null);var i=this._createComponentInContainerScope(),a=o.isPresent(n)?n:this._element.parentInjector,u=t.create(a,r);return this.insert(u.hostView,e),s.wtfLeave(i,u)},t.prototype.insert=function(t,e){void 0===e&&(e=-1);var n=this._insertScope();-1==e&&(e=this.length);var r=t;return this._element.attachView(r.internalView,e),s.wtfLeave(n,r)},t.prototype.indexOf=function(t){return r.ListWrapper.indexOf(this._element.nestedViews,t.internalView)},t.prototype.remove=function(t){void 0===t&&(t=-1);var e=this._removeScope();-1==t&&(t=this.length-1);var n=this._element.detachView(t);n.destroy(),s.wtfLeave(e)},t.prototype.detach=function(t){void 0===t&&(t=-1);var e=this._detachScope();-1==t&&(t=this.length-1);var n=this._element.detachView(t);return s.wtfLeave(e,n.ref)},t.prototype.clear=function(){for(var t=this.length-1;t>=0;t--)this.remove(t)},t}();e.ViewContainerRef_=u},function(t,e,n){"use strict";function r(t,e){return null}var i=n(72);e.wtfEnabled=i.detectWTF(),e.wtfCreateScope=e.wtfEnabled?i.createScope:function(t,e){return r},e.wtfLeave=e.wtfEnabled?i.leave:function(t,e){return e},e.wtfStartTimeRange=e.wtfEnabled?i.startTimeRange:function(t,e){return null},e.wtfEndTimeRange=e.wtfEnabled?i.endTimeRange:function(t){return null}},function(t,e,n){"use strict";function r(){var t=p.global.wtf;return t&&(u=t.trace)?(c=u.events,!0):!1}function i(t,e){return void 0===e&&(e=null),c.createScope(t,e)}function o(t,e){return u.leaveScope(t,e),e}function s(t,e){return u.beginTimeRange(t,e)}function a(t){u.endTimeRange(t)}var u,c,p=n(5);e.detectWTF=r,e.createScope=i,e.leave=o,e.startTimeRange=s,e.endTimeRange=a},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=n(12),o=function(t){function e(e,n,r){t.call(this,"Expression has changed after it was checked. "+("Previous value: '"+e+"'. Current value: '"+n+"'"))}return r(e,t),e}(i.BaseException);e.ExpressionChangedAfterItHasBeenCheckedException=o;var s=function(t){function e(e,n,r){t.call(this,"Error in "+r.source,e,n,r)}return r(e,t),e}(i.WrappedException);e.ViewWrappedException=s;var a=function(t){function e(e){t.call(this,"Attempt to use a destroyed view: "+e)}return r(e,t),e}(i.BaseException);e.ViewDestroyedException=a},function(t,e,n){"use strict";var r=n(12),i=function(){function t(t,e,n,r,i){this.id=t,this.templateUrl=e,this.slotCount=n,this.encapsulation=r,this.styles=i}return t}();e.RenderComponentType=i;var o=function(){function t(){}return Object.defineProperty(t.prototype,"injector",{get:function(){return r.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"component",{get:function(){ +return r.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"providerTokens",{get:function(){return r.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"locals",{get:function(){return r.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"source",{get:function(){return r.unimplemented()},enumerable:!0,configurable:!0}),t}();e.RenderDebugInfo=o;var s=function(){function t(){}return t}();e.Renderer=s;var a=function(){function t(){}return t}();e.RootRenderer=a},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(6),s=n(5),a=function(){function t(){}return t.prototype.log=function(t){s.print(t)},t=r([o.Injectable(),i("design:paramtypes",[])],t)}();e.Console=a},function(t,e,n){"use strict";var r=n(60);e.NgZone=r.NgZone,e.NgZoneError=r.NgZoneError},function(t,e,n){"use strict";var r=n(74);e.RootRenderer=r.RootRenderer,e.Renderer=r.Renderer,e.RenderComponentType=r.RenderComponentType},function(t,e,n){"use strict";var r=n(64);e.ComponentResolver=r.ComponentResolver;var i=n(79);e.QueryList=i.QueryList;var o=n(80);e.DynamicComponentLoader=o.DynamicComponentLoader;var s=n(69);e.ElementRef=s.ElementRef;var a=n(81);e.TemplateRef=a.TemplateRef;var u=n(82);e.EmbeddedViewRef=u.EmbeddedViewRef,e.ViewRef=u.ViewRef;var c=n(70);e.ViewContainerRef=c.ViewContainerRef;var p=n(65);e.ComponentRef=p.ComponentRef,e.ComponentFactory=p.ComponentFactory;var l=n(73);e.ExpressionChangedAfterItHasBeenCheckedException=l.ExpressionChangedAfterItHasBeenCheckedException},function(t,e,n){"use strict";var r=n(15),i=n(5),o=n(40),s=function(){function t(){this._dirty=!0,this._results=[],this._emitter=new o.EventEmitter}return Object.defineProperty(t.prototype,"changes",{get:function(){return this._emitter},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"length",{get:function(){return this._results.length},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"first",{get:function(){return r.ListWrapper.first(this._results)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"last",{get:function(){return r.ListWrapper.last(this._results)},enumerable:!0,configurable:!0}),t.prototype.map=function(t){return this._results.map(t)},t.prototype.filter=function(t){return this._results.filter(t)},t.prototype.reduce=function(t,e){return this._results.reduce(t,e)},t.prototype.forEach=function(t){this._results.forEach(t)},t.prototype.toArray=function(){return r.ListWrapper.clone(this._results)},t.prototype[i.getSymbolIterator()]=function(){return this._results[i.getSymbolIterator()]()},t.prototype.toString=function(){return this._results.toString()},t.prototype.reset=function(t){this._results=r.ListWrapper.flatten(t),this._dirty=!1},t.prototype.notifyOnChanges=function(){this._emitter.emit(this)},t.prototype.setDirty=function(){this._dirty=!0},Object.defineProperty(t.prototype,"dirty",{get:function(){return this._dirty},enumerable:!0,configurable:!0}),t}();e.QueryList=s},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(6),a=n(64),u=n(5),c=function(){function t(){}return t}();e.DynamicComponentLoader=c;var p=function(t){function e(e){t.call(this),this._compiler=e}return r(e,t),e.prototype.loadAsRoot=function(t,e,n,r,i){return this._compiler.resolveComponent(t).then(function(t){var o=t.create(n,i,u.isPresent(e)?e:t.selector);return u.isPresent(r)&&o.onDestroy(r),o})},e.prototype.loadNextToLocation=function(t,e,n,r){return void 0===n&&(n=null),void 0===r&&(r=null),this._compiler.resolveComponent(t).then(function(t){var i=e.parentInjector,o=u.isPresent(n)&&n.length>0?s.ReflectiveInjector.fromResolvedProviders(n,i):i;return e.createComponent(t,e.length,o,r)})},e=i([s.Injectable(),o("design:paramtypes",[a.ComponentResolver])],e)}(c);e.DynamicComponentLoader_=p},function(t,e){"use strict";var n=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},r=function(){function t(){}return Object.defineProperty(t.prototype,"elementRef",{get:function(){return null},enumerable:!0,configurable:!0}),t}();e.TemplateRef=r;var i=function(t){function e(e,n){t.call(this),this._appElement=e,this._viewFactory=n}return n(e,t),e.prototype.createEmbeddedView=function(){var t=this._viewFactory(this._appElement.parentView.viewUtils,this._appElement.parentInjector,this._appElement);return t.create(null,null),t.ref},Object.defineProperty(e.prototype,"elementRef",{get:function(){return this._appElement.elementRef},enumerable:!0,configurable:!0}),e}(r);e.TemplateRef_=i},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=n(12),o=n(34),s=n(33),a=function(t){function e(){t.apply(this,arguments)}return r(e,t),Object.defineProperty(e.prototype,"changeDetectorRef",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"destroyed",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),e}(o.ChangeDetectorRef);e.ViewRef=a;var u=function(t){function e(){t.apply(this,arguments)}return r(e,t),Object.defineProperty(e.prototype,"rootNodes",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),e}(a);e.EmbeddedViewRef=u;var c=function(){function t(t){this._view=t,this._view=t}return Object.defineProperty(t.prototype,"internalView",{get:function(){return this._view},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"changeDetectorRef",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"rootNodes",{get:function(){return this._view.flatRootNodes},enumerable:!0,configurable:!0}),t.prototype.setLocal=function(t,e){this._view.setLocal(t,e)},t.prototype.hasLocal=function(t){return this._view.hasLocal(t)},Object.defineProperty(t.prototype,"destroyed",{get:function(){return this._view.destroyed},enumerable:!0,configurable:!0}),t.prototype.markForCheck=function(){this._view.markPathToRootAsCheckOnce()},t.prototype.detach=function(){this._view.cdMode=s.ChangeDetectionStrategy.Detached},t.prototype.detectChanges=function(){this._view.detectChanges(!1)},t.prototype.checkNoChanges=function(){this._view.detectChanges(!0)},t.prototype.reattach=function(){this._view.cdMode=s.ChangeDetectionStrategy.CheckAlways,this.markForCheck()},t.prototype.onDestroy=function(t){this._view.disposables.push(t)},t.prototype.destroy=function(){this._view.destroy()},t}();e.ViewRef_=c},function(t,e,n){"use strict";function r(t){return t.map(function(t){return t.nativeElement})}function i(t,e,n){t.childNodes.forEach(function(t){t instanceof v&&(e(t)&&n.push(t),i(t,e,n))})}function o(t,e,n){t instanceof v&&t.childNodes.forEach(function(t){e(t)&&n.push(t),t instanceof v&&o(t,e,n)})}function s(t){return y.get(t)}function a(){return h.MapWrapper.values(y)}function u(t){y.set(t.nativeNode,t)}function c(t){y["delete"](t.nativeNode)}var p=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},l=n(5),h=n(15),f=function(){function t(t,e){this.name=t,this.callback=e}return t}();e.EventListener=f;var d=function(){function t(t,e,n){this._debugInfo=n,this.nativeNode=t,l.isPresent(e)&&e instanceof v?e.addChild(this):this.parent=null,this.listeners=[]}return Object.defineProperty(t.prototype,"injector",{get:function(){return l.isPresent(this._debugInfo)?this._debugInfo.injector:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"componentInstance",{get:function(){return l.isPresent(this._debugInfo)?this._debugInfo.component:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"locals",{get:function(){return l.isPresent(this._debugInfo)?this._debugInfo.locals:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"providerTokens",{get:function(){return l.isPresent(this._debugInfo)?this._debugInfo.providerTokens:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"source",{get:function(){return l.isPresent(this._debugInfo)?this._debugInfo.source:null},enumerable:!0,configurable:!0}),t.prototype.inject=function(t){return this.injector.get(t)},t.prototype.getLocal=function(t){return this.locals[t]},t}();e.DebugNode=d;var v=function(t){function e(e,n,r){t.call(this,e,n,r),this.properties={},this.attributes={},this.childNodes=[],this.nativeElement=e}return p(e,t),e.prototype.addChild=function(t){l.isPresent(t)&&(this.childNodes.push(t),t.parent=this)},e.prototype.removeChild=function(t){var e=this.childNodes.indexOf(t);-1!==e&&(t.parent=null,this.childNodes.splice(e,1))},e.prototype.insertChildrenAfter=function(t,e){var n=this.childNodes.indexOf(t);if(-1!==n){var r=this.childNodes.slice(0,n+1),i=this.childNodes.slice(n+1);this.childNodes=h.ListWrapper.concat(h.ListWrapper.concat(r,e),i);for(var o=0;o0?e[0]:null},e.prototype.queryAll=function(t){var e=[];return i(this,t,e),e},e.prototype.queryAllNodes=function(t){var e=[];return o(this,t,e),e},Object.defineProperty(e.prototype,"children",{get:function(){var t=[];return this.childNodes.forEach(function(n){n instanceof e&&t.push(n)}),t},enumerable:!0,configurable:!0}),e.prototype.triggerEventHandler=function(t,e){this.listeners.forEach(function(n){n.name==t&&n.callback(e)})},e}(d);e.DebugElement=v,e.asNativeElements=r;var y=new Map;e.getDebugNode=s,e.getAllDebugNodes=a,e.indexDebugNode=u,e.removeDebugNodeFromIndex=c},function(t,e,n){"use strict";var r=n(6),i=n(5);e.PLATFORM_DIRECTIVES=i.CONST_EXPR(new r.OpaqueToken("Platform Directives")),e.PLATFORM_PIPES=i.CONST_EXPR(new r.OpaqueToken("Platform Pipes"))},function(t,e,n){"use strict";function r(){return a.reflector}var i=n(5),o=n(6),s=n(75),a=n(18),u=n(20),c=n(63),p=n(59);e.PLATFORM_COMMON_PROVIDERS=i.CONST_EXPR([p.PLATFORM_CORE_PROVIDERS,new o.Provider(a.Reflector,{useFactory:r,deps:[]}),new o.Provider(u.ReflectorReader,{useExisting:a.Reflector}),c.TestabilityRegistry,s.Console])},function(t,e,n){"use strict";var r=n(5),i=n(6),o=n(62),s=n(59),a=n(28),u=n(66),c=n(64),p=n(64),l=n(80),h=n(80);e.APPLICATION_COMMON_PROVIDERS=r.CONST_EXPR([s.APPLICATION_CORE_PROVIDERS,new i.Provider(c.ComponentResolver,{useClass:p.ReflectorComponentResolver}),o.APP_ID_RANDOM_PROVIDER,u.ViewUtils,new i.Provider(a.IterableDiffers,{useValue:a.defaultIterableDiffers}),new i.Provider(a.KeyValueDiffers,{useValue:a.defaultKeyValueDiffers}),new i.Provider(l.DynamicComponentLoader,{useClass:h.DynamicComponentLoader_})])},function(t,e,n){"use strict";function r(t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n])}r(n(88)),r(n(102)),r(n(112)),r(n(136))},function(t,e,n){"use strict";var r=n(89);e.AsyncPipe=r.AsyncPipe;var i=n(91);e.DatePipe=i.DatePipe;var o=n(93);e.JsonPipe=o.JsonPipe;var s=n(94);e.SlicePipe=s.SlicePipe;var a=n(95);e.LowerCasePipe=a.LowerCasePipe;var u=n(96);e.NumberPipe=u.NumberPipe,e.DecimalPipe=u.DecimalPipe,e.PercentPipe=u.PercentPipe,e.CurrencyPipe=u.CurrencyPipe;var c=n(97);e.UpperCasePipe=c.UpperCasePipe;var p=n(98);e.ReplacePipe=p.ReplacePipe;var l=n(99);e.I18nPluralPipe=l.I18nPluralPipe;var h=n(100);e.I18nSelectPipe=h.I18nSelectPipe;var f=n(101);e.COMMON_PIPES=f.COMMON_PIPES},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=n(40),a=n(2),u=n(90),c=function(){function t(){}return t.prototype.createSubscription=function(t,e){return s.ObservableWrapper.subscribe(t,e,function(t){throw t})},t.prototype.dispose=function(t){s.ObservableWrapper.dispose(t)},t.prototype.onDestroy=function(t){s.ObservableWrapper.dispose(t)},t}(),p=function(){function t(){}return t.prototype.createSubscription=function(t,e){return t.then(e)},t.prototype.dispose=function(t){},t.prototype.onDestroy=function(t){},t}(),l=new p,h=new c,f=function(){function t(t){this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null,this._strategy=null,this._ref=t}return t.prototype.ngOnDestroy=function(){o.isPresent(this._subscription)&&this._dispose()},t.prototype.transform=function(t){return o.isBlank(this._obj)?(o.isPresent(t)&&this._subscribe(t),this._latestReturnedValue=this._latestValue,this._latestValue):t!==this._obj?(this._dispose(),this.transform(t)):this._latestValue===this._latestReturnedValue?this._latestReturnedValue:(this._latestReturnedValue=this._latestValue,a.WrappedValue.wrap(this._latestValue))},t.prototype._subscribe=function(t){var e=this;this._obj=t,this._strategy=this._selectStrategy(t),this._subscription=this._strategy.createSubscription(t,function(n){return e._updateLatestValue(t,n)})},t.prototype._selectStrategy=function(e){if(o.isPromise(e))return l;if(s.ObservableWrapper.isObservable(e))return h;throw new u.InvalidPipeArgumentException(t,e)},t.prototype._dispose=function(){this._strategy.dispose(this._subscription),this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null},t.prototype._updateLatestValue=function(t,e){t===this._obj&&(this._latestValue=e,this._ref.markForCheck())},t=r([a.Pipe({name:"async",pure:!1}),a.Injectable(),i("design:paramtypes",[a.ChangeDetectorRef])],t)}();e.AsyncPipe=f},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=n(5),o=n(12),s=function(t){function e(e,n){t.call(this,"Invalid argument '"+n+"' for pipe '"+i.stringify(e)+"'")}return r(e,t),e}(o.BaseException);e.InvalidPipeArgumentException=s},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=n(92),a=n(2),u=n(15),c=n(90),p="en-US",l=function(){function t(){}return t.prototype.transform=function(e,n){if(void 0===n&&(n="mediumDate"),o.isBlank(e))return null;if(!this.supports(e))throw new c.InvalidPipeArgumentException(t,e);return o.isNumber(e)&&(e=o.DateWrapper.fromMillis(e)),u.StringMapWrapper.contains(t._ALIASES,n)&&(n=u.StringMapWrapper.get(t._ALIASES,n)),s.DateFormatter.format(e,p,n)},t.prototype.supports=function(t){return o.isDate(t)||o.isNumber(t)},t._ALIASES={medium:"yMMMdjms","short":"yMdjm",fullDate:"yMMMMEEEEd",longDate:"yMMMMd",mediumDate:"yMMMd",shortDate:"yMd",mediumTime:"jms",shortTime:"jm"},t=r([o.CONST(),a.Pipe({name:"date",pure:!0}),a.Injectable(),i("design:paramtypes",[])],t)}();e.DatePipe=l},function(t,e){"use strict";function n(t){return 2==t?"2-digit":"numeric"}function r(t){return 4>t?"short":"long"}function i(t){for(var e,i={},o=0;o=3?i.month=r(s):i.month=n(s);break;case"d":i.day=n(s);break;case"E":i.weekday=r(s);break;case"j":i.hour=n(s);break;case"h":i.hour=n(s),i.hour12=!0;break;case"H":i.hour=n(s),i.hour12=!1;break;case"m":i.minute=n(s);break;case"s":i.second=n(s);break;case"z":i.timeZoneName="long";break;case"Z":i.timeZoneName="short"}o=e}return i}!function(t){t[t.Decimal=0]="Decimal",t[t.Percent=1]="Percent",t[t.Currency=2]="Currency"}(e.NumberFormatStyle||(e.NumberFormatStyle={}));var o=e.NumberFormatStyle,s=function(){function t(){}return t.format=function(t,e,n,r){var i=void 0===r?{}:r,s=i.minimumIntegerDigits,a=void 0===s?1:s,u=i.minimumFractionDigits,c=void 0===u?0:u,p=i.maximumFractionDigits,l=void 0===p?3:p,h=i.currency,f=i.currencyAsSymbol,d=void 0===f?!1:f,v={minimumIntegerDigits:a,minimumFractionDigits:c,maximumFractionDigits:l};return v.style=o[n].toLowerCase(),n==o.Currency&&(v.currency=h,v.currencyDisplay=d?"symbol":"code"),new Intl.NumberFormat(e,v).format(t)},t}();e.NumberFormatter=s;var a=new Map,u=function(){function t(){}return t.format=function(t,e,n){var r=e+n;if(a.has(r))return a.get(r).format(t);var o=new Intl.DateTimeFormat(e,i(n));return a.set(r,o),o.format(t)},t}();e.DateFormatter=u},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=n(2),a=function(){function t(){}return t.prototype.transform=function(t){return o.Json.stringify(t)},t=r([o.CONST(),s.Pipe({name:"json",pure:!1}),s.Injectable(),i("design:paramtypes",[])],t)}();e.JsonPipe=a},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=n(15),a=n(2),u=n(90),c=function(){function t(){}return t.prototype.transform=function(e,n,r){if(void 0===r&&(r=null),!this.supports(e))throw new u.InvalidPipeArgumentException(t,e);return o.isBlank(e)?e:o.isString(e)?o.StringWrapper.slice(e,n,r):s.ListWrapper.slice(e,n,r)},t.prototype.supports=function(t){return o.isString(t)||o.isArray(t)},t=r([a.Pipe({name:"slice",pure:!1}),a.Injectable(),i("design:paramtypes",[])],t)}();e.SlicePipe=c},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=n(2),a=n(90),u=function(){function t(){}return t.prototype.transform=function(e){if(o.isBlank(e))return e;if(!o.isString(e))throw new a.InvalidPipeArgumentException(t,e);return e.toLowerCase()},t=r([o.CONST(),s.Pipe({name:"lowercase"}),s.Injectable(),i("design:paramtypes",[])],t)}();e.LowerCasePipe=u},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(5),a=n(12),u=n(92),c=n(2),p=n(90),l="en-US",h=s.RegExpWrapper.create("^(\\d+)?\\.((\\d+)(\\-(\\d+))?)?$"),f=function(){function t(){}return t._format=function(e,n,r,i,o){if(void 0===i&&(i=null),void 0===o&&(o=!1),s.isBlank(e))return null;if(!s.isNumber(e))throw new p.InvalidPipeArgumentException(t,e);var c=1,f=0,d=3;if(s.isPresent(r)){var v=s.RegExpWrapper.firstMatch(h,r);if(s.isBlank(v))throw new a.BaseException(r+" is not a valid digit info for number pipes");s.isPresent(v[1])&&(c=s.NumberWrapper.parseIntAutoRadix(v[1])),s.isPresent(v[3])&&(f=s.NumberWrapper.parseIntAutoRadix(v[3])),s.isPresent(v[5])&&(d=s.NumberWrapper.parseIntAutoRadix(v[5]))}return u.NumberFormatter.format(e,l,n,{minimumIntegerDigits:c,minimumFractionDigits:f,maximumFractionDigits:d,currency:i,currencyAsSymbol:o})},t=i([s.CONST(),c.Injectable(),o("design:paramtypes",[])],t)}();e.NumberPipe=f;var d=function(t){function e(){t.apply(this,arguments)}return r(e,t),e.prototype.transform=function(t,e){return void 0===e&&(e=null),f._format(t,u.NumberFormatStyle.Decimal,e)},e=i([s.CONST(),c.Pipe({name:"number"}),c.Injectable(),o("design:paramtypes",[])],e)}(f);e.DecimalPipe=d;var v=function(t){function e(){t.apply(this,arguments)}return r(e,t),e.prototype.transform=function(t,e){return void 0===e&&(e=null),f._format(t,u.NumberFormatStyle.Percent,e)},e=i([s.CONST(),c.Pipe({name:"percent"}),c.Injectable(),o("design:paramtypes",[])],e)}(f);e.PercentPipe=v;var y=function(t){function e(){t.apply(this,arguments)}return r(e,t),e.prototype.transform=function(t,e,n,r){return void 0===e&&(e="USD"),void 0===n&&(n=!1),void 0===r&&(r=null),f._format(t,u.NumberFormatStyle.Currency,r,e,n)},e=i([s.CONST(),c.Pipe({name:"currency"}),c.Injectable(),o("design:paramtypes",[])],e)}(f);e.CurrencyPipe=y},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=n(2),a=n(90),u=function(){function t(){}return t.prototype.transform=function(e){if(o.isBlank(e))return e;if(!o.isString(e))throw new a.InvalidPipeArgumentException(t,e);return e.toUpperCase()},t=r([o.CONST(),s.Pipe({name:"uppercase"}),s.Injectable(),i("design:paramtypes",[])],t)}();e.UpperCasePipe=u},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=n(2),a=n(90),u=function(){function t(){}return t.prototype.transform=function(e,n,r){if(o.isBlank(e))return e;if(!this._supportedInput(e))throw new a.InvalidPipeArgumentException(t,e);var i=e.toString();if(!this._supportedPattern(n))throw new a.InvalidPipeArgumentException(t,n);if(!this._supportedReplacement(r))throw new a.InvalidPipeArgumentException(t,r);if(o.isFunction(r)){var s=o.isString(n)?o.RegExpWrapper.create(n):n;return o.StringWrapper.replaceAllMapped(i,s,r)}return n instanceof RegExp?o.StringWrapper.replaceAll(i,n,r):o.StringWrapper.replace(i,n,r)},t.prototype._supportedInput=function(t){return o.isString(t)||o.isNumber(t)},t.prototype._supportedPattern=function(t){return o.isString(t)||t instanceof RegExp},t.prototype._supportedReplacement=function(t){return o.isString(t)||o.isFunction(t)},t=r([s.Pipe({name:"replace"}),s.Injectable(),i("design:paramtypes",[])],t)}();e.ReplacePipe=u},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=n(2),a=n(90),u=o.RegExpWrapper.create("#"),c=function(){function t(){}return t.prototype.transform=function(e,n){var r,i;if(!o.isStringMap(n))throw new a.InvalidPipeArgumentException(t,n);return r=0===e||1===e?"="+e:"other",i=o.isPresent(e)?e.toString():"",o.StringWrapper.replaceAll(n[r],u,i)},t=r([o.CONST(),s.Pipe({name:"i18nPlural",pure:!0}),s.Injectable(),i("design:paramtypes",[])],t)}();e.I18nPluralPipe=c},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=n(15),a=n(2),u=n(90),c=function(){function t(){}return t.prototype.transform=function(e,n){if(!o.isStringMap(n))throw new u.InvalidPipeArgumentException(t,n);return s.StringMapWrapper.contains(n,e)?n[e]:n.other},t=r([o.CONST(),a.Pipe({name:"i18nSelect",pure:!0}),a.Injectable(),i("design:paramtypes",[])],t)}();e.I18nSelectPipe=c},function(t,e,n){"use strict";var r=n(89),i=n(97),o=n(95),s=n(93),a=n(94),u=n(91),c=n(96),p=n(98),l=n(99),h=n(100),f=n(5);e.COMMON_PIPES=f.CONST_EXPR([r.AsyncPipe,i.UpperCasePipe,o.LowerCasePipe,s.JsonPipe,a.SlicePipe,c.DecimalPipe,c.PercentPipe,c.CurrencyPipe,u.DatePipe,p.ReplacePipe,l.I18nPluralPipe,h.I18nSelectPipe])},function(t,e,n){"use strict";function r(t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n])}var i=n(103);e.NgClass=i.NgClass;var o=n(104);e.NgFor=o.NgFor;var s=n(105);e.NgIf=s.NgIf;var a=n(106);e.NgTemplateOutlet=a.NgTemplateOutlet;var u=n(107);e.NgStyle=u.NgStyle;var c=n(108);e.NgSwitch=c.NgSwitch,e.NgSwitchWhen=c.NgSwitchWhen,e.NgSwitchDefault=c.NgSwitchDefault;var p=n(109);e.NgPlural=p.NgPlural,e.NgPluralCase=p.NgPluralCase,e.NgLocalization=p.NgLocalization,r(n(110));var l=n(111);e.CORE_DIRECTIVES=l.CORE_DIRECTIVES},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=n(2),a=n(15),u=function(){function t(t,e,n,r){this._iterableDiffers=t,this._keyValueDiffers=e,this._ngEl=n,this._renderer=r,this._initialClasses=[]}return Object.defineProperty(t.prototype,"initialClasses",{set:function(t){this._applyInitialClasses(!0),this._initialClasses=o.isPresent(t)&&o.isString(t)?t.split(" "):[],this._applyInitialClasses(!1),this._applyClasses(this._rawClass,!1)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"rawClass",{set:function(t){this._cleanupClasses(this._rawClass),o.isString(t)&&(t=t.split(" ")),this._rawClass=t,this._iterableDiffer=null,this._keyValueDiffer=null,o.isPresent(t)&&(a.isListLikeIterable(t)?this._iterableDiffer=this._iterableDiffers.find(t).create(null):this._keyValueDiffer=this._keyValueDiffers.find(t).create(null))},enumerable:!0,configurable:!0}),t.prototype.ngDoCheck=function(){if(o.isPresent(this._iterableDiffer)){var t=this._iterableDiffer.diff(this._rawClass);o.isPresent(t)&&this._applyIterableChanges(t)}if(o.isPresent(this._keyValueDiffer)){var t=this._keyValueDiffer.diff(this._rawClass);o.isPresent(t)&&this._applyKeyValueChanges(t)}},t.prototype.ngOnDestroy=function(){this._cleanupClasses(this._rawClass)},t.prototype._cleanupClasses=function(t){this._applyClasses(t,!0),this._applyInitialClasses(!1)},t.prototype._applyKeyValueChanges=function(t){var e=this;t.forEachAddedItem(function(t){e._toggleClass(t.key,t.currentValue)}),t.forEachChangedItem(function(t){e._toggleClass(t.key,t.currentValue)}),t.forEachRemovedItem(function(t){t.previousValue&&e._toggleClass(t.key,!1)})},t.prototype._applyIterableChanges=function(t){var e=this;t.forEachAddedItem(function(t){e._toggleClass(t.item,!0)}),t.forEachRemovedItem(function(t){e._toggleClass(t.item,!1)})},t.prototype._applyInitialClasses=function(t){var e=this;this._initialClasses.forEach(function(n){return e._toggleClass(n,!t)})},t.prototype._applyClasses=function(t,e){var n=this;o.isPresent(t)&&(o.isArray(t)?t.forEach(function(t){return n._toggleClass(t,!e)}):t instanceof Set?t.forEach(function(t){return n._toggleClass(t,!e)}):a.StringMapWrapper.forEach(t,function(t,r){o.isPresent(t)&&n._toggleClass(r,!e)}))},t.prototype._toggleClass=function(t,e){if(t=t.trim(),t.length>0)if(t.indexOf(" ")>-1)for(var n=t.split(/\s+/g),r=0,i=n.length;i>r;r++)this._renderer.setElementClass(this._ngEl.nativeElement,n[r],e);else this._renderer.setElementClass(this._ngEl.nativeElement,t,e)},t=r([s.Directive({selector:"[ngClass]",inputs:["rawClass: ngClass","initialClasses: class"]}),i("design:paramtypes",[s.IterableDiffers,s.KeyValueDiffers,s.ElementRef,s.Renderer])],t)}();e.NgClass=u},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(2),s=n(5),a=n(12),u=function(){function t(t,e,n,r){this._viewContainer=t,this._templateRef=e,this._iterableDiffers=n,this._cdr=r}return Object.defineProperty(t.prototype,"ngForOf",{ +set:function(t){if(this._ngForOf=t,s.isBlank(this._differ)&&s.isPresent(t))try{this._differ=this._iterableDiffers.find(t).create(this._cdr,this._ngForTrackBy)}catch(e){throw new a.BaseException("Cannot find a differ supporting object '"+t+"' of type '"+s.getTypeNameForDebugging(t)+"'. NgFor only supports binding to Iterables such as Arrays.")}},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngForTemplate",{set:function(t){s.isPresent(t)&&(this._templateRef=t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngForTrackBy",{set:function(t){this._ngForTrackBy=t},enumerable:!0,configurable:!0}),t.prototype.ngDoCheck=function(){if(s.isPresent(this._differ)){var t=this._differ.diff(this._ngForOf);s.isPresent(t)&&this._applyChanges(t)}},t.prototype._applyChanges=function(t){var e=this,n=[];t.forEachRemovedItem(function(t){return n.push(new c(t,null))}),t.forEachMovedItem(function(t){return n.push(new c(t,null))});var r=this._bulkRemove(n);t.forEachAddedItem(function(t){return r.push(new c(t,null))}),this._bulkInsert(r);for(var i=0;ii;i++){var s=this._viewContainer.get(i);s.setLocal("first",0===i),s.setLocal("last",i===o-1)}t.forEachIdentityChange(function(t){var n=e._viewContainer.get(t.currentIndex);n.setLocal("$implicit",t.item)})},t.prototype._perViewChange=function(t,e){t.setLocal("$implicit",e.item),t.setLocal("index",e.currentIndex),t.setLocal("even",e.currentIndex%2==0),t.setLocal("odd",e.currentIndex%2==1)},t.prototype._bulkRemove=function(t){t.sort(function(t,e){return t.record.previousIndex-e.record.previousIndex});for(var e=[],n=t.length-1;n>=0;n--){var r=t[n];s.isPresent(r.record.currentIndex)?(r.view=this._viewContainer.detach(r.record.previousIndex),e.push(r)):this._viewContainer.remove(r.record.previousIndex)}return e},t.prototype._bulkInsert=function(t){t.sort(function(t,e){return t.record.currentIndex-e.record.currentIndex});for(var e=0;eo?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(2),s=n(5),a=function(){function t(t,e){this._viewContainer=t,this._templateRef=e,this._prevCondition=null}return Object.defineProperty(t.prototype,"ngIf",{set:function(t){!t||!s.isBlank(this._prevCondition)&&this._prevCondition?t||!s.isBlank(this._prevCondition)&&!this._prevCondition||(this._prevCondition=!1,this._viewContainer.clear()):(this._prevCondition=!0,this._viewContainer.createEmbeddedView(this._templateRef))},enumerable:!0,configurable:!0}),t=r([o.Directive({selector:"[ngIf]",inputs:["ngIf"]}),i("design:paramtypes",[o.ViewContainerRef,o.TemplateRef])],t)}();e.NgIf=a},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(2),s=n(5),a=function(){function t(t){this._viewContainerRef=t}return Object.defineProperty(t.prototype,"ngTemplateOutlet",{set:function(t){s.isPresent(this._insertedViewRef)&&this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._insertedViewRef)),s.isPresent(t)&&(this._insertedViewRef=this._viewContainerRef.createEmbeddedView(t))},enumerable:!0,configurable:!0}),r([o.Input(),i("design:type",o.TemplateRef),i("design:paramtypes",[o.TemplateRef])],t.prototype,"ngTemplateOutlet",null),t=r([o.Directive({selector:"[ngTemplateOutlet]"}),i("design:paramtypes",[o.ViewContainerRef])],t)}();e.NgTemplateOutlet=a},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(2),s=n(5),a=function(){function t(t,e,n){this._differs=t,this._ngEl=e,this._renderer=n}return Object.defineProperty(t.prototype,"rawStyle",{set:function(t){this._rawStyle=t,s.isBlank(this._differ)&&s.isPresent(t)&&(this._differ=this._differs.find(this._rawStyle).create(null))},enumerable:!0,configurable:!0}),t.prototype.ngDoCheck=function(){if(s.isPresent(this._differ)){var t=this._differ.diff(this._rawStyle);s.isPresent(t)&&this._applyChanges(t)}},t.prototype._applyChanges=function(t){var e=this;t.forEachAddedItem(function(t){e._setStyle(t.key,t.currentValue)}),t.forEachChangedItem(function(t){e._setStyle(t.key,t.currentValue)}),t.forEachRemovedItem(function(t){e._setStyle(t.key,null)})},t.prototype._setStyle=function(t,e){this._renderer.setElementStyle(this._ngEl.nativeElement,t,e)},t=r([o.Directive({selector:"[ngStyle]",inputs:["rawStyle: ngStyle"]}),i("design:paramtypes",[o.KeyValueDiffers,o.ElementRef,o.Renderer])],t)}();e.NgStyle=a},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},s=n(2),a=n(5),u=n(15),c=a.CONST_EXPR(new Object),p=function(){function t(t,e){this._viewContainerRef=t,this._templateRef=e}return t.prototype.create=function(){this._viewContainerRef.createEmbeddedView(this._templateRef)},t.prototype.destroy=function(){this._viewContainerRef.clear()},t}();e.SwitchView=p;var l=function(){function t(){this._useDefault=!1,this._valueViews=new u.Map,this._activeViews=[]}return Object.defineProperty(t.prototype,"ngSwitch",{set:function(t){this._emptyAllActiveViews(),this._useDefault=!1;var e=this._valueViews.get(t);a.isBlank(e)&&(this._useDefault=!0,e=a.normalizeBlank(this._valueViews.get(c))),this._activateViews(e),this._switchValue=t},enumerable:!0,configurable:!0}),t.prototype._onWhenValueChanged=function(t,e,n){this._deregisterView(t,n),this._registerView(e,n),t===this._switchValue?(n.destroy(),u.ListWrapper.remove(this._activeViews,n)):e===this._switchValue&&(this._useDefault&&(this._useDefault=!1,this._emptyAllActiveViews()),n.create(),this._activeViews.push(n)),0!==this._activeViews.length||this._useDefault||(this._useDefault=!0,this._activateViews(this._valueViews.get(c)))},t.prototype._emptyAllActiveViews=function(){for(var t=this._activeViews,e=0;eo?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},s=n(2),a=n(5),u=n(15),c=n(108),p="other",l=function(){function t(){}return t}();e.NgLocalization=l;var h=function(){function t(t,e,n){this.value=t,this._view=new c.SwitchView(n,e)}return t=r([s.Directive({selector:"[ngPluralCase]"}),o(0,s.Attribute("ngPluralCase")),i("design:paramtypes",[String,s.TemplateRef,s.ViewContainerRef])],t)}();e.NgPluralCase=h;var f=function(){function t(t){this._localization=t,this._caseViews=new u.Map,this.cases=null}return Object.defineProperty(t.prototype,"ngPlural",{set:function(t){this._switchValue=t,this._updateView()},enumerable:!0,configurable:!0}),t.prototype.ngAfterContentInit=function(){var t=this;this.cases.forEach(function(e){t._caseViews.set(t._formatValue(e),e._view)}),this._updateView()},t.prototype._updateView=function(){this._clearViews();var t=this._caseViews.get(this._switchValue);a.isPresent(t)||(t=this._getCategoryView(this._switchValue)),this._activateView(t)},t.prototype._clearViews=function(){a.isPresent(this._activeView)&&this._activeView.destroy()},t.prototype._activateView=function(t){a.isPresent(t)&&(this._activeView=t,this._activeView.create())},t.prototype._getCategoryView=function(t){var e=this._localization.getPluralCategory(t),n=this._caseViews.get(e);return a.isPresent(n)?n:this._caseViews.get(p)},t.prototype._isValueView=function(t){return"="===t.value[0]},t.prototype._formatValue=function(t){return this._isValueView(t)?this._stripValue(t.value):t.value},t.prototype._stripValue=function(t){return a.NumberWrapper.parseInt(t.substring(1),10)},r([s.ContentChildren(h),i("design:type",s.QueryList)],t.prototype,"cases",void 0),r([s.Input(),i("design:type",Number),i("design:paramtypes",[Number])],t.prototype,"ngPlural",null),t=r([s.Directive({selector:"[ngPlural]"}),i("design:paramtypes",[l])],t)}();e.NgPlural=f},function(t,e){"use strict"},function(t,e,n){"use strict";var r=n(5),i=n(103),o=n(104),s=n(105),a=n(106),u=n(107),c=n(108),p=n(109);e.CORE_DIRECTIVES=r.CONST_EXPR([i.NgClass,o.NgFor,s.NgIf,a.NgTemplateOutlet,u.NgStyle,c.NgSwitch,c.NgSwitchWhen,c.NgSwitchDefault,p.NgPlural,p.NgPluralCase])},function(t,e,n){"use strict";var r=n(113);e.AbstractControl=r.AbstractControl,e.Control=r.Control,e.ControlGroup=r.ControlGroup,e.ControlArray=r.ControlArray;var i=n(114);e.AbstractControlDirective=i.AbstractControlDirective;var o=n(115);e.ControlContainer=o.ControlContainer;var s=n(116);e.NgControlName=s.NgControlName;var a=n(127);e.NgFormControl=a.NgFormControl;var u=n(128);e.NgModel=u.NgModel;var c=n(117);e.NgControl=c.NgControl;var p=n(129);e.NgControlGroup=p.NgControlGroup;var l=n(130);e.NgFormModel=l.NgFormModel;var h=n(131);e.NgForm=h.NgForm;var f=n(118);e.NG_VALUE_ACCESSOR=f.NG_VALUE_ACCESSOR;var d=n(121);e.DefaultValueAccessor=d.DefaultValueAccessor;var v=n(132);e.NgControlStatus=v.NgControlStatus;var y=n(123);e.CheckboxControlValueAccessor=y.CheckboxControlValueAccessor;var m=n(124);e.NgSelectOption=m.NgSelectOption,e.SelectControlValueAccessor=m.SelectControlValueAccessor;var g=n(133);e.FORM_DIRECTIVES=g.FORM_DIRECTIVES,e.RadioButtonState=g.RadioButtonState;var _=n(120);e.NG_VALIDATORS=_.NG_VALIDATORS,e.NG_ASYNC_VALIDATORS=_.NG_ASYNC_VALIDATORS,e.Validators=_.Validators;var b=n(134);e.RequiredValidator=b.RequiredValidator,e.MinLengthValidator=b.MinLengthValidator,e.MaxLengthValidator=b.MaxLengthValidator,e.PatternValidator=b.PatternValidator;var P=n(135);e.FormBuilder=P.FormBuilder;var E=n(135),w=n(125),C=n(5);e.FORM_PROVIDERS=C.CONST_EXPR([E.FormBuilder,w.RadioControlRegistry]),e.FORM_BINDINGS=e.FORM_PROVIDERS},function(t,e,n){"use strict";function r(t){return t instanceof l}function i(t,e){return a.isBlank(e)?null:(e instanceof Array||(e=e.split("/")),e instanceof Array&&p.ListWrapper.isEmpty(e)?null:e.reduce(function(t,e){if(t instanceof f)return a.isPresent(t.controls[e])?t.controls[e]:null;if(t instanceof d){var n=e;return a.isPresent(t.at(n))?t.at(n):null}return null},t))}function o(t){return c.PromiseWrapper.isPromise(t)?u.ObservableWrapper.fromPromise(t):t}var s=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},a=n(5),u=n(40),c=n(41),p=n(15);e.VALID="VALID",e.INVALID="INVALID",e.PENDING="PENDING",e.isControl=r;var l=function(){function t(t,e){this.validator=t,this.asyncValidator=e,this._pristine=!0,this._touched=!1}return Object.defineProperty(t.prototype,"value",{get:function(){return this._value},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"status",{get:function(){return this._status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"valid",{get:function(){return this._status===e.VALID},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"errors",{get:function(){return this._errors},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"pristine",{get:function(){return this._pristine},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dirty",{get:function(){return!this.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"touched",{get:function(){return this._touched},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"untouched",{get:function(){return!this._touched},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"valueChanges",{get:function(){return this._valueChanges},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"statusChanges",{get:function(){return this._statusChanges},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"pending",{get:function(){return this._status==e.PENDING},enumerable:!0,configurable:!0}),t.prototype.markAsTouched=function(){this._touched=!0},t.prototype.markAsDirty=function(t){var e=(void 0===t?{}:t).onlySelf;e=a.normalizeBool(e),this._pristine=!1,a.isPresent(this._parent)&&!e&&this._parent.markAsDirty({onlySelf:e})},t.prototype.markAsPending=function(t){var n=(void 0===t?{}:t).onlySelf;n=a.normalizeBool(n),this._status=e.PENDING,a.isPresent(this._parent)&&!n&&this._parent.markAsPending({onlySelf:n})},t.prototype.setParent=function(t){this._parent=t},t.prototype.updateValueAndValidity=function(t){var n=void 0===t?{}:t,r=n.onlySelf,i=n.emitEvent;r=a.normalizeBool(r),i=a.isPresent(i)?i:!0,this._updateValue(),this._errors=this._runValidator(),this._status=this._calculateStatus(),(this._status==e.VALID||this._status==e.PENDING)&&this._runAsyncValidator(i),i&&(u.ObservableWrapper.callEmit(this._valueChanges,this._value),u.ObservableWrapper.callEmit(this._statusChanges,this._status)),a.isPresent(this._parent)&&!r&&this._parent.updateValueAndValidity({onlySelf:r,emitEvent:i})},t.prototype._runValidator=function(){return a.isPresent(this.validator)?this.validator(this):null},t.prototype._runAsyncValidator=function(t){var n=this;if(a.isPresent(this.asyncValidator)){this._status=e.PENDING,this._cancelExistingSubscription();var r=o(this.asyncValidator(this));this._asyncValidationSubscription=u.ObservableWrapper.subscribe(r,function(e){return n.setErrors(e,{emitEvent:t})})}},t.prototype._cancelExistingSubscription=function(){a.isPresent(this._asyncValidationSubscription)&&u.ObservableWrapper.dispose(this._asyncValidationSubscription)},t.prototype.setErrors=function(t,e){var n=(void 0===e?{}:e).emitEvent;n=a.isPresent(n)?n:!0,this._errors=t,this._status=this._calculateStatus(),n&&u.ObservableWrapper.callEmit(this._statusChanges,this._status),a.isPresent(this._parent)&&this._parent._updateControlsErrors()},t.prototype.find=function(t){return i(this,t)},t.prototype.getError=function(t,e){void 0===e&&(e=null);var n=a.isPresent(e)&&!p.ListWrapper.isEmpty(e)?this.find(e):this;return a.isPresent(n)&&a.isPresent(n._errors)?p.StringMapWrapper.get(n._errors,t):null},t.prototype.hasError=function(t,e){return void 0===e&&(e=null),a.isPresent(this.getError(t,e))},Object.defineProperty(t.prototype,"root",{get:function(){for(var t=this;a.isPresent(t._parent);)t=t._parent;return t},enumerable:!0,configurable:!0}),t.prototype._updateControlsErrors=function(){this._status=this._calculateStatus(),a.isPresent(this._parent)&&this._parent._updateControlsErrors()},t.prototype._initObservables=function(){this._valueChanges=new u.EventEmitter,this._statusChanges=new u.EventEmitter},t.prototype._calculateStatus=function(){return a.isPresent(this._errors)?e.INVALID:this._anyControlsHaveStatus(e.PENDING)?e.PENDING:this._anyControlsHaveStatus(e.INVALID)?e.INVALID:e.VALID},t}();e.AbstractControl=l;var h=function(t){function e(e,n,r){void 0===e&&(e=null),void 0===n&&(n=null),void 0===r&&(r=null),t.call(this,n,r),this._value=e,this.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),this._initObservables()}return s(e,t),e.prototype.updateValue=function(t,e){var n=void 0===e?{}:e,r=n.onlySelf,i=n.emitEvent,o=n.emitModelToViewChange;o=a.isPresent(o)?o:!0,this._value=t,a.isPresent(this._onChange)&&o&&this._onChange(this._value),this.updateValueAndValidity({onlySelf:r,emitEvent:i})},e.prototype._updateValue=function(){},e.prototype._anyControlsHaveStatus=function(t){return!1},e.prototype.registerOnChange=function(t){this._onChange=t},e}(l);e.Control=h;var f=function(t){function e(e,n,r,i){void 0===n&&(n=null),void 0===r&&(r=null),void 0===i&&(i=null),t.call(this,r,i),this.controls=e,this._optionals=a.isPresent(n)?n:{},this._initObservables(),this._setParentForControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!1})}return s(e,t),e.prototype.addControl=function(t,e){this.controls[t]=e,e.setParent(this)},e.prototype.removeControl=function(t){p.StringMapWrapper["delete"](this.controls,t)},e.prototype.include=function(t){p.StringMapWrapper.set(this._optionals,t,!0),this.updateValueAndValidity()},e.prototype.exclude=function(t){p.StringMapWrapper.set(this._optionals,t,!1),this.updateValueAndValidity()},e.prototype.contains=function(t){var e=p.StringMapWrapper.contains(this.controls,t);return e&&this._included(t)},e.prototype._setParentForControls=function(){var t=this;p.StringMapWrapper.forEach(this.controls,function(e,n){e.setParent(t)})},e.prototype._updateValue=function(){this._value=this._reduceValue()},e.prototype._anyControlsHaveStatus=function(t){var e=this,n=!1;return p.StringMapWrapper.forEach(this.controls,function(r,i){n=n||e.contains(i)&&r.status==t}),n},e.prototype._reduceValue=function(){return this._reduceChildren({},function(t,e,n){return t[n]=e.value,t})},e.prototype._reduceChildren=function(t,e){var n=this,r=t;return p.StringMapWrapper.forEach(this.controls,function(t,i){n._included(i)&&(r=e(r,t,i))}),r},e.prototype._included=function(t){var e=p.StringMapWrapper.contains(this._optionals,t);return!e||p.StringMapWrapper.get(this._optionals,t)},e}(l);e.ControlGroup=f;var d=function(t){function e(e,n,r){void 0===n&&(n=null),void 0===r&&(r=null),t.call(this,n,r),this.controls=e,this._initObservables(),this._setParentForControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!1})}return s(e,t),e.prototype.at=function(t){return this.controls[t]},e.prototype.push=function(t){this.controls.push(t),t.setParent(this),this.updateValueAndValidity()},e.prototype.insert=function(t,e){p.ListWrapper.insert(this.controls,t,e),e.setParent(this),this.updateValueAndValidity()},e.prototype.removeAt=function(t){p.ListWrapper.removeAt(this.controls,t),this.updateValueAndValidity()},Object.defineProperty(e.prototype,"length",{get:function(){return this.controls.length},enumerable:!0,configurable:!0}),e.prototype._updateValue=function(){this._value=this.controls.map(function(t){return t.value})},e.prototype._anyControlsHaveStatus=function(t){return this.controls.some(function(e){return e.status==t})},e.prototype._setParentForControls=function(){var t=this;this.controls.forEach(function(e){e.setParent(t)})},e}(l);e.ControlArray=d},function(t,e,n){"use strict";var r=n(5),i=n(12),o=function(){function t(){}return Object.defineProperty(t.prototype,"control",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"value",{get:function(){return r.isPresent(this.control)?this.control.value:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"valid",{get:function(){return r.isPresent(this.control)?this.control.valid:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"errors",{get:function(){return r.isPresent(this.control)?this.control.errors:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"pristine",{get:function(){return r.isPresent(this.control)?this.control.pristine:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dirty",{get:function(){return r.isPresent(this.control)?this.control.dirty:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"touched",{get:function(){return r.isPresent(this.control)?this.control.touched:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"untouched",{get:function(){return r.isPresent(this.control)?this.control.untouched:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),t}();e.AbstractControlDirective=o},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=n(114),o=function(t){function e(){t.apply(this,arguments)}return r(e,t),Object.defineProperty(e.prototype,"formDirective",{get:function(){return null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),e}(i.AbstractControlDirective);e.ControlContainer=o},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},a=n(5),u=n(40),c=n(2),p=n(115),l=n(117),h=n(118),f=n(119),d=n(120),v=a.CONST_EXPR(new c.Provider(l.NgControl,{useExisting:c.forwardRef(function(){return y})})),y=function(t){function e(e,n,r,i){t.call(this),this._parent=e,this._validators=n,this._asyncValidators=r,this.update=new u.EventEmitter,this._added=!1,this.valueAccessor=f.selectValueAccessor(this,i)}return r(e,t),e.prototype.ngOnChanges=function(t){this._added||(this.formDirective.addControl(this),this._added=!0),f.isPropertyUpdated(t,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))},e.prototype.ngOnDestroy=function(){this.formDirective.removeControl(this)},e.prototype.viewToModelUpdate=function(t){this.viewModel=t,u.ObservableWrapper.callEmit(this.update,t)},Object.defineProperty(e.prototype,"path",{get:function(){return f.controlPath(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formDirective",{get:function(){return this._parent.formDirective},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"validator",{get:function(){return f.composeValidators(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return f.composeAsyncValidators(this._asyncValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"control",{get:function(){return this.formDirective.getControl(this)},enumerable:!0,configurable:!0}),e=i([c.Directive({selector:"[ngControl]",bindings:[v],inputs:["name: ngControl","model: ngModel"],outputs:["update: ngModelChange"],exportAs:"ngForm"}),s(0,c.Host()),s(0,c.SkipSelf()),s(1,c.Optional()),s(1,c.Self()),s(1,c.Inject(d.NG_VALIDATORS)),s(2,c.Optional()),s(2,c.Self()),s(2,c.Inject(d.NG_ASYNC_VALIDATORS)),s(3,c.Optional()),s(3,c.Self()),s(3,c.Inject(h.NG_VALUE_ACCESSOR)),o("design:paramtypes",[p.ControlContainer,Array,Array,Array])],e)}(l.NgControl);e.NgControlName=y},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=n(114),o=n(12),s=function(t){function e(){t.apply(this,arguments),this.name=null,this.valueAccessor=null}return r(e,t),Object.defineProperty(e.prototype,"validator",{get:function(){return o.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return o.unimplemented()},enumerable:!0,configurable:!0}),e}(i.AbstractControlDirective);e.NgControl=s},function(t,e,n){"use strict";var r=n(2),i=n(5);e.NG_VALUE_ACCESSOR=i.CONST_EXPR(new r.OpaqueToken("NgValueAccessor"))},function(t,e,n){"use strict";function r(t,e){var n=l.ListWrapper.clone(e.path);return n.push(t),n}function i(t,e){h.isBlank(t)&&s(e,"Cannot find control"),h.isBlank(e.valueAccessor)&&s(e,"No value accessor for"),t.validator=d.Validators.compose([t.validator,e.validator]),t.asyncValidator=d.Validators.composeAsync([t.asyncValidator,e.asyncValidator]),e.valueAccessor.writeValue(t.value),e.valueAccessor.registerOnChange(function(n){e.viewToModelUpdate(n),t.updateValue(n,{emitModelToViewChange:!1}),t.markAsDirty()}),t.registerOnChange(function(t){return e.valueAccessor.writeValue(t)}),e.valueAccessor.registerOnTouched(function(){return t.markAsTouched()})}function o(t,e){h.isBlank(t)&&s(e,"Cannot find control"),t.validator=d.Validators.compose([t.validator,e.validator]),t.asyncValidator=d.Validators.composeAsync([t.asyncValidator,e.asyncValidator])}function s(t,e){var n=t.path.join(" -> ");throw new f.BaseException(e+" '"+n+"'")}function a(t){return h.isPresent(t)?d.Validators.compose(t.map(b.normalizeValidator)):null}function u(t){return h.isPresent(t)?d.Validators.composeAsync(t.map(b.normalizeAsyncValidator)):null}function c(t,e){if(!l.StringMapWrapper.contains(t,"model"))return!1;var n=t.model;return n.isFirstChange()?!0:!h.looseIdentical(e,n.currentValue)}function p(t,e){if(h.isBlank(e))return null;var n,r,i;return e.forEach(function(e){h.hasConstructor(e,v.DefaultValueAccessor)?n=e:h.hasConstructor(e,m.CheckboxControlValueAccessor)||h.hasConstructor(e,y.NumberValueAccessor)||h.hasConstructor(e,g.SelectControlValueAccessor)||h.hasConstructor(e,_.RadioControlValueAccessor)?(h.isPresent(r)&&s(t,"More than one built-in value accessor matches"),r=e):(h.isPresent(i)&&s(t,"More than one custom value accessor matches"),i=e)}),h.isPresent(i)?i:h.isPresent(r)?r:h.isPresent(n)?n:(s(t,"No valid value accessor for"),null)}var l=n(15),h=n(5),f=n(12),d=n(120),v=n(121),y=n(122),m=n(123),g=n(124),_=n(125),b=n(126);e.controlPath=r,e.setUpControl=i,e.setUpControlGroup=o,e.composeValidators=a,e.composeAsyncValidators=u,e.isPropertyUpdated=c,e.selectValueAccessor=p},function(t,e,n){"use strict";function r(t){return u.PromiseWrapper.isPromise(t)?t:c.ObservableWrapper.toPromise(t)}function i(t,e){return e.map(function(e){return e(t)})}function o(t,e){return e.map(function(e){return e(t)})}function s(t){var e=t.reduce(function(t,e){return a.isPresent(e)?p.StringMapWrapper.merge(t,e):t},{});return p.StringMapWrapper.isEmpty(e)?null:e}var a=n(5),u=n(41),c=n(40),p=n(15),l=n(2);e.NG_VALIDATORS=a.CONST_EXPR(new l.OpaqueToken("NgValidators")),e.NG_ASYNC_VALIDATORS=a.CONST_EXPR(new l.OpaqueToken("NgAsyncValidators"));var h=function(){function t(){}return t.required=function(t){return a.isBlank(t.value)||a.isString(t.value)&&""==t.value?{required:!0}:null},t.minLength=function(e){return function(n){if(a.isPresent(t.required(n)))return null;var r=n.value;return r.lengthe?{maxlength:{requiredLength:e,actualLength:r.length}}:null}},t.pattern=function(e){return function(n){if(a.isPresent(t.required(n)))return null;var r=new RegExp("^"+e+"$"),i=n.value;return r.test(i)?null:{pattern:{requiredPattern:"^"+e+"$",actualValue:i}}}},t.nullValidator=function(t){return null},t.compose=function(t){if(a.isBlank(t))return null;var e=t.filter(a.isPresent);return 0==e.length?null:function(t){return s(i(t,e))}},t.composeAsync=function(t){if(a.isBlank(t))return null;var e=t.filter(a.isPresent);return 0==e.length?null:function(t){var n=o(t,e).map(r);return u.PromiseWrapper.all(n).then(s)}},t}();e.Validators=h},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(2),s=n(118),a=n(5),u=a.CONST_EXPR(new o.Provider(s.NG_VALUE_ACCESSOR,{useExisting:o.forwardRef(function(){return c}),multi:!0})),c=function(){function t(t,e){this._renderer=t,this._elementRef=e,this.onChange=function(t){},this.onTouched=function(){}}return t.prototype.writeValue=function(t){var e=a.isBlank(t)?"":t;this._renderer.setElementProperty(this._elementRef.nativeElement,"value",e)},t.prototype.registerOnChange=function(t){this.onChange=t},t.prototype.registerOnTouched=function(t){this.onTouched=t},t=r([o.Directive({selector:"input:not([type=checkbox])[ngControl],textarea[ngControl],input:not([type=checkbox])[ngFormControl],textarea[ngFormControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]", +host:{"(input)":"onChange($event.target.value)","(blur)":"onTouched()"},bindings:[u]}),i("design:paramtypes",[o.Renderer,o.ElementRef])],t)}();e.DefaultValueAccessor=c},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(2),s=n(118),a=n(5),u=a.CONST_EXPR(new o.Provider(s.NG_VALUE_ACCESSOR,{useExisting:o.forwardRef(function(){return c}),multi:!0})),c=function(){function t(t,e){this._renderer=t,this._elementRef=e,this.onChange=function(t){},this.onTouched=function(){}}return t.prototype.writeValue=function(t){this._renderer.setElementProperty(this._elementRef.nativeElement,"value",t)},t.prototype.registerOnChange=function(t){this.onChange=function(e){t(""==e?null:a.NumberWrapper.parseFloat(e))}},t.prototype.registerOnTouched=function(t){this.onTouched=t},t=r([o.Directive({selector:"input[type=number][ngControl],input[type=number][ngFormControl],input[type=number][ngModel]",host:{"(change)":"onChange($event.target.value)","(input)":"onChange($event.target.value)","(blur)":"onTouched()"},bindings:[u]}),i("design:paramtypes",[o.Renderer,o.ElementRef])],t)}();e.NumberValueAccessor=c},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(2),s=n(118),a=n(5),u=a.CONST_EXPR(new o.Provider(s.NG_VALUE_ACCESSOR,{useExisting:o.forwardRef(function(){return c}),multi:!0})),c=function(){function t(t,e){this._renderer=t,this._elementRef=e,this.onChange=function(t){},this.onTouched=function(){}}return t.prototype.writeValue=function(t){this._renderer.setElementProperty(this._elementRef.nativeElement,"checked",t)},t.prototype.registerOnChange=function(t){this.onChange=t},t.prototype.registerOnTouched=function(t){this.onTouched=t},t=r([o.Directive({selector:"input[type=checkbox][ngControl],input[type=checkbox][ngFormControl],input[type=checkbox][ngModel]",host:{"(change)":"onChange($event.target.checked)","(blur)":"onTouched()"},providers:[u]}),i("design:paramtypes",[o.Renderer,o.ElementRef])],t)}();e.CheckboxControlValueAccessor=c},function(t,e,n){"use strict";function r(t,e){return p.isBlank(t)?""+e:(p.isPrimitive(e)||(e="Object"),p.StringWrapper.slice(t+": "+e,0,50))}function i(t){return t.split(":")[0]}var o=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},s=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},a=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},u=n(2),c=n(118),p=n(5),l=n(15),h=p.CONST_EXPR(new u.Provider(c.NG_VALUE_ACCESSOR,{useExisting:u.forwardRef(function(){return f}),multi:!0})),f=function(){function t(t,e){this._renderer=t,this._elementRef=e,this._optionMap=new Map,this._idCounter=0,this.onChange=function(t){},this.onTouched=function(){}}return t.prototype.writeValue=function(t){this.value=t;var e=r(this._getOptionId(t),t);this._renderer.setElementProperty(this._elementRef.nativeElement,"value",e)},t.prototype.registerOnChange=function(t){var e=this;this.onChange=function(n){t(e._getOptionValue(n))}},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype._registerOption=function(){return(this._idCounter++).toString()},t.prototype._getOptionId=function(t){for(var e=0,n=l.MapWrapper.keys(this._optionMap);eo?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(2),s=n(118),a=n(117),u=n(5),c=n(15),p=u.CONST_EXPR(new o.Provider(s.NG_VALUE_ACCESSOR,{useExisting:o.forwardRef(function(){return f}),multi:!0})),l=function(){function t(){this._accessors=[]}return t.prototype.add=function(t,e){this._accessors.push([t,e])},t.prototype.remove=function(t){for(var e=-1,n=0;no?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},a=n(5),u=n(15),c=n(40),p=n(2),l=n(117),h=n(120),f=n(118),d=n(119),v=a.CONST_EXPR(new p.Provider(l.NgControl,{useExisting:p.forwardRef(function(){return y})})),y=function(t){function e(e,n,r){t.call(this),this._validators=e,this._asyncValidators=n,this.update=new c.EventEmitter,this.valueAccessor=d.selectValueAccessor(this,r)}return r(e,t),e.prototype.ngOnChanges=function(t){this._isControlChanged(t)&&(d.setUpControl(this.form,this),this.form.updateValueAndValidity({emitEvent:!1})),d.isPropertyUpdated(t,this.viewModel)&&(this.form.updateValue(this.model),this.viewModel=this.model)},Object.defineProperty(e.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"validator",{get:function(){return d.composeValidators(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return d.composeAsyncValidators(this._asyncValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),e.prototype.viewToModelUpdate=function(t){this.viewModel=t,c.ObservableWrapper.callEmit(this.update,t)},e.prototype._isControlChanged=function(t){return u.StringMapWrapper.contains(t,"form")},e=i([p.Directive({selector:"[ngFormControl]",bindings:[v],inputs:["form: ngFormControl","model: ngModel"],outputs:["update: ngModelChange"],exportAs:"ngForm"}),s(0,p.Optional()),s(0,p.Self()),s(0,p.Inject(h.NG_VALIDATORS)),s(1,p.Optional()),s(1,p.Self()),s(1,p.Inject(h.NG_ASYNC_VALIDATORS)),s(2,p.Optional()),s(2,p.Self()),s(2,p.Inject(f.NG_VALUE_ACCESSOR)),o("design:paramtypes",[Array,Array,Array])],e)}(l.NgControl);e.NgFormControl=y},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},a=n(5),u=n(40),c=n(2),p=n(118),l=n(117),h=n(113),f=n(120),d=n(119),v=a.CONST_EXPR(new c.Provider(l.NgControl,{useExisting:c.forwardRef(function(){return y})})),y=function(t){function e(e,n,r){t.call(this),this._validators=e,this._asyncValidators=n,this._control=new h.Control,this._added=!1,this.update=new u.EventEmitter,this.valueAccessor=d.selectValueAccessor(this,r)}return r(e,t),e.prototype.ngOnChanges=function(t){this._added||(d.setUpControl(this._control,this),this._control.updateValueAndValidity({emitEvent:!1}),this._added=!0),d.isPropertyUpdated(t,this.viewModel)&&(this._control.updateValue(this.model),this.viewModel=this.model)},Object.defineProperty(e.prototype,"control",{get:function(){return this._control},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"validator",{get:function(){return d.composeValidators(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return d.composeAsyncValidators(this._asyncValidators)},enumerable:!0,configurable:!0}),e.prototype.viewToModelUpdate=function(t){this.viewModel=t,u.ObservableWrapper.callEmit(this.update,t)},e=i([c.Directive({selector:"[ngModel]:not([ngControl]):not([ngFormControl])",bindings:[v],inputs:["model: ngModel"],outputs:["update: ngModelChange"],exportAs:"ngForm"}),s(0,c.Optional()),s(0,c.Self()),s(0,c.Inject(f.NG_VALIDATORS)),s(1,c.Optional()),s(1,c.Self()),s(1,c.Inject(f.NG_ASYNC_VALIDATORS)),s(2,c.Optional()),s(2,c.Self()),s(2,c.Inject(p.NG_VALUE_ACCESSOR)),o("design:paramtypes",[Array,Array,Array])],e)}(l.NgControl);e.NgModel=y},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},a=n(2),u=n(5),c=n(115),p=n(119),l=n(120),h=u.CONST_EXPR(new a.Provider(c.ControlContainer,{useExisting:a.forwardRef(function(){return f})})),f=function(t){function e(e,n,r){t.call(this),this._validators=n,this._asyncValidators=r,this._parent=e}return r(e,t),e.prototype.ngOnInit=function(){this.formDirective.addControlGroup(this)},e.prototype.ngOnDestroy=function(){this.formDirective.removeControlGroup(this)},Object.defineProperty(e.prototype,"control",{get:function(){return this.formDirective.getControlGroup(this)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return p.controlPath(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formDirective",{get:function(){return this._parent.formDirective},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"validator",{get:function(){return p.composeValidators(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return p.composeAsyncValidators(this._asyncValidators)},enumerable:!0,configurable:!0}),e=i([a.Directive({selector:"[ngControlGroup]",providers:[h],inputs:["name: ngControlGroup"],exportAs:"ngForm"}),s(0,a.Host()),s(0,a.SkipSelf()),s(1,a.Optional()),s(1,a.Self()),s(1,a.Inject(l.NG_VALIDATORS)),s(2,a.Optional()),s(2,a.Self()),s(2,a.Inject(l.NG_ASYNC_VALIDATORS)),o("design:paramtypes",[c.ControlContainer,Array,Array])],e)}(c.ControlContainer);e.NgControlGroup=f},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},a=n(5),u=n(15),c=n(12),p=n(40),l=n(2),h=n(115),f=n(119),d=n(120),v=a.CONST_EXPR(new l.Provider(h.ControlContainer,{useExisting:l.forwardRef(function(){return y})})),y=function(t){function e(e,n){t.call(this),this._validators=e,this._asyncValidators=n,this.form=null,this.directives=[],this.ngSubmit=new p.EventEmitter}return r(e,t),e.prototype.ngOnChanges=function(t){if(this._checkFormPresent(),u.StringMapWrapper.contains(t,"form")){var e=f.composeValidators(this._validators);this.form.validator=d.Validators.compose([this.form.validator,e]);var n=f.composeAsyncValidators(this._asyncValidators);this.form.asyncValidator=d.Validators.composeAsync([this.form.asyncValidator,n]),this.form.updateValueAndValidity({onlySelf:!0,emitEvent:!1})}this._updateDomValue()},Object.defineProperty(e.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),e.prototype.addControl=function(t){var e=this.form.find(t.path);f.setUpControl(e,t),e.updateValueAndValidity({emitEvent:!1}),this.directives.push(t)},e.prototype.getControl=function(t){return this.form.find(t.path)},e.prototype.removeControl=function(t){u.ListWrapper.remove(this.directives,t)},e.prototype.addControlGroup=function(t){var e=this.form.find(t.path);f.setUpControlGroup(e,t),e.updateValueAndValidity({emitEvent:!1})},e.prototype.removeControlGroup=function(t){},e.prototype.getControlGroup=function(t){return this.form.find(t.path)},e.prototype.updateModel=function(t,e){var n=this.form.find(t.path);n.updateValue(e)},e.prototype.onSubmit=function(){return p.ObservableWrapper.callEmit(this.ngSubmit,null),!1},e.prototype._updateDomValue=function(){var t=this;this.directives.forEach(function(e){var n=t.form.find(e.path);e.valueAccessor.writeValue(n.value)})},e.prototype._checkFormPresent=function(){if(a.isBlank(this.form))throw new c.BaseException('ngFormModel expects a form. Please pass one in. Example:
        ')},e=i([l.Directive({selector:"[ngFormModel]",bindings:[v],inputs:["form: ngFormModel"],host:{"(submit)":"onSubmit()"},outputs:["ngSubmit"],exportAs:"ngForm"}),s(0,l.Optional()),s(0,l.Self()),s(0,l.Inject(d.NG_VALIDATORS)),s(1,l.Optional()),s(1,l.Self()),s(1,l.Inject(d.NG_ASYNC_VALIDATORS)),o("design:paramtypes",[Array,Array])],e)}(h.ControlContainer);e.NgFormModel=y},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},a=n(40),u=n(15),c=n(5),p=n(2),l=n(115),h=n(113),f=n(119),d=n(120),v=c.CONST_EXPR(new p.Provider(l.ControlContainer,{useExisting:p.forwardRef(function(){return y})})),y=function(t){function e(e,n){t.call(this),this.ngSubmit=new a.EventEmitter,this.form=new h.ControlGroup({},null,f.composeValidators(e),f.composeAsyncValidators(n))}return r(e,t),Object.defineProperty(e.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"controls",{get:function(){return this.form.controls},enumerable:!0,configurable:!0}),e.prototype.addControl=function(t){var e=this;a.PromiseWrapper.scheduleMicrotask(function(){var n=e._findContainer(t.path),r=new h.Control;f.setUpControl(r,t),n.addControl(t.name,r),r.updateValueAndValidity({emitEvent:!1})})},e.prototype.getControl=function(t){return this.form.find(t.path)},e.prototype.removeControl=function(t){var e=this;a.PromiseWrapper.scheduleMicrotask(function(){var n=e._findContainer(t.path);c.isPresent(n)&&(n.removeControl(t.name),n.updateValueAndValidity({emitEvent:!1}))})},e.prototype.addControlGroup=function(t){var e=this;a.PromiseWrapper.scheduleMicrotask(function(){var n=e._findContainer(t.path),r=new h.ControlGroup({});f.setUpControlGroup(r,t),n.addControl(t.name,r),r.updateValueAndValidity({emitEvent:!1})})},e.prototype.removeControlGroup=function(t){var e=this;a.PromiseWrapper.scheduleMicrotask(function(){var n=e._findContainer(t.path);c.isPresent(n)&&(n.removeControl(t.name),n.updateValueAndValidity({emitEvent:!1}))})},e.prototype.getControlGroup=function(t){return this.form.find(t.path)},e.prototype.updateModel=function(t,e){var n=this;a.PromiseWrapper.scheduleMicrotask(function(){var r=n.form.find(t.path);r.updateValue(e)})},e.prototype.onSubmit=function(){return a.ObservableWrapper.callEmit(this.ngSubmit,null),!1},e.prototype._findContainer=function(t){return t.pop(),u.ListWrapper.isEmpty(t)?this.form:this.form.find(t)},e=i([p.Directive({selector:"form:not([ngNoForm]):not([ngFormModel]),ngForm,[ngForm]",bindings:[v],host:{"(submit)":"onSubmit()"},outputs:["ngSubmit"],exportAs:"ngForm"}),s(0,p.Optional()),s(0,p.Self()),s(0,p.Inject(d.NG_VALIDATORS)),s(1,p.Optional()),s(1,p.Self()),s(1,p.Inject(d.NG_ASYNC_VALIDATORS)),o("design:paramtypes",[Array,Array])],e)}(l.ControlContainer);e.NgForm=y},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},s=n(2),a=n(117),u=n(5),c=function(){function t(t){this._cd=t}return Object.defineProperty(t.prototype,"ngClassUntouched",{get:function(){return u.isPresent(this._cd.control)?this._cd.control.untouched:!1},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassTouched",{get:function(){return u.isPresent(this._cd.control)?this._cd.control.touched:!1},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassPristine",{get:function(){return u.isPresent(this._cd.control)?this._cd.control.pristine:!1},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassDirty",{get:function(){return u.isPresent(this._cd.control)?this._cd.control.dirty:!1},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassValid",{get:function(){return u.isPresent(this._cd.control)?this._cd.control.valid:!1},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassInvalid",{get:function(){return u.isPresent(this._cd.control)?!this._cd.control.valid:!1},enumerable:!0,configurable:!0}),t=r([s.Directive({selector:"[ngControl],[ngModel],[ngFormControl]",host:{"[class.ng-untouched]":"ngClassUntouched","[class.ng-touched]":"ngClassTouched","[class.ng-pristine]":"ngClassPristine","[class.ng-dirty]":"ngClassDirty","[class.ng-valid]":"ngClassValid","[class.ng-invalid]":"ngClassInvalid"}}),o(0,s.Self()),i("design:paramtypes",[a.NgControl])],t)}();e.NgControlStatus=c},function(t,e,n){"use strict";var r=n(5),i=n(116),o=n(127),s=n(128),a=n(129),u=n(130),c=n(131),p=n(121),l=n(123),h=n(122),f=n(125),d=n(132),v=n(124),y=n(134),m=n(116);e.NgControlName=m.NgControlName;var g=n(127);e.NgFormControl=g.NgFormControl;var _=n(128);e.NgModel=_.NgModel;var b=n(129);e.NgControlGroup=b.NgControlGroup;var P=n(130);e.NgFormModel=P.NgFormModel;var E=n(131);e.NgForm=E.NgForm;var w=n(121);e.DefaultValueAccessor=w.DefaultValueAccessor;var C=n(123);e.CheckboxControlValueAccessor=C.CheckboxControlValueAccessor;var R=n(125);e.RadioControlValueAccessor=R.RadioControlValueAccessor,e.RadioButtonState=R.RadioButtonState;var S=n(122);e.NumberValueAccessor=S.NumberValueAccessor;var O=n(132);e.NgControlStatus=O.NgControlStatus;var T=n(124);e.SelectControlValueAccessor=T.SelectControlValueAccessor,e.NgSelectOption=T.NgSelectOption;var x=n(134);e.RequiredValidator=x.RequiredValidator,e.MinLengthValidator=x.MinLengthValidator,e.MaxLengthValidator=x.MaxLengthValidator,e.PatternValidator=x.PatternValidator;var A=n(117);e.NgControl=A.NgControl,e.FORM_DIRECTIVES=r.CONST_EXPR([i.NgControlName,a.NgControlGroup,o.NgFormControl,s.NgModel,u.NgFormModel,c.NgForm,v.NgSelectOption,p.DefaultValueAccessor,h.NumberValueAccessor,l.CheckboxControlValueAccessor,v.SelectControlValueAccessor,f.RadioControlValueAccessor,d.NgControlStatus,y.RequiredValidator,y.MinLengthValidator,y.MaxLengthValidator,y.PatternValidator])},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},s=n(2),a=n(5),u=n(120),c=n(5),p=u.Validators.required,l=a.CONST_EXPR(new s.Provider(u.NG_VALIDATORS,{useValue:p,multi:!0})),h=function(){function t(){}return t=r([s.Directive({selector:"[required][ngControl],[required][ngFormControl],[required][ngModel]",providers:[l]}),i("design:paramtypes",[])],t)}();e.RequiredValidator=h;var f=a.CONST_EXPR(new s.Provider(u.NG_VALIDATORS,{useExisting:s.forwardRef(function(){return d}),multi:!0})),d=function(){function t(t){this._validator=u.Validators.minLength(c.NumberWrapper.parseInt(t,10))}return t.prototype.validate=function(t){return this._validator(t)},t=r([s.Directive({selector:"[minlength][ngControl],[minlength][ngFormControl],[minlength][ngModel]",providers:[f]}),o(0,s.Attribute("minlength")),i("design:paramtypes",[String])],t)}();e.MinLengthValidator=d;var v=a.CONST_EXPR(new s.Provider(u.NG_VALIDATORS,{useExisting:s.forwardRef(function(){return y}),multi:!0})),y=function(){function t(t){this._validator=u.Validators.maxLength(c.NumberWrapper.parseInt(t,10))}return t.prototype.validate=function(t){return this._validator(t)},t=r([s.Directive({selector:"[maxlength][ngControl],[maxlength][ngFormControl],[maxlength][ngModel]",providers:[v]}),o(0,s.Attribute("maxlength")),i("design:paramtypes",[String])],t)}();e.MaxLengthValidator=y;var m=a.CONST_EXPR(new s.Provider(u.NG_VALIDATORS,{useExisting:s.forwardRef(function(){return g}),multi:!0})),g=function(){function t(t){this._validator=u.Validators.pattern(t)}return t.prototype.validate=function(t){return this._validator(t)},t=r([s.Directive({selector:"[pattern][ngControl],[pattern][ngFormControl],[pattern][ngModel]",providers:[m]}),o(0,s.Attribute("pattern")),i("design:paramtypes",[String])],t)}();e.PatternValidator=g},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(2),s=n(15),a=n(5),u=n(113),c=function(){function t(){}return t.prototype.group=function(t,e){void 0===e&&(e=null);var n=this._reduceControls(t),r=a.isPresent(e)?s.StringMapWrapper.get(e,"optionals"):null,i=a.isPresent(e)?s.StringMapWrapper.get(e,"validator"):null,o=a.isPresent(e)?s.StringMapWrapper.get(e,"asyncValidator"):null;return new u.ControlGroup(n,r,i,o)},t.prototype.control=function(t,e,n){return void 0===e&&(e=null),void 0===n&&(n=null),new u.Control(t,e,n)},t.prototype.array=function(t,e,n){var r=this;void 0===e&&(e=null),void 0===n&&(n=null);var i=t.map(function(t){return r._createControl(t)});return new u.ControlArray(i,e,n)},t.prototype._reduceControls=function(t){var e=this,n={};return s.StringMapWrapper.forEach(t,function(t,r){n[r]=e._createControl(t)}),n},t.prototype._createControl=function(t){if(t instanceof u.Control||t instanceof u.ControlGroup||t instanceof u.ControlArray)return t;if(a.isArray(t)){var e=t[0],n=t.length>1?t[1]:null,r=t.length>2?t[2]:null;return this.control(e,n,r)}return this.control(t)},t=r([o.Injectable(),i("design:paramtypes",[])],t)}();e.FormBuilder=c},function(t,e,n){"use strict";var r=n(5),i=n(112),o=n(102);e.COMMON_DIRECTIVES=r.CONST_EXPR([o.CORE_DIRECTIVES,i.FORM_DIRECTIVES])},function(t,e,n){"use strict";function r(t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n])}var i=n(138);e.PLATFORM_DIRECTIVES=i.PLATFORM_DIRECTIVES,e.PLATFORM_PIPES=i.PLATFORM_PIPES,e.COMPILER_PROVIDERS=i.COMPILER_PROVIDERS,e.TEMPLATE_TRANSFORMS=i.TEMPLATE_TRANSFORMS,e.CompilerConfig=i.CompilerConfig,e.RenderTypes=i.RenderTypes,e.UrlResolver=i.UrlResolver,e.DEFAULT_PACKAGE_URL_PROVIDER=i.DEFAULT_PACKAGE_URL_PROVIDER,e.createOfflineCompileUrlResolver=i.createOfflineCompileUrlResolver,e.XHR=i.XHR,e.ViewResolver=i.ViewResolver,e.DirectiveResolver=i.DirectiveResolver,e.PipeResolver=i.PipeResolver,e.SourceModule=i.SourceModule,e.NormalizedComponentWithViewDirectives=i.NormalizedComponentWithViewDirectives,e.OfflineCompiler=i.OfflineCompiler,e.CompileMetadataWithIdentifier=i.CompileMetadataWithIdentifier,e.CompileMetadataWithType=i.CompileMetadataWithType,e.CompileIdentifierMetadata=i.CompileIdentifierMetadata,e.CompileDiDependencyMetadata=i.CompileDiDependencyMetadata,e.CompileProviderMetadata=i.CompileProviderMetadata,e.CompileFactoryMetadata=i.CompileFactoryMetadata,e.CompileTokenMetadata=i.CompileTokenMetadata,e.CompileTypeMetadata=i.CompileTypeMetadata,e.CompileQueryMetadata=i.CompileQueryMetadata,e.CompileTemplateMetadata=i.CompileTemplateMetadata,e.CompileDirectiveMetadata=i.CompileDirectiveMetadata,e.CompilePipeMetadata=i.CompilePipeMetadata,r(n(139))},function(t,e,n){"use strict";function r(t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n])}function i(){return new b.CompilerConfig(h.assertionsEnabled(),!1,!0)}var o=n(84);e.PLATFORM_DIRECTIVES=o.PLATFORM_DIRECTIVES,e.PLATFORM_PIPES=o.PLATFORM_PIPES,r(n(139));var s=n(140);e.TEMPLATE_TRANSFORMS=s.TEMPLATE_TRANSFORMS;var a=n(162);e.CompilerConfig=a.CompilerConfig,e.RenderTypes=a.RenderTypes,r(n(155)),r(n(163));var u=n(165);e.RuntimeCompiler=u.RuntimeCompiler,r(n(157)),r(n(184));var c=n(188);e.ViewResolver=c.ViewResolver;var p=n(186); +e.DirectiveResolver=p.DirectiveResolver;var l=n(187);e.PipeResolver=l.PipeResolver;var h=n(5),f=n(6),d=n(140),v=n(144),y=n(183),m=n(185),g=n(166),_=n(168),b=n(162),P=n(64),E=n(165),w=n(150),C=n(199),R=n(157),S=n(142),O=n(143),T=n(188),x=n(186),A=n(187);e.COMPILER_PROVIDERS=h.CONST_EXPR([O.Lexer,S.Parser,v.HtmlParser,d.TemplateParser,y.DirectiveNormalizer,m.RuntimeMetadataResolver,R.DEFAULT_PACKAGE_URL_PROVIDER,g.StyleCompiler,_.ViewCompiler,new f.Provider(b.CompilerConfig,{useFactory:i,deps:[]}),E.RuntimeCompiler,new f.Provider(P.ComponentResolver,{useExisting:E.RuntimeCompiler}),C.DomElementSchemaRegistry,new f.Provider(w.ElementSchemaRegistry,{useExisting:C.DomElementSchemaRegistry}),R.UrlResolver,T.ViewResolver,x.DirectiveResolver,A.PipeResolver])},function(t,e,n){"use strict";function r(t,e,n){void 0===n&&(n=null);var r=[];return e.forEach(function(e){var o=e.visit(t,n);i.isPresent(o)&&r.push(o)}),r}var i=n(5),o=function(){function t(t,e,n){this.value=t,this.ngContentIndex=e,this.sourceSpan=n}return t.prototype.visit=function(t,e){return t.visitText(this,e)},t}();e.TextAst=o;var s=function(){function t(t,e,n){this.value=t,this.ngContentIndex=e,this.sourceSpan=n}return t.prototype.visit=function(t,e){return t.visitBoundText(this,e)},t}();e.BoundTextAst=s;var a=function(){function t(t,e,n){this.name=t,this.value=e,this.sourceSpan=n}return t.prototype.visit=function(t,e){return t.visitAttr(this,e)},t}();e.AttrAst=a;var u=function(){function t(t,e,n,r,i){this.name=t,this.type=e,this.value=n,this.unit=r,this.sourceSpan=i}return t.prototype.visit=function(t,e){return t.visitElementProperty(this,e)},t}();e.BoundElementPropertyAst=u;var c=function(){function t(t,e,n,r){this.name=t,this.target=e,this.handler=n,this.sourceSpan=r}return t.prototype.visit=function(t,e){return t.visitEvent(this,e)},Object.defineProperty(t.prototype,"fullName",{get:function(){return i.isPresent(this.target)?this.target+":"+this.name:this.name},enumerable:!0,configurable:!0}),t}();e.BoundEventAst=c;var p=function(){function t(t,e,n){this.name=t,this.value=e,this.sourceSpan=n}return t.prototype.visit=function(t,e){return t.visitVariable(this,e)},t}();e.VariableAst=p;var l=function(){function t(t,e,n,r,i,o,s,a,u,c,p){this.name=t,this.attrs=e,this.inputs=n,this.outputs=r,this.exportAsVars=i,this.directives=o,this.providers=s,this.hasViewContainer=a,this.children=u,this.ngContentIndex=c,this.sourceSpan=p}return t.prototype.visit=function(t,e){return t.visitElement(this,e)},t.prototype.isBound=function(){return this.inputs.length>0||this.outputs.length>0||this.exportAsVars.length>0||this.directives.length>0},t.prototype.getComponent=function(){for(var t=0;t0;n||e.push(t)}),e}var s=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},a=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},u=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},c=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},p=n(15),l=n(5),h=n(2),f=n(5),d=n(12),v=n(141),y=n(142),m=n(144),g=n(148),_=n(147),b=n(66),P=n(139),E=n(149),w=n(150),C=n(151),R=n(152),S=n(145),O=n(153),T=n(154),x=/^(?:(?:(?:(bind-)|(var-|#)|(on-)|(bindon-))(.+))|\[\(([^\)]+)\)\]|\[([^\]]+)\]|\(([^\)]+)\))$/g,A="template",I="template",M="*",k="class",N=".",D="attr",V="class",j="style",L=E.CssSelector.parse("*")[0];e.TEMPLATE_TRANSFORMS=f.CONST_EXPR(new h.OpaqueToken("TemplateTransforms"));var B=function(t){function e(e,n){t.call(this,n,e)}return s(e,t),e}(_.ParseError);e.TemplateParseError=B;var F=function(){function t(t,e){this.templateAst=t,this.errors=e}return t}();e.TemplateParseResult=F;var U=function(){function t(t,e,n,r){this._exprParser=t,this._schemaRegistry=e,this._htmlParser=n,this.transforms=r}return t.prototype.parse=function(t,e,n,r,i){var o=this.tryParse(t,e,n,r,i);if(l.isPresent(o.errors)){var s=o.errors.join("\n");throw new d.BaseException("Template parse errors:\n"+s)}return o.templateAst},t.prototype.tryParse=function(t,e,n,r,i){var s,a=this._htmlParser.parse(e,i),u=a.errors;if(a.rootNodes.length>0){var c=o(n),p=o(r),h=new T.ProviderViewContext(t,a.rootNodes[0].sourceSpan),f=new W(h,c,p,this._exprParser,this._schemaRegistry);s=S.htmlVisitAll(f,a.rootNodes,G),u=u.concat(f.errors).concat(h.errors)}else s=[];return u.length>0?new F(s,u):(l.isPresent(this.transforms)&&this.transforms.forEach(function(t){s=P.templateVisitAll(t,s)}),new F(s))},t=a([h.Injectable(),c(3,h.Optional()),c(3,h.Inject(e.TEMPLATE_TRANSFORMS)),u("design:paramtypes",[y.Parser,w.ElementSchemaRegistry,m.HtmlParser,Array])],t)}();e.TemplateParser=U;var W=function(){function t(t,e,n,r,i){var o=this;this.providerViewContext=t,this._exprParser=r,this._schemaRegistry=i,this.errors=[],this.directivesIndex=new Map,this.ngContentCount=0,this.selectorMatcher=new E.SelectorMatcher,p.ListWrapper.forEachWithIndex(e,function(t,e){var n=E.CssSelector.parse(t.selector);o.selectorMatcher.addSelectables(n,t),o.directivesIndex.set(t,e)}),this.pipesByName=new Map,n.forEach(function(t){return o.pipesByName.set(t.name,t)})}return t.prototype._reportError=function(t,e){this.errors.push(new B(t,e))},t.prototype._parseInterpolation=function(t,e){var n=e.start.toString();try{var r=this._exprParser.parseInterpolation(t,n);if(this._checkPipes(r,e),l.isPresent(r)&&r.ast.expressions.length>b.MAX_INTERPOLATION_VALUES)throw new d.BaseException("Only support at most "+b.MAX_INTERPOLATION_VALUES+" interpolation values!");return r}catch(i){return this._reportError(""+i,e),this._exprParser.wrapLiteralPrimitive("ERROR",n)}},t.prototype._parseAction=function(t,e){var n=e.start.toString();try{var r=this._exprParser.parseAction(t,n);return this._checkPipes(r,e),r}catch(i){return this._reportError(""+i,e),this._exprParser.wrapLiteralPrimitive("ERROR",n)}},t.prototype._parseBinding=function(t,e){var n=e.start.toString();try{var r=this._exprParser.parseBinding(t,n);return this._checkPipes(r,e),r}catch(i){return this._reportError(""+i,e),this._exprParser.wrapLiteralPrimitive("ERROR",n)}},t.prototype._parseTemplateBindings=function(t,e){var n=this,r=e.start.toString();try{var i=this._exprParser.parseTemplateBindings(t,r);return i.forEach(function(t){l.isPresent(t.expression)&&n._checkPipes(t.expression,e)}),i}catch(o){return this._reportError(""+o,e),[]}},t.prototype._checkPipes=function(t,e){var n=this;if(l.isPresent(t)){var r=new K;t.visit(r),r.pipes.forEach(function(t){n.pipesByName.has(t)||n._reportError("The pipe '"+t+"' could not be found",e)})}},t.prototype.visitExpansion=function(t,e){return null},t.prototype.visitExpansionCase=function(t,e){return null},t.prototype.visitText=function(t,e){var n=e.findNgContentIndex(L),r=this._parseInterpolation(t.value,t.sourceSpan);return l.isPresent(r)?new P.BoundTextAst(r,n,t.sourceSpan):new P.TextAst(t.value,n,t.sourceSpan)},t.prototype.visitAttr=function(t,e){return new P.AttrAst(t.name,t.value,t.sourceSpan)},t.prototype.visitComment=function(t,e){return null},t.prototype.visitElement=function(t,e){var n=this,r=t.name,o=C.preparseElement(t);if(o.type===C.PreparsedElementType.SCRIPT||o.type===C.PreparsedElementType.STYLE)return null;if(o.type===C.PreparsedElementType.STYLESHEET&&R.isStyleUrlResolvable(o.hrefAttr))return null;var s=[],a=[],u=[],c=[],p=[],h=[],f=[],d=!1,v=[];t.attrs.forEach(function(t){var e=n._parseAttr(t,s,a,c,u),r=n._parseInlineTemplateBinding(t,f,p,h);e||r||(v.push(n.visitAttr(t,null)),s.push([t.name,t.value])),r&&(d=!0)});var y=g.splitNsName(r.toLowerCase())[1],m=y==A,_=i(r,s),b=this._parseDirectives(this.selectorMatcher,_),w=this._createDirectiveAsts(t.name,b,a,m?[]:u,t.sourceSpan),O=this._createElementPropertyAsts(t.name,a,w),x=e.isTemplateElement||d,I=new T.ProviderElementContext(this.providerViewContext,e.providerContext,x,w,v,u,t.sourceSpan),M=S.htmlVisitAll(o.nonBindable?z:this,t.children,q.create(m,w,m?e.providerContext:I));I.afterElement();var k,N=l.isPresent(o.projectAs)?E.CssSelector.parse(o.projectAs)[0]:_,D=e.findNgContentIndex(N);if(o.type===C.PreparsedElementType.NG_CONTENT)l.isPresent(t.children)&&t.children.length>0&&this._reportError(" element cannot have content. must be immediately followed by ",t.sourceSpan),k=new P.NgContentAst(this.ngContentCount++,d?null:D,t.sourceSpan);else if(m)this._assertAllEventsPublishedByDirectives(w,c),this._assertNoComponentsNorElementBindingsOnTemplate(w,O,t.sourceSpan),k=new P.EmbeddedTemplateAst(v,c,u,I.transformedDirectiveAsts,I.transformProviders,I.transformedHasViewContainer,M,d?null:D,t.sourceSpan);else{this._assertOnlyOneComponent(w,t.sourceSpan);var V=u.filter(function(t){return 0===t.value.length}),j=d?null:e.findNgContentIndex(N);k=new P.ElementAst(r,v,O,c,V,I.transformedDirectiveAsts,I.transformProviders,I.transformedHasViewContainer,M,d?null:j,t.sourceSpan)}if(d){var L=i(A,f),B=this._parseDirectives(this.selectorMatcher,L),F=this._createDirectiveAsts(t.name,B,p,[],t.sourceSpan),U=this._createElementPropertyAsts(t.name,p,F);this._assertNoComponentsNorElementBindingsOnTemplate(F,U,t.sourceSpan);var W=new T.ProviderElementContext(this.providerViewContext,e.providerContext,e.isTemplateElement,F,[],h,t.sourceSpan);W.afterElement(),k=new P.EmbeddedTemplateAst([],[],h,W.transformedDirectiveAsts,W.transformProviders,W.transformedHasViewContainer,[k],D,t.sourceSpan)}return k},t.prototype._parseInlineTemplateBinding=function(t,e,n,r){var i=null;if(t.name==I)i=t.value;else if(t.name.startsWith(M)){var o=t.name.substring(M.length);i=0==t.value.length?o:o+" "+t.value}if(l.isPresent(i)){for(var s=this._parseTemplateBindings(i,t.sourceSpan),a=0;a-1&&this._reportError('"-" is not allowed in variable names',n),r.push(new P.VariableAst(t,e,n))},t.prototype._parseProperty=function(t,e,n,r,i){this._parsePropertyAst(t,this._parseBinding(e,n),n,r,i)},t.prototype._parsePropertyInterpolation=function(t,e,n,r,i){var o=this._parseInterpolation(e,n);return l.isPresent(o)?(this._parsePropertyAst(t,o,n,r,i),!0):!1},t.prototype._parsePropertyAst=function(t,e,n,r,i){r.push([t,e.source]),i.push(new X(t,e,!1,n))},t.prototype._parseAssignmentEvent=function(t,e,n,r,i){this._parseEvent(t+"Change",e+"=$event",n,r,i)},t.prototype._parseEvent=function(t,e,n,r,i){var o=O.splitAtColon(t,[null,t]),s=o[0],a=o[1],u=this._parseAction(e,n);r.push([t,u.source]),i.push(new P.BoundEventAst(a,s,u,n))},t.prototype._parseLiteralAttr=function(t,e,n,r){r.push(new X(t,this._exprParser.wrapLiteralPrimitive(e,""),!0,n))},t.prototype._parseDirectives=function(t,e){var n=this,r=[];return t.match(e,function(t,e){r.push(e)}),p.ListWrapper.sort(r,function(t,e){var r=t.isComponent,i=e.isComponent;return r&&!i?-1:!r&&i?1:n.directivesIndex.get(t)-n.directivesIndex.get(e)}),r},t.prototype._createDirectiveAsts=function(t,e,n,r,i){var o=this,s=new Set,a=e.map(function(e){var a=[],u=[],c=[];o._createDirectiveHostPropertyAsts(t,e.hostProperties,i,a),o._createDirectiveHostEventAsts(e.hostListeners,i,u),o._createDirectivePropertyAsts(e.inputs,n,c);var p=[];return r.forEach(function(t){(0===t.value.length&&e.isComponent||e.exportAs==t.value)&&(p.push(t),s.add(t.name))}),new P.DirectiveAst(e,c,a,u,p,i)});return r.forEach(function(t){t.value.length>0&&!p.SetWrapper.has(s,t.name)&&o._reportError('There is no directive with "exportAs" set to "'+t.value+'"',t.sourceSpan)}),a},t.prototype._createDirectiveHostPropertyAsts=function(t,e,n,r){var i=this;l.isPresent(e)&&p.StringMapWrapper.forEach(e,function(e,o){var s=i._parseBinding(e,n);r.push(i._createElementPropertyAst(t,o,s,n))})},t.prototype._createDirectiveHostEventAsts=function(t,e,n){var r=this;l.isPresent(t)&&p.StringMapWrapper.forEach(t,function(t,i){r._parseEvent(i,t,e,[],n)})},t.prototype._createDirectivePropertyAsts=function(t,e,n){if(l.isPresent(t)){var r=new Map;e.forEach(function(t){var e=r.get(t.name);(l.isBlank(e)||e.isLiteral)&&r.set(t.name,t)}),p.StringMapWrapper.forEach(t,function(t,e){var i=r.get(t);l.isPresent(i)&&n.push(new P.BoundDirectivePropertyAst(e,i.name,i.expression,i.sourceSpan))})}},t.prototype._createElementPropertyAsts=function(t,e,n){var r=this,i=[],o=new Map;return n.forEach(function(t){t.inputs.forEach(function(t){o.set(t.templateName,t)})}),e.forEach(function(e){!e.isLiteral&&l.isBlank(o.get(e.name))&&i.push(r._createElementPropertyAst(t,e.name,e.expression,e.sourceSpan))}),i},t.prototype._createElementPropertyAst=function(t,e,n,r){var i,o,s=null,a=e.split(N);if(1===a.length)o=this._schemaRegistry.getMappedPropName(a[0]),i=P.PropertyBindingType.Property,this._schemaRegistry.hasProperty(t,o)||this._reportError("Can't bind to '"+o+"' since it isn't a known native property",r);else if(a[0]==D){o=a[1];var u=o.indexOf(":");if(u>-1){var c=o.substring(0,u),p=o.substring(u+1);o=g.mergeNsAndName(c,p)}i=P.PropertyBindingType.Attribute}else a[0]==V?(o=a[1],i=P.PropertyBindingType.Class):a[0]==j?(s=a.length>2?a[2]:null,o=a[1],i=P.PropertyBindingType.Style):(this._reportError("Invalid property name '"+e+"'",r),i=null);return new P.BoundElementPropertyAst(o,i,n,s,r)},t.prototype._findComponentDirectiveNames=function(t){var e=[];return t.forEach(function(t){var n=t.directive.type.name;t.directive.isComponent&&e.push(n)}),e},t.prototype._assertOnlyOneComponent=function(t,e){var n=this._findComponentDirectiveNames(t);n.length>1&&this._reportError("More than one component: "+n.join(","),e)},t.prototype._assertNoComponentsNorElementBindingsOnTemplate=function(t,e,n){var r=this,i=this._findComponentDirectiveNames(t);i.length>0&&this._reportError("Components on an embedded template: "+i.join(","),n),e.forEach(function(t){r._reportError("Property binding "+t.name+" not used by any directive on an embedded template",n)})},t.prototype._assertAllEventsPublishedByDirectives=function(t,e){var n=this,r=new Set;t.forEach(function(t){p.StringMapWrapper.forEach(t.directive.outputs,function(t,e){r.add(t)})}),e.forEach(function(t){(l.isPresent(t.target)||!p.SetWrapper.has(r,t.name))&&n._reportError("Event binding "+t.fullName+" not emitted by any directive on an embedded template",t.sourceSpan)})},t}(),H=function(){function t(){}return t.prototype.visitElement=function(t,e){var n=C.preparseElement(t);if(n.type===C.PreparsedElementType.SCRIPT||n.type===C.PreparsedElementType.STYLE||n.type===C.PreparsedElementType.STYLESHEET)return null;var r=t.attrs.map(function(t){return[t.name,t.value]}),o=i(t.name,r),s=e.findNgContentIndex(o),a=S.htmlVisitAll(this,t.children,G);return new P.ElementAst(t.name,S.htmlVisitAll(this,t.attrs),[],[],[],[],[],!1,a,s,t.sourceSpan)},t.prototype.visitComment=function(t,e){return null},t.prototype.visitAttr=function(t,e){return new P.AttrAst(t.name,t.value,t.sourceSpan)},t.prototype.visitText=function(t,e){var n=e.findNgContentIndex(L);return new P.TextAst(t.value,n,t.sourceSpan)},t.prototype.visitExpansion=function(t,e){return t},t.prototype.visitExpansionCase=function(t,e){return t},t}(),X=function(){function t(t,e,n,r){this.name=t,this.expression=e,this.isLiteral=n,this.sourceSpan=r}return t}();e.splitClasses=r;var q=function(){function t(t,e,n,r){this.isTemplateElement=t,this._ngContentIndexMatcher=e,this._wildcardNgContentIndex=n,this.providerContext=r}return t.create=function(e,n,r){var i=new E.SelectorMatcher,o=null;if(n.length>0&&n[0].directive.isComponent)for(var s=n[0].directive.template.ngContentSelectors,a=0;a0?e[0]:null},t}(),G=new q(!0,new E.SelectorMatcher,null,null),z=new H,K=function(t){function e(){t.apply(this,arguments),this.pipes=new Set}return s(e,t),e.prototype.visitPipe=function(t,e){return this.pipes.add(t.name),t.exp.visit(this),this.visitAll(t.args,e),null},e}(v.RecursiveAstVisitor);e.PipeCollector=K},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=n(15),o=function(){function t(){}return t.prototype.visit=function(t,e){return void 0===e&&(e=null),null},t.prototype.toString=function(){return"AST"},t}();e.AST=o;var s=function(t){function e(e,n,r){t.call(this),this.prefix=e,this.uninterpretedExpression=n,this.location=r}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitQuote(this,e)},e.prototype.toString=function(){return"Quote"},e}(o);e.Quote=s;var a=function(t){function e(){t.apply(this,arguments)}return r(e,t),e.prototype.visit=function(t,e){void 0===e&&(e=null)},e}(o);e.EmptyExpr=a;var u=function(t){function e(){t.apply(this,arguments)}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitImplicitReceiver(this,e)},e}(o);e.ImplicitReceiver=u;var c=function(t){function e(e){t.call(this),this.expressions=e}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitChain(this,e)},e}(o);e.Chain=c;var p=function(t){function e(e,n,r){t.call(this),this.condition=e,this.trueExp=n,this.falseExp=r}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitConditional(this,e)},e}(o);e.Conditional=p;var l=function(t){function e(e,n){t.call(this),this.receiver=e,this.name=n}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitPropertyRead(this,e)},e}(o);e.PropertyRead=l;var h=function(t){function e(e,n,r){t.call(this),this.receiver=e,this.name=n,this.value=r}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitPropertyWrite(this,e)},e}(o);e.PropertyWrite=h;var f=function(t){function e(e,n){t.call(this),this.receiver=e,this.name=n}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitSafePropertyRead(this,e)},e}(o);e.SafePropertyRead=f;var d=function(t){function e(e,n){t.call(this),this.obj=e,this.key=n}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitKeyedRead(this,e)},e}(o);e.KeyedRead=d;var v=function(t){function e(e,n,r){t.call(this),this.obj=e,this.key=n,this.value=r}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitKeyedWrite(this,e)},e}(o);e.KeyedWrite=v;var y=function(t){function e(e,n,r){t.call(this),this.exp=e,this.name=n,this.args=r}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitPipe(this,e)},e}(o);e.BindingPipe=y;var m=function(t){function e(e){t.call(this),this.value=e}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitLiteralPrimitive(this,e)},e}(o);e.LiteralPrimitive=m;var g=function(t){function e(e){t.call(this),this.expressions=e}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitLiteralArray(this,e)},e}(o);e.LiteralArray=g;var _=function(t){function e(e,n){t.call(this),this.keys=e,this.values=n}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitLiteralMap(this,e)},e}(o);e.LiteralMap=_;var b=function(t){function e(e,n){t.call(this),this.strings=e,this.expressions=n}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitInterpolation(this,e)},e}(o);e.Interpolation=b;var P=function(t){function e(e,n,r){t.call(this),this.operation=e,this.left=n,this.right=r}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitBinary(this,e)},e}(o);e.Binary=P;var E=function(t){function e(e){t.call(this),this.expression=e}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitPrefixNot(this,e)},e}(o);e.PrefixNot=E;var w=function(t){function e(e,n,r){t.call(this),this.receiver=e,this.name=n,this.args=r}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitMethodCall(this,e)},e}(o);e.MethodCall=w;var C=function(t){function e(e,n,r){t.call(this),this.receiver=e,this.name=n,this.args=r}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitSafeMethodCall(this,e)},e}(o);e.SafeMethodCall=C;var R=function(t){function e(e,n){t.call(this),this.target=e,this.args=n}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),t.visitFunctionCall(this,e)},e}(o);e.FunctionCall=R;var S=function(t){function e(e,n,r){t.call(this),this.ast=e,this.source=n,this.location=r}return r(e,t),e.prototype.visit=function(t,e){return void 0===e&&(e=null),this.ast.visit(t,e)},e.prototype.toString=function(){return this.source+" in "+this.location},e}(o);e.ASTWithSource=S;var O=function(){function t(t,e,n,r){this.key=t,this.keyIsVar=e,this.name=n,this.expression=r}return t}();e.TemplateBinding=O;var T=function(){function t(){}return t.prototype.visitBinary=function(t,e){return t.left.visit(this),t.right.visit(this),null},t.prototype.visitChain=function(t,e){return this.visitAll(t.expressions,e)},t.prototype.visitConditional=function(t,e){return t.condition.visit(this),t.trueExp.visit(this),t.falseExp.visit(this),null},t.prototype.visitPipe=function(t,e){return t.exp.visit(this),this.visitAll(t.args,e),null},t.prototype.visitFunctionCall=function(t,e){return t.target.visit(this),this.visitAll(t.args,e),null},t.prototype.visitImplicitReceiver=function(t,e){return null},t.prototype.visitInterpolation=function(t,e){return this.visitAll(t.expressions,e)},t.prototype.visitKeyedRead=function(t,e){return t.obj.visit(this),t.key.visit(this),null},t.prototype.visitKeyedWrite=function(t,e){return t.obj.visit(this),t.key.visit(this),t.value.visit(this),null},t.prototype.visitLiteralArray=function(t,e){return this.visitAll(t.expressions,e)},t.prototype.visitLiteralMap=function(t,e){return this.visitAll(t.values,e)},t.prototype.visitLiteralPrimitive=function(t,e){return null},t.prototype.visitMethodCall=function(t,e){return t.receiver.visit(this),this.visitAll(t.args,e)},t.prototype.visitPrefixNot=function(t,e){return t.expression.visit(this),null},t.prototype.visitPropertyRead=function(t,e){return t.receiver.visit(this),null},t.prototype.visitPropertyWrite=function(t,e){return t.receiver.visit(this),t.value.visit(this),null},t.prototype.visitSafePropertyRead=function(t,e){return t.receiver.visit(this),null},t.prototype.visitSafeMethodCall=function(t,e){return t.receiver.visit(this),this.visitAll(t.args,e)},t.prototype.visitAll=function(t,e){var n=this;return t.forEach(function(t){return t.visit(n,e)}),null},t.prototype.visitQuote=function(t,e){return null},t}();e.RecursiveAstVisitor=T;var x=function(){function t(){}return t.prototype.visitImplicitReceiver=function(t,e){return t},t.prototype.visitInterpolation=function(t,e){return new b(t.strings,this.visitAll(t.expressions))},t.prototype.visitLiteralPrimitive=function(t,e){return new m(t.value)},t.prototype.visitPropertyRead=function(t,e){return new l(t.receiver.visit(this),t.name)},t.prototype.visitPropertyWrite=function(t,e){return new h(t.receiver.visit(this),t.name,t.value)},t.prototype.visitSafePropertyRead=function(t,e){return new f(t.receiver.visit(this),t.name)},t.prototype.visitMethodCall=function(t,e){return new w(t.receiver.visit(this),t.name,this.visitAll(t.args))},t.prototype.visitSafeMethodCall=function(t,e){return new C(t.receiver.visit(this),t.name,this.visitAll(t.args))},t.prototype.visitFunctionCall=function(t,e){return new R(t.target.visit(this),this.visitAll(t.args))},t.prototype.visitLiteralArray=function(t,e){return new g(this.visitAll(t.expressions))},t.prototype.visitLiteralMap=function(t,e){return new _(t.keys,this.visitAll(t.values))},t.prototype.visitBinary=function(t,e){return new P(t.operation,t.left.visit(this),t.right.visit(this))},t.prototype.visitPrefixNot=function(t,e){return new E(t.expression.visit(this))},t.prototype.visitConditional=function(t,e){return new p(t.condition.visit(this),t.trueExp.visit(this),t.falseExp.visit(this))},t.prototype.visitPipe=function(t,e){return new y(t.exp.visit(this),t.name,this.visitAll(t.args))},t.prototype.visitKeyedRead=function(t,e){return new d(t.obj.visit(this),t.key.visit(this))},t.prototype.visitKeyedWrite=function(t,e){return new v(t.obj.visit(this),t.key.visit(this),t.value.visit(this))},t.prototype.visitAll=function(t){for(var e=i.ListWrapper.createFixedSize(t.length),n=0;no?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(8),a=n(5),u=n(12),c=n(15),p=n(143),l=n(141),h=new l.ImplicitReceiver,f=/\{\{([\s\S]*?)\}\}/g,d=function(t){function e(e,n,r,i){t.call(this,"Parser Error: "+e+" "+r+" ["+n+"] in "+i)}return r(e,t),e}(u.BaseException),v=function(){function t(t,e){this.strings=t,this.expressions=e}return t}();e.SplitInterpolation=v;var y=function(){function t(t){this._lexer=t}return t.prototype.parseAction=function(t,e){this._checkNoInterpolation(t,e);var n=this._lexer.tokenize(this._stripComments(t)),r=new m(t,e,n,!0).parseChain();return new l.ASTWithSource(r,t,e)},t.prototype.parseBinding=function(t,e){var n=this._parseBindingAst(t,e);return new l.ASTWithSource(n,t,e)},t.prototype.parseSimpleBinding=function(t,e){var n=this._parseBindingAst(t,e);if(!g.check(n))throw new d("Host binding expression can only contain field access and constants",t,e);return new l.ASTWithSource(n,t,e)},t.prototype._parseBindingAst=function(t,e){var n=this._parseQuote(t,e);if(a.isPresent(n))return n;this._checkNoInterpolation(t,e);var r=this._lexer.tokenize(this._stripComments(t));return new m(t,e,r,!1).parseChain()},t.prototype._parseQuote=function(t,e){if(a.isBlank(t))return null;var n=t.indexOf(":");if(-1==n)return null;var r=t.substring(0,n).trim();if(!p.isIdentifier(r))return null;var i=t.substring(n+1);return new l.Quote(r,i,e)},t.prototype.parseTemplateBindings=function(t,e){var n=this._lexer.tokenize(t);return new m(t,e,n,!1).parseTemplateBindings()},t.prototype.parseInterpolation=function(t,e){var n=this.splitInterpolation(t,e);if(null==n)return null;for(var r=[],i=0;i0))throw new d("Blank expressions are not allowed in interpolated strings",t,"at column "+this._findInterpolationErrorColumn(n,o)+" in",e);i.push(s)}}return new v(r,i)},t.prototype.wrapLiteralPrimitive=function(t,e){return new l.ASTWithSource(new l.LiteralPrimitive(t),t,e)},t.prototype._stripComments=function(t){var e=this._commentStart(t);return a.isPresent(e)?t.substring(0,e).trim():t},t.prototype._commentStart=function(t){for(var e=null,n=0;n1)throw new d("Got interpolation ({{}}) where expression was expected",t,"at column "+this._findInterpolationErrorColumn(n,1)+" in",e)},t.prototype._findInterpolationErrorColumn=function(t,e){for(var n="",r=0;e>r;r++)n+=r%2===0?t[r]:"{{"+t[r]+"}}";return n.length},t=i([s.Injectable(),o("design:paramtypes",[p.Lexer])],t)}();e.Parser=y;var m=function(){function t(t,e,n,r){this.input=t,this.location=e,this.tokens=n,this.parseAction=r,this.index=0}return t.prototype.peek=function(t){var e=this.index+t;return e"))t=new l.Binary(">",t,this.parseAdditive());else if(this.optionalOperator("<="))t=new l.Binary("<=",t,this.parseAdditive());else{if(!this.optionalOperator(">="))return t;t=new l.Binary(">=",t,this.parseAdditive())}},t.prototype.parseAdditive=function(){for(var t=this.parseMultiplicative();;)if(this.optionalOperator("+"))t=new l.Binary("+",t,this.parseMultiplicative());else{if(!this.optionalOperator("-"))return t;t=new l.Binary("-",t,this.parseMultiplicative())}},t.prototype.parseMultiplicative=function(){for(var t=this.parsePrefix();;)if(this.optionalOperator("*"))t=new l.Binary("*",t,this.parsePrefix());else if(this.optionalOperator("%"))t=new l.Binary("%",t,this.parsePrefix());else{if(!this.optionalOperator("/"))return t;t=new l.Binary("/",t,this.parsePrefix())}},t.prototype.parsePrefix=function(){return this.optionalOperator("+")?this.parsePrefix():this.optionalOperator("-")?new l.Binary("-",new l.LiteralPrimitive(0),this.parsePrefix()):this.optionalOperator("!")?new l.PrefixNot(this.parsePrefix()):this.parseCallChain()},t.prototype.parseCallChain=function(){for(var t=this.parsePrimary();;)if(this.optionalCharacter(p.$PERIOD))t=this.parseAccessMemberOrMethodCall(t,!1);else if(this.optionalOperator("?."))t=this.parseAccessMemberOrMethodCall(t,!0);else if(this.optionalCharacter(p.$LBRACKET)){var e=this.parsePipe();if(this.expectCharacter(p.$RBRACKET),this.optionalOperator("=")){var n=this.parseConditional();t=new l.KeyedWrite(t,e,n)}else t=new l.KeyedRead(t,e)}else{if(!this.optionalCharacter(p.$LPAREN))return t;var r=this.parseCallArguments();this.expectCharacter(p.$RPAREN),t=new l.FunctionCall(t,r)}},t.prototype.parsePrimary=function(){if(this.optionalCharacter(p.$LPAREN)){var t=this.parsePipe();return this.expectCharacter(p.$RPAREN),t}if(this.next.isKeywordNull()||this.next.isKeywordUndefined())return this.advance(),new l.LiteralPrimitive(null);if(this.next.isKeywordTrue())return this.advance(),new l.LiteralPrimitive(!0);if(this.next.isKeywordFalse())return this.advance(),new l.LiteralPrimitive(!1);if(this.optionalCharacter(p.$LBRACKET)){var e=this.parseExpressionList(p.$RBRACKET);return this.expectCharacter(p.$RBRACKET),new l.LiteralArray(e)}if(this.next.isCharacter(p.$LBRACE))return this.parseLiteralMap();if(this.next.isIdentifier())return this.parseAccessMemberOrMethodCall(h,!1);if(this.next.isNumber()){var n=this.next.toNumber();return this.advance(),new l.LiteralPrimitive(n)}if(this.next.isString()){var r=this.next.toString();return this.advance(),new l.LiteralPrimitive(r)}throw this.index>=this.tokens.length?this.error("Unexpected end of expression: "+this.input):this.error("Unexpected token "+this.next),new u.BaseException("Fell through all cases in parsePrimary")},t.prototype.parseExpressionList=function(t){var e=[];if(!this.next.isCharacter(t))do e.push(this.parsePipe());while(this.optionalCharacter(p.$COMMA));return e},t.prototype.parseLiteralMap=function(){var t=[],e=[];if(this.expectCharacter(p.$LBRACE),!this.optionalCharacter(p.$RBRACE)){do{var n=this.expectIdentifierOrKeywordOrString();t.push(n),this.expectCharacter(p.$COLON),e.push(this.parsePipe())}while(this.optionalCharacter(p.$COMMA));this.expectCharacter(p.$RBRACE)}return new l.LiteralMap(t,e)},t.prototype.parseAccessMemberOrMethodCall=function(t,e){void 0===e&&(e=!1);var n=this.expectIdentifierOrKeyword();if(this.optionalCharacter(p.$LPAREN)){var r=this.parseCallArguments();return this.expectCharacter(p.$RPAREN),e?new l.SafeMethodCall(t,n,r):new l.MethodCall(t,n,r)}if(!e){if(this.optionalOperator("=")){this.parseAction||this.error("Bindings cannot contain assignments");var i=this.parseConditional();return new l.PropertyWrite(t,n,i)}return new l.PropertyRead(t,n)}return this.optionalOperator("=")?(this.error("The '?.' operator cannot be used in the assignment"),null):new l.SafePropertyRead(t,n)},t.prototype.parseCallArguments=function(){if(this.next.isCharacter(p.$RPAREN))return[];var t=[];do t.push(this.parsePipe());while(this.optionalCharacter(p.$COMMA));return t},t.prototype.parseBlockContent=function(){this.parseAction||this.error("Binding expression cannot contain chained expression");for(var t=[];this.index=e.$TAB&&t<=e.$SPACE||t==X}function p(t){return t>=D&&H>=t||t>=A&&M>=t||t==N||t==e.$$}function l(t){if(0==t.length)return!1;var n=new G(t);if(!p(n.peek))return!1;for(n.advance();n.peek!==e.$EOF;){if(!h(n.peek))return!1;n.advance()}return!0}function h(t){return t>=D&&H>=t||t>=A&&M>=t||t>=T&&x>=t||t==N||t==e.$$}function f(t){return t>=T&&x>=t}function d(t){return t==V||t==I}function v(t){return t==e.$MINUS||t==e.$PLUS}function y(t){return t===e.$SQ||t===e.$DQ||t===e.$BT}function m(t){switch(t){case L:return e.$LF;case j:return e.$FF;case B:return e.$CR;case F:return e.$TAB;case W:return e.$VTAB;default:return t}}var g=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},_=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},b=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},P=n(8),E=n(15),w=n(5),C=n(12);!function(t){t[t.Character=0]="Character",t[t.Identifier=1]="Identifier",t[t.Keyword=2]="Keyword",t[t.String=3]="String",t[t.Operator=4]="Operator",t[t.Number=5]="Number"}(e.TokenType||(e.TokenType={}));var R=e.TokenType,S=function(){function t(){}return t.prototype.tokenize=function(t){for(var e=new G(t),n=[],r=e.scanToken();null!=r;)n.push(r),r=e.scanToken();return n},t=_([P.Injectable(),b("design:paramtypes",[])],t)}();e.Lexer=S;var O=function(){function t(t,e,n,r){this.index=t,this.type=e,this.numValue=n,this.strValue=r}return t.prototype.isCharacter=function(t){return this.type==R.Character&&this.numValue==t},t.prototype.isNumber=function(){return this.type==R.Number},t.prototype.isString=function(){return this.type==R.String},t.prototype.isOperator=function(t){return this.type==R.Operator&&this.strValue==t},t.prototype.isIdentifier=function(){return this.type==R.Identifier},t.prototype.isKeyword=function(){return this.type==R.Keyword},t.prototype.isKeywordVar=function(){return this.type==R.Keyword&&"var"==this.strValue},t.prototype.isKeywordNull=function(){return this.type==R.Keyword&&"null"==this.strValue},t.prototype.isKeywordUndefined=function(){return this.type==R.Keyword&&"undefined"==this.strValue},t.prototype.isKeywordTrue=function(){return this.type==R.Keyword&&"true"==this.strValue},t.prototype.isKeywordFalse=function(){return this.type==R.Keyword&&"false"==this.strValue},t.prototype.toNumber=function(){return this.type==R.Number?this.numValue:-1},t.prototype.toString=function(){switch(this.type){case R.Character:case R.Identifier:case R.Keyword:case R.Operator:case R.String:return this.strValue;case R.Number:return this.numValue.toString();default:return null}},t}();e.Token=O,e.EOF=new O(-1,R.Character,0,""),e.$EOF=0,e.$TAB=9,e.$LF=10,e.$VTAB=11,e.$FF=12,e.$CR=13,e.$SPACE=32,e.$BANG=33,e.$DQ=34,e.$HASH=35,e.$$=36,e.$PERCENT=37,e.$AMPERSAND=38,e.$SQ=39,e.$LPAREN=40,e.$RPAREN=41,e.$STAR=42,e.$PLUS=43,e.$COMMA=44,e.$MINUS=45,e.$PERIOD=46,e.$SLASH=47,e.$COLON=58,e.$SEMICOLON=59,e.$LT=60,e.$EQ=61,e.$GT=62,e.$QUESTION=63;var T=48,x=57,A=65,I=69,M=90;e.$LBRACKET=91,e.$BACKSLASH=92,e.$RBRACKET=93;var k=94,N=95;e.$BT=96;var D=97,V=101,j=102,L=110,B=114,F=116,U=117,W=118,H=122;e.$LBRACE=123,e.$BAR=124,e.$RBRACE=125;var X=160,q=function(t){function e(e){t.call(this),this.message=e}return g(e,t),e.prototype.toString=function(){return this.message},e}(C.BaseException);e.ScannerError=q;var G=function(){function t(t){this.input=t,this.peek=0,this.index=-1,this.length=t.length,this.advance()}return t.prototype.advance=function(){this.peek=++this.index>=this.length?e.$EOF:w.StringWrapper.charCodeAt(this.input,this.index)},t.prototype.scanToken=function(){for(var t=this.input,n=this.length,i=this.peek,o=this.index;i<=e.$SPACE;){if(++o>=n){i=e.$EOF;break}i=w.StringWrapper.charCodeAt(t,o)}if(this.peek=i,this.index=o,o>=n)return null;if(p(i))return this.scanIdentifier();if(f(i))return this.scanNumber(o);var s=o;switch(i){case e.$PERIOD:return this.advance(),f(this.peek)?this.scanNumber(s):r(s,e.$PERIOD);case e.$LPAREN:case e.$RPAREN:case e.$LBRACE:case e.$RBRACE:case e.$LBRACKET:case e.$RBRACKET:case e.$COMMA:case e.$COLON:case e.$SEMICOLON:return this.scanCharacter(s,i);case e.$SQ:case e.$DQ:return this.scanString();case e.$HASH:case e.$PLUS:case e.$MINUS:case e.$STAR:case e.$SLASH:case e.$PERCENT:case k:return this.scanOperator(s,w.StringWrapper.fromCharCode(i));case e.$QUESTION:return this.scanComplexOperator(s,"?",e.$PERIOD,".");case e.$LT:case e.$GT:return this.scanComplexOperator(s,w.StringWrapper.fromCharCode(i),e.$EQ,"=");case e.$BANG:case e.$EQ:return this.scanComplexOperator(s,w.StringWrapper.fromCharCode(i),e.$EQ,"=",e.$EQ,"=");case e.$AMPERSAND:return this.scanComplexOperator(s,"&",e.$AMPERSAND,"&");case e.$BAR:return this.scanComplexOperator(s,"|",e.$BAR,"|");case X:for(;c(this.peek);)this.advance();return this.scanToken()}return this.error("Unexpected character ["+w.StringWrapper.fromCharCode(i)+"]",0),null},t.prototype.scanCharacter=function(t,e){return this.advance(),r(t,e)},t.prototype.scanOperator=function(t,e){return this.advance(),s(t,e)},t.prototype.scanComplexOperator=function(t,e,n,r,i,o){this.advance();var a=e;return this.peek==n&&(this.advance(),a+=r),w.isPresent(i)&&this.peek==i&&(this.advance(),a+=o),s(t,a)},t.prototype.scanIdentifier=function(){var t=this.index;for(this.advance();h(this.peek);)this.advance();var e=this.input.substring(t,this.index);return E.SetWrapper.has(z,e)?o(t,e):i(t,e)},t.prototype.scanNumber=function(t){var n=this.index===t;for(this.advance();;){if(f(this.peek));else if(this.peek==e.$PERIOD)n=!1;else{if(!d(this.peek))break;this.advance(),v(this.peek)&&this.advance(),f(this.peek)||this.error("Invalid exponent",-1),n=!1}this.advance()}var r=this.input.substring(t,this.index),i=n?w.NumberWrapper.parseIntAutoRadix(r):w.NumberWrapper.parseFloat(r);return u(t,i)},t.prototype.scanString=function(){var t=this.index,n=this.peek;this.advance();for(var r,i=this.index,o=this.input;this.peek!=n;)if(this.peek==e.$BACKSLASH){null==r&&(r=new w.StringJoiner),r.add(o.substring(i,this.index)),this.advance();var s;if(this.peek==U){var u=o.substring(this.index+1,this.index+5);try{s=w.NumberWrapper.parseInt(u,16)}catch(c){this.error("Invalid unicode escape [\\u"+u+"]",0)}for(var p=0;5>p;p++)this.advance()}else s=m(this.peek),this.advance();r.add(w.StringWrapper.fromCharCode(s)),i=this.index}else this.peek==e.$EOF?this.error("Unterminated quote",0):this.advance();var l=o.substring(i,this.index);this.advance();var h=l;return null!=r&&(r.add(l),h=r.toString()),a(t,h)},t.prototype.error=function(t,e){var n=this.index+e;throw new q("Lexer Error: "+t+" at column "+n+" in expression ["+this.input+"]")},t}();e.isIdentifier=l,e.isQuote=y;var z=(E.SetWrapper.createFromList(["+","-","*","/","%","^","=","==","!=","===","!==","<",">","<=",">=","&&","||","&","|","!","?","#","?."]),E.SetWrapper.createFromList(["var","null","undefined","true","false","if","else"]))},function(t,e,n){"use strict";function r(t,e,n){return u.isBlank(t)&&(t=d.getHtmlTagDefinition(e).implicitNamespacePrefix,u.isBlank(t)&&u.isPresent(n)&&(t=d.getNsPrefix(n.name))),d.mergeNsAndName(t,e)}function i(t,e){return t.length>0&&t[t.length-1]===e}var o=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},s=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},a=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},u=n(5),c=n(15),p=n(145),l=n(6),h=n(146),f=n(147),d=n(148),v=function(t){function e(e,n,r){t.call(this,n,r),this.elementName=e}return o(e,t),e.create=function(t,n,r){return new e(t,n,r)},e}(f.ParseError);e.HtmlTreeError=v;var y=function(){function t(t,e){this.rootNodes=t,this.errors=e}return t}();e.HtmlParseTreeResult=y;var m=function(){function t(){}return t.prototype.parse=function(t,e,n){void 0===n&&(n=!1);var r=h.tokenizeHtml(t,e,n),i=new g(r.tokens).build();return new y(i.rootNodes,r.errors.concat(i.errors))},t=s([l.Injectable(),a("design:paramtypes",[])],t)}();e.HtmlParser=m;var g=function(){function t(t){this.tokens=t,this.index=-1,this.rootNodes=[],this.errors=[],this.elementStack=[],this._advance()}return t.prototype.build=function(){for(;this.peek.type!==h.HtmlTokenType.EOF;)this.peek.type===h.HtmlTokenType.TAG_OPEN_START?this._consumeStartTag(this._advance()):this.peek.type===h.HtmlTokenType.TAG_CLOSE?this._consumeEndTag(this._advance()):this.peek.type===h.HtmlTokenType.CDATA_START?(this._closeVoidElement(),this._consumeCdata(this._advance())):this.peek.type===h.HtmlTokenType.COMMENT_START?(this._closeVoidElement(),this._consumeComment(this._advance())):this.peek.type===h.HtmlTokenType.TEXT||this.peek.type===h.HtmlTokenType.RAW_TEXT||this.peek.type===h.HtmlTokenType.ESCAPABLE_RAW_TEXT?(this._closeVoidElement(),this._consumeText(this._advance())):this.peek.type===h.HtmlTokenType.EXPANSION_FORM_START?this._consumeExpansion(this._advance()):this._advance();return new y(this.rootNodes,this.errors)},t.prototype._advance=function(){var t=this.peek;return this.index0)return this.errors=this.errors.concat(o.errors),null;var s=new f.ParseSourceSpan(e.sourceSpan.start,i.sourceSpan.end),a=new f.ParseSourceSpan(n.sourceSpan.start,i.sourceSpan.end);return new p.HtmlExpansionCaseAst(e.parts[0],o.rootNodes,s,e.sourceSpan,a)},t.prototype._collectExpansionExpTokens=function(t){for(var e=[],n=[h.HtmlTokenType.EXPANSION_CASE_EXP_START];;){if((this.peek.type===h.HtmlTokenType.EXPANSION_FORM_START||this.peek.type===h.HtmlTokenType.EXPANSION_CASE_EXP_START)&&n.push(this.peek.type),this.peek.type===h.HtmlTokenType.EXPANSION_CASE_EXP_END){if(!i(n,h.HtmlTokenType.EXPANSION_CASE_EXP_START))return this.errors.push(v.create(null,t.sourceSpan,"Invalid expansion form. Missing '}'.")),null;if(n.pop(),0==n.length)return e}if(this.peek.type===h.HtmlTokenType.EXPANSION_FORM_END){if(!i(n,h.HtmlTokenType.EXPANSION_FORM_START))return this.errors.push(v.create(null,t.sourceSpan,"Invalid expansion form. Missing '}'.")),null;n.pop()}if(this.peek.type===h.HtmlTokenType.EOF)return this.errors.push(v.create(null,t.sourceSpan,"Invalid expansion form. Missing '}'.")),null;e.push(this._advance())}},t.prototype._consumeText=function(t){var e=t.parts[0];if(e.length>0&&"\n"==e[0]){var n=this._getParentElement();u.isPresent(n)&&0==n.children.length&&d.getHtmlTagDefinition(n.name).ignoreFirstLf&&(e=e.substring(1))}e.length>0&&this._addToParent(new p.HtmlTextAst(e,t.sourceSpan))},t.prototype._closeVoidElement=function(){if(this.elementStack.length>0){var t=c.ListWrapper.last(this.elementStack);d.getHtmlTagDefinition(t.name).isVoid&&this.elementStack.pop()}},t.prototype._consumeStartTag=function(t){for(var e=t.parts[0],n=t.parts[1],i=[];this.peek.type===h.HtmlTokenType.ATTR_NAME;)i.push(this._consumeAttr(this._advance()));var o=r(e,n,this._getParentElement()),s=!1;this.peek.type===h.HtmlTokenType.TAG_OPEN_END_VOID?(this._advance(),s=!0,null!=d.getNsPrefix(o)||d.getHtmlTagDefinition(o).isVoid||this.errors.push(v.create(o,t.sourceSpan,'Only void and foreign elements can be self closed "'+t.parts[1]+'"'))):this.peek.type===h.HtmlTokenType.TAG_OPEN_END&&(this._advance(),s=!1);var a=this.peek.sourceSpan.start,u=new f.ParseSourceSpan(t.sourceSpan.start,a),c=new p.HtmlElementAst(o,i,[],u,u,null);this._pushElement(c),s&&(this._popElement(o),c.endSourceSpan=u)},t.prototype._pushElement=function(t){if(this.elementStack.length>0){var e=c.ListWrapper.last(this.elementStack);d.getHtmlTagDefinition(e.name).isClosedByChild(t.name)&&this.elementStack.pop()}var n=d.getHtmlTagDefinition(t.name),e=this._getParentElement();if(n.requireExtraParent(u.isPresent(e)?e.name:null)){var r=new p.HtmlElementAst(n.parentToAdd,[],[t],t.sourceSpan,t.startSourceSpan,t.endSourceSpan);this._addToParent(r),this.elementStack.push(r),this.elementStack.push(t)}else this._addToParent(t),this.elementStack.push(t)},t.prototype._consumeEndTag=function(t){var e=r(t.parts[0],t.parts[1],this._getParentElement());this._getParentElement().endSourceSpan=t.sourceSpan,d.getHtmlTagDefinition(e).isVoid?this.errors.push(v.create(e,t.sourceSpan,'Void elements do not have end tags "'+t.parts[1]+'"')):this._popElement(e)||this.errors.push(v.create(e,t.sourceSpan,'Unexpected closing tag "'+t.parts[1]+'"'))},t.prototype._popElement=function(t){for(var e=this.elementStack.length-1;e>=0;e--){var n=this.elementStack[e];if(n.name==t)return c.ListWrapper.splice(this.elementStack,e,this.elementStack.length-e),!0;if(!d.getHtmlTagDefinition(n.name).closedByParent)return!1}return!1},t.prototype._consumeAttr=function(t){var e=d.mergeNsAndName(t.parts[0],t.parts[1]),n=t.sourceSpan.end,r="";if(this.peek.type===h.HtmlTokenType.ATTR_VALUE){var i=this._advance();r=i.parts[0],n=i.sourceSpan.end}return new p.HtmlAttrAst(e,r,new f.ParseSourceSpan(t.sourceSpan.start,n))},t.prototype._getParentElement=function(){return this.elementStack.length>0?c.ListWrapper.last(this.elementStack):null},t.prototype._addToParent=function(t){var e=this._getParentElement();u.isPresent(e)?e.children.push(t):this.rootNodes.push(t)},t}()},function(t,e,n){"use strict";function r(t,e,n){void 0===n&&(n=null);var r=[];return e.forEach(function(e){var o=e.visit(t,n);i.isPresent(o)&&r.push(o)}),r}var i=n(5),o=function(){function t(t,e){this.value=t,this.sourceSpan=e}return t.prototype.visit=function(t,e){return t.visitText(this,e)},t}();e.HtmlTextAst=o;var s=function(){function t(t,e,n,r,i){this.switchValue=t,this.type=e,this.cases=n,this.sourceSpan=r,this.switchValueSourceSpan=i}return t.prototype.visit=function(t,e){return t.visitExpansion(this,e)},t}();e.HtmlExpansionAst=s;var a=function(){function t(t,e,n,r,i){this.value=t,this.expression=e,this.sourceSpan=n,this.valueSourceSpan=r,this.expSourceSpan=i}return t.prototype.visit=function(t,e){return t.visitExpansionCase(this,e)},t}();e.HtmlExpansionCaseAst=a;var u=function(){function t(t,e,n){this.name=t,this.value=e,this.sourceSpan=n}return t.prototype.visit=function(t,e){return t.visitAttr(this,e)},t}();e.HtmlAttrAst=u;var c=function(){function t(t,e,n,r,i,o){this.name=t,this.attrs=e,this.children=n,this.sourceSpan=r,this.startSourceSpan=i,this.endSourceSpan=o}return t.prototype.visit=function(t,e){return t.visitElement(this,e)},t}();e.HtmlElementAst=c;var p=function(){function t(t,e){this.value=t,this.sourceSpan=e}return t.prototype.visit=function(t,e){return t.visitComment(this,e)},t}();e.HtmlCommentAst=p,e.htmlVisitAll=r},function(t,e,n){"use strict";function r(t,e,n){return void 0===n&&(n=!1),new ut(new P.ParseSourceFile(t,e),n).tokenize()}function i(t){var e=t===O?"EOF":_.StringWrapper.fromCharCode(t);return'Unexpected character "'+e+'"'}function o(t){return'Unknown entity "'+t+'" - use the "&#;" or "&#x;" syntax'}function s(t){return!a(t)||t===O}function a(t){return t>=T&&I>=t||t===ot}function u(t){return a(t)||t===q||t===L||t===V||t===k||t===X}function c(t){return(et>t||t>rt)&&(J>t||t>tt)&&(B>t||t>U)}function p(t){return t==F||t==O||!d(t)}function l(t){return t==F||t==O||!f(t)}function h(t,e){return t===K&&e!=K}function f(t){return t>=et&&rt>=t||t>=J&&tt>=t}function d(t){return t>=et&&nt>=t||t>=J&&Z>=t||t>=B&&U>=t}function v(t,e){return y(t)==y(e)}function y(t){return t>=et&&rt>=t?t-et+J:t}function m(t){for(var e,n=[],r=0;r=this.length)throw this._createError(i(O),this._getSpan());this.peek===x?(this.line++,this.column=0):this.peek!==x&&this.peek!==A&&this.column++,this.index++,this.peek=this.index>=this.length?O:_.StringWrapper.charCodeAt(this.input,this.index),this.nextPeek=this.index+1>=this.length?O:_.StringWrapper.charCodeAt(this.input,this.index+1)},t.prototype._attemptCharCode=function(t){return this.peek===t?(this._advance(),!0):!1},t.prototype._attemptCharCodeCaseInsensitive=function(t){return v(this.peek,t)?(this._advance(),!0):!1},t.prototype._requireCharCode=function(t){var e=this._getLocation();if(!this._attemptCharCode(t))throw this._createError(i(this.peek),this._getSpan(e,e))},t.prototype._attemptStr=function(t){for(var e=0;er.offset&&o.push(this.input.substring(r.offset,this.index));this.peek!==e;)o.push(this._readChar(t))}return this._endToken([this._processCarriageReturns(o.join(""))],r)},t.prototype._consumeComment=function(t){var e=this;this._beginToken(w.COMMENT_START,t),this._requireCharCode(j),this._endToken([]);var n=this._consumeRawText(!1,j,function(){return e._attemptStr("->")});this._beginToken(w.COMMENT_END,n.sourceSpan.end),this._endToken([])},t.prototype._consumeCdata=function(t){var e=this;this._beginToken(w.CDATA_START,t),this._requireStr("CDATA["),this._endToken([]);var n=this._consumeRawText(!1,z,function(){return e._attemptStr("]>")});this._beginToken(w.CDATA_END,n.sourceSpan.end),this._endToken([])},t.prototype._consumeDocType=function(t){this._beginToken(w.DOC_TYPE,t),this._attemptUntilChar(q),this._advance(),this._endToken([this.input.substring(t.offset+2,this.index-1)])},t.prototype._consumePrefixAndName=function(){for(var t=this.index,e=null;this.peek!==W&&!c(this.peek);)this._advance();var n;this.peek===W?(this._advance(),e=this.input.substring(t,this.index-1),n=this.index):n=t,this._requireCharCodeUntilFn(u,this.index===n?1:0);var r=this.input.substring(n,this.index);return[e,r]},t.prototype._consumeTagOpen=function(t){var e,n=this._savePosition();try{if(!f(this.peek))throw this._createError(i(this.peek),this._getSpan());var r=this.index;for(this._consumeTagOpenStart(t),e=this.input.substring(r,this.index).toLowerCase(),this._attemptCharCodeUntilFn(s);this.peek!==L&&this.peek!==q;)this._consumeAttributeName(),this._attemptCharCodeUntilFn(s),this._attemptCharCode(X)&&(this._attemptCharCodeUntilFn(s),this._consumeAttributeValue()),this._attemptCharCodeUntilFn(s);this._consumeTagOpenEnd()}catch(o){if(o instanceof at)return this._restorePosition(n),this._beginToken(w.TEXT,t),void this._endToken(["<"]);throw o}var a=E.getHtmlTagDefinition(e).contentType;a===E.HtmlTagContentType.RAW_TEXT?this._consumeRawTextWithTagClose(e,!1):a===E.HtmlTagContentType.ESCAPABLE_RAW_TEXT&&this._consumeRawTextWithTagClose(e,!0)},t.prototype._consumeRawTextWithTagClose=function(t,e){var n=this,r=this._consumeRawText(e,H,function(){return n._attemptCharCode(L)?(n._attemptCharCodeUntilFn(s),n._attemptStrCaseInsensitive(t)?(n._attemptCharCodeUntilFn(s),n._attemptCharCode(q)?!0:!1):!1):!1});this._beginToken(w.TAG_CLOSE,r.sourceSpan.end),this._endToken([null,t])},t.prototype._consumeTagOpenStart=function(t){this._beginToken(w.TAG_OPEN_START,t);var e=this._consumePrefixAndName();this._endToken(e)},t.prototype._consumeAttributeName=function(){this._beginToken(w.ATTR_NAME);var t=this._consumePrefixAndName();this._endToken(t)},t.prototype._consumeAttributeValue=function(){this._beginToken(w.ATTR_VALUE);var t;if(this.peek===V||this.peek===k){var e=this.peek;this._advance();for(var n=[];this.peek!==e;)n.push(this._readChar(!0));t=n.join(""),this._advance()}else{var r=this.index;this._requireCharCodeUntilFn(u,1),t=this.input.substring(r,this.index)}this._endToken([this._processCarriageReturns(t)])},t.prototype._consumeTagOpenEnd=function(){var t=this._attemptCharCode(L)?w.TAG_OPEN_END_VOID:w.TAG_OPEN_END;this._beginToken(t),this._requireCharCode(q),this._endToken([])},t.prototype._consumeTagClose=function(t){this._beginToken(w.TAG_CLOSE,t),this._attemptCharCodeUntilFn(s);var e;e=this._consumePrefixAndName(),this._attemptCharCodeUntilFn(s),this._requireCharCode(q),this._endToken(e)},t.prototype._consumeExpansionFormStart=function(){this._beginToken(w.EXPANSION_FORM_START,this._getLocation()),this._requireCharCode(K),this._endToken([]),this._beginToken(w.RAW_TEXT,this._getLocation());var t=this._readUntil(Q);this._endToken([t],this._getLocation()),this._requireCharCode(Q),this._attemptCharCodeUntilFn(s),this._beginToken(w.RAW_TEXT,this._getLocation());var e=this._readUntil(Q);this._endToken([e],this._getLocation()),this._requireCharCode(Q),this._attemptCharCodeUntilFn(s),this.expansionCaseStack.push(w.EXPANSION_FORM_START)},t.prototype._consumeExpansionCaseStart=function(){this._requireCharCode(X),this._beginToken(w.EXPANSION_CASE_VALUE,this._getLocation());var t=this._readUntil(K).trim();this._endToken([t],this._getLocation()),this._attemptCharCodeUntilFn(s),this._beginToken(w.EXPANSION_CASE_EXP_START,this._getLocation()),this._requireCharCode(K),this._endToken([],this._getLocation()),this._attemptCharCodeUntilFn(s),this.expansionCaseStack.push(w.EXPANSION_CASE_EXP_START)},t.prototype._consumeExpansionCaseEnd=function(){this._beginToken(w.EXPANSION_CASE_EXP_END,this._getLocation()),this._requireCharCode($),this._endToken([],this._getLocation()),this._attemptCharCodeUntilFn(s),this.expansionCaseStack.pop()},t.prototype._consumeExpansionFormEnd=function(){this._beginToken(w.EXPANSION_FORM_END,this._getLocation()),this._requireCharCode($),this._endToken([]),this.expansionCaseStack.pop()},t.prototype._consumeText=function(){var t=this._getLocation();this._beginToken(w.TEXT,t);var e=[],n=!1;for(this.peek===K&&this.nextPeek===K?(e.push(this._readChar(!0)),e.push(this._readChar(!0)),n=!0):e.push(this._readChar(!0));!this.isTextEnd(n);)this.peek===K&&this.nextPeek===K?(e.push(this._readChar(!0)),e.push(this._readChar(!0)),n=!0):this.peek===$&&this.nextPeek===$&&n?(e.push(this._readChar(!0)),e.push(this._readChar(!0)),n=!1):e.push(this._readChar(!0));this._endToken([this._processCarriageReturns(e.join(""))])},t.prototype.isTextEnd=function(t){if(this.peek===H||this.peek===O)return!0;if(this.tokenizeExpansionForms){if(h(this.peek,this.nextPeek))return!0;if(this.peek===$&&!t&&(this.isInExpansionCase()||this.isInExpansionForm()))return!0}return!1},t.prototype._savePosition=function(){return[this.peek,this.index,this.column,this.line,this.tokens.length]},t.prototype._readUntil=function(t){var e=this.index;return this._attemptUntilChar(t),this.input.substring(e,this.index)},t.prototype._restorePosition=function(t){this.peek=t[0],this.index=t[1],this.column=t[2],this.line=t[3];var e=t[4];e0&&this.expansionCaseStack[this.expansionCaseStack.length-1]===w.EXPANSION_CASE_EXP_START},t.prototype.isInExpansionForm=function(){return this.expansionCaseStack.length>0&&this.expansionCaseStack[this.expansionCaseStack.length-1]===w.EXPANSION_FORM_START},t}()},function(t,e){"use strict";var n=function(){function t(t,e,n,r){this.file=t,this.offset=e,this.line=n,this.col=r}return t.prototype.toString=function(){return this.file.url+"@"+this.line+":"+this.col},t}();e.ParseLocation=n;var r=function(){function t(t,e){this.content=t,this.url=e}return t}();e.ParseSourceFile=r;var i=function(){function t(t,e){this.start=t,this.end=e}return t.prototype.toString=function(){return this.start.file.content.substring(this.start.offset,this.end.offset)},t}();e.ParseSourceSpan=i;var o=function(){function t(t,e){this.span=t,this.msg=e}return t.prototype.toString=function(){var t=this.span.start.file.content,e=this.span.start.offset;e>t.length-1&&(e=t.length-1);for(var n=e,r=0,i=0;100>r&&e>0&&(e--,r++,"\n"!=t[e]||3!=++i););for(r=0,i=0;100>r&&n]"+t.substring(this.span.start.offset,n+1);return this.msg+' ("'+o+'"): '+this.span.start},t}();e.ParseError=o},function(t,e,n){"use strict";function r(t){var e=p[t.toLowerCase()];return a.isPresent(e)?e:l}function i(t){if("@"!=t[0])return[null,t];var e=a.RegExpWrapper.firstMatch(h,t);return[e[1],e[2]]}function o(t){return i(t)[0]}function s(t,e){return a.isPresent(t)?"@"+t+":"+e:e}var a=n(5);e.NAMED_ENTITIES=a.CONST_EXPR({Aacute:"Á",aacute:"á",Acirc:"Â",acirc:"â",acute:"´",AElig:"Æ",aelig:"æ",Agrave:"À",agrave:"à",alefsym:"ℵ",Alpha:"Α",alpha:"α",amp:"&",and:"∧",ang:"∠",apos:"'",Aring:"Å",aring:"å",asymp:"≈",Atilde:"Ã",atilde:"ã",Auml:"Ä",auml:"ä",bdquo:"„",Beta:"Β",beta:"β",brvbar:"¦",bull:"•",cap:"∩",Ccedil:"Ç",ccedil:"ç",cedil:"¸",cent:"¢",Chi:"Χ",chi:"χ",circ:"ˆ",clubs:"♣",cong:"≅",copy:"©",crarr:"↵",cup:"∪",curren:"¤",dagger:"†",Dagger:"‡",darr:"↓",dArr:"⇓",deg:"°",Delta:"Δ",delta:"δ",diams:"♦",divide:"÷",Eacute:"É",eacute:"é",Ecirc:"Ê",ecirc:"ê",Egrave:"È",egrave:"è",empty:"∅",emsp:" ",ensp:" ",Epsilon:"Ε",epsilon:"ε",equiv:"≡",Eta:"Η",eta:"η",ETH:"Ð",eth:"ð",Euml:"Ë",euml:"ë",euro:"€",exist:"∃",fnof:"ƒ",forall:"∀",frac12:"½",frac14:"¼",frac34:"¾",frasl:"⁄",Gamma:"Γ",gamma:"γ",ge:"≥",gt:">",harr:"↔",hArr:"⇔",hearts:"♥",hellip:"…",Iacute:"Í",iacute:"í",Icirc:"Î",icirc:"î",iexcl:"¡",Igrave:"Ì",igrave:"ì",image:"ℑ",infin:"∞","int":"∫",Iota:"Ι",iota:"ι",iquest:"¿",isin:"∈",Iuml:"Ï",iuml:"ï",Kappa:"Κ",kappa:"κ",Lambda:"Λ",lambda:"λ",lang:"⟨",laquo:"«",larr:"←",lArr:"⇐",lceil:"⌈",ldquo:"“",le:"≤",lfloor:"⌊",lowast:"∗",loz:"◊",lrm:"‎",lsaquo:"‹",lsquo:"‘",lt:"<",macr:"¯",mdash:"—",micro:"µ",middot:"·",minus:"−",Mu:"Μ",mu:"μ",nabla:"∇",nbsp:" ",ndash:"–",ne:"≠",ni:"∋",not:"¬",notin:"∉",nsub:"⊄",Ntilde:"Ñ",ntilde:"ñ",Nu:"Ν",nu:"ν",Oacute:"Ó",oacute:"ó",Ocirc:"Ô",ocirc:"ô",OElig:"Œ",oelig:"œ",Ograve:"Ò",ograve:"ò",oline:"‾",Omega:"Ω",omega:"ω",Omicron:"Ο",omicron:"ο",oplus:"⊕",or:"∨",ordf:"ª",ordm:"º",Oslash:"Ø",oslash:"ø",Otilde:"Õ",otilde:"õ",otimes:"⊗",Ouml:"Ö",ouml:"ö",para:"¶",permil:"‰",perp:"⊥",Phi:"Φ",phi:"φ",Pi:"Π",pi:"π",piv:"ϖ",plusmn:"±",pound:"£",prime:"′",Prime:"″",prod:"∏",prop:"∝",Psi:"Ψ",psi:"ψ",quot:'"',radic:"√",rang:"⟩",raquo:"»",rarr:"→",rArr:"⇒",rceil:"⌉",rdquo:"”",real:"ℜ",reg:"®",rfloor:"⌋",Rho:"Ρ",rho:"ρ",rlm:"‏",rsaquo:"›",rsquo:"’",sbquo:"‚",Scaron:"Š",scaron:"š",sdot:"⋅",sect:"§",shy:"­",Sigma:"Σ",sigma:"σ",sigmaf:"ς",sim:"∼",spades:"♠",sub:"⊂",sube:"⊆",sum:"∑",sup:"⊃",sup1:"¹",sup2:"²",sup3:"³",supe:"⊇",szlig:"ß",Tau:"Τ",tau:"τ",there4:"∴",Theta:"Θ",theta:"θ",thetasym:"ϑ",thinsp:" ",THORN:"Þ",thorn:"þ",tilde:"˜",times:"×",trade:"™",Uacute:"Ú",uacute:"ú",uarr:"↑",uArr:"⇑",Ucirc:"Û",ucirc:"û",Ugrave:"Ù",ugrave:"ù",uml:"¨",upsih:"ϒ",Upsilon:"Υ",upsilon:"υ",Uuml:"Ü",uuml:"ü",weierp:"℘",Xi:"Ξ",xi:"ξ",Yacute:"Ý",yacute:"ý",yen:"¥",yuml:"ÿ",Yuml:"Ÿ",Zeta:"Ζ",zeta:"ζ",zwj:"‍",zwnj:"‌"}),function(t){t[t.RAW_TEXT=0]="RAW_TEXT",t[t.ESCAPABLE_RAW_TEXT=1]="ESCAPABLE_RAW_TEXT",t[t.PARSABLE_DATA=2]="PARSABLE_DATA"}(e.HtmlTagContentType||(e.HtmlTagContentType={}));var u=e.HtmlTagContentType,c=function(){function t(t){var e=this,n=void 0===t?{}:t,r=n.closedByChildren,i=n.requiredParents,o=n.implicitNamespacePrefix,s=n.contentType,c=n.closedByParent,p=n.isVoid,l=n.ignoreFirstLf;this.closedByChildren={},this.closedByParent=!1,a.isPresent(r)&&r.length>0&&r.forEach(function(t){return e.closedByChildren[t]=!0}),this.isVoid=a.normalizeBool(p),this.closedByParent=a.normalizeBool(c)||this.isVoid,a.isPresent(i)&&i.length>0&&(this.requiredParents={},this.parentToAdd=i[0],i.forEach(function(t){return e.requiredParents[t]=!0})),this.implicitNamespacePrefix=o,this.contentType=a.isPresent(s)?s:u.PARSABLE_DATA,this.ignoreFirstLf=a.normalizeBool(l)}return t.prototype.requireExtraParent=function(t){if(a.isBlank(this.requiredParents))return!1;if(a.isBlank(t))return!0;var e=t.toLowerCase();return 1!=this.requiredParents[e]&&"template"!=e},t.prototype.isClosedByChild=function(t){return this.isVoid||a.normalizeBool(this.closedByChildren[t.toLowerCase()])},t}();e.HtmlTagDefinition=c;var p={base:new c({isVoid:!0}),meta:new c({isVoid:!0}),area:new c({isVoid:!0}),embed:new c({isVoid:!0}),link:new c({isVoid:!0}),img:new c({isVoid:!0}),input:new c({isVoid:!0}),param:new c({isVoid:!0}),hr:new c({isVoid:!0}),br:new c({isVoid:!0}),source:new c({isVoid:!0}),track:new c({isVoid:!0}),wbr:new c({isVoid:!0}),p:new c({closedByChildren:["address","article","aside","blockquote","div","dl","fieldset","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","main","nav","ol","p","pre","section","table","ul"],closedByParent:!0}),thead:new c({closedByChildren:["tbody","tfoot"]}),tbody:new c({closedByChildren:["tbody","tfoot"],closedByParent:!0}),tfoot:new c({closedByChildren:["tbody"],closedByParent:!0}),tr:new c({closedByChildren:["tr"],requiredParents:["tbody","tfoot","thead"],closedByParent:!0}),td:new c({closedByChildren:["td","th"],closedByParent:!0}),th:new c({closedByChildren:["td","th"],closedByParent:!0}),col:new c({requiredParents:["colgroup"],isVoid:!0}),svg:new c({implicitNamespacePrefix:"svg"}),math:new c({implicitNamespacePrefix:"math"}),li:new c({closedByChildren:["li"],closedByParent:!0}),dt:new c({closedByChildren:["dt","dd"]}),dd:new c({closedByChildren:["dt","dd"],closedByParent:!0}),rb:new c({closedByChildren:["rb","rt","rtc","rp"],closedByParent:!0}),rt:new c({closedByChildren:["rb","rt","rtc","rp"],closedByParent:!0}),rtc:new c({closedByChildren:["rb","rtc","rp"],closedByParent:!0}),rp:new c({closedByChildren:["rb","rt","rtc","rp"],closedByParent:!0}),optgroup:new c({closedByChildren:["optgroup"],closedByParent:!0}),option:new c({closedByChildren:["option","optgroup"],closedByParent:!0}),pre:new c({ignoreFirstLf:!0}),listing:new c({ignoreFirstLf:!0}),style:new c({contentType:u.RAW_TEXT}),script:new c({contentType:u.RAW_TEXT}),title:new c({contentType:u.ESCAPABLE_RAW_TEXT}),textarea:new c({contentType:u.ESCAPABLE_RAW_TEXT,ignoreFirstLf:!0})},l=new c;e.getHtmlTagDefinition=r;var h=/^@([^:]+):(.+)/g;e.splitNsName=i,e.getNsPrefix=o,e.mergeNsAndName=s},function(t,e,n){"use strict";var r=n(15),i=n(5),o=n(12),s="",a=i.RegExpWrapper.create("(\\:not\\()|([-\\w]+)|(?:\\.([-\\w]+))|(?:\\[([-\\w*]+)(?:=([^\\]]*))?\\])|(\\))|(\\s*,\\s*)"),u=function(){function t(){this.element=null,this.classNames=[],this.attrs=[],this.notSelectors=[]}return t.parse=function(e){for(var n,s=[],u=function(t,e){e.notSelectors.length>0&&i.isBlank(e.element)&&r.ListWrapper.isEmpty(e.classNames)&&r.ListWrapper.isEmpty(e.attrs)&&(e.element="*"),t.push(e)},c=new t,p=i.RegExpWrapper.matcher(a,e),l=c,h=!1;i.isPresent(n=i.RegExpMatcherWrapper.next(p));){if(i.isPresent(n[1])){if(h)throw new o.BaseException("Nesting :not is not allowed in a selector");h=!0,l=new t,c.notSelectors.push(l)}if(i.isPresent(n[2])&&l.setElement(n[2]),i.isPresent(n[3])&&l.addClassName(n[3]),i.isPresent(n[4])&&l.addAttribute(n[4],n[5]),i.isPresent(n[6])&&(h=!1,l=c),i.isPresent(n[7])){if(h)throw new o.BaseException("Multiple selectors in :not are not supported");u(s,c),c=l=new t}}return u(s,c),s},t.prototype.isElementSelector=function(){return i.isPresent(this.element)&&r.ListWrapper.isEmpty(this.classNames)&&r.ListWrapper.isEmpty(this.attrs)&&0===this.notSelectors.length},t.prototype.setElement=function(t){void 0===t&&(t=null),this.element=t},t.prototype.getMatchingElementTemplate=function(){for(var t=i.isPresent(this.element)?this.element:"div",e=this.classNames.length>0?' class="'+this.classNames.join(" ")+'"':"",n="",r=0;r"},t.prototype.addAttribute=function(t,e){void 0===e&&(e=s),this.attrs.push(t),e=i.isPresent(e)?e.toLowerCase():s,this.attrs.push(e)},t.prototype.addClassName=function(t){this.classNames.push(t.toLowerCase())},t.prototype.toString=function(){var t="";if(i.isPresent(this.element)&&(t+=this.element),i.isPresent(this.classNames))for(var e=0;e0&&(t+="="+r),t+="]"}return this.notSelectors.forEach(function(e){return t+=":not("+e+")"}),t},t}();e.CssSelector=u;var c=function(){function t(){this._elementMap=new r.Map,this._elementPartialMap=new r.Map,this._classMap=new r.Map,this._classPartialMap=new r.Map,this._attrValueMap=new r.Map,this._attrValuePartialMap=new r.Map,this._listContexts=[]}return t.createNotMatcher=function(e){var n=new t;return n.addSelectables(e,null),n},t.prototype.addSelectables=function(t,e){var n=null;t.length>1&&(n=new p(t),this._listContexts.push(n));for(var r=0;r0&&(i.isBlank(this.listContext)||!this.listContext.alreadyMatched)){var r=c.createNotMatcher(this.notSelectors);n=!r.match(t,null)}return n&&i.isPresent(e)&&(i.isBlank(this.listContext)||!this.listContext.alreadyMatched)&&(i.isPresent(this.listContext)&&(this.listContext.alreadyMatched=!0),e(this.selector,this.cbContext)),n},t}();e.SelectorContext=l},function(t,e){"use strict";var n=function(){function t(){}return t.prototype.hasProperty=function(t,e){return!0},t.prototype.getMappedPropName=function(t){return t},t}();e.ElementSchemaRegistry=n},function(t,e,n){"use strict";function r(t){var e=null,n=null,r=null,o=!1,_=null;t.attrs.forEach(function(t){var i=t.name.toLowerCase();i==a?e=t.value:i==l?n=t.value:i==p?r=t.value:t.name==v?o=!0:t.name==y&&t.value.length>0&&(_=t.value)}),e=i(e);var b=t.name.toLowerCase(),P=m.OTHER;return s.splitNsName(b)[1]==u?P=m.NG_CONTENT:b==f?P=m.STYLE:b==d?P=m.SCRIPT:b==c&&r==h&&(P=m.STYLESHEET),new g(P,e,n,o,_)}function i(t){return o.isBlank(t)||0===t.length?"*":t}var o=n(5),s=n(148),a="select",u="ng-content",c="link",p="rel",l="href",h="stylesheet",f="style",d="script",v="ngNonBindable",y="ngProjectAs";e.preparseElement=r,function(t){t[t.NG_CONTENT=0]="NG_CONTENT",t[t.STYLE=1]="STYLE",t[t.STYLESHEET=2]="STYLESHEET",t[t.SCRIPT=3]="SCRIPT",t[t.OTHER=4]="OTHER"}(e.PreparsedElementType||(e.PreparsedElementType={}));var m=e.PreparsedElementType,g=function(){function t(t,e,n,r,i){this.type=t,this.selectAttr=e,this.hrefAttr=n,this.nonBindable=r,this.projectAs=i}return t}();e.PreparsedElement=g},function(t,e,n){"use strict";function r(t){if(o.isBlank(t)||0===t.length||"/"==t[0])return!1;var e=o.RegExpWrapper.firstMatch(u,t);return o.isBlank(e)||"package"==e[1]||"asset"==e[1]}function i(t,e,n){var i=[],u=o.StringWrapper.replaceAllMapped(n,a,function(n){var s=o.isPresent(n[1])?n[1]:n[2];return r(s)?(i.push(t.resolve(e,s)),""):n[0]});return new s(u,i)}var o=n(5),s=function(){function t(t,e){this.style=t,this.styleUrls=e}return t}();e.StyleWithImports=s,e.isStyleUrlResolvable=r,e.extractStyleUrls=i;var a=/@import\s+(?:url\()?\s*(?:(?:['"]([^'"]*))|([^;\)\s]*))[^;]*;?/g,u=/^([a-zA-Z\-\+\.]+):/g},function(t,e,n){"use strict";function r(t){return a.StringWrapper.replaceAllMapped(t,u,function(t){return"-"+t[1].toLowerCase()})}function i(t){return a.StringWrapper.replaceAllMapped(t,c,function(t){return t[1].toUpperCase()})}function o(t,e){var n=a.StringWrapper.split(t.trim(),/\s*:\s*/g);return n.length>1?n:e}function s(t){return a.StringWrapper.replaceAll(t,/\W/g,"_")}var a=n(5);e.MODULE_SUFFIX=a.IS_DART?".dart":"";var u=/([A-Z])/g,c=/-([a-z])/g;e.camelCaseToDashCase=r,e.dashCaseToCamelCase=i,e.splitAtColon=o,e.sanitizeIdentifier=s},function(t,e,n){"use strict";function r(t,e){var n=e.useExisting,r=e.useValue,i=e.deps;return new v.CompileProviderMetadata({token:t.token,useClass:t.useClass,useExisting:n,useFactory:t.useFactory,useValue:r,deps:i,multi:t.multi})}function i(t,e){var n=e.eager,r=e.providers;return new d.ProviderAst(t.token,t.multiProvider,t.eager||n,r,t.providerType,t.sourceSpan)}function o(t,e,n,r){return void 0===r&&(r=null),h.isBlank(r)&&(r=[]),h.isPresent(t)&&t.forEach(function(t){if(h.isArray(t))o(t,e,n,r);else{var i;t instanceof v.CompileProviderMetadata?i=t:t instanceof v.CompileTypeMetadata?i=new v.CompileProviderMetadata({token:new v.CompileTokenMetadata({identifier:t}),useClass:t}):n.push(new g("Unknown provider type "+t,e)),h.isPresent(i)&&r.push(i)}}),r}function s(t,e,n){var r=new v.CompileTokenMap;t.forEach(function(t){var i=new v.CompileProviderMetadata({token:new v.CompileTokenMetadata({identifier:t.type}),useClass:t.type});a([i],t.isComponent?d.ProviderAstType.Component:d.ProviderAstType.Directive,!0,e,n,r)});var i=t.filter(function(t){return t.isComponent}).concat(t.filter(function(t){return!t.isComponent}));return i.forEach(function(t){a(o(t.providers,e,n),d.ProviderAstType.PublicService,!1,e,n,r),a(o(t.viewProviders,e,n),d.ProviderAstType.PrivateService,!1,e,n,r)}),r}function a(t,e,n,r,i,o){t.forEach(function(t){var s=o.get(t.token);h.isPresent(s)&&s.multiProvider!==t.multi&&i.push(new g("Mixing multi and non multi provider is not possible for token "+s.token.name,r)),h.isBlank(s)?(s=new d.ProviderAst(t.token,t.multi,n,[t],e,r),o.add(t.token,s)):(t.multi||f.ListWrapper.clear(s.providers),s.providers.push(t))})}function u(t){var e=new v.CompileTokenMap;return h.isPresent(t.viewQueries)&&t.viewQueries.forEach(function(t){return p(e,t)}),t.type.diDeps.forEach(function(t){h.isPresent(t.viewQuery)&&p(e,t.viewQuery)}),e}function c(t){var e=new v.CompileTokenMap;return t.forEach(function(t){h.isPresent(t.queries)&&t.queries.forEach(function(t){return p(e,t)}),t.type.diDeps.forEach(function(t){h.isPresent(t.query)&&p(e,t.query)})}),e}function p(t,e){e.selectors.forEach(function(n){var r=t.get(n);h.isBlank(r)&&(r=[],t.add(n,r)),r.push(e)})}var l=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},h=n(5),f=n(15),d=n(139),v=n(155),y=n(158),m=n(147),g=function(t){function e(e,n){t.call(this,n,e)}return l(e,t),e}(m.ParseError);e.ProviderError=g;var _=function(){function t(t,e){var n=this;this.component=t,this.sourceSpan=e,this.errors=[],this.viewQueries=u(t),this.viewProviders=new v.CompileTokenMap,o(t.viewProviders,e,this.errors).forEach(function(t){h.isBlank(n.viewProviders.get(t.token))&&n.viewProviders.add(t.token,!0)})}return t}();e.ProviderViewContext=_;var b=function(){function t(t,e,n,r,i,o,a){var u=this;this._viewContext=t,this._parent=e,this._isViewRoot=n,this._directiveAsts=r,this._sourceSpan=a,this._transformedProviders=new v.CompileTokenMap,this._seenProviders=new v.CompileTokenMap,this._hasViewContainer=!1,this._attrs={},i.forEach(function(t){return u._attrs[t.name]=t.value});var p=r.map(function(t){return t.directive});this._allProviders=s(p,a,t.errors),this._contentQueries=c(p);var l=new v.CompileTokenMap;this._allProviders.values().forEach(function(t){u._addQueryReadsTo(t.token,l)}),o.forEach(function(t){var e=new v.CompileTokenMetadata({value:t.name});u._addQueryReadsTo(e,l)}),h.isPresent(l.get(y.identifierToken(y.Identifiers.ViewContainerRef)))&&(this._hasViewContainer=!0),this._allProviders.values().forEach(function(t){var e=t.eager||h.isPresent(l.get(t.token));e&&u._getOrCreateLocalProvider(t.providerType,t.token,!0)})}return t.prototype.afterElement=function(){var t=this;this._allProviders.values().forEach(function(e){t._getOrCreateLocalProvider(e.providerType,e.token,!1)})},Object.defineProperty(t.prototype,"transformProviders",{get:function(){return this._transformedProviders.values()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"transformedDirectiveAsts",{get:function(){var t=this._transformedProviders.values().map(function(t){return t.token.identifier}),e=f.ListWrapper.clone(this._directiveAsts);return f.ListWrapper.sort(e,function(e,n){return t.indexOf(e.directive.type)-t.indexOf(n.directive.type)}),e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"transformedHasViewContainer",{get:function(){return this._hasViewContainer},enumerable:!0,configurable:!0}),t.prototype._addQueryReadsTo=function(t,e){this._getQueriesFor(t).forEach(function(n){var r=h.isPresent(n.read)?n.read:t;h.isBlank(e.get(r))&&e.add(r,!0)})},t.prototype._getQueriesFor=function(t){for(var e,n=[],r=this,i=0;null!==r;)e=r._contentQueries.get(t),h.isPresent(e)&&f.ListWrapper.addAll(n,e.filter(function(t){return t.descendants||1>=i})),r._directiveAsts.length>0&&i++,r=r._parent;return e=this._viewContext.viewQueries.get(t),h.isPresent(e)&&f.ListWrapper.addAll(n,e),n},t.prototype._getOrCreateLocalProvider=function(t,e,n){var o=this,s=this._allProviders.get(e);if(h.isBlank(s)||(t===d.ProviderAstType.Directive||t===d.ProviderAstType.PublicService)&&s.providerType===d.ProviderAstType.PrivateService||(t===d.ProviderAstType.PrivateService||t===d.ProviderAstType.PublicService)&&s.providerType===d.ProviderAstType.Builtin)return null;var a=this._transformedProviders.get(e);if(h.isPresent(a))return a;if(h.isPresent(this._seenProviders.get(e)))return this._viewContext.errors.push(new g("Cannot instantiate cyclic dependency! "+e.name,this._sourceSpan)),null;this._seenProviders.add(e,!0);var u=s.providers.map(function(t){var e,i=t.useValue,a=t.useExisting;if(h.isPresent(t.useExisting)){var u=o._getDependency(s.providerType,new v.CompileDiDependencyMetadata({token:t.useExisting}),n);h.isPresent(u.token)?a=u.token:(a=null,i=u.value)}else if(h.isPresent(t.useFactory)){var c=h.isPresent(t.deps)?t.deps:t.useFactory.diDeps;e=c.map(function(t){return o._getDependency(s.providerType,t,n)})}else if(h.isPresent(t.useClass)){var c=h.isPresent(t.deps)?t.deps:t.useClass.diDeps;e=c.map(function(t){return o._getDependency(s.providerType,t,n)})}return r(t,{useExisting:a,useValue:i,deps:e})});return a=i(s,{eager:n,providers:u}),this._transformedProviders.add(e,a),a},t.prototype._getLocalDependency=function(t,e,n){if(void 0===n&&(n=null),e.isAttribute){var r=this._attrs[e.token.value];return new v.CompileDiDependencyMetadata({isValue:!0,value:h.normalizeBlank(r)})}if(h.isPresent(e.query)||h.isPresent(e.viewQuery))return e;if(h.isPresent(e.token)){if(t===d.ProviderAstType.Directive||t===d.ProviderAstType.Component){if(e.token.equalsTo(y.identifierToken(y.Identifiers.Renderer))||e.token.equalsTo(y.identifierToken(y.Identifiers.ElementRef))||e.token.equalsTo(y.identifierToken(y.Identifiers.ChangeDetectorRef))||e.token.equalsTo(y.identifierToken(y.Identifiers.TemplateRef)))return e;e.token.equalsTo(y.identifierToken(y.Identifiers.ViewContainerRef))&&(this._hasViewContainer=!0)}if(e.token.equalsTo(y.identifierToken(y.Identifiers.Injector)))return e;if(h.isPresent(this._getOrCreateLocalProvider(t,e.token,n)))return e}return null},t.prototype._getDependency=function(t,e,n){void 0===n&&(n=null);var r=this,i=n,o=null;if(e.isSkipSelf||(o=this._getLocalDependency(t,e,n)),e.isSelf)h.isBlank(o)&&e.isOptional&&(o=new v.CompileDiDependencyMetadata({isValue:!0,value:null}));else{for(;h.isBlank(o)&&h.isPresent(r._parent);){var s=r;r=r._parent,s._isViewRoot&&(i=!1),o=r._getLocalDependency(d.ProviderAstType.PublicService,e,i)}h.isBlank(o)&&(o=!e.isHost||this._viewContext.component.type.isHost||y.identifierToken(this._viewContext.component.type).equalsTo(e.token)||h.isPresent(this._viewContext.viewProviders.get(e.token))?e:e.isOptional?o=new v.CompileDiDependencyMetadata({ +isValue:!0,value:null}):null)}return h.isBlank(o)&&this._viewContext.errors.push(new g("No provider for "+e.token.name,this._sourceSpan)),o},t}();e.ProviderElementContext=b},function(t,e,n){"use strict";function r(t){return N[t["class"]](t)}function i(t,e){var n=y.CssSelector.parse(e)[0].getMatchingElementTemplate();return M.create({type:new x({runtime:Object,name:t.name+"_Host",moduleUrl:t.moduleUrl,isHost:!0}),template:new I({template:n,templateUrl:"",styles:[],styleUrls:[],ngContentSelectors:[]}),changeDetection:d.ChangeDetectionStrategy.Default,inputs:[],outputs:[],host:{},lifecycleHooks:[],isComponent:!0,selector:"*",providers:[],viewProviders:[],queries:[],viewQueries:[]})}function o(t,e){return l.isBlank(t)?null:t.map(function(t){return a(t,e)})}function s(t){return l.isBlank(t)?null:t.map(u)}function a(t,e){return l.isArray(t)?o(t,e):l.isString(t)||l.isBlank(t)||l.isBoolean(t)||l.isNumber(t)?t:e(t)}function u(t){return l.isArray(t)?s(t):l.isString(t)||l.isBlank(t)||l.isBoolean(t)||l.isNumber(t)?t:t.toJson()}function c(t){return l.isPresent(t)?t:[]}var p=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},l=n(5),h=n(12),f=n(15),d=n(28),v=n(36),y=n(149),m=n(153),g=n(156),_=n(157),b=/^(?:(?:\[([^\]]+)\])|(?:\(([^\)]+)\)))$/g,P=function(){function t(){}return Object.defineProperty(t.prototype,"identifier",{get:function(){return h.unimplemented()},enumerable:!0,configurable:!0}),t}();e.CompileMetadataWithIdentifier=P;var E=function(t){function e(){t.apply(this,arguments)}return p(e,t),Object.defineProperty(e.prototype,"type",{get:function(){return h.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"identifier",{get:function(){return h.unimplemented()},enumerable:!0,configurable:!0}),e}(P);e.CompileMetadataWithType=E,e.metadataFromJson=r;var w=function(){function t(t){var e=void 0===t?{}:t,n=e.runtime,r=e.name,i=e.moduleUrl,o=e.prefix,s=e.value;this.runtime=n,this.name=r,this.prefix=o,this.moduleUrl=i,this.value=s}return t.fromJson=function(e){var n=l.isArray(e.value)?o(e.value,r):a(e.value,r);return new t({name:e.name,prefix:e.prefix,moduleUrl:e.moduleUrl,value:n})},t.prototype.toJson=function(){var t=l.isArray(this.value)?s(this.value):u(this.value);return{"class":"Identifier",name:this.name,moduleUrl:this.moduleUrl,prefix:this.prefix,value:t}},Object.defineProperty(t.prototype,"identifier",{get:function(){return this},enumerable:!0,configurable:!0}),t}();e.CompileIdentifierMetadata=w;var C=function(){function t(t){var e=void 0===t?{}:t,n=e.isAttribute,r=e.isSelf,i=e.isHost,o=e.isSkipSelf,s=e.isOptional,a=e.isValue,u=e.query,c=e.viewQuery,p=e.token,h=e.value;this.isAttribute=l.normalizeBool(n),this.isSelf=l.normalizeBool(r),this.isHost=l.normalizeBool(i),this.isSkipSelf=l.normalizeBool(o),this.isOptional=l.normalizeBool(s),this.isValue=l.normalizeBool(a),this.query=u,this.viewQuery=c,this.token=p,this.value=h}return t.fromJson=function(e){return new t({token:a(e.token,O.fromJson),query:a(e.query,A.fromJson),viewQuery:a(e.viewQuery,A.fromJson),value:e.value,isAttribute:e.isAttribute,isSelf:e.isSelf,isHost:e.isHost,isSkipSelf:e.isSkipSelf,isOptional:e.isOptional,isValue:e.isValue})},t.prototype.toJson=function(){return{token:u(this.token),query:u(this.query),viewQuery:u(this.viewQuery),value:this.value,isAttribute:this.isAttribute,isSelf:this.isSelf,isHost:this.isHost,isSkipSelf:this.isSkipSelf,isOptional:this.isOptional,isValue:this.isValue}},t}();e.CompileDiDependencyMetadata=C;var R=function(){function t(t){var e=t.token,n=t.useClass,r=t.useValue,i=t.useExisting,o=t.useFactory,s=t.deps,a=t.multi;this.token=e,this.useClass=n,this.useValue=r,this.useExisting=i,this.useFactory=o,this.deps=l.normalizeBlank(s),this.multi=l.normalizeBool(a)}return t.fromJson=function(e){return new t({token:a(e.token,O.fromJson),useClass:a(e.useClass,x.fromJson),useExisting:a(e.useExisting,O.fromJson),useValue:a(e.useValue,w.fromJson),useFactory:a(e.useFactory,S.fromJson),multi:e.multi,deps:o(e.deps,C.fromJson)})},t.prototype.toJson=function(){return{"class":"Provider",token:u(this.token),useClass:u(this.useClass),useExisting:u(this.useExisting),useValue:u(this.useValue),useFactory:u(this.useFactory),multi:this.multi,deps:s(this.deps)}},t}();e.CompileProviderMetadata=R;var S=function(){function t(t){var e=t.runtime,n=t.name,r=t.moduleUrl,i=t.prefix,o=t.diDeps,s=t.value;this.runtime=e,this.name=n,this.prefix=i,this.moduleUrl=r,this.diDeps=c(o),this.value=s}return Object.defineProperty(t.prototype,"identifier",{get:function(){return this},enumerable:!0,configurable:!0}),t.fromJson=function(e){return new t({name:e.name,prefix:e.prefix,moduleUrl:e.moduleUrl,value:e.value,diDeps:o(e.diDeps,C.fromJson)})},t.prototype.toJson=function(){return{"class":"Factory",name:this.name,prefix:this.prefix,moduleUrl:this.moduleUrl,value:this.value,diDeps:s(this.diDeps)}},t}();e.CompileFactoryMetadata=S;var O=function(){function t(t){var e=t.value,n=t.identifier,r=t.identifierIsInstance;this.value=e,this.identifier=n,this.identifierIsInstance=l.normalizeBool(r)}return t.fromJson=function(e){return new t({value:e.value,identifier:a(e.identifier,w.fromJson),identifierIsInstance:e.identifierIsInstance})},t.prototype.toJson=function(){return{value:this.value,identifier:u(this.identifier),identifierIsInstance:this.identifierIsInstance}},Object.defineProperty(t.prototype,"runtimeCacheKey",{get:function(){return l.isPresent(this.identifier)?this.identifier.runtime:this.value},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"assetCacheKey",{get:function(){return l.isPresent(this.identifier)?l.isPresent(this.identifier.moduleUrl)&&l.isPresent(_.getUrlScheme(this.identifier.moduleUrl))?this.identifier.name+"|"+this.identifier.moduleUrl+"|"+this.identifierIsInstance:null:this.value},enumerable:!0,configurable:!0}),t.prototype.equalsTo=function(t){var e=this.runtimeCacheKey,n=this.assetCacheKey;return l.isPresent(e)&&e==t.runtimeCacheKey||l.isPresent(n)&&n==t.assetCacheKey},Object.defineProperty(t.prototype,"name",{get:function(){return l.isPresent(this.value)?m.sanitizeIdentifier(this.value):this.identifier.name},enumerable:!0,configurable:!0}),t}();e.CompileTokenMetadata=O;var T=function(){function t(){this._valueMap=new Map,this._values=[]}return t.prototype.add=function(t,e){var n=this.get(t);if(l.isPresent(n))throw new h.BaseException("Can only add to a TokenMap! Token: "+t.name);this._values.push(e);var r=t.runtimeCacheKey;l.isPresent(r)&&this._valueMap.set(r,e);var i=t.assetCacheKey;l.isPresent(i)&&this._valueMap.set(i,e)},t.prototype.get=function(t){var e,n=t.runtimeCacheKey,r=t.assetCacheKey;return l.isPresent(n)&&(e=this._valueMap.get(n)),l.isBlank(e)&&l.isPresent(r)&&(e=this._valueMap.get(r)),e},t.prototype.values=function(){return this._values},Object.defineProperty(t.prototype,"size",{get:function(){return this._values.length},enumerable:!0,configurable:!0}),t}();e.CompileTokenMap=T;var x=function(){function t(t){var e=void 0===t?{}:t,n=e.runtime,r=e.name,i=e.moduleUrl,o=e.prefix,s=e.isHost,a=e.value,u=e.diDeps;this.runtime=n,this.name=r,this.moduleUrl=i,this.prefix=o,this.isHost=l.normalizeBool(s),this.value=a,this.diDeps=c(u)}return t.fromJson=function(e){return new t({name:e.name,moduleUrl:e.moduleUrl,prefix:e.prefix,isHost:e.isHost,value:e.value,diDeps:o(e.diDeps,C.fromJson)})},Object.defineProperty(t.prototype,"identifier",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"type",{get:function(){return this},enumerable:!0,configurable:!0}),t.prototype.toJson=function(){return{"class":"Type",name:this.name,moduleUrl:this.moduleUrl,prefix:this.prefix,isHost:this.isHost,value:this.value,diDeps:s(this.diDeps)}},t}();e.CompileTypeMetadata=x;var A=function(){function t(t){var e=void 0===t?{}:t,n=e.selectors,r=e.descendants,i=e.first,o=e.propertyName,s=e.read;this.selectors=n,this.descendants=l.normalizeBool(r),this.first=l.normalizeBool(i),this.propertyName=o,this.read=s}return t.fromJson=function(e){return new t({selectors:o(e.selectors,O.fromJson),descendants:e.descendants,first:e.first,propertyName:e.propertyName,read:a(e.read,O.fromJson)})},t.prototype.toJson=function(){return{selectors:s(this.selectors),descendants:this.descendants,first:this.first,propertyName:this.propertyName,read:u(this.read)}},t}();e.CompileQueryMetadata=A;var I=function(){function t(t){var e=void 0===t?{}:t,n=e.encapsulation,r=e.template,i=e.templateUrl,o=e.styles,s=e.styleUrls,a=e.ngContentSelectors;this.encapsulation=l.isPresent(n)?n:v.ViewEncapsulation.Emulated,this.template=r,this.templateUrl=i,this.styles=l.isPresent(o)?o:[],this.styleUrls=l.isPresent(s)?s:[],this.ngContentSelectors=l.isPresent(a)?a:[]}return t.fromJson=function(e){return new t({encapsulation:l.isPresent(e.encapsulation)?v.VIEW_ENCAPSULATION_VALUES[e.encapsulation]:e.encapsulation,template:e.template,templateUrl:e.templateUrl,styles:e.styles,styleUrls:e.styleUrls,ngContentSelectors:e.ngContentSelectors})},t.prototype.toJson=function(){return{encapsulation:l.isPresent(this.encapsulation)?l.serializeEnum(this.encapsulation):this.encapsulation,template:this.template,templateUrl:this.templateUrl,styles:this.styles,styleUrls:this.styleUrls,ngContentSelectors:this.ngContentSelectors}},t}();e.CompileTemplateMetadata=I;var M=function(){function t(t){var e=void 0===t?{}:t,n=e.type,r=e.isComponent,i=e.selector,o=e.exportAs,s=e.changeDetection,a=e.inputs,u=e.outputs,p=e.hostListeners,l=e.hostProperties,h=e.hostAttributes,f=e.lifecycleHooks,d=e.providers,v=e.viewProviders,y=e.queries,m=e.viewQueries,g=e.template;this.type=n,this.isComponent=r,this.selector=i,this.exportAs=o,this.changeDetection=s,this.inputs=a,this.outputs=u,this.hostListeners=p,this.hostProperties=l,this.hostAttributes=h,this.lifecycleHooks=c(f),this.providers=c(d),this.viewProviders=c(v),this.queries=c(y),this.viewQueries=c(m),this.template=g}return t.create=function(e){var n=void 0===e?{}:e,r=n.type,i=n.isComponent,o=n.selector,s=n.exportAs,a=n.changeDetection,u=n.inputs,c=n.outputs,p=n.host,h=n.lifecycleHooks,d=n.providers,v=n.viewProviders,y=n.queries,g=n.viewQueries,_=n.template,P={},E={},w={};l.isPresent(p)&&f.StringMapWrapper.forEach(p,function(t,e){var n=l.RegExpWrapper.firstMatch(b,e);l.isBlank(n)?w[e]=t:l.isPresent(n[1])?E[n[1]]=t:l.isPresent(n[2])&&(P[n[2]]=t)});var C={};l.isPresent(u)&&u.forEach(function(t){var e=m.splitAtColon(t,[t,t]);C[e[0]]=e[1]});var R={};return l.isPresent(c)&&c.forEach(function(t){var e=m.splitAtColon(t,[t,t]);R[e[0]]=e[1]}),new t({type:r,isComponent:l.normalizeBool(i),selector:o,exportAs:s,changeDetection:a,inputs:C,outputs:R,hostListeners:P,hostProperties:E,hostAttributes:w,lifecycleHooks:l.isPresent(h)?h:[],providers:d,viewProviders:v,queries:y,viewQueries:g,template:_})},Object.defineProperty(t.prototype,"identifier",{get:function(){return this.type},enumerable:!0,configurable:!0}),t.fromJson=function(e){return new t({isComponent:e.isComponent,selector:e.selector,exportAs:e.exportAs,type:l.isPresent(e.type)?x.fromJson(e.type):e.type,changeDetection:l.isPresent(e.changeDetection)?d.CHANGE_DETECTION_STRATEGY_VALUES[e.changeDetection]:e.changeDetection,inputs:e.inputs,outputs:e.outputs,hostListeners:e.hostListeners,hostProperties:e.hostProperties,hostAttributes:e.hostAttributes,lifecycleHooks:e.lifecycleHooks.map(function(t){return g.LIFECYCLE_HOOKS_VALUES[t]}),template:l.isPresent(e.template)?I.fromJson(e.template):e.template,providers:o(e.providers,r),viewProviders:o(e.viewProviders,r),queries:o(e.queries,A.fromJson),viewQueries:o(e.viewQueries,A.fromJson)})},t.prototype.toJson=function(){return{"class":"Directive",isComponent:this.isComponent,selector:this.selector,exportAs:this.exportAs,type:l.isPresent(this.type)?this.type.toJson():this.type,changeDetection:l.isPresent(this.changeDetection)?l.serializeEnum(this.changeDetection):this.changeDetection,inputs:this.inputs,outputs:this.outputs,hostListeners:this.hostListeners,hostProperties:this.hostProperties,hostAttributes:this.hostAttributes,lifecycleHooks:this.lifecycleHooks.map(function(t){return l.serializeEnum(t)}),template:l.isPresent(this.template)?this.template.toJson():this.template,providers:s(this.providers),viewProviders:s(this.viewProviders),queries:s(this.queries),viewQueries:s(this.viewQueries)}},t}();e.CompileDirectiveMetadata=M,e.createHostComponentMeta=i;var k=function(){function t(t){var e=void 0===t?{}:t,n=e.type,r=e.name,i=e.pure,o=e.lifecycleHooks;this.type=n,this.name=r,this.pure=l.normalizeBool(i),this.lifecycleHooks=c(o)}return Object.defineProperty(t.prototype,"identifier",{get:function(){return this.type},enumerable:!0,configurable:!0}),t.fromJson=function(e){return new t({type:l.isPresent(e.type)?x.fromJson(e.type):e.type,name:e.name,pure:e.pure})},t.prototype.toJson=function(){return{"class":"Pipe",type:l.isPresent(this.type)?this.type.toJson():null,name:this.name,pure:this.pure}},t}();e.CompilePipeMetadata=k;var N={Directive:M.fromJson,Pipe:k.fromJson,Type:x.fromJson,Provider:R.fromJson,Identifier:w.fromJson,Factory:S.fromJson}},function(t,e){"use strict";!function(t){t[t.OnInit=0]="OnInit",t[t.OnDestroy=1]="OnDestroy",t[t.DoCheck=2]="DoCheck",t[t.OnChanges=3]="OnChanges",t[t.AfterContentInit=4]="AfterContentInit",t[t.AfterContentChecked=5]="AfterContentChecked",t[t.AfterViewInit=6]="AfterViewInit",t[t.AfterViewChecked=7]="AfterViewChecked"}(e.LifecycleHooks||(e.LifecycleHooks={}));var n=e.LifecycleHooks;e.LIFECYCLE_HOOKS_VALUES=[n.OnInit,n.OnDestroy,n.DoCheck,n.OnChanges,n.AfterContentInit,n.AfterContentChecked,n.AfterViewInit,n.AfterViewChecked]},function(t,e,n){"use strict";function r(){return new _}function i(){return new _(g)}function o(t){var e=a(t);return e&&e[b.Scheme]||""}function s(t,e,n,r,i,o,s){var a=[];return v.isPresent(t)&&a.push(t+":"),v.isPresent(n)&&(a.push("//"),v.isPresent(e)&&a.push(e+"@"),a.push(n),v.isPresent(r)&&a.push(":"+r)),v.isPresent(i)&&a.push(i),v.isPresent(o)&&a.push("?"+o),v.isPresent(s)&&a.push("#"+s),a.join("")}function a(t){return v.RegExpWrapper.firstMatch(P,t)}function u(t){if("/"==t)return"/";for(var e="/"==t[0]?"/":"",n="/"===t[t.length-1]?"/":"",r=t.split("/"),i=[],o=0,s=0;s0?i.pop():o++;break;default:i.push(a)}}if(""==e){for(;o-- >0;)i.unshift("..");0===i.length&&i.push(".")}return e+i.join("/")+n}function c(t){var e=t[b.Path];return e=v.isBlank(e)?"":u(e),t[b.Path]=e,s(t[b.Scheme],t[b.UserInfo],t[b.Domain],t[b.Port],e,t[b.QueryData],t[b.Fragment])}function p(t,e){var n=a(encodeURI(e)),r=a(t);if(v.isPresent(n[b.Scheme]))return c(n);n[b.Scheme]=r[b.Scheme];for(var i=b.Scheme;i<=b.Port;i++)v.isBlank(n[i])&&(n[i]=r[i]);if("/"==n[b.Path][0])return c(n);var o=r[b.Path];v.isBlank(o)&&(o="/");var s=o.lastIndexOf("/");return o=o.substring(0,s+1)+n[b.Path],n[b.Path]=o,c(n)}var l=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},h=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},f=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},d=n(6),v=n(5),y=n(62),m=n(6),g="asset:";e.createUrlResolverWithoutPackagePrefix=r,e.createOfflineCompileUrlResolver=i,e.DEFAULT_PACKAGE_URL_PROVIDER=new m.Provider(y.PACKAGE_ROOT_URL,{useValue:"/"});var _=function(){function t(t){void 0===t&&(t=null),this._packagePrefix=t}return t.prototype.resolve=function(t,e){var n=e;v.isPresent(t)&&t.length>0&&(n=p(t,n));var r=a(n),i=this._packagePrefix;if(v.isPresent(i)&&v.isPresent(r)&&"package"==r[b.Scheme]){var o=r[b.Path];if(this._packagePrefix!==g)return i=v.StringWrapper.stripRight(i,"/"),o=v.StringWrapper.stripLeft(o,"/"),i+"/"+o;var s=o.split(/\//);n="asset:"+s[0]+"/lib/"+s.slice(1).join("/")}return n},t=l([d.Injectable(),f(0,d.Inject(y.PACKAGE_ROOT_URL)),h("design:paramtypes",[String])],t)}();e.UrlResolver=_,e.getUrlScheme=o;var b,P=v.RegExpWrapper.create("^(?:([^:/?#.]+):)?(?://(?:([^/?#]*)@)?([\\w\\d\\-\\u0100-\\uffff.%]*)(?::([0-9]+))?)?([^?#]+)?(?:\\?([^#]*))?(?:#(.*))?$");!function(t){t[t.Scheme=1]="Scheme",t[t.UserInfo=2]="UserInfo",t[t.Domain=3]="Domain",t[t.Port=4]="Port",t[t.Path=5]="Path",t[t.QueryData=6]="QueryData",t[t.Fragment=7]="Fragment"}(b||(b={}))},function(t,e,n){"use strict";function r(t){return new i.CompileTokenMetadata({identifier:t})}var i=n(155),o=n(159),s=n(160),a=n(66),u=n(28),c=n(67),p=n(69),l=n(70),h=n(74),f=n(36),d=n(68),v=n(78),y=n(11),m=n(81),g=n(153),_="asset:angular2/lib/src/core/linker/view"+g.MODULE_SUFFIX,b="asset:angular2/lib/src/core/linker/view_utils"+g.MODULE_SUFFIX,P="asset:angular2/lib/src/core/change_detection/change_detection"+g.MODULE_SUFFIX,E=a.ViewUtils,w=o.AppView,C=s.DebugContext,R=c.AppElement,S=p.ElementRef,O=l.ViewContainerRef,T=u.ChangeDetectorRef,x=h.RenderComponentType,A=v.QueryList,I=m.TemplateRef,M=m.TemplateRef_,k=u.ValueUnwrapper,N=y.Injector,D=f.ViewEncapsulation,V=d.ViewType,j=u.ChangeDetectionStrategy,L=s.StaticNodeDebugInfo,B=h.Renderer,F=u.SimpleChange,U=u.uninitialized,W=u.ChangeDetectorState,H=a.flattenNestedViewRenderNodes,X=u.devModeEqual,q=a.interpolate,G=a.checkBinding,z=a.castByValue,K=function(){function t(){}return t.ViewUtils=new i.CompileIdentifierMetadata({name:"ViewUtils",moduleUrl:"asset:angular2/lib/src/core/linker/view_utils"+g.MODULE_SUFFIX,runtime:E}),t.AppView=new i.CompileIdentifierMetadata({name:"AppView",moduleUrl:_,runtime:w}),t.AppElement=new i.CompileIdentifierMetadata({name:"AppElement",moduleUrl:"asset:angular2/lib/src/core/linker/element"+g.MODULE_SUFFIX,runtime:R}),t.ElementRef=new i.CompileIdentifierMetadata({name:"ElementRef",moduleUrl:"asset:angular2/lib/src/core/linker/element_ref"+g.MODULE_SUFFIX,runtime:S}),t.ViewContainerRef=new i.CompileIdentifierMetadata({name:"ViewContainerRef",moduleUrl:"asset:angular2/lib/src/core/linker/view_container_ref"+g.MODULE_SUFFIX,runtime:O}),t.ChangeDetectorRef=new i.CompileIdentifierMetadata({name:"ChangeDetectorRef",moduleUrl:"asset:angular2/lib/src/core/change_detection/change_detector_ref"+g.MODULE_SUFFIX,runtime:T}),t.RenderComponentType=new i.CompileIdentifierMetadata({name:"RenderComponentType",moduleUrl:"asset:angular2/lib/src/core/render/api"+g.MODULE_SUFFIX,runtime:x}),t.QueryList=new i.CompileIdentifierMetadata({name:"QueryList",moduleUrl:"asset:angular2/lib/src/core/linker/query_list"+g.MODULE_SUFFIX,runtime:A}),t.TemplateRef=new i.CompileIdentifierMetadata({name:"TemplateRef",moduleUrl:"asset:angular2/lib/src/core/linker/template_ref"+g.MODULE_SUFFIX,runtime:I}),t.TemplateRef_=new i.CompileIdentifierMetadata({name:"TemplateRef_",moduleUrl:"asset:angular2/lib/src/core/linker/template_ref"+g.MODULE_SUFFIX,runtime:M}),t.ValueUnwrapper=new i.CompileIdentifierMetadata({name:"ValueUnwrapper",moduleUrl:P,runtime:k}),t.Injector=new i.CompileIdentifierMetadata({name:"Injector",moduleUrl:"asset:angular2/lib/src/core/di/injector"+g.MODULE_SUFFIX,runtime:N}),t.ViewEncapsulation=new i.CompileIdentifierMetadata({name:"ViewEncapsulation",moduleUrl:"asset:angular2/lib/src/core/metadata/view"+g.MODULE_SUFFIX,runtime:D}),t.ViewType=new i.CompileIdentifierMetadata({name:"ViewType",moduleUrl:"asset:angular2/lib/src/core/linker/view_type"+g.MODULE_SUFFIX,runtime:V}),t.ChangeDetectionStrategy=new i.CompileIdentifierMetadata({name:"ChangeDetectionStrategy",moduleUrl:P,runtime:j}),t.StaticNodeDebugInfo=new i.CompileIdentifierMetadata({name:"StaticNodeDebugInfo",moduleUrl:"asset:angular2/lib/src/core/linker/debug_context"+g.MODULE_SUFFIX,runtime:L}),t.DebugContext=new i.CompileIdentifierMetadata({name:"DebugContext",moduleUrl:"asset:angular2/lib/src/core/linker/debug_context"+g.MODULE_SUFFIX,runtime:C}),t.Renderer=new i.CompileIdentifierMetadata({name:"Renderer",moduleUrl:"asset:angular2/lib/src/core/render/api"+g.MODULE_SUFFIX,runtime:B}),t.SimpleChange=new i.CompileIdentifierMetadata({name:"SimpleChange",moduleUrl:P,runtime:F}),t.uninitialized=new i.CompileIdentifierMetadata({name:"uninitialized",moduleUrl:P,runtime:U}),t.ChangeDetectorState=new i.CompileIdentifierMetadata({name:"ChangeDetectorState",moduleUrl:P,runtime:W}),t.checkBinding=new i.CompileIdentifierMetadata({name:"checkBinding",moduleUrl:b,runtime:G}),t.flattenNestedViewRenderNodes=new i.CompileIdentifierMetadata({name:"flattenNestedViewRenderNodes",moduleUrl:b,runtime:H}),t.devModeEqual=new i.CompileIdentifierMetadata({name:"devModeEqual",moduleUrl:P,runtime:X}),t.interpolate=new i.CompileIdentifierMetadata({name:"interpolate",moduleUrl:b,runtime:q}),t.castByValue=new i.CompileIdentifierMetadata({name:"castByValue",moduleUrl:b,runtime:z}),t.pureProxies=[null,new i.CompileIdentifierMetadata({name:"pureProxy1",moduleUrl:b,runtime:a.pureProxy1}),new i.CompileIdentifierMetadata({name:"pureProxy2",moduleUrl:b,runtime:a.pureProxy2}),new i.CompileIdentifierMetadata({name:"pureProxy3",moduleUrl:b,runtime:a.pureProxy3}),new i.CompileIdentifierMetadata({name:"pureProxy4",moduleUrl:b,runtime:a.pureProxy4}),new i.CompileIdentifierMetadata({name:"pureProxy5",moduleUrl:b,runtime:a.pureProxy5}),new i.CompileIdentifierMetadata({name:"pureProxy6",moduleUrl:b,runtime:a.pureProxy6}),new i.CompileIdentifierMetadata({name:"pureProxy7",moduleUrl:b,runtime:a.pureProxy7}),new i.CompileIdentifierMetadata({name:"pureProxy8",moduleUrl:b,runtime:a.pureProxy8}),new i.CompileIdentifierMetadata({name:"pureProxy9",moduleUrl:b,runtime:a.pureProxy9}),new i.CompileIdentifierMetadata({name:"pureProxy10",moduleUrl:b,runtime:a.pureProxy10})],t}();e.Identifiers=K,e.identifierToken=r},function(t,e,n){"use strict";function r(t){var e;if(t instanceof o.AppElement){var n=t;if(e=n.nativeElement,s.isPresent(n.nestedViews))for(var i=n.nestedViews.length-1;i>=0;i--){var a=n.nestedViews[i];a.rootNodesOrAppElements.length>0&&(e=r(a.rootNodesOrAppElements[a.rootNodesOrAppElements.length-1]))}}else e=t;return e}var i=n(15),o=n(67),s=n(5),a=n(40),u=n(82),c=n(68),p=n(66),l=n(28),h=n(71),f=n(73),d=n(160),v=n(161),y=s.CONST_EXPR(new Object),m=h.wtfCreateScope("AppView#check(ascii id)"),g=function(){function t(t,e,n,r,i,o,s,a,p){this.clazz=t,this.componentType=e,this.type=n,this.locals=r,this.viewUtils=i,this.parentInjector=o,this.declarationAppElement=s,this.cdMode=a,this.staticNodeDebugInfos=p,this.contentChildren=[],this.viewChildren=[],this.viewContainerElement=null,this.cdState=l.ChangeDetectorState.NeverChecked,this.context=null,this.destroyed=!1,this._currentDebugContext=null,this.ref=new u.ViewRef_(this),n===c.ViewType.COMPONENT||n===c.ViewType.HOST?this.renderer=i.renderComponent(e):this.renderer=s.parentView.renderer}return t.prototype.create=function(t,e){var n,r;switch(this.type){case c.ViewType.COMPONENT:n=this.declarationAppElement.component,r=p.ensureSlotCount(t,this.componentType.slotCount);break;case c.ViewType.EMBEDDED:n=this.declarationAppElement.parentView.context,r=this.declarationAppElement.parentView.projectableNodes;break;case c.ViewType.HOST:n=y,r=t}if(this._hasExternalHostElement=s.isPresent(e),this.context=n,this.projectableNodes=r,!this.debugMode)return this.createInternal(e);this._resetDebug();try{return this.createInternal(e)}catch(i){throw this._rethrowWithContext(i,i.stack),i}},t.prototype.createInternal=function(t){return null},t.prototype.init=function(t,e,n,r){this.rootNodesOrAppElements=t,this.allNodes=e,this.disposables=n,this.subscriptions=r,this.type===c.ViewType.COMPONENT&&(this.declarationAppElement.parentView.viewChildren.push(this),this.renderParent=this.declarationAppElement.parentView,this.dirtyParentQueriesInternal())},t.prototype.selectOrCreateHostElement=function(t,e,n){var r;return r=s.isPresent(e)?this.renderer.selectRootElement(e,n):this.renderer.createElement(null,t,n)},t.prototype.injectorGet=function(t,e,n){if(!this.debugMode)return this.injectorGetInternal(t,e,n);this._resetDebug();try{return this.injectorGetInternal(t,e,n)}catch(r){throw this._rethrowWithContext(r,r.stack),r}},t.prototype.injectorGetInternal=function(t,e,n){return n},t.prototype.injector=function(t){return s.isPresent(t)?new v.ElementInjector(this,t):this.parentInjector},t.prototype.destroy=function(){this._hasExternalHostElement?this.renderer.detachView(this.flatRootNodes):s.isPresent(this.viewContainerElement)&&this.viewContainerElement.detachView(this.viewContainerElement.nestedViews.indexOf(this)),this._destroyRecurse()},t.prototype._destroyRecurse=function(){if(!this.destroyed){for(var t=this.contentChildren,e=0;e0?this.rootNodesOrAppElements[this.rootNodesOrAppElements.length-1]:null;return r(t)},enumerable:!0,configurable:!0}),t.prototype.hasLocal=function(t){return i.StringMapWrapper.contains(this.locals,t)},t.prototype.setLocal=function(t,e){this.locals[t]=e},t.prototype.dirtyParentQueriesInternal=function(){},t.prototype.addRenderContentChild=function(t){this.contentChildren.push(t),t.renderParent=this,t.dirtyParentQueriesInternal()},t.prototype.removeContentChild=function(t){i.ListWrapper.remove(this.contentChildren,t),t.dirtyParentQueriesInternal(),t.renderParent=null},t.prototype.detectChanges=function(t){var e=m(this.clazz);if(this.cdMode!==l.ChangeDetectionStrategy.Detached&&this.cdMode!==l.ChangeDetectionStrategy.Checked&&this.cdState!==l.ChangeDetectorState.Errored){if(this.destroyed&&this.throwDestroyedError("detectChanges"),this.debugMode){this._resetDebug();try{this.detectChangesInternal(t)}catch(n){throw this._rethrowWithContext(n,n.stack),n}}else this.detectChangesInternal(t);this.cdMode===l.ChangeDetectionStrategy.CheckOnce&&(this.cdMode=l.ChangeDetectionStrategy.Checked),this.cdState=l.ChangeDetectorState.CheckedBefore,h.wtfLeave(e)}},t.prototype.detectChangesInternal=function(t){this.detectContentChildrenChanges(t),this.detectViewChildrenChanges(t)},t.prototype.detectContentChildrenChanges=function(t){for(var e=0;eo?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=n(15),a=n(68),u=function(){function t(t,e,n){this.providerTokens=t,this.componentToken=e,this.varTokens=n}return t=r([o.CONST(),i("design:paramtypes",[Array,Object,Object])],t)}();e.StaticNodeDebugInfo=u;var c=function(){function t(t,e,n,r){this._view=t,this._nodeIndex=e,this._tplRow=n,this._tplCol=r}return Object.defineProperty(t.prototype,"_staticNodeInfo",{get:function(){return o.isPresent(this._nodeIndex)?this._view.staticNodeDebugInfos[this._nodeIndex]:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"context",{get:function(){return this._view.context},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"component",{get:function(){var t=this._staticNodeInfo;return o.isPresent(t)&&o.isPresent(t.componentToken)?this.injector.get(t.componentToken):null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"componentRenderElement",{get:function(){for(var t=this._view;o.isPresent(t.declarationAppElement)&&t.type!==a.ViewType.COMPONENT;)t=t.declarationAppElement.parentView;return o.isPresent(t.declarationAppElement)?t.declarationAppElement.nativeElement:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"injector",{get:function(){return this._view.injector(this._nodeIndex)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"renderNode",{get:function(){return o.isPresent(this._nodeIndex)&&o.isPresent(this._view.allNodes)?this._view.allNodes[this._nodeIndex]:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"providerTokens",{get:function(){var t=this._staticNodeInfo;return o.isPresent(t)?t.providerTokens:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"source",{get:function(){return this._view.componentType.templateUrl+":"+this._tplRow+":"+this._tplCol},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"locals",{get:function(){var t=this,e={};return s.ListWrapper.forEachWithIndex(this._view.staticNodeDebugInfos,function(n,r){var i=n.varTokens;s.StringMapWrapper.forEach(i,function(n,i){var s;s=o.isBlank(n)?o.isPresent(t._view.allNodes)?t._view.allNodes[r]:null:t._view.injectorGet(n,r,null), +e[i]=s})}),s.StringMapWrapper.forEach(this._view.locals,function(t,n){e[n]=t}),e},enumerable:!0,configurable:!0}),t}();e.DebugContext=c},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=n(5),o=n(11),s=i.CONST_EXPR(new Object),a=function(t){function e(e,n){t.call(this),this._view=e,this._nodeIndex=n}return r(e,t),e.prototype.get=function(t,e){void 0===e&&(e=o.THROW_IF_NOT_FOUND);var n=s;return n===s&&(n=this._view.injectorGet(t,this._nodeIndex,s)),n===s&&(n=this._view.parentInjector.get(t,e)),n},e}(o.Injector);e.ElementInjector=a},function(t,e,n){"use strict";var r=n(5),i=n(12),o=n(158),s=function(){function t(t,e,n,i){void 0===i&&(i=null),this.genDebugInfo=t,this.logBindingUpdate=e,this.useJit=n,r.isBlank(i)&&(i=new u),this.renderTypes=i}return t}();e.CompilerConfig=s;var a=function(){function t(){}return Object.defineProperty(t.prototype,"renderer",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"renderText",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"renderElement",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"renderComment",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"renderNode",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"renderEvent",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),t}();e.RenderTypes=a;var u=function(){function t(){this.renderer=o.Identifiers.Renderer,this.renderText=null,this.renderElement=null,this.renderComment=null,this.renderNode=null,this.renderEvent=null}return t}();e.DefaultRenderTypes=u},function(t,e,n){"use strict";function r(t){return t.dependencies.forEach(function(t){t.factoryPlaceholder.moduleUrl=o(t.comp)}),t.statements}function i(t){return t.dependencies.forEach(function(t){t.valuePlaceholder.moduleUrl=s(t.sourceUrl,t.isShimmed)}),t.statements}function o(t){var e=t.type.moduleUrl,n=e.substring(0,e.length-f.MODULE_SUFFIX.length);return n+".ngfactory"+f.MODULE_SUFFIX}function s(t,e){return e?t+".shim"+f.MODULE_SUFFIX:""+t+f.MODULE_SUFFIX}function a(t){if(!t.isComponent)throw new c.BaseException("Could not compile '"+t.type.name+"' because it is not a component.")}var u=n(155),c=n(12),p=n(15),l=n(164),h=n(65),f=n(153),d=new u.CompileIdentifierMetadata({name:"ComponentFactory",runtime:h.ComponentFactory,moduleUrl:"asset:angular2/lib/src/core/linker/component_factory"+f.MODULE_SUFFIX}),v=function(){function t(t,e){this.moduleUrl=t,this.source=e}return t}();e.SourceModule=v;var y=function(){function t(t,e,n){this.component=t,this.directives=e,this.pipes=n}return t}();e.NormalizedComponentWithViewDirectives=y;var m=function(){function t(t,e,n,r,i){this._directiveNormalizer=t,this._templateParser=e,this._styleCompiler=n,this._viewCompiler=r,this._outputEmitter=i}return t.prototype.normalizeDirectiveMetadata=function(t){return this._directiveNormalizer.normalizeDirective(t)},t.prototype.compileTemplates=function(t){var e=this;if(0===t.length)throw new c.BaseException("No components given");var n=[],r=[],i=o(t[0].component);return t.forEach(function(t){var i=t.component;a(i);var o=e._compileComponent(i,t.directives,t.pipes,n);r.push(o);var s=u.createHostComponentMeta(i.type,i.selector),c=e._compileComponent(s,[i],[],n),p=i.type.name+"NgFactory";n.push(l.variable(p).set(l.importExpr(d).instantiate([l.literal(i.selector),l.variable(c),l.importExpr(i.type)],l.importType(d,null,[l.TypeModifier.Const]))).toDeclStmt(null,[l.StmtModifier.Final])),r.push(p)}),this._codegenSourceModule(i,n,r)},t.prototype.compileStylesheet=function(t,e){var n=this._styleCompiler.compileStylesheet(t,e,!1),r=this._styleCompiler.compileStylesheet(t,e,!0);return[this._codegenSourceModule(s(t,!1),i(n),[n.stylesVar]),this._codegenSourceModule(s(t,!0),i(r),[r.stylesVar])]},t.prototype._compileComponent=function(t,e,n,o){var s=this._styleCompiler.compileComponent(t),a=this._templateParser.parse(t,t.template.template,e,n,t.type.name),u=this._viewCompiler.compileComponent(t,a,l.variable(s.stylesVar),n);return p.ListWrapper.addAll(o,i(s)),p.ListWrapper.addAll(o,r(u)),u.viewFactoryVar},t.prototype._codegenSourceModule=function(t,e,n){return new v(t,this._outputEmitter.emitStatements(t,e,n))},t}();e.OfflineCompiler=m},function(t,e,n){"use strict";function r(t,e,n){var r=new ot(t,e);return n.visitExpression(r,null)}function i(t){var e=new st;return e.visitAllStatements(t,null),e.varNames}function o(t,e){return void 0===e&&(e=null),new C(t,e)}function s(t,e){return void 0===e&&(e=null),new M(t,null,e)}function a(t,e,n){return void 0===e&&(e=null),void 0===n&&(n=null),d.isPresent(t)?new g(t,e,n):null}function u(t,e){return void 0===e&&(e=null),new I(t,e)}function c(t,e){return void 0===e&&(e=null),new U(t,e)}function p(t,e){return void 0===e&&(e=null),new W(t,e)}function l(t){return new N(t)}function h(t,e,n){return void 0===n&&(n=null),new j(t,e,n)}var f=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},d=n(5);!function(t){t[t.Const=0]="Const"}(e.TypeModifier||(e.TypeModifier={}));var v=(e.TypeModifier,function(){function t(t){void 0===t&&(t=null),this.modifiers=t,d.isBlank(t)&&(this.modifiers=[])}return t.prototype.hasModifier=function(t){return-1!==this.modifiers.indexOf(t)},t}());e.Type=v,function(t){t[t.Dynamic=0]="Dynamic",t[t.Bool=1]="Bool",t[t.String=2]="String",t[t.Int=3]="Int",t[t.Number=4]="Number",t[t.Function=5]="Function"}(e.BuiltinTypeName||(e.BuiltinTypeName={}));var y=e.BuiltinTypeName,m=function(t){function e(e,n){void 0===n&&(n=null),t.call(this,n),this.name=e}return f(e,t),e.prototype.visitType=function(t,e){return t.visitBuiltintType(this,e)},e}(v);e.BuiltinType=m;var g=function(t){function e(e,n,r){void 0===n&&(n=null),void 0===r&&(r=null),t.call(this,r),this.value=e,this.typeParams=n}return f(e,t),e.prototype.visitType=function(t,e){return t.visitExternalType(this,e)},e}(v);e.ExternalType=g;var _=function(t){function e(e,n){void 0===n&&(n=null),t.call(this,n),this.of=e}return f(e,t),e.prototype.visitType=function(t,e){return t.visitArrayType(this,e)},e}(v);e.ArrayType=_;var b=function(t){function e(e,n){void 0===n&&(n=null),t.call(this,n),this.valueType=e}return f(e,t),e.prototype.visitType=function(t,e){return t.visitMapType(this,e)},e}(v);e.MapType=b,e.DYNAMIC_TYPE=new m(y.Dynamic),e.BOOL_TYPE=new m(y.Bool),e.INT_TYPE=new m(y.Int),e.NUMBER_TYPE=new m(y.Number),e.STRING_TYPE=new m(y.String),e.FUNCTION_TYPE=new m(y.Function),function(t){t[t.Equals=0]="Equals",t[t.NotEquals=1]="NotEquals",t[t.Identical=2]="Identical",t[t.NotIdentical=3]="NotIdentical",t[t.Minus=4]="Minus",t[t.Plus=5]="Plus",t[t.Divide=6]="Divide",t[t.Multiply=7]="Multiply",t[t.Modulo=8]="Modulo",t[t.And=9]="And",t[t.Or=10]="Or",t[t.Lower=11]="Lower",t[t.LowerEquals=12]="LowerEquals",t[t.Bigger=13]="Bigger",t[t.BiggerEquals=14]="BiggerEquals"}(e.BinaryOperator||(e.BinaryOperator={}));var P=e.BinaryOperator,E=function(){function t(t){this.type=t}return t.prototype.prop=function(t){return new B(this,t)},t.prototype.key=function(t,e){return void 0===e&&(e=null),new F(this,t,e)},t.prototype.callMethod=function(t,e){return new T(this,t,e)},t.prototype.callFn=function(t){return new x(this,t)},t.prototype.instantiate=function(t,e){return void 0===e&&(e=null),new A(this,t,e)},t.prototype.conditional=function(t,e){return void 0===e&&(e=null),new k(this,t,e)},t.prototype.equals=function(t){return new L(P.Equals,this,t)},t.prototype.notEquals=function(t){return new L(P.NotEquals,this,t)},t.prototype.identical=function(t){return new L(P.Identical,this,t)},t.prototype.notIdentical=function(t){return new L(P.NotIdentical,this,t)},t.prototype.minus=function(t){return new L(P.Minus,this,t)},t.prototype.plus=function(t){return new L(P.Plus,this,t)},t.prototype.divide=function(t){return new L(P.Divide,this,t)},t.prototype.multiply=function(t){return new L(P.Multiply,this,t)},t.prototype.modulo=function(t){return new L(P.Modulo,this,t)},t.prototype.and=function(t){return new L(P.And,this,t)},t.prototype.or=function(t){return new L(P.Or,this,t)},t.prototype.lower=function(t){return new L(P.Lower,this,t)},t.prototype.lowerEquals=function(t){return new L(P.LowerEquals,this,t)},t.prototype.bigger=function(t){return new L(P.Bigger,this,t)},t.prototype.biggerEquals=function(t){return new L(P.BiggerEquals,this,t)},t.prototype.isBlank=function(){return this.equals(e.NULL_EXPR)},t.prototype.cast=function(t){return new D(this,t)},t.prototype.toStmt=function(){return new G(this)},t}();e.Expression=E,function(t){t[t.This=0]="This",t[t.Super=1]="Super",t[t.CatchError=2]="CatchError",t[t.CatchStack=3]="CatchStack"}(e.BuiltinVar||(e.BuiltinVar={}));var w=e.BuiltinVar,C=function(t){function e(e,n){void 0===n&&(n=null),t.call(this,n),d.isString(e)?(this.name=e,this.builtin=null):(this.name=null,this.builtin=e)}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitReadVarExpr(this,e)},e.prototype.set=function(t){return new R(this.name,t)},e}(E);e.ReadVarExpr=C;var R=function(t){function e(e,n,r){void 0===r&&(r=null),t.call(this,d.isPresent(r)?r:n.type),this.name=e,this.value=n}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitWriteVarExpr(this,e)},e.prototype.toDeclStmt=function(t,e){return void 0===t&&(t=null),void 0===e&&(e=null),new X(this.name,this.value,t,e)},e}(E);e.WriteVarExpr=R;var S=function(t){function e(e,n,r,i){void 0===i&&(i=null),t.call(this,d.isPresent(i)?i:r.type),this.receiver=e,this.index=n,this.value=r}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitWriteKeyExpr(this,e)},e}(E);e.WriteKeyExpr=S;var O=function(t){function e(e,n,r,i){void 0===i&&(i=null),t.call(this,d.isPresent(i)?i:r.type),this.receiver=e,this.name=n,this.value=r}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitWritePropExpr(this,e)},e}(E);e.WritePropExpr=O,function(t){t[t.ConcatArray=0]="ConcatArray",t[t.SubscribeObservable=1]="SubscribeObservable",t[t.bind=2]="bind"}(e.BuiltinMethod||(e.BuiltinMethod={}));var T=(e.BuiltinMethod,function(t){function e(e,n,r,i){void 0===i&&(i=null),t.call(this,i),this.receiver=e,this.args=r,d.isString(n)?(this.name=n,this.builtin=null):(this.name=null,this.builtin=n)}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitInvokeMethodExpr(this,e)},e}(E));e.InvokeMethodExpr=T;var x=function(t){function e(e,n,r){void 0===r&&(r=null),t.call(this,r),this.fn=e,this.args=n}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitInvokeFunctionExpr(this,e)},e}(E);e.InvokeFunctionExpr=x;var A=function(t){function e(e,n,r){t.call(this,r),this.classExpr=e,this.args=n}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitInstantiateExpr(this,e)},e}(E);e.InstantiateExpr=A;var I=function(t){function e(e,n){void 0===n&&(n=null),t.call(this,n),this.value=e}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitLiteralExpr(this,e)},e}(E);e.LiteralExpr=I;var M=function(t){function e(e,n,r){void 0===n&&(n=null),void 0===r&&(r=null),t.call(this,n),this.value=e,this.typeParams=r}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitExternalExpr(this,e)},e}(E);e.ExternalExpr=M;var k=function(t){function e(e,n,r,i){void 0===r&&(r=null),void 0===i&&(i=null),t.call(this,d.isPresent(i)?i:n.type),this.condition=e,this.falseCase=r,this.trueCase=n}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitConditionalExpr(this,e)},e}(E);e.ConditionalExpr=k;var N=function(t){function n(n){t.call(this,e.BOOL_TYPE),this.condition=n}return f(n,t),n.prototype.visitExpression=function(t,e){return t.visitNotExpr(this,e)},n}(E);e.NotExpr=N;var D=function(t){function e(e,n){t.call(this,n),this.value=e}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitCastExpr(this,e)},e}(E);e.CastExpr=D;var V=function(){function t(t,e){void 0===e&&(e=null),this.name=t,this.type=e}return t}();e.FnParam=V;var j=function(t){function e(e,n,r){void 0===r&&(r=null),t.call(this,r),this.params=e,this.statements=n}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitFunctionExpr(this,e)},e.prototype.toDeclStmt=function(t,e){return void 0===e&&(e=null),new q(t,this.params,this.statements,this.type,e)},e}(E);e.FunctionExpr=j;var L=function(t){function e(e,n,r,i){void 0===i&&(i=null),t.call(this,d.isPresent(i)?i:n.type),this.operator=e,this.rhs=r,this.lhs=n}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitBinaryOperatorExpr(this,e)},e}(E);e.BinaryOperatorExpr=L;var B=function(t){function e(e,n,r){void 0===r&&(r=null),t.call(this,r),this.receiver=e,this.name=n}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitReadPropExpr(this,e)},e.prototype.set=function(t){return new O(this.receiver,this.name,t)},e}(E);e.ReadPropExpr=B;var F=function(t){function e(e,n,r){void 0===r&&(r=null),t.call(this,r),this.receiver=e,this.index=n}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitReadKeyExpr(this,e)},e.prototype.set=function(t){return new S(this.receiver,this.index,t)},e}(E);e.ReadKeyExpr=F;var U=function(t){function e(e,n){void 0===n&&(n=null),t.call(this,n),this.entries=e}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitLiteralArrayExpr(this,e)},e}(E);e.LiteralArrayExpr=U;var W=function(t){function e(e,n){void 0===n&&(n=null),t.call(this,n),this.entries=e,this.valueType=null,d.isPresent(n)&&(this.valueType=n.valueType)}return f(e,t),e.prototype.visitExpression=function(t,e){return t.visitLiteralMapExpr(this,e)},e}(E);e.LiteralMapExpr=W,e.THIS_EXPR=new C(w.This),e.SUPER_EXPR=new C(w.Super),e.CATCH_ERROR_VAR=new C(w.CatchError),e.CATCH_STACK_VAR=new C(w.CatchStack),e.NULL_EXPR=new I(null,null),function(t){t[t.Final=0]="Final",t[t.Private=1]="Private"}(e.StmtModifier||(e.StmtModifier={}));var H=(e.StmtModifier,function(){function t(t){void 0===t&&(t=null),this.modifiers=t,d.isBlank(t)&&(this.modifiers=[])}return t.prototype.hasModifier=function(t){return-1!==this.modifiers.indexOf(t)},t}());e.Statement=H;var X=function(t){function e(e,n,r,i){void 0===r&&(r=null),void 0===i&&(i=null),t.call(this,i),this.name=e,this.value=n,this.type=d.isPresent(r)?r:n.type}return f(e,t),e.prototype.visitStatement=function(t,e){return t.visitDeclareVarStmt(this,e)},e}(H);e.DeclareVarStmt=X;var q=function(t){function e(e,n,r,i,o){void 0===i&&(i=null),void 0===o&&(o=null),t.call(this,o),this.name=e,this.params=n,this.statements=r,this.type=i}return f(e,t),e.prototype.visitStatement=function(t,e){return t.visitDeclareFunctionStmt(this,e)},e}(H);e.DeclareFunctionStmt=q;var G=function(t){function e(e){t.call(this),this.expr=e}return f(e,t),e.prototype.visitStatement=function(t,e){return t.visitExpressionStmt(this,e)},e}(H);e.ExpressionStatement=G;var z=function(t){function e(e){t.call(this),this.value=e}return f(e,t),e.prototype.visitStatement=function(t,e){return t.visitReturnStmt(this,e)},e}(H);e.ReturnStatement=z;var K=function(){function t(t,e){void 0===t&&(t=null),this.type=t,this.modifiers=e,d.isBlank(e)&&(this.modifiers=[])}return t.prototype.hasModifier=function(t){return-1!==this.modifiers.indexOf(t)},t}();e.AbstractClassPart=K;var $=function(t){function e(e,n,r){void 0===n&&(n=null),void 0===r&&(r=null),t.call(this,n,r),this.name=e}return f(e,t),e}(K);e.ClassField=$;var Q=function(t){function e(e,n,r,i,o){void 0===i&&(i=null),void 0===o&&(o=null),t.call(this,i,o),this.name=e,this.params=n,this.body=r}return f(e,t),e}(K);e.ClassMethod=Q;var J=function(t){function e(e,n,r,i){void 0===r&&(r=null),void 0===i&&(i=null),t.call(this,r,i),this.name=e,this.body=n}return f(e,t),e}(K);e.ClassGetter=J;var Z=function(t){function e(e,n,r,i,o,s,a){void 0===a&&(a=null),t.call(this,a),this.name=e,this.parent=n,this.fields=r,this.getters=i,this.constructorMethod=o,this.methods=s}return f(e,t),e.prototype.visitStatement=function(t,e){return t.visitDeclareClassStmt(this,e)},e}(H);e.ClassStmt=Z;var Y=function(t){function e(e,n,r){void 0===r&&(r=d.CONST_EXPR([])),t.call(this),this.condition=e,this.trueCase=n,this.falseCase=r}return f(e,t),e.prototype.visitStatement=function(t,e){return t.visitIfStmt(this,e)},e}(H);e.IfStmt=Y;var tt=function(t){function e(e){t.call(this),this.comment=e}return f(e,t),e.prototype.visitStatement=function(t,e){return t.visitCommentStmt(this,e)},e}(H);e.CommentStmt=tt;var et=function(t){function e(e,n){t.call(this),this.bodyStmts=e,this.catchStmts=n}return f(e,t),e.prototype.visitStatement=function(t,e){return t.visitTryCatchStmt(this,e)},e}(H);e.TryCatchStmt=et;var nt=function(t){function e(e){t.call(this),this.error=e}return f(e,t),e.prototype.visitStatement=function(t,e){return t.visitThrowStmt(this,e)},e}(H);e.ThrowStmt=nt;var rt=function(){function t(){}return t.prototype.visitReadVarExpr=function(t,e){return t},t.prototype.visitWriteVarExpr=function(t,e){return new R(t.name,t.value.visitExpression(this,e))},t.prototype.visitWriteKeyExpr=function(t,e){return new S(t.receiver.visitExpression(this,e),t.index.visitExpression(this,e),t.value.visitExpression(this,e))},t.prototype.visitWritePropExpr=function(t,e){return new O(t.receiver.visitExpression(this,e),t.name,t.value.visitExpression(this,e))},t.prototype.visitInvokeMethodExpr=function(t,e){var n=d.isPresent(t.builtin)?t.builtin:t.name;return new T(t.receiver.visitExpression(this,e),n,this.visitAllExpressions(t.args,e),t.type)},t.prototype.visitInvokeFunctionExpr=function(t,e){return new x(t.fn.visitExpression(this,e),this.visitAllExpressions(t.args,e),t.type)},t.prototype.visitInstantiateExpr=function(t,e){return new A(t.classExpr.visitExpression(this,e),this.visitAllExpressions(t.args,e),t.type)},t.prototype.visitLiteralExpr=function(t,e){return t},t.prototype.visitExternalExpr=function(t,e){return t},t.prototype.visitConditionalExpr=function(t,e){return new k(t.condition.visitExpression(this,e),t.trueCase.visitExpression(this,e),t.falseCase.visitExpression(this,e))},t.prototype.visitNotExpr=function(t,e){return new N(t.condition.visitExpression(this,e))},t.prototype.visitCastExpr=function(t,e){return new D(t.value.visitExpression(this,e),e)},t.prototype.visitFunctionExpr=function(t,e){return t},t.prototype.visitBinaryOperatorExpr=function(t,e){return new L(t.operator,t.lhs.visitExpression(this,e),t.rhs.visitExpression(this,e),t.type)},t.prototype.visitReadPropExpr=function(t,e){return new B(t.receiver.visitExpression(this,e),t.name,t.type)},t.prototype.visitReadKeyExpr=function(t,e){return new F(t.receiver.visitExpression(this,e),t.index.visitExpression(this,e),t.type)},t.prototype.visitLiteralArrayExpr=function(t,e){return new U(this.visitAllExpressions(t.entries,e))},t.prototype.visitLiteralMapExpr=function(t,e){var n=this;return new W(t.entries.map(function(t){return[t[0],t[1].visitExpression(n,e)]}))},t.prototype.visitAllExpressions=function(t,e){var n=this;return t.map(function(t){return t.visitExpression(n,e)})},t.prototype.visitDeclareVarStmt=function(t,e){return new X(t.name,t.value.visitExpression(this,e),t.type,t.modifiers)},t.prototype.visitDeclareFunctionStmt=function(t,e){return t},t.prototype.visitExpressionStmt=function(t,e){return new G(t.expr.visitExpression(this,e))},t.prototype.visitReturnStmt=function(t,e){return new z(t.value.visitExpression(this,e))},t.prototype.visitDeclareClassStmt=function(t,e){return t},t.prototype.visitIfStmt=function(t,e){return new Y(t.condition.visitExpression(this,e),this.visitAllStatements(t.trueCase,e),this.visitAllStatements(t.falseCase,e))},t.prototype.visitTryCatchStmt=function(t,e){return new et(this.visitAllStatements(t.bodyStmts,e),this.visitAllStatements(t.catchStmts,e))},t.prototype.visitThrowStmt=function(t,e){return new nt(t.error.visitExpression(this,e))},t.prototype.visitCommentStmt=function(t,e){return t},t.prototype.visitAllStatements=function(t,e){var n=this;return t.map(function(t){return t.visitStatement(n,e)})},t}();e.ExpressionTransformer=rt;var it=function(){function t(){}return t.prototype.visitReadVarExpr=function(t,e){return t},t.prototype.visitWriteVarExpr=function(t,e){return t.value.visitExpression(this,e),t},t.prototype.visitWriteKeyExpr=function(t,e){return t.receiver.visitExpression(this,e),t.index.visitExpression(this,e),t.value.visitExpression(this,e),t},t.prototype.visitWritePropExpr=function(t,e){return t.receiver.visitExpression(this,e),t.value.visitExpression(this,e),t},t.prototype.visitInvokeMethodExpr=function(t,e){return t.receiver.visitExpression(this,e),this.visitAllExpressions(t.args,e),t},t.prototype.visitInvokeFunctionExpr=function(t,e){return t.fn.visitExpression(this,e),this.visitAllExpressions(t.args,e),t},t.prototype.visitInstantiateExpr=function(t,e){return t.classExpr.visitExpression(this,e),this.visitAllExpressions(t.args,e),t},t.prototype.visitLiteralExpr=function(t,e){return t},t.prototype.visitExternalExpr=function(t,e){return t},t.prototype.visitConditionalExpr=function(t,e){return t.condition.visitExpression(this,e),t.trueCase.visitExpression(this,e),t.falseCase.visitExpression(this,e),t},t.prototype.visitNotExpr=function(t,e){return t.condition.visitExpression(this,e),t},t.prototype.visitCastExpr=function(t,e){return t.value.visitExpression(this,e),t},t.prototype.visitFunctionExpr=function(t,e){return t},t.prototype.visitBinaryOperatorExpr=function(t,e){return t.lhs.visitExpression(this,e),t.rhs.visitExpression(this,e),t},t.prototype.visitReadPropExpr=function(t,e){return t.receiver.visitExpression(this,e),t},t.prototype.visitReadKeyExpr=function(t,e){return t.receiver.visitExpression(this,e),t.index.visitExpression(this,e),t},t.prototype.visitLiteralArrayExpr=function(t,e){return this.visitAllExpressions(t.entries,e),t},t.prototype.visitLiteralMapExpr=function(t,e){var n=this;return t.entries.forEach(function(t){return t[1].visitExpression(n,e)}),t},t.prototype.visitAllExpressions=function(t,e){var n=this;t.forEach(function(t){return t.visitExpression(n,e)})},t.prototype.visitDeclareVarStmt=function(t,e){return t.value.visitExpression(this,e),t},t.prototype.visitDeclareFunctionStmt=function(t,e){return t},t.prototype.visitExpressionStmt=function(t,e){return t.expr.visitExpression(this,e),t},t.prototype.visitReturnStmt=function(t,e){return t.value.visitExpression(this,e),t},t.prototype.visitDeclareClassStmt=function(t,e){return t},t.prototype.visitIfStmt=function(t,e){return t.condition.visitExpression(this,e),this.visitAllStatements(t.trueCase,e),this.visitAllStatements(t.falseCase,e),t},t.prototype.visitTryCatchStmt=function(t,e){return this.visitAllStatements(t.bodyStmts,e),this.visitAllStatements(t.catchStmts,e),t},t.prototype.visitThrowStmt=function(t,e){return t.error.visitExpression(this,e),t},t.prototype.visitCommentStmt=function(t,e){return t},t.prototype.visitAllStatements=function(t,e){var n=this;t.forEach(function(t){return t.visitStatement(n,e)})},t}();e.RecursiveExpressionVisitor=it,e.replaceVarInExpression=r;var ot=function(t){function e(e,n){t.call(this),this._varName=e,this._newValue=n}return f(e,t),e.prototype.visitReadVarExpr=function(t,e){return t.name==this._varName?this._newValue:t},e}(rt);e.findReadVarNames=i;var st=function(t){function e(){t.apply(this,arguments),this.varNames=new Set}return f(e,t),e.prototype.visitReadVarExpr=function(t,e){return this.varNames.add(t.name),null},e}(it);e.variable=o,e.importExpr=s,e.importType=a,e.literal=u,e.literalArr=c,e.literalMap=p,e.not=l,e.fn=h},function(t,e,n){"use strict";function r(t){if(!t.isComponent)throw new a.BaseException("Could not compile '"+t.type.name+"' because it is not a component.")}var i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(5),a=n(12),u=n(15),c=n(40),p=n(155),l=n(6),h=n(166),f=n(168),d=n(140),v=n(183),y=n(185),m=n(65),g=n(162),_=n(164),b=n(191),P=n(194),E=n(198),w=n(184),C=function(){function t(t,e,n,r,i,o,s){this._runtimeMetadataResolver=t,this._templateNormalizer=e,this._templateParser=n,this._styleCompiler=r,this._viewCompiler=i,this._xhr=o,this._genConfig=s,this._styleCache=new Map,this._hostCacheKeys=new Map,this._compiledTemplateCache=new Map,this._compiledTemplateDone=new Map}return t.prototype.resolveComponent=function(t){var e=this._runtimeMetadataResolver.getDirectiveMetadata(t),n=this._hostCacheKeys.get(t);if(s.isBlank(n)){n=new Object,this._hostCacheKeys.set(t,n),r(e);var i=p.createHostComponentMeta(e.type,e.selector);this._loadAndCompileComponent(n,i,[e],[],[])}return this._compiledTemplateDone.get(n).then(function(n){return new m.ComponentFactory(e.selector,n.viewFactory,t)})},t.prototype.clearCache=function(){this._styleCache.clear(),this._compiledTemplateCache.clear(),this._compiledTemplateDone.clear(),this._hostCacheKeys.clear()},t.prototype._loadAndCompileComponent=function(t,e,n,r,i){var o=this,a=this._compiledTemplateCache.get(t),u=this._compiledTemplateDone.get(t);return s.isBlank(a)&&(a=new R,this._compiledTemplateCache.set(t,a),u=c.PromiseWrapper.all([this._compileComponentStyles(e)].concat(n.map(function(t){return o._templateNormalizer.normalizeDirective(t)}))).then(function(t){var n=t.slice(1),s=t[0],u=o._templateParser.parse(e,e.template.template,n,r,e.type.name),p=[];return a.init(o._compileComponent(e,u,s,r,i,p)),c.PromiseWrapper.all(p).then(function(t){return a})}),this._compiledTemplateDone.set(t,u)),a},t.prototype._compileComponent=function(t,e,n,r,i,o){var a=this,c=this._viewCompiler.compileComponent(t,e,new _.ExternalExpr(new p.CompileIdentifierMetadata({runtime:n})),r);c.dependencies.forEach(function(t){var e=u.ListWrapper.clone(i),n=t.comp.type.runtime,r=a._runtimeMetadataResolver.getViewDirectivesMetadata(t.comp.type.runtime),s=a._runtimeMetadataResolver.getViewPipesMetadata(t.comp.type.runtime),c=u.ListWrapper.contains(e,n);e.push(n);var p=a._loadAndCompileComponent(t.comp.type.runtime,t.comp,r,s,e);t.factoryPlaceholder.runtime=p.proxyViewFactory,t.factoryPlaceholder.name="viewFactory_"+t.comp.type.name,c||o.push(a._compiledTemplateDone.get(n))});var l;return l=s.IS_DART||!this._genConfig.useJit?P.interpretStatements(c.statements,c.viewFactoryVar,new E.InterpretiveAppViewInstanceFactory):b.jitStatements(t.type.name+".template.js",c.statements,c.viewFactoryVar)},t.prototype._compileComponentStyles=function(t){var e=this._styleCompiler.compileComponent(t);return this._resolveStylesCompileResult(t.type.name,e)},t.prototype._resolveStylesCompileResult=function(t,e){var n=this,r=e.dependencies.map(function(t){return n._loadStylesheetDep(t)});return c.PromiseWrapper.all(r).then(function(t){for(var r=[],i=0;io?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(155),a=n(164),u=n(36),c=n(167),p=n(157),l=n(152),h=n(6),f=n(5),d="%COMP%",v="_nghost-"+d,y="_ngcontent-"+d,m=function(){function t(t,e,n){this.sourceUrl=t,this.isShimmed=e,this.valuePlaceholder=n}return t}();e.StylesCompileDependency=m;var g=function(){function t(t,e,n){this.statements=t,this.stylesVar=e,this.dependencies=n}return t}();e.StylesCompileResult=g;var _=function(){function t(t){this._urlResolver=t,this._shadowCss=new c.ShadowCss}return t.prototype.compileComponent=function(t){var e=t.template.encapsulation===u.ViewEncapsulation.Emulated;return this._compileStyles(r(t),t.template.styles,t.template.styleUrls,e)},t.prototype.compileStylesheet=function(t,e,n){var i=l.extractStyleUrls(this._urlResolver,t,e);return this._compileStyles(r(null),[i.style],i.styleUrls,n)},t.prototype._compileStyles=function(t,e,n,i){for(var o=this,u=e.map(function(t){return a.literal(o._shimIfNeeded(t,i))}),c=[],p=0;p0?o.push(u):(o.length>0&&(r.push(o.join("")),n.push(x),o=[]),n.push(u)),u==O&&i++}return o.length>0&&(r.push(o.join("")),n.push(x)),new I(n.join(""),r)}var s=n(15),a=n(5),u=function(){function t(){this.strictStyling=!0}return t.prototype.shimCssText=function(t,e,n){return void 0===n&&(n=""),t=r(t),t=this._insertDirectives(t),this._scopeCssText(t,e,n)},t.prototype._insertDirectives=function(t){return t=this._insertPolyfillDirectivesInCssText(t),this._insertPolyfillRulesInCssText(t)},t.prototype._insertPolyfillDirectivesInCssText=function(t){return a.StringWrapper.replaceAllMapped(t,c,function(t){return t[1]+"{"})},t.prototype._insertPolyfillRulesInCssText=function(t){return a.StringWrapper.replaceAllMapped(t,p,function(t){var e=t[0];return e=a.StringWrapper.replace(e,t[1],""),e=a.StringWrapper.replace(e,t[2],""),t[3]+e})},t.prototype._scopeCssText=function(t,e,n){var r=this._extractUnscopedRulesFromCssText(t);return t=this._insertPolyfillHostInCssText(t),t=this._convertColonHost(t),t=this._convertColonHostContext(t),t=this._convertShadowDOMSelectors(t), +a.isPresent(e)&&(t=this._scopeSelectors(t,e,n)),t=t+"\n"+r,t.trim()},t.prototype._extractUnscopedRulesFromCssText=function(t){for(var e,n="",r=a.RegExpWrapper.matcher(l,t);a.isPresent(e=a.RegExpMatcherWrapper.next(r));){var i=e[0];i=a.StringWrapper.replace(i,e[2],""),i=a.StringWrapper.replace(i,e[1],e[3]),n+=i+"\n\n"}return n},t.prototype._convertColonHost=function(t){return this._convertColonRule(t,v,this._colonHostPartReplacer)},t.prototype._convertColonHostContext=function(t){return this._convertColonRule(t,y,this._colonHostContextPartReplacer)},t.prototype._convertColonRule=function(t,e,n){return a.StringWrapper.replaceAllMapped(t,e,function(t){if(a.isPresent(t[2])){for(var e=t[2].split(","),r=[],i=0;i","+","~"],i=t,o="["+e+"]",u=0;u0&&!s.ListWrapper.contains(r,e)&&!a.StringWrapper.contains(e,o)){var n=/([^:]*)(:*)(.*)/g,i=a.RegExpWrapper.firstMatch(n,e);a.isPresent(i)&&(t=i[1]+o+i[2]+i[3])}return t}).join(c)}return i},t.prototype._insertPolyfillHostInCssText=function(t){return t=a.StringWrapper.replaceAll(t,w,f),t=a.StringWrapper.replaceAll(t,E,h)},t}();e.ShadowCss=u;var c=/polyfill-next-selector[^}]*content:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,p=/(polyfill-rule)[^}]*(content:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,l=/(polyfill-unscoped-rule)[^}]*(content:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,h="-shadowcsshost",f="-shadowcsscontext",d=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)",v=a.RegExpWrapper.create("("+h+d,"im"),y=a.RegExpWrapper.create("("+f+d,"im"),m=h+"-no-combinator",g=[/::shadow/g,/::content/g,/\/shadow-deep\//g,/\/shadow\//g],_=/(?:>>>)|(?:\/deep\/)/g,b="([>\\s~+[.,{:][\\s\\S]*)?$",P=a.RegExpWrapper.create(h,"im"),E=/:host/gim,w=/:host-context/gim,C=/\/\*[\s\S]*?\*\//g,R=/(\s*)([^;\{\}]+?)(\s*)((?:{%BLOCK%}?\s*;?)|(?:\s*;))/g,S=/([{}])/g,O="{",T="}",x="%BLOCK%",A=function(){function t(t,e){this.selector=t,this.content=e}return t}();e.CssRule=A,e.processRules=i;var I=function(){function t(t,e){this.escapedString=t,this.blocks=e}return t}()},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(6),s=n(169),a=n(174),u=n(176),c=n(162),p=function(){function t(t,e,n){this.statements=t,this.viewFactoryVar=e,this.dependencies=n}return t}();e.ViewCompileResult=p;var l=function(){function t(t){this._genConfig=t}return t.prototype.compileComponent=function(t,e,n,r){var i=[],o=[],c=new a.CompileView(t,this._genConfig,r,n,0,s.CompileElement.createNull(),[]);return u.buildView(c,e,o,i),new p(i,c.viewFactory.name,o)},t=r([o.Injectable(),i("design:paramtypes",[c.CompilerConfig])],t)}();e.ViewCompiler=l},function(t,e,n){"use strict";function r(t,e,n,r){var i;return i=e>0?s.literal(t).lowerEquals(u.InjectMethodVars.requestNodeIndex).and(u.InjectMethodVars.requestNodeIndex.lowerEquals(s.literal(t+e))):s.literal(t).identical(u.InjectMethodVars.requestNodeIndex),new s.IfStmt(u.InjectMethodVars.token.identical(f.createDiTokenExpression(n.token)).and(i),[new s.ReturnStatement(r)])}function i(t,e,n,r,i,o){var a,u,p=o.view;if(r?(a=s.literalArr(n),u=new s.ArrayType(s.DYNAMIC_TYPE)):(a=n[0],u=n[0].type),c.isBlank(u)&&(u=s.DYNAMIC_TYPE),i)p.fields.push(new s.ClassField(t,u,[s.StmtModifier.Private])),p.createMethod.addStmt(s.THIS_EXPR.prop(t).set(a).toStmt());else{var l="_"+t;p.fields.push(new s.ClassField(l,u,[s.StmtModifier.Private]));var h=new v.CompileMethod(p);h.resetDebugInfo(o.nodeIndex,o.sourceAst),h.addStmt(new s.IfStmt(s.THIS_EXPR.prop(l).isBlank(),[s.THIS_EXPR.prop(l).set(a).toStmt()])),h.addStmt(new s.ReturnStatement(s.THIS_EXPR.prop(l))),p.getters.push(new s.ClassGetter(t,h.finish(),u))}return s.THIS_EXPR.prop(t)}var o=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},s=n(164),a=n(158),u=n(170),c=n(5),p=n(15),l=n(139),h=n(155),f=n(171),d=n(172),v=n(173),y=function(){function t(t,e,n,r,i){this.parent=t,this.view=e,this.nodeIndex=n,this.renderNode=r,this.sourceAst=i}return t.prototype.isNull=function(){return c.isBlank(this.renderNode)},t.prototype.isRootElement=function(){return this.view!=this.parent.view},t}();e.CompileNode=y;var m=function(t){function e(e,n,r,i,o,u,p,l,f,d,v){t.call(this,e,n,r,i,o),this.component=u,this._directives=p,this._resolvedProvidersArray=l,this.hasViewContainer=f,this.hasEmbeddedView=d,this.variableTokens=v,this._compViewExpr=null,this._instances=new h.CompileTokenMap,this._queryCount=0,this._queries=new h.CompileTokenMap,this._componentConstructorViewQueryLists=[],this.contentNodesByNgContentIndex=null,this.elementRef=s.importExpr(a.Identifiers.ElementRef).instantiate([this.renderNode]),this._instances.add(a.identifierToken(a.Identifiers.ElementRef),this.elementRef),this.injector=s.THIS_EXPR.callMethod("injector",[s.literal(this.nodeIndex)]),this._instances.add(a.identifierToken(a.Identifiers.Injector),this.injector),this._instances.add(a.identifierToken(a.Identifiers.Renderer),s.THIS_EXPR.prop("renderer")),(this.hasViewContainer||this.hasEmbeddedView||c.isPresent(this.component))&&this._createAppElement()}return o(e,t),e.createNull=function(){return new e(null,null,null,null,null,null,[],[],!1,!1,{})},e.prototype._createAppElement=function(){var t="_appEl_"+this.nodeIndex,e=this.isRootElement()?null:this.parent.nodeIndex;this.view.fields.push(new s.ClassField(t,s.importType(a.Identifiers.AppElement),[s.StmtModifier.Private]));var n=s.THIS_EXPR.prop(t).set(s.importExpr(a.Identifiers.AppElement).instantiate([s.literal(this.nodeIndex),s.literal(e),s.THIS_EXPR,this.renderNode])).toStmt();this.view.createMethod.addStmt(n),this.appElement=s.THIS_EXPR.prop(t),this._instances.add(a.identifierToken(a.Identifiers.AppElement),this.appElement)},e.prototype.setComponentView=function(t){this._compViewExpr=t,this.contentNodesByNgContentIndex=p.ListWrapper.createFixedSize(this.component.template.ngContentSelectors.length);for(var e=0;e=i})),r._directives.length>0&&i++,r=r.parent;return e=this.view.componentView.viewQueries.get(t),c.isPresent(e)&&p.ListWrapper.addAll(n,e),n},e.prototype._addQuery=function(t,e){var n="_query_"+t.selectors[0].name+"_"+this.nodeIndex+"_"+this._queryCount++,r=d.createQueryList(t,e,n,this.view),i=new d.CompileQuery(t,r,e,this.view);return d.addQueryToTokenMap(this._queries,i),i},e.prototype._getLocalDependency=function(t,e){var n=null;if(c.isBlank(n)&&c.isPresent(e.query)&&(n=this._addQuery(e.query,null).queryList),c.isBlank(n)&&c.isPresent(e.viewQuery)&&(n=d.createQueryList(e.viewQuery,null,"_viewQuery_"+e.viewQuery.selectors[0].name+"_"+this.nodeIndex+"_"+this._componentConstructorViewQueryLists.length,this.view),this._componentConstructorViewQueryLists.push(n)),c.isPresent(e.token)){if(c.isBlank(n)&&e.token.equalsTo(a.identifierToken(a.Identifiers.ChangeDetectorRef)))return t===l.ProviderAstType.Component?this._compViewExpr.prop("ref"):s.THIS_EXPR.prop("ref");c.isBlank(n)&&(n=this._instances.get(e.token))}return n},e.prototype._getDependency=function(t,e){var n=this,r=null;for(e.isValue&&(r=s.literal(e.value)),c.isBlank(r)&&!e.isSkipSelf&&(r=this._getLocalDependency(t,e));c.isBlank(r)&&!n.parent.isNull();)n=n.parent,r=n._getLocalDependency(l.ProviderAstType.PublicService,new h.CompileDiDependencyMetadata({token:e.token}));return c.isBlank(r)&&(r=f.injectFromViewParentInjector(e.token,e.isOptional)),c.isBlank(r)&&(r=s.NULL_EXPR),f.getPropertyInView(r,this.view,n.view)},e}(y);e.CompileElement=m;var g=function(){function t(t,e){this.query=t,this.read=c.isPresent(t.meta.read)?t.meta.read:e}return t}()},function(t,e,n){"use strict";function r(t,e){if(i.isBlank(e))return c.NULL_EXPR;var n=i.resolveEnumToken(t.runtime,e);return c.importExpr(new o.CompileIdentifierMetadata({name:t.name+"."+n,moduleUrl:t.moduleUrl,runtime:e}))}var i=n(5),o=n(155),s=n(28),a=n(36),u=n(68),c=n(164),p=n(158),l=function(){function t(){}return t.fromValue=function(t){return r(p.Identifiers.ViewType,t)},t.HOST=t.fromValue(u.ViewType.HOST),t.COMPONENT=t.fromValue(u.ViewType.COMPONENT),t.EMBEDDED=t.fromValue(u.ViewType.EMBEDDED),t}();e.ViewTypeEnum=l;var h=function(){function t(){}return t.fromValue=function(t){return r(p.Identifiers.ViewEncapsulation,t)},t.Emulated=t.fromValue(a.ViewEncapsulation.Emulated),t.Native=t.fromValue(a.ViewEncapsulation.Native),t.None=t.fromValue(a.ViewEncapsulation.None),t}();e.ViewEncapsulationEnum=h;var f=function(){function t(){}return t.fromValue=function(t){return r(p.Identifiers.ChangeDetectorState,t)},t.NeverChecked=t.fromValue(s.ChangeDetectorState.NeverChecked),t.CheckedBefore=t.fromValue(s.ChangeDetectorState.CheckedBefore),t.Errored=t.fromValue(s.ChangeDetectorState.Errored),t}();e.ChangeDetectorStateEnum=f;var d=function(){function t(){}return t.fromValue=function(t){return r(p.Identifiers.ChangeDetectionStrategy,t)},t.CheckOnce=t.fromValue(s.ChangeDetectionStrategy.CheckOnce),t.Checked=t.fromValue(s.ChangeDetectionStrategy.Checked),t.CheckAlways=t.fromValue(s.ChangeDetectionStrategy.CheckAlways),t.Detached=t.fromValue(s.ChangeDetectionStrategy.Detached),t.OnPush=t.fromValue(s.ChangeDetectionStrategy.OnPush),t.Default=t.fromValue(s.ChangeDetectionStrategy.Default),t}();e.ChangeDetectionStrategyEnum=d;var v=function(){function t(){}return t.viewUtils=c.variable("viewUtils"),t.parentInjector=c.variable("parentInjector"),t.declarationEl=c.variable("declarationEl"),t}();e.ViewConstructorVars=v;var y=function(){function t(){}return t.renderer=c.THIS_EXPR.prop("renderer"),t.projectableNodes=c.THIS_EXPR.prop("projectableNodes"),t.viewUtils=c.THIS_EXPR.prop("viewUtils"),t}();e.ViewProperties=y;var m=function(){function t(){}return t.event=c.variable("$event"),t}();e.EventHandlerVars=m;var g=function(){function t(){}return t.token=c.variable("token"),t.requestNodeIndex=c.variable("requestNodeIndex"),t.notFoundResult=c.variable("notFoundResult"),t}();e.InjectMethodVars=g;var _=function(){function t(){}return t.throwOnChange=c.variable("throwOnChange"),t.changes=c.variable("changes"),t.changed=c.variable("changed"),t.valUnwrapper=c.variable("valUnwrapper"),t}();e.DetectChangesVars=_},function(t,e,n){"use strict";function r(t,e,n){if(e===n)return t;for(var r=l.THIS_EXPR,i=e;i!==n&&c.isPresent(i.declarationElement.view);)i=i.declarationElement.view,r=r.prop("parent");if(i!==n)throw new p.BaseException("Internal error: Could not calculate a property in a parent view: "+t);if(t instanceof l.ReadPropExpr){var o=t;(n.fields.some(function(t){return t.name==o.name})||n.getters.some(function(t){return t.name==o.name}))&&(r=r.cast(n.classType))}return l.replaceVarInExpression(l.THIS_EXPR.name,r,t)}function i(t,e){var n=[s(t)];return e&&n.push(l.NULL_EXPR),l.THIS_EXPR.prop("parentInjector").callMethod("get",n)}function o(t,e){return"viewFactory_"+t.type.name+e}function s(t){return c.isPresent(t.value)?l.literal(t.value):t.identifierIsInstance?l.importExpr(t.identifier).instantiate([],l.importType(t.identifier,[],[l.TypeModifier.Const])):l.importExpr(t.identifier)}function a(t){for(var e=[],n=l.literalArr([]),r=0;r0&&(n=n.callMethod(l.BuiltinMethod.ConcatArray,[l.literalArr(e)]),e=[]),n=n.callMethod(l.BuiltinMethod.ConcatArray,[i])):e.push(i)}return e.length>0&&(n=n.callMethod(l.BuiltinMethod.ConcatArray,[l.literalArr(e)])),n}function u(t,e,n,r){r.fields.push(new l.ClassField(n.name,null,[l.StmtModifier.Private]));var i=e0?s.values[s.values.length-1]:null;if(e instanceof h&&e.view===t.embeddedView)s=e;else{var n=new h(t.embeddedView,[]);s.values.push(n),s=n}}),s.values.push(t),r.length>0&&e.dirtyParentQueriesMethod.addStmt(o.callMethod("setDirty",[]).toStmt())},t.prototype.afterChildren=function(t){var e=r(this._values),n=[this.queryList.callMethod("reset",[c.literalArr(e)]).toStmt()];if(a.isPresent(this.ownerDirectiveExpression)){var i=this.meta.first?this.queryList.prop("first"):this.queryList;n.push(this.ownerDirectiveExpression.prop(this.meta.propertyName).set(i).toStmt())}this.meta.first||n.push(this.queryList.callMethod("notifyOnChanges",[]).toStmt()),t.addStmt(new c.IfStmt(this.queryList.prop("dirty"),n))},t}();e.CompileQuery=f,e.createQueryList=o,e.addQueryToTokenMap=s},function(t,e,n){"use strict";var r=n(5),i=n(15),o=n(164),s=function(){function t(t,e){this.nodeIndex=t,this.sourceAst=e}return t}(),a=new s(null,null),u=function(){function t(t){this._view=t,this._newState=a,this._currState=a,this._bodyStatements=[],this._debugEnabled=this._view.genConfig.genDebugInfo}return t.prototype._updateDebugContextIfNeeded=function(){if(this._newState.nodeIndex!==this._currState.nodeIndex||this._newState.sourceAst!==this._currState.sourceAst){var t=this._updateDebugContext(this._newState);r.isPresent(t)&&this._bodyStatements.push(t.toStmt())}},t.prototype._updateDebugContext=function(t){if(this._currState=this._newState=t,this._debugEnabled){var e=r.isPresent(t.sourceAst)?t.sourceAst.sourceSpan.start:null;return o.THIS_EXPR.callMethod("debug",[o.literal(t.nodeIndex),r.isPresent(e)?o.literal(e.line):o.NULL_EXPR,r.isPresent(e)?o.literal(e.col):o.NULL_EXPR])}return null},t.prototype.resetDebugInfoExpr=function(t,e){var n=this._updateDebugContext(new s(t,e));return r.isPresent(n)?n:o.NULL_EXPR},t.prototype.resetDebugInfo=function(t,e){this._newState=new s(t,e)},t.prototype.addStmt=function(t){this._updateDebugContextIfNeeded(),this._bodyStatements.push(t)},t.prototype.addStmts=function(t){this._updateDebugContextIfNeeded(),i.ListWrapper.addAll(this._bodyStatements,t)},t.prototype.finish=function(){return this._bodyStatements},t.prototype.isEmpty=function(){return 0===this._bodyStatements.length},t}();e.CompileMethod=u},function(t,e,n){"use strict";function r(t,e){return e>0?l.ViewType.EMBEDDED:t.type.isHost?l.ViewType.HOST:l.ViewType.COMPONENT}var i=n(5),o=n(15),s=n(164),a=n(170),u=n(172),c=n(173),p=n(175),l=n(68),h=n(155),f=n(171),d=function(){function t(t,e,n,a,p,d,v){var y=this;this.component=t,this.genConfig=e,this.pipeMetas=n,this.styles=a,this.viewIndex=p,this.declarationElement=d,this.templateVariableBindings=v,this.nodes=[],this.rootNodesOrAppElements=[],this.bindings=[],this.classStatements=[],this.eventHandlerMethods=[],this.fields=[],this.getters=[],this.disposables=[],this.subscriptions=[],this.purePipes=new Map,this.pipes=[],this.variables=new Map,this.literalArrayCount=0,this.literalMapCount=0,this.pipeCount=0,this.createMethod=new c.CompileMethod(this),this.injectorGetMethod=new c.CompileMethod(this),this.updateContentQueriesMethod=new c.CompileMethod(this),this.dirtyParentQueriesMethod=new c.CompileMethod(this),this.updateViewQueriesMethod=new c.CompileMethod(this),this.detectChangesInInputsMethod=new c.CompileMethod(this),this.detectChangesRenderPropertiesMethod=new c.CompileMethod(this),this.afterContentLifecycleCallbacksMethod=new c.CompileMethod(this),this.afterViewLifecycleCallbacksMethod=new c.CompileMethod(this),this.destroyMethod=new c.CompileMethod(this),this.viewType=r(t,p),this.className="_View_"+t.type.name+p,this.classType=s.importType(new h.CompileIdentifierMetadata({name:this.className})),this.viewFactory=s.variable(f.getViewFactoryName(t,p)),this.viewType===l.ViewType.COMPONENT||this.viewType===l.ViewType.HOST?this.componentView=this:this.componentView=this.declarationElement.view.componentView;var m=new h.CompileTokenMap;if(this.viewType===l.ViewType.COMPONENT){var g=s.THIS_EXPR.prop("context");o.ListWrapper.forEachWithIndex(this.component.viewQueries,function(t,e){var n="_viewQuery_"+t.selectors[0].name+"_"+e,r=u.createQueryList(t,g,n,y),i=new u.CompileQuery(t,r,g,y);u.addQueryToTokenMap(m,i)});var _=0;this.component.type.diDeps.forEach(function(t){if(i.isPresent(t.viewQuery)){var e=s.THIS_EXPR.prop("declarationAppElement").prop("componentConstructorViewQueries").key(s.literal(_++)),n=new u.CompileQuery(t.viewQuery,e,null,y);u.addQueryToTokenMap(m,n)}})}this.viewQueries=m,v.forEach(function(t){y.variables.set(t[1],s.THIS_EXPR.prop("locals").key(s.literal(t[0])))}),this.declarationElement.isNull()||this.declarationElement.setEmbeddedView(this)}return t.prototype.callPipe=function(t,e,n){var r=this.componentView,o=r.purePipes.get(t);return i.isBlank(o)&&(o=new p.CompilePipe(r,t),o.pure&&r.purePipes.set(t,o),r.pipes.push(o)),o.call(this,[e].concat(n))},t.prototype.getVariable=function(t){if(t==a.EventHandlerVars.event.name)return a.EventHandlerVars.event;for(var e=this,n=e.variables.get(t);i.isBlank(n)&&i.isPresent(e.declarationElement.view);)e=e.declarationElement.view,n=e.variables.get(t);return i.isPresent(n)?f.getPropertyInView(n,this,e):null},t.prototype.createLiteralArray=function(t){for(var e=s.THIS_EXPR.prop("_arr_"+this.literalArrayCount++),n=[],r=[],i=0;i=0;r--){var s=t.pipeMetas[r];if(s.name==e){n=s;break}}if(i.isBlank(n))throw new o.BaseException("Illegal state: Could not find pipe "+e+" although the parser should have detected this error!");return n}var i=n(5),o=n(12),s=n(164),a=n(158),u=n(171),c=function(){function t(t,e){this.instance=t,this.argCount=e}return t}(),p=function(){function t(t,e){this.view=t,this._purePipeProxies=[],this.meta=r(t,e),this.instance=s.THIS_EXPR.prop("_pipe_"+e+"_"+t.pipeCount++)}return Object.defineProperty(t.prototype,"pure",{get:function(){return this.meta.pure},enumerable:!0,configurable:!0}),t.prototype.create=function(){var t=this,e=this.meta.type.diDeps.map(function(t){return t.token.equalsTo(a.identifierToken(a.Identifiers.ChangeDetectorRef))?s.THIS_EXPR.prop("ref"):u.injectFromViewParentInjector(t.token,!1)});this.view.fields.push(new s.ClassField(this.instance.name,s.importType(this.meta.type),[s.StmtModifier.Private])),this.view.createMethod.resetDebugInfo(null,null),this.view.createMethod.addStmt(s.THIS_EXPR.prop(this.instance.name).set(s.importExpr(this.meta.type).instantiate(e)).toStmt()),this._purePipeProxies.forEach(function(e){u.createPureProxy(t.instance.prop("transform").callMethod(s.BuiltinMethod.bind,[t.instance]),e.argCount,e.instance,t.view)})},t.prototype.call=function(t,e){if(this.meta.pure){var n=new c(s.THIS_EXPR.prop(this.instance.name+"_"+this._purePipeProxies.length),e.length);return this._purePipeProxies.push(n),u.getPropertyInView(s.importExpr(a.Identifiers.castByValue).callFn([n.instance,this.instance.prop("transform")]),t,this.view).callFn(e)}return u.getPropertyInView(this.instance,t,this.view).callMethod("transform",e)},t}();e.CompilePipe=p},function(t,e,n){"use strict";function r(t,e,n,r){var i=new L(t,n,r);return S.templateVisitAll(i,e,t.declarationElement.isNull()?t.declarationElement:t.declarationElement.parent),I.bindView(t,e),t.afterNodes(),c(t,r),i.nestedViewCount}function i(t,e){var n={};return _.StringMapWrapper.forEach(t,function(t,e){n[e]=t}),e.forEach(function(t){_.StringMapWrapper.forEach(t.hostAttributes,function(t,e){var r=n[e];n[e]=g.isPresent(r)?a(e,r,t):t})}),u(n)}function o(t){var e={};return t.forEach(function(t){e[t.name]=t.value}),e}function s(t,e,n){var r={},i=null;return e.forEach(function(t){t.directive.isComponent&&(i=t.directive),t.exportAsVars.forEach(function(e){r[e.name]=P.identifierToken(t.directive.type)})}),t.forEach(function(t){r[t.name]=g.isPresent(i)?P.identifierToken(i.type):null}),r}function a(t,e,n){return t==k||t==N?e+" "+n:n}function u(t){var e=[];_.StringMapWrapper.forEach(t,function(t,n){e.push([n,t])}),_.ListWrapper.sort(e,function(t,e){return g.StringWrapper.compare(t[0],e[0])});var n=[];return e.forEach(function(t){n.push([t[0],t[1]])}),n}function c(t,e){var n=b.NULL_EXPR;t.genConfig.genDebugInfo&&(n=b.variable("nodeDebugInfos_"+t.component.type.name+t.viewIndex),e.push(n.set(b.literalArr(t.nodes.map(p),new b.ArrayType(new b.ExternalType(P.Identifiers.StaticNodeDebugInfo),[b.TypeModifier.Const]))).toDeclStmt(null,[b.StmtModifier.Final])));var r=b.variable("renderType_"+t.component.type.name);0===t.viewIndex&&e.push(r.set(b.NULL_EXPR).toDeclStmt(b.importType(P.Identifiers.RenderComponentType)));var i=l(t,r,n);e.push(i),e.push(h(t,i,r))}function p(t){var e=t instanceof R.CompileElement?t:null,n=[],r=b.NULL_EXPR,i=[];return g.isPresent(e)&&(n=e.getProviderTokens(),g.isPresent(e.component)&&(r=O.createDiTokenExpression(P.identifierToken(e.component.type))),_.StringMapWrapper.forEach(e.variableTokens,function(t,e){i.push([e,g.isPresent(t)?O.createDiTokenExpression(t):b.NULL_EXPR])})),b.importExpr(P.Identifiers.StaticNodeDebugInfo).instantiate([b.literalArr(n,new b.ArrayType(b.DYNAMIC_TYPE,[b.TypeModifier.Const])),r,b.literalMap(i,new b.MapType(b.DYNAMIC_TYPE,[b.TypeModifier.Const]))],b.importType(P.Identifiers.StaticNodeDebugInfo,null,[b.TypeModifier.Const]))}function l(t,e,n){var r=t.templateVariableBindings.map(function(t){return[t[0],b.NULL_EXPR]}),i=[new b.FnParam(E.ViewConstructorVars.viewUtils.name,b.importType(P.Identifiers.ViewUtils)),new b.FnParam(E.ViewConstructorVars.parentInjector.name,b.importType(P.Identifiers.Injector)),new b.FnParam(E.ViewConstructorVars.declarationEl.name,b.importType(P.Identifiers.AppElement))],o=new b.ClassMethod(null,i,[b.SUPER_EXPR.callFn([b.variable(t.className),e,E.ViewTypeEnum.fromValue(t.viewType),b.literalMap(r),E.ViewConstructorVars.viewUtils,E.ViewConstructorVars.parentInjector,E.ViewConstructorVars.declarationEl,E.ChangeDetectionStrategyEnum.fromValue(m(t)),n]).toStmt()]),s=[new b.ClassMethod("createInternal",[new b.FnParam(V.name,b.STRING_TYPE)],f(t),b.importType(P.Identifiers.AppElement)),new b.ClassMethod("injectorGetInternal",[new b.FnParam(E.InjectMethodVars.token.name,b.DYNAMIC_TYPE),new b.FnParam(E.InjectMethodVars.requestNodeIndex.name,b.NUMBER_TYPE),new b.FnParam(E.InjectMethodVars.notFoundResult.name,b.DYNAMIC_TYPE)],v(t.injectorGetMethod.finish(),E.InjectMethodVars.notFoundResult),b.DYNAMIC_TYPE),new b.ClassMethod("detectChangesInternal",[new b.FnParam(E.DetectChangesVars.throwOnChange.name,b.BOOL_TYPE)],d(t)),new b.ClassMethod("dirtyParentQueriesInternal",[],t.dirtyParentQueriesMethod.finish()),new b.ClassMethod("destroyInternal",[],t.destroyMethod.finish())].concat(t.eventHandlerMethods),a=new b.ClassStmt(t.className,b.importExpr(P.Identifiers.AppView,[y(t)]),t.fields,t.getters,o,s.filter(function(t){return t.body.length>0}));return a}function h(t,e,n){var r,i=[new b.FnParam(E.ViewConstructorVars.viewUtils.name,b.importType(P.Identifiers.ViewUtils)),new b.FnParam(E.ViewConstructorVars.parentInjector.name,b.importType(P.Identifiers.Injector)),new b.FnParam(E.ViewConstructorVars.declarationEl.name,b.importType(P.Identifiers.AppElement))],o=[];return r=t.component.template.templateUrl==t.component.type.moduleUrl?t.component.type.moduleUrl+" class "+t.component.type.name+" - inline template":t.component.template.templateUrl,0===t.viewIndex&&(o=[new b.IfStmt(n.identical(b.NULL_EXPR),[n.set(E.ViewConstructorVars.viewUtils.callMethod("createRenderComponentType",[b.literal(r),b.literal(t.component.template.ngContentSelectors.length),E.ViewEncapsulationEnum.fromValue(t.component.template.encapsulation),t.styles])).toStmt()])]), +b.fn(i,o.concat([new b.ReturnStatement(b.variable(e.name).instantiate(e.constructorMethod.params.map(function(t){return b.variable(t.name)})))]),b.importType(P.Identifiers.AppView,[y(t)])).toDeclStmt(t.viewFactory.name,[b.StmtModifier.Final])}function f(t){var e=b.NULL_EXPR,n=[];t.viewType===T.ViewType.COMPONENT&&(e=E.ViewProperties.renderer.callMethod("createViewRoot",[b.THIS_EXPR.prop("declarationAppElement").prop("nativeElement")]),n=[D.set(e).toDeclStmt(b.importType(t.genConfig.renderTypes.renderNode),[b.StmtModifier.Final])]);var r;return r=t.viewType===T.ViewType.HOST?t.nodes[0].appElement:b.NULL_EXPR,n.concat(t.createMethod.finish()).concat([b.THIS_EXPR.callMethod("init",[O.createFlatArray(t.rootNodesOrAppElements),b.literalArr(t.nodes.map(function(t){return t.renderNode})),b.literalArr(t.disposables),b.literalArr(t.subscriptions)]).toStmt(),new b.ReturnStatement(r)])}function d(t){var e=[];if(t.detectChangesInInputsMethod.isEmpty()&&t.updateContentQueriesMethod.isEmpty()&&t.afterContentLifecycleCallbacksMethod.isEmpty()&&t.detectChangesRenderPropertiesMethod.isEmpty()&&t.updateViewQueriesMethod.isEmpty()&&t.afterViewLifecycleCallbacksMethod.isEmpty())return e;_.ListWrapper.addAll(e,t.detectChangesInInputsMethod.finish()),e.push(b.THIS_EXPR.callMethod("detectContentChildrenChanges",[E.DetectChangesVars.throwOnChange]).toStmt());var n=t.updateContentQueriesMethod.finish().concat(t.afterContentLifecycleCallbacksMethod.finish());n.length>0&&e.push(new b.IfStmt(b.not(E.DetectChangesVars.throwOnChange),n)),_.ListWrapper.addAll(e,t.detectChangesRenderPropertiesMethod.finish()),e.push(b.THIS_EXPR.callMethod("detectViewChildrenChanges",[E.DetectChangesVars.throwOnChange]).toStmt());var r=t.updateViewQueriesMethod.finish().concat(t.afterViewLifecycleCallbacksMethod.finish());r.length>0&&e.push(new b.IfStmt(b.not(E.DetectChangesVars.throwOnChange),r));var i=[],o=b.findReadVarNames(e);return _.SetWrapper.has(o,E.DetectChangesVars.changed.name)&&i.push(E.DetectChangesVars.changed.set(b.literal(!0)).toDeclStmt(b.BOOL_TYPE)),_.SetWrapper.has(o,E.DetectChangesVars.changes.name)&&i.push(E.DetectChangesVars.changes.set(b.NULL_EXPR).toDeclStmt(new b.MapType(b.importType(P.Identifiers.SimpleChange)))),_.SetWrapper.has(o,E.DetectChangesVars.valUnwrapper.name)&&i.push(E.DetectChangesVars.valUnwrapper.set(b.importExpr(P.Identifiers.ValueUnwrapper).instantiate([])).toDeclStmt(null,[b.StmtModifier.Final])),i.concat(e)}function v(t,e){return t.length>0?t.concat([new b.ReturnStatement(e)]):t}function y(t){var e=t.component.type;return e.isHost?b.DYNAMIC_TYPE:b.importType(e)}function m(t){var e;return e=t.viewType===T.ViewType.COMPONENT?w.isDefaultChangeDetectionStrategy(t.component.changeDetection)?w.ChangeDetectionStrategy.CheckAlways:w.ChangeDetectionStrategy.CheckOnce:w.ChangeDetectionStrategy.CheckAlways}var g=n(5),_=n(15),b=n(164),P=n(158),E=n(170),w=n(28),C=n(174),R=n(169),S=n(139),O=n(171),T=n(68),x=n(36),A=n(155),I=n(177),M="$implicit",k="class",N="style",D=b.variable("parentRenderNode"),V=b.variable("rootSelector"),j=function(){function t(t,e){this.comp=t,this.factoryPlaceholder=e}return t}();e.ViewCompileDependency=j,e.buildView=r;var L=function(){function t(t,e,n){this.view=t,this.targetDependencies=e,this.targetStatements=n,this.nestedViewCount=0}return t.prototype._isRootNode=function(t){return t.view!==this.view},t.prototype._addRootNodeAndProject=function(t,e,n){var r=t instanceof R.CompileElement&&t.hasViewContainer?t.appElement:null;this._isRootNode(n)?this.view.viewType!==T.ViewType.COMPONENT&&this.view.rootNodesOrAppElements.push(g.isPresent(r)?r:t.renderNode):g.isPresent(n.component)&&g.isPresent(e)&&n.addContentNode(e,g.isPresent(r)?r:t.renderNode)},t.prototype._getParentRenderNode=function(t){return this._isRootNode(t)?this.view.viewType===T.ViewType.COMPONENT?D:b.NULL_EXPR:g.isPresent(t.component)&&t.component.template.encapsulation!==x.ViewEncapsulation.Native?b.NULL_EXPR:t.renderNode},t.prototype.visitBoundText=function(t,e){return this._visitText(t,"",t.ngContentIndex,e)},t.prototype.visitText=function(t,e){return this._visitText(t,t.value,t.ngContentIndex,e)},t.prototype._visitText=function(t,e,n,r){var i="_text_"+this.view.nodes.length;this.view.fields.push(new b.ClassField(i,b.importType(this.view.genConfig.renderTypes.renderText),[b.StmtModifier.Private]));var o=b.THIS_EXPR.prop(i),s=new R.CompileNode(r,this.view,this.view.nodes.length,o,t),a=b.THIS_EXPR.prop(i).set(E.ViewProperties.renderer.callMethod("createText",[this._getParentRenderNode(r),b.literal(e),this.view.createMethod.resetDebugInfoExpr(this.view.nodes.length,t)])).toStmt();return this.view.nodes.push(s),this.view.createMethod.addStmt(a),this._addRootNodeAndProject(s,n,r),o},t.prototype.visitNgContent=function(t,e){this.view.createMethod.resetDebugInfo(null,t);var n=this._getParentRenderNode(e),r=E.ViewProperties.projectableNodes.key(b.literal(t.index),new b.ArrayType(b.importType(this.view.genConfig.renderTypes.renderNode)));return n!==b.NULL_EXPR?this.view.createMethod.addStmt(E.ViewProperties.renderer.callMethod("projectNodes",[n,b.importExpr(P.Identifiers.flattenNestedViewRenderNodes).callFn([r])]).toStmt()):this._isRootNode(e)?this.view.viewType!==T.ViewType.COMPONENT&&this.view.rootNodesOrAppElements.push(r):g.isPresent(e.component)&&g.isPresent(t.ngContentIndex)&&e.addContentNode(t.ngContentIndex,r),null},t.prototype.visitElement=function(t,e){var n,r=this.view.nodes.length,a=this.view.createMethod.resetDebugInfoExpr(r,t);n=0===r&&this.view.viewType===T.ViewType.HOST?b.THIS_EXPR.callMethod("selectOrCreateHostElement",[b.literal(t.name),V,a]):E.ViewProperties.renderer.callMethod("createElement",[this._getParentRenderNode(e),b.literal(t.name),a]);var u="_el_"+r;this.view.fields.push(new b.ClassField(u,b.importType(this.view.genConfig.renderTypes.renderElement),[b.StmtModifier.Private])),this.view.createMethod.addStmt(b.THIS_EXPR.prop(u).set(n).toStmt());for(var c=b.THIS_EXPR.prop(u),p=t.getComponent(),l=t.directives.map(function(t){return t.directive}),h=s(t.exportAsVars,t.directives,this.view.viewType),f=o(t.attrs),d=i(f,l),v=0;v0?t.value:M,t.name]}),a=t.directives.map(function(t){return t.directive}),u=new R.CompileElement(e,this.view,n,o,t,null,a,t.providers,t.hasViewContainer,!0,{});this.view.nodes.push(u),this.nestedViewCount++;var c=new C.CompileView(this.view.component,this.view.genConfig,this.view.pipeMetas,b.NULL_EXPR,this.view.viewIndex+this.nestedViewCount,u,s);return this.nestedViewCount+=r(c,t.children,this.targetDependencies,this.targetStatements),u.beforeChildren(),this._addRootNodeAndProject(u,t.ngContentIndex,e),u.afterChildren(0),null},t.prototype.visitAttr=function(t,e){return null},t.prototype.visitDirective=function(t,e){return null},t.prototype.visitEvent=function(t,e){return null},t.prototype.visitVariable=function(t,e){return null},t.prototype.visitDirectiveProperty=function(t,e){return null},t.prototype.visitElementProperty=function(t,e){return null},t}()},function(t,e,n){"use strict";function r(t,e){var n=new c(t);o.templateVisitAll(n,e),t.pipes.forEach(function(t){u.bindPipeDestroyLifecycleCallbacks(t.meta,t.instance,t.view)})}var i=n(15),o=n(139),s=n(178),a=n(181),u=n(182);e.bindView=r;var c=function(){function t(t){this.view=t,this._nodeIndex=0}return t.prototype.visitBoundText=function(t,e){var n=this.view.nodes[this._nodeIndex++];return s.bindRenderText(t,n,this.view),null},t.prototype.visitText=function(t,e){return this._nodeIndex++,null},t.prototype.visitNgContent=function(t,e){return null},t.prototype.visitElement=function(t,e){var n=this.view.nodes[this._nodeIndex++],r=a.collectEventListeners(t.outputs,t.directives,n);return s.bindRenderInputs(t.inputs,n),a.bindRenderOutputs(r),i.ListWrapper.forEachWithIndex(t.directives,function(t,e){var i=n.directiveInstances[e];s.bindDirectiveInputs(t,i,n),u.bindDirectiveDetectChangesLifecycleCallbacks(t,i,n),s.bindDirectiveHostProps(t,i,n),a.bindDirectiveOutputs(t,i,r)}),o.templateVisitAll(this,t.children,n),i.ListWrapper.forEachWithIndex(t.directives,function(t,e){var r=n.directiveInstances[e];u.bindDirectiveAfterContentLifecycleCallbacks(t.directive,r,n),u.bindDirectiveAfterViewLifecycleCallbacks(t.directive,r,n),u.bindDirectiveDestroyLifecycleCallbacks(t.directive,r,n)}),null},t.prototype.visitEmbeddedTemplate=function(t,e){var n=this.view.nodes[this._nodeIndex++],r=a.collectEventListeners(t.outputs,t.directives,n);return i.ListWrapper.forEachWithIndex(t.directives,function(t,e){var i=n.directiveInstances[e];s.bindDirectiveInputs(t,i,n),u.bindDirectiveDetectChangesLifecycleCallbacks(t,i,n),a.bindDirectiveOutputs(t,i,r),u.bindDirectiveAfterContentLifecycleCallbacks(t.directive,i,n),u.bindDirectiveAfterViewLifecycleCallbacks(t.directive,i,n),u.bindDirectiveDestroyLifecycleCallbacks(t.directive,i,n)}),null},t.prototype.visitAttr=function(t,e){return null},t.prototype.visitDirective=function(t,e){return null},t.prototype.visitEvent=function(t,e){return null},t.prototype.visitVariable=function(t,e){return null},t.prototype.visitDirectiveProperty=function(t,e){return null},t.prototype.visitElementProperty=function(t,e){return null},t}()},function(t,e,n){"use strict";function r(t){return h.THIS_EXPR.prop("_expr_"+t)}function i(t){return h.variable("currVal_"+t)}function o(t,e,n,r,i,o,s){var a=b.convertCdExpressionToIr(t,i,r,d.DetectChangesVars.valUnwrapper);if(!y.isBlank(a.expression)){if(t.fields.push(new h.ClassField(n.name,null,[h.StmtModifier.Private])),t.createMethod.addStmt(h.THIS_EXPR.prop(n.name).set(h.importExpr(f.Identifiers.uninitialized)).toStmt()),a.needsValueUnwrapper){var u=d.DetectChangesVars.valUnwrapper.callMethod("reset",[]).toStmt();s.addStmt(u)}s.addStmt(e.set(a.expression).toDeclStmt(null,[h.StmtModifier.Final]));var c=h.importExpr(f.Identifiers.checkBinding).callFn([d.DetectChangesVars.throwOnChange,n,e]);a.needsValueUnwrapper&&(c=d.DetectChangesVars.valUnwrapper.prop("hasWrappedValue").or(c)),s.addStmt(new h.IfStmt(c,o.concat([h.THIS_EXPR.prop(n.name).set(e).toStmt()])))}}function s(t,e,n){var s=n.bindings.length;n.bindings.push(new P.CompileBinding(e,t));var a=i(s),u=r(s);n.detectChangesRenderPropertiesMethod.resetDebugInfo(e.nodeIndex,t),o(n,a,u,t.value,h.THIS_EXPR.prop("context"),[h.THIS_EXPR.prop("renderer").callMethod("setText",[e.renderNode,a]).toStmt()],n.detectChangesRenderPropertiesMethod)}function a(t,e,n){var s=n.view,a=n.renderNode;t.forEach(function(t){var u=s.bindings.length;s.bindings.push(new P.CompileBinding(n,t)),s.detectChangesRenderPropertiesMethod.resetDebugInfo(n.nodeIndex,t);var c,p=r(u),f=i(u),d=f,m=[];switch(t.type){case v.PropertyBindingType.Property:c="setElementProperty",s.genConfig.logBindingUpdate&&m.push(l(a,t.name,f));break;case v.PropertyBindingType.Attribute:c="setElementAttribute",d=d.isBlank().conditional(h.NULL_EXPR,d.callMethod("toString",[]));break;case v.PropertyBindingType.Class:c="setElementClass";break;case v.PropertyBindingType.Style:c="setElementStyle";var g=d.callMethod("toString",[]);y.isPresent(t.unit)&&(g=g.plus(h.literal(t.unit))),d=d.isBlank().conditional(h.NULL_EXPR,g)}m.push(h.THIS_EXPR.prop("renderer").callMethod(c,[a,h.literal(t.name),d]).toStmt()),o(s,f,p,t.value,e,m,s.detectChangesRenderPropertiesMethod)})}function u(t,e){a(t,h.THIS_EXPR.prop("context"),e)}function c(t,e,n){a(t.hostProperties,e,n)}function p(t,e,n){if(0!==t.inputs.length){var s=n.view,a=s.detectChangesInInputsMethod;a.resetDebugInfo(n.nodeIndex,n.sourceAst);var u=t.directive.lifecycleHooks,c=-1!==u.indexOf(m.LifecycleHooks.OnChanges),p=t.directive.isComponent&&!g.isDefaultChangeDetectionStrategy(t.directive.changeDetection);c&&a.addStmt(d.DetectChangesVars.changes.set(h.NULL_EXPR).toStmt()),p&&a.addStmt(d.DetectChangesVars.changed.set(h.literal(!1)).toStmt()),t.inputs.forEach(function(t){var u=s.bindings.length;s.bindings.push(new P.CompileBinding(n,t)),a.resetDebugInfo(n.nodeIndex,t);var v=r(u),y=i(u),m=[e.prop(t.directiveName).set(y).toStmt()];c&&(m.push(new h.IfStmt(d.DetectChangesVars.changes.identical(h.NULL_EXPR),[d.DetectChangesVars.changes.set(h.literalMap([],new h.MapType(h.importType(f.Identifiers.SimpleChange)))).toStmt()])),m.push(d.DetectChangesVars.changes.key(h.literal(t.directiveName)).set(h.importExpr(f.Identifiers.SimpleChange).instantiate([v,y])).toStmt())),p&&m.push(d.DetectChangesVars.changed.set(h.literal(!0)).toStmt()),s.genConfig.logBindingUpdate&&m.push(l(n.renderNode,t.directiveName,y)),o(s,y,v,t.value,h.THIS_EXPR.prop("context"),m,a)}),p&&a.addStmt(new h.IfStmt(d.DetectChangesVars.changed,[n.appElement.prop("componentView").callMethod("markAsCheckOnce",[]).toStmt()]))}}function l(t,e,n){return h.THIS_EXPR.prop("renderer").callMethod("setBindingDebugInfo",[t,h.literal("ng-reflect-"+_.camelCaseToDashCase(e)),n.isBlank().conditional(h.NULL_EXPR,n.callMethod("toString",[]))]).toStmt()}var h=n(164),f=n(158),d=n(170),v=n(139),y=n(5),m=n(156),g=n(33),_=n(153),b=n(179),P=n(180);e.bindRenderText=s,e.bindRenderInputs=u,e.bindDirectiveHostProps=c,e.bindDirectiveInputs=p},function(t,e,n){"use strict";function r(t,e,n,r){var i=new y(t,e,r),o=n.visit(i,v.Expression);return new d(o,i.needsValueUnwrapper)}function i(t,e,n){var r=new y(t,e,null),i=[];return u(n.visit(r,v.Statement),i),i}function o(t,e){if(t!==v.Statement)throw new l.BaseException("Expected a statement, but saw "+e)}function s(t,e){if(t!==v.Expression)throw new l.BaseException("Expected an expression, but saw "+e)}function a(t,e){return t===v.Statement?e.toStmt():e}function u(t,e){h.isArray(t)?t.forEach(function(t){return u(t,e)}):e.push(t)}var c=n(164),p=n(158),l=n(12),h=n(5),f=c.variable("#implicit"),d=function(){function t(t,e){this.expression=t,this.needsValueUnwrapper=e}return t}();e.ExpressionWithWrappedValueInfo=d,e.convertCdExpressionToIr=r,e.convertCdStatementToIr=i;var v;!function(t){t[t.Statement=0]="Statement",t[t.Expression=1]="Expression"}(v||(v={}));var y=function(){function t(t,e,n){this._nameResolver=t,this._implicitReceiver=e,this._valueUnwrapper=n,this.needsValueUnwrapper=!1}return t.prototype.visitBinary=function(t,e){var n;switch(t.operation){case"+":n=c.BinaryOperator.Plus;break;case"-":n=c.BinaryOperator.Minus;break;case"*":n=c.BinaryOperator.Multiply;break;case"/":n=c.BinaryOperator.Divide;break;case"%":n=c.BinaryOperator.Modulo;break;case"&&":n=c.BinaryOperator.And;break;case"||":n=c.BinaryOperator.Or;break;case"==":n=c.BinaryOperator.Equals;break;case"!=":n=c.BinaryOperator.NotEquals;break;case"===":n=c.BinaryOperator.Identical;break;case"!==":n=c.BinaryOperator.NotIdentical;break;case"<":n=c.BinaryOperator.Lower;break;case">":n=c.BinaryOperator.Bigger;break;case"<=":n=c.BinaryOperator.LowerEquals;break;case">=":n=c.BinaryOperator.BiggerEquals;break;default:throw new l.BaseException("Unsupported operation "+t.operation)}return a(e,new c.BinaryOperatorExpr(n,t.left.visit(this,v.Expression),t.right.visit(this,v.Expression)))},t.prototype.visitChain=function(t,e){return o(e,t),this.visitAll(t.expressions,e)},t.prototype.visitConditional=function(t,e){var n=t.condition.visit(this,v.Expression);return a(e,n.conditional(t.trueExp.visit(this,v.Expression),t.falseExp.visit(this,v.Expression)))},t.prototype.visitPipe=function(t,e){var n=t.exp.visit(this,v.Expression),r=this.visitAll(t.args,v.Expression),i=this._nameResolver.callPipe(t.name,n,r);return this.needsValueUnwrapper=!0,a(e,this._valueUnwrapper.callMethod("unwrap",[i]))},t.prototype.visitFunctionCall=function(t,e){return a(e,t.target.visit(this,v.Expression).callFn(this.visitAll(t.args,v.Expression)))},t.prototype.visitImplicitReceiver=function(t,e){return s(e,t),f},t.prototype.visitInterpolation=function(t,e){s(e,t);for(var n=[c.literal(t.expressions.length)],r=0;r=0){var a=i[o],c=s(a),p=l.variable("pd_"+this._actionResultExprs.length);this._actionResultExprs.push(p),u.isPresent(c)&&(i[o]=p.set(c.cast(l.DYNAMIC_TYPE).notIdentical(l.literal(!1))).toDeclStmt(null,[l.StmtModifier.Final]))}this._method.addStmts(i)},t.prototype.finishMethod=function(){var t=this._hasComponentHostListener?this.compileElement.appElement.prop("componentView"):l.THIS_EXPR,e=l.literal(!0);this._actionResultExprs.forEach(function(t){e=e.and(t)});var n=[t.callMethod("markPathToRootAsCheckOnce",[]).toStmt()].concat(this._method.finish()).concat([new l.ReturnStatement(e)]);this.compileElement.view.eventHandlerMethods.push(new l.ClassMethod(this._methodName,[this._eventParam],n,l.BOOL_TYPE,[l.StmtModifier.Private]))},t.prototype.listenToRenderer=function(){var t,e=l.THIS_EXPR.callMethod("eventHandler",[l.fn([this._eventParam],[new l.ReturnStatement(l.THIS_EXPR.callMethod(this._methodName,[p.EventHandlerVars.event]))])]);t=u.isPresent(this.eventTarget)?p.ViewProperties.renderer.callMethod("listenGlobal",[l.literal(this.eventTarget),l.literal(this.eventName),e]):p.ViewProperties.renderer.callMethod("listen",[this.compileElement.renderNode,l.literal(this.eventName),e]);var n=l.variable("disposable_"+this.compileElement.view.disposables.length);this.compileElement.view.disposables.push(n),this.compileElement.view.createMethod.addStmt(n.set(t).toDeclStmt(l.FUNCTION_TYPE,[l.StmtModifier.Private]))},t.prototype.listenToDirective=function(t,e){var n=l.variable("subscription_"+this.compileElement.view.subscriptions.length);this.compileElement.view.subscriptions.push(n);var r=l.THIS_EXPR.callMethod("eventHandler",[l.fn([this._eventParam],[l.THIS_EXPR.callMethod(this._methodName,[p.EventHandlerVars.event]).toStmt()])]);this.compileElement.view.createMethod.addStmt(n.set(t.prop(e).callMethod(l.BuiltinMethod.SubscribeObservable,[r])).toDeclStmt(null,[l.StmtModifier.Final]))},t}();e.CompileEventListener=v,e.collectEventListeners=r,e.bindDirectiveOutputs=i,e.bindRenderOutputs=o},function(t,e,n){"use strict";function r(t,e,n){var r=n.view,i=r.detectChangesInInputsMethod,o=t.directive.lifecycleHooks;-1!==o.indexOf(p.LifecycleHooks.OnChanges)&&t.inputs.length>0&&i.addStmt(new u.IfStmt(c.DetectChangesVars.changes.notIdentical(u.NULL_EXPR),[e.callMethod("ngOnChanges",[c.DetectChangesVars.changes]).toStmt()])),-1!==o.indexOf(p.LifecycleHooks.OnInit)&&i.addStmt(new u.IfStmt(l.and(h),[e.callMethod("ngOnInit",[]).toStmt()])),-1!==o.indexOf(p.LifecycleHooks.DoCheck)&&i.addStmt(new u.IfStmt(h,[e.callMethod("ngDoCheck",[]).toStmt()]))}function i(t,e,n){var r=n.view,i=t.lifecycleHooks,o=r.afterContentLifecycleCallbacksMethod;o.resetDebugInfo(n.nodeIndex,n.sourceAst),-1!==i.indexOf(p.LifecycleHooks.AfterContentInit)&&o.addStmt(new u.IfStmt(l,[e.callMethod("ngAfterContentInit",[]).toStmt()])),-1!==i.indexOf(p.LifecycleHooks.AfterContentChecked)&&o.addStmt(e.callMethod("ngAfterContentChecked",[]).toStmt())}function o(t,e,n){var r=n.view,i=t.lifecycleHooks,o=r.afterViewLifecycleCallbacksMethod;o.resetDebugInfo(n.nodeIndex,n.sourceAst),-1!==i.indexOf(p.LifecycleHooks.AfterViewInit)&&o.addStmt(new u.IfStmt(l,[e.callMethod("ngAfterViewInit",[]).toStmt()])),-1!==i.indexOf(p.LifecycleHooks.AfterViewChecked)&&o.addStmt(e.callMethod("ngAfterViewChecked",[]).toStmt())}function s(t,e,n){var r=n.view.destroyMethod;r.resetDebugInfo(n.nodeIndex,n.sourceAst),-1!==t.lifecycleHooks.indexOf(p.LifecycleHooks.OnDestroy)&&r.addStmt(e.callMethod("ngOnDestroy",[]).toStmt())}function a(t,e,n){var r=n.destroyMethod;-1!==t.lifecycleHooks.indexOf(p.LifecycleHooks.OnDestroy)&&r.addStmt(e.callMethod("ngOnDestroy",[]).toStmt())}var u=n(164),c=n(170),p=n(156),l=u.THIS_EXPR.prop("cdState").identical(c.ChangeDetectorStateEnum.NeverChecked),h=u.not(c.DetectChangesVars.throwOnChange);e.bindDirectiveDetectChangesLifecycleCallbacks=r,e.bindDirectiveAfterContentLifecycleCallbacks=i,e.bindDirectiveAfterViewLifecycleCallbacks=o,e.bindDirectiveDestroyLifecycleCallbacks=s,e.bindPipeDestroyLifecycleCallbacks=a},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(155),s=n(5),a=n(12),u=n(40),c=n(184),p=n(157),l=n(152),h=n(6),f=n(36),d=n(145),v=n(144),y=n(151),m=function(){function t(t,e,n){this._xhr=t,this._urlResolver=e,this._htmlParser=n}return t.prototype.normalizeDirective=function(t){return t.isComponent?this.normalizeTemplate(t.type,t.template).then(function(e){return new o.CompileDirectiveMetadata({type:t.type,isComponent:t.isComponent,selector:t.selector,exportAs:t.exportAs,changeDetection:t.changeDetection,inputs:t.inputs,outputs:t.outputs,hostListeners:t.hostListeners,hostProperties:t.hostProperties,hostAttributes:t.hostAttributes,lifecycleHooks:t.lifecycleHooks,providers:t.providers,viewProviders:t.viewProviders,queries:t.queries,viewQueries:t.viewQueries,template:e})}):u.PromiseWrapper.resolve(t)},t.prototype.normalizeTemplate=function(t,e){var n=this;if(s.isPresent(e.template))return u.PromiseWrapper.resolve(this.normalizeLoadedTemplate(t,e,e.template,t.moduleUrl));if(s.isPresent(e.templateUrl)){var r=this._urlResolver.resolve(t.moduleUrl,e.templateUrl);return this._xhr.get(r).then(function(i){return n.normalizeLoadedTemplate(t,e,i,r)})}throw new a.BaseException("No template specified for component "+t.name)},t.prototype.normalizeLoadedTemplate=function(t,e,n,r){var i=this,s=this._htmlParser.parse(n,t.name);if(s.errors.length>0){var u=s.errors.join("\n");throw new a.BaseException("Template parse errors:\n"+u)}var c=new g;d.htmlVisitAll(c,s.rootNodes);var p=e.styles.concat(c.styles),h=c.styleUrls.filter(l.isStyleUrlResolvable).map(function(t){return i._urlResolver.resolve(r,t)}).concat(e.styleUrls.filter(l.isStyleUrlResolvable).map(function(e){return i._urlResolver.resolve(t.moduleUrl,e)})),v=p.map(function(t){var e=l.extractStyleUrls(i._urlResolver,r,t);return e.styleUrls.forEach(function(t){return h.push(t)}),e.style}),y=e.encapsulation;return y===f.ViewEncapsulation.Emulated&&0===v.length&&0===h.length&&(y=f.ViewEncapsulation.None),new o.CompileTemplateMetadata({encapsulation:y,template:n,templateUrl:r,styles:v,styleUrls:h,ngContentSelectors:c.ngContentSelectors})},t=r([h.Injectable(),i("design:paramtypes",[c.XHR,p.UrlResolver,v.HtmlParser])],t)}();e.DirectiveNormalizer=m;var g=function(){function t(){this.ngContentSelectors=[],this.styles=[],this.styleUrls=[],this.ngNonBindableStackCount=0}return t.prototype.visitElement=function(t,e){var n=y.preparseElement(t);switch(n.type){case y.PreparsedElementType.NG_CONTENT:0===this.ngNonBindableStackCount&&this.ngContentSelectors.push(n.selectAttr);break;case y.PreparsedElementType.STYLE:var r="";t.children.forEach(function(t){t instanceof d.HtmlTextAst&&(r+=t.value)}),this.styles.push(r);break;case y.PreparsedElementType.STYLESHEET:this.styleUrls.push(n.hrefAttr)}return n.nonBindable&&this.ngNonBindableStackCount++,d.htmlVisitAll(this,t.children),n.nonBindable&&this.ngNonBindableStackCount--,null},t.prototype.visitComment=function(t,e){return null},t.prototype.visitAttr=function(t,e){return null},t.prototype.visitText=function(t,e){return null},t.prototype.visitExpansion=function(t,e){return null},t.prototype.visitExpansionCase=function(t,e){return null},t}()},function(t,e){"use strict";var n=function(){function t(){}return t.prototype.get=function(t){return null},t}();e.XHR=n},function(t,e,n){"use strict";function r(t,e){var n=[];return h.isPresent(e)&&o(e,n),h.isPresent(t.directives)&&o(t.directives,n),n}function i(t,e){var n=[];return h.isPresent(e)&&o(e,n),h.isPresent(t.pipes)&&o(t.pipes,n),n}function o(t,e){for(var n=0;n0?r:"package:"+r+O.MODULE_SUFFIX}return t.importUri(e)}var u=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},c=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},p=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},l=n(6),h=n(5),f=n(15),d=n(12),v=n(23),y=n(155),m=n(26),g=n(4),_=n(186),b=n(187),P=n(188),E=n(189),w=n(156),C=n(18),R=n(6),S=n(84),O=n(153),T=n(190),x=n(157),A=n(24),I=n(17),M=n(7),k=n(4),N=n(20),D=function(){function t(t,e,n,r,i,o){this._directiveResolver=t,this._pipeResolver=e,this._viewResolver=n,this._platformDirectives=r,this._platformPipes=i,this._directiveCache=new Map,this._pipeCache=new Map,this._anonymousTypes=new Map,this._anonymousTypeIndex=0,h.isPresent(o)?this._reflector=o:this._reflector=C.reflector}return t.prototype.sanitizeTokenName=function(t){var e=h.stringify(t);if(e.indexOf("(")>=0){var n=this._anonymousTypes.get(t);h.isBlank(n)&&(this._anonymousTypes.set(t,this._anonymousTypeIndex++),n=this._anonymousTypes.get(t)),e="anonymous_token_"+n+"_"}return O.sanitizeIdentifier(e)},t.prototype.getDirectiveMetadata=function(t){var e=this._directiveCache.get(t);if(h.isBlank(e)){var n=this._directiveResolver.resolve(t),r=null,i=null,o=null,s=[];if(n instanceof m.ComponentMetadata){T.assertArrayOfStrings("styles",n.styles);var u=n;r=a(this._reflector,t,u);var c=this._viewResolver.resolve(t);T.assertArrayOfStrings("styles",c.styles),i=new y.CompileTemplateMetadata({encapsulation:c.encapsulation,template:c.template,templateUrl:c.templateUrl,styles:c.styles,styleUrls:c.styleUrls}),o=u.changeDetection,h.isPresent(n.viewProviders)&&(s=this.getProvidersMetadata(n.viewProviders))}var p=[];h.isPresent(n.providers)&&(p=this.getProvidersMetadata(n.providers));var l=[],f=[];h.isPresent(n.queries)&&(l=this.getQueriesMetadata(n.queries,!1), +f=this.getQueriesMetadata(n.queries,!0)),e=y.CompileDirectiveMetadata.create({selector:n.selector,exportAs:n.exportAs,isComponent:h.isPresent(i),type:this.getTypeMetadata(t,r),template:i,changeDetection:o,inputs:n.inputs,outputs:n.outputs,host:n.host,lifecycleHooks:w.LIFECYCLE_HOOKS_VALUES.filter(function(e){return E.hasLifecycleHook(e,t)}),providers:p,viewProviders:s,queries:l,viewQueries:f}),this._directiveCache.set(t,e)}return e},t.prototype.getTypeMetadata=function(t,e){return new y.CompileTypeMetadata({name:this.sanitizeTokenName(t),moduleUrl:e,runtime:t,diDeps:this.getDependenciesMetadata(t,null)})},t.prototype.getFactoryMetadata=function(t,e){return new y.CompileFactoryMetadata({name:this.sanitizeTokenName(t),moduleUrl:e,runtime:t,diDeps:this.getDependenciesMetadata(t,null)})},t.prototype.getPipeMetadata=function(t){var e=this._pipeCache.get(t);if(h.isBlank(e)){var n=this._pipeResolver.resolve(t),r=this._reflector.importUri(t);e=new y.CompilePipeMetadata({type:this.getTypeMetadata(t,r),name:n.name,pure:n.pure,lifecycleHooks:w.LIFECYCLE_HOOKS_VALUES.filter(function(e){return E.hasLifecycleHook(e,t)})}),this._pipeCache.set(t,e)}return e},t.prototype.getViewDirectivesMetadata=function(t){for(var e=this,n=this._viewResolver.resolve(t),i=r(n,this._platformDirectives),o=0;oo?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(6),a=n(5),u=n(12),c=n(15),p=n(3),l=n(18),h=n(20),f=function(){function t(t){a.isPresent(t)?this._reflector=t:this._reflector=l.reflector}return t.prototype.resolve=function(t){var e=this._reflector.annotations(s.resolveForwardRef(t));if(a.isPresent(e)){var n=e.find(r);if(a.isPresent(n)){var i=this._reflector.propMetadata(t);return this._mergeWithPropertyMetadata(n,i,t)}}throw new u.BaseException("No Directive annotation found on "+a.stringify(t))},t.prototype._mergeWithPropertyMetadata=function(t,e,n){var r=[],i=[],o={},s={};return c.StringMapWrapper.forEach(e,function(t,e){t.forEach(function(t){if(t instanceof p.InputMetadata&&(a.isPresent(t.bindingPropertyName)?r.push(e+": "+t.bindingPropertyName):r.push(e)),t instanceof p.OutputMetadata&&(a.isPresent(t.bindingPropertyName)?i.push(e+": "+t.bindingPropertyName):i.push(e)),t instanceof p.HostBindingMetadata&&(a.isPresent(t.hostPropertyName)?o["["+t.hostPropertyName+"]"]=e:o["["+e+"]"]=e),t instanceof p.HostListenerMetadata){var n=a.isPresent(t.args)?t.args.join(", "):"";o["("+t.eventName+")"]=e+"("+n+")"}t instanceof p.ContentChildrenMetadata&&(s[e]=t),t instanceof p.ViewChildrenMetadata&&(s[e]=t),t instanceof p.ContentChildMetadata&&(s[e]=t),t instanceof p.ViewChildMetadata&&(s[e]=t)})}),this._merge(t,r,i,o,s,n)},t.prototype._merge=function(t,e,n,r,i,o){var s,l=a.isPresent(t.inputs)?c.ListWrapper.concat(t.inputs,e):e;a.isPresent(t.outputs)?(t.outputs.forEach(function(t){if(c.ListWrapper.contains(n,t))throw new u.BaseException("Output event '"+t+"' defined multiple times in '"+a.stringify(o)+"'")}),s=c.ListWrapper.concat(t.outputs,n)):s=n;var h=a.isPresent(t.host)?c.StringMapWrapper.merge(t.host,r):r,f=a.isPresent(t.queries)?c.StringMapWrapper.merge(t.queries,i):i;return t instanceof p.ComponentMetadata?new p.ComponentMetadata({selector:t.selector,inputs:l,outputs:s,host:h,exportAs:t.exportAs,moduleId:t.moduleId,queries:f,changeDetection:t.changeDetection,providers:t.providers,viewProviders:t.viewProviders}):new p.DirectiveMetadata({selector:t.selector,inputs:l,outputs:s,host:h,exportAs:t.exportAs,queries:f,providers:t.providers})},t=i([s.Injectable(),o("design:paramtypes",[h.ReflectorReader])],t)}();e.DirectiveResolver=f,e.CODEGEN_DIRECTIVE_RESOLVER=new f(l.reflector)},function(t,e,n){"use strict";function r(t){return t instanceof c.PipeMetadata}var i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(6),a=n(5),u=n(12),c=n(3),p=n(20),l=n(18),h=function(){function t(t){a.isPresent(t)?this._reflector=t:this._reflector=l.reflector}return t.prototype.resolve=function(t){var e=this._reflector.annotations(s.resolveForwardRef(t));if(a.isPresent(e)){var n=e.find(r);if(a.isPresent(n))return n}throw new u.BaseException("No Pipe decorator found on "+a.stringify(t))},t=i([s.Injectable(),o("design:paramtypes",[p.ReflectorReader])],t)}();e.PipeResolver=h,e.CODEGEN_PIPE_RESOLVER=new h(l.reflector)},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(6),s=n(36),a=n(26),u=n(5),c=n(12),p=n(15),l=n(20),h=n(18),f=function(){function t(t){this._cache=new p.Map,u.isPresent(t)?this._reflector=t:this._reflector=h.reflector}return t.prototype.resolve=function(t){var e=this._cache.get(t);return u.isBlank(e)&&(e=this._resolve(t),this._cache.set(t,e)),e},t.prototype._resolve=function(t){var e,n;if(this._reflector.annotations(t).forEach(function(t){t instanceof s.ViewMetadata&&(n=t),t instanceof a.ComponentMetadata&&(e=t)}),!u.isPresent(e)){if(u.isBlank(n))throw new c.BaseException("Could not compile '"+u.stringify(t)+"' because it is not a component.");return n}if(u.isBlank(e.template)&&u.isBlank(e.templateUrl)&&u.isBlank(n))throw new c.BaseException("Component '"+u.stringify(t)+"' must have either 'template' or 'templateUrl' set.");if(u.isPresent(e.template)&&u.isPresent(n))this._throwMixingViewAndComponent("template",t);else if(u.isPresent(e.templateUrl)&&u.isPresent(n))this._throwMixingViewAndComponent("templateUrl",t);else if(u.isPresent(e.directives)&&u.isPresent(n))this._throwMixingViewAndComponent("directives",t);else if(u.isPresent(e.pipes)&&u.isPresent(n))this._throwMixingViewAndComponent("pipes",t);else if(u.isPresent(e.encapsulation)&&u.isPresent(n))this._throwMixingViewAndComponent("encapsulation",t);else if(u.isPresent(e.styles)&&u.isPresent(n))this._throwMixingViewAndComponent("styles",t);else{if(!u.isPresent(e.styleUrls)||!u.isPresent(n))return u.isPresent(n)?n:new s.ViewMetadata({templateUrl:e.templateUrl,template:e.template,directives:e.directives,pipes:e.pipes,encapsulation:e.encapsulation,styles:e.styles,styleUrls:e.styleUrls});this._throwMixingViewAndComponent("styleUrls",t)}return null},t.prototype._throwMixingViewAndComponent=function(t,e){throw new c.BaseException("Component '"+u.stringify(e)+"' cannot have both '"+t+"' and '@View' set at the same time\"")},t=r([o.Injectable(),i("design:paramtypes",[l.ReflectorReader])],t)}();e.ViewResolver=f},function(t,e,n){"use strict";function r(t,e){if(!(e instanceof i.Type))return!1;var n=e.prototype;switch(t){case o.LifecycleHooks.AfterContentInit:return!!n.ngAfterContentInit;case o.LifecycleHooks.AfterContentChecked:return!!n.ngAfterContentChecked;case o.LifecycleHooks.AfterViewInit:return!!n.ngAfterViewInit;case o.LifecycleHooks.AfterViewChecked:return!!n.ngAfterViewChecked;case o.LifecycleHooks.OnChanges:return!!n.ngOnChanges;case o.LifecycleHooks.DoCheck:return!!n.ngDoCheck;case o.LifecycleHooks.OnDestroy:return!!n.ngOnDestroy;case o.LifecycleHooks.OnInit:return!!n.ngOnInit;default:return!1}}var i=n(5),o=n(156);e.hasLifecycleHook=r},function(t,e,n){"use strict";function r(t,e){if(i.assertionsEnabled()&&!i.isBlank(e)){if(!i.isArray(e))throw new o.BaseException("Expected '"+t+"' to be an array of strings.");for(var n=0;nn;n++)e+=" ";return e}var o=n(5),s=n(12),a=n(164),u=/'|\\|\n|\r|\$/g;e.CATCH_ERROR_VAR=a.variable("error"),e.CATCH_STACK_VAR=a.variable("stack");var c=function(){function t(){}return t}();e.OutputEmitter=c;var p=function(){function t(t){this.indent=t,this.parts=[]}return t}(),l=function(){function t(t,e){this._exportedVars=t,this._indent=e,this._classes=[],this._lines=[new p(e)]}return t.createRoot=function(e){return new t(e,0)},Object.defineProperty(t.prototype,"_currentLine",{get:function(){return this._lines[this._lines.length-1]},enumerable:!0,configurable:!0}),t.prototype.isExportedVar=function(t){return-1!==this._exportedVars.indexOf(t)},t.prototype.println=function(t){void 0===t&&(t=""),this.print(t,!0)},t.prototype.lineIsEmpty=function(){return 0===this._currentLine.parts.length},t.prototype.print=function(t,e){void 0===e&&(e=!1),t.length>0&&this._currentLine.parts.push(t),e&&this._lines.push(new p(this._indent))},t.prototype.removeEmptyLastLine=function(){this.lineIsEmpty()&&this._lines.pop()},t.prototype.incIndent=function(){this._indent++,this._currentLine.indent=this._indent},t.prototype.decIndent=function(){this._indent--,this._currentLine.indent=this._indent},t.prototype.pushClass=function(t){this._classes.push(t)},t.prototype.popClass=function(){return this._classes.pop()},Object.defineProperty(t.prototype,"currentClass",{get:function(){return this._classes.length>0?this._classes[this._classes.length-1]:null},enumerable:!0,configurable:!0}),t.prototype.toSource=function(){var t=this._lines;return 0===t[t.length-1].parts.length&&(t=t.slice(0,t.length-1)),t.map(function(t){return t.parts.length>0?i(t.indent)+t.parts.join(""):""}).join("\n")},t}();e.EmitterVisitorContext=l;var h=function(){function t(t){this._escapeDollarInStrings=t}return t.prototype.visitExpressionStmt=function(t,e){return t.expr.visitExpression(this,e),e.println(";"),null},t.prototype.visitReturnStmt=function(t,e){return e.print("return "),t.value.visitExpression(this,e),e.println(";"),null},t.prototype.visitIfStmt=function(t,e){e.print("if ("),t.condition.visitExpression(this,e),e.print(") {");var n=o.isPresent(t.falseCase)&&t.falseCase.length>0;return t.trueCase.length<=1&&!n?(e.print(" "),this.visitAllStatements(t.trueCase,e),e.removeEmptyLastLine(),e.print(" ")):(e.println(),e.incIndent(),this.visitAllStatements(t.trueCase,e),e.decIndent(),n&&(e.println("} else {"),e.incIndent(),this.visitAllStatements(t.falseCase,e),e.decIndent())),e.println("}"),null},t.prototype.visitThrowStmt=function(t,e){return e.print("throw "),t.error.visitExpression(this,e),e.println(";"),null},t.prototype.visitCommentStmt=function(t,e){var n=t.comment.split("\n");return n.forEach(function(t){e.println("// "+t)}),null},t.prototype.visitWriteVarExpr=function(t,e){var n=e.lineIsEmpty();return n||e.print("("),e.print(t.name+" = "),t.value.visitExpression(this,e),n||e.print(")"),null},t.prototype.visitWriteKeyExpr=function(t,e){var n=e.lineIsEmpty();return n||e.print("("),t.receiver.visitExpression(this,e),e.print("["),t.index.visitExpression(this,e),e.print("] = "),t.value.visitExpression(this,e),n||e.print(")"),null},t.prototype.visitWritePropExpr=function(t,e){var n=e.lineIsEmpty();return n||e.print("("),t.receiver.visitExpression(this,e),e.print("."+t.name+" = "),t.value.visitExpression(this,e),n||e.print(")"),null},t.prototype.visitInvokeMethodExpr=function(t,e){t.receiver.visitExpression(this,e);var n=t.name;return o.isPresent(t.builtin)&&(n=this.getBuiltinMethodName(t.builtin),o.isBlank(n))?null:(e.print("."+n+"("),this.visitAllExpressions(t.args,e,","),e.print(")"),null)},t.prototype.visitInvokeFunctionExpr=function(t,e){return t.fn.visitExpression(this,e),e.print("("),this.visitAllExpressions(t.args,e,","),e.print(")"),null},t.prototype.visitReadVarExpr=function(t,n){var r=t.name;if(o.isPresent(t.builtin))switch(t.builtin){case a.BuiltinVar.Super:r="super";break;case a.BuiltinVar.This:r="this";break;case a.BuiltinVar.CatchError:r=e.CATCH_ERROR_VAR.name;break;case a.BuiltinVar.CatchStack:r=e.CATCH_STACK_VAR.name;break;default:throw new s.BaseException("Unknown builtin variable "+t.builtin)}return n.print(r),null},t.prototype.visitInstantiateExpr=function(t,e){return e.print("new "),t.classExpr.visitExpression(this,e),e.print("("),this.visitAllExpressions(t.args,e,","),e.print(")"),null},t.prototype.visitLiteralExpr=function(t,e){var n=t.value;return o.isString(n)?e.print(r(n,this._escapeDollarInStrings)):o.isBlank(n)?e.print("null"):e.print(""+n),null},t.prototype.visitConditionalExpr=function(t,e){return t.condition.visitExpression(this,e),e.print("? "),t.trueCase.visitExpression(this,e),e.print(": "),t.falseCase.visitExpression(this,e),null},t.prototype.visitNotExpr=function(t,e){return e.print("!"),t.condition.visitExpression(this,e),null},t.prototype.visitBinaryOperatorExpr=function(t,e){var n;switch(t.operator){case a.BinaryOperator.Equals:n="==";break;case a.BinaryOperator.Identical:n="===";break;case a.BinaryOperator.NotEquals:n="!=";break;case a.BinaryOperator.NotIdentical:n="!==";break;case a.BinaryOperator.And:n="&&";break;case a.BinaryOperator.Or:n="||";break;case a.BinaryOperator.Plus:n="+";break;case a.BinaryOperator.Minus:n="-";break;case a.BinaryOperator.Divide:n="/";break;case a.BinaryOperator.Multiply:n="*";break;case a.BinaryOperator.Modulo:n="%";break;case a.BinaryOperator.Lower:n="<";break;case a.BinaryOperator.LowerEquals:n="<=";break;case a.BinaryOperator.Bigger:n=">";break;case a.BinaryOperator.BiggerEquals:n=">=";break;default:throw new s.BaseException("Unknown operator "+t.operator)}return e.print("("),t.lhs.visitExpression(this,e),e.print(" "+n+" "),t.rhs.visitExpression(this,e),e.print(")"),null},t.prototype.visitReadPropExpr=function(t,e){return t.receiver.visitExpression(this,e),e.print("."),e.print(t.name),null},t.prototype.visitReadKeyExpr=function(t,e){return t.receiver.visitExpression(this,e),e.print("["),t.index.visitExpression(this,e),e.print("]"),null},t.prototype.visitLiteralArrayExpr=function(t,e){var n=t.entries.length>1;return e.print("[",n),e.incIndent(),this.visitAllExpressions(t.entries,e,",",n),e.decIndent(),e.print("]",n),null},t.prototype.visitLiteralMapExpr=function(t,e){var n=this,i=t.entries.length>1;return e.print("{",i),e.incIndent(),this.visitAllObjects(function(t){e.print(r(t[0],n._escapeDollarInStrings)+": "),t[1].visitExpression(n,e)},t.entries,e,",",i),e.decIndent(),e.print("}",i),null},t.prototype.visitAllExpressions=function(t,e,n,r){var i=this;void 0===r&&(r=!1),this.visitAllObjects(function(t){return t.visitExpression(i,e)},t,e,n,r)},t.prototype.visitAllObjects=function(t,e,n,r,i){void 0===i&&(i=!1);for(var o=0;o0&&n.print(r,i),t(e[o]);i&&n.println()},t.prototype.visitAllStatements=function(t,e){var n=this;t.forEach(function(t){return t.visitStatement(n,e)})},t}();e.AbstractEmitterVisitor=h,e.escapeSingleQuoteString=r},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=n(5),o=n(12),s=n(164),a=n(192),u=function(t){function e(){t.call(this,!1)}return r(e,t),e.prototype.visitDeclareClassStmt=function(t,e){var n=this;return e.pushClass(t),this._visitClassConstructor(t,e),i.isPresent(t.parent)&&(e.print(t.name+".prototype = Object.create("),t.parent.visitExpression(this,e),e.println(".prototype);")),t.getters.forEach(function(r){return n._visitClassGetter(t,r,e)}),t.methods.forEach(function(r){return n._visitClassMethod(t,r,e)}),e.popClass(),null},e.prototype._visitClassConstructor=function(t,e){e.print("function "+t.name+"("),i.isPresent(t.constructorMethod)&&this._visitParams(t.constructorMethod.params,e),e.println(") {"),e.incIndent(),i.isPresent(t.constructorMethod)&&t.constructorMethod.body.length>0&&(e.println("var self = this;"),this.visitAllStatements(t.constructorMethod.body,e)),e.decIndent(),e.println("}")},e.prototype._visitClassGetter=function(t,e,n){n.println("Object.defineProperty("+t.name+".prototype, '"+e.name+"', { get: function() {"),n.incIndent(),e.body.length>0&&(n.println("var self = this;"),this.visitAllStatements(e.body,n)),n.decIndent(),n.println("}});")},e.prototype._visitClassMethod=function(t,e,n){n.print(t.name+".prototype."+e.name+" = function("),this._visitParams(e.params,n),n.println(") {"),n.incIndent(),e.body.length>0&&(n.println("var self = this;"),this.visitAllStatements(e.body,n)),n.decIndent(),n.println("};")},e.prototype.visitReadVarExpr=function(e,n){if(e.builtin===s.BuiltinVar.This)n.print("self");else{if(e.builtin===s.BuiltinVar.Super)throw new o.BaseException("'super' needs to be handled at a parent ast node, not at the variable level!");t.prototype.visitReadVarExpr.call(this,e,n)}return null},e.prototype.visitDeclareVarStmt=function(t,e){return e.print("var "+t.name+" = "),t.value.visitExpression(this,e),e.println(";"),null},e.prototype.visitCastExpr=function(t,e){return t.value.visitExpression(this,e),null},e.prototype.visitInvokeFunctionExpr=function(e,n){var r=e.fn;return r instanceof s.ReadVarExpr&&r.builtin===s.BuiltinVar.Super?(n.currentClass.parent.visitExpression(this,n),n.print(".call(this"),e.args.length>0&&(n.print(", "),this.visitAllExpressions(e.args,n,",")),n.print(")")):t.prototype.visitInvokeFunctionExpr.call(this,e,n),null},e.prototype.visitFunctionExpr=function(t,e){return e.print("function("),this._visitParams(t.params,e),e.println(") {"),e.incIndent(),this.visitAllStatements(t.statements,e),e.decIndent(),e.print("}"),null},e.prototype.visitDeclareFunctionStmt=function(t,e){return e.print("function "+t.name+"("),this._visitParams(t.params,e),e.println(") {"),e.incIndent(),this.visitAllStatements(t.statements,e),e.decIndent(),e.println("}"),null},e.prototype.visitTryCatchStmt=function(t,e){e.println("try {"),e.incIndent(),this.visitAllStatements(t.bodyStmts,e),e.decIndent(),e.println("} catch ("+a.CATCH_ERROR_VAR.name+") {"),e.incIndent();var n=[a.CATCH_STACK_VAR.set(a.CATCH_ERROR_VAR.prop("stack")).toDeclStmt(null,[s.StmtModifier.Final])].concat(t.catchStmts);return this.visitAllStatements(n,e),e.decIndent(),e.println("}"),null},e.prototype._visitParams=function(t,e){this.visitAllObjects(function(t){return e.print(t.name)},t,e,",")},e.prototype.getBuiltinMethodName=function(t){var e;switch(t){case s.BuiltinMethod.ConcatArray:e="concat";break;case s.BuiltinMethod.SubscribeObservable:e="subscribe";break;case s.BuiltinMethod.bind:e="bind";break;default:throw new o.BaseException("Unknown builtin method: "+t)}return e},e}(a.AbstractEmitterVisitor);e.AbstractJsEmitterVisitor=u},function(t,e,n){"use strict";function r(t,e,n){var r=t.concat([new c.ReturnStatement(c.variable(e))]),i=new y(null,null,null,null,new Map,new Map,new Map,new Map,n),o=new _,s=o.visitAllStatements(r,i);return a.isPresent(s)?s.value:null}function i(t){return a.IS_DART?t instanceof v:a.isPresent(t)&&a.isPresent(t.props)&&a.isPresent(t.getters)&&a.isPresent(t.methods)}function o(t,e,n,r,i){for(var o=r.createChildWihtLocalVars(),s=0;si();case c.BinaryOperator.BiggerEquals:return r()>=i();default:throw new l.BaseException("Unknown operator "+t.operator)}},t.prototype.visitReadPropExpr=function(t,e){var n,r=t.receiver.visitExpression(this,e);if(i(r)){var o=r;n=o.props.has(t.name)?o.props.get(t.name):o.getters.has(t.name)?o.getters.get(t.name)():o.methods.has(t.name)?o.methods.get(t.name):p.reflector.getter(t.name)(r)}else n=p.reflector.getter(t.name)(r);return n},t.prototype.visitReadKeyExpr=function(t,e){var n=t.receiver.visitExpression(this,e),r=t.index.visitExpression(this,e);return n[r]},t.prototype.visitLiteralArrayExpr=function(t,e){return this.visitAllExpressions(t.entries,e)},t.prototype.visitLiteralMapExpr=function(t,e){var n=this,r={};return t.entries.forEach(function(t){return r[t[0]]=t[1].visitExpression(n,e)}),r},t.prototype.visitAllExpressions=function(t,e){var n=this;return t.map(function(t){return t.visitExpression(n,e)})},t.prototype.visitAllStatements=function(t,e){for(var n=0;n0?i(n[0]):null;a.isPresent(r)&&(e.print(": "),r.visitExpression(this,e),n=n.slice(1)),e.println(" {"),e.incIndent(),this.visitAllStatements(n,e),e.decIndent(),e.println("}")},e.prototype._visitClassMethod=function(t,e){a.isPresent(t.type)?t.type.visitType(this,e):e.print("void"),e.print(" "+t.name+"("),this._visitParams(t.params,e),e.println(") {"),e.incIndent(),this.visitAllStatements(t.body,e),e.decIndent(),e.println("}")},e.prototype.visitFunctionExpr=function(t,e){return e.print("("),this._visitParams(t.params,e),e.println(") {"),e.incIndent(),this.visitAllStatements(t.statements,e),e.decIndent(),e.print("}"),null},e.prototype.visitDeclareFunctionStmt=function(t,e){return a.isPresent(t.type)?t.type.visitType(this,e):e.print("void"),e.print(" "+t.name+"("),this._visitParams(t.params,e),e.println(") {"),e.incIndent(),this.visitAllStatements(t.statements,e),e.decIndent(),e.println("}"),null},e.prototype.getBuiltinMethodName=function(t){var e;switch(t){case c.BuiltinMethod.ConcatArray:e=".addAll";break;case c.BuiltinMethod.SubscribeObservable:e="listen";break;case c.BuiltinMethod.bind:e=null;break;default:throw new u.BaseException("Unknown builtin method: "+t)}return e},e.prototype.visitTryCatchStmt=function(t,e){return e.println("try {"),e.incIndent(),this.visitAllStatements(t.bodyStmts,e),e.decIndent(),e.println("} catch ("+p.CATCH_ERROR_VAR.name+", "+p.CATCH_STACK_VAR.name+") {"),e.incIndent(),this.visitAllStatements(t.catchStmts,e),e.decIndent(),e.println("}"),null},e.prototype.visitBinaryOperatorExpr=function(e,n){switch(e.operator){case c.BinaryOperator.Identical:n.print("identical("),e.lhs.visitExpression(this,n),n.print(", "),e.rhs.visitExpression(this,n),n.print(")");break;case c.BinaryOperator.NotIdentical:n.print("!identical("),e.lhs.visitExpression(this,n),n.print(", "),e.rhs.visitExpression(this,n),n.print(")");break;default:t.prototype.visitBinaryOperatorExpr.call(this,e,n)}return null},e.prototype.visitLiteralArrayExpr=function(e,n){return o(e.type)&&n.print("const "),t.prototype.visitLiteralArrayExpr.call(this,e,n)},e.prototype.visitLiteralMapExpr=function(e,n){return o(e.type)&&n.print("const "),a.isPresent(e.valueType)&&(n.print("")),t.prototype.visitLiteralMapExpr.call(this,e,n)},e.prototype.visitInstantiateExpr=function(t,e){return e.print(o(t.type)?"const":"new"),e.print(" "),t.classExpr.visitExpression(this,e),e.print("("),this.visitAllExpressions(t.args,e,","),e.print(")"),null},e.prototype.visitBuiltintType=function(t,e){var n;switch(t.name){case c.BuiltinTypeName.Bool:n="bool";break;case c.BuiltinTypeName.Dynamic:n="dynamic";break;case c.BuiltinTypeName.Function:n="Function";break;case c.BuiltinTypeName.Number:n="num";break;case c.BuiltinTypeName.Int:n="int";break;case c.BuiltinTypeName.String:n="String";break;default:throw new u.BaseException("Unsupported builtin type "+t.name)}return e.print(n),null},e.prototype.visitExternalType=function(t,e){return this._visitIdentifier(t.value,t.typeParams,e),null},e.prototype.visitArrayType=function(t,e){return e.print("List<"),a.isPresent(t.of)?t.of.visitType(this,e):e.print("dynamic"),e.print(">"),null},e.prototype.visitMapType=function(t,e){return e.print("Map"),null},e.prototype._visitParams=function(t,e){var n=this;this.visitAllObjects(function(t){a.isPresent(t.type)&&(t.type.visitType(n,e),e.print(" ")),e.print(t.name)},t,e,",")},e.prototype._visitIdentifier=function(t,e,n){var r=this;if(a.isPresent(t.moduleUrl)&&t.moduleUrl!=this._moduleUrl){var i=this.importsWithPrefixes.get(t.moduleUrl);a.isBlank(i)&&(i="import"+this.importsWithPrefixes.size,this.importsWithPrefixes.set(t.moduleUrl,i)),n.print(i+".")}n.print(t.name),a.isPresent(e)&&e.length>0&&(n.print("<"),this.visitAllObjects(function(t){return t.visitType(r,n)},e,n,","),n.print(">"))},e}(p.AbstractEmitterVisitor)},function(t,e,n){"use strict";function r(t,e,n){var r=n===l.Dart?"package:":"",o=h.parse(t,!1),u=h.parse(e,!0);if(a.isBlank(u))return e;if(o.firstLevelDir==u.firstLevelDir&&o.packageName==u.packageName)return i(o.modulePath,u.modulePath,n);if("lib"==u.firstLevelDir)return""+r+u.packageName+"/"+u.modulePath;throw new s.BaseException("Can't import url "+e+" from "+t)}function i(t,e,n){for(var r=t.split(p),i=e.split(p),s=o(r,i),a=[],u=r.length-1-s,h=0;u>h;h++)a.push("..");0>=u&&n===l.JS&&a.push(".");for(var h=s;hn&&t[n]==e[n];)n++;return n}var s=n(12),a=n(5),u=/asset:([^\/]+)\/([^\/]+)\/(.+)/g,c="/",p=/\//g;!function(t){t[t.Dart=0]="Dart",t[t.JS=1]="JS"}(e.ImportEnv||(e.ImportEnv={}));var l=e.ImportEnv;e.getImportModulePath=r;var h=function(){function t(t,e,n){this.packageName=t,this.firstLevelDir=e,this.modulePath=n}return t.parse=function(e,n){var r=a.RegExpWrapper.firstMatch(u,e);if(a.isPresent(r))return new t(r[1],r[2],r[3]);if(n)return null;throw new s.BaseException("Url "+e+" is not a valid asset: url")},t}();e.getRelativePath=i,e.getLongestPathSegmentPrefix=o},function(t,e,n){"use strict";function r(t){var e,n=new h(p),r=u.EmitterVisitorContext.createRoot([]);return e=s.isArray(t)?t:[t],e.forEach(function(t){if(t instanceof o.Statement)t.visitStatement(n,r);else if(t instanceof o.Expression)t.visitExpression(n,r);else{if(!(t instanceof o.Type))throw new a.BaseException("Don't know how to print debug info for "+t);t.visitType(n,r)}}),r.toSource()}var i=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},o=n(164),s=n(5),a=n(12),u=n(192),c=n(196),p="asset://debug/lib";e.debugOutputAstAsTypeScript=r;var l=function(){function t(){}return t.prototype.emitStatements=function(t,e,n){var r=new h(t),i=u.EmitterVisitorContext.createRoot(n);r.visitAllStatements(e,i);var o=[];return r.importsWithPrefixes.forEach(function(e,n){o.push("imp"+("ort * as "+e+" from '"+c.getImportModulePath(t,n,c.ImportEnv.JS)+"';"))}),o.push(i.toSource()),o.join("\n")},t}();e.TypeScriptEmitter=l;var h=function(t){function e(e){t.call(this,!1),this._moduleUrl=e,this.importsWithPrefixes=new Map}return i(e,t),e.prototype.visitExternalExpr=function(t,e){return this._visitIdentifier(t.value,t.typeParams,e),null},e.prototype.visitDeclareVarStmt=function(t,e){return e.isExportedVar(t.name)&&e.print("export "),t.hasModifier(o.StmtModifier.Final)?e.print("const"):e.print("var"),e.print(" "+t.name),s.isPresent(t.type)&&(e.print(":"),t.type.visitType(this,e)),e.print(" = "),t.value.visitExpression(this,e),e.println(";"),null},e.prototype.visitCastExpr=function(t,e){return e.print("(<"),t.type.visitType(this,e),e.print(">"),t.value.visitExpression(this,e),e.print(")"),null},e.prototype.visitDeclareClassStmt=function(t,e){var n=this;return e.pushClass(t),e.isExportedVar(t.name)&&e.print("export "),e.print("class "+t.name),s.isPresent(t.parent)&&(e.print(" extends "),t.parent.visitExpression(this,e)),e.println(" {"),e.incIndent(),t.fields.forEach(function(t){return n._visitClassField(t,e)}),s.isPresent(t.constructorMethod)&&this._visitClassConstructor(t,e),t.getters.forEach(function(t){return n._visitClassGetter(t,e)}),t.methods.forEach(function(t){return n._visitClassMethod(t,e)}),e.decIndent(),e.println("}"),e.popClass(),null},e.prototype._visitClassField=function(t,e){t.hasModifier(o.StmtModifier.Private)&&e.print("private "),e.print(t.name),s.isPresent(t.type)?(e.print(":"),t.type.visitType(this,e)):e.print(": any"),e.println(";")},e.prototype._visitClassGetter=function(t,e){t.hasModifier(o.StmtModifier.Private)&&e.print("private "),e.print("get "+t.name+"()"),s.isPresent(t.type)&&(e.print(":"),t.type.visitType(this,e)),e.println(" {"),e.incIndent(),this.visitAllStatements(t.body,e),e.decIndent(),e.println("}")},e.prototype._visitClassConstructor=function(t,e){e.print("constructor("),this._visitParams(t.constructorMethod.params,e),e.println(") {"),e.incIndent(),this.visitAllStatements(t.constructorMethod.body,e),e.decIndent(),e.println("}")},e.prototype._visitClassMethod=function(t,e){t.hasModifier(o.StmtModifier.Private)&&e.print("private "),e.print(t.name+"("),this._visitParams(t.params,e),e.print("):"),s.isPresent(t.type)?t.type.visitType(this,e):e.print("void"),e.println(" {"),e.incIndent(),this.visitAllStatements(t.body,e),e.decIndent(),e.println("}")},e.prototype.visitFunctionExpr=function(t,e){return e.print("("),this._visitParams(t.params,e),e.print("):"),s.isPresent(t.type)?t.type.visitType(this,e):e.print("void"),e.println(" => {"),e.incIndent(),this.visitAllStatements(t.statements,e),e.decIndent(),e.print("}"),null},e.prototype.visitDeclareFunctionStmt=function(t,e){return e.isExportedVar(t.name)&&e.print("export "),e.print("function "+t.name+"("),this._visitParams(t.params,e),e.print("):"),s.isPresent(t.type)?t.type.visitType(this,e):e.print("void"),e.println(" {"),e.incIndent(),this.visitAllStatements(t.statements,e),e.decIndent(),e.println("}"),null},e.prototype.visitTryCatchStmt=function(t,e){e.println("try {"),e.incIndent(),this.visitAllStatements(t.bodyStmts,e),e.decIndent(),e.println("} catch ("+u.CATCH_ERROR_VAR.name+") {"),e.incIndent();var n=[u.CATCH_STACK_VAR.set(u.CATCH_ERROR_VAR.prop("stack")).toDeclStmt(null,[o.StmtModifier.Final])].concat(t.catchStmts);return this.visitAllStatements(n,e),e.decIndent(),e.println("}"),null},e.prototype.visitBuiltintType=function(t,e){var n;switch(t.name){case o.BuiltinTypeName.Bool:n="boolean";break;case o.BuiltinTypeName.Dynamic:n="any";break;case o.BuiltinTypeName.Function:n="Function";break;case o.BuiltinTypeName.Number:n="number";break;case o.BuiltinTypeName.Int:n="number";break;case o.BuiltinTypeName.String:n="string";break;default:throw new a.BaseException("Unsupported builtin type "+t.name)}return e.print(n),null},e.prototype.visitExternalType=function(t,e){return this._visitIdentifier(t.value,t.typeParams,e),null},e.prototype.visitArrayType=function(t,e){return s.isPresent(t.of)?t.of.visitType(this,e):e.print("any"),e.print("[]"),null},e.prototype.visitMapType=function(t,e){return e.print("{[key: string]:"),s.isPresent(t.valueType)?t.valueType.visitType(this,e):e.print("any"),e.print("}"),null},e.prototype.getBuiltinMethodName=function(t){var e;switch(t){case o.BuiltinMethod.ConcatArray:e="concat";break;case o.BuiltinMethod.SubscribeObservable:e="subscribe";break;case o.BuiltinMethod.bind:e="bind";break;default:throw new a.BaseException("Unknown builtin method: "+t)}return e},e.prototype._visitParams=function(t,e){var n=this;this.visitAllObjects(function(t){e.print(t.name),s.isPresent(t.type)&&(e.print(":"),t.type.visitType(n,e))},t,e,",")},e.prototype._visitIdentifier=function(t,e,n){var r=this;if(s.isPresent(t.moduleUrl)&&t.moduleUrl!=this._moduleUrl){var i=this.importsWithPrefixes.get(t.moduleUrl);s.isBlank(i)&&(i="import"+this.importsWithPrefixes.size,this.importsWithPrefixes.set(t.moduleUrl,i)),n.print(i+".")}n.print(t.name),s.isPresent(e)&&e.length>0&&(n.print("<"),this.visitAllObjects(function(t){return t.visitType(r,n)},e,n,","),n.print(">"))},e}(u.AbstractEmitterVisitor)},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=n(5),o=n(159),s=n(12),a=function(){function t(){}return t.prototype.createInstance=function(t,e,n,r,i,a){if(t===o.AppView)return new u(n,r,i,a);throw new s.BaseException("Can't instantiate class "+t+" in interpretative mode")},t}();e.InterpretiveAppViewInstanceFactory=a;var u=function(t){function e(e,n,r,i){t.call(this,e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8]),this.props=n,this.getters=r,this.methods=i}return r(e,t),e.prototype.createInternal=function(e){var n=this.methods.get("createInternal");return i.isPresent(n)?n(e):t.prototype.createInternal.call(this,e)},e.prototype.injectorGetInternal=function(e,n,r){var o=this.methods.get("injectorGetInternal");return i.isPresent(o)?o(e,n,r):t.prototype.injectorGet.call(this,e,n,r)},e.prototype.destroyInternal=function(){var e=this.methods.get("destroyInternal");return i.isPresent(e)?e():t.prototype.destroyInternal.call(this)},e.prototype.dirtyParentQueriesInternal=function(){var e=this.methods.get("dirtyParentQueriesInternal");return i.isPresent(e)?e():t.prototype.dirtyParentQueriesInternal.call(this)},e.prototype.detectChangesInternal=function(e){var n=this.methods.get("detectChangesInternal");return i.isPresent(n)?n(e):t.prototype.detectChangesInternal.call(this,e)},e}(o.AppView)},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(6),a=n(5),u=n(15),c=n(200),p=n(148),l=n(150),h=a.CONST_EXPR({xlink:"http://www.w3.org/1999/xlink",svg:"http://www.w3.org/2000/svg"}),f=function(t){function e(){t.apply(this,arguments),this._protoElements=new Map}return r(e,t),e.prototype._getProtoElement=function(t){var e=this._protoElements.get(t);if(a.isBlank(e)){var n=p.splitNsName(t);e=a.isPresent(n[0])?c.DOM.createElementNS(h[n[0]],n[1]):c.DOM.createElement(n[1]),this._protoElements.set(t,e)}return e},e.prototype.hasProperty=function(t,e){if(-1!==t.indexOf("-"))return!0;var n=this._getProtoElement(t);return c.DOM.hasProperty(n,e)},e.prototype.getMappedPropName=function(t){var e=u.StringMapWrapper.get(c.DOM.attrToPropMap,t);return a.isPresent(e)?e:t},e=i([s.Injectable(),o("design:paramtypes",[])],e)}(l.ElementSchemaRegistry);e.DomElementSchemaRegistry=f},function(t,e,n){"use strict";function r(t){i.isBlank(e.DOM)&&(e.DOM=t)}var i=n(5);e.DOM=null,e.setRootDomAdapter=r;var o=function(){function t(){}return Object.defineProperty(t.prototype,"attrToPropMap",{get:function(){return this._attrToPropMap},set:function(t){this._attrToPropMap=t},enumerable:!0,configurable:!0}),t}();e.DomAdapter=o},function(t,e,n){"use strict";function r(){return s.isBlank(c.getPlatform())&&c.createPlatform(c.ReflectiveInjector.resolveAndCreate(a.BROWSER_PROVIDERS)),c.assertPlatform(a.BROWSER_PLATFORM_MARKER)}function i(t,n){c.reflector.reflectionCapabilities=new p.ReflectionCapabilities;var i=c.ReflectiveInjector.resolveAndCreate([e.BROWSER_APP_PROVIDERS,s.isPresent(n)?n:[]],r().injector);return c.coreLoadAndBootstrap(i,t)}var o=n(202);e.BROWSER_PROVIDERS=o.BROWSER_PROVIDERS,e.CACHED_TEMPLATE_PROVIDER=o.CACHED_TEMPLATE_PROVIDER,e.ELEMENT_PROBE_PROVIDERS=o.ELEMENT_PROBE_PROVIDERS,e.ELEMENT_PROBE_PROVIDERS_PROD_MODE=o.ELEMENT_PROBE_PROVIDERS_PROD_MODE,e.inspectNativeElement=o.inspectNativeElement,e.BrowserDomAdapter=o.BrowserDomAdapter,e.By=o.By,e.Title=o.Title,e.DOCUMENT=o.DOCUMENT,e.enableDebugTools=o.enableDebugTools,e.disableDebugTools=o.disableDebugTools;var s=n(5),a=n(202),u=n(137),c=n(2),p=n(21),l=n(220),h=n(137),f=n(6);e.BROWSER_APP_PROVIDERS=s.CONST_EXPR([a.BROWSER_APP_COMMON_PROVIDERS,u.COMPILER_PROVIDERS,new f.Provider(h.XHR,{useClass:l.XHRImpl})]),e.browserPlatform=r,e.bootstrap=i},function(t,e,n){"use strict";function r(){return new c.ExceptionHandler(h.DOM,!s.IS_DART)}function i(){return h.DOM.defaultDoc()}function o(){E.BrowserDomAdapter.makeCurrent(),R.wtfInit(),w.BrowserGetTestability.init()}var s=n(5),a=n(6),u=n(184),c=n(2),p=n(87),l=n(63),h=n(200),f=n(203),d=n(205),v=n(206),y=n(208),m=n(209),g=n(217),_=n(217),b=n(216),P=n(210),E=n(218),w=n(221),C=n(222),R=n(223),S=n(204),O=n(206),T=n(224),x=n(208);e.DOCUMENT=x.DOCUMENT;var A=n(228);e.Title=A.Title;var I=n(224);e.ELEMENT_PROBE_PROVIDERS=I.ELEMENT_PROBE_PROVIDERS,e.ELEMENT_PROBE_PROVIDERS_PROD_MODE=I.ELEMENT_PROBE_PROVIDERS_PROD_MODE,e.inspectNativeElement=I.inspectNativeElement,e.By=I.By;var M=n(218);e.BrowserDomAdapter=M.BrowserDomAdapter;var k=n(229);e.enableDebugTools=k.enableDebugTools,e.disableDebugTools=k.disableDebugTools;var N=n(206);e.HAMMER_GESTURE_CONFIG=N.HAMMER_GESTURE_CONFIG,e.HammerGestureConfig=N.HammerGestureConfig,e.BROWSER_PLATFORM_MARKER=s.CONST_EXPR(new a.OpaqueToken("BrowserPlatformMarker")),e.BROWSER_PROVIDERS=s.CONST_EXPR([new a.Provider(e.BROWSER_PLATFORM_MARKER,{useValue:!0}),c.PLATFORM_COMMON_PROVIDERS,new a.Provider(c.PLATFORM_INITIALIZER,{useValue:o,multi:!0})]),e.BROWSER_APP_COMMON_PROVIDERS=s.CONST_EXPR([c.APPLICATION_COMMON_PROVIDERS,p.FORM_PROVIDERS,new a.Provider(c.PLATFORM_PIPES,{useValue:p.COMMON_PIPES,multi:!0}),new a.Provider(c.PLATFORM_DIRECTIVES,{useValue:p.COMMON_DIRECTIVES,multi:!0}),new a.Provider(c.ExceptionHandler,{useFactory:r,deps:[]}),new a.Provider(y.DOCUMENT,{useFactory:i,deps:[]}),new a.Provider(S.EVENT_MANAGER_PLUGINS,{useClass:f.DomEventsPlugin,multi:!0}),new a.Provider(S.EVENT_MANAGER_PLUGINS,{useClass:d.KeyEventsPlugin,multi:!0}),new a.Provider(S.EVENT_MANAGER_PLUGINS,{useClass:v.HammerGesturesPlugin,multi:!0}),new a.Provider(O.HAMMER_GESTURE_CONFIG,{useClass:O.HammerGestureConfig}),new a.Provider(m.DomRootRenderer,{useClass:m.DomRootRenderer_}),new a.Provider(c.RootRenderer,{useExisting:m.DomRootRenderer}),new a.Provider(_.SharedStylesHost,{useExisting:g.DomSharedStylesHost}),g.DomSharedStylesHost,l.Testability,b.BrowserDetails,P.AnimationBuilder,S.EventManager,T.ELEMENT_PROBE_PROVIDERS]),e.CACHED_TEMPLATE_PROVIDER=s.CONST_EXPR([new a.Provider(u.XHR,{useClass:C.CachedXHR})]),e.initDomAdapter=o},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(200),a=n(2),u=n(204),c=function(t){function e(){t.apply(this,arguments)}return r(e,t),e.prototype.supports=function(t){return!0},e.prototype.addEventListener=function(t,e,n){var r=this.manager.getZone(),i=function(t){return r.runGuarded(function(){return n(t)})};return this.manager.getZone().runOutsideAngular(function(){return s.DOM.onAndCancel(t,e,i)})},e.prototype.addGlobalEventListener=function(t,e,n){var r=s.DOM.getGlobalEventTarget(t),i=this.manager.getZone(),o=function(t){return i.runGuarded(function(){return n(t)})};return this.manager.getZone().runOutsideAngular(function(){return s.DOM.onAndCancel(r,e,o)})},e=i([a.Injectable(),o("design:paramtypes",[])],e)}(u.EventManagerPlugin);e.DomEventsPlugin=c},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},s=n(5),a=n(12),u=n(6),c=n(60),p=n(15);e.EVENT_MANAGER_PLUGINS=s.CONST_EXPR(new u.OpaqueToken("EventManagerPlugins"));var l=function(){function t(t,e){var n=this;this._zone=e,t.forEach(function(t){return t.manager=n}),this._plugins=p.ListWrapper.reversed(t)}return t.prototype.addEventListener=function(t,e,n){var r=this._findPluginFor(e);return r.addEventListener(t,e,n)},t.prototype.addGlobalEventListener=function(t,e,n){var r=this._findPluginFor(e);return r.addGlobalEventListener(t,e,n)},t.prototype.getZone=function(){return this._zone},t.prototype._findPluginFor=function(t){for(var e=this._plugins,n=0;no?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(200),a=n(5),u=n(15),c=n(204),p=n(6),l=["alt","control","meta","shift"],h={alt:function(t){return t.altKey},control:function(t){return t.ctrlKey},meta:function(t){return t.metaKey},shift:function(t){return t.shiftKey}},f=function(t){function e(){t.call(this)}return r(e,t),e.prototype.supports=function(t){return a.isPresent(e.parseEventName(t))},e.prototype.addEventListener=function(t,n,r){var i=e.parseEventName(n),o=e.eventCallback(t,u.StringMapWrapper.get(i,"fullKey"),r,this.manager.getZone());return this.manager.getZone().runOutsideAngular(function(){return s.DOM.onAndCancel(t,u.StringMapWrapper.get(i,"domEventName"),o)})},e.parseEventName=function(t){var n=t.toLowerCase().split("."),r=n.shift();if(0===n.length||!a.StringWrapper.equals(r,"keydown")&&!a.StringWrapper.equals(r,"keyup"))return null;var i=e._normalizeKey(n.pop()),o="";if(l.forEach(function(t){u.ListWrapper.contains(n,t)&&(u.ListWrapper.remove(n,t),o+=t+".")}),o+=i,0!=n.length||0===i.length)return null;var s=u.StringMapWrapper.create();return u.StringMapWrapper.set(s,"domEventName",r),u.StringMapWrapper.set(s,"fullKey",o),s},e.getEventFullKey=function(t){var e="",n=s.DOM.getEventKey(t);return n=n.toLowerCase(),a.StringWrapper.equals(n," ")?n="space":a.StringWrapper.equals(n,".")&&(n="dot"),l.forEach(function(r){if(r!=n){var i=u.StringMapWrapper.get(h,r);i(t)&&(e+=r+".")}}),e+=n},e.eventCallback=function(t,n,r,i){return function(t){a.StringWrapper.equals(e.getEventFullKey(t),n)&&i.runGuarded(function(){return r(t)})}},e._normalizeKey=function(t){switch(t){case"esc":return"escape";default:return t}},e=i([p.Injectable(),o("design:paramtypes",[])],e)}(c.EventManagerPlugin);e.KeyEventsPlugin=f},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},a=n(207),u=n(5),c=n(12),p=n(2);e.HAMMER_GESTURE_CONFIG=u.CONST_EXPR(new p.OpaqueToken("HammerGestureConfig"));var l=function(){function t(){this.events=[],this.overrides={}}return t.prototype.buildHammer=function(t){var e=new Hammer(t);e.get("pinch").set({enable:!0}),e.get("rotate").set({enable:!0});for(var n in this.overrides)e.get(n).set(this.overrides[n]);return e},t=i([p.Injectable(),o("design:paramtypes",[])],t)}();e.HammerGestureConfig=l;var h=function(t){function n(e){t.call(this),this._config=e}return r(n,t),n.prototype.supports=function(e){if(!t.prototype.supports.call(this,e)&&!this.isCustomEvent(e))return!1;if(!u.isPresent(window.Hammer))throw new c.BaseException("Hammer.js is not loaded, can not bind "+e+" event");return!0},n.prototype.addEventListener=function(t,e,n){var r=this,i=this.manager.getZone();return e=e.toLowerCase(),i.runOutsideAngular(function(){var o=r._config.buildHammer(t),s=function(t){i.runGuarded(function(){n(t)})};return o.on(e,s),function(){o.off(e,s)}})},n.prototype.isCustomEvent=function(t){return this._config.events.indexOf(t)>-1},n=i([p.Injectable(),s(0,p.Inject(e.HAMMER_GESTURE_CONFIG)),o("design:paramtypes",[l])],n)}(a.HammerGesturesPluginCommon);e.HammerGesturesPlugin=h},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=n(204),o=n(15),s={pan:!0,panstart:!0,panmove:!0,panend:!0,pancancel:!0,panleft:!0,panright:!0,panup:!0,pandown:!0,pinch:!0,pinchstart:!0,pinchmove:!0,pinchend:!0,pinchcancel:!0,pinchin:!0,pinchout:!0,press:!0,pressup:!0,rotate:!0,rotatestart:!0,rotatemove:!0,rotateend:!0,rotatecancel:!0,swipe:!0,swipeleft:!0,swiperight:!0,swipeup:!0,swipedown:!0,tap:!0},a=function(t){function e(){t.call(this)}return r(e,t),e.prototype.supports=function(t){return t=t.toLowerCase(),o.StringMapWrapper.contains(s,t)},e}(i.EventManagerPlugin);e.HammerGesturesPluginCommon=a},function(t,e,n){"use strict";var r=n(6),i=n(5);e.DOCUMENT=i.CONST_EXPR(new r.OpaqueToken("DocumentToken"))},function(t,e,n){"use strict";function r(t,e){var n=E.DOM.parentElement(t);if(e.length>0&&y.isPresent(n)){var r=E.DOM.nextSibling(t);if(y.isPresent(r))for(var i=0;io?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s); +return o>3&&s&&Object.defineProperty(e,n,s),s},h=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},f=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},d=n(6),v=n(210),y=n(5),m=n(12),g=n(217),_=n(204),b=n(208),P=n(3),E=n(200),w=n(215),C=y.CONST_EXPR({xlink:"http://www.w3.org/1999/xlink",svg:"http://www.w3.org/2000/svg"}),R="template bindings={}",S=/^template bindings=(.*)$/g,O=function(){function t(t,e,n,r){this.document=t,this.eventManager=e,this.sharedStylesHost=n,this.animate=r,this._registeredComponents=new Map}return t.prototype.renderComponent=function(t){var e=this._registeredComponents.get(t.id);return y.isBlank(e)&&(e=new x(this,t),this._registeredComponents.set(t.id,e)),e},t}();e.DomRootRenderer=O;var T=function(t){function e(e,n,r,i){t.call(this,e,n,r,i)}return p(e,t),e=l([d.Injectable(),f(0,d.Inject(b.DOCUMENT)),h("design:paramtypes",[Object,_.EventManager,g.DomSharedStylesHost,v.AnimationBuilder])],e)}(O);e.DomRootRenderer_=T;var x=function(){function t(t,e){this._rootRenderer=t,this.componentProto=e,this._styles=u(e.id,e.styles,[]),e.encapsulation!==P.ViewEncapsulation.Native&&this._rootRenderer.sharedStylesHost.addStyles(this._styles),this.componentProto.encapsulation===P.ViewEncapsulation.Emulated?(this._contentAttr=s(e.id),this._hostAttr=a(e.id)):(this._contentAttr=null,this._hostAttr=null)}return t.prototype.selectRootElement=function(t,e){var n;if(y.isString(t)){if(n=E.DOM.querySelector(this._rootRenderer.document,t),y.isBlank(n))throw new m.BaseException('The selector "'+t+'" did not match any elements')}else n=t;return E.DOM.clearNodes(n),n},t.prototype.createElement=function(t,e,n){var r=c(e),i=y.isPresent(r[0])?E.DOM.createElementNS(C[r[0]],r[1]):E.DOM.createElement(r[1]);return y.isPresent(this._contentAttr)&&E.DOM.setAttribute(i,this._contentAttr,""),y.isPresent(t)&&E.DOM.appendChild(t,i),i},t.prototype.createViewRoot=function(t){var e;if(this.componentProto.encapsulation===P.ViewEncapsulation.Native){e=E.DOM.createShadowRoot(t),this._rootRenderer.sharedStylesHost.addHost(e);for(var n=0;no?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(6),s=n(211),a=n(216),u=function(){function t(t){this.browserDetails=t}return t.prototype.css=function(){return new s.CssAnimationBuilder(this.browserDetails)},t=r([o.Injectable(),i("design:paramtypes",[a.BrowserDetails])],t)}();e.AnimationBuilder=u},function(t,e,n){"use strict";var r=n(212),i=n(213),o=function(){function t(t){this.browserDetails=t,this.data=new r.CssAnimationOptions}return t.prototype.addAnimationClass=function(t){return this.data.animationClasses.push(t),this},t.prototype.addClass=function(t){return this.data.classesToAdd.push(t),this},t.prototype.removeClass=function(t){return this.data.classesToRemove.push(t),this},t.prototype.setDuration=function(t){return this.data.duration=t,this},t.prototype.setDelay=function(t){return this.data.delay=t,this},t.prototype.setStyles=function(t,e){return this.setFromStyles(t).setToStyles(e)},t.prototype.setFromStyles=function(t){return this.data.fromStyles=t,this},t.prototype.setToStyles=function(t){return this.data.toStyles=t,this},t.prototype.start=function(t){return new i.Animation(t,this.data,this.browserDetails)},t}();e.CssAnimationBuilder=o},function(t,e){"use strict";var n=function(){function t(){this.classesToAdd=[],this.classesToRemove=[],this.animationClasses=[]}return t}();e.CssAnimationOptions=n},function(t,e,n){"use strict";var r=n(5),i=n(214),o=n(215),s=n(15),a=n(200),u=function(){function t(t,e,n){var i=this;this.element=t,this.data=e,this.browserDetails=n,this.callbacks=[],this.eventClearFunctions=[],this.completed=!1,this._stringPrefix="",this.startTime=r.DateWrapper.toMillis(r.DateWrapper.now()),this._stringPrefix=a.DOM.getAnimationPrefix(),this.setup(),this.wait(function(t){return i.start()})}return Object.defineProperty(t.prototype,"totalTime",{get:function(){var t=null!=this.computedDelay?this.computedDelay:0,e=null!=this.computedDuration?this.computedDuration:0;return t+e},enumerable:!0,configurable:!0}),t.prototype.wait=function(t){this.browserDetails.raf(t,2)},t.prototype.setup=function(){null!=this.data.fromStyles&&this.applyStyles(this.data.fromStyles),null!=this.data.duration&&this.applyStyles({transitionDuration:this.data.duration.toString()+"ms"}),null!=this.data.delay&&this.applyStyles({transitionDelay:this.data.delay.toString()+"ms"})},t.prototype.start=function(){this.addClasses(this.data.classesToAdd),this.addClasses(this.data.animationClasses),this.removeClasses(this.data.classesToRemove),null!=this.data.toStyles&&this.applyStyles(this.data.toStyles);var t=a.DOM.getComputedStyle(this.element);this.computedDelay=i.Math.max(this.parseDurationString(t.getPropertyValue(this._stringPrefix+"transition-delay")),this.parseDurationString(this.element.style.getPropertyValue(this._stringPrefix+"transition-delay"))),this.computedDuration=i.Math.max(this.parseDurationString(t.getPropertyValue(this._stringPrefix+"transition-duration")),this.parseDurationString(this.element.style.getPropertyValue(this._stringPrefix+"transition-duration"))),this.addEvents()},t.prototype.applyStyles=function(t){var e=this;s.StringMapWrapper.forEach(t,function(t,n){var i=o.camelCaseToDashCase(n);r.isPresent(a.DOM.getStyle(e.element,i))?a.DOM.setStyle(e.element,i,t.toString()):a.DOM.setStyle(e.element,e._stringPrefix+i,t.toString())})},t.prototype.addClasses=function(t){for(var e=0,n=t.length;n>e;e++)a.DOM.addClass(this.element,t[e])},t.prototype.removeClasses=function(t){for(var e=0,n=t.length;n>e;e++)a.DOM.removeClass(this.element,t[e])},t.prototype.addEvents=function(){var t=this;this.totalTime>0?this.eventClearFunctions.push(a.DOM.onAndCancel(this.element,a.DOM.getTransitionEnd(),function(e){return t.handleAnimationEvent(e)})):this.handleAnimationCompleted()},t.prototype.handleAnimationEvent=function(t){var e=i.Math.round(1e3*t.elapsedTime);this.browserDetails.elapsedTimeIncludesDelay||(e+=this.computedDelay),t.stopPropagation(),e>=this.totalTime&&this.handleAnimationCompleted()},t.prototype.handleAnimationCompleted=function(){this.removeClasses(this.data.animationClasses),this.callbacks.forEach(function(t){return t()}),this.callbacks=[],this.eventClearFunctions.forEach(function(t){return t()}),this.eventClearFunctions=[],this.completed=!0},t.prototype.onComplete=function(t){return this.completed?t():this.callbacks.push(t),this},t.prototype.parseDurationString=function(t){var e=0;if(null==t||t.length<2)return e;if("ms"==t.substring(t.length-2)){var n=r.NumberWrapper.parseInt(this.stripLetters(t),10);n>e&&(e=n)}else if("s"==t.substring(t.length-1)){var o=1e3*r.NumberWrapper.parseFloat(this.stripLetters(t)),n=i.Math.floor(o);n>e&&(e=n)}return e},t.prototype.stripLetters=function(t){return r.StringWrapper.replaceAll(t,r.RegExpWrapper.create("[^0-9]+$",""),"")},t}();e.Animation=u},function(t,e,n){"use strict";var r=n(5);e.Math=r.global.Math,e.NaN=typeof e.NaN},function(t,e,n){"use strict";function r(t){return o.StringWrapper.replaceAllMapped(t,s,function(t){return"-"+t[1].toLowerCase()})}function i(t){return o.StringWrapper.replaceAllMapped(t,a,function(t){return t[1].toUpperCase()})}var o=n(5),s=/([A-Z])/g,a=/-([a-z])/g;e.camelCaseToDashCase=r,e.dashCaseToCamelCase=i},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(6),s=n(214),a=n(200),u=function(){function t(){this.elapsedTimeIncludesDelay=!1,this.doesElapsedTimeIncludesDelay()}return t.prototype.doesElapsedTimeIncludesDelay=function(){var t=this,e=a.DOM.createElement("div");a.DOM.setAttribute(e,"style","position: absolute; top: -9999px; left: -9999px; width: 1px;\n height: 1px; transition: all 1ms linear 1ms;"),this.raf(function(n){a.DOM.on(e,"transitionend",function(n){var r=s.Math.round(1e3*n.elapsedTime);t.elapsedTimeIncludesDelay=2==r,a.DOM.remove(e)}),a.DOM.setStyle(e,"width","2px")},2)},t.prototype.raf=function(t,e){void 0===e&&(e=1);var n=new c(t,e);return function(){return n.cancel()}},t=r([o.Injectable(),i("design:paramtypes",[])],t)}();e.BrowserDetails=u;var c=function(){function t(t,e){this.callback=t,this.frames=e,this._raf()}return t.prototype._raf=function(){var t=this;this.currentFrameId=a.DOM.requestAnimationFrame(function(e){return t._nextFrame(e)})},t.prototype._nextFrame=function(t){this.frames--,this.frames>0?this._raf():this.callback(t)},t.prototype.cancel=function(){a.DOM.cancelAnimationFrame(this.currentFrameId),this.currentFrameId=null},t}()},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},a=n(200),u=n(6),c=n(15),p=n(208),l=function(){function t(){this._styles=[],this._stylesSet=new Set}return t.prototype.addStyles=function(t){var e=this,n=[];t.forEach(function(t){c.SetWrapper.has(e._stylesSet,t)||(e._stylesSet.add(t),e._styles.push(t),n.push(t))}),this.onStylesAdded(n)},t.prototype.onStylesAdded=function(t){},t.prototype.getAllStyles=function(){return this._styles},t=i([u.Injectable(),o("design:paramtypes",[])],t)}();e.SharedStylesHost=l;var h=function(t){function e(e){t.call(this),this._hostNodes=new Set,this._hostNodes.add(e.head)}return r(e,t),e.prototype._addStylesToHost=function(t,e){for(var n=0;n0},e.prototype.tagName=function(t){return t.tagName},e.prototype.attributeMap=function(t){for(var e=new Map,n=t.attributes,r=0;r=200&&300>=i?e.resolve(r):e.reject("Failed to load "+t,null)},n.onerror=function(){e.reject("Failed to load "+t,null)},n.send(),e.promise},e}(s.XHR);e.XHRImpl=a},function(t,e,n){"use strict";var r=n(15),i=n(5),o=n(200),s=n(2),a=function(){function t(t){this._testability=t}return t.prototype.isStable=function(){return this._testability.isStable()},t.prototype.whenStable=function(t){this._testability.whenStable(t)},t.prototype.findBindings=function(t,e,n){return this.findProviders(t,e,n)},t.prototype.findProviders=function(t,e,n){return this._testability.findBindings(t,e,n)},t}(),u=function(){function t(){}return t.init=function(){s.setTestabilityGetter(new t)},t.prototype.addToWindow=function(t){i.global.getAngularTestability=function(e,n){void 0===n&&(n=!0);var r=t.findTestabilityInTree(e,n);if(null==r)throw new Error("Could not find testability for element.");return new a(r)},i.global.getAllAngularTestabilities=function(){var e=t.getAllTestabilities();return e.map(function(t){return new a(t)})},i.global.getAllAngularRootElements=function(){return t.getAllRootElements()};var e=function(t){var e=i.global.getAllAngularTestabilities(),n=e.length,r=!1,o=function(e){r=r||e,n--,0==n&&t(r)};e.forEach(function(t){t.whenStable(o)})};i.global.frameworkStabilizers||(i.global.frameworkStabilizers=r.ListWrapper.createGrowableSize(0)),i.global.frameworkStabilizers.push(e)},t.prototype.findTestabilityInTree=function(t,e,n){if(null==e)return null;var r=t.getTestability(e);return i.isPresent(r)?r:n?o.DOM.isShadowRoot(e)?this.findTestabilityInTree(t,o.DOM.getHost(e),!0):this.findTestabilityInTree(t,o.DOM.parentElement(e),!0):null},t}();e.BrowserGetTestability=u},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=n(184),o=n(12),s=n(5),a=n(41),u=function(t){function e(){if(t.call(this),this._cache=s.global.$templateCache,null==this._cache)throw new o.BaseException("CachedXHR: Template cache was not found in $templateCache.")}return r(e,t),e.prototype.get=function(t){return this._cache.hasOwnProperty(t)?a.PromiseWrapper.resolve(this._cache[t]):a.PromiseWrapper.reject("CachedXHR: Did not find cached template for "+t,null)},e}(i.XHR);e.CachedXHR=u},function(t,e){"use strict";function n(){}e.wtfInit=n},function(t,e,n){"use strict";function r(t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n])}var i=n(200);e.DOM=i.DOM,e.setRootDomAdapter=i.setRootDomAdapter,e.DomAdapter=i.DomAdapter;var o=n(209);e.DomRenderer=o.DomRenderer;var s=n(208);e.DOCUMENT=s.DOCUMENT;var a=n(217);e.SharedStylesHost=a.SharedStylesHost,e.DomSharedStylesHost=a.DomSharedStylesHost;var u=n(203);e.DomEventsPlugin=u.DomEventsPlugin;var c=n(204);e.EVENT_MANAGER_PLUGINS=c.EVENT_MANAGER_PLUGINS,e.EventManager=c.EventManager,e.EventManagerPlugin=c.EventManagerPlugin,r(n(225)),r(n(226))},function(t,e,n){"use strict";var r=n(5),i=n(200),o=function(){function t(){}return t.all=function(){return function(t){return!0}},t.css=function(t){return function(e){return r.isPresent(e.nativeElement)?i.DOM.elementMatches(e.nativeElement,t):!1}},t.directive=function(t){return function(e){return-1!==e.providerTokens.indexOf(t)}},t}();e.By=o},function(t,e,n){"use strict";function r(t){return c.getDebugNode(t)}function i(t){return s.assertionsEnabled()?o(t):t}function o(t){return u.DOM.setGlobalVar(d,r),u.DOM.setGlobalVar(v,f),new h.DebugDomRootRenderer(t)}var s=n(5),a=n(6),u=n(200),c=n(83),p=n(209),l=n(2),h=n(227),f=s.CONST_EXPR({ApplicationRef:l.ApplicationRef,NgZone:l.NgZone}),d="ng.probe",v="ng.coreTokens";e.inspectNativeElement=r,e.ELEMENT_PROBE_PROVIDERS=s.CONST_EXPR([new a.Provider(l.RootRenderer,{useFactory:i,deps:[p.DomRootRenderer]})]),e.ELEMENT_PROBE_PROVIDERS_PROD_MODE=s.CONST_EXPR([new a.Provider(l.RootRenderer,{useFactory:o,deps:[p.DomRootRenderer]})])},function(t,e,n){"use strict";var r=n(5),i=n(83),o=function(){function t(t){this._delegate=t}return t.prototype.renderComponent=function(t){return new s(this._delegate.renderComponent(t))},t}();e.DebugDomRootRenderer=o;var s=function(){function t(t){this._delegate=t}return t.prototype.selectRootElement=function(t,e){var n=this._delegate.selectRootElement(t,e),r=new i.DebugElement(n,null,e);return i.indexDebugNode(r),n},t.prototype.createElement=function(t,e,n){var r=this._delegate.createElement(t,e,n),o=new i.DebugElement(r,i.getDebugNode(t),n);return o.name=e,i.indexDebugNode(o),r},t.prototype.createViewRoot=function(t){return this._delegate.createViewRoot(t)},t.prototype.createTemplateAnchor=function(t,e){var n=this._delegate.createTemplateAnchor(t,e),r=new i.DebugNode(n,i.getDebugNode(t),e);return i.indexDebugNode(r),n},t.prototype.createText=function(t,e,n){var r=this._delegate.createText(t,e,n),o=new i.DebugNode(r,i.getDebugNode(t),n);return i.indexDebugNode(o),r},t.prototype.projectNodes=function(t,e){var n=i.getDebugNode(t);if(r.isPresent(n)&&n instanceof i.DebugElement){var o=n;e.forEach(function(t){o.addChild(i.getDebugNode(t))})}this._delegate.projectNodes(t,e)},t.prototype.attachViewAfter=function(t,e){var n=i.getDebugNode(t);if(r.isPresent(n)){var o=n.parent;if(e.length>0&&r.isPresent(o)){var s=[];e.forEach(function(t){return s.push(i.getDebugNode(t))}),o.insertChildrenAfter(n,s)}}this._delegate.attachViewAfter(t,e)},t.prototype.detachView=function(t){t.forEach(function(t){var e=i.getDebugNode(t);r.isPresent(e)&&r.isPresent(e.parent)&&e.parent.removeChild(e)}),this._delegate.detachView(t)},t.prototype.destroyView=function(t,e){e.forEach(function(t){i.removeDebugNodeFromIndex(i.getDebugNode(t))}),this._delegate.destroyView(t,e)},t.prototype.listen=function(t,e,n){var o=i.getDebugNode(t);return r.isPresent(o)&&o.listeners.push(new i.EventListener(e,n)),this._delegate.listen(t,e,n)},t.prototype.listenGlobal=function(t,e,n){return this._delegate.listenGlobal(t,e,n)},t.prototype.setElementProperty=function(t,e,n){ +var o=i.getDebugNode(t);r.isPresent(o)&&o instanceof i.DebugElement&&(o.properties[e]=n),this._delegate.setElementProperty(t,e,n)},t.prototype.setElementAttribute=function(t,e,n){var o=i.getDebugNode(t);r.isPresent(o)&&o instanceof i.DebugElement&&(o.attributes[e]=n),this._delegate.setElementAttribute(t,e,n)},t.prototype.setBindingDebugInfo=function(t,e,n){this._delegate.setBindingDebugInfo(t,e,n)},t.prototype.setElementClass=function(t,e,n){this._delegate.setElementClass(t,e,n)},t.prototype.setElementStyle=function(t,e,n){this._delegate.setElementStyle(t,e,n)},t.prototype.invokeElementMethod=function(t,e,n){this._delegate.invokeElementMethod(t,e,n)},t.prototype.setText=function(t,e){this._delegate.setText(t,e)},t}();e.DebugDomRenderer=s},function(t,e,n){"use strict";var r=n(200),i=function(){function t(){}return t.prototype.getTitle=function(){return r.DOM.getTitle()},t.prototype.setTitle=function(t){r.DOM.setTitle(t)},t}();e.Title=i},function(t,e,n){"use strict";function r(t){a.ng=new s.AngularTools(t)}function i(){delete a.ng}var o=n(5),s=n(230),a=o.global;e.enableDebugTools=r,e.disableDebugTools=i},function(t,e,n){"use strict";var r=n(59),i=n(5),o=n(231),s=n(200),a=function(){function t(t,e){this.msPerTick=t,this.numTicks=e}return t}();e.ChangeDetectionPerfRecord=a;var u=function(){function t(t){this.profiler=new c(t)}return t}();e.AngularTools=u;var c=function(){function t(t){this.appRef=t.injector.get(r.ApplicationRef)}return t.prototype.timeChangeDetection=function(t){var e=i.isPresent(t)&&t.record,n="Change Detection",r=i.isPresent(o.window.console.profile);e&&r&&o.window.console.profile(n);for(var u=s.DOM.performanceNow(),c=0;5>c||s.DOM.performanceNow()-u<500;)this.appRef.tick(),c++;var p=s.DOM.performanceNow();e&&r&&o.window.console.profileEnd(n);var l=(p-u)/c;return o.window.console.log("ran "+c+" change detection cycles"),o.window.console.log(i.NumberWrapper.toFixed(l,2)+" ms per check"),new a(l,c)},t}();e.AngularProfiler=c},function(t,e){"use strict";var n=window;e.window=n,e.document=window.document,e.location=window.location,e.gc=window.gc?function(){return window.gc()}:function(){return null},e.performance=window.performance?window.performance:null,e.Event=window.Event,e.MouseEvent=window.MouseEvent,e.KeyboardEvent=window.KeyboardEvent,e.EventTarget=window.EventTarget,e.History=window.History,e.Location=window.Location,e.EventListener=window.EventListener},function(t,e,n){"use strict";var r=n(2),i=n(233),o=n(241),s=n(245),a=n(244),u=n(246),c=n(239),p=n(243),l=n(235);e.Request=l.Request;var h=n(242);e.Response=h.Response;var f=n(234);e.Connection=f.Connection,e.ConnectionBackend=f.ConnectionBackend;var d=n(244);e.BrowserXhr=d.BrowserXhr;var v=n(239);e.BaseRequestOptions=v.BaseRequestOptions,e.RequestOptions=v.RequestOptions;var y=n(243);e.BaseResponseOptions=y.BaseResponseOptions,e.ResponseOptions=y.ResponseOptions;var m=n(241);e.XHRBackend=m.XHRBackend,e.XHRConnection=m.XHRConnection;var g=n(245);e.JSONPBackend=g.JSONPBackend,e.JSONPConnection=g.JSONPConnection;var _=n(233);e.Http=_.Http,e.Jsonp=_.Jsonp;var b=n(236);e.Headers=b.Headers;var P=n(238);e.ResponseType=P.ResponseType,e.ReadyState=P.ReadyState,e.RequestMethod=P.RequestMethod;var E=n(240);e.URLSearchParams=E.URLSearchParams,e.HTTP_PROVIDERS=[r.provide(i.Http,{useFactory:function(t,e){return new i.Http(t,e)},deps:[o.XHRBackend,c.RequestOptions]}),a.BrowserXhr,r.provide(c.RequestOptions,{useClass:c.BaseRequestOptions}),r.provide(p.ResponseOptions,{useClass:p.BaseResponseOptions}),o.XHRBackend],e.HTTP_BINDINGS=e.HTTP_PROVIDERS,e.JSONP_PROVIDERS=[r.provide(i.Jsonp,{useFactory:function(t,e){return new i.Jsonp(t,e)},deps:[s.JSONPBackend,c.RequestOptions]}),u.BrowserJsonp,r.provide(c.RequestOptions,{useClass:c.BaseRequestOptions}),r.provide(p.ResponseOptions,{useClass:p.BaseResponseOptions}),r.provide(s.JSONPBackend,{useClass:s.JSONPBackend_})],e.JSON_BINDINGS=e.JSONP_PROVIDERS},function(t,e,n){"use strict";function r(t,e){return t.createConnection(e).response}function i(t,e,n,r){var i=t;return u.isPresent(e)?i.merge(new f.RequestOptions({method:e.method||n,url:e.url||r,search:e.search,headers:e.headers,body:e.body})):u.isPresent(n)?i.merge(new f.RequestOptions({method:n,url:r})):i.merge(new f.RequestOptions({url:r}))}var o=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},s=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},a=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},u=n(5),c=n(12),p=n(2),l=n(234),h=n(235),f=n(239),d=n(238),v=function(){function t(t,e){this._backend=t,this._defaultOptions=e}return t.prototype.request=function(t,e){var n;if(u.isString(t))n=r(this._backend,new h.Request(i(this._defaultOptions,e,d.RequestMethod.Get,t)));else{if(!(t instanceof h.Request))throw c.makeTypeError("First argument must be a url string or Request instance.");n=r(this._backend,t)}return n},t.prototype.get=function(t,e){return r(this._backend,new h.Request(i(this._defaultOptions,e,d.RequestMethod.Get,t)))},t.prototype.post=function(t,e,n){return r(this._backend,new h.Request(i(this._defaultOptions.merge(new f.RequestOptions({body:e})),n,d.RequestMethod.Post,t)))},t.prototype.put=function(t,e,n){return r(this._backend,new h.Request(i(this._defaultOptions.merge(new f.RequestOptions({body:e})),n,d.RequestMethod.Put,t)))},t.prototype["delete"]=function(t,e){return r(this._backend,new h.Request(i(this._defaultOptions,e,d.RequestMethod.Delete,t)))},t.prototype.patch=function(t,e,n){return r(this._backend,new h.Request(i(this._defaultOptions.merge(new f.RequestOptions({body:e})),n,d.RequestMethod.Patch,t)))},t.prototype.head=function(t,e){return r(this._backend,new h.Request(i(this._defaultOptions,e,d.RequestMethod.Head,t)))},t=s([p.Injectable(),a("design:paramtypes",[l.ConnectionBackend,f.RequestOptions])],t)}();e.Http=v;var y=function(t){function e(e,n){t.call(this,e,n)}return o(e,t),e.prototype.request=function(t,e){var n;if(u.isString(t)&&(t=new h.Request(i(this._defaultOptions,e,d.RequestMethod.Get,t))),!(t instanceof h.Request))throw c.makeTypeError("First argument must be a url string or Request instance.");return t.method!==d.RequestMethod.Get&&c.makeTypeError("JSONP requests must use GET request method."),n=r(this._backend,t)},e=s([p.Injectable(),a("design:paramtypes",[l.ConnectionBackend,f.RequestOptions])],e)}(v);e.Jsonp=y},function(t,e){"use strict";var n=function(){function t(){}return t}();e.ConnectionBackend=n;var r=function(){function t(){}return t}();e.Connection=r},function(t,e,n){"use strict";var r=n(236),i=n(237),o=n(5),s=function(){function t(t){var e=t.url;if(this.url=t.url,o.isPresent(t.search)){var n=t.search.toString();if(n.length>0){var s="?";o.StringWrapper.contains(this.url,"?")&&(s="&"==this.url[this.url.length-1]?"":"&"),this.url=e+s+n}}this._body=t.body,this.method=i.normalizeMethodName(t.method),this.headers=new r.Headers(t.headers)}return t.prototype.text=function(){return o.isPresent(this._body)?this._body.toString():""},t}();e.Request=s},function(t,e,n){"use strict";var r=n(5),i=n(12),o=n(15),s=function(){function t(e){var n=this;return e instanceof t?void(this._headersMap=e._headersMap):(this._headersMap=new o.Map,void(r.isBlank(e)||o.StringMapWrapper.forEach(e,function(t,e){n._headersMap.set(e,o.isListLikeIterable(t)?t:[t])})))}return t.fromResponseHeaderString=function(e){return e.trim().split("\n").map(function(t){return t.split(":")}).map(function(t){var e=t[0],n=t.slice(1);return[e.trim(),n.join(":").trim()]}).reduce(function(t,e){var n=e[0],r=e[1];return!t.set(n,r)&&t},new t)},t.prototype.append=function(t,e){var n=this._headersMap.get(t),r=o.isListLikeIterable(n)?n:[];r.push(e),this._headersMap.set(t,r)},t.prototype["delete"]=function(t){this._headersMap["delete"](t)},t.prototype.forEach=function(t){this._headersMap.forEach(t)},t.prototype.get=function(t){return o.ListWrapper.first(this._headersMap.get(t))},t.prototype.has=function(t){return this._headersMap.has(t)},t.prototype.keys=function(){return o.MapWrapper.keys(this._headersMap)},t.prototype.set=function(t,e){var n=[];if(o.isListLikeIterable(e)){var r=e.join(",");n.push(r)}else n.push(e);this._headersMap.set(t,n)},t.prototype.values=function(){return o.MapWrapper.values(this._headersMap)},t.prototype.toJSON=function(){var t={};return this._headersMap.forEach(function(e,n){var r=[];o.iterateListLike(e,function(t){return r=o.ListWrapper.concat(r,t.split(","))}),t[n]=r}),t},t.prototype.getAll=function(t){var e=this._headersMap.get(t);return o.isListLikeIterable(e)?e:[]},t.prototype.entries=function(){throw new i.BaseException('"entries" method is not implemented on Headers class')},t}();e.Headers=s},function(t,e,n){"use strict";function r(t){if(o.isString(t)){var e=t;if(t=t.replace(/(\w)(\w*)/g,function(t,e,n){return e.toUpperCase()+n.toLowerCase()}),t=s.RequestMethod[t],"number"!=typeof t)throw a.makeTypeError('Invalid request method. The method "'+e+'" is not supported.')}return t}function i(t){return"responseURL"in t?t.responseURL:/^X-Request-URL:/m.test(t.getAllResponseHeaders())?t.getResponseHeader("X-Request-URL"):void 0}var o=n(5),s=n(238),a=n(12);e.normalizeMethodName=r,e.isSuccess=function(t){return t>=200&&300>t},e.getResponseURL=i;var u=n(5);e.isJsObject=u.isJsObject},function(t,e){"use strict";!function(t){t[t.Get=0]="Get",t[t.Post=1]="Post",t[t.Put=2]="Put",t[t.Delete=3]="Delete",t[t.Options=4]="Options",t[t.Head=5]="Head",t[t.Patch=6]="Patch"}(e.RequestMethod||(e.RequestMethod={}));e.RequestMethod;!function(t){t[t.Unsent=0]="Unsent",t[t.Open=1]="Open",t[t.HeadersReceived=2]="HeadersReceived",t[t.Loading=3]="Loading",t[t.Done=4]="Done",t[t.Cancelled=5]="Cancelled"}(e.ReadyState||(e.ReadyState={}));e.ReadyState;!function(t){t[t.Basic=0]="Basic",t[t.Cors=1]="Cors",t[t.Default=2]="Default",t[t.Error=3]="Error",t[t.Opaque=4]="Opaque"}(e.ResponseType||(e.ResponseType={}));e.ResponseType},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(5),a=n(236),u=n(238),c=n(2),p=n(240),l=n(237),h=function(){function t(t){var e=void 0===t?{}:t,n=e.method,r=e.headers,i=e.body,o=e.url,a=e.search;this.method=s.isPresent(n)?l.normalizeMethodName(n):null,this.headers=s.isPresent(r)?r:null,this.body=s.isPresent(i)?i:null,this.url=s.isPresent(o)?o:null,this.search=s.isPresent(a)?s.isString(a)?new p.URLSearchParams(a):a:null}return t.prototype.merge=function(e){return new t({method:s.isPresent(e)&&s.isPresent(e.method)?e.method:this.method,headers:s.isPresent(e)&&s.isPresent(e.headers)?e.headers:this.headers,body:s.isPresent(e)&&s.isPresent(e.body)?e.body:this.body,url:s.isPresent(e)&&s.isPresent(e.url)?e.url:this.url,search:s.isPresent(e)&&s.isPresent(e.search)?s.isString(e.search)?new p.URLSearchParams(e.search):e.search.clone():this.search})},t}();e.RequestOptions=h;var f=function(t){function e(){t.call(this,{method:u.RequestMethod.Get,headers:new a.Headers})}return r(e,t),e=i([c.Injectable(),o("design:paramtypes",[])],e)}(h);e.BaseRequestOptions=f},function(t,e,n){"use strict";function r(t){void 0===t&&(t="");var e=new o.Map;if(t.length>0){var n=t.split("&");n.forEach(function(t){var n=t.split("="),r=n[0],o=n[1],s=i.isPresent(e.get(r))?e.get(r):[];s.push(o),e.set(r,s)})}return e}var i=n(5),o=n(15),s=function(){function t(t){void 0===t&&(t=""),this.rawParams=t,this.paramsMap=r(t)}return t.prototype.clone=function(){var e=new t;return e.appendAll(this),e},t.prototype.has=function(t){return this.paramsMap.has(t)},t.prototype.get=function(t){var e=this.paramsMap.get(t);return o.isListLikeIterable(e)?o.ListWrapper.first(e):null},t.prototype.getAll=function(t){var e=this.paramsMap.get(t);return i.isPresent(e)?e:[]},t.prototype.set=function(t,e){var n=this.paramsMap.get(t),r=i.isPresent(n)?n:[];o.ListWrapper.clear(r),r.push(e),this.paramsMap.set(t,r)},t.prototype.setAll=function(t){var e=this;t.paramsMap.forEach(function(t,n){var r=e.paramsMap.get(n),s=i.isPresent(r)?r:[];o.ListWrapper.clear(s),s.push(t[0]),e.paramsMap.set(n,s)})},t.prototype.append=function(t,e){var n=this.paramsMap.get(t),r=i.isPresent(n)?n:[];r.push(e),this.paramsMap.set(t,r)},t.prototype.appendAll=function(t){var e=this;t.paramsMap.forEach(function(t,n){for(var r=e.paramsMap.get(n),o=i.isPresent(r)?r:[],s=0;so?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(238),s=n(242),a=n(236),u=n(243),c=n(2),p=n(244),l=n(5),h=n(42),f=n(237),d=function(){function t(t,e,n){var r=this;this.request=t,this.response=new h.Observable(function(i){var c=e.build();c.open(o.RequestMethod[t.method].toUpperCase(),t.url);var p=function(){var t=l.isPresent(c.response)?c.response:c.responseText,e=a.Headers.fromResponseHeaderString(c.getAllResponseHeaders()),r=f.getResponseURL(c),o=1223===c.status?204:c.status;0===o&&(o=t?200:0);var p=new u.ResponseOptions({body:t,status:o,headers:e,url:r});l.isPresent(n)&&(p=n.merge(p));var h=new s.Response(p);return f.isSuccess(o)?(i.next(h),void i.complete()):void i.error(h)},h=function(t){var e=new u.ResponseOptions({body:t,type:o.ResponseType.Error});l.isPresent(n)&&(e=n.merge(e)),i.error(new s.Response(e))};return l.isPresent(t.headers)&&t.headers.forEach(function(t,e){return c.setRequestHeader(e,t.join(","))}),c.addEventListener("load",p),c.addEventListener("error",h),c.send(r.request.text()),function(){c.removeEventListener("load",p),c.removeEventListener("error",h),c.abort()}})}return t}();e.XHRConnection=d;var v=function(){function t(t,e){this._browserXHR=t,this._baseResponseOptions=e}return t.prototype.createConnection=function(t){return new d(t,this._browserXHR,this._baseResponseOptions)},t=r([c.Injectable(),i("design:paramtypes",[p.BrowserXhr,u.ResponseOptions])],t)}();e.XHRBackend=v},function(t,e,n){"use strict";var r=n(5),i=n(12),o=n(237),s=function(){function t(t){this._body=t.body,this.status=t.status,this.ok=this.status>=200&&this.status<=299,this.statusText=t.statusText,this.headers=t.headers,this.type=t.type,this.url=t.url}return t.prototype.blob=function(){throw new i.BaseException('"blob()" method not implemented on Response superclass')},t.prototype.json=function(){var t;return o.isJsObject(this._body)?t=this._body:r.isString(this._body)&&(t=r.Json.parse(this._body)),t},t.prototype.text=function(){return this._body.toString()},t.prototype.arrayBuffer=function(){throw new i.BaseException('"arrayBuffer()" method not implemented on Response superclass')},t}();e.Response=s},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(2),a=n(5),u=n(236),c=n(238),p=function(){function t(t){var e=void 0===t?{}:t,n=e.body,r=e.status,i=e.headers,o=e.statusText,s=e.type,u=e.url;this.body=a.isPresent(n)?n:null,this.status=a.isPresent(r)?r:null,this.headers=a.isPresent(i)?i:null,this.statusText=a.isPresent(o)?o:null,this.type=a.isPresent(s)?s:null,this.url=a.isPresent(u)?u:null}return t.prototype.merge=function(e){return new t({body:a.isPresent(e)&&a.isPresent(e.body)?e.body:this.body,status:a.isPresent(e)&&a.isPresent(e.status)?e.status:this.status,headers:a.isPresent(e)&&a.isPresent(e.headers)?e.headers:this.headers,statusText:a.isPresent(e)&&a.isPresent(e.statusText)?e.statusText:this.statusText,type:a.isPresent(e)&&a.isPresent(e.type)?e.type:this.type,url:a.isPresent(e)&&a.isPresent(e.url)?e.url:this.url})},t}();e.ResponseOptions=p;var l=function(t){function e(){t.call(this,{status:200,statusText:"Ok",type:c.ResponseType.Default,headers:new u.Headers})}return r(e,t),e=i([s.Injectable(),o("design:paramtypes",[])],e)}(p);e.BaseResponseOptions=l},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(2),s=function(){function t(){}return t.prototype.build=function(){return new XMLHttpRequest},t=r([o.Injectable(),i("design:paramtypes",[])],t)}();e.BrowserXhr=s},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(234),a=n(238),u=n(242),c=n(243),p=n(2),l=n(246),h=n(12),f=n(5),d=n(42),v="JSONP injected script did not invoke callback.",y="JSONP requests must use GET request method.",m=function(){function t(){}return t}();e.JSONPConnection=m;var g=function(t){function e(e,n,r){var i=this;if(t.call(this),this._dom=n,this.baseResponseOptions=r,this._finished=!1,e.method!==a.RequestMethod.Get)throw h.makeTypeError(y);this.request=e,this.response=new d.Observable(function(t){i.readyState=a.ReadyState.Loading;var o=i._id=n.nextRequestID();n.exposeConnection(o,i);var s=n.requestCallback(i._id),p=e.url;p.indexOf("=JSONP_CALLBACK&")>-1?p=f.StringWrapper.replace(p,"=JSONP_CALLBACK&","="+s+"&"):p.lastIndexOf("=JSONP_CALLBACK")===p.length-"=JSONP_CALLBACK".length&&(p=p.substring(0,p.length-"=JSONP_CALLBACK".length)+("="+s));var l=i._script=n.build(p),h=function(e){if(i.readyState!==a.ReadyState.Cancelled){if(i.readyState=a.ReadyState.Done,n.cleanup(l),!i._finished){var o=new c.ResponseOptions({body:v,type:a.ResponseType.Error,url:p});return f.isPresent(r)&&(o=r.merge(o)),void t.error(new u.Response(o))}var s=new c.ResponseOptions({body:i._responseData,url:p});f.isPresent(i.baseResponseOptions)&&(s=i.baseResponseOptions.merge(s)),t.next(new u.Response(s)),t.complete()}},d=function(e){if(i.readyState!==a.ReadyState.Cancelled){i.readyState=a.ReadyState.Done,n.cleanup(l);var o=new c.ResponseOptions({body:e.message,type:a.ResponseType.Error});f.isPresent(r)&&(o=r.merge(o)),t.error(new u.Response(o))}};return l.addEventListener("load",h),l.addEventListener("error",d),n.send(l),function(){i.readyState=a.ReadyState.Cancelled,l.removeEventListener("load",h),l.removeEventListener("error",d),f.isPresent(l)&&i._dom.cleanup(l)}})}return r(e,t),e.prototype.finished=function(t){this._finished=!0,this._dom.removeConnection(this._id),this.readyState!==a.ReadyState.Cancelled&&(this._responseData=t)},e}(m);e.JSONPConnection_=g;var _=function(t){function e(){t.apply(this,arguments)}return r(e,t),e}(s.ConnectionBackend);e.JSONPBackend=_;var b=function(t){function e(e,n){t.call(this),this._browserJSONP=e,this._baseResponseOptions=n}return r(e,t),e.prototype.createConnection=function(t){return new g(t,this._browserJSONP,this._baseResponseOptions)},e=i([p.Injectable(),o("design:paramtypes",[l.BrowserJsonp,c.ResponseOptions])],e)}(_);e.JSONPBackend_=b},function(t,e,n){"use strict";function r(){return null===c&&(c=a.global[e.JSONP_HOME]={}),c}var i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(2),a=n(5),u=0;e.JSONP_HOME="__ng_jsonp__";var c=null,p=function(){function t(){}return t.prototype.build=function(t){var e=document.createElement("script");return e.src=t,e},t.prototype.nextRequestID=function(){return"__req"+u++},t.prototype.requestCallback=function(t){return e.JSONP_HOME+"."+t+".finished"},t.prototype.exposeConnection=function(t,e){var n=r();n[t]=e},t.prototype.removeConnection=function(t){var e=r();e[t]=null},t.prototype.send=function(t){document.body.appendChild(t)},t.prototype.cleanup=function(t){t.parentNode&&t.parentNode.removeChild(t)},t=i([s.Injectable(),o("design:paramtypes",[])],t)}();e.BrowserJsonp=p},function(t,e,n){"use strict";function r(t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n])}var i=n(248);e.Router=i.Router;var o=n(272);e.RouterOutlet=o.RouterOutlet;var s=n(274);e.RouterLink=s.RouterLink;var a=n(260);e.RouteParams=a.RouteParams,e.RouteData=a.RouteData;var u=n(256);e.RouteRegistry=u.RouteRegistry,e.ROUTER_PRIMARY_COMPONENT=u.ROUTER_PRIMARY_COMPONENT,r(n(269));var c=n(273);e.CanActivate=c.CanActivate;var p=n(260);e.Instruction=p.Instruction,e.ComponentInstruction=p.ComponentInstruction;var l=n(2);e.OpaqueToken=l.OpaqueToken;var h=n(275);e.ROUTER_PROVIDERS_COMMON=h.ROUTER_PROVIDERS_COMMON;var f=n(276);e.ROUTER_PROVIDERS=f.ROUTER_PROVIDERS,e.ROUTER_BINDINGS=f.ROUTER_BINDINGS;var d=n(272),v=n(274),y=n(5);e.ROUTER_DIRECTIVES=y.CONST_EXPR([d.RouterOutlet,v.RouterLink])},function(t,e,n){"use strict";function r(t,e){var n=y;return p.isBlank(t.component)?n:(p.isPresent(t.child)&&(n=r(t.child,p.isPresent(e)?e.child:null)),n.then(function(n){if(0==n)return!1;if(t.component.reuse)return!0;var r=v.getCanActivateHook(t.component.componentType);return p.isPresent(r)?r(t.component,p.isPresent(e)?e.component:null):!0}))}var i=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},o=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},s=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},a=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},u=n(40),c=n(15),p=n(5),l=n(12),h=n(249),f=n(2),d=n(256),v=n(270),y=u.PromiseWrapper.resolve(!0),m=u.PromiseWrapper.resolve(!1),g=function(){function t(t,e,n,r){this.registry=t,this.parent=e,this.hostComponent=n,this.root=r,this.navigating=!1,this.currentInstruction=null,this._currentNavigation=y,this._outlet=null,this._auxRouters=new c.Map,this._subject=new u.EventEmitter}return t.prototype.childRouter=function(t){return this._childRouter=new b(this,t)},t.prototype.auxRouter=function(t){return new b(this,t)},t.prototype.registerPrimaryOutlet=function(t){if(p.isPresent(t.name))throw new l.BaseException("registerPrimaryOutlet expects to be called with an unnamed outlet.");if(p.isPresent(this._outlet))throw new l.BaseException("Primary outlet is already registered.");return this._outlet=t,p.isPresent(this.currentInstruction)?this.commit(this.currentInstruction,!1):y},t.prototype.unregisterPrimaryOutlet=function(t){if(p.isPresent(t.name))throw new l.BaseException("registerPrimaryOutlet expects to be called with an unnamed outlet.");this._outlet=null},t.prototype.registerAuxOutlet=function(t){var e=t.name;if(p.isBlank(e))throw new l.BaseException("registerAuxOutlet expects to be called with an outlet with a name.");var n=this.auxRouter(this.hostComponent);this._auxRouters.set(e,n),n._outlet=t;var r;return p.isPresent(this.currentInstruction)&&p.isPresent(r=this.currentInstruction.auxInstruction[e])?n.commit(r):y},t.prototype.isRouteActive=function(t){var e=this,n=this;if(p.isBlank(this.currentInstruction))return!1;for(;p.isPresent(n.parent)&&p.isPresent(t.child);)n=n.parent,t=t.child;if(p.isBlank(t.component)||p.isBlank(this.currentInstruction.component)||this.currentInstruction.component.routeName!=t.component.routeName)return!1;var r=!0;return p.isPresent(this.currentInstruction.component.params)&&c.StringMapWrapper.forEach(t.component.params,function(t,n){e.currentInstruction.component.params[n]!==t&&(r=!1)}),r},t.prototype.config=function(t){var e=this;return t.forEach(function(t){e.registry.config(e.hostComponent,t)}),this.renavigate()},t.prototype.navigate=function(t){var e=this.generate(t);return this.navigateByInstruction(e,!1)},t.prototype.navigateByUrl=function(t,e){var n=this;return void 0===e&&(e=!1),this._currentNavigation=this._currentNavigation.then(function(r){return n.lastNavigationAttempt=t,n._startNavigating(),n._afterPromiseFinishNavigating(n.recognize(t).then(function(t){return p.isBlank(t)?!1:n._navigate(t,e)}))})},t.prototype.navigateByInstruction=function(t,e){var n=this;return void 0===e&&(e=!1),p.isBlank(t)?m:this._currentNavigation=this._currentNavigation.then(function(r){return n._startNavigating(),n._afterPromiseFinishNavigating(n._navigate(t,e))})},t.prototype._settleInstruction=function(t){var e=this;return t.resolveComponent().then(function(n){var r=[];return p.isPresent(t.component)&&(t.component.reuse=!1),p.isPresent(t.child)&&r.push(e._settleInstruction(t.child)),c.StringMapWrapper.forEach(t.auxInstruction,function(t,n){r.push(e._settleInstruction(t))}),u.PromiseWrapper.all(r)})},t.prototype._navigate=function(t,e){var n=this;return this._settleInstruction(t).then(function(e){return n._routerCanReuse(t)}).then(function(e){return n._canActivate(t)}).then(function(r){return r?n._routerCanDeactivate(t).then(function(r){return r?n.commit(t,e).then(function(e){return n._emitNavigationFinish(t.toRootUrl()),!0}):void 0}):!1})},t.prototype._emitNavigationFinish=function(t){u.ObservableWrapper.callEmit(this._subject,t)},t.prototype._emitNavigationFail=function(t){u.ObservableWrapper.callError(this._subject,t)},t.prototype._afterPromiseFinishNavigating=function(t){var e=this;return u.PromiseWrapper.catchError(t.then(function(t){return e._finishNavigating()}),function(t){throw e._finishNavigating(),t})},t.prototype._routerCanReuse=function(t){var e=this;return p.isBlank(this._outlet)?m:p.isBlank(t.component)?y:this._outlet.routerCanReuse(t.component).then(function(n){return t.component.reuse=n,n&&p.isPresent(e._childRouter)&&p.isPresent(t.child)?e._childRouter._routerCanReuse(t.child):void 0})},t.prototype._canActivate=function(t){return r(t,this.currentInstruction)},t.prototype._routerCanDeactivate=function(t){var e=this;if(p.isBlank(this._outlet))return y;var n,r=null,i=!1,o=null;return p.isPresent(t)&&(r=t.child,o=t.component,i=p.isBlank(t.component)||t.component.reuse),n=i?y:this._outlet.routerCanDeactivate(o),n.then(function(t){return 0==t?!1:p.isPresent(e._childRouter)?e._childRouter._routerCanDeactivate(r):!0})},t.prototype.commit=function(t,e){var n=this;void 0===e&&(e=!1),this.currentInstruction=t;var r=y;if(p.isPresent(this._outlet)&&p.isPresent(t.component)){var i=t.component;r=i.reuse?this._outlet.reuse(i):this.deactivate(t).then(function(t){return n._outlet.activate(i)}),p.isPresent(t.child)&&(r=r.then(function(e){return p.isPresent(n._childRouter)?n._childRouter.commit(t.child):void 0}))}var o=[];return this._auxRouters.forEach(function(e,n){p.isPresent(t.auxInstruction[n])&&o.push(e.commit(t.auxInstruction[n]))}),r.then(function(t){return u.PromiseWrapper.all(o)})},t.prototype._startNavigating=function(){this.navigating=!0},t.prototype._finishNavigating=function(){this.navigating=!1},t.prototype.subscribe=function(t,e){return u.ObservableWrapper.subscribe(this._subject,t,e)},t.prototype.deactivate=function(t){var e=this,n=null,r=null;p.isPresent(t)&&(n=t.child,r=t.component);var i=y;return p.isPresent(this._childRouter)&&(i=this._childRouter.deactivate(n)),p.isPresent(this._outlet)&&(i=i.then(function(t){return e._outlet.deactivate(r)})),i},t.prototype.recognize=function(t){var e=this._getAncestorInstructions();return this.registry.recognize(t,e)},t.prototype._getAncestorInstructions=function(){for(var t=[this.currentInstruction],e=this;p.isPresent(e=e.parent);)t.unshift(e.currentInstruction);return t},t.prototype.renavigate=function(){return p.isBlank(this.lastNavigationAttempt)?this._currentNavigation:this.navigateByUrl(this.lastNavigationAttempt)},t.prototype.generate=function(t){var e=this._getAncestorInstructions();return this.registry.generate(t,e)},t=o([f.Injectable(),s("design:paramtypes",[d.RouteRegistry,t,Object,t])],t)}();e.Router=g;var _=function(t){function e(e,n,r){var i=this;t.call(this,e,null,r),this.root=this,this._location=n,this._locationSub=this._location.subscribe(function(t){i.recognize(t.url).then(function(e){p.isPresent(e)?i.navigateByInstruction(e,p.isPresent(t.pop)).then(function(n){if(!p.isPresent(t.pop)||"hashchange"==t.type){var r=e.toUrlPath(),o=e.toUrlQuery();r.length>0&&"/"!=r[0]&&(r="/"+r),"hashchange"==t.type?e.toRootUrl()!=i._location.path()&&i._location.replaceState(r,o):i._location.go(r,o)}}):i._emitNavigationFail(t.url)})}),this.registry.configFromComponent(r),this.navigateByUrl(n.path())}return i(e,t),e.prototype.commit=function(e,n){var r=this;void 0===n&&(n=!1);var i=e.toUrlPath(),o=e.toUrlQuery();i.length>0&&"/"!=i[0]&&(i="/"+i);var s=t.prototype.commit.call(this,e);return n||(s=s.then(function(t){ +r._location.go(i,o)})),s},e.prototype.dispose=function(){p.isPresent(this._locationSub)&&(u.ObservableWrapper.dispose(this._locationSub),this._locationSub=null)},e=o([f.Injectable(),a(2,f.Inject(d.ROUTER_PRIMARY_COMPONENT)),s("design:paramtypes",[d.RouteRegistry,h.Location,p.Type])],e)}(g);e.RootRouter=_;var b=function(t){function e(e,n){t.call(this,e.registry,e,n,e.root),this.parent=e}return i(e,t),e.prototype.navigateByUrl=function(t,e){return void 0===e&&(e=!1),this.parent.navigateByUrl(t,e)},e.prototype.navigateByInstruction=function(t,e){return void 0===e&&(e=!1),this.parent.navigateByInstruction(t,e)},e}(g)},function(t,e,n){"use strict";function r(t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n])}r(n(250))},function(t,e,n){"use strict";function r(t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n])}r(n(251)),r(n(252)),r(n(253)),r(n(255)),r(n(254))},function(t,e){"use strict";var n=function(){function t(){}return Object.defineProperty(t.prototype,"pathname",{get:function(){return null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"search",{get:function(){return null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hash",{get:function(){return null},enumerable:!0,configurable:!0}),t}();e.PlatformLocation=n},function(t,e,n){"use strict";var r=n(5),i=n(2),o=function(){function t(){}return t}();e.LocationStrategy=o,e.APP_BASE_HREF=r.CONST_EXPR(new i.OpaqueToken("appBaseHref"))},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},a=n(2),u=n(252),c=n(254),p=n(251),l=n(5),h=function(t){function e(e,n){t.call(this),this._platformLocation=e,this._baseHref="",l.isPresent(n)&&(this._baseHref=n)}return r(e,t),e.prototype.onPopState=function(t){this._platformLocation.onPopState(t),this._platformLocation.onHashChange(t)},e.prototype.getBaseHref=function(){return this._baseHref},e.prototype.path=function(){var t=this._platformLocation.hash;return l.isPresent(t)||(t="#"),t.length>0?t.substring(1):t},e.prototype.prepareExternalUrl=function(t){var e=c.Location.joinWithSlash(this._baseHref,t);return e.length>0?"#"+e:e},e.prototype.pushState=function(t,e,n,r){var i=this.prepareExternalUrl(n+c.Location.normalizeQueryParams(r));0==i.length&&(i=this._platformLocation.pathname),this._platformLocation.pushState(t,e,i)},e.prototype.replaceState=function(t,e,n,r){var i=this.prepareExternalUrl(n+c.Location.normalizeQueryParams(r));0==i.length&&(i=this._platformLocation.pathname),this._platformLocation.replaceState(t,e,i)},e.prototype.forward=function(){this._platformLocation.forward()},e.prototype.back=function(){this._platformLocation.back()},e=i([a.Injectable(),s(1,a.Optional()),s(1,a.Inject(u.APP_BASE_HREF)),o("design:paramtypes",[p.PlatformLocation,String])],e)}(u.LocationStrategy);e.HashLocationStrategy=h},function(t,e,n){"use strict";function r(t,e){return t.length>0&&e.startsWith(t)?e.substring(t.length):e}function i(t){return/\/index.html$/g.test(t)?t.substring(0,t.length-11):t}var o=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},s=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},a=n(40),u=n(2),c=n(252),p=function(){function t(e){var n=this;this.platformStrategy=e,this._subject=new a.EventEmitter;var r=this.platformStrategy.getBaseHref();this._baseHref=t.stripTrailingSlash(i(r)),this.platformStrategy.onPopState(function(t){a.ObservableWrapper.callEmit(n._subject,{url:n.path(),pop:!0,type:t.type})})}return t.prototype.path=function(){return this.normalize(this.platformStrategy.path())},t.prototype.normalize=function(e){return t.stripTrailingSlash(r(this._baseHref,i(e)))},t.prototype.prepareExternalUrl=function(t){return t.length>0&&!t.startsWith("/")&&(t="/"+t),this.platformStrategy.prepareExternalUrl(t)},t.prototype.go=function(t,e){void 0===e&&(e=""),this.platformStrategy.pushState(null,"",t,e)},t.prototype.replaceState=function(t,e){void 0===e&&(e=""),this.platformStrategy.replaceState(null,"",t,e)},t.prototype.forward=function(){this.platformStrategy.forward()},t.prototype.back=function(){this.platformStrategy.back()},t.prototype.subscribe=function(t,e,n){return void 0===e&&(e=null),void 0===n&&(n=null),a.ObservableWrapper.subscribe(this._subject,t,e,n)},t.normalizeQueryParams=function(t){return t.length>0&&"?"!=t.substring(0,1)?"?"+t:t},t.joinWithSlash=function(t,e){if(0==t.length)return e;if(0==e.length)return t;var n=0;return t.endsWith("/")&&n++,e.startsWith("/")&&n++,2==n?t+e.substring(1):1==n?t+e:t+"/"+e},t.stripTrailingSlash=function(t){return/\/$/g.test(t)&&(t=t.substring(0,t.length-1)),t},t=o([u.Injectable(),s("design:paramtypes",[c.LocationStrategy])],t)}();e.Location=p},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},a=n(2),u=n(5),c=n(12),p=n(251),l=n(252),h=n(254),f=function(t){function e(e,n){if(t.call(this),this._platformLocation=e,u.isBlank(n)&&(n=this._platformLocation.getBaseHrefFromDOM()),u.isBlank(n))throw new c.BaseException("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");this._baseHref=n}return r(e,t),e.prototype.onPopState=function(t){this._platformLocation.onPopState(t),this._platformLocation.onHashChange(t)},e.prototype.getBaseHref=function(){return this._baseHref},e.prototype.prepareExternalUrl=function(t){return h.Location.joinWithSlash(this._baseHref,t)},e.prototype.path=function(){return this._platformLocation.pathname+h.Location.normalizeQueryParams(this._platformLocation.search)},e.prototype.pushState=function(t,e,n,r){var i=this.prepareExternalUrl(n+h.Location.normalizeQueryParams(r));this._platformLocation.pushState(t,e,i)},e.prototype.replaceState=function(t,e,n,r){var i=this.prepareExternalUrl(n+h.Location.normalizeQueryParams(r));this._platformLocation.replaceState(t,e,i)},e.prototype.forward=function(){this._platformLocation.forward()},e.prototype.back=function(){this._platformLocation.back()},e=i([a.Injectable(),s(1,a.Optional()),s(1,a.Inject(l.APP_BASE_HREF)),o("design:paramtypes",[p.PlatformLocation,String])],e)}(l.LocationStrategy);e.PathLocationStrategy=f},function(t,e,n){"use strict";function r(t){var e=[];return t.forEach(function(t){if(h.isString(t)){var n=t;e=e.concat(n.split("/"))}else e.push(t)}),e}function i(t){if(t=t.filter(function(t){return h.isPresent(t)}),0==t.length)return null;if(1==t.length)return t[0];var e=t[0],n=t.slice(1);return n.reduce(function(t,e){return-1==o(e.specificity,t.specificity)?e:t},e)}function o(t,e){for(var n=h.Math.min(t.length,e.length),r=0;n>r;r+=1){var i=h.StringWrapper.charCodeAt(t,r),o=h.StringWrapper.charCodeAt(e,r),s=o-i;if(0!=s)return s}return t.length-e.length}function s(t,e){if(h.isType(t)){var n=d.reflector.annotations(t);if(h.isPresent(n))for(var r=0;ro?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},u=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},c=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},p=n(15),l=n(40),h=n(5),f=n(12),d=n(18),v=n(2),y=n(257),m=n(258),g=n(261),_=n(260),b=n(268),P=n(259),E=l.PromiseWrapper.resolve(null);e.ROUTER_PRIMARY_COMPONENT=h.CONST_EXPR(new v.OpaqueToken("RouterPrimaryComponent"));var w=function(){function t(t){this._rootComponent=t,this._rules=new p.Map}return t.prototype.config=function(t,e){e=b.normalizeRouteConfig(e,this),e instanceof y.Route?b.assertComponentExists(e.component,e.path):e instanceof y.AuxRoute&&b.assertComponentExists(e.component,e.path);var n=this._rules.get(t);h.isBlank(n)&&(n=new g.RuleSet,this._rules.set(t,n));var r=n.config(e);e instanceof y.Route&&(r?s(e.component,e.path):this.configFromComponent(e.component))},t.prototype.configFromComponent=function(t){var e=this;if(h.isType(t)&&!this._rules.has(t)){var n=d.reflector.annotations(t);if(h.isPresent(n))for(var r=0;r0?[p.ListWrapper.last(e)]:[],i=r._auxRoutesToUnresolved(t.remainingAux,n),o=new _.ResolvedInstruction(t.instruction,null,i);if(h.isBlank(t.instruction)||t.instruction.terminal)return o;var s=e.concat([o]);return r._recognize(t.remaining,s).then(function(t){return h.isBlank(t)?null:t instanceof _.RedirectInstruction?t:(o.child=t,o)})}if(t instanceof m.RedirectMatch){var o=r.generate(t.redirectTo,e.concat([null]));return new _.RedirectInstruction(o.component,o.child,o.auxInstruction,t.specificity)}})});return!h.isBlank(t)&&""!=t.path||0!=u.length?l.PromiseWrapper.all(c).then(i):l.PromiseWrapper.resolve(this.generateDefault(s))},t.prototype._auxRoutesToUnresolved=function(t,e){var n=this,r={};return t.forEach(function(t){r[t.path]=new _.UnresolvedInstruction(function(){return n._recognize(t,e,!0)})}),r},t.prototype.generate=function(t,e,n){void 0===n&&(n=!1);var i,o=r(t);if(""==p.ListWrapper.first(o))o.shift(),i=p.ListWrapper.first(e),e=[];else if(i=e.length>0?e.pop():null,"."==p.ListWrapper.first(o))o.shift();else if(".."==p.ListWrapper.first(o))for(;".."==p.ListWrapper.first(o);){if(e.length<=0)throw new f.BaseException('Link "'+p.ListWrapper.toJSON(t)+'" has too many "../" segments.');i=e.pop(),o=p.ListWrapper.slice(o,1)}else{var s=p.ListWrapper.first(o),a=this._rootComponent,u=null;if(e.length>1){var c=e[e.length-1],l=e[e.length-2];a=c.component.componentType,u=l.component.componentType}else 1==e.length&&(a=e[0].component.componentType,u=this._rootComponent);var d=this.hasRoute(s,a),v=h.isPresent(u)&&this.hasRoute(s,u);if(v&&d){var y='Link "'+p.ListWrapper.toJSON(t)+'" is ambiguous, use "./" or "../" to disambiguate.';throw new f.BaseException(y)}v&&(i=e.pop())}if(""==o[o.length-1]&&o.pop(),o.length>0&&""==o[0]&&o.shift(),o.length<1){var y='Link "'+p.ListWrapper.toJSON(t)+'" must include a route name.';throw new f.BaseException(y)}for(var m=this._generate(o,e,i,n,t),g=e.length-1;g>=0;g--){var _=e[g];if(h.isBlank(_))break;m=_.replaceChild(m)}return m},t.prototype._generate=function(t,e,n,r,i){var o=this;void 0===r&&(r=!1);var s=this._rootComponent,a=null,u={},c=p.ListWrapper.last(e);if(h.isPresent(c)&&h.isPresent(c.component)&&(s=c.component.componentType),0==t.length){var l=this.generateDefault(s);if(h.isBlank(l))throw new f.BaseException('Link "'+p.ListWrapper.toJSON(i)+'" does not resolve to a terminal instruction.');return l}h.isPresent(n)&&!r&&(u=p.StringMapWrapper.merge(n.auxInstruction,u),a=n.component);var d=this._rules.get(s);if(h.isBlank(d))throw new f.BaseException('Component "'+h.getTypeNameForDebugging(s)+'" has no route config.');var v=0,y={};if(v=t.length;else{var O=e.concat([R]),T=t.slice(v);S=this._generate(T,O,null,!1,i)}R.child=S}return R},t.prototype.hasRoute=function(t,e){var n=this._rules.get(e);return h.isBlank(n)?!1:n.hasRoute(t)},t.prototype.generateDefault=function(t){var e=this;if(h.isBlank(t))return null;var n=this._rules.get(t);if(h.isBlank(n)||h.isBlank(n.defaultRule))return null;var r=null;if(h.isPresent(n.defaultRule.handler.componentType)){var i=n.defaultRule.generate({});return n.defaultRule.terminal||(r=this.generateDefault(n.defaultRule.handler.componentType)),new _.DefaultInstruction(i,r)}return new _.UnresolvedInstruction(function(){return n.defaultRule.handler.resolveComponentType().then(function(n){return e.generateDefault(t)})})},t=a([v.Injectable(),c(0,v.Inject(e.ROUTER_PRIMARY_COMPONENT)),u("design:paramtypes",[h.Type])],t)}();e.RouteRegistry=w},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(5),a=function(){function t(t){this.configs=t}return t=i([s.CONST(),o("design:paramtypes",[Array])],t)}();e.RouteConfig=a;var u=function(){function t(t){var e=t.name,n=t.useAsDefault,r=t.path,i=t.regex,o=t.serializer,s=t.data;this.name=e,this.useAsDefault=n,this.path=r,this.regex=i,this.serializer=o,this.data=s}return t=i([s.CONST(),o("design:paramtypes",[Object])],t)}();e.AbstractRoute=u;var c=function(t){function e(e){var n=e.name,r=e.useAsDefault,i=e.path,o=e.regex,s=e.serializer,a=e.data,u=e.component;t.call(this,{name:n,useAsDefault:r,path:i,regex:o,serializer:s,data:a}),this.aux=null,this.component=u}return r(e,t),e=i([s.CONST(),o("design:paramtypes",[Object])],e)}(u);e.Route=c;var p=function(t){function e(e){var n=e.name,r=e.useAsDefault,i=e.path,o=e.regex,s=e.serializer,a=e.data,u=e.component;t.call(this,{name:n,useAsDefault:r,path:i,regex:o,serializer:s,data:a}),this.component=u}return r(e,t),e=i([s.CONST(),o("design:paramtypes",[Object])],e)}(u);e.AuxRoute=p;var l=function(t){function e(e){var n=e.name,r=e.useAsDefault,i=e.path,o=e.regex,s=e.serializer,a=e.data,u=e.loader;t.call(this,{name:n,useAsDefault:r,path:i,regex:o,serializer:s,data:a}),this.aux=null,this.loader=u}return r(e,t),e=i([s.CONST(),o("design:paramtypes",[Object])],e)}(u);e.AsyncRoute=l;var h=function(t){function e(e){var n=e.name,r=e.useAsDefault,i=e.path,o=e.regex,s=e.serializer,a=e.data,u=e.redirectTo;t.call(this,{name:n,useAsDefault:r,path:i,regex:o,serializer:s,data:a}),this.redirectTo=u}return r(e,t),e=i([s.CONST(),o("design:paramtypes",[Object])],e)}(u);e.Redirect=h},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=n(5),o=n(12),s=n(41),a=n(15),u=n(259),c=n(260),p=function(){function t(){}return t}();e.RouteMatch=p;var l=function(t){function e(e,n,r){t.call(this),this.instruction=e,this.remaining=n,this.remainingAux=r}return r(e,t),e}(p);e.PathMatch=l;var h=function(t){function e(e,n){t.call(this),this.redirectTo=e,this.specificity=n}return r(e,t),e}(p);e.RedirectMatch=h;var f=function(){function t(t,e){this._pathRecognizer=t,this.redirectTo=e,this.hash=this._pathRecognizer.hash}return Object.defineProperty(t.prototype,"path",{get:function(){return this._pathRecognizer.toString()},set:function(t){throw new o.BaseException("you cannot set the path of a RedirectRule directly")},enumerable:!0,configurable:!0}),t.prototype.recognize=function(t){var e=null;return i.isPresent(this._pathRecognizer.matchUrl(t))&&(e=new h(this.redirectTo,this._pathRecognizer.specificity)),s.PromiseWrapper.resolve(e)},t.prototype.generate=function(t){throw new o.BaseException("Tried to generate a redirect.")},t}();e.RedirectRule=f;var d=function(){function t(t,e,n){this._routePath=t,this.handler=e,this._routeName=n,this._cache=new a.Map,this.specificity=this._routePath.specificity,this.hash=this._routePath.hash,this.terminal=this._routePath.terminal}return Object.defineProperty(t.prototype,"path",{get:function(){return this._routePath.toString()},set:function(t){throw new o.BaseException("you cannot set the path of a RouteRule directly")},enumerable:!0,configurable:!0}),t.prototype.recognize=function(t){var e=this,n=this._routePath.matchUrl(t);return i.isBlank(n)?null:this.handler.resolveComponentType().then(function(t){var r=e._getInstruction(n.urlPath,n.urlParams,n.allParams);return new l(r,n.rest,n.auxiliary)})},t.prototype.generate=function(t){var e=this._routePath.generateUrl(t),n=e.urlPath,r=e.urlParams;return this._getInstruction(n,u.convertUrlParamsToArray(r),t)},t.prototype.generateComponentPathValues=function(t){return this._routePath.generateUrl(t)},t.prototype._getInstruction=function(t,e,n){if(i.isBlank(this.handler.componentType))throw new o.BaseException("Tried to get instruction before the type was loaded.");var r=t+"?"+e.join("&");if(this._cache.has(r))return this._cache.get(r);var s=new c.ComponentInstruction(t,e,this.handler.data,this.handler.componentType,this.terminal,this.specificity,n,this._routeName);return this._cache.set(r,s),s},t}();e.RouteRule=d},function(t,e,n){"use strict";function r(t){var e=[];return p.isBlank(t)?[]:(c.StringMapWrapper.forEach(t,function(t,n){e.push(t===!0?n:n+"="+t)}),e)}function i(t,e){return void 0===e&&(e="&"),r(t).join(e)}function o(t){for(var e=new h(t[t.length-1]),n=t.length-2;n>=0;n-=1)e=new h(t[n],e);return e}function s(t){var e=p.RegExpWrapper.firstMatch(d,t);return p.isPresent(e)?e[0]:""}function a(t){var e=p.RegExpWrapper.firstMatch(v,t);return p.isPresent(e)?e[0]:""}var u=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},c=n(15),p=n(5),l=n(12);e.convertUrlParamsToArray=r,e.serializeParams=i;var h=function(){function t(t,e,n,r){void 0===e&&(e=null),void 0===n&&(n=p.CONST_EXPR([])),void 0===r&&(r=p.CONST_EXPR({})),this.path=t,this.child=e,this.auxiliary=n,this.params=r}return t.prototype.toString=function(){return this.path+this._matrixParamsToString()+this._auxToString()+this._childString()},t.prototype.segmentToString=function(){return this.path+this._matrixParamsToString()},t.prototype._auxToString=function(){return this.auxiliary.length>0?"("+this.auxiliary.map(function(t){return t.toString()}).join("//")+")":""},t.prototype._matrixParamsToString=function(){var t=i(this.params,";");return t.length>0?";"+t:""},t.prototype._childString=function(){return p.isPresent(this.child)?"/"+this.child.toString():""},t}();e.Url=h;var f=function(t){function e(e,n,r,i){void 0===n&&(n=null),void 0===r&&(r=p.CONST_EXPR([])),void 0===i&&(i=null),t.call(this,e,n,r,i)}return u(e,t),e.prototype.toString=function(){return this.path+this._auxToString()+this._childString()+this._queryParamsToString()},e.prototype.segmentToString=function(){return this.path+this._queryParamsToString()},e.prototype._queryParamsToString=function(){return p.isBlank(this.params)?"":"?"+i(this.params)},e}(h);e.RootUrl=f,e.pathSegmentsToUrl=o;var d=p.RegExpWrapper.create("^[^\\/\\(\\)\\?;=&#]+"),v=p.RegExpWrapper.create("^[^\\(\\)\\?;&#]+"),y=function(){function t(){}return t.prototype.peekStartsWith=function(t){return this._remaining.startsWith(t)},t.prototype.capture=function(t){if(!this._remaining.startsWith(t))throw new l.BaseException('Expected "'+t+'".');this._remaining=this._remaining.substring(t.length)},t.prototype.parse=function(t){return this._remaining=t,""==t||"/"==t?new h(""):this.parseRoot()},t.prototype.parseRoot=function(){this.peekStartsWith("/")&&this.capture("/");var t=s(this._remaining);this.capture(t);var e=[];this.peekStartsWith("(")&&(e=this.parseAuxiliaryRoutes()),this.peekStartsWith(";")&&this.parseMatrixParams();var n=null;this.peekStartsWith("/")&&!this.peekStartsWith("//")&&(this.capture("/"),n=this.parseSegment());var r=null;return this.peekStartsWith("?")&&(r=this.parseQueryParams()),new f(t,n,e,r)},t.prototype.parseSegment=function(){if(0==this._remaining.length)return null;this.peekStartsWith("/")&&this.capture("/");var t=s(this._remaining);this.capture(t);var e=null;this.peekStartsWith(";")&&(e=this.parseMatrixParams());var n=[];this.peekStartsWith("(")&&(n=this.parseAuxiliaryRoutes());var r=null;return this.peekStartsWith("/")&&!this.peekStartsWith("//")&&(this.capture("/"),r=this.parseSegment()),new h(t,r,n,e)},t.prototype.parseQueryParams=function(){var t={};for(this.capture("?"),this.parseQueryParam(t);this._remaining.length>0&&this.peekStartsWith("&");)this.capture("&"),this.parseQueryParam(t);return t},t.prototype.parseMatrixParams=function(){for(var t={};this._remaining.length>0&&this.peekStartsWith(";");)this.capture(";"),this.parseParam(t);return t},t.prototype.parseParam=function(t){var e=s(this._remaining);if(!p.isBlank(e)){this.capture(e);var n=!0;if(this.peekStartsWith("=")){this.capture("=");var r=s(this._remaining);p.isPresent(r)&&(n=r,this.capture(n))}t[e]=n}},t.prototype.parseQueryParam=function(t){var e=s(this._remaining);if(!p.isBlank(e)){this.capture(e);var n=!0;if(this.peekStartsWith("=")){this.capture("=");var r=a(this._remaining);p.isPresent(r)&&(n=r,this.capture(n))}t[e]=n}},t.prototype.parseAuxiliaryRoutes=function(){var t=[];for(this.capture("(");!this.peekStartsWith(")")&&this._remaining.length>0;)t.push(this.parseSegment()),this.peekStartsWith("//")&&this.capture("//");return this.capture(")"),t},t}();e.UrlParser=y,e.parser=new y},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=n(15),o=n(5),s=n(40),a=function(){function t(t){this.params=t}return t.prototype.get=function(t){return o.normalizeBlank(i.StringMapWrapper.get(this.params,t))},t}();e.RouteParams=a;var u=function(){function t(t){void 0===t&&(t=o.CONST_EXPR({})),this.data=t}return t.prototype.get=function(t){return o.normalizeBlank(i.StringMapWrapper.get(this.data,t))},t}();e.RouteData=u,e.BLANK_ROUTE_DATA=new u;var c=function(){function t(t,e,n){this.component=t,this.child=e,this.auxInstruction=n}return Object.defineProperty(t.prototype,"urlPath",{get:function(){return o.isPresent(this.component)?this.component.urlPath:""},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"urlParams",{get:function(){return o.isPresent(this.component)?this.component.urlParams:[]},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"specificity",{get:function(){var t="";return o.isPresent(this.component)&&(t+=this.component.specificity),o.isPresent(this.child)&&(t+=this.child.specificity),t},enumerable:!0,configurable:!0}),t.prototype.toRootUrl=function(){return this.toUrlPath()+this.toUrlQuery()},t.prototype._toNonRootUrl=function(){return this._stringifyPathMatrixAuxPrefixed()+(o.isPresent(this.child)?this.child._toNonRootUrl():"")},t.prototype.toUrlQuery=function(){return this.urlParams.length>0?"?"+this.urlParams.join("&"):""},t.prototype.replaceChild=function(t){return new p(this.component,t,this.auxInstruction)},t.prototype.toUrlPath=function(){return this.urlPath+this._stringifyAux()+(o.isPresent(this.child)?this.child._toNonRootUrl():"")},t.prototype.toLinkUrl=function(){return this.urlPath+this._stringifyAux()+(o.isPresent(this.child)?this.child._toLinkUrl():"")+this.toUrlQuery()},t.prototype._toLinkUrl=function(){return this._stringifyPathMatrixAuxPrefixed()+(o.isPresent(this.child)?this.child._toLinkUrl():"")},t.prototype._stringifyPathMatrixAuxPrefixed=function(){var t=this._stringifyPathMatrixAux();return t.length>0&&(t="/"+t),t},t.prototype._stringifyMatrixParams=function(){return this.urlParams.length>0?";"+this.urlParams.join(";"):""},t.prototype._stringifyPathMatrixAux=function(){return o.isBlank(this.component)?"":this.urlPath+this._stringifyMatrixParams()+this._stringifyAux()},t.prototype._stringifyAux=function(){var t=[];return i.StringMapWrapper.forEach(this.auxInstruction,function(e,n){t.push(e._stringifyPathMatrixAux())}),t.length>0?"("+t.join("//")+")":""},t}();e.Instruction=c;var p=function(t){function e(e,n,r){t.call(this,e,n,r)}return r(e,t),e.prototype.resolveComponent=function(){return s.PromiseWrapper.resolve(this.component)},e}(c);e.ResolvedInstruction=p;var l=function(t){function e(e,n){t.call(this,e,n,{})}return r(e,t),e.prototype.toLinkUrl=function(){return""},e.prototype._toLinkUrl=function(){return""},e}(p);e.DefaultInstruction=l;var h=function(t){function e(e,n,r){void 0===n&&(n=""),void 0===r&&(r=o.CONST_EXPR([])),t.call(this,null,null,{}),this._resolver=e,this._urlPath=n,this._urlParams=r}return r(e,t),Object.defineProperty(e.prototype,"urlPath",{get:function(){return o.isPresent(this.component)?this.component.urlPath:o.isPresent(this._urlPath)?this._urlPath:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"urlParams",{get:function(){return o.isPresent(this.component)?this.component.urlParams:o.isPresent(this._urlParams)?this._urlParams:[]},enumerable:!0,configurable:!0}),e.prototype.resolveComponent=function(){var t=this;return o.isPresent(this.component)?s.PromiseWrapper.resolve(this.component):this._resolver().then(function(e){return t.child=o.isPresent(e)?e.child:null,t.component=o.isPresent(e)?e.component:null})},e}(c);e.UnresolvedInstruction=h;var f=function(t){function e(e,n,r,i){t.call(this,e,n,r),this._specificity=i}return r(e,t),Object.defineProperty(e.prototype,"specificity",{get:function(){return this._specificity},enumerable:!0,configurable:!0}),e}(p);e.RedirectInstruction=f;var d=function(){function t(t,n,r,i,s,a,u,c){void 0===u&&(u=null),this.urlPath=t,this.urlParams=n,this.componentType=i,this.terminal=s,this.specificity=a,this.params=u,this.routeName=c,this.reuse=!1,this.routeData=o.isPresent(r)?r:e.BLANK_ROUTE_DATA}return t}();e.ComponentInstruction=d},function(t,e,n){"use strict";var r=n(5),i=n(12),o=n(15),s=n(40),a=n(258),u=n(257),c=n(262),p=n(263),l=n(264),h=n(267),f=function(){function t(){this.rulesByName=new o.Map,this.auxRulesByName=new o.Map,this.auxRulesByPath=new o.Map,this.rules=[],this.defaultRule=null}return t.prototype.config=function(t){var e;if(r.isPresent(t.name)&&t.name[0].toUpperCase()!=t.name[0]){var n=t.name[0].toUpperCase()+t.name.substring(1);throw new i.BaseException('Route "'+t.path+'" with name "'+t.name+'" does not begin with an uppercase letter. Route names should be CamelCase like "'+n+'".')}if(t instanceof u.AuxRoute){e=new p.SyncRouteHandler(t.component,t.data);var o=this._getRoutePath(t),s=new a.RouteRule(o,e,t.name);return this.auxRulesByPath.set(o.toString(),s),r.isPresent(t.name)&&this.auxRulesByName.set(t.name,s),s.terminal}var l=!1;if(t instanceof u.Redirect){var h=this._getRoutePath(t),f=new a.RedirectRule(h,t.redirectTo);return this._assertNoHashCollision(f.hash,t.path),this.rules.push(f),!0}t instanceof u.Route?(e=new p.SyncRouteHandler(t.component,t.data),l=r.isPresent(t.useAsDefault)&&t.useAsDefault):t instanceof u.AsyncRoute&&(e=new c.AsyncRouteHandler(t.loader,t.data),l=r.isPresent(t.useAsDefault)&&t.useAsDefault);var d=this._getRoutePath(t),v=new a.RouteRule(d,e,t.name);if(this._assertNoHashCollision(v.hash,t.path),l){if(r.isPresent(this.defaultRule))throw new i.BaseException("Only one route can be default");this.defaultRule=v}return this.rules.push(v),r.isPresent(t.name)&&this.rulesByName.set(t.name,v),v.terminal},t.prototype.recognize=function(t){var e=[];return this.rules.forEach(function(n){var i=n.recognize(t);r.isPresent(i)&&e.push(i)}),0==e.length&&r.isPresent(t)&&t.auxiliary.length>0?[s.PromiseWrapper.resolve(new a.PathMatch(null,null,t.auxiliary))]:e},t.prototype.recognizeAuxiliary=function(t){var e=this.auxRulesByPath.get(t.path);return r.isPresent(e)?[e.recognize(t)]:[s.PromiseWrapper.resolve(null)]},t.prototype.hasRoute=function(t){return this.rulesByName.has(t)},t.prototype.componentLoaded=function(t){return this.hasRoute(t)&&r.isPresent(this.rulesByName.get(t).handler.componentType)},t.prototype.loadComponent=function(t){return this.rulesByName.get(t).handler.resolveComponentType()},t.prototype.generate=function(t,e){var n=this.rulesByName.get(t);return r.isBlank(n)?null:n.generate(e)},t.prototype.generateAuxiliary=function(t,e){var n=this.auxRulesByName.get(t);return r.isBlank(n)?null:n.generate(e)},t.prototype._assertNoHashCollision=function(t,e){this.rules.forEach(function(n){if(t==n.hash)throw new i.BaseException("Configuration '"+e+"' conflicts with existing route '"+n.path+"'")})},t.prototype._getRoutePath=function(t){if(r.isPresent(t.regex)){if(r.isFunction(t.serializer))return new h.RegexRoutePath(t.regex,t.serializer);throw new i.BaseException("Route provides a regex property, '"+t.regex+"', but no serializer property")}if(r.isPresent(t.path)){var e=t instanceof u.AuxRoute&&t.path.startsWith("/")?t.path.substring(1):t.path;return new l.ParamRoutePath(e)}throw new i.BaseException("Route must provide either a path or regex property")},t}();e.RuleSet=f},function(t,e,n){"use strict";var r=n(5),i=n(260),o=function(){function t(t,e){void 0===e&&(e=null),this._loader=t,this._resolvedComponent=null,this.data=r.isPresent(e)?new i.RouteData(e):i.BLANK_ROUTE_DATA}return t.prototype.resolveComponentType=function(){ +var t=this;return r.isPresent(this._resolvedComponent)?this._resolvedComponent:this._resolvedComponent=this._loader().then(function(e){return t.componentType=e,e})},t}();e.AsyncRouteHandler=o},function(t,e,n){"use strict";var r=n(40),i=n(5),o=n(260),s=function(){function t(t,e){this.componentType=t,this._resolvedComponent=null,this._resolvedComponent=r.PromiseWrapper.resolve(t),this.data=i.isPresent(e)?new o.RouteData(e):o.BLANK_ROUTE_DATA}return t.prototype.resolveComponentType=function(){return this._resolvedComponent},t}();e.SyncRouteHandler=s},function(t,e,n){"use strict";function r(t){return o.isBlank(t)?null:(t=o.StringWrapper.replaceAll(t,y,"%25"),t=o.StringWrapper.replaceAll(t,m,"%2F"),t=o.StringWrapper.replaceAll(t,g,"%28"),t=o.StringWrapper.replaceAll(t,_,"%29"),t=o.StringWrapper.replaceAll(t,b,"%3B"))}function i(t){return o.isBlank(t)?null:(t=o.StringWrapper.replaceAll(t,P,";"),t=o.StringWrapper.replaceAll(t,E,")"),t=o.StringWrapper.replaceAll(t,w,"("),t=o.StringWrapper.replaceAll(t,C,"/"),t=o.StringWrapper.replaceAll(t,R,"%"))}var o=n(5),s=n(12),a=n(15),u=n(265),c=n(259),p=n(266),l=function(){function t(){this.name="",this.specificity="",this.hash="..."}return t.prototype.generate=function(t){return""},t.prototype.match=function(t){return!0},t}(),h=function(){function t(t){this.path=t,this.name="",this.specificity="2",this.hash=t}return t.prototype.match=function(t){return t==this.path},t.prototype.generate=function(t){return this.path},t}(),f=function(){function t(t){this.name=t,this.specificity="1",this.hash=":"}return t.prototype.match=function(t){return t.length>0},t.prototype.generate=function(t){if(!a.StringMapWrapper.contains(t.map,this.name))throw new s.BaseException("Route generator for '"+this.name+"' was not included in parameters passed.");return r(u.normalizeString(t.get(this.name)))},t.paramMatcher=/^:([^\/]+)$/g,t}(),d=function(){function t(t){this.name=t,this.specificity="0",this.hash="*"}return t.prototype.match=function(t){return!0},t.prototype.generate=function(t){return u.normalizeString(t.get(this.name))},t.wildcardMatcher=/^\*([^\/]+)$/g,t}(),v=function(){function t(t){this.routePath=t,this.terminal=!0,this._assertValidPath(t),this._parsePathString(t),this.specificity=this._calculateSpecificity(),this.hash=this._calculateHash();var e=this._segments[this._segments.length-1];this.terminal=!(e instanceof l)}return t.prototype.matchUrl=function(t){for(var e,n=t,r={},s=[],u=0;u=r;r++){var i,a=e[r];if(o.isPresent(i=o.RegExpWrapper.firstMatch(f.paramMatcher,a)))this._segments.push(new f(i[1]));else if(o.isPresent(i=o.RegExpWrapper.firstMatch(d.wildcardMatcher,a)))this._segments.push(new d(i[1]));else if("..."==a){if(n>r)throw new s.BaseException('Unexpected "..." before the end of the path for "'+t+'".');this._segments.push(new l)}else this._segments.push(new h(a))}},t.prototype._calculateSpecificity=function(){var t,e,n=this._segments.length;if(0==n)e+="2";else for(e="",t=0;n>t;t++)e+=this._segments[t].specificity;return e},t.prototype._calculateHash=function(){var t,e=this._segments.length,n=[];for(t=0;e>t;t++)n.push(this._segments[t].hash);return n.join("/")},t.prototype._assertValidPath=function(e){if(o.StringWrapper.contains(e,"#"))throw new s.BaseException('Path "'+e+'" should not include "#". Use "HashLocationStrategy" instead.');var n=o.RegExpWrapper.firstMatch(t.RESERVED_CHARS,e);if(o.isPresent(n))throw new s.BaseException('Path "'+e+'" contains "'+n[0]+'" which is not allowed in a route config.')},t.RESERVED_CHARS=o.RegExpWrapper.create("//|\\(|\\)|;|\\?|="),t}();e.ParamRoutePath=v;var y=/%/g,m=/\//g,g=/\(/g,_=/\)/g,b=/;/g,P=/%3B/gi,E=/%29/gi,w=/%28/gi,C=/%2F/gi,R=/%25/gi},function(t,e,n){"use strict";function r(t){return i.isBlank(t)?null:t.toString()}var i=n(5),o=n(15),s=function(){function t(t){var e=this;this.map={},this.keys={},i.isPresent(t)&&o.StringMapWrapper.forEach(t,function(t,n){e.map[n]=i.isPresent(t)?t.toString():null,e.keys[n]=!0})}return t.prototype.get=function(t){return o.StringMapWrapper["delete"](this.keys,t),this.map[t]},t.prototype.getUnused=function(){var t=this,e={},n=o.StringMapWrapper.keys(this.keys);return n.forEach(function(n){return e[n]=o.StringMapWrapper.get(t.map,n)}),e},t}();e.TouchMap=s,e.normalizeString=r},function(t,e){"use strict";var n=function(){function t(t,e,n,r,i){this.urlPath=t,this.urlParams=e,this.allParams=n,this.auxiliary=r,this.rest=i}return t}();e.MatchedUrl=n;var r=function(){function t(t,e){this.urlPath=t,this.urlParams=e}return t}();e.GeneratedUrl=r},function(t,e,n){"use strict";var r=n(5),i=n(266),o=function(){function t(t,e){this._reString=t,this._serializer=e,this.terminal=!0,this.specificity="2",this.hash=this._reString,this._regex=r.RegExpWrapper.create(this._reString)}return t.prototype.matchUrl=function(t){var e=t.toString(),n={},o=r.RegExpWrapper.matcher(this._regex,e),s=r.RegExpMatcherWrapper.next(o);if(r.isBlank(s))return null;for(var a=0;ao?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(5),s=function(){function t(t){this.name=t}return t=r([o.CONST(),i("design:paramtypes",[String])],t)}();e.RouteLifecycleHook=s;var a=function(){function t(t){this.fn=t}return t=r([o.CONST(),i("design:paramtypes",[Function])],t)}();e.CanActivate=a,e.routerCanReuse=o.CONST_EXPR(new s("routerCanReuse")),e.routerCanDeactivate=o.CONST_EXPR(new s("routerCanDeactivate")),e.routerOnActivate=o.CONST_EXPR(new s("routerOnActivate")),e.routerOnReuse=o.CONST_EXPR(new s("routerOnReuse")),e.routerOnDeactivate=o.CONST_EXPR(new s("routerOnDeactivate"))},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=this&&this.__param||function(t,e){return function(n,r){e(n,r,t)}},s=n(40),a=n(15),u=n(5),c=n(2),p=n(248),l=n(260),h=n(273),f=n(270),d=s.PromiseWrapper.resolve(!0),v=function(){function t(t,e,n,r){this._viewContainerRef=t,this._loader=e,this._parentRouter=n,this.name=null,this._componentRef=null,this._currentInstruction=null,this.activateEvents=new s.EventEmitter,u.isPresent(r)?(this.name=r,this._parentRouter.registerAuxOutlet(this)):this._parentRouter.registerPrimaryOutlet(this)}return t.prototype.activate=function(t){var e=this,n=this._currentInstruction;this._currentInstruction=t;var r=t.componentType,i=this._parentRouter.childRouter(r),o=c.ReflectiveInjector.resolve([c.provide(l.RouteData,{useValue:t.routeData}),c.provide(l.RouteParams,{useValue:new l.RouteParams(t.params)}),c.provide(p.Router,{useValue:i})]);return this._componentRef=this._loader.loadNextToLocation(r,this._viewContainerRef,o),this._componentRef.then(function(i){return e.activateEvents.emit(i.instance),f.hasLifecycleHook(h.routerOnActivate,r)?e._componentRef.then(function(e){return e.instance.routerOnActivate(t,n)}):i})},t.prototype.reuse=function(t){var e=this._currentInstruction;return this._currentInstruction=t,u.isBlank(this._componentRef)?this.activate(t):s.PromiseWrapper.resolve(f.hasLifecycleHook(h.routerOnReuse,this._currentInstruction.componentType)?this._componentRef.then(function(n){return n.instance.routerOnReuse(t,e)}):!0)},t.prototype.deactivate=function(t){var e=this,n=d;return u.isPresent(this._componentRef)&&u.isPresent(this._currentInstruction)&&f.hasLifecycleHook(h.routerOnDeactivate,this._currentInstruction.componentType)&&(n=this._componentRef.then(function(n){return n.instance.routerOnDeactivate(t,e._currentInstruction)})),n.then(function(t){if(u.isPresent(e._componentRef)){var n=e._componentRef.then(function(t){return t.destroy()});return e._componentRef=null,n}})},t.prototype.routerCanDeactivate=function(t){var e=this;return u.isBlank(this._currentInstruction)?d:f.hasLifecycleHook(h.routerCanDeactivate,this._currentInstruction.componentType)?this._componentRef.then(function(n){return n.instance.routerCanDeactivate(t,e._currentInstruction)}):d},t.prototype.routerCanReuse=function(t){var e,n=this;return e=u.isBlank(this._currentInstruction)||this._currentInstruction.componentType!=t.componentType?!1:f.hasLifecycleHook(h.routerCanReuse,this._currentInstruction.componentType)?this._componentRef.then(function(e){return e.instance.routerCanReuse(t,n._currentInstruction)}):t==this._currentInstruction||u.isPresent(t.params)&&u.isPresent(this._currentInstruction.params)&&a.StringMapWrapper.equals(t.params,this._currentInstruction.params),s.PromiseWrapper.resolve(e)},t.prototype.ngOnDestroy=function(){this._parentRouter.unregisterPrimaryOutlet(this)},r([c.Output("activate"),i("design:type",Object)],t.prototype,"activateEvents",void 0),t=r([c.Directive({selector:"router-outlet"}),o(3,c.Attribute("name")),i("design:paramtypes",[c.ViewContainerRef,c.DynamicComponentLoader,p.Router,String])],t)}();e.RouterOutlet=v},function(t,e,n){"use strict";var r=n(9),i=n(271),o=n(271);e.routerCanReuse=o.routerCanReuse,e.routerCanDeactivate=o.routerCanDeactivate,e.routerOnActivate=o.routerOnActivate,e.routerOnReuse=o.routerOnReuse,e.routerOnDeactivate=o.routerOnDeactivate,e.CanActivate=r.makeDecorator(i.CanActivate)},function(t,e,n){"use strict";var r=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},i=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},o=n(2),s=n(249),a=n(5),u=n(248),c=function(){function t(t,e){var n=this;this._router=t,this._location=e,this._router.subscribe(function(t){return n._updateLink()})}return t.prototype._updateLink=function(){this._navigationInstruction=this._router.generate(this._routeParams);var t=this._navigationInstruction.toLinkUrl();this.visibleHref=this._location.prepareExternalUrl(t)},Object.defineProperty(t.prototype,"isRouteActive",{get:function(){return this._router.isRouteActive(this._navigationInstruction)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"routeParams",{set:function(t){this._routeParams=t,this._updateLink()},enumerable:!0,configurable:!0}),t.prototype.onClick=function(){return a.isString(this.target)&&"_self"!=this.target?!0:(this._router.navigateByInstruction(this._navigationInstruction),!1)},t=r([o.Directive({selector:"[routerLink]",inputs:["routeParams: routerLink","target: target"],host:{"(click)":"onClick()","[attr.href]":"visibleHref","[class.router-link-active]":"isRouteActive"}}),i("design:paramtypes",[u.Router,s.Location])],t)}();e.RouterLink=c},function(t,e,n){"use strict";function r(t,e,n,r){var i=new s.RootRouter(t,e,n);return r.registerDisposeListener(function(){return i.dispose()}),i}function i(t){if(0==t.componentTypes.length)throw new p.BaseException("Bootstrap at least one component before injecting Router.");return t.componentTypes[0]}var o=n(249),s=n(248),a=n(256),u=n(5),c=n(2),p=n(12);e.ROUTER_PROVIDERS_COMMON=u.CONST_EXPR([a.RouteRegistry,u.CONST_EXPR(new c.Provider(o.LocationStrategy,{useClass:o.PathLocationStrategy})),o.Location,u.CONST_EXPR(new c.Provider(s.Router,{useFactory:r,deps:u.CONST_EXPR([a.RouteRegistry,o.Location,a.ROUTER_PRIMARY_COMPONENT,c.ApplicationRef])})),u.CONST_EXPR(new c.Provider(a.ROUTER_PRIMARY_COMPONENT,{useFactory:i,deps:u.CONST_EXPR([c.ApplicationRef])}))])},function(t,e,n){"use strict";var r=n(275),i=n(2),o=n(277),s=n(249),a=n(5);e.ROUTER_PROVIDERS=a.CONST_EXPR([r.ROUTER_PROVIDERS_COMMON,a.CONST_EXPR(new i.Provider(s.PlatformLocation,{useClass:o.BrowserPlatformLocation}))]),e.ROUTER_BINDINGS=e.ROUTER_PROVIDERS},function(t,e,n){"use strict";var r=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},i=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},o=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},s=n(8),a=n(251),u=n(200),c=function(t){function e(){t.call(this),this._init()}return r(e,t),e.prototype._init=function(){this._location=u.DOM.getLocation(),this._history=u.DOM.getHistory()},Object.defineProperty(e.prototype,"location",{get:function(){return this._location},enumerable:!0,configurable:!0}),e.prototype.getBaseHrefFromDOM=function(){return u.DOM.getBaseHref()},e.prototype.onPopState=function(t){u.DOM.getGlobalEventTarget("window").addEventListener("popstate",t,!1)},e.prototype.onHashChange=function(t){u.DOM.getGlobalEventTarget("window").addEventListener("hashchange",t,!1)},Object.defineProperty(e.prototype,"pathname",{get:function(){return this._location.pathname},set:function(t){this._location.pathname=t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"search",{get:function(){return this._location.search},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hash",{get:function(){return this._location.hash},enumerable:!0,configurable:!0}),e.prototype.pushState=function(t,e,n){this._history.pushState(t,e,n)},e.prototype.replaceState=function(t,e,n){this._history.replaceState(t,e,n)},e.prototype.forward=function(){this._history.forward()},e.prototype.back=function(){this._history.back()},e=i([s.Injectable(),o("design:paramtypes",[])],e)}(a.PlatformLocation);e.BrowserPlatformLocation=c},function(t,e,n){"use strict";var r=n(137),i=n(2),o=n(279),s=n(5),a=n(279);e.RouterLinkTransform=a.RouterLinkTransform,e.ROUTER_LINK_DSL_PROVIDER=s.CONST_EXPR(new i.Provider(r.TEMPLATE_TRANSFORMS,{useClass:o.RouterLinkTransform,multi:!0}))},function(t,e,n){"use strict";function r(t,e){var n=new y(t,e.trim()).tokenize();return new m(n).generate()}var i=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},o=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=3>o?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(3>o?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},s=this&&this.__metadata||function(t,e){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(t,e):void 0},a=n(137),u=n(141),c=n(12),p=n(2),l=n(142),h=function(){function t(t){this.value=t}return t}(),f=function(){function t(){}return t}(),d=function(){function t(){}return t}(),v=function(){function t(t){this.ast=t}return t}(),y=function(){function t(t,e){this.parser=t,this.exp=e,this.index=0}return t.prototype.tokenize=function(){for(var t=[];this.indexn;n++)e.insertBefore(t[n],this.contentInsertionPoint)},t.prototype.setupOutputs=function(){for(var t=this,e=this.attrs,n=this.info.outputs,r=0;r1)throw new Error("Only support single directive definition for: "+this.name);var n=e[0];n.replace&&this.notSupported("replace"),n.terminal&&this.notSupported("terminal");var r=n.link;return"object"==typeof r&&r.post&&this.notSupported("link.post"),n},t.prototype.notSupported=function(t){throw new Error("Upgraded directive '"+this.name+"' does not support '"+t+"'.")},t.prototype.extractBindings=function(){var t="object"==typeof this.directive.bindToController;if(t&&Object.keys(this.directive.scope).length)throw new Error("Binding definitions on scope and controller at the same time are not supported.");var e=t?this.directive.bindToController:this.directive.scope;if("object"==typeof e)for(var n in e)if(e.hasOwnProperty(n)){var r=e[n],i=r.charAt(0);r=r.substr(1)||n;var o="output_"+n,s=o+": "+n,a=o+": "+n+"Change",u="input_"+n,c=u+": "+n;switch(i){case"=":this.propertyOutputs.push(o),this.checkProperties.push(r),this.outputs.push(o),this.outputsRename.push(a),this.propertyMap[o]=r;case"@":case"<":this.inputs.push(u),this.inputsRename.push(c),this.propertyMap[u]=r;break;case"&":this.outputs.push(o),this.outputsRename.push(s),this.propertyMap[o]=r;break;default:var p=JSON.stringify(e);throw new Error("Unexpected mapping '"+i+"' in '"+p+"' in '"+this.name+"' directive.")}}},t.prototype.compileTemplate=function(t,e,n){function r(e){var n=document.createElement("div");return n.innerHTML=e,t(n.childNodes)}var i=this;if(void 0!==this.directive.template)this.linkFn=r(this.directive.template);else{if(!this.directive.templateUrl)throw new Error("Directive '"+this.name+"' is not a component, it is missing template.");var o=this.directive.templateUrl,s=e.get(o);if(void 0===s)return new Promise(function(t,s){n("GET",o,null,function(n,a){200==n?t(i.linkFn=r(e.put(o,a))):s("GET "+o+" returned "+n+": "+a)})});this.linkFn=r(s)}return null},t.resolve=function(t,e){var n=[],r=e.get(i.NG1_COMPILE),o=e.get(i.NG1_TEMPLATE_CACHE),s=e.get(i.NG1_HTTP_BACKEND),a=e.get(i.NG1_CONTROLLER);for(var u in t)if(t.hasOwnProperty(u)){var c=t[u];c.directive=c.extractDirective(e),c.$controller=a,c.extractBindings();var p=c.compileTemplate(r,o,s);p&&n.push(p)}return Promise.all(n)},t}();e.UpgradeNg1ComponentAdapterBuilder=p;var l=function(){function t(t,e,n,i,a,p,l,h,f,d){this.linkFn=t,this.directive=n,this.inputs=p,this.outputs=l,this.propOuts=h,this.checkProperties=f,this.propertyMap=d,this.destinationObj=null,this.checkLastValues=[],this.element=i.nativeElement,this.componentScope=e.$new(!!n.scope);var v=s.element(this.element),y=n.controller,m=null;if(y){var g={$scope:this.componentScope,$element:v};m=a(y,g,null,n.controllerAs),v.data(o.controllerKey(n.name),m)}var _=n.link;if("object"==typeof _&&(_=_.pre),_){var b=c,P=c,E=this.resolveRequired(v,n.require);n.link(this.componentScope,v,b,E,P)}this.destinationObj=n.bindToController&&m?m:this.componentScope;for(var w=0;wr;r++)e.element.appendChild(t[r])},{parentBoundTranscludeFn:function(t,e){e(n)}}),this.destinationObj.$onInit&&this.destinationObj.$onInit()},t.prototype.ngOnChanges=function(t){for(var e in t)if(t.hasOwnProperty(e)){var n=t[e];this.setComponentProperty(e,n.currentValue)}},t.prototype.ngDoCheck=function(){for(var t=0,e=this.destinationObj,n=this.checkLastValues,r=this.checkProperties,i=0;i",this._properties=t&&t.properties||{},this._zoneDelegate=new d(this,this._parent&&this._parent._zoneDelegate,t)}return Object.defineProperty(e,"current",{get:function(){return m},enumerable:!0,configurable:!0}),Object.defineProperty(e,"currentTask",{get:function(){return T},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),e.prototype.get=function(e){for(var t=this;t;){if(t._properties.hasOwnProperty(e))return t._properties[e];t=t._parent}},e.prototype.fork=function(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)},e.prototype.wrap=function(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);var n=this._zoneDelegate.intercept(this,e,t),r=this;return function(){return r.runGuarded(n,this,arguments,t)}},e.prototype.run=function(e,t,n,r){void 0===t&&(t=null),void 0===n&&(n=null),void 0===r&&(r=null);var o=m;m=this;try{return this._zoneDelegate.invoke(this,e,t,n,r)}finally{m=o}},e.prototype.runGuarded=function(e,t,n,r){void 0===t&&(t=null),void 0===n&&(n=null),void 0===r&&(r=null);var o=m;m=this;try{try{return this._zoneDelegate.invoke(this,e,t,n,r)}catch(a){if(this._zoneDelegate.handleError(this,a))throw a}}finally{m=o}},e.prototype.runTask=function(e,t,n){if(e.runCount++,e.zone!=this)throw new Error("A task can only be run in the zone which created it! (Creation: "+e.zone.name+"; Execution: "+this.name+")");var r=T;T=e;var o=m;m=this;try{"macroTask"==e.type&&e.data&&!e.data.isPeriodic&&(e.cancelFn=null);try{return this._zoneDelegate.invokeTask(this,e,t,n)}catch(a){if(this._zoneDelegate.handleError(this,a))throw a}}finally{m=o,T=r}},e.prototype.scheduleMicroTask=function(e,t,n,r){return this._zoneDelegate.scheduleTask(this,new v("microTask",this,e,t,n,r,null))},e.prototype.scheduleMacroTask=function(e,t,n,r,o){return this._zoneDelegate.scheduleTask(this,new v("macroTask",this,e,t,n,r,o))},e.prototype.scheduleEventTask=function(e,t,n,r,o){return this._zoneDelegate.scheduleTask(this,new v("eventTask",this,e,t,n,r,o))},e.prototype.cancelTask=function(e){var t=this._zoneDelegate.cancelTask(this,e);return e.runCount=-1,e.cancelFn=null,t},e.__symbol__=t,e}(),d=function(){function e(e,t,n){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=e,this._parentDelegate=t,this._forkZS=n&&(n&&n.onFork?n:t._forkZS),this._forkDlgt=n&&(n.onFork?t:t._forkDlgt),this._interceptZS=n&&(n.onIntercept?n:t._interceptZS),this._interceptDlgt=n&&(n.onIntercept?t:t._interceptDlgt),this._invokeZS=n&&(n.onInvoke?n:t._invokeZS),this._invokeDlgt=n&&(n.onInvoke?t:t._invokeDlgt),this._handleErrorZS=n&&(n.onHandleError?n:t._handleErrorZS),this._handleErrorDlgt=n&&(n.onHandleError?t:t._handleErrorDlgt),this._scheduleTaskZS=n&&(n.onScheduleTask?n:t._scheduleTaskZS),this._scheduleTaskDlgt=n&&(n.onScheduleTask?t:t._scheduleTaskDlgt),this._invokeTaskZS=n&&(n.onInvokeTask?n:t._invokeTaskZS),this._invokeTaskDlgt=n&&(n.onInvokeTask?t:t._invokeTaskDlgt),this._cancelTaskZS=n&&(n.onCancelTask?n:t._cancelTaskZS),this._cancelTaskDlgt=n&&(n.onCancelTask?t:t._cancelTaskDlgt),this._hasTaskZS=n&&(n.onHasTask?n:t._hasTaskZS),this._hasTaskDlgt=n&&(n.onHasTask?t:t._hasTaskDlgt)}return e.prototype.fork=function(e,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,e,t):new h(e,t)},e.prototype.intercept=function(e,t,n){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this.zone,e,t,n):t},e.prototype.invoke=function(e,t,n,r,o){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this.zone,e,t,n,r,o):t.apply(n,r)},e.prototype.handleError=function(e,t){return this._handleErrorZS?this._handleErrorZS.onHandleError(this._handleErrorDlgt,this.zone,e,t):!0},e.prototype.scheduleTask=function(e,t){try{if(this._scheduleTaskZS)return this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this.zone,e,t);if(t.scheduleFn)t.scheduleFn(t);else{if("microTask"!=t.type)throw new Error("Task is missing scheduleFn.");r(t)}return t}finally{e==this.zone&&this._updateTaskCount(t.type,1)}},e.prototype.invokeTask=function(e,t,n,r){try{return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this.zone,e,t,n,r):t.callback.apply(n,r)}finally{e!=this.zone||"eventTask"==t.type||t.data&&t.data.isPeriodic||this._updateTaskCount(t.type,-1)}},e.prototype.cancelTask=function(e,t){var n;if(this._cancelTaskZS)n=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this.zone,e,t);else{if(!t.cancelFn)throw new Error("Task does not support cancellation, or is already canceled.");n=t.cancelFn(t)}return e==this.zone&&this._updateTaskCount(t.type,-1),n},e.prototype.hasTask=function(e,t){return this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this.zone,e,t)},e.prototype._updateTaskCount=function(e,t){var n=this._taskCounts,r=n[e],o=n[e]=r+t;if(0>o)throw new Error("More tasks executed then were scheduled.");if(0==r||0==o){var a={microTask:n.microTask>0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e};try{this.hasTask(this.zone,a)}finally{this._parentDelegate&&this._parentDelegate._updateTaskCount(e,t)}}},e}(),v=function(){function e(e,t,n,r,o,i,u){this.runCount=0,this.type=e,this.zone=t,this.source=n,this.data=o,this.scheduleFn=i,this.cancelFn=u,this.callback=r;var c=this;this.invoke=function(){try{return t.runTask(c,this,arguments)}finally{a()}}}return e}(),y=t("setTimeout"),g=t("Promise"),k=t("then"),m=new h(null,null),T=null,w=[],_=!1,b=[],E=!1,S=t("state"),O=t("value"),D="Promise.then",P=null,M=!0,z=!1,j=0,C=function(){function e(e){var t=this;t[S]=P,t[O]=[];try{e&&e(s(t,M),s(t,z))}catch(n){l(t,!1,n)}}return e.resolve=function(e){return l(new this(null),M,e)},e.reject=function(e){return l(new this(null),z,e)},e.race=function(e){function t(e){a&&(a=r(e))}function n(e){a&&(a=o(e))}for(var r,o,a=new this(function(e,t){r=e,o=t}),u=0,c=e;u=0;n--)"function"==typeof e[n]&&(e[n]=Zone.current.wrap(e[n],t+"_"+n));return e}function r(e,t){for(var r=e.constructor.name,o=function(o){var a=t[o],i=e[a];i&&(e[a]=function(e){return function(){return e.apply(this,n(arguments,r+"."+a))}}(i))},a=0;a1?new t(e,n):new t(e),i=Object.getOwnPropertyDescriptor(a,"onmessage");return i&&i.configurable===!1?(r=Object.create(a),["addEventListener","removeEventListener","send","close"].forEach(function(e){r[e]=function(){return a[e].apply(a,arguments)}})):r=a,o.patchOnProperties(r,["close","error","message","open"]),r};for(var n in t)e.WebSocket[n]=t[n]}var o=n(3);t.apply=r},function(e,t,n){"use strict";function r(e,t,n,r){function a(t){var n=t.data;return n.args[0]=t.invoke,n.handleId=u.apply(e,n.args),t}function i(e){return c(e.data.handleId)}var u=null,c=null;t+=r,n+=r,u=o.patchMethod(e,t,function(n){return function(o,u){if("function"==typeof u[0]){var c=Zone.current,s={handleId:null,isPeriodic:"Interval"===r,delay:"Timeout"===r||"Interval"===r?u[1]||0:null,args:u};return c.scheduleMacroTask(t,u[0],s,a,i)}return n.apply(e,u)}}),c=o.patchMethod(e,n,function(t){return function(n,r){var o=r[0];o&&"string"==typeof o.type?(o.cancelFn&&o.data.isPeriodic||0===o.runCount)&&o.zone.cancelTask(o):t.apply(e,r)}})}var o=n(3);t.patchTimer=r}]),function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t){"use strict";!function(){function e(){return new Error("STACKTRACE TRACKING")}function t(){try{throw e()}catch(t){return t}}function n(e){return e.stack?e.stack.split(u):[]}function r(e,t){for(var r=n(t),o=0;o0&&(e.push(n((new f).error)),a(e,t-1))}function i(){var e=[];a(e,2);for(var t=e[0],n=e[1],r=0;rthis.longStackTraceLimit&&(a.length=this.longStackTraceLimit),r.data||(r.data={}),r.data[l]=a,e.scheduleTask(n,r)},onHandleError:function(e,t,n,r){var a=Zone.currentTask;if(r instanceof Error&&a){var i=Object.getOwnPropertyDescriptor(r,"stack");if(i){var u=i.get,c=i.value;i={get:function(){return o(a.data&&a.data[l],u?u.apply(this):c)}},Object.defineProperty(r,"stack",i)}else r.stack=o(a.data&&a.data[l],r.stack)}return e.handleError(n,r)}},i()}()}]);var Reflect;!function(e){function t(e,t,n,r){if(_(r)){if(_(n)){if(!b(e))throw new TypeError;if(!S(t))throw new TypeError;return f(e,t)}if(!b(e))throw new TypeError;if(!E(t))throw new TypeError;return n=D(n),h(e,t,n)}if(!b(e))throw new TypeError;if(!E(t))throw new TypeError;if(_(n))throw new TypeError;if(!E(r))throw new TypeError;return n=D(n),p(e,t,n,r)}function n(e,t){function n(n,r){if(_(r)){if(!S(n))throw new TypeError;m(e,t,n,void 0)}else{if(!E(n))throw new TypeError;r=D(r),m(e,t,n,r)}}return n}function r(e,t,n,r){if(!E(n))throw new TypeError;return _(r)||(r=D(r)),m(e,t,n,r)}function o(e,t,n){if(!E(t))throw new TypeError;return _(n)||(n=D(n)),v(e,t,n)}function a(e,t,n){if(!E(t))throw new TypeError;return _(n)||(n=D(n)),y(e,t,n)}function i(e,t,n){if(!E(t))throw new TypeError;return _(n)||(n=D(n)),g(e,t,n)}function u(e,t,n){if(!E(t))throw new TypeError;return _(n)||(n=D(n)),k(e,t,n)}function c(e,t){if(!E(e))throw new TypeError;return _(t)||(t=D(t)),T(e,t)}function s(e,t){if(!E(e))throw new TypeError;return _(t)||(t=D(t)),w(e,t)}function l(e,t,n){if(!E(t))throw new TypeError;_(n)||(n=D(n));var r=d(t,n,!1);if(_(r))return!1;if(!r["delete"](e))return!1;if(r.size>0)return!0;var o=R.get(t);return o["delete"](n),o.size>0?!0:(R["delete"](t),!0)}function f(e,t){for(var n=e.length-1;n>=0;--n){var r=e[n],o=r(t);if(!_(o)){if(!S(o))throw new TypeError;t=o}}return t}function p(e,t,n,r){for(var o=e.length-1;o>=0;--o){var a=e[o],i=a(t,n,r);if(!_(i)){if(!E(i))throw new TypeError;r=i}}return r}function h(e,t,n){for(var r=e.length-1;r>=0;--r){var o=e[r];o(t,n)}}function d(e,t,n){var r=R.get(e);if(!r){if(!n)return;r=new Z,R.set(e,r)}var o=r.get(t);if(!o){if(!n)return;o=new Z,r.set(t,o)}return o}function v(e,t,n){var r=y(e,t,n);if(r)return!0;var o=P(t);return null!==o?v(e,o,n):!1}function y(e,t,n){var r=d(t,n,!1);return void 0===r?!1:Boolean(r.has(e))}function g(e,t,n){var r=y(e,t,n);if(r)return k(e,t,n);var o=P(t);return null!==o?g(e,o,n):void 0}function k(e,t,n){var r=d(t,n,!1);if(void 0!==r)return r.get(e)}function m(e,t,n,r){var o=d(n,r,!0);o.set(e,t)}function T(e,t){var n=w(e,t),r=P(e);if(null===r)return n;var o=T(r,t);if(o.length<=0)return n;if(n.length<=0)return o;for(var a=new I,i=[],u=0;u=0?(this._cache=e,!0):!1},get:function(e){var t=this._find(e);return t>=0?(this._cache=e,this._values[t]):void 0},set:function(e,t){return this["delete"](e),this._keys.push(e),this._values.push(t),this._cache=e,this},"delete":function(e){var n=this._find(e);return n>=0?(this._keys.splice(n,1),this._values.splice(n,1),this._cache=t,!0):!1},clear:function(){this._keys.length=0,this._values.length=0,this._cache=t},forEach:function(e,t){for(var n=this.size,r=0;n>r;++r){var o=this._keys[r],a=this._values[r];this._cache=o,e.call(this,a,o,this)}},_find:function(e){for(var t=this._keys,n=t.length,r=0;n>r;++r)if(t[r]===e)return r;return-1}},e}function z(){function e(){this._map=new Z}return e.prototype={get size(){return this._map.length},has:function(e){return this._map.has(e)},add:function(e){return this._map.set(e,e),this},"delete":function(e){return this._map["delete"](e)},clear:function(){this._map.clear()},forEach:function(e,t){this._map.forEach(e,t)}},e}function j(){function e(){this._key=o()}function t(e,t){for(var n=0;t>n;++n)e[n]=255*Math.random()|0}function n(e){if(c){var n=c.randomBytes(e);return n}if("function"==typeof Uint8Array){var n=new Uint8Array(e);return"undefined"!=typeof crypto?crypto.getRandomValues(n):"undefined"!=typeof msCrypto?msCrypto.getRandomValues(n):t(n,e),n}var n=new Array(e);return t(n,e),n}function r(){var e=n(i);e[6]=79&e[6]|64,e[8]=191&e[8]|128;for(var t="",r=0;i>r;++r){var o=e[r];(4===r||6===r||8===r)&&(t+="-"),16>o&&(t+="0"),t+=o.toString(16).toLowerCase()}return t}function o(){var e;do e="@@WeakMap@@"+r();while(s.call(l,e));return l[e]=!0,e}function a(e,t){if(!s.call(e,f)){if(!t)return;Object.defineProperty(e,f,{value:Object.create(null)})}return e[f]}var i=16,u="undefined"!=typeof global&&"[object process]"===Object.prototype.toString.call(global.process),c=u&&require("crypto"),s=Object.prototype.hasOwnProperty,l={},f=o();return e.prototype={has:function(e){var t=a(e,!1);return t?this._key in t:!1},get:function(e){var t=a(e,!1);return t?t[this._key]:void 0},set:function(e,t){var n=a(e,!0);return n[this._key]=t,this},"delete":function(e){var t=a(e,!1);return t&&this._key in t?delete t[this._key]:!1},clear:function(){this._key=o()}},e}var C=Object.getPrototypeOf(Function),Z="function"==typeof Map?Map:M(),I="function"==typeof Set?Set:z(),L="function"==typeof WeakMap?WeakMap:j(),R=new L;e.decorate=t,e.metadata=n,e.defineMetadata=r,e.hasMetadata=o,e.hasOwnMetadata=a,e.getMetadata=i,e.getOwnMetadata=u,e.getMetadataKeys=c,e.getOwnMetadataKeys=s,e.deleteMetadata=l,function(t){if("undefined"!=typeof t.Reflect){if(t.Reflect!==e)for(var n in e)t.Reflect[n]=e[n]}else t.Reflect=e}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope?self:"undefined"!=typeof global?global:Function("return this;")())}(Reflect||(Reflect={})); \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/accessible/libs/es6-shim.min.js b/src/opsoro/server/static/js/blockly/accessible/libs/es6-shim.min.js new file mode 100644 index 0000000..9a11646 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/libs/es6-shim.min.js @@ -0,0 +1,12 @@ +/*! + * https://github.com/paulmillr/es6-shim + * @license es6-shim Copyright 2013-2016 by Paul Miller (http://paulmillr.com) + * and contributors, MIT License + * es6-shim: v0.35.1 + * see https://github.com/paulmillr/es6-shim/blob/0.35.1/LICENSE + * Details and documentation: + * https://github.com/paulmillr/es6-shim/ + */ +(function(e,t){if(typeof define==="function"&&define.amd){define(t)}else if(typeof exports==="object"){module.exports=t()}else{e.returnExports=t()}})(this,function(){"use strict";var e=Function.call.bind(Function.apply);var t=Function.call.bind(Function.call);var r=Array.isArray;var n=Object.keys;var o=function notThunker(t){return function notThunk(){return!e(t,this,arguments)}};var i=function(e){try{e();return false}catch(t){return true}};var a=function valueOrFalseIfThrows(e){try{return e()}catch(t){return false}};var u=o(i);var f=function(){return!i(function(){Object.defineProperty({},"x",{get:function(){}})})};var s=!!Object.defineProperty&&f();var c=function foo(){}.name==="foo";var l=Function.call.bind(Array.prototype.forEach);var p=Function.call.bind(Array.prototype.reduce);var v=Function.call.bind(Array.prototype.filter);var y=Function.call.bind(Array.prototype.some);var h=function(e,t,r,n){if(!n&&t in e){return}if(s){Object.defineProperty(e,t,{configurable:true,enumerable:false,writable:true,value:r})}else{e[t]=r}};var b=function(e,t,r){l(n(t),function(n){var o=t[n];h(e,n,o,!!r)})};var g=Function.call.bind(Object.prototype.toString);var d=typeof/abc/==="function"?function IsCallableSlow(e){return typeof e==="function"&&g(e)==="[object Function]"}:function IsCallableFast(e){return typeof e==="function"};var O={getter:function(e,t,r){if(!s){throw new TypeError("getters require true ES5 support")}Object.defineProperty(e,t,{configurable:true,enumerable:false,get:r})},proxy:function(e,t,r){if(!s){throw new TypeError("getters require true ES5 support")}var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,{configurable:n.configurable,enumerable:n.enumerable,get:function getKey(){return e[t]},set:function setKey(r){e[t]=r}})},redefine:function(e,t,r){if(s){var n=Object.getOwnPropertyDescriptor(e,t);n.value=r;Object.defineProperty(e,t,n)}else{e[t]=r}},defineByDescriptor:function(e,t,r){if(s){Object.defineProperty(e,t,r)}else if("value"in r){e[t]=r.value}},preserveToString:function(e,t){if(t&&d(t.toString)){h(e,"toString",t.toString.bind(t),true)}}};var m=Object.create||function(e,t){var r=function Prototype(){};r.prototype=e;var o=new r;if(typeof t!=="undefined"){n(t).forEach(function(e){O.defineByDescriptor(o,e,t[e])})}return o};var w=function(e,t){if(!Object.setPrototypeOf){return false}return a(function(){var r=function Subclass(t){var r=new e(t);Object.setPrototypeOf(r,Subclass.prototype);return r};Object.setPrototypeOf(r,e);r.prototype=m(e.prototype,{constructor:{value:r}});return t(r)})};var j=function(){if(typeof self!=="undefined"){return self}if(typeof window!=="undefined"){return window}if(typeof global!=="undefined"){return global}throw new Error("unable to locate global object")};var S=j();var T=S.isFinite;var I=Function.call.bind(String.prototype.indexOf);var E=Function.apply.bind(Array.prototype.indexOf);var P=Function.call.bind(Array.prototype.concat);var C=Function.call.bind(String.prototype.slice);var M=Function.call.bind(Array.prototype.push);var x=Function.apply.bind(Array.prototype.push);var N=Function.call.bind(Array.prototype.shift);var A=Math.max;var R=Math.min;var _=Math.floor;var k=Math.abs;var F=Math.exp;var L=Math.log;var D=Math.sqrt;var z=Function.call.bind(Object.prototype.hasOwnProperty);var q;var W=function(){};var G=S.Symbol||{};var H=G.species||"@@species";var V=Number.isNaN||function isNaN(e){return e!==e};var B=Number.isFinite||function isFinite(e){return typeof e==="number"&&T(e)};var $=d(Math.sign)?Math.sign:function sign(e){var t=Number(e);if(t===0){return t}if(V(t)){return t}return t<0?-1:1};var U=function isArguments(e){return g(e)==="[object Arguments]"};var J=function isArguments(e){return e!==null&&typeof e==="object"&&typeof e.length==="number"&&e.length>=0&&g(e)!=="[object Array]"&&g(e.callee)==="[object Function]"};var X=U(arguments)?U:J;var K={primitive:function(e){return e===null||typeof e!=="function"&&typeof e!=="object"},string:function(e){return g(e)==="[object String]"},regex:function(e){return g(e)==="[object RegExp]"},symbol:function(e){return typeof S.Symbol==="function"&&typeof e==="symbol"}};var Z=function overrideNative(e,t,r){var n=e[t];h(e,t,r,true);O.preserveToString(e[t],n)};var Y=typeof G==="function"&&typeof G["for"]==="function"&&K.symbol(G());var Q=K.symbol(G.iterator)?G.iterator:"_es6-shim iterator_";if(S.Set&&typeof(new S.Set)["@@iterator"]==="function"){Q="@@iterator"}if(!S.Reflect){h(S,"Reflect",{},true)}var ee=S.Reflect;var te=String;var re={Call:function Call(t,r){var n=arguments.length>2?arguments[2]:[];if(!re.IsCallable(t)){throw new TypeError(t+" is not a function")}return e(t,r,n)},RequireObjectCoercible:function(e,t){if(e==null){throw new TypeError(t||"Cannot call method on "+e)}return e},TypeIsObject:function(e){if(e===void 0||e===null||e===true||e===false){return false}return typeof e==="function"||typeof e==="object"},ToObject:function(e,t){return Object(re.RequireObjectCoercible(e,t))},IsCallable:d,IsConstructor:function(e){return re.IsCallable(e)},ToInt32:function(e){return re.ToNumber(e)>>0},ToUint32:function(e){return re.ToNumber(e)>>>0},ToNumber:function(e){if(g(e)==="[object Symbol]"){throw new TypeError("Cannot convert a Symbol value to a number")}return+e},ToInteger:function(e){var t=re.ToNumber(e);if(V(t)){return 0}if(t===0||!B(t)){return t}return(t>0?1:-1)*_(k(t))},ToLength:function(e){var t=re.ToInteger(e);if(t<=0){return 0}if(t>Number.MAX_SAFE_INTEGER){return Number.MAX_SAFE_INTEGER}return t},SameValue:function(e,t){if(e===t){if(e===0){return 1/e===1/t}return true}return V(e)&&V(t)},SameValueZero:function(e,t){return e===t||V(e)&&V(t)},IsIterable:function(e){return re.TypeIsObject(e)&&(typeof e[Q]!=="undefined"||X(e))},GetIterator:function(e){if(X(e)){return new q(e,"value")}var t=re.GetMethod(e,Q);if(!re.IsCallable(t)){throw new TypeError("value is not an iterable")}var r=re.Call(t,e);if(!re.TypeIsObject(r)){throw new TypeError("bad iterator")}return r},GetMethod:function(e,t){var r=re.ToObject(e)[t];if(r===void 0||r===null){return void 0}if(!re.IsCallable(r)){throw new TypeError("Method not callable: "+t)}return r},IteratorComplete:function(e){return!!e.done},IteratorClose:function(e,t){var r=re.GetMethod(e,"return");if(r===void 0){return}var n,o;try{n=re.Call(r,e)}catch(i){o=i}if(t){return}if(o){throw o}if(!re.TypeIsObject(n)){throw new TypeError("Iterator's return method returned a non-object.")}},IteratorNext:function(e){var t=arguments.length>1?e.next(arguments[1]):e.next();if(!re.TypeIsObject(t)){throw new TypeError("bad iterator")}return t},IteratorStep:function(e){var t=re.IteratorNext(e);var r=re.IteratorComplete(t);return r?false:t},Construct:function(e,t,r,n){var o=typeof r==="undefined"?e:r;if(!n&&ee.construct){return ee.construct(e,t,o)}var i=o.prototype;if(!re.TypeIsObject(i)){i=Object.prototype}var a=m(i);var u=re.Call(e,a,t);return re.TypeIsObject(u)?u:a},SpeciesConstructor:function(e,t){var r=e.constructor;if(r===void 0){return t}if(!re.TypeIsObject(r)){throw new TypeError("Bad constructor")}var n=r[H];if(n===void 0||n===null){return t}if(!re.IsConstructor(n)){throw new TypeError("Bad @@species")}return n},CreateHTML:function(e,t,r,n){var o=re.ToString(e);var i="<"+t;if(r!==""){var a=re.ToString(n);var u=a.replace(/"/g,""");i+=" "+r+'="'+u+'"'}var f=i+">";var s=f+o;return s+""},IsRegExp:function IsRegExp(e){if(!re.TypeIsObject(e)){return false}var t=e[G.match];if(typeof t!=="undefined"){return!!t}return K.regex(e)},ToString:function ToString(e){return te(e)}};if(s&&Y){var ne=function defineWellKnownSymbol(e){if(K.symbol(G[e])){return G[e]}var t=G["for"]("Symbol."+e);Object.defineProperty(G,e,{configurable:false,enumerable:false,writable:false,value:t});return t};if(!K.symbol(G.search)){var oe=ne("search");var ie=String.prototype.search;h(RegExp.prototype,oe,function search(e){return re.Call(ie,e,[this])});var ae=function search(e){var t=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var r=re.GetMethod(e,oe);if(typeof r!=="undefined"){return re.Call(r,e,[t])}}return re.Call(ie,t,[re.ToString(e)])};Z(String.prototype,"search",ae)}if(!K.symbol(G.replace)){var ue=ne("replace");var fe=String.prototype.replace;h(RegExp.prototype,ue,function replace(e,t){return re.Call(fe,e,[this,t])});var se=function replace(e,t){var r=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var n=re.GetMethod(e,ue);if(typeof n!=="undefined"){return re.Call(n,e,[r,t])}}return re.Call(fe,r,[re.ToString(e),t])};Z(String.prototype,"replace",se)}if(!K.symbol(G.split)){var ce=ne("split");var le=String.prototype.split;h(RegExp.prototype,ce,function split(e,t){return re.Call(le,e,[this,t])});var pe=function split(e,t){var r=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var n=re.GetMethod(e,ce);if(typeof n!=="undefined"){return re.Call(n,e,[r,t])}}return re.Call(le,r,[re.ToString(e),t])};Z(String.prototype,"split",pe)}var ve=K.symbol(G.match);var ye=ve&&function(){var e={};e[G.match]=function(){return 42};return"a".match(e)!==42}();if(!ve||ye){var he=ne("match");var be=String.prototype.match;h(RegExp.prototype,he,function match(e){return re.Call(be,e,[this])});var ge=function match(e){var t=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var r=re.GetMethod(e,he);if(typeof r!=="undefined"){return re.Call(r,e,[t])}}return re.Call(be,t,[re.ToString(e)])};Z(String.prototype,"match",ge)}}var de=function wrapConstructor(e,t,r){O.preserveToString(t,e);if(Object.setPrototypeOf){Object.setPrototypeOf(e,t)}if(s){l(Object.getOwnPropertyNames(e),function(n){if(n in W||r[n]){return}O.proxy(e,n,t)})}else{l(Object.keys(e),function(n){if(n in W||r[n]){return}t[n]=e[n]})}t.prototype=e.prototype;O.redefine(e.prototype,"constructor",t)};var Oe=function(){return this};var me=function(e){if(s&&!z(e,H)){O.getter(e,H,Oe)}};var we=function(e,t){var r=t||function iterator(){return this};h(e,Q,r);if(!e[Q]&&K.symbol(Q)){e[Q]=r}};var je=function createDataProperty(e,t,r){if(s){Object.defineProperty(e,t,{configurable:true,enumerable:true,writable:true,value:r})}else{e[t]=r}};var Se=function createDataPropertyOrThrow(e,t,r){je(e,t,r);if(!re.SameValue(e[t],r)){throw new TypeError("property is nonconfigurable")}};var Te=function(e,t,r,n){if(!re.TypeIsObject(e)){throw new TypeError("Constructor requires `new`: "+t.name)}var o=t.prototype;if(!re.TypeIsObject(o)){o=r}var i=m(o);for(var a in n){if(z(n,a)){var u=n[a];h(i,a,u,true)}}return i};if(String.fromCodePoint&&String.fromCodePoint.length!==1){var Ie=String.fromCodePoint;Z(String,"fromCodePoint",function fromCodePoint(e){return re.Call(Ie,this,arguments)})}var Ee={fromCodePoint:function fromCodePoint(e){var t=[];var r;for(var n=0,o=arguments.length;n1114111){throw new RangeError("Invalid code point "+r)}if(r<65536){M(t,String.fromCharCode(r))}else{r-=65536;M(t,String.fromCharCode((r>>10)+55296));M(t,String.fromCharCode(r%1024+56320))}}return t.join("")},raw:function raw(e){var t=re.ToObject(e,"bad callSite");var r=re.ToObject(t.raw,"bad raw value");var n=r.length;var o=re.ToLength(n);if(o<=0){return""}var i=[];var a=0;var u,f,s,c;while(a=o){break}f=a+1=Ce){throw new RangeError("repeat count must be less than infinity and not overflow maximum string size")}return Pe(t,r)},startsWith:function startsWith(e){var t=re.ToString(re.RequireObjectCoercible(this));if(re.IsRegExp(e)){throw new TypeError('Cannot call method "startsWith" with a regex')}var r=re.ToString(e);var n;if(arguments.length>1){n=arguments[1]}var o=A(re.ToInteger(n),0);return C(t,o,o+r.length)===r},endsWith:function endsWith(e){var t=re.ToString(re.RequireObjectCoercible(this));if(re.IsRegExp(e)){throw new TypeError('Cannot call method "endsWith" with a regex')}var r=re.ToString(e);var n=t.length;var o;if(arguments.length>1){o=arguments[1]}var i=typeof o==="undefined"?n:re.ToInteger(o);var a=R(A(i,0),n);return C(t,a-r.length,a)===r},includes:function includes(e){if(re.IsRegExp(e)){throw new TypeError('"includes" does not accept a RegExp')}var t=re.ToString(e);var r;if(arguments.length>1){r=arguments[1]}return I(this,t,r)!==-1},codePointAt:function codePointAt(e){var t=re.ToString(re.RequireObjectCoercible(this));var r=re.ToInteger(e);var n=t.length;if(r>=0&&r56319||i){return o}var a=t.charCodeAt(r+1);if(a<56320||a>57343){return o}return(o-55296)*1024+(a-56320)+65536}}};if(String.prototype.includes&&"a".includes("a",Infinity)!==false){Z(String.prototype,"includes",Me.includes)}if(String.prototype.startsWith&&String.prototype.endsWith){var xe=i(function(){"/a/".startsWith(/a/)});var Ne=a(function(){return"abc".startsWith("a",Infinity)===false});if(!xe||!Ne){Z(String.prototype,"startsWith",Me.startsWith);Z(String.prototype,"endsWith",Me.endsWith)}}if(Y){var Ae=a(function(){var e=/a/;e[G.match]=false;return"/a/".startsWith(e)});if(!Ae){Z(String.prototype,"startsWith",Me.startsWith)}var Re=a(function(){var e=/a/;e[G.match]=false;return"/a/".endsWith(e)});if(!Re){Z(String.prototype,"endsWith",Me.endsWith)}var _e=a(function(){var e=/a/;e[G.match]=false;return"/a/".includes(e)});if(!_e){Z(String.prototype,"includes",Me.includes)}}b(String.prototype,Me);var ke=[" \n\x0B\f\r \xa0\u1680\u180e\u2000\u2001\u2002\u2003","\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028","\u2029\ufeff"].join("");var Fe=new RegExp("(^["+ke+"]+)|(["+ke+"]+$)","g");var Le=function trim(){return re.ToString(re.RequireObjectCoercible(this)).replace(Fe,"")};var De=["\x85","\u200b","\ufffe"].join("");var ze=new RegExp("["+De+"]","g");var qe=/^[\-+]0x[0-9a-f]+$/i;var We=De.trim().length!==De.length;h(String.prototype,"trim",Le,We);var Ge=function(e){return{value:e,done:arguments.length===0}};var He=function(e){re.RequireObjectCoercible(e);this._s=re.ToString(e);this._i=0};He.prototype.next=function(){var e=this._s;var t=this._i;if(typeof e==="undefined"||t>=e.length){this._s=void 0;return Ge()}var r=e.charCodeAt(t);var n,o;if(r<55296||r>56319||t+1===e.length){o=1}else{n=e.charCodeAt(t+1);o=n<56320||n>57343?1:2}this._i=t+o;return Ge(e.substr(t,o))};we(He.prototype);we(String.prototype,function(){return new He(this)});var Ve={from:function from(e){var r=this;var n;if(arguments.length>1){n=arguments[1]}var o,i;if(typeof n==="undefined"){o=false}else{if(!re.IsCallable(n)){throw new TypeError("Array.from: when provided, the second argument must be a function")}if(arguments.length>2){i=arguments[2]}o=true}var a=typeof(X(e)||re.GetMethod(e,Q))!=="undefined";var u,f,s;if(a){f=re.IsConstructor(r)?Object(new r):[];var c=re.GetIterator(e);var l,p;s=0;while(true){l=re.IteratorStep(c);if(l===false){break}p=l.value;try{if(o){p=typeof i==="undefined"?n(p,s):t(n,i,p,s)}f[s]=p}catch(v){re.IteratorClose(c,true);throw v}s+=1}u=s}else{var y=re.ToObject(e);u=re.ToLength(y.length);f=re.IsConstructor(r)?Object(new r(u)):new Array(u);var h;for(s=0;s2){f=arguments[2]}var s=typeof f==="undefined"?n:re.ToInteger(f);var c=s<0?A(n+s,0):R(s,n);var l=R(c-u,n-a);var p=1;if(u0){if(u in r){r[a]=r[u]}else{delete r[a]}u+=p;a+=p;l-=1}return r},fill:function fill(e){var t;if(arguments.length>1){t=arguments[1]}var r;if(arguments.length>2){r=arguments[2]}var n=re.ToObject(this);var o=re.ToLength(n.length);t=re.ToInteger(typeof t==="undefined"?0:t);r=re.ToInteger(typeof r==="undefined"?o:r);var i=t<0?A(o+t,0):R(t,o);var a=r<0?o+r:r;for(var u=i;u1?arguments[1]:null;for(var i=0,a;i1?arguments[1]:null;for(var i=0;i1&&typeof arguments[1]!=="undefined"){return re.Call(Ze,this,arguments)}else{return t(Ze,this,e)}})}var Ye=-(Math.pow(2,32)-1);var Qe=function(e,r){var n={length:Ye};n[r?(n.length>>>0)-1:0]=true;return a(function(){t(e,n,function(){throw new RangeError("should not reach here")},[]);return true})};if(!Qe(Array.prototype.forEach)){var et=Array.prototype.forEach;Z(Array.prototype,"forEach",function forEach(e){return re.Call(et,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.map)){var tt=Array.prototype.map;Z(Array.prototype,"map",function map(e){return re.Call(tt,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.filter)){var rt=Array.prototype.filter;Z(Array.prototype,"filter",function filter(e){return re.Call(rt,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.some)){var nt=Array.prototype.some;Z(Array.prototype,"some",function some(e){return re.Call(nt,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.every)){var ot=Array.prototype.every;Z(Array.prototype,"every",function every(e){return re.Call(ot,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.reduce)){var it=Array.prototype.reduce;Z(Array.prototype,"reduce",function reduce(e){return re.Call(it,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.reduceRight,true)){var at=Array.prototype.reduceRight;Z(Array.prototype,"reduceRight",function reduceRight(e){return re.Call(at,this.length>=0?this:[],arguments)},true)}var ut=Number("0o10")!==8;var ft=Number("0b10")!==2;var st=y(De,function(e){return Number(e+0+e)===0});if(ut||ft||st){var ct=Number;var lt=/^0b[01]+$/i;var pt=/^0o[0-7]+$/i;var vt=lt.test.bind(lt);var yt=pt.test.bind(pt);var ht=function(e){var t;if(typeof e.valueOf==="function"){t=e.valueOf();if(K.primitive(t)){return t}}if(typeof e.toString==="function"){t=e.toString();if(K.primitive(t)){return t}}throw new TypeError("No default value")};var bt=ze.test.bind(ze);var gt=qe.test.bind(qe);var dt=function(){var e=function Number(t){var r;if(arguments.length>0){r=K.primitive(t)?t:ht(t,"number")}else{r=0}if(typeof r==="string"){r=re.Call(Le,r);if(vt(r)){r=parseInt(C(r,2),2)}else if(yt(r)){r=parseInt(C(r,2),8)}else if(bt(r)||gt(r)){r=NaN}}var n=this;var o=a(function(){ct.prototype.valueOf.call(n);return true});if(n instanceof e&&!o){return new ct(r)}return ct(r)};return e}();de(ct,dt,{});b(dt,{NaN:ct.NaN,MAX_VALUE:ct.MAX_VALUE,MIN_VALUE:ct.MIN_VALUE,NEGATIVE_INFINITY:ct.NEGATIVE_INFINITY,POSITIVE_INFINITY:ct.POSITIVE_INFINITY});Number=dt;O.redefine(S,"Number",dt)}var Ot=Math.pow(2,53)-1;b(Number,{MAX_SAFE_INTEGER:Ot,MIN_SAFE_INTEGER:-Ot,EPSILON:2.220446049250313e-16,parseInt:S.parseInt,parseFloat:S.parseFloat,isFinite:B,isInteger:function isInteger(e){return B(e)&&re.ToInteger(e)===e},isSafeInteger:function isSafeInteger(e){return Number.isInteger(e)&&k(e)<=Number.MAX_SAFE_INTEGER},isNaN:V});h(Number,"parseInt",S.parseInt,Number.parseInt!==S.parseInt);if(![,1].find(function(e,t){return t===0})){Z(Array.prototype,"find",$e.find)}if([,1].findIndex(function(e,t){return t===0})!==0){Z(Array.prototype,"findIndex",$e.findIndex)}var mt=Function.bind.call(Function.bind,Object.prototype.propertyIsEnumerable);var wt=function ensureEnumerable(e,t){if(s&&mt(e,t)){Object.defineProperty(e,t,{enumerable:false})}};var jt=function sliceArgs(){var e=Number(this);var t=arguments.length;var r=t-e;var n=new Array(r<0?0:r);for(var o=e;o1){return NaN}if(t===-1){return-Infinity}if(t===1){return Infinity}if(t===0){return t}return.5*L((1+t)/(1-t))},cbrt:function cbrt(e){var t=Number(e);if(t===0){return t}var r=t<0;var n;if(r){t=-t}if(t===Infinity){n=Infinity}else{n=F(L(t)/3);n=(t/(n*n)+2*n)/3}return r?-n:n},clz32:function clz32(e){var t=Number(e);var r=re.ToUint32(t);if(r===0){return 32}return Or?re.Call(Or,r):31-_(L(r+.5)*gr)},cosh:function cosh(e){var t=Number(e);if(t===0){return 1}if(V(t)){return NaN}if(!T(t)){return Infinity}if(t<0){t=-t}if(t>21){return F(t)/2}return(F(t)+F(-t))/2},expm1:function expm1(e){var t=Number(e);if(t===-Infinity){return-1}if(!T(t)||t===0){return t}if(k(t)>.5){return F(t)-1}var r=t;var n=0;var o=1;while(n+r!==n){n+=r;o+=1;r*=t/o}return n},hypot:function hypot(e,t){var r=0;var n=0;for(var o=0;o0?i/n*(i/n):i}}return n===Infinity?Infinity:n*D(r)},log2:function log2(e){return L(e)*gr},log10:function log10(e){return L(e)*dr},log1p:function log1p(e){var t=Number(e);if(t<-1||V(t)){return NaN}if(t===0||t===Infinity){return t}if(t===-1){return-Infinity}return 1+t-1===0?t:t*(L(1+t)/(1+t-1))},sign:$,sinh:function sinh(e){var t=Number(e);if(!T(t)||t===0){return t}if(k(t)<1){return(Math.expm1(t)-Math.expm1(-t))/2}return(F(t-1)-F(-t-1))*br/2},tanh:function tanh(e){var t=Number(e);if(V(t)||t===0){return t}if(t>=20){return 1}if(t<=-20){return-1}return(Math.expm1(t)-Math.expm1(-t))/(F(t)+F(-t))},trunc:function trunc(e){var t=Number(e);return t<0?-_(-t):_(t)},imul:function imul(e,t){var r=re.ToUint32(e);var n=re.ToUint32(t);var o=r>>>16&65535;var i=r&65535;var a=n>>>16&65535;var u=n&65535;return i*u+(o*u+i*a<<16>>>0)|0},fround:function fround(e){var t=Number(e);if(t===0||t===Infinity||t===-Infinity||V(t)){return t}var r=$(t);var n=k(t);if(nyr||V(i)){return r*Infinity}return r*i}};b(Math,mr);h(Math,"log1p",mr.log1p,Math.log1p(-1e-17)!==-1e-17);h(Math,"asinh",mr.asinh,Math.asinh(-1e7)!==-Math.asinh(1e7));h(Math,"tanh",mr.tanh,Math.tanh(-2e-17)!==-2e-17);h(Math,"acosh",mr.acosh,Math.acosh(Number.MAX_VALUE)===Infinity);h(Math,"cbrt",mr.cbrt,Math.abs(1-Math.cbrt(1e-300)/1e-100)/Number.EPSILON>8);h(Math,"sinh",mr.sinh,Math.sinh(-2e-17)!==-2e-17);var wr=Math.expm1(10);h(Math,"expm1",mr.expm1,wr>22025.465794806718||wr<22025.465794806718);var jr=Math.round;var Sr=Math.round(.5-Number.EPSILON/4)===0&&Math.round(-.5+Number.EPSILON/3.99)===1;var Tr=lr+1;var Ir=2*lr-1;var Er=[Tr,Ir].every(function(e){return Math.round(e)===e});h(Math,"round",function round(e){var t=_(e);var r=t===-1?-0:t+1;return e-t<.5?t:r},!Sr||!Er);O.preserveToString(Math.round,jr);var Pr=Math.imul;if(Math.imul(4294967295,5)!==-5){Math.imul=mr.imul;O.preserveToString(Math.imul,Pr)}if(Math.imul.length!==2){Z(Math,"imul",function imul(e,t){return re.Call(Pr,Math,arguments); +})}var Cr=function(){var e=S.setTimeout;if(typeof e!=="function"&&typeof e!=="object"){return}re.IsPromise=function(e){if(!re.TypeIsObject(e)){return false}if(typeof e._promise==="undefined"){return false}return true};var r=function(e){if(!re.IsConstructor(e)){throw new TypeError("Bad promise constructor")}var t=this;var r=function(e,r){if(t.resolve!==void 0||t.reject!==void 0){throw new TypeError("Bad Promise implementation!")}t.resolve=e;t.reject=r};t.resolve=void 0;t.reject=void 0;t.promise=new e(r);if(!(re.IsCallable(t.resolve)&&re.IsCallable(t.reject))){throw new TypeError("Bad promise constructor")}};var n;if(typeof window!=="undefined"&&re.IsCallable(window.postMessage)){n=function(){var e=[];var t="zero-timeout-message";var r=function(r){M(e,r);window.postMessage(t,"*")};var n=function(r){if(r.source===window&&r.data===t){r.stopPropagation();if(e.length===0){return}var n=N(e);n()}};window.addEventListener("message",n,true);return r}}var o=function(){var e=S.Promise;var t=e&&e.resolve&&e.resolve();return t&&function(e){return t.then(e)}};var i=re.IsCallable(S.setImmediate)?S.setImmediate:typeof process==="object"&&process.nextTick?process.nextTick:o()||(re.IsCallable(n)?n():function(t){e(t,0)});var a=function(e){return e};var u=function(e){throw e};var f=0;var s=1;var c=2;var l=0;var p=1;var v=2;var y={};var h=function(e,t,r){i(function(){g(e,t,r)})};var g=function(e,t,r){var n,o;if(t===y){return e(r)}try{n=e(r);o=t.resolve}catch(i){n=i;o=t.reject}o(n)};var d=function(e,t){var r=e._promise;var n=r.reactionLength;if(n>0){h(r.fulfillReactionHandler0,r.reactionCapability0,t);r.fulfillReactionHandler0=void 0;r.rejectReactions0=void 0;r.reactionCapability0=void 0;if(n>1){for(var o=1,i=0;o0){h(r.rejectReactionHandler0,r.reactionCapability0,t);r.fulfillReactionHandler0=void 0;r.rejectReactions0=void 0;r.reactionCapability0=void 0;if(n>1){for(var o=1,i=0;o2&&arguments[2]===y;if(b&&o===E){i=y}else{i=new r(o)}var g=re.IsCallable(e)?e:a;var d=re.IsCallable(t)?t:u;var O=n._promise;var m;if(O.state===f){if(O.reactionLength===0){O.fulfillReactionHandler0=g;O.rejectReactionHandler0=d;O.reactionCapability0=i}else{var w=3*(O.reactionLength-1);O[w+l]=g;O[w+p]=d;O[w+v]=i}O.reactionLength+=1}else if(O.state===s){m=O.result;h(g,i,m)}else if(O.state===c){m=O.result;h(d,i,m)}else{throw new TypeError("unexpected Promise state")}return i.promise}});y=new r(E);I=T.then;return E}();if(S.Promise){delete S.Promise.accept;delete S.Promise.defer;delete S.Promise.prototype.chain}if(typeof Cr==="function"){b(S,{Promise:Cr});var Mr=w(S.Promise,function(e){return e.resolve(42).then(function(){})instanceof e});var xr=!i(function(){S.Promise.reject(42).then(null,5).then(null,W)});var Nr=i(function(){S.Promise.call(3,W)});var Ar=function(e){var t=e.resolve(5);t.constructor={};var r=e.resolve(t);try{r.then(null,W).then(null,W)}catch(n){return true}return t===r}(S.Promise);var Rr=s&&function(){var e=0;var t=Object.defineProperty({},"then",{get:function(){e+=1}});Promise.resolve(t);return e===1}();var _r=function BadResolverPromise(e){var t=new Promise(e);e(3,function(){});this.then=t.then;this.constructor=BadResolverPromise};_r.prototype=Promise.prototype;_r.all=Promise.all;var kr=a(function(){return!!_r.all([1,2])});if(!Mr||!xr||!Nr||Ar||!Rr||kr){Promise=Cr;Z(S,"Promise",Cr)}if(Promise.all.length!==1){var Fr=Promise.all;Z(Promise,"all",function all(e){return re.Call(Fr,this,arguments)})}if(Promise.race.length!==1){var Lr=Promise.race;Z(Promise,"race",function race(e){return re.Call(Lr,this,arguments)})}if(Promise.resolve.length!==1){var Dr=Promise.resolve;Z(Promise,"resolve",function resolve(e){return re.Call(Dr,this,arguments)})}if(Promise.reject.length!==1){var zr=Promise.reject;Z(Promise,"reject",function reject(e){return re.Call(zr,this,arguments)})}wt(Promise,"all");wt(Promise,"race");wt(Promise,"resolve");wt(Promise,"reject");me(Promise)}var qr=function(e){var t=n(p(e,function(e,t){e[t]=true;return e},{}));return e.join(":")===t.join(":")};var Wr=qr(["z","a","bb"]);var Gr=qr(["z",1,"a","3",2]);if(s){var Hr=function fastkey(e){if(!Wr){return null}if(typeof e==="undefined"||e===null){return"^"+re.ToString(e)}else if(typeof e==="string"){return"$"+e}else if(typeof e==="number"){if(!Gr){return"n"+e}return e}else if(typeof e==="boolean"){return"b"+e}return null};var Vr=function emptyObject(){return Object.create?Object.create(null):{}};var Br=function addIterableToMap(e,n,o){if(r(o)||K.string(o)){l(o,function(e){if(!re.TypeIsObject(e)){throw new TypeError("Iterator value "+e+" is not an entry object")}n.set(e[0],e[1])})}else if(o instanceof e){t(e.prototype.forEach,o,function(e,t){n.set(t,e)})}else{var i,a;if(o!==null&&typeof o!=="undefined"){a=n.set;if(!re.IsCallable(a)){throw new TypeError("bad map")}i=re.GetIterator(o)}if(typeof i!=="undefined"){while(true){var u=re.IteratorStep(i);if(u===false){break}var f=u.value;try{if(!re.TypeIsObject(f)){throw new TypeError("Iterator value "+f+" is not an entry object")}t(a,n,f[0],f[1])}catch(s){re.IteratorClose(i,true);throw s}}}}};var $r=function addIterableToSet(e,n,o){if(r(o)||K.string(o)){l(o,function(e){n.add(e)})}else if(o instanceof e){t(e.prototype.forEach,o,function(e){n.add(e)})}else{var i,a;if(o!==null&&typeof o!=="undefined"){a=n.add;if(!re.IsCallable(a)){throw new TypeError("bad set")}i=re.GetIterator(o)}if(typeof i!=="undefined"){while(true){var u=re.IteratorStep(i);if(u===false){break}var f=u.value;try{t(a,n,f)}catch(s){re.IteratorClose(i,true);throw s}}}}};var Ur={Map:function(){var e={};var r=function MapEntry(e,t){this.key=e;this.value=t;this.next=null;this.prev=null};r.prototype.isRemoved=function isRemoved(){return this.key===e};var n=function isMap(e){return!!e._es6map};var o=function requireMapSlot(e,t){if(!re.TypeIsObject(e)||!n(e)){throw new TypeError("Method Map.prototype."+t+" called on incompatible receiver "+re.ToString(e))}};var i=function MapIterator(e,t){o(e,"[[MapIterator]]");this.head=e._head;this.i=this.head;this.kind=t};i.prototype={next:function next(){var e=this.i;var t=this.kind;var r=this.head;if(typeof this.i==="undefined"){return Ge()}while(e.isRemoved()&&e!==r){e=e.prev}var n;while(e.next!==r){e=e.next;if(!e.isRemoved()){if(t==="key"){n=e.key}else if(t==="value"){n=e.value}else{n=[e.key,e.value]}this.i=e;return Ge(n)}}this.i=void 0;return Ge()}};we(i.prototype);var a;var u=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}if(this&&this._es6map){throw new TypeError("Bad construction")}var e=Te(this,Map,a,{_es6map:true,_head:null,_storage:Vr(),_size:0});var t=new r(null,null);t.next=t.prev=t;e._head=t;if(arguments.length>0){Br(Map,e,arguments[0])}return e};a=u.prototype;O.getter(a,"size",function(){if(typeof this._size==="undefined"){throw new TypeError("size method called on incompatible Map")}return this._size});b(a,{get:function get(e){o(this,"get");var t=Hr(e);if(t!==null){var r=this._storage[t];if(r){return r.value}else{return}}var n=this._head;var i=n;while((i=i.next)!==n){if(re.SameValueZero(i.key,e)){return i.value}}},has:function has(e){o(this,"has");var t=Hr(e);if(t!==null){return typeof this._storage[t]!=="undefined"}var r=this._head;var n=r;while((n=n.next)!==r){if(re.SameValueZero(n.key,e)){return true}}return false},set:function set(e,t){o(this,"set");var n=this._head;var i=n;var a;var u=Hr(e);if(u!==null){if(typeof this._storage[u]!=="undefined"){this._storage[u].value=t;return this}else{a=this._storage[u]=new r(e,t);i=n.prev}}while((i=i.next)!==n){if(re.SameValueZero(i.key,e)){i.value=t;return this}}a=a||new r(e,t);if(re.SameValue(-0,e)){a.key=+0}a.next=this._head;a.prev=this._head.prev;a.prev.next=a;a.next.prev=a;this._size+=1;return this},"delete":function(t){o(this,"delete");var r=this._head;var n=r;var i=Hr(t);if(i!==null){if(typeof this._storage[i]==="undefined"){return false}n=this._storage[i].prev;delete this._storage[i]}while((n=n.next)!==r){if(re.SameValueZero(n.key,t)){n.key=n.value=e;n.prev.next=n.next;n.next.prev=n.prev;this._size-=1;return true}}return false},clear:function clear(){o(this,"clear");this._size=0;this._storage=Vr();var t=this._head;var r=t;var n=r.next;while((r=n)!==t){r.key=r.value=e;n=r.next;r.next=r.prev=t}t.next=t.prev=t},keys:function keys(){o(this,"keys");return new i(this,"key")},values:function values(){o(this,"values");return new i(this,"value")},entries:function entries(){o(this,"entries");return new i(this,"key+value")},forEach:function forEach(e){o(this,"forEach");var r=arguments.length>1?arguments[1]:null;var n=this.entries();for(var i=n.next();!i.done;i=n.next()){if(r){t(e,r,i.value[1],i.value[0],this)}else{e(i.value[1],i.value[0],this)}}}});we(a,a.entries);return u}(),Set:function(){var e=function isSet(e){return e._es6set&&typeof e._storage!=="undefined"};var r=function requireSetSlot(t,r){if(!re.TypeIsObject(t)||!e(t)){throw new TypeError("Set.prototype."+r+" called on incompatible receiver "+re.ToString(t))}};var o;var i=function Set(){if(!(this instanceof Set)){throw new TypeError('Constructor Set requires "new"')}if(this&&this._es6set){throw new TypeError("Bad construction")}var e=Te(this,Set,o,{_es6set:true,"[[SetData]]":null,_storage:Vr()});if(!e._es6set){throw new TypeError("bad set")}if(arguments.length>0){$r(Set,e,arguments[0])}return e};o=i.prototype;var a=function(e){var t=e;if(t==="^null"){return null}else if(t==="^undefined"){return void 0}else{var r=t.charAt(0);if(r==="$"){return C(t,1)}else if(r==="n"){return+C(t,1)}else if(r==="b"){return t==="btrue"}}return+t};var u=function ensureMap(e){if(!e["[[SetData]]"]){var t=e["[[SetData]]"]=new Ur.Map;l(n(e._storage),function(e){var r=a(e);t.set(r,r)});e["[[SetData]]"]=t}e._storage=null};O.getter(i.prototype,"size",function(){r(this,"size");if(this._storage){return n(this._storage).length}u(this);return this["[[SetData]]"].size});b(i.prototype,{has:function has(e){r(this,"has");var t;if(this._storage&&(t=Hr(e))!==null){return!!this._storage[t]}u(this);return this["[[SetData]]"].has(e)},add:function add(e){r(this,"add");var t;if(this._storage&&(t=Hr(e))!==null){this._storage[t]=true;return this}u(this);this["[[SetData]]"].set(e,e);return this},"delete":function(e){r(this,"delete");var t;if(this._storage&&(t=Hr(e))!==null){var n=z(this._storage,t);return delete this._storage[t]&&n}u(this);return this["[[SetData]]"]["delete"](e)},clear:function clear(){r(this,"clear");if(this._storage){this._storage=Vr()}if(this["[[SetData]]"]){this["[[SetData]]"].clear()}},values:function values(){r(this,"values");u(this);return this["[[SetData]]"].values()},entries:function entries(){r(this,"entries");u(this);return this["[[SetData]]"].entries()},forEach:function forEach(e){r(this,"forEach");var n=arguments.length>1?arguments[1]:null;var o=this;u(o);this["[[SetData]]"].forEach(function(r,i){if(n){t(e,n,i,i,o)}else{e(i,i,o)}})}});h(i.prototype,"keys",i.prototype.values,true);we(i.prototype,i.prototype.values);return i}()};if(S.Map||S.Set){var Jr=a(function(){return new Map([[1,2]]).get(1)===2});if(!Jr){var Xr=S.Map;S.Map=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}var e=new Xr;if(arguments.length>0){Br(Map,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,S.Map.prototype);return e};S.Map.prototype=m(Xr.prototype);h(S.Map.prototype,"constructor",S.Map,true);O.preserveToString(S.Map,Xr)}var Kr=new Map;var Zr=function(){var e=new Map([[1,0],[2,0],[3,0],[4,0]]);e.set(-0,e);return e.get(0)===e&&e.get(-0)===e&&e.has(0)&&e.has(-0)}();var Yr=Kr.set(1,2)===Kr;if(!Zr||!Yr){var Qr=Map.prototype.set;Z(Map.prototype,"set",function set(e,r){t(Qr,this,e===0?0:e,r);return this})}if(!Zr){var en=Map.prototype.get;var tn=Map.prototype.has;b(Map.prototype,{get:function get(e){return t(en,this,e===0?0:e)},has:function has(e){return t(tn,this,e===0?0:e)}},true);O.preserveToString(Map.prototype.get,en);O.preserveToString(Map.prototype.has,tn)}var rn=new Set;var nn=function(e){e["delete"](0);e.add(-0);return!e.has(0)}(rn);var on=rn.add(1)===rn;if(!nn||!on){var an=Set.prototype.add;Set.prototype.add=function add(e){t(an,this,e===0?0:e);return this};O.preserveToString(Set.prototype.add,an)}if(!nn){var un=Set.prototype.has;Set.prototype.has=function has(e){return t(un,this,e===0?0:e)};O.preserveToString(Set.prototype.has,un);var fn=Set.prototype["delete"];Set.prototype["delete"]=function SetDelete(e){return t(fn,this,e===0?0:e)};O.preserveToString(Set.prototype["delete"],fn)}var sn=w(S.Map,function(e){var t=new e([]);t.set(42,42);return t instanceof e});var cn=Object.setPrototypeOf&&!sn;var ln=function(){try{return!(S.Map()instanceof S.Map)}catch(e){return e instanceof TypeError}}();if(S.Map.length!==0||cn||!ln){var pn=S.Map;S.Map=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}var e=new pn;if(arguments.length>0){Br(Map,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,Map.prototype);return e};S.Map.prototype=pn.prototype;h(S.Map.prototype,"constructor",S.Map,true);O.preserveToString(S.Map,pn)}var vn=w(S.Set,function(e){var t=new e([]);t.add(42,42);return t instanceof e});var yn=Object.setPrototypeOf&&!vn;var hn=function(){try{return!(S.Set()instanceof S.Set)}catch(e){return e instanceof TypeError}}();if(S.Set.length!==0||yn||!hn){var bn=S.Set;S.Set=function Set(){if(!(this instanceof Set)){throw new TypeError('Constructor Set requires "new"')}var e=new bn;if(arguments.length>0){$r(Set,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,Set.prototype);return e};S.Set.prototype=bn.prototype;h(S.Set.prototype,"constructor",S.Set,true);O.preserveToString(S.Set,bn)}var gn=new S.Map;var dn=!a(function(){return gn.keys().next().done});if(typeof S.Map.prototype.clear!=="function"||(new S.Set).size!==0||gn.size!==0||typeof S.Map.prototype.keys!=="function"||typeof S.Set.prototype.keys!=="function"||typeof S.Map.prototype.forEach!=="function"||typeof S.Set.prototype.forEach!=="function"||u(S.Map)||u(S.Set)||typeof gn.keys().next!=="function"||dn||!sn){b(S,{Map:Ur.Map,Set:Ur.Set},true)}if(S.Set.prototype.keys!==S.Set.prototype.values){h(S.Set.prototype,"keys",S.Set.prototype.values,true)}we(Object.getPrototypeOf((new S.Map).keys()));we(Object.getPrototypeOf((new S.Set).keys()));if(c&&S.Set.prototype.has.name!=="has"){var On=S.Set.prototype.has;Z(S.Set.prototype,"has",function has(e){return t(On,this,e)})}}b(S,Ur);me(S.Map);me(S.Set)}var mn=function throwUnlessTargetIsObject(e){if(!re.TypeIsObject(e)){throw new TypeError("target must be an object")}};var wn={apply:function apply(){return re.Call(re.Call,null,arguments)},construct:function construct(e,t){if(!re.IsConstructor(e)){throw new TypeError("First argument must be a constructor.")}var r=arguments.length>2?arguments[2]:e;if(!re.IsConstructor(r)){throw new TypeError("new.target must be a constructor.")}return re.Construct(e,t,r,"internal")},deleteProperty:function deleteProperty(e,t){mn(e);if(s){var r=Object.getOwnPropertyDescriptor(e,t);if(r&&!r.configurable){return false}}return delete e[t]},has:function has(e,t){mn(e);return t in e}};if(Object.getOwnPropertyNames){Object.assign(wn,{ownKeys:function ownKeys(e){mn(e);var t=Object.getOwnPropertyNames(e);if(re.IsCallable(Object.getOwnPropertySymbols)){x(t,Object.getOwnPropertySymbols(e))}return t}})}var jn=function ConvertExceptionToBoolean(e){return!i(e)};if(Object.preventExtensions){Object.assign(wn,{isExtensible:function isExtensible(e){mn(e);return Object.isExtensible(e)},preventExtensions:function preventExtensions(e){mn(e);return jn(function(){Object.preventExtensions(e)})}})}if(s){var Sn=function get(e,t,r){var n=Object.getOwnPropertyDescriptor(e,t);if(!n){var o=Object.getPrototypeOf(e);if(o===null){return void 0}return Sn(o,t,r)}if("value"in n){return n.value}if(n.get){return re.Call(n.get,r)}return void 0};var Tn=function set(e,r,n,o){var i=Object.getOwnPropertyDescriptor(e,r);if(!i){var a=Object.getPrototypeOf(e);if(a!==null){return Tn(a,r,n,o)}i={value:void 0,writable:true,enumerable:true,configurable:true}}if("value"in i){if(!i.writable){return false}if(!re.TypeIsObject(o)){return false}var u=Object.getOwnPropertyDescriptor(o,r);if(u){return ee.defineProperty(o,r,{value:n})}else{return ee.defineProperty(o,r,{value:n,writable:true,enumerable:true,configurable:true})}}if(i.set){t(i.set,o,n);return true}return false};Object.assign(wn,{defineProperty:function defineProperty(e,t,r){mn(e);return jn(function(){Object.defineProperty(e,t,r)})},getOwnPropertyDescriptor:function getOwnPropertyDescriptor(e,t){mn(e);return Object.getOwnPropertyDescriptor(e,t)},get:function get(e,t){mn(e);var r=arguments.length>2?arguments[2]:e;return Sn(e,t,r)},set:function set(e,t,r){mn(e);var n=arguments.length>3?arguments[3]:e;return Tn(e,t,r,n)}})}if(Object.getPrototypeOf){var In=Object.getPrototypeOf;wn.getPrototypeOf=function getPrototypeOf(e){mn(e);return In(e)}}if(Object.setPrototypeOf&&wn.getPrototypeOf){var En=function(e,t){var r=t;while(r){if(e===r){return true}r=wn.getPrototypeOf(r)}return false};Object.assign(wn,{setPrototypeOf:function setPrototypeOf(e,t){mn(e);if(t!==null&&!re.TypeIsObject(t)){throw new TypeError("proto must be an object or null")}if(t===ee.getPrototypeOf(e)){return true}if(ee.isExtensible&&!ee.isExtensible(e)){return false}if(En(e,t)){return false}Object.setPrototypeOf(e,t);return true}})}var Pn=function(e,t){if(!re.IsCallable(S.Reflect[e])){h(S.Reflect,e,t)}else{var r=a(function(){S.Reflect[e](1);S.Reflect[e](NaN);S.Reflect[e](true);return true});if(r){Z(S.Reflect,e,t)}}};Object.keys(wn).forEach(function(e){Pn(e,wn[e])});var Cn=S.Reflect.getPrototypeOf;if(c&&Cn&&Cn.name!=="getPrototypeOf"){Z(S.Reflect,"getPrototypeOf",function getPrototypeOf(e){return t(Cn,S.Reflect,e)})}if(S.Reflect.setPrototypeOf){if(a(function(){S.Reflect.setPrototypeOf(1,{});return true})){Z(S.Reflect,"setPrototypeOf",wn.setPrototypeOf)}}if(S.Reflect.defineProperty){if(!a(function(){var e=!S.Reflect.defineProperty(1,"test",{value:1});var t=typeof Object.preventExtensions!=="function"||!S.Reflect.defineProperty(Object.preventExtensions({}),"test",{});return e&&t})){Z(S.Reflect,"defineProperty",wn.defineProperty)}}if(S.Reflect.construct){if(!a(function(){var e=function F(){};return S.Reflect.construct(function(){},[],e)instanceof e})){Z(S.Reflect,"construct",wn.construct)}}if(String(new Date(NaN))!=="Invalid Date"){var Mn=Date.prototype.toString;var xn=function toString(){var e=+this;if(e!==e){return"Invalid Date"}return re.Call(Mn,this)};Z(Date.prototype,"toString",xn)}var Nn={anchor:function anchor(e){return re.CreateHTML(this,"a","name",e)},big:function big(){return re.CreateHTML(this,"big","","")},blink:function blink(){return re.CreateHTML(this,"blink","","")},bold:function bold(){return re.CreateHTML(this,"b","","")},fixed:function fixed(){return re.CreateHTML(this,"tt","","")},fontcolor:function fontcolor(e){return re.CreateHTML(this,"font","color",e)},fontsize:function fontsize(e){return re.CreateHTML(this,"font","size",e)},italics:function italics(){return re.CreateHTML(this,"i","","")},link:function link(e){return re.CreateHTML(this,"a","href",e)},small:function small(){return re.CreateHTML(this,"small","","")},strike:function strike(){return re.CreateHTML(this,"strike","","")},sub:function sub(){return re.CreateHTML(this,"sub","","")},sup:function sub(){return re.CreateHTML(this,"sup","","")}};l(Object.keys(Nn),function(e){var r=String.prototype[e];var n=false;if(re.IsCallable(r)){var o=t(r,"",' " ');var i=P([],o.match(/"/g)).length;n=o!==o.toLowerCase()||i>2}else{n=true}if(n){Z(String.prototype,e,Nn[e])}});var An=function(){if(!Y){return false}var e=typeof JSON==="object"&&typeof JSON.stringify==="function"?JSON.stringify:null;if(!e){return false}if(typeof e(G())!=="undefined"){return true}if(e([G()])!=="[null]"){return true}var t={a:G()};t[G()]=true;if(e(t)!=="{}"){return true}return false}();var Rn=a(function(){if(!Y){return true}return JSON.stringify(Object(G()))==="{}"&&JSON.stringify([Object(G())])==="[{}]"});if(An||!Rn){var _n=JSON.stringify;Z(JSON,"stringify",function stringify(e){if(typeof e==="symbol"){return}var n;if(arguments.length>1){n=arguments[1]}var o=[e];if(!r(n)){var i=re.IsCallable(n)?n:null;var a=function(e,r){var n=i?t(i,this,e,r):r;if(typeof n!=="symbol"){if(K.symbol(n)){return St({})(n)}else{return n}}};o.push(a)}else{o.push(n)}if(arguments.length>2){o.push(arguments[2])}return _n.apply(this,o)})}return S}); +//# sourceMappingURL=es6-shim.map diff --git a/src/opsoro/server/static/js/blockly/accessible/media/accessible.css b/src/opsoro/server/static/js/blockly/accessible/media/accessible.css new file mode 100644 index 0000000..500ee73 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/media/accessible.css @@ -0,0 +1,80 @@ +.blocklyWorkspaceColumn { + float: left; + margin-right: 20px; + width: 800px; +} +.blocklySidebarColumn { + border-left: 1px solid #888; + float: left; + padding-left: 20px; + margin-top: 20px; + min-height: 700px; + width: 200px; +} + +.blocklySidebarButton { + background-color: #fff; + border: 1px solid #333; + border-radius: 4px; + color: #000; + font-size: 1em; + margin: 10px 0 10px 30px; + padding: 10px; + text-align: center; + vertical-align: middle; + white-space: nowrap; +} +.blocklySidebarButton[disabled] { + border: 1px solid #ccc; + opacity: 0.5; +} + +.blocklyAriaLiveStatus { + background: #c8f7be; + border-radius: 10px; + bottom: 80px; + left: 20px; + max-width: 275px; + padding: 10px; + position: fixed; +} + +.blocklyTree .blocklyActiveDescendant > label, +.blocklyTree .blocklyActiveDescendant > div > label, +.blocklyActiveDescendant > button, +.blocklyActiveDescendant > input, +.blocklyActiveDescendant > select, +.blocklyActiveDescendant > blockly-field-segment > label, +.blocklyActiveDescendant > blockly-field-segment > input, +.blocklyActiveDescendant > blockly-field-segment > select { + outline: 2px dotted #00f; +} + +.blocklyDropdownListItem[aria-selected="true"] button { + font-weight: bold; +} + +.blocklyModalCurtain { + background-color: rgba(0,0,0,0.4); + height: 100%; + left: 0; + overflow: auto; + position: fixed; + top: 0; + width: 100%; + z-index: 1; +} +.blocklyModal { + background-color: #fefefe; + border: 1px solid #888; + margin: 10% auto; + max-width: 600px; + padding: 20px; + width: 60%; +} +.blocklyModalButtonContainer { + margin: 10px 0; +} +.blocklyModal .activeButton { + border: 1px solid blue; +} diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/click.mp3 b/src/opsoro/server/static/js/blockly/accessible/media/click.mp3 similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/click.mp3 rename to src/opsoro/server/static/js/blockly/accessible/media/click.mp3 diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/click.ogg b/src/opsoro/server/static/js/blockly/accessible/media/click.ogg similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/click.ogg rename to src/opsoro/server/static/js/blockly/accessible/media/click.ogg diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/click.wav b/src/opsoro/server/static/js/blockly/accessible/media/click.wav similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/click.wav rename to src/opsoro/server/static/js/blockly/accessible/media/click.wav diff --git a/src/opsoro/server/static/js/blockly/accessible/media/delete.mp3 b/src/opsoro/server/static/js/blockly/accessible/media/delete.mp3 new file mode 100644 index 0000000..1e71bdc Binary files /dev/null and b/src/opsoro/server/static/js/blockly/accessible/media/delete.mp3 differ diff --git a/src/opsoro/server/static/js/blockly/accessible/media/delete.ogg b/src/opsoro/server/static/js/blockly/accessible/media/delete.ogg new file mode 100644 index 0000000..a65b112 Binary files /dev/null and b/src/opsoro/server/static/js/blockly/accessible/media/delete.ogg differ diff --git a/src/opsoro/server/static/js/blockly/accessible/media/delete.wav b/src/opsoro/server/static/js/blockly/accessible/media/delete.wav new file mode 100644 index 0000000..455bcd3 Binary files /dev/null and b/src/opsoro/server/static/js/blockly/accessible/media/delete.wav differ diff --git a/src/opsoro/server/static/js/blockly/accessible/media/oops.mp3 b/src/opsoro/server/static/js/blockly/accessible/media/oops.mp3 new file mode 100644 index 0000000..0c95071 Binary files /dev/null and b/src/opsoro/server/static/js/blockly/accessible/media/oops.mp3 differ diff --git a/src/opsoro/server/static/js/blockly/accessible/media/oops.ogg b/src/opsoro/server/static/js/blockly/accessible/media/oops.ogg new file mode 100644 index 0000000..7bac05d Binary files /dev/null and b/src/opsoro/server/static/js/blockly/accessible/media/oops.ogg differ diff --git a/src/opsoro/server/static/js/blockly/accessible/media/oops.wav b/src/opsoro/server/static/js/blockly/accessible/media/oops.wav new file mode 100644 index 0000000..163df4f Binary files /dev/null and b/src/opsoro/server/static/js/blockly/accessible/media/oops.wav differ diff --git a/src/opsoro/server/static/js/blockly/accessible/messages.js b/src/opsoro/server/static/js/blockly/accessible/messages.js new file mode 100644 index 0000000..60c51d3 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/messages.js @@ -0,0 +1,62 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Translatable string constants for Accessible Blockly. + * @author madeeha@google.com (Madeeha Ghori) + */ +'use strict'; + +Blockly.Msg.WORKSPACE = 'Workspace'; +Blockly.Msg.WORKSPACE_BLOCK = + 'workspace block. Move right to edit. Press Enter for more options.'; + +Blockly.Msg.ATTACH_NEW_BLOCK_TO_LINK = 'Attach new block to link...'; +Blockly.Msg.CREATE_NEW_BLOCK_GROUP = 'Create new block group...'; +Blockly.Msg.ERASE_WORKSPACE = 'Erase Workspace'; +Blockly.Msg.NO_BLOCKS_IN_WORKSPACE = 'There are no blocks in the workspace.'; + +Blockly.Msg.COPY_BLOCK = 'Copy block'; +Blockly.Msg.DELETE = 'Delete block'; +Blockly.Msg.MARK_SPOT_BEFORE = 'Add link before'; +Blockly.Msg.MARK_SPOT_AFTER = 'Add link after'; +Blockly.Msg.MARK_THIS_SPOT = 'Add link inside'; +Blockly.Msg.MOVE_TO_MARKED_SPOT = 'Move to existing link'; +Blockly.Msg.PASTE_AFTER = 'Paste after'; +Blockly.Msg.PASTE_BEFORE = 'Paste before'; +Blockly.Msg.PASTE_INSIDE = 'Paste inside'; + +Blockly.Msg.BLOCK_OPTIONS = 'Block Options'; +Blockly.Msg.SELECT_A_BLOCK = 'Select a block...'; +Blockly.Msg.CANCEL = 'Cancel'; + +Blockly.Msg.ANY = 'any'; +Blockly.Msg.BLOCK = 'block'; +Blockly.Msg.BUTTON = 'Button.'; +Blockly.Msg.FOR = 'for'; +Blockly.Msg.VALUE = 'value'; + +Blockly.Msg.ADDED_LINK_MSG = 'Added link.'; +Blockly.Msg.ATTACHED_BLOCK_TO_LINK_MSG = 'attached to link. '; +Blockly.Msg.COPIED_BLOCK_MSG = 'copied. '; +Blockly.Msg.PASTED_BLOCK_FROM_CLIPBOARD_MSG = 'pasted. '; + +Blockly.Msg.PRESS_ENTER_TO_EDIT_NUMBER = 'Press Enter to edit number. '; +Blockly.Msg.PRESS_ENTER_TO_EDIT_TEXT = 'Press Enter to edit text. '; diff --git a/src/opsoro/server/static/js/blockly/accessible/notifications.service.js b/src/opsoro/server/static/js/blockly/accessible/notifications.service.js new file mode 100644 index 0000000..d16d765 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/notifications.service.js @@ -0,0 +1,58 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 Service for updating the ARIA live region that + * allows screenreaders to notify the user about actions that they have taken. + * @author sll@google.com (Sean Lip) + */ + +blocklyApp.NotificationsService = ng.core.Class({ + constructor: [function() { + this.currentMessage = ''; + this.timeouts = []; + }], + setDisplayedMessage_: function(newMessage) { + this.currentMessage = newMessage; + }, + getDisplayedMessage: function() { + return this.currentMessage; + }, + speak: function(newMessage) { + // Clear and reset any existing timeouts. + this.timeouts.forEach(function(timeout) { + clearTimeout(timeout); + }); + this.timeouts.length = 0; + + // Clear the current message, so that if, e.g., two operations of the same + // type are performed, both messages will be read in succession. + this.setDisplayedMessage_(''); + + // We need a non-zero timeout here, otherwise NVDA does not read the + // notification messages properly. + var that = this; + this.timeouts.push(setTimeout(function() { + that.setDisplayedMessage_(newMessage); + }, 20)); + this.timeouts.push(setTimeout(function() { + that.setDisplayedMessage_(''); + }, 5000)); + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/sidebar.component.js b/src/opsoro/server/static/js/blockly/accessible/sidebar.component.js new file mode 100644 index 0000000..de5ba6e --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/sidebar.component.js @@ -0,0 +1,108 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 Component representing the sidebar that is shown next + * to the workspace. + * + * @author sll@google.com (Sean Lip) + */ + +blocklyApp.SidebarComponent = ng.core.Component({ + selector: 'blockly-sidebar', + template: ` +
        + + + + +
        + `, + pipes: [blocklyApp.TranslatePipe] +}) +.Class({ + constructor: [ + blocklyApp.BlockConnectionService, + blocklyApp.ToolboxModalService, + blocklyApp.TreeService, + blocklyApp.UtilsService, + function( + blockConnectionService, toolboxModalService, treeService, + utilsService) { + // ACCESSIBLE_GLOBALS is a global variable defined by the containing + // page. It should contain a key, customSidebarButtons, describing + // additional buttons that should be displayed after the default ones. + // See README.md for details. + this.customSidebarButtons = + ACCESSIBLE_GLOBALS && ACCESSIBLE_GLOBALS.customSidebarButtons ? + ACCESSIBLE_GLOBALS.customSidebarButtons : []; + + this.blockConnectionService = blockConnectionService; + this.toolboxModalService = toolboxModalService; + this.treeService = treeService; + this.utilsService = utilsService; + + this.ID_FOR_ATTACH_TO_LINK_BUTTON = 'blocklyAttachToLinkBtn'; + this.ID_FOR_CREATE_NEW_GROUP_BUTTON = 'blocklyCreateNewGroupBtn'; + } + ], + isAnyConnectionMarked: function() { + return this.blockConnectionService.isAnyConnectionMarked(); + }, + isWorkspaceEmpty: function() { + return this.utilsService.isWorkspaceEmpty(); + }, + clearWorkspace: function() { + blocklyApp.workspace.clear(); + this.treeService.clearAllActiveDescs(); + // The timeout is needed in order to give the blocks time to be cleared + // from the workspace, and for the 'workspace is empty' button to show up. + setTimeout(function() { + document.getElementById(blocklyApp.ID_FOR_EMPTY_WORKSPACE_BTN).focus(); + }, 50); + }, + showToolboxModalForAttachToMarkedConnection: function() { + this.toolboxModalService.showToolboxModalForAttachToMarkedConnection( + this.ID_FOR_ATTACH_TO_LINK_BUTTON); + }, + showToolboxModalForCreateNewGroup: function() { + this.toolboxModalService.showToolboxModalForCreateNewGroup( + this.ID_FOR_CREATE_NEW_GROUP_BUTTON); + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/toolbox-modal.component.js b/src/opsoro/server/static/js/blockly/accessible/toolbox-modal.component.js new file mode 100644 index 0000000..61dc706 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/toolbox-modal.component.js @@ -0,0 +1,216 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 Component representing the toolbox modal. + * + * @author sll@google.com (Sean Lip) + */ + +blocklyApp.ToolboxModalComponent = ng.core.Component({ + selector: 'blockly-toolbox-modal', + template: ` +
        + +
        +

        {{'SELECT_A_BLOCK'|translate}}

        + +
        +

        {{toolboxCategory.categoryName}}

        +
        + +
        +
        +
        +
        + +
        +
        +
        + `, + pipes: [blocklyApp.TranslatePipe] +}) +.Class({ + constructor: [ + blocklyApp.ToolboxModalService, blocklyApp.KeyboardInputService, + blocklyApp.AudioService, blocklyApp.UtilsService, blocklyApp.TreeService, + function( + toolboxModalService_, keyboardInputService_, audioService_, + utilsService_, treeService_) { + this.toolboxModalService = toolboxModalService_; + this.keyboardInputService = keyboardInputService_; + this.audioService = audioService_; + this.utilsService = utilsService_; + this.treeService = treeService_; + + this.modalIsVisible = false; + this.toolboxCategories = []; + this.onSelectBlockCallback = null; + this.onDismissCallback = null; + + this.firstBlockIndexes = []; + this.activeButtonIndex = -1; + this.totalNumBlocks = 0; + + var that = this; + this.toolboxModalService.registerPreShowHook( + function( + toolboxCategories, onSelectBlockCallback, onDismissCallback) { + that.modalIsVisible = true; + that.toolboxCategories = toolboxCategories; + that.onSelectBlockCallback = onSelectBlockCallback; + that.onDismissCallback = onDismissCallback; + + // The indexes of the buttons corresponding to the first block in + // each category, as well as the 'cancel' button at the end. + that.firstBlockIndexes = []; + that.activeButtonIndex = -1; + that.totalNumBlocks = 0; + + var cumulativeIndex = 0; + that.toolboxCategories.forEach(function(category) { + that.firstBlockIndexes.push(cumulativeIndex); + cumulativeIndex += category.blocks.length; + }); + that.firstBlockIndexes.push(cumulativeIndex); + that.totalNumBlocks = cumulativeIndex; + + that.keyboardInputService.setOverride({ + // Tab key: navigates to the previous or next item in the list. + '9': function(evt) { + evt.preventDefault(); + evt.stopPropagation(); + + if (evt.shiftKey) { + // Move to the previous item in the list. + if (that.activeButtonIndex <= 0) { + that.activeActionButtonIndex = 0; + that.audioService.playOopsSound(); + } else { + that.activeButtonIndex--; + } + } else { + // Move to the next item in the list. + if (that.activeButtonIndex == that.totalNumBlocks) { + that.audioService.playOopsSound(); + } else { + that.activeButtonIndex++; + } + } + + that.focusOnOption(that.activeButtonIndex); + }, + // Enter key: selects a block (or the 'Cancel' button), and closes + // the modal. + '13': function(evt) { + evt.preventDefault(); + evt.stopPropagation(); + + if (that.activeButtonIndex == -1) { + return; + } + + var button = document.getElementById( + that.getOptionId(that.activeButtonIndex)); + + for (var i = 0; i < that.toolboxCategories.length; i++) { + if (that.firstBlockIndexes[i + 1] > that.activeButtonIndex) { + var categoryIndex = i; + var blockIndex = + that.activeButtonIndex - that.firstBlockIndexes[i]; + var block = that.getBlock(categoryIndex, blockIndex); + that.selectBlock(block); + return; + } + } + + // The 'Cancel' button has been pressed. + that.dismissModal(); + }, + // Escape key: closes the modal. + '27': function() { + that.dismissModal(); + }, + // Up key: no-op. + '38': function(evt) { + evt.preventDefault(); + }, + // Down key: no-op. + '40': function(evt) { + evt.preventDefault(); + } + }); + + setTimeout(function() { + document.getElementById('toolboxModal').focus(); + }, 150); + } + ); + } + ], + // Closes the modal (on both success and failure). + hideModal_: function() { + this.modalIsVisible = false; + this.keyboardInputService.clearOverride(); + this.toolboxModalService.hideModal(); + }, + getOverallIndex: function(categoryIndex, blockIndex) { + return this.firstBlockIndexes[categoryIndex] + blockIndex; + }, + getBlock: function(categoryIndex, blockIndex) { + return this.toolboxCategories[categoryIndex].blocks[blockIndex]; + }, + getBlockDescription: function(block) { + return this.utilsService.getBlockDescription(block); + }, + // Focuses on the button represented by the given index. + focusOnOption: function(index) { + var button = document.getElementById(this.getOptionId(index)); + button.focus(); + }, + // Returns the ID for the corresponding option button. + getOptionId: function(index) { + return 'toolbox-modal-option-' + index; + }, + // Returns the ID for the "cancel" option button. + getCancelOptionId: function() { + return 'toolbox-modal-option-' + this.totalNumBlocks; + }, + selectBlock: function(block) { + this.onSelectBlockCallback(block); + this.hideModal_(); + }, + // Dismisses and closes the modal. + dismissModal: function() { + this.hideModal_(); + this.onDismissCallback(); + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/toolbox-modal.service.js b/src/opsoro/server/static/js/blockly/accessible/toolbox-modal.service.js new file mode 100644 index 0000000..4103309 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/toolbox-modal.service.js @@ -0,0 +1,191 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 Service for the toolbox modal. + * + * @author sll@google.com (Sean Lip) + */ + +blocklyApp.ToolboxModalService = ng.core.Class({ + constructor: [ + blocklyApp.BlockConnectionService, + blocklyApp.NotificationsService, + blocklyApp.TreeService, + blocklyApp.UtilsService, + function( + blockConnectionService, notificationsService, treeService, + utilsService) { + this.blockConnectionService = blockConnectionService; + this.notificationsService = notificationsService; + this.treeService = treeService; + this.utilsService = utilsService; + + this.modalIsShown = false; + + this.selectedToolboxCategories = null; + this.onSelectBlockCallback = null; + this.onDismissCallback = null; + // The aim of the pre-show hook is to populate the modal component with + // the information it needs to display the modal (e.g., which categories + // and blocks to display). + this.preShowHook = function() { + throw Error( + 'A pre-show hook must be defined for the toolbox modal before it ' + + 'can be shown.'); + }; + + // Populate the toolbox categories. + this.allToolboxCategories = []; + var toolboxXmlElt = document.getElementById('blockly-toolbox-xml'); + var toolboxCategoryElts = toolboxXmlElt.getElementsByTagName('category'); + if (toolboxCategoryElts.length) { + this.allToolboxCategories = Array.from(toolboxCategoryElts).map( + function(categoryElt) { + var tmpWorkspace = new Blockly.Workspace(); + Blockly.Xml.domToWorkspace(categoryElt, tmpWorkspace); + return { + categoryName: categoryElt.attributes.name.value, + blocks: tmpWorkspace.topBlocks_ + }; + } + ); + this.computeCategoriesForCreateNewGroupModal_(); + } else { + // A timeout seems to be needed in order for the .children accessor to + // work correctly. + var that = this; + setTimeout(function() { + // If there are no top-level categories, we create a single category + // containing all the top-level blocks. + var tmpWorkspace = new Blockly.Workspace(); + Array.from(toolboxXmlElt.children).forEach(function(topLevelNode) { + Blockly.Xml.domToBlock(tmpWorkspace, topLevelNode); + }); + + that.allToolboxCategories = [{ + categoryName: '', + blocks: tmpWorkspace.topBlocks_ + }]; + + that.computeCategoriesForCreateNewGroupModal_(); + }); + } + } + ], + computeCategoriesForCreateNewGroupModal_: function() { + // Precompute toolbox categories for blocks that have no output + // connection (and that can therefore be used as the base block of a + // "create new block group" action). + this.toolboxCategoriesForNewGroup = []; + var that = this; + this.allToolboxCategories.forEach(function(toolboxCategory) { + var baseBlocks = toolboxCategory.blocks.filter(function(block) { + return !block.outputConnection; + }); + + if (baseBlocks.length > 0) { + that.toolboxCategoriesForNewGroup.push({ + categoryName: toolboxCategory.categoryName, + blocks: baseBlocks + }); + } + }); + }, + registerPreShowHook: function(preShowHook) { + var that = this; + this.preShowHook = function() { + preShowHook( + that.selectedToolboxCategories, that.onSelectBlockCallback, + that.onDismissCallback); + }; + }, + isModalShown: function() { + return this.modalIsShown; + }, + showModal_: function( + selectedToolboxCategories, onSelectBlockCallback, onDismissCallback) { + this.selectedToolboxCategories = selectedToolboxCategories; + this.onSelectBlockCallback = onSelectBlockCallback; + this.onDismissCallback = onDismissCallback; + + this.preShowHook(); + this.modalIsShown = true; + }, + hideModal: function() { + this.modalIsShown = false; + }, + showToolboxModalForAttachToMarkedConnection: function(sourceButtonId) { + var that = this; + + var selectedToolboxCategories = []; + this.allToolboxCategories.forEach(function(toolboxCategory) { + var selectedBlocks = toolboxCategory.blocks.filter(function(block) { + return that.blockConnectionService.canBeAttachedToMarkedConnection( + block); + }); + + if (selectedBlocks.length > 0) { + selectedToolboxCategories.push({ + categoryName: toolboxCategory.categoryName, + blocks: selectedBlocks + }); + } + }); + + this.showModal_(selectedToolboxCategories, function(block) { + var blockDescription = that.utilsService.getBlockDescription(block); + + // Clear the active desc for the destination tree, so that it can be + // cleanly reinstated after the new block is attached. + var destinationTreeId = that.treeService.getTreeIdForBlock( + that.blockConnectionService.getMarkedConnectionSourceBlock().id); + that.treeService.clearActiveDesc(destinationTreeId); + var newBlockId = that.blockConnectionService.attachToMarkedConnection( + block); + + // Invoke a digest cycle, so that the DOM settles. + setTimeout(function() { + that.treeService.focusOnBlock(newBlockId); + that.notificationsService.speak( + 'Attached. Now on, ' + blockDescription + ', block in workspace.'); + }); + }, function() { + document.getElementById(sourceButtonId).focus(); + }); + }, + showToolboxModalForCreateNewGroup: function(sourceButtonId) { + var that = this; + this.showModal_(this.toolboxCategoriesForNewGroup, function(block) { + var blockDescription = that.utilsService.getBlockDescription(block); + var xml = Blockly.Xml.blockToDom(block); + var newBlockId = Blockly.Xml.domToBlock(blocklyApp.workspace, xml).id; + + // Invoke a digest cycle, so that the DOM settles. + setTimeout(function() { + that.treeService.focusOnBlock(newBlockId); + that.notificationsService.speak( + 'Created new group in workspace. Now on, ' + blockDescription + + ', block in workspace.'); + }); + }, function() { + document.getElementById(sourceButtonId).focus(); + }); + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/translate.pipe.js b/src/opsoro/server/static/js/blockly/accessible/translate.pipe.js new file mode 100644 index 0000000..1ec66ee --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/translate.pipe.js @@ -0,0 +1,33 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 Pipe for internationalizing Blockly message strings. + * @author sll@google.com (Sean Lip) + */ + +blocklyApp.TranslatePipe = ng.core.Pipe({ + name: 'translate' +}) +.Class({ + constructor: function() {}, + transform: function(messageId) { + return Blockly.Msg[messageId]; + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/tree.service.js b/src/opsoro/server/static/js/blockly/accessible/tree.service.js new file mode 100644 index 0000000..bbd2e71 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/tree.service.js @@ -0,0 +1,595 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 Service that handles keyboard navigation on workspace + * block groups (internally represented as trees). This is a singleton service + * for the entire application. + * + * @author madeeha@google.com (Madeeha Ghori) + */ + +blocklyApp.TreeService = ng.core.Class({ + constructor: [ + blocklyApp.AudioService, + blocklyApp.BlockConnectionService, + blocklyApp.BlockOptionsModalService, + blocklyApp.NotificationsService, + blocklyApp.UtilsService, + function( + audioService, blockConnectionService, blockOptionsModalService, + notificationsService, utilsService) { + this.audioService = audioService; + this.blockConnectionService = blockConnectionService; + this.blockOptionsModalService = blockOptionsModalService; + this.notificationsService = notificationsService; + this.utilsService = utilsService; + + // The suffix used for all IDs of block root elements. + this.BLOCK_ROOT_ID_SUFFIX_ = blocklyApp.BLOCK_ROOT_ID_SUFFIX; + // Maps tree IDs to the IDs of their active descendants. + this.activeDescendantIds_ = {}; + // Array containing all the sidebar button elements. + this.sidebarButtonElements_ = Array.from( + document.querySelectorAll('button.blocklySidebarButton')); + } + ], + scrollToElement_: function(elementId) { + var element = document.getElementById(elementId); + var documentElement = document.body || document.documentElement; + if (element.offsetTop < documentElement.scrollTop || + element.offsetTop > documentElement.scrollTop + window.innerHeight) { + window.scrollTo(0, element.offsetTop - 10); + } + }, + + isLi_: function(node) { + return node.tagName == 'LI'; + }, + getParentLi_: function(element) { + var nextNode = element.parentNode; + while (nextNode && !this.isLi_(nextNode)) { + nextNode = nextNode.parentNode; + } + return nextNode; + }, + getFirstChildLi_: function(element) { + var childList = element.children; + for (var i = 0; i < childList.length; i++) { + if (this.isLi_(childList[i])) { + return childList[i]; + } else { + var potentialElement = this.getFirstChildLi_(childList[i]); + if (potentialElement) { + return potentialElement; + } + } + } + return null; + }, + getLastChildLi_: function(element) { + var childList = element.children; + for (var i = childList.length - 1; i >= 0; i--) { + if (this.isLi_(childList[i])) { + return childList[i]; + } else { + var potentialElement = this.getLastChildLi_(childList[i]); + if (potentialElement) { + return potentialElement; + } + } + } + return null; + }, + getInitialSiblingLi_: function(element) { + while (true) { + var previousSibling = this.getPreviousSiblingLi_(element); + if (previousSibling && previousSibling.id != element.id) { + element = previousSibling; + } else { + return element; + } + } + }, + getPreviousSiblingLi_: function(element) { + if (element.previousElementSibling) { + var sibling = element.previousElementSibling; + return this.isLi_(sibling) ? sibling : this.getLastChildLi_(sibling); + } else { + var parent = element.parentNode; + while (parent && parent.tagName != 'OL') { + if (parent.previousElementSibling) { + var node = parent.previousElementSibling; + return this.isLi_(node) ? node : this.getLastChildLi_(node); + } else { + parent = parent.parentNode; + } + } + return null; + } + }, + getNextSiblingLi_: function(element) { + if (element.nextElementSibling) { + var sibling = element.nextElementSibling; + return this.isLi_(sibling) ? sibling : this.getFirstChildLi_(sibling); + } else { + var parent = element.parentNode; + while (parent && parent.tagName != 'OL') { + if (parent.nextElementSibling) { + var node = parent.nextElementSibling; + return this.isLi_(node) ? node : this.getFirstChildLi_(node); + } else { + parent = parent.parentNode; + } + } + return null; + } + }, + getFinalSiblingLi_: function(element) { + while (true) { + var nextSibling = this.getNextSiblingLi_(element); + if (nextSibling && nextSibling.id != element.id) { + element = nextSibling; + } else { + return element; + } + } + }, + + // Returns a list of all focus targets in the workspace, including the + // "Create new group" button that appears when no blocks are present. + getWorkspaceFocusTargets_: function() { + return Array.from( + document.querySelectorAll('.blocklyWorkspaceFocusTarget')); + }, + getAllFocusTargets_: function() { + return this.getWorkspaceFocusTargets_().concat(this.sidebarButtonElements_); + }, + getNextFocusTargetId_: function(treeId) { + var trees = this.getAllFocusTargets_(); + for (var i = 0; i < trees.length - 1; i++) { + if (trees[i].id == treeId) { + return trees[i + 1].id; + } + } + return null; + }, + getPreviousFocusTargetId_: function(treeId) { + var trees = this.getAllFocusTargets_(); + for (var i = trees.length - 1; i > 0; i--) { + if (trees[i].id == treeId) { + return trees[i - 1].id; + } + } + return null; + }, + + getActiveDescId: function(treeId) { + return this.activeDescendantIds_[treeId] || ''; + }, + // Set the active desc for this tree to its first child. + initActiveDesc: function(treeId) { + var tree = document.getElementById(treeId); + this.setActiveDesc(this.getFirstChildLi_(tree).id, treeId); + }, + // Make a given element the active descendant of a given tree. + setActiveDesc: function(newActiveDescId, treeId) { + if (this.getActiveDescId(treeId)) { + this.clearActiveDesc(treeId); + } + document.getElementById(newActiveDescId).classList.add( + 'blocklyActiveDescendant'); + this.activeDescendantIds_[treeId] = newActiveDescId; + + // Scroll the new active desc into view, if needed. This has no effect + // for blind users, but is helpful for sighted onlookers. + this.scrollToElement_(newActiveDescId); + }, + // This clears the active descendant of the given tree. It is used just + // before the tree is deleted. + clearActiveDesc: function(treeId) { + var activeDesc = document.getElementById(this.getActiveDescId(treeId)); + if (activeDesc) { + activeDesc.classList.remove('blocklyActiveDescendant'); + delete this.activeDescendantIds_[treeId]; + } else { + throw Error( + 'The active desc element for the tree with ID ' + treeId + + ' is invalid.'); + } + }, + clearAllActiveDescs: function() { + for (var treeId in this.activeDescendantIds_) { + var activeDesc = document.getElementById(this.getActiveDescId(treeId)); + if (activeDesc) { + activeDesc.classList.remove('blocklyActiveDescendant'); + } + } + + this.activeDescendantIds_ = {}; + }, + + isTreeRoot_: function(element) { + return element.classList.contains('blocklyTree'); + }, + getBlockRootId_: function(blockId) { + return blockId + this.BLOCK_ROOT_ID_SUFFIX_; + }, + // Return the 'lowest' Blockly block in the DOM tree that contains the given + // DOM element. + getContainingBlock_: function(domElement) { + var potentialBlockRoot = domElement; + while (potentialBlockRoot.id.indexOf(this.BLOCK_ROOT_ID_SUFFIX_) === -1) { + potentialBlockRoot = potentialBlockRoot.parentNode; + } + + var blockRootId = potentialBlockRoot.id; + var blockId = blockRootId.substring( + 0, blockRootId.length - this.BLOCK_ROOT_ID_SUFFIX_.length); + return blocklyApp.workspace.getBlockById(blockId); + }, + isTopLevelBlock_: function(block) { + return !block.getParent(); + }, + // Returns whether the given block is at the top level, and has no siblings. + isIsolatedTopLevelBlock_: function(block) { + var blockHasNoSiblings = ( + (!block.nextConnection || + !block.nextConnection.targetConnection) && + (!block.previousConnection || + !block.previousConnection.targetConnection)); + return this.isTopLevelBlock_(block) && blockHasNoSiblings; + }, + safelyRemoveBlock_: function(block, deleteBlockFunc, areNextBlocksRemoved) { + // Runs the given deleteBlockFunc (which should have the effect of deleting + // the given block, and possibly others after it if `areNextBlocksRemoved` + // is true) and then does one of two things: + // - If the deleted block was an isolated top-level block, or it is a top- + // level block and the next blocks are going to be removed, this means + // the current tree has no more blocks after the deletion. So, pick a new + // tree to focus on. + // - Otherwise, set the correct new active desc for the current tree. + var treeId = this.getTreeIdForBlock(block.id); + + var treeCeasesToExist = areNextBlocksRemoved ? + this.isTopLevelBlock_(block) : this.isIsolatedTopLevelBlock_(block); + + if (treeCeasesToExist) { + // Find the node to focus on after the deletion happens. + var nextElementToFocusOn = null; + var focusTargets = this.getWorkspaceFocusTargets_(); + for (var i = 0; i < focusTargets.length; i++) { + if (focusTargets[i].id == treeId) { + if (i + 1 < focusTargets.length) { + nextElementToFocusOn = focusTargets[i + 1]; + } else if (i > 0) { + nextElementToFocusOn = focusTargets[i - 1]; + } + break; + } + } + + this.clearActiveDesc(treeId); + deleteBlockFunc(); + // Invoke a digest cycle, so that the DOM settles (and the "Create new + // group" button in the workspace shows up, if applicable). + setTimeout(function() { + if (nextElementToFocusOn) { + nextElementToFocusOn.focus(); + } else { + document.getElementById( + blocklyApp.ID_FOR_EMPTY_WORKSPACE_BTN).focus(); + } + }); + } else { + var blockRootId = this.getBlockRootId_(block.id); + var blockRootElement = document.getElementById(blockRootId); + + // Find the new active desc for the current tree by trying the following + // possibilities in order: the parent, the next sibling, and the previous + // sibling. (If `areNextBlocksRemoved` is true, the next sibling would be + // moved together with the moved block, so we don't check it.) + if (areNextBlocksRemoved) { + var newActiveDesc = + this.getParentLi_(blockRootElement) || + this.getPreviousSiblingLi_(blockRootElement); + } else { + var newActiveDesc = + this.getParentLi_(blockRootElement) || + this.getNextSiblingLi_(blockRootElement) || + this.getPreviousSiblingLi_(blockRootElement); + } + + this.clearActiveDesc(treeId); + deleteBlockFunc(); + // Invoke a digest cycle, so that the DOM settles. + var that = this; + setTimeout(function() { + that.setActiveDesc(newActiveDesc.id, treeId); + document.getElementById(treeId).focus(); + }); + } + }, + getTreeIdForBlock: function(blockId) { + // Walk up the DOM until we get to the root element of the tree. + var potentialRoot = document.getElementById(this.getBlockRootId_(blockId)); + while (!this.isTreeRoot_(potentialRoot)) { + potentialRoot = potentialRoot.parentNode; + } + return potentialRoot.id; + }, + // Set focus to the tree containing the given block, and set the tree's + // active desc to the root element of the given block. + focusOnBlock: function(blockId) { + // Invoke a digest cycle, in order to allow the ID of the newly-created + // tree to be set in the DOM. + var that = this; + setTimeout(function() { + var treeId = that.getTreeIdForBlock(blockId); + document.getElementById(treeId).focus(); + that.setActiveDesc(that.getBlockRootId_(blockId), treeId); + }); + }, + showBlockOptionsModal: function(block) { + var that = this; + var actionButtonsInfo = []; + + if (block.previousConnection) { + actionButtonsInfo.push({ + action: function() { + that.blockConnectionService.markConnection(block.previousConnection); + that.focusOnBlock(block.id); + }, + translationIdForText: 'MARK_SPOT_BEFORE' + }); + } + + if (block.nextConnection) { + actionButtonsInfo.push({ + action: function() { + that.blockConnectionService.markConnection(block.nextConnection); + that.focusOnBlock(block.id); + }, + translationIdForText: 'MARK_SPOT_AFTER' + }); + } + + if (this.blockConnectionService.canBeMovedToMarkedConnection(block)) { + actionButtonsInfo.push({ + action: function() { + var blockDescription = that.utilsService.getBlockDescription(block); + var oldDestinationTreeId = that.getTreeIdForBlock( + that.blockConnectionService.getMarkedConnectionSourceBlock().id); + that.clearActiveDesc(oldDestinationTreeId); + + var newBlockId = that.blockConnectionService.attachToMarkedConnection( + block); + that.safelyRemoveBlock_(block, function() { + block.dispose(false); + }, true); + + // Invoke a digest cycle, so that the DOM settles. + setTimeout(function() { + that.focusOnBlock(newBlockId); + var newDestinationTreeId = that.getTreeIdForBlock(newBlockId); + + if (newDestinationTreeId != oldDestinationTreeId) { + // The tree ID for a moved block does not seem to behave + // predictably. E.g. start with two separate groups of one block + // each, add a link before the block in the second group, and + // move the block in the first group to that link. The tree ID of + // the resulting group ends up being the tree ID for the group + // that was originally first, not second as might be expected. + // Here, we double-check to ensure that all affected trees have + // an active desc set. + if (document.getElementById(oldDestinationTreeId)) { + var activeDescId = that.getActiveDescId(oldDestinationTreeId); + var activeDescTreeId = null; + if (activeDescId) { + var oldDestinationBlock = that.getContainingBlock_( + document.getElementById(activeDescId)); + activeDescTreeId = that.getTreeIdForBlock( + oldDestinationBlock); + if (activeDescTreeId != oldDestinationTreeId) { + that.clearActiveDesc(oldDestinationTreeId); + } + } + that.initActiveDesc(oldDestinationTreeId); + } + } + + that.notificationsService.speak( + blockDescription + ' ' + + Blockly.Msg.ATTACHED_BLOCK_TO_LINK_MSG + + '. Now on attached block in workspace.'); + }); + }, + translationIdForText: 'MOVE_TO_MARKED_SPOT' + }); + } + + actionButtonsInfo.push({ + action: function() { + var blockDescription = that.utilsService.getBlockDescription(block); + + that.safelyRemoveBlock_(block, function() { + block.dispose(true); + that.audioService.playDeleteSound(); + }, false); + + setTimeout(function() { + var message = blockDescription + ' deleted. ' + ( + that.utilsService.isWorkspaceEmpty() ? + 'Workspace is empty.' : 'Now on workspace.'); + that.notificationsService.speak(message); + }); + }, + translationIdForText: 'DELETE' + }); + + this.blockOptionsModalService.showModal(actionButtonsInfo, function() { + that.focusOnBlock(block.id); + }); + }, + + moveUpOneLevel_: function(treeId) { + var activeDesc = document.getElementById(this.getActiveDescId(treeId)); + var nextNode = this.getParentLi_(activeDesc); + if (nextNode) { + this.setActiveDesc(nextNode.id, treeId); + } else { + this.audioService.playOopsSound(); + } + }, + onKeypress: function(e, tree) { + // TODO(sll): Instead of this, have a common ActiveContextService which + // returns true if at least one modal is shown, and false otherwise. + if (this.blockOptionsModalService.isModalShown()) { + return; + } + + var treeId = tree.id; + var activeDesc = document.getElementById(this.getActiveDescId(treeId)); + if (!activeDesc) { + console.error('ERROR: no active descendant for current tree.'); + this.initActiveDesc(treeId); + activeDesc = document.getElementById(this.getActiveDescId(treeId)); + } + + if (e.altKey || e.ctrlKey) { + // Do not intercept combinations such as Alt+Home. + return; + } + + if (document.activeElement.tagName == 'INPUT' || + document.activeElement.tagName == 'SELECT') { + // For input fields, Esc, Enter, and Tab keystrokes are handled specially. + if (e.keyCode == 9 || e.keyCode == 13 || e.keyCode == 27) { + // Return the focus to the workspace tree containing the input field. + document.getElementById(treeId).focus(); + + // Note that Tab and Enter events stop propagating, this behavior is + // handled on other listeners. + if (e.keyCode == 27 || e.keyCode == 13) { + e.preventDefault(); + e.stopPropagation(); + } + } + } else { + // Outside an input field, Enter, Tab, Esc and navigation keys are all + // recognized. + if (e.keyCode == 13) { + // Enter key. The user wants to interact with a button, interact with + // an input field, or open the block options modal. + // Algorithm to find the field: do a DFS through the children until + // we find an INPUT, BUTTON or SELECT element (in which case we use it). + // Truncate the search at child LI elements. + e.stopPropagation(); + + var found = false; + var dfsStack = Array.from(activeDesc.children); + while (dfsStack.length) { + var currentNode = dfsStack.shift(); + if (currentNode.tagName == 'BUTTON') { + currentNode.click(); + found = true; + break; + } else if (currentNode.tagName == 'INPUT') { + currentNode.focus(); + currentNode.select(); + this.notificationsService.speak( + 'Type a value, then press Escape to exit'); + found = true; + break; + } else if (currentNode.tagName == 'SELECT') { + currentNode.focus(); + found = true; + return; + } else if (currentNode.tagName == 'LI') { + continue; + } + + if (currentNode.children) { + var reversedChildren = Array.from(currentNode.children).reverse(); + reversedChildren.forEach(function(childNode) { + dfsStack.unshift(childNode); + }); + } + } + + // If we cannot find a field to interact with, we open the modal for + // the current block instead. + if (!found) { + var block = this.getContainingBlock_(activeDesc); + this.showBlockOptionsModal(block); + } + } else if (e.keyCode == 9) { + // Tab key. The event is allowed to propagate through. + } else if ([27, 35, 36, 37, 38, 39, 40].indexOf(e.keyCode) !== -1) { + if (e.keyCode == 27 || e.keyCode == 37) { + // Esc or left arrow key. Go up a level, if possible. + this.moveUpOneLevel_(treeId); + } else if (e.keyCode == 35) { + // End key. Go to the last sibling in the subtree. + var potentialFinalSibling = this.getFinalSiblingLi_(activeDesc); + if (potentialFinalSibling) { + this.setActiveDesc(potentialFinalSibling.id, treeId); + } + } else if (e.keyCode == 36) { + // Home key. Go to the first sibling in the subtree. + var potentialInitialSibling = this.getInitialSiblingLi_(activeDesc); + if (potentialInitialSibling) { + this.setActiveDesc(potentialInitialSibling.id, treeId); + } + } else if (e.keyCode == 38) { + // Up arrow key. Go to the previous sibling, if possible. + var potentialPrevSibling = this.getPreviousSiblingLi_(activeDesc); + if (potentialPrevSibling) { + this.setActiveDesc(potentialPrevSibling.id, treeId); + } else { + var statusMessage = 'Reached top of list.'; + if (this.getParentLi_(activeDesc)) { + statusMessage += ' Press left to go to parent list.'; + } + this.audioService.playOopsSound(statusMessage); + } + } else if (e.keyCode == 39) { + // Right arrow key. Go down a level, if possible. + var potentialFirstChild = this.getFirstChildLi_(activeDesc); + if (potentialFirstChild) { + this.setActiveDesc(potentialFirstChild.id, treeId); + } else { + this.audioService.playOopsSound(); + } + } else if (e.keyCode == 40) { + // Down arrow key. Go to the next sibling, if possible. + var potentialNextSibling = this.getNextSiblingLi_(activeDesc); + if (potentialNextSibling) { + this.setActiveDesc(potentialNextSibling.id, treeId); + } else { + this.audioService.playOopsSound('Reached bottom of list.'); + } + } + + e.preventDefault(); + e.stopPropagation(); + } + } + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/utils.service.js b/src/opsoro/server/static/js/blockly/accessible/utils.service.js new file mode 100644 index 0000000..aea9544 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/utils.service.js @@ -0,0 +1,42 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 utility service for multiple components. This is a + * singleton service that is used for the entire application. In general, it + * should only be used as a stateless adapter for native Blockly functions. + * + * @author madeeha@google.com (Madeeha Ghori) + */ + +var blocklyApp = {}; +blocklyApp.ID_FOR_EMPTY_WORKSPACE_BTN = 'blocklyEmptyWorkspaceBtn'; +blocklyApp.BLOCK_ROOT_ID_SUFFIX = '-blockRoot'; + +blocklyApp.UtilsService = ng.core.Class({ + constructor: [function() {}], + getBlockDescription: function(block) { + // We use 'BLANK' instead of the default '?' so that the string is read + // out. (By default, screen readers tend to ignore punctuation.) + return block.toString(undefined, 'BLANK'); + }, + isWorkspaceEmpty: function() { + return !blocklyApp.workspace.topBlocks_.length; + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/variable-modal.component.js b/src/opsoro/server/static/js/blockly/accessible/variable-modal.component.js new file mode 100644 index 0000000..43e8825 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/variable-modal.component.js @@ -0,0 +1,164 @@ +/** + * AccessibleBlockly + * + * Copyright 2017 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Component representing the variable modal. + * + * @author corydiers@google.com (Cory Diers) + */ + +blocklyApp.VariableModalComponent = ng.core.Component({ + selector: 'blockly-variable-modal', + template: ` +
        + +
        + +

        New Variable Name: + +

        +
        + + + +
        +
        + `, + pipes: [blocklyApp.TranslatePipe] +}) +.Class({ + constructor: [ + blocklyApp.AudioService, blocklyApp.KeyboardInputService, blocklyApp.VariableModalService, + function(audioService, keyboardService, variableService) { + this.workspace = blocklyApp.workspace; + this.variableModalService = variableService; + this.audioService = audioService; + this.keyboardInputService = keyboardService + this.modalIsVisible = false; + this.activeButtonIndex = -1; + this.currentVariableName = ""; + + var that = this; + this.variableModalService.registerPreShowHook( + function(oldName) { + that.currentVariableName = oldName; + that.modalIsVisible = true; + + that.keyboardInputService.setOverride({ + // Tab key: navigates to the previous or next item in the list. + '9': function(evt) { + evt.preventDefault(); + evt.stopPropagation(); + + if (evt.shiftKey) { + // Move to the previous item in the list. + if (that.activeButtonIndex <= 0) { + that.activeActionButtonIndex = 0; + that.audioService.playOopsSound(); + } else { + that.activeButtonIndex--; + } + } else { + // Move to the next item in the list. + if (that.activeButtonIndex == that.numInteractiveElements() - 1) { + that.audioService.playOopsSound(); + } else { + that.activeButtonIndex++; + } + } + + that.focusOnOption(that.activeButtonIndex); + }, + // Escape key: closes the modal. + '27': function() { + that.dismissModal(); + }, + // Up key: no-op. + '38': function(evt) { + evt.preventDefault(); + }, + // Down key: no-op. + '40': function(evt) { + evt.preventDefault(); + } + }); + + setTimeout(function() { + document.getElementById('mainFieldId').focus(); + }, 150); + } + ); + } + ], + // Caches the current text variable as the user types. + setTextValue: function(newValue) { + this.variableName = newValue; + }, + // Closes the modal (on both success and failure). + hideModal_: function() { + this.modalIsVisible = false; + this.keyboardInputService.clearOverride(); + }, + // Focuses on the button represented by the given index. + focusOnOption: function(index) { + var elements = this.getInteractiveElements(); + var button = elements[index]; + button.focus(); + }, + // Counts the number of interactive elements for the modal. + numInteractiveElements: function() { + var elements = this.getInteractiveElements(); + return elements.length; + }, + // Gets all the interactive elements for the modal. + getInteractiveElements: function() { + return Array.prototype.filter.call( + document.getElementById("varForm").elements, function(element) { + if (element.type === 'hidden') { + return false; + } + if (element.disabled) { + return false; + } + if (element.tabIndex < 0) { + return false; + } + return true; + }); + }, + // Submits the name change for the variable. + submit: function() { + this.workspace.renameVariable(this.currentVariableName, this.variableName); + this.hideModal_(); + }, + // Dismisses and closes the modal. + dismissModal: function() { + this.hideModal_(); + } +}) diff --git a/src/opsoro/server/static/js/blockly/accessible/variable-modal.service.js b/src/opsoro/server/static/js/blockly/accessible/variable-modal.service.js new file mode 100644 index 0000000..86b45bf --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/variable-modal.service.js @@ -0,0 +1,51 @@ +/** + * AccessibleBlockly + * + * Copyright 2017 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 Service for the variable modal. + * + * @author corydiers@google.com (Cory Diers) + */ + +blocklyApp.VariableModalService = ng.core.Class({ + constructor: [ + function() { + this.modalIsShown = false; + } + ], + // Registers a hook to be called before the modal is shown. + registerPreShowHook: function(preShowHook) { + this.preShowHook = function(oldName) { + preShowHook(oldName); + }; + }, + // Returns true if the variable modal is shown. + isModalShown: function() { + return this.modalIsShown; + }, + // Show the variable modal. + showModal_: function(oldName) { + this.preShowHook(oldName); + this.modalIsShown = true; + }, + // Hide the variable modal. + hideModal: function() { + this.modalIsShown = false; + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/workspace-block.component.js b/src/opsoro/server/static/js/blockly/accessible/workspace-block.component.js new file mode 100644 index 0000000..ab2df0b --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/workspace-block.component.js @@ -0,0 +1,205 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 Component representing a Blockly.Block in the + * workspace. + * @author madeeha@google.com (Madeeha Ghori) + */ + +blocklyApp.WorkspaceBlockComponent = ng.core.Component({ + selector: 'blockly-workspace-block', + template: ` +
      • + + +
          + +
        +
      • + + + + `, + directives: [blocklyApp.FieldSegmentComponent, ng.core.forwardRef(function() { + return blocklyApp.WorkspaceBlockComponent; + })], + inputs: ['block', 'level', 'tree'], + pipes: [blocklyApp.TranslatePipe] +}) +.Class({ + constructor: [ + blocklyApp.AudioService, + blocklyApp.BlockConnectionService, + blocklyApp.TreeService, + blocklyApp.UtilsService, + function(audioService, blockConnectionService, treeService, utilsService) { + this.audioService = audioService; + this.blockConnectionService = blockConnectionService; + this.treeService = treeService; + this.utilsService = utilsService; + this.cachedBlockId = null; + } + ], + ngDoCheck: function() { + // The block ID can change if, for example, a block is spliced between two + // linked blocks. We need to refresh the fields and component IDs when this + // happens. + if (this.cachedBlockId != this.block.id) { + this.cachedBlockId = this.block.id; + + var SUPPORTED_FIELDS = [Blockly.FieldTextInput, Blockly.FieldDropdown]; + this.inputListAsFieldSegments = this.block.inputList.map(function(input) { + // Converts the input list to an array of field segments. Each field + // segment represents a user-editable field, prefixed by an arbitrary + // number of non-editable fields. + var fieldSegments = []; + + var bufferedFields = []; + input.fieldRow.forEach(function(field) { + var fieldIsSupported = SUPPORTED_FIELDS.some(function(fieldType) { + return (field instanceof fieldType); + }); + + if (fieldIsSupported) { + var fieldSegment = { + prefixFields: [], + mainField: field + }; + bufferedFields.forEach(function(bufferedField) { + fieldSegment.prefixFields.push(bufferedField); + }); + fieldSegments.push(fieldSegment); + bufferedFields = []; + } else { + bufferedFields.push(field); + } + }); + + // Handle leftover text at the end. + if (bufferedFields.length) { + fieldSegments.push({ + prefixFields: bufferedFields, + mainField: null + }); + } + + return fieldSegments; + }); + + // Generate unique IDs for elements in this component. + this.componentIds = {}; + this.componentIds.blockRoot = + this.block.id + blocklyApp.BLOCK_ROOT_ID_SUFFIX; + this.componentIds.blockSummary = this.block.id + '-blockSummary'; + + var that = this; + this.componentIds.inputs = this.block.inputList.map(function(input, i) { + var idsToGenerate = ['inputLi', 'fieldLabel']; + if (input.connection && !input.connection.targetBlock()) { + idsToGenerate.push('actionButtonLi', 'actionButton', 'buttonLabel'); + } + + var inputIds = {}; + idsToGenerate.forEach(function(idBaseString) { + inputIds[idBaseString] = [that.block.id, i, idBaseString].join('-'); + }); + + return inputIds; + }); + } + }, + ngAfterViewInit: function() { + // If this is a top-level tree in the workspace, ensure that it has an + // active descendant. (Note that a timeout is needed here in order to + // trigger Angular change detection.) + var that = this; + setTimeout(function() { + if (that.level === 0 && !that.treeService.getActiveDescId(that.tree.id)) { + that.treeService.setActiveDesc( + that.componentIds.blockRoot, that.tree.id); + } + }); + }, + addInteriorLink: function(connection) { + this.blockConnectionService.markConnection(connection); + }, + getBlockDescription: function() { + var blockDescription = this.utilsService.getBlockDescription(this.block); + + var parentBlock = this.block.getSurroundParent(); + if (parentBlock) { + var fullDescription = blockDescription + ' inside ' + + this.utilsService.getBlockDescription(parentBlock); + return fullDescription; + } else { + return blockDescription; + } + }, + getBlockNeededLabel: function(blockInput) { + // The input type name, or 'any' if any official input type qualifies. + var inputTypeLabel = ( + blockInput.connection.check_ ? + blockInput.connection.check_.join(', ') : Blockly.Msg.ANY); + var blockTypeLabel = ( + blockInput.type == Blockly.NEXT_STATEMENT ? + Blockly.Msg.BLOCK : Blockly.Msg.VALUE); + return inputTypeLabel + ' ' + blockTypeLabel + ' needed:'; + }, + generateAriaLabelledByAttr: function(mainLabel, secondLabel) { + return mainLabel + (secondLabel ? ' ' + secondLabel : ''); + } +}); diff --git a/src/opsoro/server/static/js/blockly/accessible/workspace.component.js b/src/opsoro/server/static/js/blockly/accessible/workspace.component.js new file mode 100644 index 0000000..b6150a9 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/accessible/workspace.component.js @@ -0,0 +1,96 @@ +/** + * AccessibleBlockly + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angular2 Component that details how a Blockly.Workspace is + * rendered in AccessibleBlockly. + * + * @author madeeha@google.com (Madeeha Ghori) + */ + +blocklyApp.WorkspaceComponent = ng.core.Component({ + selector: 'blockly-workspace', + template: ` +
        +

        {{'WORKSPACE'|translate}}

        + +
        +
          + + +
        + + +

        + {{'NO_BLOCKS_IN_WORKSPACE'|translate}} + +

        +
        +
        +
        + `, + directives: [blocklyApp.WorkspaceBlockComponent], + pipes: [blocklyApp.TranslatePipe] +}) +.Class({ + constructor: [ + blocklyApp.NotificationsService, + blocklyApp.ToolboxModalService, + blocklyApp.TreeService, + function(notificationsService, toolboxModalService, treeService) { + this.notificationsService = notificationsService; + this.toolboxModalService = toolboxModalService; + this.treeService = treeService; + + this.ID_FOR_EMPTY_WORKSPACE_BTN = blocklyApp.ID_FOR_EMPTY_WORKSPACE_BTN; + this.workspace = blocklyApp.workspace; + this.currentTreeId = 0; + } + ], + getNewTreeId: function() { + this.currentTreeId++; + return 'blockly-tree-' + this.currentTreeId; + }, + getActiveDescId: function(treeId) { + return this.treeService.getActiveDescId(treeId); + }, + onKeypress: function(e, tree) { + this.treeService.onKeypress(e, tree); + }, + showToolboxModalForCreateNewGroup: function() { + this.toolboxModalService.showToolboxModalForCreateNewGroup( + this.ID_FOR_EMPTY_WORKSPACE_BTN); + }, + speakLocation: function(groupIndex, treeId) { + this.notificationsService.speak( + 'Now in workspace group ' + (groupIndex + 1) + ' of ' + + this.workspace.topBlocks_.length); + } +}); diff --git a/src/opsoro/server/static/js/blockly/appengine/README.txt b/src/opsoro/server/static/js/blockly/appengine/README.txt new file mode 100644 index 0000000..6ba262b --- /dev/null +++ b/src/opsoro/server/static/js/blockly/appengine/README.txt @@ -0,0 +1,44 @@ + + Running an App Engine server + +This directory contains the files needed to setup the optional Blockly server. +Although Blockly itself is 100% client-side, the server enables cloud storage +and sharing. Store your programs in Datastore and get a unique URL that allows +you to load the program on any computer. + +To run your own App Engine instance you'll need to create this directory +structure: + +blockly/ + |- app.yaml + |- index.yaml + |- index_redirect.py + |- README.txt + |- storage.js + |- storage.py + |- closure-library/ (Optional) + `- static/ + |- blocks/ + |- core/ + |- demos/ + |- generators/ + |- media/ + |- msg/ + |- tests/ + |- blockly_compressed.js + |- blockly_uncompressed.js (Optional) + |- blocks_compressed.js + |- dart_compressed.js + |- javascript_compressed.js + |- lua_compressed.js + |- php_compressed.js + `- python_compressed.js + +Instructions for fetching the optional Closure library may be found here: + https://developers.google.com/blockly/guides/modify/web/closure + +Go to https://appengine.google.com/ and create your App Engine application. +Modify the 'application' name of app.yaml to your App Engine application name. + +Finally, upload this directory structure to your App Engine account, +wait a minute, then go to http://YOURAPPNAME.appspot.com/ diff --git a/src/opsoro/apps/visual_programming/static/blockly/appengine/app.yaml b/src/opsoro/server/static/js/blockly/appengine/app.yaml similarity index 88% rename from src/opsoro/apps/visual_programming/static/blockly/appengine/app.yaml rename to src/opsoro/server/static/js/blockly/appengine/app.yaml index 001c4e4..8938830 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/appengine/app.yaml +++ b/src/opsoro/server/static/js/blockly/appengine/app.yaml @@ -34,7 +34,7 @@ handlers: static_dir: static secure: always -# Closure library for uncompiled Blockly. +# Closure library for uncompressed Blockly. - url: /closure-library static_dir: closure-library secure: always @@ -80,3 +80,8 @@ skip_files: - ^static/i18n/.*$ - ^static/msg/json/.*$ - ^.+\.soy$ +- ^closure-library/.*_test.html$ +- ^closure-library/.*_test.js$ +- ^closure-library/closure/bin/.*$ +- ^closure-library/doc/.*$ +- ^closure-library/scripts/.*$ diff --git a/src/opsoro/apps/visual_programming/static/blockly/appengine/apple-touch-icon.png b/src/opsoro/server/static/js/blockly/appengine/apple-touch-icon.png similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/appengine/apple-touch-icon.png rename to src/opsoro/server/static/js/blockly/appengine/apple-touch-icon.png diff --git a/src/opsoro/apps/visual_programming/static/blockly/appengine/favicon.ico b/src/opsoro/server/static/js/blockly/appengine/favicon.ico similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/appengine/favicon.ico rename to src/opsoro/server/static/js/blockly/appengine/favicon.ico diff --git a/src/opsoro/apps/visual_programming/static/blockly/appengine/index.yaml b/src/opsoro/server/static/js/blockly/appengine/index.yaml similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/appengine/index.yaml rename to src/opsoro/server/static/js/blockly/appengine/index.yaml diff --git a/src/opsoro/apps/visual_programming/static/blockly/appengine/index_redirect.py b/src/opsoro/server/static/js/blockly/appengine/index_redirect.py similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/appengine/index_redirect.py rename to src/opsoro/server/static/js/blockly/appengine/index_redirect.py diff --git a/src/opsoro/apps/visual_programming/static/blockly/appengine/redirect.html b/src/opsoro/server/static/js/blockly/appengine/redirect.html similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/appengine/redirect.html rename to src/opsoro/server/static/js/blockly/appengine/redirect.html diff --git a/src/opsoro/apps/visual_programming/static/blockly/appengine/robots.txt b/src/opsoro/server/static/js/blockly/appengine/robots.txt similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/appengine/robots.txt rename to src/opsoro/server/static/js/blockly/appengine/robots.txt diff --git a/src/opsoro/apps/visual_programming/static/blockly/appengine/storage.js b/src/opsoro/server/static/js/blockly/appengine/storage.js similarity index 98% rename from src/opsoro/apps/visual_programming/static/blockly/appengine/storage.js rename to src/opsoro/server/static/js/blockly/appengine/storage.js index 87d9cae..8141806 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/appengine/storage.js +++ b/src/opsoro/server/static/js/blockly/appengine/storage.js @@ -60,7 +60,7 @@ BlocklyStorage.restoreBlocks = function(opt_workspace) { if ('localStorage' in window && window.localStorage[url]) { var workspace = opt_workspace || Blockly.getMainWorkspace(); var xml = Blockly.Xml.textToDom(window.localStorage[url]); - Blockly.Xml.domToWorkspace(workspace, xml); + Blockly.Xml.domToWorkspace(xml, workspace); } }; @@ -181,7 +181,7 @@ BlocklyStorage.loadXml_ = function(xml, workspace) { } // Clear the workspace to avoid merge. workspace.clear(); - Blockly.Xml.domToWorkspace(workspace, xml); + Blockly.Xml.domToWorkspace(xml, workspace); }; /** diff --git a/src/opsoro/apps/visual_programming/static/blockly/appengine/storage.py b/src/opsoro/server/static/js/blockly/appengine/storage.py similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/appengine/storage.py rename to src/opsoro/server/static/js/blockly/appengine/storage.py diff --git a/src/opsoro/server/static/js/blockly/blockly_compressed.js b/src/opsoro/server/static/js/blockly/blockly_compressed.js new file mode 100644 index 0000000..069afbb --- /dev/null +++ b/src/opsoro/server/static/js/blockly/blockly_compressed.js @@ -0,0 +1,1554 @@ +// Do not edit this file; automatically generated by build.py. +'use strict'; + +var COMPILED=!0,goog=goog||{};goog.global=this;goog.isDef=function(a){return void 0!==a};goog.exportPath_=function(a,b,c){a=a.split(".");c=c||goog.global;a[0]in c||!c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)!a.length&&goog.isDef(b)?c[d]=b:c=c[d]&&Object.prototype.hasOwnProperty.call(c,d)?c[d]:c[d]={}}; +goog.define=function(a,b){var c=b;COMPILED||(goog.global.CLOSURE_UNCOMPILED_DEFINES&&Object.prototype.hasOwnProperty.call(goog.global.CLOSURE_UNCOMPILED_DEFINES,a)?c=goog.global.CLOSURE_UNCOMPILED_DEFINES[a]:goog.global.CLOSURE_DEFINES&&Object.prototype.hasOwnProperty.call(goog.global.CLOSURE_DEFINES,a)&&(c=goog.global.CLOSURE_DEFINES[a]));goog.exportPath_(a,c)};goog.DEBUG=!1;goog.LOCALE="en";goog.TRUSTED_SITE=!0;goog.STRICT_MODE_COMPATIBLE=!1;goog.DISALLOW_TEST_ONLY_CODE=COMPILED&&!goog.DEBUG; +goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING=!1;goog.provide=function(a){if(goog.isInModuleLoader_())throw Error("goog.provide can not be used within a goog.module.");if(!COMPILED&&goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');goog.constructNamespace_(a)};goog.constructNamespace_=function(a,b){if(!COMPILED){delete goog.implicitNamespaces_[a];for(var c=a;(c=c.substring(0,c.lastIndexOf(".")))&&!goog.getObjectByName(c);)goog.implicitNamespaces_[c]=!0}goog.exportPath_(a,b)}; +goog.VALID_MODULE_RE_=/^[a-zA-Z_$][a-zA-Z0-9._$]*$/; +goog.module=function(a){if(!goog.isString(a)||!a||-1==a.search(goog.VALID_MODULE_RE_))throw Error("Invalid module identifier");if(!goog.isInModuleLoader_())throw Error("Module "+a+" has been loaded incorrectly. Note, modules cannot be loaded as normal scripts. They require some kind of pre-processing step. You're likely trying to load a module via a script tag or as a part of a concatenated bundle without rewriting the module. For more info see: https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide.");if(goog.moduleLoaderState_.moduleName)throw Error("goog.module may only be called once per module."); +goog.moduleLoaderState_.moduleName=a;if(!COMPILED){if(goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');delete goog.implicitNamespaces_[a]}};goog.module.get=function(a){return goog.module.getInternal_(a)};goog.module.getInternal_=function(a){if(!COMPILED){if(a in goog.loadedModules_)return goog.loadedModules_[a];if(!goog.implicitNamespaces_[a])return a=goog.getObjectByName(a),null!=a?a:null}return null};goog.moduleLoaderState_=null; +goog.isInModuleLoader_=function(){return null!=goog.moduleLoaderState_};goog.module.declareLegacyNamespace=function(){if(!COMPILED&&!goog.isInModuleLoader_())throw Error("goog.module.declareLegacyNamespace must be called from within a goog.module");if(!COMPILED&&!goog.moduleLoaderState_.moduleName)throw Error("goog.module must be called prior to goog.module.declareLegacyNamespace.");goog.moduleLoaderState_.declareLegacyNamespace=!0}; +goog.setTestOnly=function(a){if(goog.DISALLOW_TEST_ONLY_CODE)throw a=a||"",Error("Importing test-only code into non-debug environment"+(a?": "+a:"."));};goog.forwardDeclare=function(a){};COMPILED||(goog.isProvided_=function(a){return a in goog.loadedModules_||!goog.implicitNamespaces_[a]&&goog.isDefAndNotNull(goog.getObjectByName(a))},goog.implicitNamespaces_={"goog.module":!0}); +goog.getObjectByName=function(a,b){for(var c=a.split("."),d=b||goog.global,e;e=c.shift();)if(goog.isDefAndNotNull(d[e]))d=d[e];else return null;return d};goog.globalize=function(a,b){var c=b||goog.global,d;for(d in a)c[d]=a[d]}; +goog.addDependency=function(a,b,c,d){if(goog.DEPENDENCIES_ENABLED){var e;a=a.replace(/\\/g,"/");var f=goog.dependencies_;d&&"boolean"!==typeof d||(d=d?{module:"goog"}:{});for(var g=0;e=b[g];g++)f.nameToPath[e]=a,f.loadFlags[a]=d;for(d=0;b=c[d];d++)a in f.requires||(f.requires[a]={}),f.requires[a][b]=!0}};goog.ENABLE_DEBUG_LOADER=!0;goog.logToConsole_=function(a){goog.global.console&&goog.global.console.error(a)}; +goog.require=function(a){if(!COMPILED){goog.ENABLE_DEBUG_LOADER&&goog.IS_OLD_IE_&&goog.maybeProcessDeferredDep_(a);if(goog.isProvided_(a)){if(goog.isInModuleLoader_())return goog.module.getInternal_(a)}else if(goog.ENABLE_DEBUG_LOADER){var b=goog.getPathFromDeps_(a);if(b)goog.writeScripts_(b);else throw a="goog.require could not find: "+a,goog.logToConsole_(a),Error(a);}return null}};goog.basePath="";goog.nullFunction=function(){}; +goog.abstractMethod=function(){throw Error("unimplemented abstract method");};goog.addSingletonGetter=function(a){a.instance_=void 0;a.getInstance=function(){if(a.instance_)return a.instance_;goog.DEBUG&&(goog.instantiatedSingletons_[goog.instantiatedSingletons_.length]=a);return a.instance_=new a}};goog.instantiatedSingletons_=[];goog.LOAD_MODULE_USING_EVAL=!0;goog.SEAL_MODULE_EXPORTS=goog.DEBUG;goog.loadedModules_={};goog.DEPENDENCIES_ENABLED=!COMPILED&&goog.ENABLE_DEBUG_LOADER;goog.TRANSPILE="detect"; +goog.TRANSPILER="transpile.js"; +goog.DEPENDENCIES_ENABLED&&(goog.dependencies_={loadFlags:{},nameToPath:{},requires:{},visited:{},written:{},deferred:{}},goog.inHtmlDocument_=function(){var a=goog.global.document;return null!=a&&"write"in a},goog.findBasePath_=function(){if(goog.isDef(goog.global.CLOSURE_BASE_PATH))goog.basePath=goog.global.CLOSURE_BASE_PATH;else if(goog.inHtmlDocument_())for(var a=goog.global.document.getElementsByTagName("SCRIPT"),b=a.length-1;0<=b;--b){var c=a[b].src,d=c.lastIndexOf("?"),d=-1==d?c.length:d;if("base.js"== +c.substr(d-7,7)){goog.basePath=c.substr(0,d-7);break}}},goog.importScript_=function(a,b){(goog.global.CLOSURE_IMPORT_SCRIPT||goog.writeScriptTag_)(a,b)&&(goog.dependencies_.written[a]=!0)},goog.IS_OLD_IE_=!(goog.global.atob||!goog.global.document||!goog.global.document.all),goog.importProcessedScript_=function(a,b,c){goog.importScript_("",'goog.retrieveAndExec_("'+a+'", '+b+", "+c+");")},goog.queuedModules_=[],goog.wrapModule_=function(a,b){return goog.LOAD_MODULE_USING_EVAL&&goog.isDef(goog.global.JSON)? +"goog.loadModule("+goog.global.JSON.stringify(b+"\n//# sourceURL="+a+"\n")+");":'goog.loadModule(function(exports) {"use strict";'+b+"\n;return exports});\n//# sourceURL="+a+"\n"},goog.loadQueuedModules_=function(){var a=goog.queuedModules_.length;if(0\x3c/script>')},goog.appendScriptSrcNode_=function(a){var b=goog.global.document,c=b.createElement("script");c.type="text/javascript";c.src=a;c.defer=!1;c.async=!1;b.head.appendChild(c)},goog.writeScriptTag_= +function(a,b){if(goog.inHtmlDocument_()){var c=goog.global.document;if(!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING&&"complete"==c.readyState){if(/\bdeps.js$/.test(a))return!1;throw Error('Cannot write "'+a+'" after document load');}if(void 0===b)if(goog.IS_OLD_IE_){var d=" onreadystatechange='goog.onScriptLoad_(this, "+ ++goog.lastNonModuleScriptIndex_+")' ";c.write(''); + // Load fresh Closure Library. + document.write(''); + document.write(''); +} diff --git a/src/opsoro/server/static/js/blockly/blocks/colour.js b/src/opsoro/server/static/js/blockly/blocks/colour.js new file mode 100644 index 0000000..99e5aac --- /dev/null +++ b/src/opsoro/server/static/js/blockly/blocks/colour.js @@ -0,0 +1,135 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Colour blocks for Blockly. + * + * This file is scraped to extract a .json file of block definitions. The array + * passed to defineBlocksWithJsonArray(..) must be strict JSON: double quotes + * only, no outside references, no functions, no trailing commas, etc. The one + * exception is end-of-line comments, which the scraper will remove. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Blocks.colour'); // Deprecated +goog.provide('Blockly.Constants.Colour'); + +goog.require('Blockly.Blocks'); + + +/** + * Common HSV hue for all blocks in this category. + * This should be the same as Blockly.Msg.COLOUR_HUE. + * @readonly + */ +Blockly.Constants.Colour.HUE = 20; +/** @deprecated Use Blockly.Constants.Colour.HUE */ +Blockly.Blocks.colour.HUE = Blockly.Constants.Colour.HUE; + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for colour picker. + { + "type": "colour_picker", + "message0": "%1", + "args0": [ + { + "type": "field_colour", + "name": "COLOUR", + "colour": "#ff0000" + } + ], + "output": "Colour", + "colour": "%{BKY_COLOUR_HUE}", + "helpUrl": "%{BKY_COLOUR_PICKER_HELPURL}", + "tooltip": "%{BKY_COLOUR_PICKER_TOOLTIP}", + "extensions": ["parent_tooltip_when_inline"] + }, + + // Block for random colour. + { + "type": "colour_random", + "message0": "%{BKY_COLOUR_RANDOM_TITLE}", + "output": "Colour", + "colour": "%{BKY_COLOUR_HUE}", + "helpUrl": "%{BKY_COLOUR_RANDOM_HELPURL}", + "tooltip": "%{BKY_COLOUR_RANDOM_TOOLTIP}" + }, + + // Block for composing a colour from RGB components. + { + "type": "colour_rgb", + "message0": "%{BKY_COLOUR_RGB_TITLE} %{BKY_COLOUR_RGB_RED} %1 %{BKY_COLOUR_RGB_GREEN} %2 %{BKY_COLOUR_RGB_BLUE} %3", + "args0": [ + { + "type": "input_value", + "name": "RED", + "check": "Number", + "align": "RIGHT" + }, + { + "type": "input_value", + "name": "GREEN", + "check": "Number", + "align": "RIGHT" + }, + { + "type": "input_value", + "name": "BLUE", + "check": "Number", + "align": "RIGHT" + } + ], + "output": "Colour", + "colour": "%{BKY_COLOUR_HUE}", + "helpUrl": "%{BKY_COLOUR_RGB_HELPURL}", + "tooltip": "%{BKY_COLOUR_RGB_TOOLTIP}" + }, + + // Block for blending two colours together. + { + "type": "colour_blend", + "message0": "%{BKY_COLOUR_BLEND_TITLE} %{BKY_COLOUR_BLEND_COLOUR1} %1 %{BKY_COLOUR_BLEND_COLOUR2} %2 %{BKY_COLOUR_BLEND_RATIO} %3", + "args0": [ + { + "type": "input_value", + "name": "COLOUR1", + "check": "Colour", + "align": "RIGHT" + }, + { + "type": "input_value", + "name": "COLOUR2", + "check": "Colour", + "align": "RIGHT" + }, + { + "type": "input_value", + "name": "RATIO", + "check": "Number", + "align": "RIGHT" + } + ], + "output": "Colour", + "colour": "%{BKY_COLOUR_HUE}", + "helpUrl": "%{BKY_COLOUR_BLEND_HELPURL}", + "tooltip": "%{BKY_COLOUR_BLEND_TOOLTIP}" + } +]); // END JSON EXTRACT (Do not delete this comment.) diff --git a/src/opsoro/server/static/js/blockly/blocks/lists.js b/src/opsoro/server/static/js/blockly/blocks/lists.js new file mode 100644 index 0000000..3c7ef34 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/blocks/lists.js @@ -0,0 +1,846 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview List blocks for Blockly. + * + * This file is scraped to extract a .json file of block definitions. The array + * passed to defineBlocksWithJsonArray(..) must be strict JSON: double quotes + * only, no outside references, no functions, no trailing commas, etc. The one + * exception is end-of-line comments, which the scraper will remove. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Blocks.lists'); // Deprecated +goog.provide('Blockly.Constants.Lists'); + +goog.require('Blockly.Blocks'); + + +/** + * Common HSV hue for all blocks in this category. + * This should be the same as Blockly.Msg.LISTS_HUE. + * @readonly + */ +Blockly.Constants.Lists.HUE = 260; +/** @deprecated Use Blockly.Constants.Lists.HUE */ +Blockly.Blocks.lists.HUE = Blockly.Constants.Lists.HUE; + + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for creating an empty list + // The 'list_create_with' block is preferred as it is more flexible. + // + // + // + { + "type": "lists_create_empty", + "message0": "%{BKY_LISTS_CREATE_EMPTY_TITLE}", + "output": "Array", + "colour": "%{BKY_LISTS_HUE}", + "tooltip": "%{BKY_LISTS_CREATE_EMPTY_TOOLTIP}", + "helpUrl": "%{BKY_LISTS_CREATE_EMPTY_HELPURL}" + }, + // Block for creating a list with one element repeated. + { + "type": "lists_repeat", + "message0": "%{BKY_LISTS_REPEAT_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "ITEM" + }, + { + "type": "input_value", + "name": "NUM", + "check": "Number" + } + ], + "output": "Array", + "colour": "%{BKY_LISTS_HUE}", + "tooltip": "%{BKY_LISTS_REPEAT_TOOLTIP}", + "helpUrl": "%{BKY_LISTS_REPEAT_HELPURL}" + }, + // Block for reversing a list. + { + "type": "lists_reverse", + "message0": "%{BKY_LISTS_REVERSE_MESSAGE0}", + "args0": [ + { + "type": "input_value", + "name": "LIST", + "check": "Array" + } + ], + "output": "Array", + "inputsInline": true, + "colour": "%{BKY_LISTS_HUE}", + "tooltip": "%{BKY_LISTS_REVERSE_TOOLTIP}", + "helpUrl": "%{BKY_LISTS_REVERSE_HELPURL}" + }, + // Block for checking if a list is empty + { + "type": "lists_isEmpty", + "message0": "%{BKY_LISTS_ISEMPTY_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "VALUE", + "check": ["String", "Array"] + } + ], + "output": "Boolean", + "colour": "%{BKY_LISTS_HUE}", + "tooltip": "%{BKY_LISTS_ISEMPTY_TOOLTIP}", + "helpUrl": "%{BKY_LISTS_ISEMPTY_HELPURL}" + }, + // Block for getting the list length + { + "type": "lists_length", + "message0": "%{BKY_LISTS_LENGTH_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "VALUE", + "check": ["String", "Array"] + } + ], + "output": "Number", + "colour": "%{BKY_LISTS_HUE}", + "tooltip": "%{BKY_LISTS_LENGTH_TOOLTIP}", + "helpUrl": "%{BKY_LISTS_LENGTH_HELPURL}" + } +]); // END JSON EXTRACT (Do not delete this comment.) + +Blockly.Blocks['lists_create_with'] = { + /** + * Block for creating a list with any number of elements of any type. + * @this Blockly.Block + */ + init: function() { + this.setHelpUrl(Blockly.Msg.LISTS_CREATE_WITH_HELPURL); + this.setColour(Blockly.Blocks.lists.HUE); + this.itemCount_ = 3; + this.updateShape_(); + this.setOutput(true, 'Array'); + this.setMutator(new Blockly.Mutator(['lists_create_with_item'])); + this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP); + }, + /** + * Create XML to represent list inputs. + * @return {!Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function() { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function(workspace) { + var containerBlock = workspace.newBlock('lists_create_with_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('lists_create_with_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function(containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + while (itemBlock) { + connections.push(itemBlock.valueConnection_); + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + // Disconnect any children that don't belong. + for (var i = 0; i < this.itemCount_; i++) { + var connection = this.getInput('ADD' + i).connection.targetConnection; + if (connection && connections.indexOf(connection) == -1) { + connection.disconnect(); + } + } + this.itemCount_ = connections.length; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + Blockly.Mutator.reconnect(connections[i], this, 'ADD' + i); + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function(containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function() { + if (this.itemCount_ && this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else if (!this.itemCount_ && !this.getInput('EMPTY')) { + this.appendDummyInput('EMPTY') + .appendField(Blockly.Msg.LISTS_CREATE_EMPTY_TITLE); + } + // Add new inputs. + for (var i = 0; i < this.itemCount_; i++) { + if (!this.getInput('ADD' + i)) { + var input = this.appendValueInput('ADD' + i); + if (i == 0) { + input.appendField(Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH); + } + } + } + // Remove deleted inputs. + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } +}; + +Blockly.Blocks['lists_create_with_container'] = { + /** + * Mutator block for list container. + * @this Blockly.Block + */ + init: function() { + this.setColour(Blockly.Blocks.lists.HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD); + this.appendStatementInput('STACK'); + this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP); + this.contextMenu = false; + } +}; + +Blockly.Blocks['lists_create_with_item'] = { + /** + * Mutator block for adding items. + * @this Blockly.Block + */ + init: function() { + this.setColour(Blockly.Blocks.lists.HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP); + this.contextMenu = false; + } +}; + +Blockly.Blocks['lists_indexOf'] = { + /** + * Block for finding an item in the list. + * @this Blockly.Block + */ + init: function() { + var OPERATORS = + [[Blockly.Msg.LISTS_INDEX_OF_FIRST, 'FIRST'], + [Blockly.Msg.LISTS_INDEX_OF_LAST, 'LAST']]; + this.setHelpUrl(Blockly.Msg.LISTS_INDEX_OF_HELPURL); + this.setColour(Blockly.Blocks.lists.HUE); + this.setOutput(true, 'Number'); + this.appendValueInput('VALUE') + .setCheck('Array') + .appendField(Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST); + this.appendValueInput('FIND') + .appendField(new Blockly.FieldDropdown(OPERATORS), 'END'); + this.setInputsInline(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function() { + return Blockly.Msg.LISTS_INDEX_OF_TOOLTIP.replace('%1', + thisBlock.workspace.options.oneBasedIndex ? '0' : '-1'); + }); + } +}; + +Blockly.Blocks['lists_getIndex'] = { + /** + * Block for getting element at index. + * @this Blockly.Block + */ + init: function() { + var MODE = + [[Blockly.Msg.LISTS_GET_INDEX_GET, 'GET'], + [Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE, 'GET_REMOVE'], + [Blockly.Msg.LISTS_GET_INDEX_REMOVE, 'REMOVE']]; + this.WHERE_OPTIONS = + [[Blockly.Msg.LISTS_GET_INDEX_FROM_START, 'FROM_START'], + [Blockly.Msg.LISTS_GET_INDEX_FROM_END, 'FROM_END'], + [Blockly.Msg.LISTS_GET_INDEX_FIRST, 'FIRST'], + [Blockly.Msg.LISTS_GET_INDEX_LAST, 'LAST'], + [Blockly.Msg.LISTS_GET_INDEX_RANDOM, 'RANDOM']]; + this.setHelpUrl(Blockly.Msg.LISTS_GET_INDEX_HELPURL); + this.setColour(Blockly.Blocks.lists.HUE); + var modeMenu = new Blockly.FieldDropdown(MODE, function(value) { + var isStatement = (value == 'REMOVE'); + this.sourceBlock_.updateStatement_(isStatement); + }); + this.appendValueInput('VALUE') + .setCheck('Array') + .appendField(Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST); + this.appendDummyInput() + .appendField(modeMenu, 'MODE') + .appendField('', 'SPACE'); + this.appendDummyInput('AT'); + if (Blockly.Msg.LISTS_GET_INDEX_TAIL) { + this.appendDummyInput('TAIL') + .appendField(Blockly.Msg.LISTS_GET_INDEX_TAIL); + } + this.setInputsInline(true); + this.setOutput(true); + this.updateAt_(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function() { + var mode = thisBlock.getFieldValue('MODE'); + var where = thisBlock.getFieldValue('WHERE'); + var tooltip = ''; + switch (mode + ' ' + where) { + case 'GET FROM_START': + case 'GET FROM_END': + tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM; + break; + case 'GET FIRST': + tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST; + break; + case 'GET LAST': + tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST; + break; + case 'GET RANDOM': + tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM; + break; + case 'GET_REMOVE FROM_START': + case 'GET_REMOVE FROM_END': + tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM; + break; + case 'GET_REMOVE FIRST': + tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST; + break; + case 'GET_REMOVE LAST': + tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST; + break; + case 'GET_REMOVE RANDOM': + tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM; + break; + case 'REMOVE FROM_START': + case 'REMOVE FROM_END': + tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM; + break; + case 'REMOVE FIRST': + tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST; + break; + case 'REMOVE LAST': + tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST; + break; + case 'REMOVE RANDOM': + tooltip = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM; + break; + } + if (where == 'FROM_START' || where == 'FROM_END') { + var msg = (where == 'FROM_START') ? + Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP : + Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP; + tooltip += ' ' + msg.replace('%1', + thisBlock.workspace.options.oneBasedIndex ? '#1' : '#0'); + } + return tooltip; + }); + }, + /** + * Create XML to represent whether the block is a statement or a value. + * Also represent whether there is an 'AT' input. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function() { + var container = document.createElement('mutation'); + var isStatement = !this.outputConnection; + container.setAttribute('statement', isStatement); + var isAt = this.getInput('AT').type == Blockly.INPUT_VALUE; + container.setAttribute('at', isAt); + return container; + }, + /** + * Parse XML to restore the 'AT' input. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + // Note: Until January 2013 this block did not have mutations, + // so 'statement' defaults to false and 'at' defaults to true. + var isStatement = (xmlElement.getAttribute('statement') == 'true'); + this.updateStatement_(isStatement); + var isAt = (xmlElement.getAttribute('at') != 'false'); + this.updateAt_(isAt); + }, + /** + * Switch between a value block and a statement block. + * @param {boolean} newStatement True if the block should be a statement. + * False if the block should be a value. + * @private + * @this Blockly.Block + */ + updateStatement_: function(newStatement) { + var oldStatement = !this.outputConnection; + if (newStatement != oldStatement) { + this.unplug(true, true); + if (newStatement) { + this.setOutput(false); + this.setPreviousStatement(true); + this.setNextStatement(true); + } else { + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true); + } + } + }, + /** + * Create or delete an input for the numeric index. + * @param {boolean} isAt True if the input should exist. + * @private + * @this Blockly.Block + */ + updateAt_: function(isAt) { + // Destroy old 'AT' and 'ORDINAL' inputs. + this.removeInput('AT'); + this.removeInput('ORDINAL', true); + // Create either a value 'AT' input or a dummy input. + if (isAt) { + this.appendValueInput('AT').setCheck('Number'); + if (Blockly.Msg.ORDINAL_NUMBER_SUFFIX) { + this.appendDummyInput('ORDINAL') + .appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX); + } + } else { + this.appendDummyInput('AT'); + } + var menu = new Blockly.FieldDropdown(this.WHERE_OPTIONS, function(value) { + var newAt = (value == 'FROM_START') || (value == 'FROM_END'); + // The 'isAt' variable is available due to this function being a closure. + if (newAt != isAt) { + var block = this.sourceBlock_; + block.updateAt_(newAt); + // This menu has been destroyed and replaced. Update the replacement. + block.setFieldValue(value, 'WHERE'); + return null; + } + return undefined; + }); + this.getInput('AT').appendField(menu, 'WHERE'); + if (Blockly.Msg.LISTS_GET_INDEX_TAIL) { + this.moveInputBefore('TAIL', null); + } + } +}; + +Blockly.Blocks['lists_setIndex'] = { + /** + * Block for setting the element at index. + * @this Blockly.Block + */ + init: function() { + var MODE = + [[Blockly.Msg.LISTS_SET_INDEX_SET, 'SET'], + [Blockly.Msg.LISTS_SET_INDEX_INSERT, 'INSERT']]; + this.WHERE_OPTIONS = + [[Blockly.Msg.LISTS_GET_INDEX_FROM_START, 'FROM_START'], + [Blockly.Msg.LISTS_GET_INDEX_FROM_END, 'FROM_END'], + [Blockly.Msg.LISTS_GET_INDEX_FIRST, 'FIRST'], + [Blockly.Msg.LISTS_GET_INDEX_LAST, 'LAST'], + [Blockly.Msg.LISTS_GET_INDEX_RANDOM, 'RANDOM']]; + this.setHelpUrl(Blockly.Msg.LISTS_SET_INDEX_HELPURL); + this.setColour(Blockly.Blocks.lists.HUE); + this.appendValueInput('LIST') + .setCheck('Array') + .appendField(Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST); + this.appendDummyInput() + .appendField(new Blockly.FieldDropdown(MODE), 'MODE') + .appendField('', 'SPACE'); + this.appendDummyInput('AT'); + this.appendValueInput('TO') + .appendField(Blockly.Msg.LISTS_SET_INDEX_INPUT_TO); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.LISTS_SET_INDEX_TOOLTIP); + this.updateAt_(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function() { + var mode = thisBlock.getFieldValue('MODE'); + var where = thisBlock.getFieldValue('WHERE'); + var tooltip = ''; + switch (mode + ' ' + where) { + case 'SET FROM_START': + case 'SET FROM_END': + tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM; + break; + case 'SET FIRST': + tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST; + break; + case 'SET LAST': + tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST; + break; + case 'SET RANDOM': + tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM; + break; + case 'INSERT FROM_START': + case 'INSERT FROM_END': + tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM; + break; + case 'INSERT FIRST': + tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST; + break; + case 'INSERT LAST': + tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST; + break; + case 'INSERT RANDOM': + tooltip = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM; + break; + } + if (where == 'FROM_START' || where == 'FROM_END') { + tooltip += ' ' + Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP + .replace('%1', + thisBlock.workspace.options.oneBasedIndex ? '#1' : '#0'); + } + return tooltip; + }); + }, + /** + * Create XML to represent whether there is an 'AT' input. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function() { + var container = document.createElement('mutation'); + var isAt = this.getInput('AT').type == Blockly.INPUT_VALUE; + container.setAttribute('at', isAt); + return container; + }, + /** + * Parse XML to restore the 'AT' input. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + // Note: Until January 2013 this block did not have mutations, + // so 'at' defaults to true. + var isAt = (xmlElement.getAttribute('at') != 'false'); + this.updateAt_(isAt); + }, + /** + * Create or delete an input for the numeric index. + * @param {boolean} isAt True if the input should exist. + * @private + * @this Blockly.Block + */ + updateAt_: function(isAt) { + // Destroy old 'AT' and 'ORDINAL' input. + this.removeInput('AT'); + this.removeInput('ORDINAL', true); + // Create either a value 'AT' input or a dummy input. + if (isAt) { + this.appendValueInput('AT').setCheck('Number'); + if (Blockly.Msg.ORDINAL_NUMBER_SUFFIX) { + this.appendDummyInput('ORDINAL') + .appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX); + } + } else { + this.appendDummyInput('AT'); + } + var menu = new Blockly.FieldDropdown(this.WHERE_OPTIONS, function(value) { + var newAt = (value == 'FROM_START') || (value == 'FROM_END'); + // The 'isAt' variable is available due to this function being a closure. + if (newAt != isAt) { + var block = this.sourceBlock_; + block.updateAt_(newAt); + // This menu has been destroyed and replaced. Update the replacement. + block.setFieldValue(value, 'WHERE'); + return null; + } + return undefined; + }); + this.moveInputBefore('AT', 'TO'); + if (this.getInput('ORDINAL')) { + this.moveInputBefore('ORDINAL', 'TO'); + } + + this.getInput('AT').appendField(menu, 'WHERE'); + } +}; + +Blockly.Blocks['lists_getSublist'] = { + /** + * Block for getting sublist. + * @this Blockly.Block + */ + init: function() { + this['WHERE_OPTIONS_1'] = + [[Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START, 'FROM_START'], + [Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END, 'FROM_END'], + [Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST, 'FIRST']]; + this['WHERE_OPTIONS_2'] = + [[Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START, 'FROM_START'], + [Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END, 'FROM_END'], + [Blockly.Msg.LISTS_GET_SUBLIST_END_LAST, 'LAST']]; + this.setHelpUrl(Blockly.Msg.LISTS_GET_SUBLIST_HELPURL); + this.setColour(Blockly.Blocks.lists.HUE); + this.appendValueInput('LIST') + .setCheck('Array') + .appendField(Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST); + this.appendDummyInput('AT1'); + this.appendDummyInput('AT2'); + if (Blockly.Msg.LISTS_GET_SUBLIST_TAIL) { + this.appendDummyInput('TAIL') + .appendField(Blockly.Msg.LISTS_GET_SUBLIST_TAIL); + } + this.setInputsInline(true); + this.setOutput(true, 'Array'); + this.updateAt_(1, true); + this.updateAt_(2, true); + this.setTooltip(Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP); + }, + /** + * Create XML to represent whether there are 'AT' inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function() { + var container = document.createElement('mutation'); + var isAt1 = this.getInput('AT1').type == Blockly.INPUT_VALUE; + container.setAttribute('at1', isAt1); + var isAt2 = this.getInput('AT2').type == Blockly.INPUT_VALUE; + container.setAttribute('at2', isAt2); + return container; + }, + /** + * Parse XML to restore the 'AT' inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + var isAt1 = (xmlElement.getAttribute('at1') == 'true'); + var isAt2 = (xmlElement.getAttribute('at2') == 'true'); + this.updateAt_(1, isAt1); + this.updateAt_(2, isAt2); + }, + /** + * Create or delete an input for a numeric index. + * This block has two such inputs, independant of each other. + * @param {number} n Specify first or second input (1 or 2). + * @param {boolean} isAt True if the input should exist. + * @private + * @this Blockly.Block + */ + updateAt_: function(n, isAt) { + // Create or delete an input for the numeric index. + // Destroy old 'AT' and 'ORDINAL' inputs. + this.removeInput('AT' + n); + this.removeInput('ORDINAL' + n, true); + // Create either a value 'AT' input or a dummy input. + if (isAt) { + this.appendValueInput('AT' + n).setCheck('Number'); + if (Blockly.Msg.ORDINAL_NUMBER_SUFFIX) { + this.appendDummyInput('ORDINAL' + n) + .appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX); + } + } else { + this.appendDummyInput('AT' + n); + } + var menu = new Blockly.FieldDropdown(this['WHERE_OPTIONS_' + n], + function(value) { + var newAt = (value == 'FROM_START') || (value == 'FROM_END'); + // The 'isAt' variable is available due to this function being a + // closure. + if (newAt != isAt) { + var block = this.sourceBlock_; + block.updateAt_(n, newAt); + // This menu has been destroyed and replaced. + // Update the replacement. + block.setFieldValue(value, 'WHERE' + n); + return null; + } + return undefined; + }); + this.getInput('AT' + n) + .appendField(menu, 'WHERE' + n); + if (n == 1) { + this.moveInputBefore('AT1', 'AT2'); + if (this.getInput('ORDINAL1')) { + this.moveInputBefore('ORDINAL1', 'AT2'); + } + } + if (Blockly.Msg.LISTS_GET_SUBLIST_TAIL) { + this.moveInputBefore('TAIL', null); + } + } +}; + +Blockly.Blocks['lists_sort'] = { + /** + * Block for sorting a list. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "message0": Blockly.Msg.LISTS_SORT_TITLE, + "args0": [ + { + "type": "field_dropdown", + "name": "TYPE", + "options": [ + [Blockly.Msg.LISTS_SORT_TYPE_NUMERIC, "NUMERIC"], + [Blockly.Msg.LISTS_SORT_TYPE_TEXT, "TEXT"], + [Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE, "IGNORE_CASE"] + ] + }, + { + "type": "field_dropdown", + "name": "DIRECTION", + "options": [ + [Blockly.Msg.LISTS_SORT_ORDER_ASCENDING, "1"], + [Blockly.Msg.LISTS_SORT_ORDER_DESCENDING, "-1"] + ] + }, + { + "type": "input_value", + "name": "LIST", + "check": "Array" + } + ], + "output": "Array", + "colour": Blockly.Blocks.lists.HUE, + "tooltip": Blockly.Msg.LISTS_SORT_TOOLTIP, + "helpUrl": Blockly.Msg.LISTS_SORT_HELPURL + }); + } +}; + +Blockly.Blocks['lists_split'] = { + /** + * Block for splitting text into a list, or joining a list into text. + * @this Blockly.Block + */ + init: function() { + // Assign 'this' to a variable for use in the closures below. + var thisBlock = this; + var dropdown = new Blockly.FieldDropdown( + [[Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT, 'SPLIT'], + [Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST, 'JOIN']], + function(newMode) { + thisBlock.updateType_(newMode); + }); + this.setHelpUrl(Blockly.Msg.LISTS_SPLIT_HELPURL); + this.setColour(Blockly.Blocks.lists.HUE); + this.appendValueInput('INPUT') + .setCheck('String') + .appendField(dropdown, 'MODE'); + this.appendValueInput('DELIM') + .setCheck('String') + .appendField(Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER); + this.setInputsInline(true); + this.setOutput(true, 'Array'); + this.setTooltip(function() { + var mode = thisBlock.getFieldValue('MODE'); + if (mode == 'SPLIT') { + return Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT; + } else if (mode == 'JOIN') { + return Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN; + } + throw 'Unknown mode: ' + mode; + }); + }, + /** + * Modify this block to have the correct input and output types. + * @param {string} newMode Either 'SPLIT' or 'JOIN'. + * @private + * @this Blockly.Block + */ + updateType_: function(newMode) { + if (newMode == 'SPLIT') { + this.outputConnection.setCheck('Array'); + this.getInput('INPUT').setCheck('String'); + } else { + this.outputConnection.setCheck('String'); + this.getInput('INPUT').setCheck('Array'); + } + }, + /** + * Create XML to represent the input and output types. + * @return {!Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function() { + var container = document.createElement('mutation'); + container.setAttribute('mode', this.getFieldValue('MODE')); + return container; + }, + /** + * Parse XML to restore the input and output types. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + this.updateType_(xmlElement.getAttribute('mode')); + } +}; diff --git a/src/opsoro/server/static/js/blockly/blocks/logic.js b/src/opsoro/server/static/js/blockly/blocks/logic.js new file mode 100644 index 0000000..f27c4e7 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/blocks/logic.js @@ -0,0 +1,621 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Logic blocks for Blockly. + * + * This file is scraped to extract a .json file of block definitions. The array + * passed to defineBlocksWithJsonArray(..) must be strict JSON: double quotes + * only, no outside references, no functions, no trailing commas, etc. The one + * exception is end-of-line comments, which the scraper will remove. + * @author q.neutron@gmail.com (Quynh Neutron) + */ +'use strict'; + +goog.provide('Blockly.Blocks.logic'); // Deprecated +goog.provide('Blockly.Constants.Logic'); + +goog.require('Blockly.Blocks'); + + +/** + * Common HSV hue for all blocks in this category. + * Should be the same as Blockly.Msg.LOGIC_HUE. + * @readonly + */ +Blockly.Constants.Logic.HUE = 210; +/** @deprecated Use Blockly.Constants.Logic.HUE */ +Blockly.Blocks.logic.HUE = Blockly.Constants.Logic.HUE; + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for boolean data type: true and false. + { + "type": "logic_boolean", + "message0": "%1", + "args0": [ + { + "type": "field_dropdown", + "name": "BOOL", + "options": [ + ["%{BKY_LOGIC_BOOLEAN_TRUE}", "TRUE"], + ["%{BKY_LOGIC_BOOLEAN_FALSE}", "FALSE"] + ] + } + ], + "output": "Boolean", + "colour": "%{BKY_LOGIC_HUE}", + "tooltip": "%{BKY_LOGIC_BOOLEAN_TOOLTIP}", + "helpUrl": "%{BKY_LOGIC_BOOLEAN_HELPURL}" + }, + // Block for if/elseif/else condition. + { + "type": "controls_if", + "message0": "%{BKY_CONTROLS_IF_MSG_IF} %1", + "args0": [ + { + "type": "input_value", + "name": "IF0", + "check": "Boolean" + } + ], + "message1": "%{BKY_CONTROLS_IF_MSG_THEN} %1", + "args1": [ + { + "type": "input_statement", + "name": "DO0" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": "%{BKY_LOGIC_HUE}", + "helpUrl": "%{BKY_CONTROLS_IF_HELPURL}", + "mutator": "controls_if_mutator", + "extensions": ["controls_if_tooltip"] + }, + // If/else block that does not use a mutator. + { + "type": "controls_ifelse", + "message0": "%{BKY_CONTROLS_IF_MSG_IF} %1", + "args0": [ + { + "type": "input_value", + "name": "IF0", + "check": "Boolean" + } + ], + "message1": "%{BKY_CONTROLS_IF_MSG_THEN} %1", + "args1": [ + { + "type": "input_statement", + "name": "DO0" + } + ], + "message2": "%{BKY_CONTROLS_IF_MSG_ELSE} %1", + "args2": [ + { + "type": "input_statement", + "name": "ELSE" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": "%{BKY_LOGIC_HUE}", + "tooltip": "%{BKYCONTROLS_IF_TOOLTIP_2}", + "helpUrl": "%{BKY_CONTROLS_IF_HELPURL}", + "extensions": ["controls_if_tooltip"] + }, + // Block for comparison operator. + { + "type": "logic_compare", + "message0": "%1 %2 %3", + "args0": [ + { + "type": "input_value", + "name": "A" + }, + { + "type": "field_dropdown", + "name": "OP", + "options": [ + ["=", "EQ"], + ["\u2260", "NEQ"], + ["<", "LT"], + ["\u2264", "LTE"], + [">", "GT"], + ["\u2265", "GTE"] + ] + }, + { + "type": "input_value", + "name": "B" + } + ], + "inputsInline": true, + "output": "Boolean", + "colour": "%{BKY_LOGIC_HUE}", + "helpUrl": "%{BKY_LOGIC_COMPARE_HELPURL}", + "extensions": ["logic_compare", "logic_op_tooltip"] + }, + // Block for logical operations: 'and', 'or'. + { + "type": "logic_operation", + "message0": "%1 %2 %3", + "args0": [ + { + "type": "input_value", + "name": "A", + "check": "Boolean" + }, + { + "type": "field_dropdown", + "name": "OP", + "options": [ + ["%{BKY_LOGIC_OPERATION_AND}", "AND"], + ["%{BKY_LOGIC_OPERATION_OR}", "OR"] + ] + }, + { + "type": "input_value", + "name": "B", + "check": "Boolean" + } + ], + "inputsInline": true, + "output": "Boolean", + "colour": "%{BKY_LOGIC_HUE}", + "helpUrl": "%{BKY_LOGIC_OPERATION_HELPURL}", + "extensions": ["logic_op_tooltip"] + }, + // Block for negation. + { + "type": "logic_negate", + "message0": "%{BKY_LOGIC_NEGATE_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "BOOL", + "check": "Boolean" + } + ], + "output": "Boolean", + "colour": "%{BKY_LOGIC_HUE}", + "tooltip": "%{BKY_LOGIC_NEGATE_TOOLTIP}", + "helpUrl": "%{BKY_LOGIC_NEGATE_HELPURL}" + }, + // Block for null data type. + { + "type": "logic_null", + "message0": "%{BKY_LOGIC_NULL}", + "output": null, + "colour": "%{BKY_LOGIC_HUE}", + "tooltip": "%{BKY_LOGIC_NULL_TOOLTIP}", + "helpUrl": "%{BKY_LOGIC_NULL_HELPURL}" + }, + // Block for ternary operator. + { + "type": "logic_ternary", + "message0": "%{BKY_LOGIC_TERNARY_CONDITION} %1", + "args0": [ + { + "type": "input_value", + "name": "IF", + "check": "Boolean" + } + ], + "message1": "%{BKY_LOGIC_TERNARY_IF_TRUE} %1", + "args1": [ + { + "type": "input_value", + "name": "THEN" + } + ], + "message2": "%{BKY_LOGIC_TERNARY_IF_FALSE} %1", + "args2": [ + { + "type": "input_value", + "name": "ELSE" + } + ], + "output": null, + "colour": "%{BKY_LOGIC_HUE}", + "tooltip": "%{BKY_LOGIC_TERNARY_TOOLTIP}", + "helpUrl": "%{BKY_LOGIC_TERNARY_HELPURL}", + "extensions": ["logic_ternary"] + } +]); // END JSON EXTRACT (Do not delete this comment.) + +Blockly.defineBlocksWithJsonArray([ // Mutator blocks. Do not extract. + // Block representing the if statement in the controls_if mutator. + { + "type": "controls_if_if", + "message0": "%{BKY_CONTROLS_IF_IF_TITLE_IF}", + "nextStatement": null, + "enableContextMenu": false, + "colour": "%{BKY_LOGIC_HUE}", + "tooltip": "%{BKY_CONTROLS_IF_IF_TOOLTIP}" + }, + // Block representing the else-if statement in the controls_if mutator. + { + "type": "controls_if_elseif", + "message0": "%{BKY_CONTROLS_IF_ELSEIF_TITLE_ELSEIF}", + "previousStatement": null, + "nextStatement": null, + "enableContextMenu": false, + "colour": "%{BKY_LOGIC_HUE}", + "tooltip": "%{BKY_CONTROLS_IF_ELSEIF_TOOLTIP}" + }, + // Block representing the else statement in the controls_if mutator. + { + "type": "controls_if_else", + "message0": "%{BKY_CONTROLS_IF_ELSE_TITLE_ELSE}", + "previousStatement": null, + "enableContextMenu": false, + "colour": "%{BKY_LOGIC_HUE}", + "tooltip": "%{BKY_CONTROLS_IF_ELSE_TOOLTIP}" + } +]); + +/** + * Tooltip text, keyed by block OP value. Used by logic_compare and + * logic_operation blocks. + * @see {Blockly.Extensions#buildTooltipForDropdown} + * @package + * @readonly + */ +Blockly.Constants.Logic.TOOLTIPS_BY_OP = { + // logic_compare + 'EQ': '%{BKY_LOGIC_COMPARE_TOOLTIP_EQ}', + 'NEQ': '%{BKY_LOGIC_COMPARE_TOOLTIP_NEQ}', + 'LT': '%{BKY_LOGIC_COMPARE_TOOLTIP_LT}', + 'LTE': '%{BKY_LOGIC_COMPARE_TOOLTIP_LTE}', + 'GT': '%{BKY_LOGIC_COMPARE_TOOLTIP_GT}', + 'GTE': '%{BKY_LOGIC_COMPARE_TOOLTIP_GTE}', + + // logic_operation + 'AND': '%{BKY_LOGIC_OPERATION_TOOLTIP_AND}', + 'OR': '%{BKY_LOGIC_OPERATION_TOOLTIP_OR}' +}; + +Blockly.Extensions.register('logic_op_tooltip', + Blockly.Extensions.buildTooltipForDropdown( + 'OP', Blockly.Constants.Logic.TOOLTIPS_BY_OP)); + +/** + * Mutator methods added to controls_if blocks. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Logic.CONTROLS_IF_MUTATOR_MIXIN = { + elseifCount_: 0, + elseCount_: 0, + + /** + * Create XML to represent the number of else-if and else inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function() { + if (!this.elseifCount_ && !this.elseCount_) { + return null; + } + var container = document.createElement('mutation'); + if (this.elseifCount_) { + container.setAttribute('elseif', this.elseifCount_); + } + if (this.elseCount_) { + container.setAttribute('else', 1); + } + return container; + }, + /** + * Parse XML to restore the else-if and else inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + this.elseifCount_ = parseInt(xmlElement.getAttribute('elseif'), 10) || 0; + this.elseCount_ = parseInt(xmlElement.getAttribute('else'), 10) || 0; + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function(workspace) { + var containerBlock = workspace.newBlock('controls_if_if'); + containerBlock.initSvg(); + var connection = containerBlock.nextConnection; + for (var i = 1; i <= this.elseifCount_; i++) { + var elseifBlock = workspace.newBlock('controls_if_elseif'); + elseifBlock.initSvg(); + connection.connect(elseifBlock.previousConnection); + connection = elseifBlock.nextConnection; + } + if (this.elseCount_) { + var elseBlock = workspace.newBlock('controls_if_else'); + elseBlock.initSvg(); + connection.connect(elseBlock.previousConnection); + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function(containerBlock) { + var clauseBlock = containerBlock.nextConnection.targetBlock(); + // Count number of inputs. + this.elseifCount_ = 0; + this.elseCount_ = 0; + var valueConnections = [null]; + var statementConnections = [null]; + var elseStatementConnection = null; + while (clauseBlock) { + switch (clauseBlock.type) { + case 'controls_if_elseif': + this.elseifCount_++; + valueConnections.push(clauseBlock.valueConnection_); + statementConnections.push(clauseBlock.statementConnection_); + break; + case 'controls_if_else': + this.elseCount_++; + elseStatementConnection = clauseBlock.statementConnection_; + break; + default: + throw 'Unknown block type.'; + } + clauseBlock = clauseBlock.nextConnection && + clauseBlock.nextConnection.targetBlock(); + } + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 1; i <= this.elseifCount_; i++) { + Blockly.Mutator.reconnect(valueConnections[i], this, 'IF' + i); + Blockly.Mutator.reconnect(statementConnections[i], this, 'DO' + i); + } + Blockly.Mutator.reconnect(elseStatementConnection, this, 'ELSE'); + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function(containerBlock) { + var clauseBlock = containerBlock.nextConnection.targetBlock(); + var i = 1; + while (clauseBlock) { + switch (clauseBlock.type) { + case 'controls_if_elseif': + var inputIf = this.getInput('IF' + i); + var inputDo = this.getInput('DO' + i); + clauseBlock.valueConnection_ = + inputIf && inputIf.connection.targetConnection; + clauseBlock.statementConnection_ = + inputDo && inputDo.connection.targetConnection; + i++; + break; + case 'controls_if_else': + var inputDo = this.getInput('ELSE'); + clauseBlock.statementConnection_ = + inputDo && inputDo.connection.targetConnection; + break; + default: + throw 'Unknown block type.'; + } + clauseBlock = clauseBlock.nextConnection && + clauseBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @this Blockly.Block + * @private + */ + updateShape_: function() { + // Delete everything. + if (this.getInput('ELSE')) { + this.removeInput('ELSE'); + } + var i = 1; + while (this.getInput('IF' + i)) { + this.removeInput('IF' + i); + this.removeInput('DO' + i); + i++; + } + // Rebuild block. + for (var i = 1; i <= this.elseifCount_; i++) { + this.appendValueInput('IF' + i) + .setCheck('Boolean') + .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF); + this.appendStatementInput('DO' + i) + .appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); + } + if (this.elseCount_) { + this.appendStatementInput('ELSE') + .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE); + } + } +}; + +Blockly.Extensions.registerMutator('controls_if_mutator', + Blockly.Constants.Logic.CONTROLS_IF_MUTATOR_MIXIN, null, + ['controls_if_elseif', 'controls_if_else']); +/** + * "controls_if" extension function. Adds mutator, shape updating methods, and + * dynamic tooltip to "controls_if" blocks. + * @this Blockly.Block + * @package + */ +Blockly.Constants.Logic.CONTROLS_IF_TOOLTIP_EXTENSION = function() { + + this.setTooltip(function() { + if (!this.elseifCount_ && !this.elseCount_) { + return Blockly.Msg.CONTROLS_IF_TOOLTIP_1; + } else if (!this.elseifCount_ && this.elseCount_) { + return Blockly.Msg.CONTROLS_IF_TOOLTIP_2; + } else if (this.elseifCount_ && !this.elseCount_) { + return Blockly.Msg.CONTROLS_IF_TOOLTIP_3; + } else if (this.elseifCount_ && this.elseCount_) { + return Blockly.Msg.CONTROLS_IF_TOOLTIP_4; + } + return ''; + }.bind(this)); +}; + +Blockly.Extensions.register('controls_if_tooltip', + Blockly.Constants.Logic.CONTROLS_IF_TOOLTIP_EXTENSION); + +/** + * Corrects the logic_compare dropdown label with respect to language direction. + * @this Blockly.Block + * @package + */ +Blockly.Constants.Logic.fixLogicCompareRtlOpLabels = + function() { + var rtlOpLabels = { + 'LT': '\u200F<\u200F', + 'LTE': '\u200F\u2264\u200F', + 'GT': '\u200F>\u200F', + 'GTE': '\u200F\u2265\u200F' + }; + var opDropdown = this.getField('OP'); + if (opDropdown) { + var options = opDropdown.getOptions(); + for (var i = 0; i < options.length; ++i) { + var tuple = options[i]; + var op = tuple[1]; + var rtlLabel = rtlOpLabels[op]; + if (goog.isString(tuple[0]) && rtlLabel) { + // Replace LTR text label + tuple[0] = rtlLabel; + } + } + } + }; + +/** + * Adds dynamic type validation for the left and right sides of a logic_compare block. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Logic.LOGIC_COMPARE_ONCHANGE_MIXIN = { + prevBlocks_: [null, null], + + /** + * Called whenever anything on the workspace changes. + * Prevent mismatched types from being compared. + * @param {!Blockly.Events.Abstract} e Change event. + * @this Blockly.Block + */ + onchange: function(e) { + var blockA = this.getInputTargetBlock('A'); + var blockB = this.getInputTargetBlock('B'); + // Disconnect blocks that existed prior to this change if they don't match. + if (blockA && blockB && + !blockA.outputConnection.checkType_(blockB.outputConnection)) { + // Mismatch between two inputs. Disconnect previous and bump it away. + // Ensure that any disconnections are grouped with the causing event. + Blockly.Events.setGroup(e.group); + for (var i = 0; i < this.prevBlocks_.length; i++) { + var block = this.prevBlocks_[i]; + if (block === blockA || block === blockB) { + block.unplug(); + block.bumpNeighbours_(); + } + } + Blockly.Events.setGroup(false); + } + this.prevBlocks_[0] = blockA; + this.prevBlocks_[1] = blockB; + } +}; + +/** + * "logic_compare" extension function. Corrects direction of operators in the + * dropdown labels, and adds type left and right side type checking to + * "logic_compare" blocks. + * @this Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Logic.LOGIC_COMPARE_EXTENSION = function() { + // Fix operator labels in RTL + if (this.RTL) { + Blockly.Constants.Logic.fixLogicCompareRtlOpLabels.apply(this); + } + + // Add onchange handler to ensure types are compatable. + this.mixin(Blockly.Constants.Logic.LOGIC_COMPARE_ONCHANGE_MIXIN); +}; + +Blockly.Extensions.register('logic_compare', + Blockly.Constants.Logic.LOGIC_COMPARE_EXTENSION); + +/** + * Adds type coordination between inputs and output. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Logic.LOGIC_TERNARY_ONCHANGE_MIXIN = { + prevParentConnection_: null, + + /** + * Called whenever anything on the workspace changes. + * Prevent mismatched types. + * @param {!Blockly.Events.Abstract} e Change event. + * @this Blockly.Block + */ + onchange: function(e) { + var blockA = this.getInputTargetBlock('THEN'); + var blockB = this.getInputTargetBlock('ELSE'); + var parentConnection = this.outputConnection.targetConnection; + // Disconnect blocks that existed prior to this change if they don't match. + if ((blockA || blockB) && parentConnection) { + for (var i = 0; i < 2; i++) { + var block = (i == 1) ? blockA : blockB; + if (block && !block.outputConnection.checkType_(parentConnection)) { + // Ensure that any disconnections are grouped with the causing event. + Blockly.Events.setGroup(e.group); + if (parentConnection === this.prevParentConnection_) { + this.unplug(); + parentConnection.getSourceBlock().bumpNeighbours_(); + } else { + block.unplug(); + block.bumpNeighbours_(); + } + Blockly.Events.setGroup(false); + } + } + } + this.prevParentConnection_ = parentConnection; + } +}; + +Blockly.Extensions.registerMixin('logic_ternary', + Blockly.Constants.Logic.LOGIC_TERNARY_ONCHANGE_MIXIN); diff --git a/src/opsoro/server/static/js/blockly/blocks/loops.js b/src/opsoro/server/static/js/blockly/blocks/loops.js new file mode 100644 index 0000000..f0d2a98 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/blocks/loops.js @@ -0,0 +1,341 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Loop blocks for Blockly. + * + * This file is scraped to extract a .json file of block definitions. The array + * passed to defineBlocksWithJsonArray(..) must be strict JSON: double quotes + * only, no outside references, no functions, no trailing commas, etc. The one + * exception is end-of-line comments, which the scraper will remove. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Blocks.loops'); // Deprecated +goog.provide('Blockly.Constants.Loops'); + +goog.require('Blockly.Blocks'); + + +/** + * Common HSV hue for all blocks in this category. + * Should be the same as Blockly.Msg.LOOPS_HUE + * @readonly + */ +Blockly.Constants.Loops.HUE = 120; +/** @deprecated Use Blockly.Constants.Loops.HUE */ +Blockly.Blocks.loops.HUE = Blockly.Constants.Loops.HUE; + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for repeat n times (external number). + { + "type": "controls_repeat_ext", + "message0": "%{BKY_CONTROLS_REPEAT_TITLE}", + "args0": [{ + "type": "input_value", + "name": "TIMES", + "check": "Number" + }], + "message1": "%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", + "args1": [{ + "type": "input_statement", + "name": "DO" + }], + "previousStatement": null, + "nextStatement": null, + "colour": "%{BKY_LOOPS_HUE}", + "tooltip": "%{BKY_CONTROLS_REPEAT_TOOLTIP}", + "helpUrl": "%{BKY_CONTROLS_REPEAT_HELPURL}" + }, + // Block for repeat n times (internal number). + // The 'controls_repeat_ext' block is preferred as it is more flexible. + { + "type": "controls_repeat", + "message0": "%{BKY_CONTROLS_REPEAT_TITLE}", + "args0": [{ + "type": "field_number", + "name": "TIMES", + "value": 10, + "min": 0, + "precision": 1 + }], + "message1": "%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", + "args1": [{ + "type": "input_statement", + "name": "DO" + }], + "previousStatement": null, + "nextStatement": null, + "colour": "%{BKY_LOOPS_HUE}", + "tooltip": "%{BKY_CONTROLS_REPEAT_TOOLTIP}", + "helpUrl": "%{BKY_CONTROLS_REPEAT_HELPURL}" + }, + // Block for 'do while/until' loop. + { + "type": "controls_whileUntil", + "message0": "%1 %2", + "args0": [ + { + "type": "field_dropdown", + "name": "MODE", + "options": [ + ["%{BKY_CONTROLS_WHILEUNTIL_OPERATOR_WHILE}", "WHILE"], + ["%{BKY_CONTROLS_WHILEUNTIL_OPERATOR_UNTIL}", "UNTIL"] + ] + }, + { + "type": "input_value", + "name": "BOOL", + "check": "Boolean" + } + ], + "message1": "%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", + "args1": [{ + "type": "input_statement", + "name": "DO" + }], + "previousStatement": null, + "nextStatement": null, + "colour": "%{BKY_LOOPS_HUE}", + "helpUrl": "%{BKY_CONTROLS_WHILEUNTIL_HELPURL}", + "extensions": ["controls_whileUntil_tooltip"] + }, + // Block for 'for' loop. + { + "type": "controls_for", + "message0": "%{BKY_CONTROLS_FOR_TITLE}", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variable": null + }, + { + "type": "input_value", + "name": "FROM", + "check": "Number", + "align": "RIGHT" + }, + { + "type": "input_value", + "name": "TO", + "check": "Number", + "align": "RIGHT" + }, + { + "type": "input_value", + "name": "BY", + "check": "Number", + "align": "RIGHT" + } + ], + "message1": "%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", + "args1": [{ + "type": "input_statement", + "name": "DO" + }], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": "%{BKY_LOOPS_HUE}", + "helpUrl": "%{BKY_CONTROLS_FOR_HELPURL}", + "extensions": [ + "contextMenu_newGetVariableBlock", + "controls_for_tooltip" + ] + }, + // Block for 'for each' loop. + { + "type": "controls_forEach", + "message0": "%{BKY_CONTROLS_FOREACH_TITLE}", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variable": null + }, + { + "type": "input_value", + "name": "LIST", + "check": "Array" + } + ], + "message1": "%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", + "args1": [{ + "type": "input_statement", + "name": "DO" + }], + "previousStatement": null, + "nextStatement": null, + "colour": "%{BKY_LOOPS_HUE}", + "helpUrl": "%{BKY_CONTROLS_FOREACH_HELPURL}", + "extensions": [ + "contextMenu_newGetVariableBlock", + "controls_forEach_tooltip" + ] + }, + // Block for flow statements: continue, break. + { + "type": "controls_flow_statements", + "message0": "%1", + "args0": [{ + "type": "field_dropdown", + "name": "FLOW", + "options": [ + ["%{BKY_CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK}", "BREAK"], + ["%{BKY_CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE}", "CONTINUE"] + ] + }], + "previousStatement": null, + "colour": "%{BKY_LOOPS_HUE}", + "helpUrl": "%{BKY_CONTROLS_FLOW_STATEMENTS_HELPURL}", + "extensions": [ + "controls_flow_tooltip", + "controls_flow_in_loop_check" + ] + } +]); // END JSON EXTRACT (Do not delete this comment.) + +/** + * Tooltips for the 'controls_whileUntil' block, keyed by MODE value. + * @see {Blockly.Extensions#buildTooltipForDropdown} + * @package + * @readonly + */ +Blockly.Constants.Loops.WHILE_UNTIL_TOOLTIPS = { + 'WHILE': '%{BKY_CONTROLS_WHILEUNTIL_TOOLTIP_WHILE}', + 'UNTIL': '%{BKY_CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL}' +}; + +Blockly.Extensions.register('controls_whileUntil_tooltip', + Blockly.Extensions.buildTooltipForDropdown( + 'MODE', Blockly.Constants.Loops.WHILE_UNTIL_TOOLTIPS)); + +/** + * Tooltips for the 'controls_flow_statements' block, keyed by FLOW value. + * @see {Blockly.Extensions#buildTooltipForDropdown} + * @package + * @readonly + */ +Blockly.Constants.Loops.BREAK_CONTINUE_TOOLTIPS = { + 'BREAK': '%{BKY_CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK}', + 'CONTINUE': '%{BKY_CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE}' +}; + +Blockly.Extensions.register('controls_flow_tooltip', + Blockly.Extensions.buildTooltipForDropdown( + 'FLOW', Blockly.Constants.Loops.BREAK_CONTINUE_TOOLTIPS)); + +/** + * Mixin to add a context menu item to create a 'variables_get' block. + * Used by blocks 'controls_for' and 'controls_forEach'. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Loops.CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN = { + /** + * Add context menu option to create getter block for the loop's variable. + * (customContextMenu support limited to web BlockSvg.) + * @param {!Array} options List of menu options to add to. + * @this Blockly.Block + */ + customContextMenu: function(options) { + var varName = this.getFieldValue('VAR'); + if (!this.isCollapsed() && varName != null) { + var option = {enabled: true}; + option.text = + Blockly.Msg.VARIABLES_SET_CREATE_GET.replace('%1', varName); + var xmlField = goog.dom.createDom('field', null, varName); + xmlField.setAttribute('name', 'VAR'); + var xmlBlock = goog.dom.createDom('block', null, xmlField); + xmlBlock.setAttribute('type', 'variables_get'); + option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); + options.push(option); + } + } +}; + +Blockly.Extensions.registerMixin('contextMenu_newGetVariableBlock', + Blockly.Constants.Loops.CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN); + +Blockly.Extensions.register('controls_for_tooltip', + Blockly.Extensions.buildTooltipWithFieldValue( + Blockly.Msg.CONTROLS_FOR_TOOLTIP, 'VAR')); + +Blockly.Extensions.register('controls_forEach_tooltip', + Blockly.Extensions.buildTooltipWithFieldValue( + Blockly.Msg.CONTROLS_FOREACH_TOOLTIP, 'VAR')); + +/** + * This mixin adds a check to make sure the 'controls_flow_statements' block + * is contained in a loop. Otherwise a warning is added to the block. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Loops.CONTROL_FLOW_CHECK_IN_LOOP_MIXIN = { + /** + * List of block types that are loops and thus do not need warnings. + * To add a new loop type add this to your code: + * Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop'); + */ + LOOP_TYPES: ['controls_repeat', 'controls_repeat_ext', 'controls_forEach', + 'controls_for', 'controls_whileUntil'], + + /** + * Called whenever anything on the workspace changes. + * Add warning if this flow block is not nested inside a loop. + * @param {!Blockly.Events.Abstract} e Change event. + * @this Blockly.Block + */ + onchange: function(/* e */) { + if (!this.workspace.isDragging || this.workspace.isDragging()) { + return; // Don't change state at the start of a drag. + } + var legal = false; + // Is the block nested in a loop? + var block = this; + do { + if (this.LOOP_TYPES.indexOf(block.type) != -1) { + legal = true; + break; + } + block = block.getSurroundParent(); + } while (block); + if (legal) { + this.setWarningText(null); + if (!this.isInFlyout) { + this.setDisabled(false); + } + } else { + this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING); + if (!this.isInFlyout && !this.getInheritedDisabled()) { + this.setDisabled(true); + } + } + } +}; + +Blockly.Extensions.registerMixin('controls_flow_in_loop_check', + Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN); diff --git a/src/opsoro/server/static/js/blockly/blocks/math.js b/src/opsoro/server/static/js/blockly/blocks/math.js new file mode 100644 index 0000000..0aff2ab --- /dev/null +++ b/src/opsoro/server/static/js/blockly/blocks/math.js @@ -0,0 +1,566 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Math blocks for Blockly. + * + * This file is scraped to extract a .json file of block definitions. The array + * passed to defineBlocksWithJsonArray(..) must be strict JSON: double quotes + * only, no outside references, no functions, no trailing commas, etc. The one + * exception is end-of-line comments, which the scraper will remove. + * @author q.neutron@gmail.com (Quynh Neutron) + */ +'use strict'; + +goog.provide('Blockly.Blocks.math'); // Deprecated +goog.provide('Blockly.Constants.Math'); + +goog.require('Blockly.Blocks'); + + +/** + * Common HSV hue for all blocks in this category. + * Should be the same as Blockly.Msg.MATH_HUE + * @readonly + */ +Blockly.Constants.Math.HUE = 230; +/** @deprecated Use Blockly.Constants.Math.HUE */ +Blockly.Blocks.math.HUE = Blockly.Constants.Math.HUE; + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for numeric value. + { + "type": "math_number", + "message0": "%1", + "args0": [{ + "type": "field_number", + "name": "NUM", + "value": 0 + }], + "output": "Number", + "colour": "%{BKY_MATH_HUE}", + "helpUrl": "%{BKY_MATH_NUMBER_HELPURL}", + "tooltip": "%{BKY_MATH_NUMBER_TOOLTIP}", + "extensions": ["parent_tooltip_when_inline"] + }, + + // Block for basic arithmetic operator. + { + "type": "math_arithmetic", + "message0": "%1 %2 %3", + "args0": [ + { + "type": "input_value", + "name": "A", + "check": "Number" + }, + { + "type": "field_dropdown", + "name": "OP", + "options": [ + ["%{BKY_MATH_ADDITION_SYMBOL}", "ADD"], + ["%{BKY_MATH_SUBTRACTION_SYMBOL}", "MINUS"], + ["%{BKY_MATH_MULTIPLICATION_SYMBOL}", "MULTIPLY"], + ["%{BKY_MATH_DIVISION_SYMBOL}", "DIVIDE"], + ["%{BKY_MATH_POWER_SYMBOL}", "POWER"] + ] + }, + { + "type": "input_value", + "name": "B", + "check": "Number" + } + ], + "inputsInline": true, + "output": "Number", + "colour": "%{BKY_MATH_HUE}", + "helpUrl": "%{BKY_MATH_ARITHMETIC_HELPURL}", + "extensions": ["math_op_tooltip"] + }, + + // Block for advanced math operators with single operand. + { + "type": "math_single", + "message0": "%1 %2", + "args0": [ + { + "type": "field_dropdown", + "name": "OP", + "options": [ + ["%{BKY_MATH_SINGLE_OP_ROOT}", 'ROOT'], + ["%{BKY_MATH_SINGLE_OP_ABSOLUTE}", 'ABS'], + ['-', 'NEG'], + ['ln', 'LN'], + ['log10', 'LOG10'], + ['e^', 'EXP'], + ['10^', 'POW10'] + ] + }, + { + "type": "input_value", + "name": "NUM", + "check": "Number" + } + ], + "output": "Number", + "colour": "%{BKY_MATH_HUE}", + "helpUrl": "%{BKY_MATH_SINGLE_HELPURL}", + "extensions": ["math_op_tooltip"] + }, + + // Block for trigonometry operators. + { + "type": "math_trig", + "message0": "%1 %2", + "args0": [ + { + "type": "field_dropdown", + "name": "OP", + "options": [ + ["%{BKY_MATH_TRIG_SIN}", "SIN"], + ["%{BKY_MATH_TRIG_COS}", "COS"], + ["%{BKY_MATH_TRIG_TAN}", "TAN"], + ["%{BKY_MATH_TRIG_ASIN}", "ASIN"], + ["%{BKY_MATH_TRIG_ACOS}", "ACOS"], + ["%{BKY_MATH_TRIG_ATAN}", "ATAN"] + ] + }, + { + "type": "input_value", + "name": "NUM", + "check": "Number" + } + ], + "output": "Number", + "colour": "%{BKY_MATH_HUE}", + "helpUrl": "%{BKY_MATH_TRIG_HELPURL}", + "extensions": ["math_op_tooltip"] + }, + + // Block for constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. + { + "type": "math_constant", + "message0": "%1", + "args0": [ + { + "type": "field_dropdown", + "name": "CONSTANT", + "options": [ + ["\u03c0", "PI"], + ["e", "E"], + ["\u03c6", "GOLDEN_RATIO"], + ["sqrt(2)", "SQRT2"], + ["sqrt(\u00bd)", "SQRT1_2"], + ["\u221e", "INFINITY"] + ] + } + ], + "output": "Number", + "colour": "%{BKY_MATH_HUE}", + "tooltip": "%{BKY_MATH_CONSTANT_TOOLTIP}", + "helpUrl": "%{BKY_MATH_CONSTANT_HELPURL}" + }, + + // Block for checking if a number is even, odd, prime, whole, positive, + // negative or if it is divisible by certain number. + { + "type": "math_number_property", + "message0": "%1 %2", + "args0": [ + { + "type": "input_value", + "name": "NUMBER_TO_CHECK", + "check": "Number" + }, + { + "type": "field_dropdown", + "name": "PROPERTY", + "options": [ + ["%{BKY_MATH_IS_EVEN}", "EVEN"], + ["%{BKY_MATH_IS_ODD}", "ODD"], + ["%{BKY_MATH_IS_PRIME}", "PRIME"], + ["%{BKY_MATH_IS_WHOLE}", "WHOLE"], + ["%{BKY_MATH_IS_POSITIVE}", "POSITIVE"], + ["%{BKY_MATH_IS_NEGATIVE}", "NEGATIVE"], + ["%{BKY_MATH_IS_DIVISIBLE_BY}", "DIVISIBLE_BY"] + ] + } + ], + "inputsInline": true, + "output": "Boolean", + "colour": "%{BKY_MATH_HUE}", + "tooltip": "%{BKY_MATH_IS_TOOLTIP}", + "mutator": "math_is_divisibleby_mutator" + }, + + // Block for adding to a variable in place. + { + "type": "math_change", + "message0": "%{BKY_MATH_CHANGE_TITLE}", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variable": "%{BKY_MATH_CHANGE_TITLE_ITEM}" + }, + { + "type": "input_value", + "name": "DELTA", + "check": "Number" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": "%{BKY_VARIABLES_HUE}", + "helpUrl": "%{BKY_MATH_CHANGE_HELPURL}", + "extensions": ["math_change_tooltip"] + }, + + // Block for rounding functions. + { + "type": "math_round", + "message0": "%1 %2", + "args0": [ + { + "type": "field_dropdown", + "name": "OP", + "options": [ + ["%{BKY_MATH_ROUND_OPERATOR_ROUND}", "ROUND"], + ["%{BKY_MATH_ROUND_OPERATOR_ROUNDUP}", "ROUNDUP"], + ["%{BKY_MATH_ROUND_OPERATOR_ROUNDDOWN}", "ROUNDDOWN"] + ] + }, + { + "type": "input_value", + "name": "NUM", + "check": "Number" + } + ], + "output": "Number", + "colour": "%{BKY_MATH_HUE}", + "helpUrl": "%{BKY_MATH_ROUND_HELPURL}", + "tooltip": "%{BKY_MATH_ROUND_TOOLTIP}" + }, + + // Block for evaluating a list of numbers to return sum, average, min, max, + // etc. Some functions also work on text (min, max, mode, median). + { + "type": "math_on_list", + "message0": "%1 %2", + "args0": [ + { + "type": "field_dropdown", + "name": "OP", + "options": [ + ["%{BKY_MATH_ONLIST_OPERATOR_SUM}", "SUM"], + ["%{BKY_MATH_ONLIST_OPERATOR_MIN}", "MIN"], + ["%{BKY_MATH_ONLIST_OPERATOR_MAX}", "MAX"], + ["%{BKY_MATH_ONLIST_OPERATOR_AVERAGE}", "AVERAGE"], + ["%{BKY_MATH_ONLIST_OPERATOR_MEDIAN}", "MEDIAN"], + ["%{BKY_MATH_ONLIST_OPERATOR_MODE}", "MODE"], + ["%{BKY_MATH_ONLIST_OPERATOR_STD_DEV}", "STD_DEV"], + ["%{BKY_MATH_ONLIST_OPERATOR_RANDOM}", "RANDOM"] + ] + }, + { + "type": "input_value", + "name": "LIST", + "check": "Array" + } + ], + "output": "Number", + "colour": "%{BKY_MATH_HUE}", + "helpUrl": "%{BKY_MATH_ONLIST_HELPURL}", + "mutator": "math_modes_of_list_mutator", + "extensions": ["math_op_tooltip"] + }, + + // Block for remainder of a division. + { + "type": "math_modulo", + "message0": "%{BKY_MATH_MODULO_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "DIVIDEND", + "check": "Number" + }, + { + "type": "input_value", + "name": "DIVISOR", + "check": "Number" + } + ], + "inputsInline": true, + "output": "Number", + "colour": "%{BKY_MATH_HUE}", + "tooltip": "%{BKY_MATH_MODULO_TOOLTIP}", + "helpUrl": "%{BKY_MATH_MODULO_HELPURL}" + }, + + // Block for constraining a number between two limits. + { + "type": "math_constrain", + "message0": "%{BKY_MATH_CONSTRAIN_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "VALUE", + "check": "Number" + }, + { + "type": "input_value", + "name": "LOW", + "check": "Number" + }, + { + "type": "input_value", + "name": "HIGH", + "check": "Number" + } + ], + "inputsInline": true, + "output": "Number", + "colour": "%{BKY_MATH_HUE}", + "tooltip": "%{BKY_MATH_CONSTRAIN_TOOLTIP}", + "helpUrl": "%{BKY_MATH_CONSTRAIN_HELPURL}" + }, + + // Block for random integer between [X] and [Y]. + { + "type": "math_random_int", + "message0": "%{BKY_MATH_RANDOM_INT_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "FROM", + "check": "Number" + }, + { + "type": "input_value", + "name": "TO", + "check": "Number" + } + ], + "inputsInline": true, + "output": "Number", + "colour": "%{BKY_MATH_HUE}", + "tooltip": "%{BKY_MATH_RANDOM_INT_TOOLTIP}", + "helpUrl": "%{BKY_MATH_RANDOM_INT_HELPURL}" + }, + + // Block for random integer between [X] and [Y]. + { + "type": "math_random_float", + "message0": "%{BKY_MATH_RANDOM_FLOAT_TITLE_RANDOM}", + "output": "Number", + "colour": "%{BKY_MATH_HUE}", + "tooltip": "%{BKY_MATH_RANDOM_FLOAT_TOOLTIP}", + "helpUrl": "%{BKY_MATH_RANDOM_FLOAT_HELPURL}" + } +]); // END JSON EXTRACT (Do not delete this comment.) + +/** + * Mapping of math block OP value to tooltip message for blocks + * math_arithmetic, math_simple, math_trig, and math_on_lists. + * @see {Blockly.Extensions#buildTooltipForDropdown} + * @package + * @readonly + */ +Blockly.Constants.Math.TOOLTIPS_BY_OP = { + // math_arithmetic + 'ADD': '%{BKY_MATH_ARITHMETIC_TOOLTIP_ADD}', + 'MINUS': '%{BKY_MATH_ARITHMETIC_TOOLTIP_MINUS}', + 'MULTIPLY': '%{BKY_MATH_ARITHMETIC_TOOLTIP_MULTIPLY}', + 'DIVIDE': '%{BKY_MATH_ARITHMETIC_TOOLTIP_DIVIDE}', + 'POWER': '%{BKY_MATH_ARITHMETIC_TOOLTIP_POWER}', + + // math_simple + 'ROOT': '%{BKY_MATH_SINGLE_TOOLTIP_ROOT}', + 'ABS': '%{BKY_MATH_SINGLE_TOOLTIP_ABS}', + 'NEG': '%{BKY_MATH_SINGLE_TOOLTIP_NEG}', + 'LN': '%{BKY_MATH_SINGLE_TOOLTIP_LN}', + 'LOG10': '%{BKY_MATH_SINGLE_TOOLTIP_LOG10}', + 'EXP': '%{BKY_MATH_SINGLE_TOOLTIP_EXP}', + 'POW10': '%{BKY_MATH_SINGLE_TOOLTIP_POW10}', + + // math_trig + 'SIN': '%{BKY_MATH_TRIG_TOOLTIP_SIN}', + 'COS': '%{BKY_MATH_TRIG_TOOLTIP_COS}', + 'TAN': '%{BKY_MATH_TRIG_TOOLTIP_TAN}', + 'ASIN': '%{BKY_MATH_TRIG_TOOLTIP_ASIN}', + 'ACOS': '%{BKY_MATH_TRIG_TOOLTIP_ACOS}', + 'ATAN': '%{BKY_MATH_TRIG_TOOLTIP_ATAN}', + + // math_on_lists + 'SUM': '%{BKY_MATH_ONLIST_TOOLTIP_SUM}', + 'MIN': '%{BKY_MATH_ONLIST_TOOLTIP_MIN}', + 'MAX': '%{BKY_MATH_ONLIST_TOOLTIP_MAX}', + 'AVERAGE': '%{BKY_MATH_ONLIST_TOOLTIP_AVERAGE}', + 'MEDIAN': '%{BKY_MATH_ONLIST_TOOLTIP_MEDIAN}', + 'MODE': '%{BKY_MATH_ONLIST_TOOLTIP_MODE}', + 'STD_DEV': '%{BKY_MATH_ONLIST_TOOLTIP_STD_DEV}', + 'RANDOM': '%{BKY_MATH_ONLIST_TOOLTIP_RANDOM}' +}; + +Blockly.Extensions.register('math_op_tooltip', + Blockly.Extensions.buildTooltipForDropdown( + 'OP', Blockly.Constants.Math.TOOLTIPS_BY_OP)); + + +/** + * Mixin for mutator functions in the 'math_is_divisibleby_mutator' + * extension. + * @mixin + * @augments Blockly.Block + * @package + */ +Blockly.Constants.Math.IS_DIVISIBLEBY_MUTATOR_MIXIN = { + /** + * Create XML to represent whether the 'divisorInput' should be present. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function() { + var container = document.createElement('mutation'); + var divisorInput = (this.getFieldValue('PROPERTY') == 'DIVISIBLE_BY'); + container.setAttribute('divisor_input', divisorInput); + return container; + }, + /** + * Parse XML to restore the 'divisorInput'. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + var divisorInput = (xmlElement.getAttribute('divisor_input') == 'true'); + this.updateShape_(divisorInput); + }, + /** + * Modify this block to have (or not have) an input for 'is divisible by'. + * @param {boolean} divisorInput True if this block has a divisor input. + * @private + * @this Blockly.Block + */ + updateShape_: function(divisorInput) { + // Add or remove a Value Input. + var inputExists = this.getInput('DIVISOR'); + if (divisorInput) { + if (!inputExists) { + this.appendValueInput('DIVISOR') + .setCheck('Number'); + } + } else if (inputExists) { + this.removeInput('DIVISOR'); + } + } +}; + +/** + * 'math_is_divisibleby_mutator' extension to the 'math_property' block that + * can update the block shape (add/remove divisor input) based on whether + * property is "divisble by". + * @this Blockly.Block + * @package + */ +Blockly.Constants.Math.IS_DIVISIBLE_MUTATOR_EXTENSION = function() { + this.getField('PROPERTY').setValidator(function(option) { + var divisorInput = (option == 'DIVISIBLE_BY'); + this.sourceBlock_.updateShape_(divisorInput); + }); +}; + +Blockly.Extensions.registerMutator('math_is_divisibleby_mutator', + Blockly.Constants.Math.IS_DIVISIBLEBY_MUTATOR_MIXIN, + Blockly.Constants.Math.IS_DIVISIBLE_MUTATOR_EXTENSION); + +/** + * Update the tooltip of 'math_change' block to reference the variable. + * @this Blockly.Block + * @package + */ +Blockly.Constants.Math.CHANGE_TOOLTIP_EXTENSION = function() { + this.setTooltip(function() { + return Blockly.Msg.MATH_CHANGE_TOOLTIP.replace('%1', + this.getFieldValue('VAR')); + }.bind(this)); +}; + +Blockly.Extensions.register('math_change_tooltip', + Blockly.Extensions.buildTooltipWithFieldValue( + Blockly.Msg.MATH_CHANGE_TOOLTIP, 'VAR')); + +/** + * Mixin with mutator methods to support alternate output based if the + * 'math_on_list' block uses the 'MODE' operation. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Math.LIST_MODES_MUTATOR_MIXIN = { + /** + * Modify this block to have the correct output type. + * @param {string} newOp Either 'MODE' or some op than returns a number. + * @private + * @this Blockly.Block + */ + updateType_: function(newOp) { + if (newOp == 'MODE') { + this.outputConnection.setCheck('Array'); + } else { + this.outputConnection.setCheck('Number'); + } + }, + /** + * Create XML to represent the output type. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function() { + var container = document.createElement('mutation'); + container.setAttribute('op', this.getFieldValue('OP')); + return container; + }, + /** + * Parse XML to restore the output type. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + this.updateType_(xmlElement.getAttribute('op')); + } +}; + +/** + * Extension to 'math_on_list' blocks that allows support of + * modes operation (outputs a list of numbers). + * @this Blockly.Block + * @package + */ +Blockly.Constants.Math.LIST_MODES_MUTATOR_EXTENSION = function() { + this.getField('OP').setValidator(function(newOp) { + this.updateType_(newOp); + }.bind(this)); +}; + +Blockly.Extensions.registerMutator('math_modes_of_list_mutator', + Blockly.Constants.Math.LIST_MODES_MUTATOR_MIXIN, + Blockly.Constants.Math.LIST_MODES_MUTATOR_EXTENSION); diff --git a/src/opsoro/server/static/js/blockly/blocks/procedures.js b/src/opsoro/server/static/js/blockly/blocks/procedures.js new file mode 100644 index 0000000..d545a14 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/blocks/procedures.js @@ -0,0 +1,889 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Procedure blocks for Blockly. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Blocks.procedures'); + +goog.require('Blockly.Blocks'); + + +/** + * Common HSV hue for all blocks in this category. + */ +Blockly.Blocks.procedures.HUE = 290; + +Blockly.Blocks['procedures_defnoreturn'] = { + /** + * Block for defining a procedure with no return value. + * @this Blockly.Block + */ + init: function() { + var nameField = new Blockly.FieldTextInput('', + Blockly.Procedures.rename); + nameField.setSpellcheck(false); + this.appendDummyInput() + .appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE) + .appendField(nameField, 'NAME') + .appendField('', 'PARAMS'); + this.setMutator(new Blockly.Mutator(['procedures_mutatorarg'])); + if ((this.workspace.options.comments || + (this.workspace.options.parentWorkspace && + this.workspace.options.parentWorkspace.options.comments)) && + Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT) { + this.setCommentText(Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT); + } + this.setColour(Blockly.Blocks.procedures.HUE); + this.setTooltip(Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP); + this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL); + this.arguments_ = []; + this.setStatements_(true); + this.statementConnection_ = null; + }, + /** + * Add or remove the statement block from this function definition. + * @param {boolean} hasStatements True if a statement block is needed. + * @this Blockly.Block + */ + setStatements_: function(hasStatements) { + if (this.hasStatements_ === hasStatements) { + return; + } + if (hasStatements) { + this.appendStatementInput('STACK') + .appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_DO); + if (this.getInput('RETURN')) { + this.moveInputBefore('STACK', 'RETURN'); + } + } else { + this.removeInput('STACK', true); + } + this.hasStatements_ = hasStatements; + }, + /** + * Update the display of parameters for this procedure definition block. + * Display a warning if there are duplicately named parameters. + * @private + * @this Blockly.Block + */ + updateParams_: function() { + // Check for duplicated arguments. + var badArg = false; + var hash = {}; + for (var i = 0; i < this.arguments_.length; i++) { + if (hash['arg_' + this.arguments_[i].toLowerCase()]) { + badArg = true; + break; + } + hash['arg_' + this.arguments_[i].toLowerCase()] = true; + } + if (badArg) { + this.setWarningText(Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING); + } else { + this.setWarningText(null); + } + // Merge the arguments into a human-readable list. + var paramString = ''; + if (this.arguments_.length) { + paramString = Blockly.Msg.PROCEDURES_BEFORE_PARAMS + + ' ' + this.arguments_.join(', '); + } + // The params field is deterministic based on the mutation, + // no need to fire a change event. + Blockly.Events.disable(); + try { + this.setFieldValue(paramString, 'PARAMS'); + } finally { + Blockly.Events.enable(); + } + }, + /** + * Create XML to represent the argument inputs. + * @param {boolean=} opt_paramIds If true include the IDs of the parameter + * quarks. Used by Blockly.Procedures.mutateCallers for reconnection. + * @return {!Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function(opt_paramIds) { + var container = document.createElement('mutation'); + if (opt_paramIds) { + container.setAttribute('name', this.getFieldValue('NAME')); + } + for (var i = 0; i < this.arguments_.length; i++) { + var parameter = document.createElement('arg'); + parameter.setAttribute('name', this.arguments_[i]); + if (opt_paramIds && this.paramIds_) { + parameter.setAttribute('paramId', this.paramIds_[i]); + } + container.appendChild(parameter); + } + + // Save whether the statement input is visible. + if (!this.hasStatements_) { + container.setAttribute('statements', 'false'); + } + return container; + }, + /** + * Parse XML to restore the argument inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + this.arguments_ = []; + for (var i = 0, childNode; childNode = xmlElement.childNodes[i]; i++) { + if (childNode.nodeName.toLowerCase() == 'arg') { + this.arguments_.push(childNode.getAttribute('name')); + } + } + this.updateParams_(); + Blockly.Procedures.mutateCallers(this); + + // Show or hide the statement input. + this.setStatements_(xmlElement.getAttribute('statements') !== 'false'); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function(workspace) { + var containerBlock = workspace.newBlock('procedures_mutatorcontainer'); + containerBlock.initSvg(); + + // Check/uncheck the allow statement box. + if (this.getInput('RETURN')) { + containerBlock.setFieldValue(this.hasStatements_ ? 'TRUE' : 'FALSE', + 'STATEMENTS'); + } else { + containerBlock.getInput('STATEMENT_INPUT').setVisible(false); + } + + // Parameter list. + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.arguments_.length; i++) { + var paramBlock = workspace.newBlock('procedures_mutatorarg'); + paramBlock.initSvg(); + paramBlock.setFieldValue(this.arguments_[i], 'NAME'); + // Store the old location. + paramBlock.oldLocation = i; + connection.connect(paramBlock.previousConnection); + connection = paramBlock.nextConnection; + } + // Initialize procedure's callers with blank IDs. + Blockly.Procedures.mutateCallers(this); + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function(containerBlock) { + // Parameter list. + this.arguments_ = []; + this.paramIds_ = []; + var paramBlock = containerBlock.getInputTargetBlock('STACK'); + while (paramBlock) { + this.arguments_.push(paramBlock.getFieldValue('NAME')); + this.paramIds_.push(paramBlock.id); + paramBlock = paramBlock.nextConnection && + paramBlock.nextConnection.targetBlock(); + } + this.updateParams_(); + Blockly.Procedures.mutateCallers(this); + + // Show/hide the statement input. + var hasStatements = containerBlock.getFieldValue('STATEMENTS'); + if (hasStatements !== null) { + hasStatements = hasStatements == 'TRUE'; + if (this.hasStatements_ != hasStatements) { + if (hasStatements) { + this.setStatements_(true); + // Restore the stack, if one was saved. + Blockly.Mutator.reconnect(this.statementConnection_, this, 'STACK'); + this.statementConnection_ = null; + } else { + // Save the stack, then disconnect it. + var stackConnection = this.getInput('STACK').connection; + this.statementConnection_ = stackConnection.targetConnection; + if (this.statementConnection_) { + var stackBlock = stackConnection.targetBlock(); + stackBlock.unplug(); + stackBlock.bumpNeighbours_(); + } + this.setStatements_(false); + } + } + } + }, + /** + * Return the signature of this procedure definition. + * @return {!Array} Tuple containing three elements: + * - the name of the defined procedure, + * - a list of all its arguments, + * - that it DOES NOT have a return value. + * @this Blockly.Block + */ + getProcedureDef: function() { + return [this.getFieldValue('NAME'), this.arguments_, false]; + }, + /** + * Return all variables referenced by this block. + * @return {!Array.} List of variable names. + * @this Blockly.Block + */ + getVars: function() { + return this.arguments_; + }, + /** + * Notification that a variable is renaming. + * If the name matches one of this block's variables, rename it. + * @param {string} oldName Previous name of variable. + * @param {string} newName Renamed variable. + * @this Blockly.Block + */ + renameVar: function(oldName, newName) { + var change = false; + for (var i = 0; i < this.arguments_.length; i++) { + if (Blockly.Names.equals(oldName, this.arguments_[i])) { + this.arguments_[i] = newName; + change = true; + } + } + if (change) { + this.updateParams_(); + // Update the mutator's variables if the mutator is open. + if (this.mutator.isVisible()) { + var blocks = this.mutator.workspace_.getAllBlocks(); + for (var i = 0, block; block = blocks[i]; i++) { + if (block.type == 'procedures_mutatorarg' && + Blockly.Names.equals(oldName, block.getFieldValue('NAME'))) { + block.setFieldValue(newName, 'NAME'); + } + } + } + } + }, + /** + * Add custom menu options to this block's context menu. + * @param {!Array} options List of menu options to add to. + * @this Blockly.Block + */ + customContextMenu: function(options) { + // Add option to create caller. + var option = {enabled: true}; + var name = this.getFieldValue('NAME'); + option.text = Blockly.Msg.PROCEDURES_CREATE_DO.replace('%1', name); + var xmlMutation = goog.dom.createDom('mutation'); + xmlMutation.setAttribute('name', name); + for (var i = 0; i < this.arguments_.length; i++) { + var xmlArg = goog.dom.createDom('arg'); + xmlArg.setAttribute('name', this.arguments_[i]); + xmlMutation.appendChild(xmlArg); + } + var xmlBlock = goog.dom.createDom('block', null, xmlMutation); + xmlBlock.setAttribute('type', this.callType_); + option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); + options.push(option); + + // Add options to create getters for each parameter. + if (!this.isCollapsed()) { + for (var i = 0; i < this.arguments_.length; i++) { + var option = {enabled: true}; + var name = this.arguments_[i]; + option.text = Blockly.Msg.VARIABLES_SET_CREATE_GET.replace('%1', name); + var xmlField = goog.dom.createDom('field', null, name); + xmlField.setAttribute('name', 'VAR'); + var xmlBlock = goog.dom.createDom('block', null, xmlField); + xmlBlock.setAttribute('type', 'variables_get'); + option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); + options.push(option); + } + } + }, + callType_: 'procedures_callnoreturn' +}; + +Blockly.Blocks['procedures_defreturn'] = { + /** + * Block for defining a procedure with a return value. + * @this Blockly.Block + */ + init: function() { + var nameField = new Blockly.FieldTextInput('', + Blockly.Procedures.rename); + nameField.setSpellcheck(false); + this.appendDummyInput() + .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_TITLE) + .appendField(nameField, 'NAME') + .appendField('', 'PARAMS'); + this.appendValueInput('RETURN') + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN); + this.setMutator(new Blockly.Mutator(['procedures_mutatorarg'])); + if ((this.workspace.options.comments || + (this.workspace.options.parentWorkspace && + this.workspace.options.parentWorkspace.options.comments)) && + Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT) { + this.setCommentText(Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT); + } + this.setColour(Blockly.Blocks.procedures.HUE); + this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP); + this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL); + this.arguments_ = []; + this.setStatements_(true); + this.statementConnection_ = null; + }, + setStatements_: Blockly.Blocks['procedures_defnoreturn'].setStatements_, + updateParams_: Blockly.Blocks['procedures_defnoreturn'].updateParams_, + mutationToDom: Blockly.Blocks['procedures_defnoreturn'].mutationToDom, + domToMutation: Blockly.Blocks['procedures_defnoreturn'].domToMutation, + decompose: Blockly.Blocks['procedures_defnoreturn'].decompose, + compose: Blockly.Blocks['procedures_defnoreturn'].compose, + /** + * Return the signature of this procedure definition. + * @return {!Array} Tuple containing three elements: + * - the name of the defined procedure, + * - a list of all its arguments, + * - that it DOES have a return value. + * @this Blockly.Block + */ + getProcedureDef: function() { + return [this.getFieldValue('NAME'), this.arguments_, true]; + }, + getVars: Blockly.Blocks['procedures_defnoreturn'].getVars, + renameVar: Blockly.Blocks['procedures_defnoreturn'].renameVar, + customContextMenu: Blockly.Blocks['procedures_defnoreturn'].customContextMenu, + callType_: 'procedures_callreturn' +}; + +Blockly.Blocks['procedures_mutatorcontainer'] = { + /** + * Mutator block for procedure container. + * @this Blockly.Block + */ + init: function() { + this.appendDummyInput() + .appendField(Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE); + this.appendStatementInput('STACK'); + this.appendDummyInput('STATEMENT_INPUT') + .appendField(Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS) + .appendField(new Blockly.FieldCheckbox('TRUE'), 'STATEMENTS'); + this.setColour(Blockly.Blocks.procedures.HUE); + this.setTooltip(Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP); + this.contextMenu = false; + } +}; + +Blockly.Blocks['procedures_mutatorarg'] = { + /** + * Mutator block for procedure argument. + * @this Blockly.Block + */ + init: function() { + var field = new Blockly.FieldTextInput('x', this.validator_); + this.appendDummyInput() + .appendField(Blockly.Msg.PROCEDURES_MUTATORARG_TITLE) + .appendField(field, 'NAME'); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(Blockly.Blocks.procedures.HUE); + this.setTooltip(Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP); + this.contextMenu = false; + + // Create the default variable when we drag the block in from the flyout. + // Have to do this after installing the field on the block. + field.onFinishEditing_ = this.createNewVar_; + field.onFinishEditing_('x'); + }, + /** + * Obtain a valid name for the procedure. + * Merge runs of whitespace. Strip leading and trailing whitespace. + * Beyond this, all names are legal. + * @param {string} newVar User-supplied name. + * @return {?string} Valid name, or null if a name was not specified. + * @private + * @this Blockly.Block + */ + validator_: function(newVar) { + newVar = newVar.replace(/[\s\xa0]+/g, ' ').replace(/^ | $/g, ''); + return newVar || null; + }, + /** + * Called when focusing away from the text field. + * Creates a new variable with this name. + * @param {string} newText The new variable name. + * @private + * @this Blockly.FieldTextInput + */ + createNewVar_: function(newText) { + var source = this.sourceBlock_; + if (source && source.workspace && source.workspace.options && + source.workspace.options.parentWorkspace) { + source.workspace.options.parentWorkspace.createVariable(newText); + } + } +}; + +Blockly.Blocks['procedures_callnoreturn'] = { + /** + * Block for calling a procedure with no return value. + * @this Blockly.Block + */ + init: function() { + this.appendDummyInput('TOPROW') + .appendField(this.id, 'NAME'); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(Blockly.Blocks.procedures.HUE); + // Tooltip is set in renameProcedure. + this.setHelpUrl(Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL); + this.arguments_ = []; + this.quarkConnections_ = {}; + this.quarkIds_ = null; + }, + /** + * Returns the name of the procedure this block calls. + * @return {string} Procedure name. + * @this Blockly.Block + */ + getProcedureCall: function() { + // The NAME field is guaranteed to exist, null will never be returned. + return /** @type {string} */ (this.getFieldValue('NAME')); + }, + /** + * Notification that a procedure is renaming. + * If the name matches this block's procedure, rename it. + * @param {string} oldName Previous name of procedure. + * @param {string} newName Renamed procedure. + * @this Blockly.Block + */ + renameProcedure: function(oldName, newName) { + if (Blockly.Names.equals(oldName, this.getProcedureCall())) { + this.setFieldValue(newName, 'NAME'); + this.setTooltip( + (this.outputConnection ? Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP : + Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP) + .replace('%1', newName)); + } + }, + /** + * Notification that the procedure's parameters have changed. + * @param {!Array.} paramNames New param names, e.g. ['x', 'y', 'z']. + * @param {!Array.} paramIds IDs of params (consistent for each + * parameter through the life of a mutator, regardless of param renaming), + * e.g. ['piua', 'f8b_', 'oi.o']. + * @private + * @this Blockly.Block + */ + setProcedureParameters_: function(paramNames, paramIds) { + // Data structures: + // this.arguments = ['x', 'y'] + // Existing param names. + // this.quarkConnections_ {piua: null, f8b_: Blockly.Connection} + // Look-up of paramIds to connections plugged into the call block. + // this.quarkIds_ = ['piua', 'f8b_'] + // Existing param IDs. + // Note that quarkConnections_ may include IDs that no longer exist, but + // which might reappear if a param is reattached in the mutator. + var defBlock = Blockly.Procedures.getDefinition(this.getProcedureCall(), + this.workspace); + var mutatorOpen = defBlock && defBlock.mutator && + defBlock.mutator.isVisible(); + if (!mutatorOpen) { + this.quarkConnections_ = {}; + this.quarkIds_ = null; + } + if (!paramIds) { + // Reset the quarks (a mutator is about to open). + return; + } + if (goog.array.equals(this.arguments_, paramNames)) { + // No change. + this.quarkIds_ = paramIds; + return; + } + if (paramIds.length != paramNames.length) { + throw 'Error: paramNames and paramIds must be the same length.'; + } + this.setCollapsed(false); + if (!this.quarkIds_) { + // Initialize tracking for this block. + this.quarkConnections_ = {}; + if (paramNames.join('\n') == this.arguments_.join('\n')) { + // No change to the parameters, allow quarkConnections_ to be + // populated with the existing connections. + this.quarkIds_ = paramIds; + } else { + this.quarkIds_ = []; + } + } + // Switch off rendering while the block is rebuilt. + var savedRendered = this.rendered; + this.rendered = false; + // Update the quarkConnections_ with existing connections. + for (var i = 0; i < this.arguments_.length; i++) { + var input = this.getInput('ARG' + i); + if (input) { + var connection = input.connection.targetConnection; + this.quarkConnections_[this.quarkIds_[i]] = connection; + if (mutatorOpen && connection && + paramIds.indexOf(this.quarkIds_[i]) == -1) { + // This connection should no longer be attached to this block. + connection.disconnect(); + connection.getSourceBlock().bumpNeighbours_(); + } + } + } + // Rebuild the block's arguments. + this.arguments_ = [].concat(paramNames); + this.updateShape_(); + this.quarkIds_ = paramIds; + // Reconnect any child blocks. + if (this.quarkIds_) { + for (var i = 0; i < this.arguments_.length; i++) { + var quarkId = this.quarkIds_[i]; + if (quarkId in this.quarkConnections_) { + var connection = this.quarkConnections_[quarkId]; + if (!Blockly.Mutator.reconnect(connection, this, 'ARG' + i)) { + // Block no longer exists or has been attached elsewhere. + delete this.quarkConnections_[quarkId]; + } + } + } + } + // Restore rendering and show the changes. + this.rendered = savedRendered; + if (this.rendered) { + this.render(); + } + }, + /** + * Modify this block to have the correct number of arguments. + * @private + * @this Blockly.Block + */ + updateShape_: function() { + for (var i = 0; i < this.arguments_.length; i++) { + var field = this.getField('ARGNAME' + i); + if (field) { + // Ensure argument name is up to date. + // The argument name field is deterministic based on the mutation, + // no need to fire a change event. + Blockly.Events.disable(); + try { + field.setValue(this.arguments_[i]); + } finally { + Blockly.Events.enable(); + } + } else { + // Add new input. + field = new Blockly.FieldLabel(this.arguments_[i]); + var input = this.appendValueInput('ARG' + i) + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(field, 'ARGNAME' + i); + input.init(); + } + } + // Remove deleted inputs. + while (this.getInput('ARG' + i)) { + this.removeInput('ARG' + i); + i++; + } + // Add 'with:' if there are parameters, remove otherwise. + var topRow = this.getInput('TOPROW'); + if (topRow) { + if (this.arguments_.length) { + if (!this.getField('WITH')) { + topRow.appendField(Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS, 'WITH'); + topRow.init(); + } + } else { + if (this.getField('WITH')) { + topRow.removeField('WITH'); + } + } + } + }, + /** + * Create XML to represent the (non-editable) name and arguments. + * @return {!Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function() { + var container = document.createElement('mutation'); + container.setAttribute('name', this.getProcedureCall()); + for (var i = 0; i < this.arguments_.length; i++) { + var parameter = document.createElement('arg'); + parameter.setAttribute('name', this.arguments_[i]); + container.appendChild(parameter); + } + return container; + }, + /** + * Parse XML to restore the (non-editable) name and parameters. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + var name = xmlElement.getAttribute('name'); + this.renameProcedure(this.getProcedureCall(), name); + var args = []; + var paramIds = []; + for (var i = 0, childNode; childNode = xmlElement.childNodes[i]; i++) { + if (childNode.nodeName.toLowerCase() == 'arg') { + args.push(childNode.getAttribute('name')); + paramIds.push(childNode.getAttribute('paramId')); + } + } + this.setProcedureParameters_(args, paramIds); + }, + /** + * Notification that a variable is renaming. + * If the name matches one of this block's variables, rename it. + * @param {string} oldName Previous name of variable. + * @param {string} newName Renamed variable. + * @this Blockly.Block + */ + renameVar: function(oldName, newName) { + for (var i = 0; i < this.arguments_.length; i++) { + if (Blockly.Names.equals(oldName, this.arguments_[i])) { + this.arguments_[i] = newName; + this.getField('ARGNAME' + i).setValue(newName); + } + } + }, + /** + * Procedure calls cannot exist without the corresponding procedure + * definition. Enforce this link whenever an event is fired. + * @param {!Blockly.Events.Abstract} event Change event. + * @this Blockly.Block + */ + onchange: function(event) { + if (!this.workspace || this.workspace.isFlyout) { + // Block is deleted or is in a flyout. + return; + } + if (event.type == Blockly.Events.CREATE && + event.ids.indexOf(this.id) != -1) { + // Look for the case where a procedure call was created (usually through + // paste) and there is no matching definition. In this case, create + // an empty definition block with the correct signature. + var name = this.getProcedureCall(); + var def = Blockly.Procedures.getDefinition(name, this.workspace); + if (def && (def.type != this.defType_ || + JSON.stringify(def.arguments_) != JSON.stringify(this.arguments_))) { + // The signatures don't match. + def = null; + } + if (!def) { + Blockly.Events.setGroup(event.group); + /** + * Create matching definition block. + * + * + * + * + * + * test + * + * + */ + var xml = goog.dom.createDom('xml'); + var block = goog.dom.createDom('block'); + block.setAttribute('type', this.defType_); + var xy = this.getRelativeToSurfaceXY(); + var x = xy.x + Blockly.SNAP_RADIUS * (this.RTL ? -1 : 1); + var y = xy.y + Blockly.SNAP_RADIUS * 2; + block.setAttribute('x', x); + block.setAttribute('y', y); + var mutation = this.mutationToDom(); + block.appendChild(mutation); + var field = goog.dom.createDom('field'); + field.setAttribute('name', 'NAME'); + field.appendChild(document.createTextNode(this.getProcedureCall())); + block.appendChild(field); + xml.appendChild(block); + Blockly.Xml.domToWorkspace(xml, this.workspace); + Blockly.Events.setGroup(false); + } + } else if (event.type == Blockly.Events.DELETE) { + // Look for the case where a procedure definition has been deleted, + // leaving this block (a procedure call) orphaned. In this case, delete + // the orphan. + var name = this.getProcedureCall(); + var def = Blockly.Procedures.getDefinition(name, this.workspace); + if (!def) { + Blockly.Events.setGroup(event.group); + this.dispose(true, false); + Blockly.Events.setGroup(false); + } + } + }, + /** + * Add menu option to find the definition block for this call. + * @param {!Array} options List of menu options to add to. + * @this Blockly.Block + */ + customContextMenu: function(options) { + var option = {enabled: true}; + option.text = Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF; + var name = this.getProcedureCall(); + var workspace = this.workspace; + option.callback = function() { + var def = Blockly.Procedures.getDefinition(name, workspace); + def && def.select(); + }; + options.push(option); + }, + defType_: 'procedures_defnoreturn' +}; + +Blockly.Blocks['procedures_callreturn'] = { + /** + * Block for calling a procedure with a return value. + * @this Blockly.Block + */ + init: function() { + this.appendDummyInput('TOPROW') + .appendField('', 'NAME'); + this.setOutput(true); + this.setColour(Blockly.Blocks.procedures.HUE); + // Tooltip is set in domToMutation. + this.setHelpUrl(Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL); + this.arguments_ = []; + this.quarkConnections_ = {}; + this.quarkIds_ = null; + }, + getProcedureCall: Blockly.Blocks['procedures_callnoreturn'].getProcedureCall, + renameProcedure: Blockly.Blocks['procedures_callnoreturn'].renameProcedure, + setProcedureParameters_: + Blockly.Blocks['procedures_callnoreturn'].setProcedureParameters_, + updateShape_: Blockly.Blocks['procedures_callnoreturn'].updateShape_, + mutationToDom: Blockly.Blocks['procedures_callnoreturn'].mutationToDom, + domToMutation: Blockly.Blocks['procedures_callnoreturn'].domToMutation, + renameVar: Blockly.Blocks['procedures_callnoreturn'].renameVar, + onchange: Blockly.Blocks['procedures_callnoreturn'].onchange, + customContextMenu: + Blockly.Blocks['procedures_callnoreturn'].customContextMenu, + defType_: 'procedures_defreturn' +}; + +Blockly.Blocks['procedures_ifreturn'] = { + /** + * Block for conditionally returning a value from a procedure. + * @this Blockly.Block + */ + init: function() { + this.appendValueInput('CONDITION') + .setCheck('Boolean') + .appendField(Blockly.Msg.CONTROLS_IF_MSG_IF); + this.appendValueInput('VALUE') + .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(Blockly.Blocks.procedures.HUE); + this.setTooltip(Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP); + this.setHelpUrl(Blockly.Msg.PROCEDURES_IFRETURN_HELPURL); + this.hasReturnValue_ = true; + }, + /** + * Create XML to represent whether this block has a return value. + * @return {!Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function() { + var container = document.createElement('mutation'); + container.setAttribute('value', Number(this.hasReturnValue_)); + return container; + }, + /** + * Parse XML to restore whether this block has a return value. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + var value = xmlElement.getAttribute('value'); + this.hasReturnValue_ = (value == 1); + if (!this.hasReturnValue_) { + this.removeInput('VALUE'); + this.appendDummyInput('VALUE') + .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN); + } + }, + /** + * Called whenever anything on the workspace changes. + * Add warning if this flow block is not nested inside a loop. + * @param {!Blockly.Events.Abstract} e Change event. + * @this Blockly.Block + */ + onchange: function(/* e */) { + if (!this.workspace.isDragging || this.workspace.isDragging()) { + return; // Don't change state at the start of a drag. + } + var legal = false; + // Is the block nested in a procedure? + var block = this; + do { + if (this.FUNCTION_TYPES.indexOf(block.type) != -1) { + legal = true; + break; + } + block = block.getSurroundParent(); + } while (block); + if (legal) { + // If needed, toggle whether this block has a return value. + if (block.type == 'procedures_defnoreturn' && this.hasReturnValue_) { + this.removeInput('VALUE'); + this.appendDummyInput('VALUE') + .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN); + this.hasReturnValue_ = false; + } else if (block.type == 'procedures_defreturn' && + !this.hasReturnValue_) { + this.removeInput('VALUE'); + this.appendValueInput('VALUE') + .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN); + this.hasReturnValue_ = true; + } + this.setWarningText(null); + if (!this.isInFlyout) { + this.setDisabled(false); + } + } else { + this.setWarningText(Blockly.Msg.PROCEDURES_IFRETURN_WARNING); + if (!this.isInFlyout && !this.getInheritedDisabled()) { + this.setDisabled(true); + } + } + }, + /** + * List of block types that are functions and thus do not need warnings. + * To add a new function type add this to your code: + * Blockly.Blocks['procedures_ifreturn'].FUNCTION_TYPES.push('custom_func'); + */ + FUNCTION_TYPES: ['procedures_defnoreturn', 'procedures_defreturn'] +}; diff --git a/src/opsoro/server/static/js/blockly/blocks/text.js b/src/opsoro/server/static/js/blockly/blocks/text.js new file mode 100644 index 0000000..f61d3a6 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/blocks/text.js @@ -0,0 +1,851 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Text blocks for Blockly. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Blocks.texts'); // Deprecated +goog.provide('Blockly.Constants.Text'); + +goog.require('Blockly.Blocks'); + + +/** + * Common HSV hue for all blocks in this category. + * Should be the same as Blockly.Msg.TEXTS_HUE + * @readonly + */ +Blockly.Constants.Text.HUE = 160; +/** @deprecated Use Blockly.Constants.Text.HUE */ +Blockly.Blocks.texts.HUE = Blockly.Constants.Text.HUE; + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for text value + { + "type": "text", + "message0": "%1", + "args0": [{ + "type": "field_input", + "name": "TEXT", + "text": "" + }], + "output": "String", + "colour": "%{BKY_TEXTS_HUE}", + "helpUrl": "%{BKY_TEXT_TEXT_HELPURL}", + "tooltip": "%{BKY_TEXT_TEXT_TOOLTIP}", + "extensions": [ + "text_quotes", + "parent_tooltip_when_inline" + ] + } +]); // END JSON EXTRACT (Do not delete this comment.) + +/** Wraps TEXT field with images of double quote characters. */ +Blockly.Constants.Text.textQuotesExtension = function() { + this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); + this.quoteField_('TEXT'); +}; + +Blockly.Extensions.register('text_quotes', + Blockly.Constants.Text.textQuotesExtension); + +Blockly.Blocks['text_join'] = { + /** + * Block for creating a string made up of any number of elements of any type. + * @this Blockly.Block + */ + init: function() { + this.setHelpUrl(Blockly.Msg.TEXT_JOIN_HELPURL); + this.setColour(Blockly.Blocks.texts.HUE); + this.itemCount_ = 2; + this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); + this.updateShape_(); + this.setOutput(true, 'String'); + this.setMutator(new Blockly.Mutator(['text_create_join_item'])); + this.setTooltip(Blockly.Msg.TEXT_JOIN_TOOLTIP); + }, + /** + * Create XML to represent number of text inputs. + * @return {!Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function() { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + /** + * Parse XML to restore the text inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function(workspace) { + var containerBlock = workspace.newBlock('text_create_join_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('text_create_join_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function(containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + while (itemBlock) { + connections.push(itemBlock.valueConnection_); + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + // Disconnect any children that don't belong. + for (var i = 0; i < this.itemCount_; i++) { + var connection = this.getInput('ADD' + i).connection.targetConnection; + if (connection && connections.indexOf(connection) == -1) { + connection.disconnect(); + } + } + this.itemCount_ = connections.length; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + Blockly.Mutator.reconnect(connections[i], this, 'ADD' + i); + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function(containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function() { + if (this.itemCount_ && this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else if (!this.itemCount_ && !this.getInput('EMPTY')) { + this.appendDummyInput('EMPTY') + .appendField(this.newQuote_(true)) + .appendField(this.newQuote_(false)); + } + // Add new inputs. + for (var i = 0; i < this.itemCount_; i++) { + if (!this.getInput('ADD' + i)) { + var input = this.appendValueInput('ADD' + i); + if (i == 0) { + input.appendField(Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH); + } + } + } + // Remove deleted inputs. + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } +}; + +Blockly.Blocks['text_create_join_container'] = { + /** + * Mutator block for container. + * @this Blockly.Block + */ + init: function() { + this.setColour(Blockly.Blocks.texts.HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN); + this.appendStatementInput('STACK'); + this.setTooltip(Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP); + this.contextMenu = false; + } +}; + +Blockly.Blocks['text_create_join_item'] = { + /** + * Mutator block for add items. + * @this Blockly.Block + */ + init: function() { + this.setColour(Blockly.Blocks.texts.HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP); + this.contextMenu = false; + } +}; + +Blockly.Blocks['text_append'] = { + /** + * Block for appending to a variable in place. + * @this Blockly.Block + */ + init: function() { + this.setHelpUrl(Blockly.Msg.TEXT_APPEND_HELPURL); + this.setColour(Blockly.Blocks.texts.HUE); + this.appendValueInput('TEXT') + .appendField(Blockly.Msg.TEXT_APPEND_TO) + .appendField(new Blockly.FieldVariable( + Blockly.Msg.TEXT_APPEND_VARIABLE), 'VAR') + .appendField(Blockly.Msg.TEXT_APPEND_APPENDTEXT); + this.setPreviousStatement(true); + this.setNextStatement(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function() { + return Blockly.Msg.TEXT_APPEND_TOOLTIP.replace('%1', + thisBlock.getFieldValue('VAR')); + }); + } +}; + +Blockly.Blocks['text_length'] = { + /** + * Block for string length. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "message0": Blockly.Msg.TEXT_LENGTH_TITLE, + "args0": [ + { + "type": "input_value", + "name": "VALUE", + "check": ['String', 'Array'] + } + ], + "output": 'Number', + "colour": Blockly.Blocks.texts.HUE, + "tooltip": Blockly.Msg.TEXT_LENGTH_TOOLTIP, + "helpUrl": Blockly.Msg.TEXT_LENGTH_HELPURL + }); + } +}; + +Blockly.Blocks['text_isEmpty'] = { + /** + * Block for is the string null? + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "message0": Blockly.Msg.TEXT_ISEMPTY_TITLE, + "args0": [ + { + "type": "input_value", + "name": "VALUE", + "check": ['String', 'Array'] + } + ], + "output": 'Boolean', + "colour": Blockly.Blocks.texts.HUE, + "tooltip": Blockly.Msg.TEXT_ISEMPTY_TOOLTIP, + "helpUrl": Blockly.Msg.TEXT_ISEMPTY_HELPURL + }); + } +}; + +Blockly.Blocks['text_indexOf'] = { + /** + * Block for finding a substring in the text. + * @this Blockly.Block + */ + init: function() { + var OPERATORS = [ + [Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST, 'FIRST'], + [Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST, 'LAST'] + ]; + this.setHelpUrl(Blockly.Msg.TEXT_INDEXOF_HELPURL); + this.setColour(Blockly.Blocks.texts.HUE); + this.setOutput(true, 'Number'); + this.appendValueInput('VALUE') + .setCheck('String') + .appendField(Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT); + this.appendValueInput('FIND') + .setCheck('String') + .appendField(new Blockly.FieldDropdown(OPERATORS), 'END'); + if (Blockly.Msg.TEXT_INDEXOF_TAIL) { + this.appendDummyInput().appendField(Blockly.Msg.TEXT_INDEXOF_TAIL); + } + this.setInputsInline(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function() { + return Blockly.Msg.TEXT_INDEXOF_TOOLTIP.replace('%1', + thisBlock.workspace.options.oneBasedIndex ? '0' : '-1'); + }); + } +}; + +Blockly.Blocks['text_charAt'] = { + /** + * Block for getting a character from the string. + * @this Blockly.Block + */ + init: function() { + this.WHERE_OPTIONS = [ + [Blockly.Msg.TEXT_CHARAT_FROM_START, 'FROM_START'], + [Blockly.Msg.TEXT_CHARAT_FROM_END, 'FROM_END'], + [Blockly.Msg.TEXT_CHARAT_FIRST, 'FIRST'], + [Blockly.Msg.TEXT_CHARAT_LAST, 'LAST'], + [Blockly.Msg.TEXT_CHARAT_RANDOM, 'RANDOM'] + ]; + this.setHelpUrl(Blockly.Msg.TEXT_CHARAT_HELPURL); + this.setColour(Blockly.Blocks.texts.HUE); + this.setOutput(true, 'String'); + this.appendValueInput('VALUE') + .setCheck('String') + .appendField(Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT); + this.appendDummyInput('AT'); + this.setInputsInline(true); + this.updateAt_(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function() { + var where = thisBlock.getFieldValue('WHERE'); + var tooltip = Blockly.Msg.TEXT_CHARAT_TOOLTIP; + if (where == 'FROM_START' || where == 'FROM_END') { + var msg = (where == 'FROM_START') ? + Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP : + Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP; + tooltip += ' ' + msg.replace('%1', + thisBlock.workspace.options.oneBasedIndex ? '#1' : '#0'); + } + return tooltip; + }); + }, + /** + * Create XML to represent whether there is an 'AT' input. + * @return {!Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function() { + var container = document.createElement('mutation'); + var isAt = this.getInput('AT').type == Blockly.INPUT_VALUE; + container.setAttribute('at', isAt); + return container; + }, + /** + * Parse XML to restore the 'AT' input. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + // Note: Until January 2013 this block did not have mutations, + // so 'at' defaults to true. + var isAt = (xmlElement.getAttribute('at') != 'false'); + this.updateAt_(isAt); + }, + /** + * Create or delete an input for the numeric index. + * @param {boolean} isAt True if the input should exist. + * @private + * @this Blockly.Block + */ + updateAt_: function(isAt) { + // Destroy old 'AT' and 'ORDINAL' inputs. + this.removeInput('AT'); + this.removeInput('ORDINAL', true); + // Create either a value 'AT' input or a dummy input. + if (isAt) { + this.appendValueInput('AT').setCheck('Number'); + if (Blockly.Msg.ORDINAL_NUMBER_SUFFIX) { + this.appendDummyInput('ORDINAL') + .appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX); + } + } else { + this.appendDummyInput('AT'); + } + if (Blockly.Msg.TEXT_CHARAT_TAIL) { + this.removeInput('TAIL', true); + this.appendDummyInput('TAIL') + .appendField(Blockly.Msg.TEXT_CHARAT_TAIL); + } + var menu = new Blockly.FieldDropdown(this.WHERE_OPTIONS, function(value) { + var newAt = (value == 'FROM_START') || (value == 'FROM_END'); + // The 'isAt' variable is available due to this function being a closure. + if (newAt != isAt) { + var block = this.sourceBlock_; + block.updateAt_(newAt); + // This menu has been destroyed and replaced. Update the replacement. + block.setFieldValue(value, 'WHERE'); + return null; + } + return undefined; + }); + this.getInput('AT').appendField(menu, 'WHERE'); + } +}; + +Blockly.Blocks['text_getSubstring'] = { + /** + * Block for getting substring. + * @this Blockly.Block + */ + init: function() { + this['WHERE_OPTIONS_1'] = [ + [Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START, 'FROM_START'], + [Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END, 'FROM_END'], + [Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST, 'FIRST'] + ]; + this['WHERE_OPTIONS_2'] = [ + [Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START, 'FROM_START'], + [Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END, 'FROM_END'], + [Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST, 'LAST'] + ]; + this.setHelpUrl(Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL); + this.setColour(Blockly.Blocks.texts.HUE); + this.appendValueInput('STRING') + .setCheck('String') + .appendField(Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT); + this.appendDummyInput('AT1'); + this.appendDummyInput('AT2'); + if (Blockly.Msg.TEXT_GET_SUBSTRING_TAIL) { + this.appendDummyInput('TAIL') + .appendField(Blockly.Msg.TEXT_GET_SUBSTRING_TAIL); + } + this.setInputsInline(true); + this.setOutput(true, 'String'); + this.updateAt_(1, true); + this.updateAt_(2, true); + this.setTooltip(Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP); + }, + /** + * Create XML to represent whether there are 'AT' inputs. + * @return {!Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function() { + var container = document.createElement('mutation'); + var isAt1 = this.getInput('AT1').type == Blockly.INPUT_VALUE; + container.setAttribute('at1', isAt1); + var isAt2 = this.getInput('AT2').type == Blockly.INPUT_VALUE; + container.setAttribute('at2', isAt2); + return container; + }, + /** + * Parse XML to restore the 'AT' inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + var isAt1 = (xmlElement.getAttribute('at1') == 'true'); + var isAt2 = (xmlElement.getAttribute('at2') == 'true'); + this.updateAt_(1, isAt1); + this.updateAt_(2, isAt2); + }, + /** + * Create or delete an input for a numeric index. + * This block has two such inputs, independant of each other. + * @param {number} n Specify first or second input (1 or 2). + * @param {boolean} isAt True if the input should exist. + * @private + * @this Blockly.Block + */ + updateAt_: function(n, isAt) { + // Create or delete an input for the numeric index. + // Destroy old 'AT' and 'ORDINAL' inputs. + this.removeInput('AT' + n); + this.removeInput('ORDINAL' + n, true); + // Create either a value 'AT' input or a dummy input. + if (isAt) { + this.appendValueInput('AT' + n).setCheck('Number'); + if (Blockly.Msg.ORDINAL_NUMBER_SUFFIX) { + this.appendDummyInput('ORDINAL' + n) + .appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX); + } + } else { + this.appendDummyInput('AT' + n); + } + // Move tail, if present, to end of block. + if (n == 2 && Blockly.Msg.TEXT_GET_SUBSTRING_TAIL) { + this.removeInput('TAIL', true); + this.appendDummyInput('TAIL') + .appendField(Blockly.Msg.TEXT_GET_SUBSTRING_TAIL); + } + var menu = new Blockly.FieldDropdown(this['WHERE_OPTIONS_' + n], + function(value) { + var newAt = (value == 'FROM_START') || (value == 'FROM_END'); + // The 'isAt' variable is available due to this function being a + // closure. + if (newAt != isAt) { + var block = this.sourceBlock_; + block.updateAt_(n, newAt); + // This menu has been destroyed and replaced. + // Update the replacement. + block.setFieldValue(value, 'WHERE' + n); + return null; + } + return undefined; + }); + + this.getInput('AT' + n) + .appendField(menu, 'WHERE' + n); + if (n == 1) { + this.moveInputBefore('AT1', 'AT2'); + } + } +}; + +Blockly.Blocks['text_changeCase'] = { + /** + * Block for changing capitalization. + * @this Blockly.Block + */ + init: function() { + var OPERATORS = [ + [Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE, 'UPPERCASE'], + [Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE, 'LOWERCASE'], + [Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE, 'TITLECASE'] + ]; + this.setHelpUrl(Blockly.Msg.TEXT_CHANGECASE_HELPURL); + this.setColour(Blockly.Blocks.texts.HUE); + this.appendValueInput('TEXT') + .setCheck('String') + .appendField(new Blockly.FieldDropdown(OPERATORS), 'CASE'); + this.setOutput(true, 'String'); + this.setTooltip(Blockly.Msg.TEXT_CHANGECASE_TOOLTIP); + } +}; + +Blockly.Blocks['text_trim'] = { + /** + * Block for trimming spaces. + * @this Blockly.Block + */ + init: function() { + var OPERATORS = [ + [Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH, 'BOTH'], + [Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT, 'LEFT'], + [Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT, 'RIGHT'] + ]; + this.setHelpUrl(Blockly.Msg.TEXT_TRIM_HELPURL); + this.setColour(Blockly.Blocks.texts.HUE); + this.appendValueInput('TEXT') + .setCheck('String') + .appendField(new Blockly.FieldDropdown(OPERATORS), 'MODE'); + this.setOutput(true, 'String'); + this.setTooltip(Blockly.Msg.TEXT_TRIM_TOOLTIP); + } +}; + +Blockly.Blocks['text_print'] = { + /** + * Block for print statement. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "message0": Blockly.Msg.TEXT_PRINT_TITLE, + "args0": [ + { + "type": "input_value", + "name": "TEXT" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Blocks.texts.HUE, + "tooltip": Blockly.Msg.TEXT_PRINT_TOOLTIP, + "helpUrl": Blockly.Msg.TEXT_PRINT_HELPURL + }); + } +}; + +Blockly.Blocks['text_prompt_ext'] = { + /** + * Block for prompt function (external message). + * @this Blockly.Block + */ + init: function() { + var TYPES = [ + [Blockly.Msg.TEXT_PROMPT_TYPE_TEXT, 'TEXT'], + [Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER, 'NUMBER'] + ]; + this.setHelpUrl(Blockly.Msg.TEXT_PROMPT_HELPURL); + this.setColour(Blockly.Blocks.texts.HUE); + // Assign 'this' to a variable for use in the closures below. + var thisBlock = this; + var dropdown = new Blockly.FieldDropdown(TYPES, function(newOp) { + thisBlock.updateType_(newOp); + }); + this.appendValueInput('TEXT') + .appendField(dropdown, 'TYPE'); + this.setOutput(true, 'String'); + this.setTooltip(function() { + return (thisBlock.getFieldValue('TYPE') == 'TEXT') ? + Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT : + Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER; + }); + }, + /** + * Modify this block to have the correct output type. + * @param {string} newOp Either 'TEXT' or 'NUMBER'. + * @private + * @this Blockly.Block + */ + updateType_: function(newOp) { + this.outputConnection.setCheck(newOp == 'NUMBER' ? 'Number' : 'String'); + }, + /** + * Create XML to represent the output type. + * @return {!Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function() { + var container = document.createElement('mutation'); + container.setAttribute('type', this.getFieldValue('TYPE')); + return container; + }, + /** + * Parse XML to restore the output type. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + this.updateType_(xmlElement.getAttribute('type')); + } +}; + +Blockly.Blocks['text_prompt'] = { + /** + * Block for prompt function (internal message). + * The 'text_prompt_ext' block is preferred as it is more flexible. + * @this Blockly.Block + */ + init: function() { + this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); + var TYPES = [ + [Blockly.Msg.TEXT_PROMPT_TYPE_TEXT, 'TEXT'], + [Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER, 'NUMBER'] + ]; + + // Assign 'this' to a variable for use in the closures below. + var thisBlock = this; + this.setHelpUrl(Blockly.Msg.TEXT_PROMPT_HELPURL); + this.setColour(Blockly.Blocks.texts.HUE); + var dropdown = new Blockly.FieldDropdown(TYPES, function(newOp) { + thisBlock.updateType_(newOp); + }); + this.appendDummyInput() + .appendField(dropdown, 'TYPE') + .appendField(this.newQuote_(true)) + .appendField(new Blockly.FieldTextInput(''), 'TEXT') + .appendField(this.newQuote_(false)); + this.setOutput(true, 'String'); + this.setTooltip(function() { + return (thisBlock.getFieldValue('TYPE') == 'TEXT') ? + Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT : + Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER; + }); + }, + updateType_: Blockly.Blocks['text_prompt_ext'].updateType_, + mutationToDom: Blockly.Blocks['text_prompt_ext'].mutationToDom, + domToMutation: Blockly.Blocks['text_prompt_ext'].domToMutation +}; + +Blockly.Blocks['text_count'] = { + /** + * Block for counting how many times one string appears within another string. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "message0": Blockly.Msg.TEXT_COUNT_MESSAGE0, + "args0": [ + { + "type": "input_value", + "name": "SUB", + "check": "String" + }, + { + "type": "input_value", + "name": "TEXT", + "check": "String" + } + ], + "output": "Number", + "inputsInline": true, + "colour": Blockly.Blocks.math.HUE, + "tooltip": Blockly.Msg.TEXT_COUNT_TOOLTIP, + "helpUrl": Blockly.Msg.TEXT_COUNT_HELPURL + }); + } +}; + +Blockly.Blocks['text_replace'] = { + /** + * Block for replacing one string with another in the text. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "message0": Blockly.Msg.TEXT_REPLACE_MESSAGE0, + "args0": [ + { + "type": "input_value", + "name": "FROM", + "check": "String" + }, + { + "type": "input_value", + "name": "TO", + "check": "String" + }, + { + "type": "input_value", + "name": "TEXT", + "check": "String" + } + ], + "output": "String", + "inputsInline": true, + "colour": Blockly.Blocks.texts.HUE, + "tooltip": Blockly.Msg.TEXT_REPLACE_TOOLTIP, + "helpUrl": Blockly.Msg.TEXT_REPLACE_HELPURL + }); + } +}; + +Blockly.Blocks['text_reverse'] = { + /** + * Block for reversing a string. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "message0": Blockly.Msg.TEXT_REVERSE_MESSAGE0, + "args0": [ + { + "type": "input_value", + "name": "TEXT", + "check": "String" + } + ], + "output": "String", + "inputsInline": true, + "colour": Blockly.Blocks.texts.HUE, + "tooltip": Blockly.Msg.TEXT_REVERSE_TOOLTIP, + "helpUrl": Blockly.Msg.TEXT_REVERSE_HELPURL + }); + } +}; + +/** + * + * @mixin + * @package + * @readonly + */ +Blockly.Constants.Text.QUOTE_IMAGE_MIXIN = { + /** + * Image data URI of an LTR opening double quote (same as RTL closing couble quote). + * @readonly + */ + QUOTE_IMAGE_LEFT_DATAURI: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC', + /** + * Image data URI of an LTR closing double quote (same as RTL opening couble quote). + * @readonly + */ + QUOTE_IMAGE_RIGHT_DATAURI: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==', + /** + * Pixel width of QUOTE_IMAGE_LEFT_DATAURI and QUOTE_IMAGE_RIGHT_DATAURI. + * @readonly + */ + QUOTE_IMAGE_WIDTH: 12, + /** + * Pixel height of QUOTE_IMAGE_LEFT_DATAURI and QUOTE_IMAGE_RIGHT_DATAURI. + * @readonly + */ + QUOTE_IMAGE_HEIGHT: 12, + + /** + * Inserts appropriate quote images before and after the named field. + * @param {string} fieldName The name of the field to wrap with quotes. + */ + quoteField_: function(fieldName) { + for (var i = 0, input; input = this.inputList[i]; i++) { + for (var j = 0, field; field = input.fieldRow[j]; j++) { + if (fieldName == field.name) { + input.insertFieldAt(j, this.newQuote_(true)); + input.insertFieldAt(j + 2, this.newQuote_(false)); + return; + } + } + } + console.warn('field named "' + fieldName + '" not found in ' + this.toDevString()); + }, + + /** + * A helper function that generates a FieldImage of an opening or + * closing double quote. The selected quote will be adapted for RTL blocks. + * @param {boolean} open If the image should be open quote (“ in LTR). + * Otherwise, a closing quote is used (” in LTR). + * @returns {!Blockly.FieldImage} The new field. + */ + newQuote_: function(open) { + var isLeft = this.RTL? !open : open; + var dataUri = isLeft ? + this.QUOTE_IMAGE_LEFT_DATAURI : + this.QUOTE_IMAGE_RIGHT_DATAURI; + return new Blockly.FieldImage( + dataUri, + this.QUOTE_IMAGE_WIDTH, + this.QUOTE_IMAGE_HEIGHT, + isLeft ? '\u201C' : '\u201D'); + } +}; + diff --git a/src/opsoro/server/static/js/blockly/blocks/variables.js b/src/opsoro/server/static/js/blockly/blocks/variables.js new file mode 100644 index 0000000..07ae8e6 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/blocks/variables.js @@ -0,0 +1,127 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Variable blocks for Blockly. + + * This file is scraped to extract a .json file of block definitions. The array + * passed to defineBlocksWithJsonArray(..) must be strict JSON: double quotes + * only, no outside references, no functions, no trailing commas, etc. The one + * exception is end-of-line comments, which the scraper will remove. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Blocks.variables'); // Deprecated. +goog.provide('Blockly.Constants.Variables'); + +goog.require('Blockly.Blocks'); + + +/** + * Common HSV hue for all blocks in this category. + * Should be the same as Blockly.Msg.VARIABLES_HUE. + * @readonly + */ +Blockly.Constants.Variables.HUE = 330; +/** @deprecated Use Blockly.Constants.Variables.HUE */ +Blockly.Blocks.variables.HUE = Blockly.Constants.Variables.HUE; + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for variable getter. + { + "type": "variables_get", + "message0": "%1", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variable": "%{BKY_VARIABLES_DEFAULT_NAME}" + } + ], + "output": null, + "colour": "%{BKY_VARIABLES_HUE}", + "helpUrl": "%{BKY_VARIABLES_GET_HELPURL}", + "tooltip": "%{BKY_VARIABLES_GET_TOOLTIP}", + "extensions": ["contextMenu_variableSetterGetter"] + }, + // Block for variable setter. + { + "type": "variables_set", + "message0": "%{BKY_VARIABLES_SET}", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variable": "%{BKY_VARIABLES_DEFAULT_NAME}" + }, + { + "type": "input_value", + "name": "VALUE" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": "%{BKY_VARIABLES_HUE}", + "tooltip": "%{BKY_VARIABLES_SET_TOOLTIP}", + "helpUrl": "%{BKY_VARIABLES_SET_HELPURL}", + "extensions": ["contextMenu_variableSetterGetter"] + } +]); // END JSON EXTRACT (Do not delete this comment.) + +/** + * Mixin to add context menu items to create getter/setter blocks for this + * setter/getter. + * Used by blocks 'variables_set' and 'variables_get'. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Variables.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN = { + /** + * Add menu option to create getter/setter block for this setter/getter. + * @param {!Array} options List of menu options to add to. + * @this Blockly.Block + */ + customContextMenu: function(options) { + // Getter blocks have the option to create a setter block, and vice versa. + if (this.type == 'variables_get') { + var opposite_type = 'variables_set'; + var contextMenuMsg = Blockly.Msg.VARIABLES_GET_CREATE_SET; + } else { + var opposite_type = 'variables_get'; + var contextMenuMsg = Blockly.Msg.VARIABLES_SET_CREATE_GET; + } + + var option = {enabled: this.workspace.remainingCapacity() > 0}; + var name = this.getFieldValue('VAR'); + option.text = contextMenuMsg.replace('%1', name); + var xmlField = goog.dom.createDom('field', null, name); + xmlField.setAttribute('name', 'VAR'); + var xmlBlock = goog.dom.createDom('block', null, xmlField); + xmlBlock.setAttribute('type', opposite_type); + option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); + options.push(option); + } +}; + +Blockly.Extensions.registerMixin('contextMenu_variableSetterGetter', + Blockly.Constants.Variables.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN); diff --git a/src/opsoro/server/static/js/blockly/blocks_compressed.js b/src/opsoro/server/static/js/blockly/blocks_compressed.js new file mode 100644 index 0000000..076eee7 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/blocks_compressed.js @@ -0,0 +1,157 @@ +// Do not edit this file; automatically generated by build.py. +'use strict'; + + +// Copyright 2012 Google Inc. Apache License 2.0 +Blockly.Blocks.lists={};Blockly.Constants={};Blockly.Constants.Lists={};Blockly.Constants.Lists.HUE=260;Blockly.Blocks.lists.HUE=Blockly.Constants.Lists.HUE; +Blockly.defineBlocksWithJsonArray([{type:"lists_create_empty",message0:"%{BKY_LISTS_CREATE_EMPTY_TITLE}",output:"Array",colour:"%{BKY_LISTS_HUE}",tooltip:"%{BKY_LISTS_CREATE_EMPTY_TOOLTIP}",helpUrl:"%{BKY_LISTS_CREATE_EMPTY_HELPURL}"},{type:"lists_repeat",message0:"%{BKY_LISTS_REPEAT_TITLE}",args0:[{type:"input_value",name:"ITEM"},{type:"input_value",name:"NUM",check:"Number"}],output:"Array",colour:"%{BKY_LISTS_HUE}",tooltip:"%{BKY_LISTS_REPEAT_TOOLTIP}",helpUrl:"%{BKY_LISTS_REPEAT_HELPURL}"},{type:"lists_reverse", +message0:"%{BKY_LISTS_REVERSE_MESSAGE0}",args0:[{type:"input_value",name:"LIST",check:"Array"}],output:"Array",inputsInline:!0,colour:"%{BKY_LISTS_HUE}",tooltip:"%{BKY_LISTS_REVERSE_TOOLTIP}",helpUrl:"%{BKY_LISTS_REVERSE_HELPURL}"},{type:"lists_isEmpty",message0:"%{BKY_LISTS_ISEMPTY_TITLE}",args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Boolean",colour:"%{BKY_LISTS_HUE}",tooltip:"%{BKY_LISTS_ISEMPTY_TOOLTIP}",helpUrl:"%{BKY_LISTS_ISEMPTY_HELPURL}"},{type:"lists_length", +message0:"%{BKY_LISTS_LENGTH_TITLE}",args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Number",colour:"%{BKY_LISTS_HUE}",tooltip:"%{BKY_LISTS_LENGTH_TOOLTIP}",helpUrl:"%{BKY_LISTS_LENGTH_HELPURL}"}]); +Blockly.Blocks.lists_create_with={init:function(){this.setHelpUrl(Blockly.Msg.LISTS_CREATE_WITH_HELPURL);this.setColour(Blockly.Blocks.lists.HUE);this.itemCount_=3;this.updateShape_();this.setOutput(!0,"Array");this.setMutator(new Blockly.Mutator(["lists_create_with_item"]));this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP)},mutationToDom:function(){var a=document.createElement("mutation");a.setAttribute("items",this.itemCount_);return a},domToMutation:function(a){this.itemCount_=parseInt(a.getAttribute("items"), +10);this.updateShape_()},decompose:function(a){var b=a.newBlock("lists_create_with_container");b.initSvg();for(var c=b.getInput("STACK").connection,d=0;d","GT"],["\u2265","GTE"]]},{type:"input_value",name:"B"}],inputsInline:!0,output:"Boolean",colour:"%{BKY_LOGIC_HUE}",helpUrl:"%{BKY_LOGIC_COMPARE_HELPURL}",extensions:["logic_compare", +"logic_op_tooltip"]},{type:"logic_operation",message0:"%1 %2 %3",args0:[{type:"input_value",name:"A",check:"Boolean"},{type:"field_dropdown",name:"OP",options:[["%{BKY_LOGIC_OPERATION_AND}","AND"],["%{BKY_LOGIC_OPERATION_OR}","OR"]]},{type:"input_value",name:"B",check:"Boolean"}],inputsInline:!0,output:"Boolean",colour:"%{BKY_LOGIC_HUE}",helpUrl:"%{BKY_LOGIC_OPERATION_HELPURL}",extensions:["logic_op_tooltip"]},{type:"logic_negate",message0:"%{BKY_LOGIC_NEGATE_TITLE}",args0:[{type:"input_value",name:"BOOL", +check:"Boolean"}],output:"Boolean",colour:"%{BKY_LOGIC_HUE}",tooltip:"%{BKY_LOGIC_NEGATE_TOOLTIP}",helpUrl:"%{BKY_LOGIC_NEGATE_HELPURL}"},{type:"logic_null",message0:"%{BKY_LOGIC_NULL}",output:null,colour:"%{BKY_LOGIC_HUE}",tooltip:"%{BKY_LOGIC_NULL_TOOLTIP}",helpUrl:"%{BKY_LOGIC_NULL_HELPURL}"},{type:"logic_ternary",message0:"%{BKY_LOGIC_TERNARY_CONDITION} %1",args0:[{type:"input_value",name:"IF",check:"Boolean"}],message1:"%{BKY_LOGIC_TERNARY_IF_TRUE} %1",args1:[{type:"input_value",name:"THEN"}], +message2:"%{BKY_LOGIC_TERNARY_IF_FALSE} %1",args2:[{type:"input_value",name:"ELSE"}],output:null,colour:"%{BKY_LOGIC_HUE}",tooltip:"%{BKY_LOGIC_TERNARY_TOOLTIP}",helpUrl:"%{BKY_LOGIC_TERNARY_HELPURL}",extensions:["logic_ternary"]}]); +Blockly.defineBlocksWithJsonArray([{type:"controls_if_if",message0:"%{BKY_CONTROLS_IF_IF_TITLE_IF}",nextStatement:null,enableContextMenu:!1,colour:"%{BKY_LOGIC_HUE}",tooltip:"%{BKY_CONTROLS_IF_IF_TOOLTIP}"},{type:"controls_if_elseif",message0:"%{BKY_CONTROLS_IF_ELSEIF_TITLE_ELSEIF}",previousStatement:null,nextStatement:null,enableContextMenu:!1,colour:"%{BKY_LOGIC_HUE}",tooltip:"%{BKY_CONTROLS_IF_ELSEIF_TOOLTIP}"},{type:"controls_if_else",message0:"%{BKY_CONTROLS_IF_ELSE_TITLE_ELSE}",previousStatement:null, +enableContextMenu:!1,colour:"%{BKY_LOGIC_HUE}",tooltip:"%{BKY_CONTROLS_IF_ELSE_TOOLTIP}"}]);Blockly.Constants.Logic.TOOLTIPS_BY_OP={EQ:"%{BKY_LOGIC_COMPARE_TOOLTIP_EQ}",NEQ:"%{BKY_LOGIC_COMPARE_TOOLTIP_NEQ}",LT:"%{BKY_LOGIC_COMPARE_TOOLTIP_LT}",LTE:"%{BKY_LOGIC_COMPARE_TOOLTIP_LTE}",GT:"%{BKY_LOGIC_COMPARE_TOOLTIP_GT}",GTE:"%{BKY_LOGIC_COMPARE_TOOLTIP_GTE}",AND:"%{BKY_LOGIC_OPERATION_TOOLTIP_AND}",OR:"%{BKY_LOGIC_OPERATION_TOOLTIP_OR}"}; +Blockly.Extensions.register("logic_op_tooltip",Blockly.Extensions.buildTooltipForDropdown("OP",Blockly.Constants.Logic.TOOLTIPS_BY_OP)); +Blockly.Constants.Logic.CONTROLS_IF_MUTATOR_MIXIN={elseifCount_:0,elseCount_:0,mutationToDom:function(){if(!this.elseifCount_&&!this.elseCount_)return null;var a=document.createElement("mutation");this.elseifCount_&&a.setAttribute("elseif",this.elseifCount_);this.elseCount_&&a.setAttribute("else",1);return a},domToMutation:function(a){this.elseifCount_=parseInt(a.getAttribute("elseif"),10)||0;this.elseCount_=parseInt(a.getAttribute("else"),10)||0;this.updateShape_()},decompose:function(a){var b=a.newBlock("controls_if_if"); +b.initSvg();for(var c=b.nextConnection,d=1;d<=this.elseifCount_;d++){var e=a.newBlock("controls_if_elseif");e.initSvg();c.connect(e.previousConnection);c=e.nextConnection}this.elseCount_&&(a=a.newBlock("controls_if_else"),a.initSvg(),c.connect(a.previousConnection));return b},compose:function(a){var b=a.nextConnection.targetBlock();this.elseCount_=this.elseifCount_=0;a=[null];for(var c=[null],d=null;b;){switch(b.type){case "controls_if_elseif":this.elseifCount_++;a.push(b.valueConnection_);c.push(b.statementConnection_); +break;case "controls_if_else":this.elseCount_++;d=b.statementConnection_;break;default:throw"Unknown block type.";}b=b.nextConnection&&b.nextConnection.targetBlock()}this.updateShape_();for(b=1;b<=this.elseifCount_;b++)Blockly.Mutator.reconnect(a[b],this,"IF"+b),Blockly.Mutator.reconnect(c[b],this,"DO"+b);Blockly.Mutator.reconnect(d,this,"ELSE")},saveConnections:function(a){a=a.nextConnection.targetBlock();for(var b=1;a;){switch(a.type){case "controls_if_elseif":var c=this.getInput("IF"+b),d=this.getInput("DO"+ +b);a.valueConnection_=c&&c.connection.targetConnection;a.statementConnection_=d&&d.connection.targetConnection;b++;break;case "controls_if_else":d=this.getInput("ELSE");a.statementConnection_=d&&d.connection.targetConnection;break;default:throw"Unknown block type.";}a=a.nextConnection&&a.nextConnection.targetBlock()}},updateShape_:function(){this.getInput("ELSE")&&this.removeInput("ELSE");for(var a=1;this.getInput("IF"+a);)this.removeInput("IF"+a),this.removeInput("DO"+a),a++;for(a=1;a<=this.elseifCount_;a++)this.appendValueInput("IF"+ +a).setCheck("Boolean").appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF),this.appendStatementInput("DO"+a).appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN);this.elseCount_&&this.appendStatementInput("ELSE").appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE)}};Blockly.Extensions.registerMutator("controls_if_mutator",Blockly.Constants.Logic.CONTROLS_IF_MUTATOR_MIXIN,null,["controls_if_elseif","controls_if_else"]); +Blockly.Constants.Logic.CONTROLS_IF_TOOLTIP_EXTENSION=function(){this.setTooltip(function(){if(this.elseifCount_||this.elseCount_){if(!this.elseifCount_&&this.elseCount_)return Blockly.Msg.CONTROLS_IF_TOOLTIP_2;if(this.elseifCount_&&!this.elseCount_)return Blockly.Msg.CONTROLS_IF_TOOLTIP_3;if(this.elseifCount_&&this.elseCount_)return Blockly.Msg.CONTROLS_IF_TOOLTIP_4}else return Blockly.Msg.CONTROLS_IF_TOOLTIP_1;return""}.bind(this))};Blockly.Extensions.register("controls_if_tooltip",Blockly.Constants.Logic.CONTROLS_IF_TOOLTIP_EXTENSION); +Blockly.Constants.Logic.fixLogicCompareRtlOpLabels=function(){var a={LT:"\u200f<\u200f",LTE:"\u200f\u2264\u200f",GT:"\u200f>\u200f",GTE:"\u200f\u2265\u200f"},b=this.getField("OP");if(b)for(var b=b.getOptions(),c=0;ce;e++){var f=1==e?b:c;f&&!f.outputConnection.checkType_(d)&&(Blockly.Events.setGroup(a.group),d===this.prevParentConnection_?(this.unplug(),d.getSourceBlock().bumpNeighbours_()):(f.unplug(),f.bumpNeighbours_()),Blockly.Events.setGroup(!1))}this.prevParentConnection_= +d}};Blockly.Extensions.registerMixin("logic_ternary",Blockly.Constants.Logic.LOGIC_TERNARY_ONCHANGE_MIXIN); \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/core/block.js b/src/opsoro/server/static/js/blockly/core/block.js new file mode 100644 index 0000000..c42322e --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/block.js @@ -0,0 +1,1529 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2011 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview The class representing one block. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Block'); + +goog.require('Blockly.Blocks'); +goog.require('Blockly.Comment'); +goog.require('Blockly.Connection'); +goog.require('Blockly.Extensions'); +goog.require('Blockly.Input'); +goog.require('Blockly.Mutator'); +goog.require('Blockly.Warning'); +goog.require('Blockly.Workspace'); +goog.require('Blockly.Xml'); +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.math.Coordinate'); +goog.require('goog.string'); + + +/** + * Class for one block. + * Not normally called directly, workspace.newBlock() is preferred. + * @param {!Blockly.Workspace} workspace The block's workspace. + * @param {?string} prototypeName Name of the language object containing + * type-specific functions for this block. + * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise + * create a new id. + * @constructor + */ +Blockly.Block = function(workspace, prototypeName, opt_id) { + /** @type {string} */ + this.id = (opt_id && !workspace.getBlockById(opt_id)) ? + opt_id : Blockly.utils.genUid(); + workspace.blockDB_[this.id] = this; + /** @type {Blockly.Connection} */ + this.outputConnection = null; + /** @type {Blockly.Connection} */ + this.nextConnection = null; + /** @type {Blockly.Connection} */ + this.previousConnection = null; + /** @type {!Array.} */ + this.inputList = []; + /** @type {boolean|undefined} */ + this.inputsInline = undefined; + /** @type {boolean} */ + this.disabled = false; + /** @type {string|!Function} */ + this.tooltip = ''; + /** @type {boolean} */ + this.contextMenu = true; + + /** + * @type {Blockly.Block} + * @private + */ + this.parentBlock_ = null; + + /** + * @type {!Array.} + * @private + */ + this.childBlocks_ = []; + + /** + * @type {boolean} + * @private + */ + this.deletable_ = true; + + /** + * @type {boolean} + * @private + */ + this.movable_ = true; + + /** + * @type {boolean} + * @private + */ + this.editable_ = true; + + /** + * @type {boolean} + * @private + */ + this.isShadow_ = false; + + /** + * @type {boolean} + * @private + */ + this.collapsed_ = false; + + /** @type {string|Blockly.Comment} */ + this.comment = null; + + /** + * @type {!goog.math.Coordinate} + * @private + */ + this.xy_ = new goog.math.Coordinate(0, 0); + + /** @type {!Blockly.Workspace} */ + this.workspace = workspace; + /** @type {boolean} */ + this.isInFlyout = workspace.isFlyout; + /** @type {boolean} */ + this.isInMutator = workspace.isMutator; + + /** @type {boolean} */ + this.RTL = workspace.RTL; + + // Copy the type-specific functions and data from the prototype. + if (prototypeName) { + /** @type {string} */ + this.type = prototypeName; + var prototype = Blockly.Blocks[prototypeName]; + goog.asserts.assertObject(prototype, + 'Error: Unknown block type "%s".', prototypeName); + goog.mixin(this, prototype); + } + + workspace.addTopBlock(this); + + // Call an initialization function, if it exists. + if (goog.isFunction(this.init)) { + this.init(); + } + // Record initial inline state. + /** @type {boolean|undefined} */ + this.inputsInlineDefault = this.inputsInline; + if (Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Create(this)); + } + // Bind an onchange function, if it exists. + if (goog.isFunction(this.onchange)) { + this.setOnChange(this.onchange); + } +}; + +/** + * Obtain a newly created block. + * @param {!Blockly.Workspace} workspace The block's workspace. + * @param {?string} prototypeName Name of the language object containing + * type-specific functions for this block. + * @return {!Blockly.Block} The created block. + * @deprecated December 2015 + */ +Blockly.Block.obtain = function(workspace, prototypeName) { + console.warn('Deprecated call to Blockly.Block.obtain, ' + + 'use workspace.newBlock instead.'); + return workspace.newBlock(prototypeName); +}; + +/** + * Optional text data that round-trips beween blocks and XML. + * Has no effect. May be used by 3rd parties for meta information. + * @type {?string} + */ +Blockly.Block.prototype.data = null; + +/** + * Colour of the block in '#RRGGBB' format. + * @type {string} + * @private + */ +Blockly.Block.prototype.colour_ = '#000000'; + +/** + * Dispose of this block. + * @param {boolean} healStack If true, then try to heal any gap by connecting + * the next statement with the previous statement. Otherwise, dispose of + * all children of this block. + */ +Blockly.Block.prototype.dispose = function(healStack) { + if (!this.workspace) { + // Already deleted. + return; + } + // Terminate onchange event calls. + if (this.onchangeWrapper_) { + this.workspace.removeChangeListener(this.onchangeWrapper_); + } + this.unplug(healStack); + if (Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Delete(this)); + } + Blockly.Events.disable(); + + try { + // This block is now at the top of the workspace. + // Remove this block from the workspace's list of top-most blocks. + if (this.workspace) { + this.workspace.removeTopBlock(this); + // Remove from block database. + delete this.workspace.blockDB_[this.id]; + this.workspace = null; + } + + // Just deleting this block from the DOM would result in a memory leak as + // well as corruption of the connection database. Therefore we must + // methodically step through the blocks and carefully disassemble them. + + // First, dispose of all my children. + for (var i = this.childBlocks_.length - 1; i >= 0; i--) { + this.childBlocks_[i].dispose(false); + } + // Then dispose of myself. + // Dispose of all inputs and their fields. + for (var i = 0, input; input = this.inputList[i]; i++) { + input.dispose(); + } + this.inputList.length = 0; + // Dispose of any remaining connections (next/previous/output). + var connections = this.getConnections_(true); + for (var i = 0; i < connections.length; i++) { + var connection = connections[i]; + if (connection.isConnected()) { + connection.disconnect(); + } + connections[i].dispose(); + } + } finally { + Blockly.Events.enable(); + } +}; + +/** + * Unplug this block from its superior block. If this block is a statement, + * optionally reconnect the block underneath with the block on top. + * @param {boolean} opt_healStack Disconnect child statement and reconnect + * stack. Defaults to false. + */ +Blockly.Block.prototype.unplug = function(opt_healStack) { + if (this.outputConnection) { + if (this.outputConnection.isConnected()) { + // Disconnect from any superior block. + this.outputConnection.disconnect(); + } + } else if (this.previousConnection) { + var previousTarget = null; + if (this.previousConnection.isConnected()) { + // Remember the connection that any next statements need to connect to. + previousTarget = this.previousConnection.targetConnection; + // Detach this block from the parent's tree. + this.previousConnection.disconnect(); + } + var nextBlock = this.getNextBlock(); + if (opt_healStack && nextBlock) { + // Disconnect the next statement. + var nextTarget = this.nextConnection.targetConnection; + nextTarget.disconnect(); + if (previousTarget && previousTarget.checkType_(nextTarget)) { + // Attach the next statement to the previous statement. + previousTarget.connect(nextTarget); + } + } + } +}; + +/** + * Returns all connections originating from this block. + * @return {!Array.} Array of connections. + * @private + */ +Blockly.Block.prototype.getConnections_ = function() { + var myConnections = []; + if (this.outputConnection) { + myConnections.push(this.outputConnection); + } + if (this.previousConnection) { + myConnections.push(this.previousConnection); + } + if (this.nextConnection) { + myConnections.push(this.nextConnection); + } + for (var i = 0, input; input = this.inputList[i]; i++) { + if (input.connection) { + myConnections.push(input.connection); + } + } + return myConnections; +}; + +/** + * Walks down a stack of blocks and finds the last next connection on the stack. + * @return {Blockly.Connection} The last next connection on the stack, or null. + * @private + */ +Blockly.Block.prototype.lastConnectionInStack_ = function() { + var nextConnection = this.nextConnection; + while (nextConnection) { + var nextBlock = nextConnection.targetBlock(); + if (!nextBlock) { + // Found a next connection with nothing on the other side. + return nextConnection; + } + nextConnection = nextBlock.nextConnection; + } + // Ran out of next connections. + return null; +}; + +/** + * Bump unconnected blocks out of alignment. Two blocks which aren't actually + * connected should not coincidentally line up on screen. + * @private + */ +// TODO: Refactor to return early in headless mode. +Blockly.Block.prototype.bumpNeighbours_ = function() { + if (!this.workspace) { + return; // Deleted block. + } + if (Blockly.dragMode_ != Blockly.DRAG_NONE) { + return; // Don't bump blocks during a drag. + } + var rootBlock = this.getRootBlock(); + if (rootBlock.isInFlyout) { + return; // Don't move blocks around in a flyout. + } + // Loop through every connection on this block. + var myConnections = this.getConnections_(false); + for (var i = 0, connection; connection = myConnections[i]; i++) { + // Spider down from this block bumping all sub-blocks. + if (connection.isConnected() && connection.isSuperior()) { + connection.targetBlock().bumpNeighbours_(); + } + + var neighbours = connection.neighbours_(Blockly.SNAP_RADIUS); + for (var j = 0, otherConnection; otherConnection = neighbours[j]; j++) { + // If both connections are connected, that's probably fine. But if + // either one of them is unconnected, then there could be confusion. + if (!connection.isConnected() || !otherConnection.isConnected()) { + // Only bump blocks if they are from different tree structures. + if (otherConnection.getSourceBlock().getRootBlock() != rootBlock) { + // Always bump the inferior block. + if (connection.isSuperior()) { + otherConnection.bumpAwayFrom_(connection); + } else { + connection.bumpAwayFrom_(otherConnection); + } + } + } + } + } +}; + +/** + * Return the parent block or null if this block is at the top level. + * @return {Blockly.Block} The block that holds the current block. + */ +Blockly.Block.prototype.getParent = function() { + // Look at the DOM to see if we are nested in another block. + return this.parentBlock_; +}; + +/** + * Return the input that connects to the specified block. + * @param {!Blockly.Block} block A block connected to an input on this block. + * @return {Blockly.Input} The input that connects to the specified block. + */ +Blockly.Block.prototype.getInputWithBlock = function(block) { + for (var i = 0, input; input = this.inputList[i]; i++) { + if (input.connection && input.connection.targetBlock() == block) { + return input; + } + } + return null; +}; + +/** + * Return the parent block that surrounds the current block, or null if this + * block has no surrounding block. A parent block might just be the previous + * statement, whereas the surrounding block is an if statement, while loop, etc. + * @return {Blockly.Block} The block that surrounds the current block. + */ +Blockly.Block.prototype.getSurroundParent = function() { + var block = this; + do { + var prevBlock = block; + block = block.getParent(); + if (!block) { + // Ran off the top. + return null; + } + } while (block.getNextBlock() == prevBlock); + // This block is an enclosing parent, not just a statement in a stack. + return block; +}; + +/** + * Return the next statement block directly connected to this block. + * @return {Blockly.Block} The next statement block or null. + */ +Blockly.Block.prototype.getNextBlock = function() { + return this.nextConnection && this.nextConnection.targetBlock(); +}; + +/** + * Return the top-most block in this block's tree. + * This will return itself if this block is at the top level. + * @return {!Blockly.Block} The root block. + */ +Blockly.Block.prototype.getRootBlock = function() { + var rootBlock; + var block = this; + do { + rootBlock = block; + block = rootBlock.parentBlock_; + } while (block); + return rootBlock; +}; + +/** + * Find all the blocks that are directly nested inside this one. + * Includes value and block inputs, as well as any following statement. + * Excludes any connection on an output tab or any preceding statement. + * @return {!Array.} Array of blocks. + */ +Blockly.Block.prototype.getChildren = function() { + return this.childBlocks_; +}; + +/** + * Set parent of this block to be a new block or null. + * @param {Blockly.Block} newParent New parent block. + */ +Blockly.Block.prototype.setParent = function(newParent) { + if (newParent == this.parentBlock_) { + return; + } + if (this.parentBlock_) { + // Remove this block from the old parent's child list. + goog.array.remove(this.parentBlock_.childBlocks_, this); + + // Disconnect from superior blocks. + if (this.previousConnection && this.previousConnection.isConnected()) { + throw 'Still connected to previous block.'; + } + if (this.outputConnection && this.outputConnection.isConnected()) { + throw 'Still connected to parent block.'; + } + this.parentBlock_ = null; + // This block hasn't actually moved on-screen, so there's no need to update + // its connection locations. + } else { + // Remove this block from the workspace's list of top-most blocks. + this.workspace.removeTopBlock(this); + } + + this.parentBlock_ = newParent; + if (newParent) { + // Add this block to the new parent's child list. + newParent.childBlocks_.push(this); + } else { + this.workspace.addTopBlock(this); + } +}; + +/** + * Find all the blocks that are directly or indirectly nested inside this one. + * Includes this block in the list. + * Includes value and block inputs, as well as any following statements. + * Excludes any connection on an output tab or any preceding statements. + * @return {!Array.} Flattened array of blocks. + */ +Blockly.Block.prototype.getDescendants = function() { + var blocks = [this]; + for (var child, x = 0; child = this.childBlocks_[x]; x++) { + blocks.push.apply(blocks, child.getDescendants()); + } + return blocks; +}; + +/** + * Get whether this block is deletable or not. + * @return {boolean} True if deletable. + */ +Blockly.Block.prototype.isDeletable = function() { + return this.deletable_ && !this.isShadow_ && + !(this.workspace && this.workspace.options.readOnly); +}; + +/** + * Set whether this block is deletable or not. + * @param {boolean} deletable True if deletable. + */ +Blockly.Block.prototype.setDeletable = function(deletable) { + this.deletable_ = deletable; +}; + +/** + * Get whether this block is movable or not. + * @return {boolean} True if movable. + */ +Blockly.Block.prototype.isMovable = function() { + return this.movable_ && !this.isShadow_ && + !(this.workspace && this.workspace.options.readOnly); +}; + +/** + * Set whether this block is movable or not. + * @param {boolean} movable True if movable. + */ +Blockly.Block.prototype.setMovable = function(movable) { + this.movable_ = movable; +}; + +/** + * Get whether this block is a shadow block or not. + * @return {boolean} True if a shadow. + */ +Blockly.Block.prototype.isShadow = function() { + return this.isShadow_; +}; + +/** + * Set whether this block is a shadow block or not. + * @param {boolean} shadow True if a shadow. + */ +Blockly.Block.prototype.setShadow = function(shadow) { + this.isShadow_ = shadow; +}; + +/** + * Get whether this block is editable or not. + * @return {boolean} True if editable. + */ +Blockly.Block.prototype.isEditable = function() { + return this.editable_ && !(this.workspace && this.workspace.options.readOnly); +}; + +/** + * Set whether this block is editable or not. + * @param {boolean} editable True if editable. + */ +Blockly.Block.prototype.setEditable = function(editable) { + this.editable_ = editable; + for (var i = 0, input; input = this.inputList[i]; i++) { + for (var j = 0, field; field = input.fieldRow[j]; j++) { + field.updateEditable(); + } + } +}; + +/** + * Set whether the connections are hidden (not tracked in a database) or not. + * Recursively walk down all child blocks (except collapsed blocks). + * @param {boolean} hidden True if connections are hidden. + */ +Blockly.Block.prototype.setConnectionsHidden = function(hidden) { + if (!hidden && this.isCollapsed()) { + if (this.outputConnection) { + this.outputConnection.setHidden(hidden); + } + if (this.previousConnection) { + this.previousConnection.setHidden(hidden); + } + if (this.nextConnection) { + this.nextConnection.setHidden(hidden); + var child = this.nextConnection.targetBlock(); + if (child) { + child.setConnectionsHidden(hidden); + } + } + } else { + var myConnections = this.getConnections_(true); + for (var i = 0, connection; connection = myConnections[i]; i++) { + connection.setHidden(hidden); + if (connection.isSuperior()) { + var child = connection.targetBlock(); + if (child) { + child.setConnectionsHidden(hidden); + } + } + } + } +}; + +/** + * Set the URL of this block's help page. + * @param {string|Function} url URL string for block help, or function that + * returns a URL. Null for no help. + */ +Blockly.Block.prototype.setHelpUrl = function(url) { + this.helpUrl = url; +}; + +/** + * Change the tooltip text for a block. + * @param {string|!Function} newTip Text for tooltip or a parent element to + * link to for its tooltip. May be a function that returns a string. + */ +Blockly.Block.prototype.setTooltip = function(newTip) { + this.tooltip = newTip; +}; + +/** + * Get the colour of a block. + * @return {string} #RRGGBB string. + */ +Blockly.Block.prototype.getColour = function() { + return this.colour_; +}; + +/** + * Change the colour of a block. + * @param {number|string} colour HSV hue value, or #RRGGBB string. + */ +Blockly.Block.prototype.setColour = function(colour) { + var hue = Number(colour); + if (!isNaN(hue)) { + this.colour_ = Blockly.hueToRgb(hue); + } else if (goog.isString(colour) && colour.match(/^#[0-9a-fA-F]{6}$/)) { + this.colour_ = colour; + } else { + throw 'Invalid colour: ' + colour; + } +}; + +/** + * Sets a callback function to use whenever the block's parent workspace + * changes, replacing any prior onchange handler. This is usually only called + * from the constructor, the block type initializer function, or an extension + * initializer function. + * @param {function(Blockly.Events.Abstract)} onchangeFn The callback to call + * when the block's workspace changes. + * @throws {Error} if onchangeFn is not falsey or a function. + */ +Blockly.Block.prototype.setOnChange = function(onchangeFn) { + if (onchangeFn && !goog.isFunction(onchangeFn)) { + throw new Error("onchange must be a function."); + } + if (this.onchangeWrapper_) { + this.workspace.removeChangeListener(this.onchangeWrapper_); + } + this.onchange = onchangeFn; + if (this.onchange) { + this.onchangeWrapper_ = onchangeFn.bind(this); + this.workspace.addChangeListener(this.onchangeWrapper_); + } +}; + +/** + * Returns the named field from a block. + * @param {string} name The name of the field. + * @return {Blockly.Field} Named field, or null if field does not exist. + */ +Blockly.Block.prototype.getField = function(name) { + for (var i = 0, input; input = this.inputList[i]; i++) { + for (var j = 0, field; field = input.fieldRow[j]; j++) { + if (field.name === name) { + return field; + } + } + } + return null; +}; + +/** + * Return all variables referenced by this block. + * @return {!Array.} List of variable names. + */ +Blockly.Block.prototype.getVars = function() { + var vars = []; + for (var i = 0, input; input = this.inputList[i]; i++) { + for (var j = 0, field; field = input.fieldRow[j]; j++) { + if (field instanceof Blockly.FieldVariable) { + vars.push(field.getValue()); + } + } + } + return vars; +}; + +/** + * Notification that a variable is renaming. + * If the name matches one of this block's variables, rename it. + * @param {string} oldName Previous name of variable. + * @param {string} newName Renamed variable. + */ +Blockly.Block.prototype.renameVar = function(oldName, newName) { + for (var i = 0, input; input = this.inputList[i]; i++) { + for (var j = 0, field; field = input.fieldRow[j]; j++) { + if (field instanceof Blockly.FieldVariable && + Blockly.Names.equals(oldName, field.getValue())) { + field.setValue(newName); + } + } + } +}; + +/** + * Returns the language-neutral value from the field of a block. + * @param {string} name The name of the field. + * @return {?string} Value from the field or null if field does not exist. + */ +Blockly.Block.prototype.getFieldValue = function(name) { + var field = this.getField(name); + if (field) { + return field.getValue(); + } + return null; +}; + +/** + * Change the field value for a block (e.g. 'CHOOSE' or 'REMOVE'). + * @param {string} newValue Value to be the new field. + * @param {string} name The name of the field. + */ +Blockly.Block.prototype.setFieldValue = function(newValue, name) { + var field = this.getField(name); + goog.asserts.assertObject(field, 'Field "%s" not found.', name); + field.setValue(newValue); +}; + +/** + * Set whether this block can chain onto the bottom of another block. + * @param {boolean} newBoolean True if there can be a previous statement. + * @param {string|Array.|null|undefined} opt_check Statement type or + * list of statement types. Null/undefined if any type could be connected. + */ +Blockly.Block.prototype.setPreviousStatement = function(newBoolean, opt_check) { + if (newBoolean) { + if (opt_check === undefined) { + opt_check = null; + } + if (!this.previousConnection) { + goog.asserts.assert(!this.outputConnection, + 'Remove output connection prior to adding previous connection.'); + this.previousConnection = + this.makeConnection_(Blockly.PREVIOUS_STATEMENT); + } + this.previousConnection.setCheck(opt_check); + } else { + if (this.previousConnection) { + goog.asserts.assert(!this.previousConnection.isConnected(), + 'Must disconnect previous statement before removing connection.'); + this.previousConnection.dispose(); + this.previousConnection = null; + } + } +}; + +/** + * Set whether another block can chain onto the bottom of this block. + * @param {boolean} newBoolean True if there can be a next statement. + * @param {string|Array.|null|undefined} opt_check Statement type or + * list of statement types. Null/undefined if any type could be connected. + */ +Blockly.Block.prototype.setNextStatement = function(newBoolean, opt_check) { + if (newBoolean) { + if (opt_check === undefined) { + opt_check = null; + } + if (!this.nextConnection) { + this.nextConnection = this.makeConnection_(Blockly.NEXT_STATEMENT); + } + this.nextConnection.setCheck(opt_check); + } else { + if (this.nextConnection) { + goog.asserts.assert(!this.nextConnection.isConnected(), + 'Must disconnect next statement before removing connection.'); + this.nextConnection.dispose(); + this.nextConnection = null; + } + } +}; + +/** + * Set whether this block returns a value. + * @param {boolean} newBoolean True if there is an output. + * @param {string|Array.|null|undefined} opt_check Returned type or list + * of returned types. Null or undefined if any type could be returned + * (e.g. variable get). + */ +Blockly.Block.prototype.setOutput = function(newBoolean, opt_check) { + if (newBoolean) { + if (opt_check === undefined) { + opt_check = null; + } + if (!this.outputConnection) { + goog.asserts.assert(!this.previousConnection, + 'Remove previous connection prior to adding output connection.'); + this.outputConnection = this.makeConnection_(Blockly.OUTPUT_VALUE); + } + this.outputConnection.setCheck(opt_check); + } else { + if (this.outputConnection) { + goog.asserts.assert(!this.outputConnection.isConnected(), + 'Must disconnect output value before removing connection.'); + this.outputConnection.dispose(); + this.outputConnection = null; + } + } +}; + +/** + * Set whether value inputs are arranged horizontally or vertically. + * @param {boolean} newBoolean True if inputs are horizontal. + */ +Blockly.Block.prototype.setInputsInline = function(newBoolean) { + if (this.inputsInline != newBoolean) { + Blockly.Events.fire(new Blockly.Events.Change( + this, 'inline', null, this.inputsInline, newBoolean)); + this.inputsInline = newBoolean; + } +}; + +/** + * Get whether value inputs are arranged horizontally or vertically. + * @return {boolean} True if inputs are horizontal. + */ +Blockly.Block.prototype.getInputsInline = function() { + if (this.inputsInline != undefined) { + // Set explicitly. + return this.inputsInline; + } + // Not defined explicitly. Figure out what would look best. + for (var i = 1; i < this.inputList.length; i++) { + if (this.inputList[i - 1].type == Blockly.DUMMY_INPUT && + this.inputList[i].type == Blockly.DUMMY_INPUT) { + // Two dummy inputs in a row. Don't inline them. + return false; + } + } + for (var i = 1; i < this.inputList.length; i++) { + if (this.inputList[i - 1].type == Blockly.INPUT_VALUE && + this.inputList[i].type == Blockly.DUMMY_INPUT) { + // Dummy input after a value input. Inline them. + return true; + } + } + return false; +}; + +/** + * Set whether the block is disabled or not. + * @param {boolean} disabled True if disabled. + */ +Blockly.Block.prototype.setDisabled = function(disabled) { + if (this.disabled != disabled) { + Blockly.Events.fire(new Blockly.Events.Change( + this, 'disabled', null, this.disabled, disabled)); + this.disabled = disabled; + } +}; + +/** + * Get whether the block is disabled or not due to parents. + * The block's own disabled property is not considered. + * @return {boolean} True if disabled. + */ +Blockly.Block.prototype.getInheritedDisabled = function() { + var ancestor = this.getSurroundParent(); + while (ancestor) { + if (ancestor.disabled) { + return true; + } + ancestor = ancestor.getSurroundParent(); + } + // Ran off the top. + return false; +}; + +/** + * Get whether the block is collapsed or not. + * @return {boolean} True if collapsed. + */ +Blockly.Block.prototype.isCollapsed = function() { + return this.collapsed_; +}; + +/** + * Set whether the block is collapsed or not. + * @param {boolean} collapsed True if collapsed. + */ +Blockly.Block.prototype.setCollapsed = function(collapsed) { + if (this.collapsed_ != collapsed) { + Blockly.Events.fire(new Blockly.Events.Change( + this, 'collapsed', null, this.collapsed_, collapsed)); + this.collapsed_ = collapsed; + } +}; + +/** + * Create a human-readable text representation of this block and any children. + * @param {number=} opt_maxLength Truncate the string to this length. + * @param {string=} opt_emptyToken The placeholder string used to denote an + * empty field. If not specified, '?' is used. + * @return {string} Text of block. + */ +Blockly.Block.prototype.toString = function(opt_maxLength, opt_emptyToken) { + var text = []; + var emptyFieldPlaceholder = opt_emptyToken || '?'; + if (this.collapsed_) { + text.push(this.getInput('_TEMP_COLLAPSED_INPUT').fieldRow[0].text_); + } else { + for (var i = 0, input; input = this.inputList[i]; i++) { + for (var j = 0, field; field = input.fieldRow[j]; j++) { + if (field instanceof Blockly.FieldDropdown && !field.getValue()) { + text.push(emptyFieldPlaceholder); + } else { + text.push(field.getText()); + } + } + if (input.connection) { + var child = input.connection.targetBlock(); + if (child) { + text.push(child.toString(undefined, opt_emptyToken)); + } else { + text.push(emptyFieldPlaceholder); + } + } + } + } + text = goog.string.trim(text.join(' ')) || '???'; + if (opt_maxLength) { + // TODO: Improve truncation so that text from this block is given priority. + // E.g. "1+2+3+4+5+6+7+8+9=0" should be "...6+7+8+9=0", not "1+2+3+4+5...". + // E.g. "1+2+3+4+5=6+7+8+9+0" should be "...4+5=6+7...". + text = goog.string.truncate(text, opt_maxLength); + } + return text; +}; + +/** + * Shortcut for appending a value input row. + * @param {string} name Language-neutral identifier which may used to find this + * input again. Should be unique to this block. + * @return {!Blockly.Input} The input object created. + */ +Blockly.Block.prototype.appendValueInput = function(name) { + return this.appendInput_(Blockly.INPUT_VALUE, name); +}; + +/** + * Shortcut for appending a statement input row. + * @param {string} name Language-neutral identifier which may used to find this + * input again. Should be unique to this block. + * @return {!Blockly.Input} The input object created. + */ +Blockly.Block.prototype.appendStatementInput = function(name) { + return this.appendInput_(Blockly.NEXT_STATEMENT, name); +}; + +/** + * Shortcut for appending a dummy input row. + * @param {string=} opt_name Language-neutral identifier which may used to find + * this input again. Should be unique to this block. + * @return {!Blockly.Input} The input object created. + */ +Blockly.Block.prototype.appendDummyInput = function(opt_name) { + return this.appendInput_(Blockly.DUMMY_INPUT, opt_name || ''); +}; + +/** + * Initialize this block using a cross-platform, internationalization-friendly + * JSON description. + * @param {!Object} json Structured data describing the block. + */ +Blockly.Block.prototype.jsonInit = function(json) { + + // Validate inputs. + goog.asserts.assert(json['output'] == undefined || + json['previousStatement'] == undefined, + 'Must not have both an output and a previousStatement.'); + + // Set basic properties of block. + if (json['colour'] !== undefined) { + var rawValue = json['colour']; + var colour = goog.isString(rawValue) ? + Blockly.utils.replaceMessageReferences(rawValue) : rawValue; + this.setColour(colour); + } + + // Interpolate the message blocks. + var i = 0; + while (json['message' + i] !== undefined) { + this.interpolate_(json['message' + i], json['args' + i] || [], + json['lastDummyAlign' + i]); + i++; + } + + if (json['inputsInline'] !== undefined) { + this.setInputsInline(json['inputsInline']); + } + // Set output and previous/next connections. + if (json['output'] !== undefined) { + this.setOutput(true, json['output']); + } + if (json['previousStatement'] !== undefined) { + this.setPreviousStatement(true, json['previousStatement']); + } + if (json['nextStatement'] !== undefined) { + this.setNextStatement(true, json['nextStatement']); + } + if (json['tooltip'] !== undefined) { + var rawValue = json['tooltip']; + var localizedText = Blockly.utils.replaceMessageReferences(rawValue); + this.setTooltip(localizedText); + } + if (json['enableContextMenu'] !== undefined) { + var rawValue = json['enableContextMenu']; + this.contextMenu = !!rawValue; + } + if (json['helpUrl'] !== undefined) { + var rawValue = json['helpUrl']; + var localizedValue = Blockly.utils.replaceMessageReferences(rawValue); + this.setHelpUrl(localizedValue); + } + if (goog.isString(json['extensions'])) { + console.warn('JSON attribute \'extensions\' should be an array of ' + + 'strings. Found raw string in JSON for \'' + json['type'] + '\' block.'); + json['extensions'] = [json['extensions']]; // Correct and continue. + } + + // Add the mutator to the block + if (json['mutator'] !== undefined) { + Blockly.Extensions.apply(json['mutator'], this, true); + } + + if (Array.isArray(json['extensions'])) { + var extensionNames = json['extensions']; + for (var i = 0; i < extensionNames.length; ++i) { + var extensionName = extensionNames[i]; + Blockly.Extensions.apply(extensionName, this, false); + } + } +}; + +/** + * Add key/values from mixinObj to this block object. By default, this method + * will check that the keys in mixinObj will not overwrite existing values in + * the block, including prototype values. This provides some insurance against + * mixin / extension incompatibilities with future block features. This check + * can be disabled by passing true as the second argument. + * @param {!Object} mixinObj The key/values pairs to add to this block object. + * @param {boolean=} opt_disableCheck Option flag to disable overwrite checks. + */ +Blockly.Block.prototype.mixin = function(mixinObj, opt_disableCheck) { + if (goog.isDef(opt_disableCheck) && !goog.isBoolean(opt_disableCheck)) { + throw new Error("opt_disableCheck must be a boolean if provided"); + } + if (!opt_disableCheck) { + var overwrites = []; + for (var key in mixinObj) { + if (this[key] !== undefined) { + overwrites.push(key); + } + } + if (overwrites.length) { + throw new Error('Mixin will overwrite block members: ' + + JSON.stringify(overwrites)); + } + } + goog.mixin(this, mixinObj); +}; + +/** + * Interpolate a message description onto the block. + * @param {string} message Text contains interpolation tokens (%1, %2, ...) + * that match with fields or inputs defined in the args array. + * @param {!Array} args Array of arguments to be interpolated. + * @param {string=} lastDummyAlign If a dummy input is added at the end, + * how should it be aligned? + * @private + */ +Blockly.Block.prototype.interpolate_ = function(message, args, lastDummyAlign) { + var tokens = Blockly.utils.tokenizeInterpolation(message); + // Interpolate the arguments. Build a list of elements. + var indexDup = []; + var indexCount = 0; + var elements = []; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (typeof token == 'number') { + goog.asserts.assert(token > 0 && token <= args.length, + 'Message index %%s out of range.', token); + goog.asserts.assert(!indexDup[token], + 'Message index %%s duplicated.', token); + indexDup[token] = true; + indexCount++; + elements.push(args[token - 1]); + } else { + token = token.trim(); + if (token) { + elements.push(token); + } + } + } + goog.asserts.assert(indexCount == args.length, + 'block "%s": Message does not reference all %s arg(s).', this.type, args.length); + // Add last dummy input if needed. + if (elements.length && (typeof elements[elements.length - 1] == 'string' || + goog.string.startsWith(elements[elements.length - 1]['type'], + 'field_'))) { + var dummyInput = {type: 'input_dummy'}; + if (lastDummyAlign) { + dummyInput['align'] = lastDummyAlign; + } + elements.push(dummyInput); + } + // Lookup of alignment constants. + var alignmentLookup = { + 'LEFT': Blockly.ALIGN_LEFT, + 'RIGHT': Blockly.ALIGN_RIGHT, + 'CENTRE': Blockly.ALIGN_CENTRE + }; + // Populate block with inputs and fields. + var fieldStack = []; + for (var i = 0; i < elements.length; i++) { + var element = elements[i]; + if (typeof element == 'string') { + fieldStack.push([element, undefined]); + } else { + var field = null; + var input = null; + do { + var altRepeat = false; + if (typeof element == 'string') { + field = new Blockly.FieldLabel(element); + } else { + switch (element['type']) { + case 'input_value': + input = this.appendValueInput(element['name']); + break; + case 'input_statement': + input = this.appendStatementInput(element['name']); + break; + case 'input_dummy': + input = this.appendDummyInput(element['name']); + break; + case 'field_label': + field = Blockly.Block.newFieldLabelFromJson_(element); + break; + case 'field_input': + field = Blockly.Block.newFieldTextInputFromJson_(element); + break; + case 'field_angle': + field = new Blockly.FieldAngle(element['angle']); + break; + case 'field_checkbox': + field = new Blockly.FieldCheckbox( + element['checked'] ? 'TRUE' : 'FALSE'); + break; + case 'field_colour': + field = new Blockly.FieldColour(element['colour']); + break; + case 'field_variable': + field = Blockly.Block.newFieldVariableFromJson_(element); + break; + case 'field_dropdown': + field = new Blockly.FieldDropdown(element['options']); + break; + case 'field_image': + field = Blockly.Block.newFieldImageFromJson_(element); + break; + case 'field_number': + field = new Blockly.FieldNumber(element['value'], + element['min'], element['max'], element['precision']); + break; + case 'field_date': + if (Blockly.FieldDate) { + field = new Blockly.FieldDate(element['date']); + break; + } + // Fall through if FieldDate is not compiled in. + default: + // Unknown field. + if (element['alt']) { + element = element['alt']; + altRepeat = true; + } + } + } + } while (altRepeat); + if (field) { + fieldStack.push([field, element['name']]); + } else if (input) { + if (element['check']) { + input.setCheck(element['check']); + } + if (element['align']) { + input.setAlign(alignmentLookup[element['align']]); + } + for (var j = 0; j < fieldStack.length; j++) { + input.appendField(fieldStack[j][0], fieldStack[j][1]); + } + fieldStack.length = 0; + } + } + } +}; + +/** + * Helper function to construct a FieldImage from a JSON arg object, + * dereferencing any string table references. + * @param {!Object} options A JSON object with options (src, width, height, and alt). + * @returns {!Blockly.FieldImage} The new image. + * @private + */ +Blockly.Block.newFieldImageFromJson_ = function(options) { + var src = Blockly.utils.replaceMessageReferences(options['src']); + var width = Number(Blockly.utils.replaceMessageReferences(options['width'])); + var height = + Number(Blockly.utils.replaceMessageReferences(options['height'])); + var alt = Blockly.utils.replaceMessageReferences(options['alt']); + return new Blockly.FieldImage(src, width, height, alt); +}; + +/** + * Helper function to construct a FieldLabel from a JSON arg object, + * dereferencing any string table references. + * @param {!Object} options A JSON object with options (text, and class). + * @returns {!Blockly.FieldLabel} The new label. + * @private + */ +Blockly.Block.newFieldLabelFromJson_ = function(options) { + var text = Blockly.utils.replaceMessageReferences(options['text']); + return new Blockly.FieldLabel(text, options['class']); +}; + +/** + * Helper function to construct a FieldTextInput from a JSON arg object, + * dereferencing any string table references. + * @param {!Object} options A JSON object with options (text, class, and + * spellcheck). + * @returns {!Blockly.FieldTextInput} The new text input. + * @private + */ +Blockly.Block.newFieldTextInputFromJson_ = function(options) { + var text = Blockly.utils.replaceMessageReferences(options['text']); + var field = new Blockly.FieldTextInput(text, options['class']); + if (typeof options['spellcheck'] == 'boolean') { + field.setSpellcheck(options['spellcheck']); + } + return field; +}; + +/** + * Helper function to construct a FieldVariable from a JSON arg object, + * dereferencing any string table references. + * @param {!Object} options A JSON object with options (variable). + * @returns {!Blockly.FieldVariable} The variable field. + * @private + */ +Blockly.Block.newFieldVariableFromJson_ = function(options) { + var varname = Blockly.utils.replaceMessageReferences(options['variable']); + return new Blockly.FieldVariable(varname); +}; + + +/** + * Add a value input, statement input or local variable to this block. + * @param {number} type Either Blockly.INPUT_VALUE or Blockly.NEXT_STATEMENT or + * Blockly.DUMMY_INPUT. + * @param {string} name Language-neutral identifier which may used to find this + * input again. Should be unique to this block. + * @return {!Blockly.Input} The input object created. + * @private + */ +Blockly.Block.prototype.appendInput_ = function(type, name) { + var connection = null; + if (type == Blockly.INPUT_VALUE || type == Blockly.NEXT_STATEMENT) { + connection = this.makeConnection_(type); + } + var input = new Blockly.Input(type, name, this, connection); + // Append input to list. + this.inputList.push(input); + return input; +}; + +/** + * Move a named input to a different location on this block. + * @param {string} name The name of the input to move. + * @param {?string} refName Name of input that should be after the moved input, + * or null to be the input at the end. + */ +Blockly.Block.prototype.moveInputBefore = function(name, refName) { + if (name == refName) { + return; + } + // Find both inputs. + var inputIndex = -1; + var refIndex = refName ? -1 : this.inputList.length; + for (var i = 0, input; input = this.inputList[i]; i++) { + if (input.name == name) { + inputIndex = i; + if (refIndex != -1) { + break; + } + } else if (refName && input.name == refName) { + refIndex = i; + if (inputIndex != -1) { + break; + } + } + } + goog.asserts.assert(inputIndex != -1, 'Named input "%s" not found.', name); + goog.asserts.assert(refIndex != -1, 'Reference input "%s" not found.', + refName); + this.moveNumberedInputBefore(inputIndex, refIndex); +}; + +/** + * Move a numbered input to a different location on this block. + * @param {number} inputIndex Index of the input to move. + * @param {number} refIndex Index of input that should be after the moved input. + */ +Blockly.Block.prototype.moveNumberedInputBefore = function( + inputIndex, refIndex) { + // Validate arguments. + goog.asserts.assert(inputIndex != refIndex, 'Can\'t move input to itself.'); + goog.asserts.assert(inputIndex < this.inputList.length, + 'Input index ' + inputIndex + ' out of bounds.'); + goog.asserts.assert(refIndex <= this.inputList.length, + 'Reference input ' + refIndex + ' out of bounds.'); + // Remove input. + var input = this.inputList[inputIndex]; + this.inputList.splice(inputIndex, 1); + if (inputIndex < refIndex) { + refIndex--; + } + // Reinsert input. + this.inputList.splice(refIndex, 0, input); +}; + +/** + * Remove an input from this block. + * @param {string} name The name of the input. + * @param {boolean=} opt_quiet True to prevent error if input is not present. + * @throws {goog.asserts.AssertionError} if the input is not present and + * opt_quiet is not true. + */ +Blockly.Block.prototype.removeInput = function(name, opt_quiet) { + for (var i = 0, input; input = this.inputList[i]; i++) { + if (input.name == name) { + if (input.connection && input.connection.isConnected()) { + input.connection.setShadowDom(null); + var block = input.connection.targetBlock(); + if (block.isShadow()) { + // Destroy any attached shadow block. + block.dispose(); + } else { + // Disconnect any attached normal block. + block.unplug(); + } + } + input.dispose(); + this.inputList.splice(i, 1); + return; + } + } + if (!opt_quiet) { + goog.asserts.fail('Input "%s" not found.', name); + } +}; + +/** + * Fetches the named input object. + * @param {string} name The name of the input. + * @return {Blockly.Input} The input object, or null if input does not exist. + */ +Blockly.Block.prototype.getInput = function(name) { + for (var i = 0, input; input = this.inputList[i]; i++) { + if (input.name == name) { + return input; + } + } + // This input does not exist. + return null; +}; + +/** + * Fetches the block attached to the named input. + * @param {string} name The name of the input. + * @return {Blockly.Block} The attached value block, or null if the input is + * either disconnected or if the input does not exist. + */ +Blockly.Block.prototype.getInputTargetBlock = function(name) { + var input = this.getInput(name); + return input && input.connection && input.connection.targetBlock(); +}; + +/** + * Returns the comment on this block (or '' if none). + * @return {string} Block's comment. + */ +Blockly.Block.prototype.getCommentText = function() { + return this.comment || ''; +}; + +/** + * Set this block's comment text. + * @param {?string} text The text, or null to delete. + */ +Blockly.Block.prototype.setCommentText = function(text) { + if (this.comment != text) { + Blockly.Events.fire(new Blockly.Events.Change( + this, 'comment', null, this.comment, text || '')); + this.comment = text; + } +}; + +/** + * Set this block's warning text. + * @param {?string} text The text, or null to delete. + */ +Blockly.Block.prototype.setWarningText = function(/* text */) { + // NOP. +}; + +/** + * Give this block a mutator dialog. + * @param {Blockly.Mutator} mutator A mutator dialog instance or null to remove. + */ +Blockly.Block.prototype.setMutator = function(/* mutator */) { + // NOP. +}; + +/** + * Return the coordinates of the top-left corner of this block relative to the + * drawing surface's origin (0,0). + * @return {!goog.math.Coordinate} Object with .x and .y properties. + */ +Blockly.Block.prototype.getRelativeToSurfaceXY = function() { + return this.xy_; +}; + +/** + * Move a block by a relative offset. + * @param {number} dx Horizontal offset. + * @param {number} dy Vertical offset. + */ +Blockly.Block.prototype.moveBy = function(dx, dy) { + goog.asserts.assert(!this.parentBlock_, 'Block has parent.'); + var event = new Blockly.Events.Move(this); + this.xy_.translate(dx, dy); + event.recordNew(); + Blockly.Events.fire(event); +}; + +/** + * Create a connection of the specified type. + * @param {number} type The type of the connection to create. + * @return {!Blockly.Connection} A new connection of the specified type. + * @private + */ +Blockly.Block.prototype.makeConnection_ = function(type) { + return new Blockly.Connection(this, type); +}; + +/** + * Recursively checks whether all statement and value inputs are filled with + * blocks. Also checks all following statement blocks in this stack. + * @param {boolean=} opt_shadowBlocksAreFilled An optional argument controlling + * whether shadow blocks are counted as filled. Defaults to true. + * @return {boolean} True if all inputs are filled, false otherwise. + */ +Blockly.Block.prototype.allInputsFilled = function(opt_shadowBlocksAreFilled) { + // Account for the shadow block filledness toggle. + if (opt_shadowBlocksAreFilled === undefined) { + opt_shadowBlocksAreFilled = true; + } + if (!opt_shadowBlocksAreFilled && this.isShadow()) { + return false; + } + + // Recursively check each input block of the current block. + for (var i = 0, input; input = this.inputList[i]; i++) { + if (!input.connection) { + continue; + } + var target = input.connection.targetBlock(); + if (!target || !target.allInputsFilled(opt_shadowBlocksAreFilled)) { + return false; + } + } + + // Recursively check the next block after the current block. + var next = this.getNextBlock(); + if (next) { + return next.allInputsFilled(opt_shadowBlocksAreFilled); + } + + return true; +}; + +/** + * This method returns a string describing this Block in developer terms (type + * name and ID; English only). + * + * Intended to on be used in console logs and errors. If you need a string that + * uses the user's native language (including block text, field values, and + * child blocks), use [toString()]{@link Blockly.Block#toString}. + * @return {string} The description. + */ +Blockly.Block.prototype.toDevString = function() { + var msg = this.type ? '"' + this.type + '" block' : 'Block'; + if (this.id) { + msg += ' (id="' + this.id + '")'; + } + return msg; +}; diff --git a/src/opsoro/server/static/js/blockly/core/block_drag_surface.js b/src/opsoro/server/static/js/blockly/core/block_drag_surface.js new file mode 100644 index 0000000..942dfa3 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/block_drag_surface.js @@ -0,0 +1,191 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview A class that manages a surface for dragging blocks. When a + * block drag is started, we move the block (and children) to a separate dom + * element that we move around using translate3d. At the end of the drag, the + * blocks are put back in into the svg they came from. This helps performance by + * avoiding repainting the entire svg on every mouse move while dragging blocks. + * @author picklesrus + */ + +'use strict'; + +goog.provide('Blockly.BlockDragSurfaceSvg'); +goog.require('Blockly.utils'); +goog.require('goog.asserts'); +goog.require('goog.math.Coordinate'); + + +/** + * Class for a drag surface for the currently dragged block. This is a separate + * SVG that contains only the currently moving block, or nothing. + * @param {!Element} container Containing element. + * @constructor + */ +Blockly.BlockDragSurfaceSvg = function(container) { + /** + * @type {!Element} + * @private + */ + this.container_ = container; + this.createDom(); +}; + +/** + * The SVG drag surface. Set once by Blockly.BlockDragSurfaceSvg.createDom. + * @type {Element} + * @private + */ +Blockly.BlockDragSurfaceSvg.prototype.SVG_ = null; + +/** + * This is where blocks live while they are being dragged if the drag surface + * is enabled. + * @type {Element} + * @private + */ +Blockly.BlockDragSurfaceSvg.prototype.dragGroup_ = null; + +/** + * Containing HTML element; parent of the workspace and the drag surface. + * @type {Element} + * @private + */ +Blockly.BlockDragSurfaceSvg.prototype.container_ = null; + +/** + * Cached value for the scale of the drag surface. + * Used to set/get the correct translation during and after a drag. + * @type {number} + * @private + */ +Blockly.BlockDragSurfaceSvg.prototype.scale_ = 1; + +/** + * Create the drag surface and inject it into the container. + */ +Blockly.BlockDragSurfaceSvg.prototype.createDom = function() { + if (this.SVG_) { + return; // Already created. + } + this.SVG_ = Blockly.utils.createSvgElement('svg', { + 'xmlns': Blockly.SVG_NS, + 'xmlns:html': Blockly.HTML_NS, + 'xmlns:xlink': 'http://www.w3.org/1999/xlink', + 'version': '1.1', + 'class': 'blocklyBlockDragSurface' + }, this.container_); + this.dragGroup_ = Blockly.utils.createSvgElement('g', {}, this.SVG_); +}; + +/** + * Set the SVG blocks on the drag surface's group and show the surface. + * Only one block group should be on the drag surface at a time. + * @param {!Element} blocks Block or group of blocks to place on the drag + * surface. + */ +Blockly.BlockDragSurfaceSvg.prototype.setBlocksAndShow = function(blocks) { + goog.asserts.assert(this.dragGroup_.childNodes.length == 0, + 'Already dragging a block.'); + // appendChild removes the blocks from the previous parent + this.dragGroup_.appendChild(blocks); + this.SVG_.style.display = 'block'; +}; + +/** + * Translate and scale the entire drag surface group to keep in sync with the + * workspace. + * @param {number} x X translation + * @param {number} y Y translation + * @param {number} scale Scale of the group. + */ +Blockly.BlockDragSurfaceSvg.prototype.translateAndScaleGroup = function(x, y, scale) { + this.scale_ = scale; + // This is a work-around to prevent a the blocks from rendering + // fuzzy while they are being dragged on the drag surface. + x = x.toFixed(0); + y = y.toFixed(0); + this.dragGroup_.setAttribute('transform', 'translate('+ x + ','+ y + ')' + + ' scale(' + scale + ')'); +}; + +/** + * Translate the entire drag surface during a drag. + * We translate the drag surface instead of the blocks inside the surface + * so that the browser avoids repainting the SVG. + * Because of this, the drag coordinates must be adjusted by scale. + * @param {number} x X translation for the entire surface. + * @param {number} y Y translation for the entire surface. + */ +Blockly.BlockDragSurfaceSvg.prototype.translateSurface = function(x, y) { + x *= this.scale_; + y *= this.scale_; + // This is a work-around to prevent a the blocks from rendering + // fuzzy while they are being dragged on the drag surface. + x = x.toFixed(0); + y = y.toFixed(0); + this.SVG_.style.display = 'block'; + Blockly.utils.setCssTransform(this.SVG_, + 'translate3d(' + x + 'px, ' + y + 'px, 0px)'); +}; + +/** + * Reports the surface translation in scaled workspace coordinates. + * Use this when finishing a drag to return blocks to the correct position. + * @return {!goog.math.Coordinate} Current translation of the surface. + */ +Blockly.BlockDragSurfaceSvg.prototype.getSurfaceTranslation = function() { + var xy = Blockly.utils.getRelativeXY(this.SVG_); + return new goog.math.Coordinate(xy.x / this.scale_, xy.y / this.scale_); +}; + +/** + * Provide a reference to the drag group (primarily for + * BlockSvg.getRelativeToSurfaceXY). + * @return {Element} Drag surface group element. + */ +Blockly.BlockDragSurfaceSvg.prototype.getGroup = function() { + return this.dragGroup_; +}; + +/** + * Get the current blocks on the drag surface, if any (primarily + * for BlockSvg.getRelativeToSurfaceXY). + * @return {!Element|undefined} Drag surface block DOM element, or undefined + * if no blocks exist. + */ +Blockly.BlockDragSurfaceSvg.prototype.getCurrentBlock = function() { + return this.dragGroup_.firstChild; +}; + +/** + * Clear the group and hide the surface; move the blocks off onto the provided + * element. + * @param {!Element} newSurface Surface the dragging blocks should be moved to. + */ +Blockly.BlockDragSurfaceSvg.prototype.clearAndHide = function(newSurface) { + // appendChild removes the node from this.dragGroup_ + newSurface.appendChild(this.getCurrentBlock()); + this.SVG_.style.display = 'none'; + goog.asserts.assert(this.dragGroup_.childNodes.length == 0, + 'Drag group was not cleared.'); +}; diff --git a/src/opsoro/server/static/js/blockly/core/block_render_svg.js b/src/opsoro/server/static/js/blockly/core/block_render_svg.js new file mode 100644 index 0000000..adc3ca0 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/block_render_svg.js @@ -0,0 +1,978 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Methods for graphically rendering a block as SVG. + * @author fenichel@google.com (Rachel Fenichel) + */ + +'use strict'; + +goog.provide('Blockly.BlockSvg.render'); + +goog.require('Blockly.BlockSvg'); + +goog.require('goog.userAgent'); + + +// UI constants for rendering blocks. +/** + * Horizontal space between elements. + * @const + */ +Blockly.BlockSvg.SEP_SPACE_X = 10; +/** + * Vertical space between elements. + * @const + */ +Blockly.BlockSvg.SEP_SPACE_Y = 10; +/** + * Vertical padding around inline elements. + * @const + */ +Blockly.BlockSvg.INLINE_PADDING_Y = 5; +/** + * Minimum height of a block. + * @const + */ +Blockly.BlockSvg.MIN_BLOCK_Y = 25; +/** + * Height of horizontal puzzle tab. + * @const + */ +Blockly.BlockSvg.TAB_HEIGHT = 20; +/** + * Width of horizontal puzzle tab. + * @const + */ +Blockly.BlockSvg.TAB_WIDTH = 8; +/** + * Width of vertical tab (inc left margin). + * @const + */ +Blockly.BlockSvg.NOTCH_WIDTH = 30; +/** + * Rounded corner radius. + * @const + */ +Blockly.BlockSvg.CORNER_RADIUS = 8; +/** + * Do blocks with no previous or output connections have a 'hat' on top? + * @const + */ +Blockly.BlockSvg.START_HAT = false; +/** + * Height of the top hat. + * @const + */ +Blockly.BlockSvg.START_HAT_HEIGHT = 15; +/** + * Path of the top hat's curve. + * @const + */ +Blockly.BlockSvg.START_HAT_PATH = 'c 30,-' + + Blockly.BlockSvg.START_HAT_HEIGHT + ' 70,-' + + Blockly.BlockSvg.START_HAT_HEIGHT + ' 100,0'; +/** + * Path of the top hat's curve's highlight in LTR. + * @const + */ +Blockly.BlockSvg.START_HAT_HIGHLIGHT_LTR = + 'c 17.8,-9.2 45.3,-14.9 75,-8.7 M 100.5,0.5'; +/** + * Path of the top hat's curve's highlight in RTL. + * @const + */ +Blockly.BlockSvg.START_HAT_HIGHLIGHT_RTL = + 'm 25,-8.7 c 29.7,-6.2 57.2,-0.5 75,8.7'; +/** + * Distance from shape edge to intersect with a curved corner at 45 degrees. + * Applies to highlighting on around the inside of a curve. + * @const + */ +Blockly.BlockSvg.DISTANCE_45_INSIDE = (1 - Math.SQRT1_2) * + (Blockly.BlockSvg.CORNER_RADIUS - 0.5) + 0.5; +/** + * Distance from shape edge to intersect with a curved corner at 45 degrees. + * Applies to highlighting on around the outside of a curve. + * @const + */ +Blockly.BlockSvg.DISTANCE_45_OUTSIDE = (1 - Math.SQRT1_2) * + (Blockly.BlockSvg.CORNER_RADIUS + 0.5) - 0.5; +/** + * SVG path for drawing next/previous notch from left to right. + * @const + */ +Blockly.BlockSvg.NOTCH_PATH_LEFT = 'l 6,4 3,0 6,-4'; +/** + * SVG path for drawing next/previous notch from left to right with + * highlighting. + * @const + */ +Blockly.BlockSvg.NOTCH_PATH_LEFT_HIGHLIGHT = 'l 6,4 3,0 6,-4'; +/** + * SVG path for drawing next/previous notch from right to left. + * @const + */ +Blockly.BlockSvg.NOTCH_PATH_RIGHT = 'l -6,4 -3,0 -6,-4'; +/** + * SVG path for drawing jagged teeth at the end of collapsed blocks. + * @const + */ +Blockly.BlockSvg.JAGGED_TEETH = 'l 8,0 0,4 8,4 -16,8 8,4'; +/** + * Height of SVG path for jagged teeth at the end of collapsed blocks. + * @const + */ +Blockly.BlockSvg.JAGGED_TEETH_HEIGHT = 20; +/** + * Width of SVG path for jagged teeth at the end of collapsed blocks. + * @const + */ +Blockly.BlockSvg.JAGGED_TEETH_WIDTH = 15; +/** + * SVG path for drawing a horizontal puzzle tab from top to bottom. + * @const + */ +Blockly.BlockSvg.TAB_PATH_DOWN = 'v 5 c 0,10 -' + Blockly.BlockSvg.TAB_WIDTH + + ',-8 -' + Blockly.BlockSvg.TAB_WIDTH + ',7.5 s ' + + Blockly.BlockSvg.TAB_WIDTH + ',-2.5 ' + Blockly.BlockSvg.TAB_WIDTH + ',7.5'; +/** + * SVG path for drawing a horizontal puzzle tab from top to bottom with + * highlighting from the upper-right. + * @const + */ +Blockly.BlockSvg.TAB_PATH_DOWN_HIGHLIGHT_RTL = 'v 6.5 m -' + + (Blockly.BlockSvg.TAB_WIDTH * 0.97) + ',3 q -' + + (Blockly.BlockSvg.TAB_WIDTH * 0.05) + ',10 ' + + (Blockly.BlockSvg.TAB_WIDTH * 0.3) + ',9.5 m ' + + (Blockly.BlockSvg.TAB_WIDTH * 0.67) + ',-1.9 v 1.4'; + +/** + * SVG start point for drawing the top-left corner. + * @const + */ +Blockly.BlockSvg.TOP_LEFT_CORNER_START = + 'm 0,' + Blockly.BlockSvg.CORNER_RADIUS; +/** + * SVG start point for drawing the top-left corner's highlight in RTL. + * @const + */ +Blockly.BlockSvg.TOP_LEFT_CORNER_START_HIGHLIGHT_RTL = + 'm ' + Blockly.BlockSvg.DISTANCE_45_INSIDE + ',' + + Blockly.BlockSvg.DISTANCE_45_INSIDE; +/** + * SVG start point for drawing the top-left corner's highlight in LTR. + * @const + */ +Blockly.BlockSvg.TOP_LEFT_CORNER_START_HIGHLIGHT_LTR = + 'm 0.5,' + (Blockly.BlockSvg.CORNER_RADIUS - 0.5); +/** + * SVG path for drawing the rounded top-left corner. + * @const + */ +Blockly.BlockSvg.TOP_LEFT_CORNER = + 'A ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 ' + + Blockly.BlockSvg.CORNER_RADIUS + ',0'; +/** + * SVG path for drawing the highlight on the rounded top-left corner. + * @const + */ +Blockly.BlockSvg.TOP_LEFT_CORNER_HIGHLIGHT = + 'A ' + (Blockly.BlockSvg.CORNER_RADIUS - 0.5) + ',' + + (Blockly.BlockSvg.CORNER_RADIUS - 0.5) + ' 0 0,1 ' + + Blockly.BlockSvg.CORNER_RADIUS + ',0.5'; +/** + * SVG path for drawing the top-left corner of a statement input. + * Includes the top notch, a horizontal space, and the rounded inside corner. + * @const + */ +Blockly.BlockSvg.INNER_TOP_LEFT_CORNER = + Blockly.BlockSvg.NOTCH_PATH_RIGHT + ' h -' + + (Blockly.BlockSvg.NOTCH_WIDTH - 15 - Blockly.BlockSvg.CORNER_RADIUS) + + ' a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 -' + + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS; +/** + * SVG path for drawing the bottom-left corner of a statement input. + * Includes the rounded inside corner. + * @const + */ +Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER = + 'a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS; +/** + * SVG path for drawing highlight on the top-left corner of a statement + * input in RTL. + * @const + */ +Blockly.BlockSvg.INNER_TOP_LEFT_CORNER_HIGHLIGHT_RTL = + 'a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + + (-Blockly.BlockSvg.DISTANCE_45_OUTSIDE - 0.5) + ',' + + (Blockly.BlockSvg.CORNER_RADIUS - + Blockly.BlockSvg.DISTANCE_45_OUTSIDE); +/** + * SVG path for drawing highlight on the bottom-left corner of a statement + * input in RTL. + * @const + */ +Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_RTL = + 'a ' + (Blockly.BlockSvg.CORNER_RADIUS + 0.5) + ',' + + (Blockly.BlockSvg.CORNER_RADIUS + 0.5) + ' 0 0,0 ' + + (Blockly.BlockSvg.CORNER_RADIUS + 0.5) + ',' + + (Blockly.BlockSvg.CORNER_RADIUS + 0.5); +/** + * SVG path for drawing highlight on the bottom-left corner of a statement + * input in LTR. + * @const + */ +Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_LTR = + 'a ' + (Blockly.BlockSvg.CORNER_RADIUS + 0.5) + ',' + + (Blockly.BlockSvg.CORNER_RADIUS + 0.5) + ' 0 0,0 ' + + (Blockly.BlockSvg.CORNER_RADIUS - + Blockly.BlockSvg.DISTANCE_45_OUTSIDE) + ',' + + (Blockly.BlockSvg.DISTANCE_45_OUTSIDE + 0.5); + +/** + * Render the block. + * Lays out and reflows a block based on its contents and settings. + * @param {boolean=} opt_bubble If false, just render this block. + * If true, also render block's parent, grandparent, etc. Defaults to true. + */ +Blockly.BlockSvg.prototype.render = function(opt_bubble) { + Blockly.Field.startCache(); + this.rendered = true; + + var cursorX = Blockly.BlockSvg.SEP_SPACE_X; + if (this.RTL) { + cursorX = -cursorX; + } + // Move the icons into position. + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + cursorX = icons[i].renderIcon(cursorX); + } + cursorX += this.RTL ? + Blockly.BlockSvg.SEP_SPACE_X : -Blockly.BlockSvg.SEP_SPACE_X; + // If there are no icons, cursorX will be 0, otherwise it will be the + // width that the first label needs to move over by. + + var inputRows = this.renderCompute_(cursorX); + this.renderDraw_(cursorX, inputRows); + this.renderMoveConnections_(); + + if (opt_bubble !== false) { + // Render all blocks above this one (propagate a reflow). + var parentBlock = this.getParent(); + if (parentBlock) { + parentBlock.render(true); + } else { + // Top-most block. Fire an event to allow scrollbars to resize. + this.workspace.resizeContents(); + } + } + Blockly.Field.stopCache(); +}; + +/** + * Render a list of fields starting at the specified location. + * @param {!Array.} fieldList List of fields. + * @param {number} cursorX X-coordinate to start the fields. + * @param {number} cursorY Y-coordinate to start the fields. + * @return {number} X-coordinate of the end of the field row (plus a gap). + * @private + */ +Blockly.BlockSvg.prototype.renderFields_ = + function(fieldList, cursorX, cursorY) { + /* eslint-disable indent */ + cursorY += Blockly.BlockSvg.INLINE_PADDING_Y; + if (this.RTL) { + cursorX = -cursorX; + } + for (var t = 0, field; field = fieldList[t]; t++) { + var root = field.getSvgRoot(); + if (!root) { + continue; + } + + // Force a width re-calculation on IE and Edge to get around the issue + // described in Blockly.Field.getCachedWidth + if (goog.userAgent.IE || goog.userAgent.EDGE) { + field.updateWidth(); + } + + if (this.RTL) { + cursorX -= field.renderSep + field.renderWidth; + root.setAttribute('transform', + 'translate(' + cursorX + ',' + cursorY + ')'); + if (field.renderWidth) { + cursorX -= Blockly.BlockSvg.SEP_SPACE_X; + } + } else { + root.setAttribute('transform', + 'translate(' + (cursorX + field.renderSep) + ',' + cursorY + ')'); + if (field.renderWidth) { + cursorX += field.renderSep + field.renderWidth + + Blockly.BlockSvg.SEP_SPACE_X; + } + } + } + return this.RTL ? -cursorX : cursorX; +}; /* eslint-enable indent */ + +/** + * Computes the height and widths for each row and field. + * @param {number} iconWidth Offset of first row due to icons. + * @return {!Array.>} 2D array of objects, each containing + * position information. + * @private + */ +Blockly.BlockSvg.prototype.renderCompute_ = function(iconWidth) { + var inputList = this.inputList; + var inputRows = []; + inputRows.rightEdge = iconWidth + Blockly.BlockSvg.SEP_SPACE_X * 2; + if (this.previousConnection || this.nextConnection) { + inputRows.rightEdge = Math.max(inputRows.rightEdge, + Blockly.BlockSvg.NOTCH_WIDTH + Blockly.BlockSvg.SEP_SPACE_X); + } + var fieldValueWidth = 0; // Width of longest external value field. + var fieldStatementWidth = 0; // Width of longest statement field. + var hasValue = false; + var hasStatement = false; + var hasDummy = false; + var lastType = undefined; + var isInline = this.getInputsInline() && !this.isCollapsed(); + for (var i = 0, input; input = inputList[i]; i++) { + if (!input.isVisible()) { + continue; + } + var row; + if (!isInline || !lastType || + lastType == Blockly.NEXT_STATEMENT || + input.type == Blockly.NEXT_STATEMENT) { + // Create new row. + lastType = input.type; + row = []; + if (isInline && input.type != Blockly.NEXT_STATEMENT) { + row.type = Blockly.BlockSvg.INLINE; + } else { + row.type = input.type; + } + row.height = 0; + inputRows.push(row); + } else { + row = inputRows[inputRows.length - 1]; + } + row.push(input); + + // Compute minimum input size. + input.renderHeight = Blockly.BlockSvg.MIN_BLOCK_Y; + // The width is currently only needed for inline value inputs. + if (isInline && input.type == Blockly.INPUT_VALUE) { + input.renderWidth = Blockly.BlockSvg.TAB_WIDTH + + Blockly.BlockSvg.SEP_SPACE_X * 1.25; + } else { + input.renderWidth = 0; + } + // Expand input size if there is a connection. + if (input.connection && input.connection.isConnected()) { + var linkedBlock = input.connection.targetBlock(); + var bBox = linkedBlock.getHeightWidth(); + input.renderHeight = Math.max(input.renderHeight, bBox.height); + input.renderWidth = Math.max(input.renderWidth, bBox.width); + } + // Blocks have a one pixel shadow that should sometimes overhang. + if (!isInline && i == inputList.length - 1) { + // Last value input should overhang. + input.renderHeight--; + } else if (!isInline && input.type == Blockly.INPUT_VALUE && + inputList[i + 1] && inputList[i + 1].type == Blockly.NEXT_STATEMENT) { + // Value input above statement input should overhang. + input.renderHeight--; + } + + row.height = Math.max(row.height, input.renderHeight); + input.fieldWidth = 0; + if (inputRows.length == 1) { + // The first row gets shifted to accommodate any icons. + input.fieldWidth += this.RTL ? -iconWidth : iconWidth; + } + var previousFieldEditable = false; + for (var j = 0, field; field = input.fieldRow[j]; j++) { + if (j != 0) { + input.fieldWidth += Blockly.BlockSvg.SEP_SPACE_X; + } + // Get the dimensions of the field. + var fieldSize = field.getSize(); + field.renderWidth = fieldSize.width; + field.renderSep = (previousFieldEditable && field.EDITABLE) ? + Blockly.BlockSvg.SEP_SPACE_X : 0; + input.fieldWidth += field.renderWidth + field.renderSep; + row.height = Math.max(row.height, fieldSize.height); + previousFieldEditable = field.EDITABLE; + } + + if (row.type != Blockly.BlockSvg.INLINE) { + if (row.type == Blockly.NEXT_STATEMENT) { + hasStatement = true; + fieldStatementWidth = Math.max(fieldStatementWidth, input.fieldWidth); + } else { + if (row.type == Blockly.INPUT_VALUE) { + hasValue = true; + } else if (row.type == Blockly.DUMMY_INPUT) { + hasDummy = true; + } + fieldValueWidth = Math.max(fieldValueWidth, input.fieldWidth); + } + } + } + + // Make inline rows a bit thicker in order to enclose the values. + for (var y = 0, row; row = inputRows[y]; y++) { + row.thicker = false; + if (row.type == Blockly.BlockSvg.INLINE) { + for (var z = 0, input; input = row[z]; z++) { + if (input.type == Blockly.INPUT_VALUE) { + row.height += 2 * Blockly.BlockSvg.INLINE_PADDING_Y; + row.thicker = true; + break; + } + } + } + } + + // Compute the statement edge. + // This is the width of a block where statements are nested. + inputRows.statementEdge = 2 * Blockly.BlockSvg.SEP_SPACE_X + + fieldStatementWidth; + // Compute the preferred right edge. Inline blocks may extend beyond. + // This is the width of the block where external inputs connect. + if (hasStatement) { + inputRows.rightEdge = Math.max(inputRows.rightEdge, + inputRows.statementEdge + Blockly.BlockSvg.NOTCH_WIDTH); + } + if (hasValue) { + inputRows.rightEdge = Math.max(inputRows.rightEdge, fieldValueWidth + + Blockly.BlockSvg.SEP_SPACE_X * 2 + Blockly.BlockSvg.TAB_WIDTH); + } else if (hasDummy) { + inputRows.rightEdge = Math.max(inputRows.rightEdge, fieldValueWidth + + Blockly.BlockSvg.SEP_SPACE_X * 2); + } + + inputRows.hasValue = hasValue; + inputRows.hasStatement = hasStatement; + inputRows.hasDummy = hasDummy; + return inputRows; +}; + + +/** + * Draw the path of the block. + * Move the fields to the correct locations. + * @param {number} iconWidth Offset of first row due to icons. + * @param {!Array.>} inputRows 2D array of objects, each + * containing position information. + * @private + */ +Blockly.BlockSvg.prototype.renderDraw_ = function(iconWidth, inputRows) { + this.startHat_ = false; + // Reset the height to zero and let the rendering process add in + // portions of the block height as it goes. (e.g. hats, inputs, etc.) + this.height = 0; + // Should the top and bottom left corners be rounded or square? + if (this.outputConnection) { + this.squareTopLeftCorner_ = true; + this.squareBottomLeftCorner_ = true; + } else { + this.squareTopLeftCorner_ = false; + this.squareBottomLeftCorner_ = false; + // If this block is in the middle of a stack, square the corners. + if (this.previousConnection) { + var prevBlock = this.previousConnection.targetBlock(); + if (prevBlock && prevBlock.getNextBlock() == this) { + this.squareTopLeftCorner_ = true; + } + } else if (Blockly.BlockSvg.START_HAT) { + // No output or previous connection. + this.squareTopLeftCorner_ = true; + this.startHat_ = true; + this.height += Blockly.BlockSvg.START_HAT_HEIGHT; + inputRows.rightEdge = Math.max(inputRows.rightEdge, 100); + } + var nextBlock = this.getNextBlock(); + if (nextBlock) { + this.squareBottomLeftCorner_ = true; + } + } + + // Assemble the block's path. + var steps = []; + var inlineSteps = []; + // The highlighting applies to edges facing the upper-left corner. + // Since highlighting is a two-pixel wide border, it would normally overhang + // the edge of the block by a pixel. So undersize all measurements by a pixel. + var highlightSteps = []; + var highlightInlineSteps = []; + + this.renderDrawTop_(steps, highlightSteps, inputRows.rightEdge); + var cursorY = this.renderDrawRight_(steps, highlightSteps, inlineSteps, + highlightInlineSteps, inputRows, iconWidth); + this.renderDrawBottom_(steps, highlightSteps, cursorY); + this.renderDrawLeft_(steps, highlightSteps); + + var pathString = steps.join(' ') + '\n' + inlineSteps.join(' '); + this.svgPath_.setAttribute('d', pathString); + this.svgPathDark_.setAttribute('d', pathString); + pathString = highlightSteps.join(' ') + '\n' + highlightInlineSteps.join(' '); + this.svgPathLight_.setAttribute('d', pathString); + if (this.RTL) { + // Mirror the block's path. + this.svgPath_.setAttribute('transform', 'scale(-1 1)'); + this.svgPathLight_.setAttribute('transform', 'scale(-1 1)'); + this.svgPathDark_.setAttribute('transform', 'translate(1,1) scale(-1 1)'); + } +}; + +/** + * Update all of the connections on this block with the new locations calculated + * in renderCompute. Also move all of the connected blocks based on the new + * connection locations. + * @private + */ +Blockly.BlockSvg.prototype.renderMoveConnections_ = function() { + var blockTL = this.getRelativeToSurfaceXY(); + // Don't tighten previous or output connections because they are inferior + // connections. + if (this.previousConnection) { + this.previousConnection.moveToOffset(blockTL); + } + if (this.outputConnection) { + this.outputConnection.moveToOffset(blockTL); + } + + for (var i = 0; i < this.inputList.length; i++) { + var conn = this.inputList[i].connection; + if (conn) { + conn.moveToOffset(blockTL); + if (conn.isConnected()) { + conn.tighten_(); + } + } + } + + if (this.nextConnection) { + this.nextConnection.moveToOffset(blockTL); + if (this.nextConnection.isConnected()) { + this.nextConnection.tighten_(); + } + } + +}; + +/** + * Render the top edge of the block. + * @param {!Array.} steps Path of block outline. + * @param {!Array.} highlightSteps Path of block highlights. + * @param {number} rightEdge Minimum width of block. + * @private + */ +Blockly.BlockSvg.prototype.renderDrawTop_ = + function(steps, highlightSteps, rightEdge) { + /* eslint-disable indent */ + // Position the cursor at the top-left starting point. + if (this.squareTopLeftCorner_) { + steps.push('m 0,0'); + highlightSteps.push('m 0.5,0.5'); + if (this.startHat_) { + steps.push(Blockly.BlockSvg.START_HAT_PATH); + highlightSteps.push(this.RTL ? + Blockly.BlockSvg.START_HAT_HIGHLIGHT_RTL : + Blockly.BlockSvg.START_HAT_HIGHLIGHT_LTR); + } + } else { + steps.push(Blockly.BlockSvg.TOP_LEFT_CORNER_START); + highlightSteps.push(this.RTL ? + Blockly.BlockSvg.TOP_LEFT_CORNER_START_HIGHLIGHT_RTL : + Blockly.BlockSvg.TOP_LEFT_CORNER_START_HIGHLIGHT_LTR); + // Top-left rounded corner. + steps.push(Blockly.BlockSvg.TOP_LEFT_CORNER); + highlightSteps.push(Blockly.BlockSvg.TOP_LEFT_CORNER_HIGHLIGHT); + } + + // Top edge. + if (this.previousConnection) { + steps.push('H', Blockly.BlockSvg.NOTCH_WIDTH - 15); + highlightSteps.push('H', Blockly.BlockSvg.NOTCH_WIDTH - 15); + steps.push(Blockly.BlockSvg.NOTCH_PATH_LEFT); + highlightSteps.push(Blockly.BlockSvg.NOTCH_PATH_LEFT_HIGHLIGHT); + + var connectionX = (this.RTL ? + -Blockly.BlockSvg.NOTCH_WIDTH : Blockly.BlockSvg.NOTCH_WIDTH); + this.previousConnection.setOffsetInBlock(connectionX, 0); + } + steps.push('H', rightEdge); + highlightSteps.push('H', rightEdge - 0.5); + this.width = rightEdge; +}; /* eslint-enable indent */ + +/** + * Render the right edge of the block. + * @param {!Array.} steps Path of block outline. + * @param {!Array.} highlightSteps Path of block highlights. + * @param {!Array.} inlineSteps Inline block outlines. + * @param {!Array.} highlightInlineSteps Inline block highlights. + * @param {!Array.>} inputRows 2D array of objects, each + * containing position information. + * @param {number} iconWidth Offset of first row due to icons. + * @return {number} Height of block. + * @private + */ +Blockly.BlockSvg.prototype.renderDrawRight_ = function(steps, highlightSteps, + inlineSteps, highlightInlineSteps, inputRows, iconWidth) { + var cursorX; + var cursorY = 0; + var connectionX, connectionY; + for (var y = 0, row; row = inputRows[y]; y++) { + cursorX = Blockly.BlockSvg.SEP_SPACE_X; + if (y == 0) { + cursorX += this.RTL ? -iconWidth : iconWidth; + } + highlightSteps.push('M', (inputRows.rightEdge - 0.5) + ',' + + (cursorY + 0.5)); + if (this.isCollapsed()) { + // Jagged right edge. + var input = row[0]; + var fieldX = cursorX; + var fieldY = cursorY; + this.renderFields_(input.fieldRow, fieldX, fieldY); + steps.push(Blockly.BlockSvg.JAGGED_TEETH); + highlightSteps.push('h 8'); + var remainder = row.height - Blockly.BlockSvg.JAGGED_TEETH_HEIGHT; + steps.push('v', remainder); + if (this.RTL) { + highlightSteps.push('v 3.9 l 7.2,3.4 m -14.5,8.9 l 7.3,3.5'); + highlightSteps.push('v', remainder - 0.7); + } + this.width += Blockly.BlockSvg.JAGGED_TEETH_WIDTH; + } else if (row.type == Blockly.BlockSvg.INLINE) { + // Inline inputs. + for (var x = 0, input; input = row[x]; x++) { + var fieldX = cursorX; + var fieldY = cursorY; + if (row.thicker) { + // Lower the field slightly. + fieldY += Blockly.BlockSvg.INLINE_PADDING_Y; + } + // TODO: Align inline field rows (left/right/centre). + cursorX = this.renderFields_(input.fieldRow, fieldX, fieldY); + if (input.type != Blockly.DUMMY_INPUT) { + cursorX += input.renderWidth + Blockly.BlockSvg.SEP_SPACE_X; + } + if (input.type == Blockly.INPUT_VALUE) { + inlineSteps.push('M', (cursorX - Blockly.BlockSvg.SEP_SPACE_X) + + ',' + (cursorY + Blockly.BlockSvg.INLINE_PADDING_Y)); + inlineSteps.push('h', Blockly.BlockSvg.TAB_WIDTH - 2 - + input.renderWidth); + inlineSteps.push(Blockly.BlockSvg.TAB_PATH_DOWN); + inlineSteps.push('v', input.renderHeight + 1 - + Blockly.BlockSvg.TAB_HEIGHT); + inlineSteps.push('h', input.renderWidth + 2 - + Blockly.BlockSvg.TAB_WIDTH); + inlineSteps.push('z'); + if (this.RTL) { + // Highlight right edge, around back of tab, and bottom. + highlightInlineSteps.push('M', + (cursorX - Blockly.BlockSvg.SEP_SPACE_X - 2.5 + + Blockly.BlockSvg.TAB_WIDTH - input.renderWidth) + ',' + + (cursorY + Blockly.BlockSvg.INLINE_PADDING_Y + 0.5)); + highlightInlineSteps.push( + Blockly.BlockSvg.TAB_PATH_DOWN_HIGHLIGHT_RTL); + highlightInlineSteps.push('v', + input.renderHeight - Blockly.BlockSvg.TAB_HEIGHT + 2.5); + highlightInlineSteps.push('h', + input.renderWidth - Blockly.BlockSvg.TAB_WIDTH + 2); + } else { + // Highlight right edge, bottom. + highlightInlineSteps.push('M', + (cursorX - Blockly.BlockSvg.SEP_SPACE_X + 0.5) + ',' + + (cursorY + Blockly.BlockSvg.INLINE_PADDING_Y + 0.5)); + highlightInlineSteps.push('v', input.renderHeight + 1); + highlightInlineSteps.push('h', Blockly.BlockSvg.TAB_WIDTH - 2 - + input.renderWidth); + // Short highlight glint at bottom of tab. + highlightInlineSteps.push('M', + (cursorX - input.renderWidth - Blockly.BlockSvg.SEP_SPACE_X + + 0.9) + ',' + (cursorY + Blockly.BlockSvg.INLINE_PADDING_Y + + Blockly.BlockSvg.TAB_HEIGHT - 0.7)); + highlightInlineSteps.push('l', + (Blockly.BlockSvg.TAB_WIDTH * 0.46) + ',-2.1'); + } + // Create inline input connection. + if (this.RTL) { + connectionX = -cursorX - + Blockly.BlockSvg.TAB_WIDTH + Blockly.BlockSvg.SEP_SPACE_X + + input.renderWidth + 1; + } else { + connectionX = cursorX + + Blockly.BlockSvg.TAB_WIDTH - Blockly.BlockSvg.SEP_SPACE_X - + input.renderWidth - 1; + } + connectionY = cursorY + Blockly.BlockSvg.INLINE_PADDING_Y + 1; + input.connection.setOffsetInBlock(connectionX, connectionY); + } + } + + cursorX = Math.max(cursorX, inputRows.rightEdge); + this.width = Math.max(this.width, cursorX); + steps.push('H', cursorX); + highlightSteps.push('H', cursorX - 0.5); + steps.push('v', row.height); + if (this.RTL) { + highlightSteps.push('v', row.height - 1); + } + } else if (row.type == Blockly.INPUT_VALUE) { + // External input. + var input = row[0]; + var fieldX = cursorX; + var fieldY = cursorY; + if (input.align != Blockly.ALIGN_LEFT) { + var fieldRightX = inputRows.rightEdge - input.fieldWidth - + Blockly.BlockSvg.TAB_WIDTH - 2 * Blockly.BlockSvg.SEP_SPACE_X; + if (input.align == Blockly.ALIGN_RIGHT) { + fieldX += fieldRightX; + } else if (input.align == Blockly.ALIGN_CENTRE) { + fieldX += fieldRightX / 2; + } + } + this.renderFields_(input.fieldRow, fieldX, fieldY); + steps.push(Blockly.BlockSvg.TAB_PATH_DOWN); + var v = row.height - Blockly.BlockSvg.TAB_HEIGHT; + steps.push('v', v); + if (this.RTL) { + // Highlight around back of tab. + highlightSteps.push(Blockly.BlockSvg.TAB_PATH_DOWN_HIGHLIGHT_RTL); + highlightSteps.push('v', v + 0.5); + } else { + // Short highlight glint at bottom of tab. + highlightSteps.push('M', (inputRows.rightEdge - 5) + ',' + + (cursorY + Blockly.BlockSvg.TAB_HEIGHT - 0.7)); + highlightSteps.push('l', (Blockly.BlockSvg.TAB_WIDTH * 0.46) + + ',-2.1'); + } + // Create external input connection. + connectionX = this.RTL ? -inputRows.rightEdge - 1 : + inputRows.rightEdge + 1; + input.connection.setOffsetInBlock(connectionX, cursorY); + if (input.connection.isConnected()) { + this.width = Math.max(this.width, inputRows.rightEdge + + input.connection.targetBlock().getHeightWidth().width - + Blockly.BlockSvg.TAB_WIDTH + 1); + } + } else if (row.type == Blockly.DUMMY_INPUT) { + // External naked field. + var input = row[0]; + var fieldX = cursorX; + var fieldY = cursorY; + if (input.align != Blockly.ALIGN_LEFT) { + var fieldRightX = inputRows.rightEdge - input.fieldWidth - + 2 * Blockly.BlockSvg.SEP_SPACE_X; + if (inputRows.hasValue) { + fieldRightX -= Blockly.BlockSvg.TAB_WIDTH; + } + if (input.align == Blockly.ALIGN_RIGHT) { + fieldX += fieldRightX; + } else if (input.align == Blockly.ALIGN_CENTRE) { + fieldX += fieldRightX / 2; + } + } + this.renderFields_(input.fieldRow, fieldX, fieldY); + steps.push('v', row.height); + if (this.RTL) { + highlightSteps.push('v', row.height - 1); + } + } else if (row.type == Blockly.NEXT_STATEMENT) { + // Nested statement. + var input = row[0]; + if (y == 0) { + // If the first input is a statement stack, add a small row on top. + steps.push('v', Blockly.BlockSvg.SEP_SPACE_Y); + if (this.RTL) { + highlightSteps.push('v', Blockly.BlockSvg.SEP_SPACE_Y - 1); + } + cursorY += Blockly.BlockSvg.SEP_SPACE_Y; + } + var fieldX = cursorX; + var fieldY = cursorY; + if (input.align != Blockly.ALIGN_LEFT) { + var fieldRightX = inputRows.statementEdge - input.fieldWidth - + 2 * Blockly.BlockSvg.SEP_SPACE_X; + if (input.align == Blockly.ALIGN_RIGHT) { + fieldX += fieldRightX; + } else if (input.align == Blockly.ALIGN_CENTRE) { + fieldX += fieldRightX / 2; + } + } + this.renderFields_(input.fieldRow, fieldX, fieldY); + cursorX = inputRows.statementEdge + Blockly.BlockSvg.NOTCH_WIDTH; + steps.push('H', cursorX); + steps.push(Blockly.BlockSvg.INNER_TOP_LEFT_CORNER); + steps.push('v', row.height - 2 * Blockly.BlockSvg.CORNER_RADIUS); + steps.push(Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER); + steps.push('H', inputRows.rightEdge); + if (this.RTL) { + highlightSteps.push('M', + (cursorX - Blockly.BlockSvg.NOTCH_WIDTH + + Blockly.BlockSvg.DISTANCE_45_OUTSIDE) + + ',' + (cursorY + Blockly.BlockSvg.DISTANCE_45_OUTSIDE)); + highlightSteps.push( + Blockly.BlockSvg.INNER_TOP_LEFT_CORNER_HIGHLIGHT_RTL); + highlightSteps.push('v', + row.height - 2 * Blockly.BlockSvg.CORNER_RADIUS); + highlightSteps.push( + Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_RTL); + highlightSteps.push('H', inputRows.rightEdge - 0.5); + } else { + highlightSteps.push('M', + (cursorX - Blockly.BlockSvg.NOTCH_WIDTH + + Blockly.BlockSvg.DISTANCE_45_OUTSIDE) + ',' + + (cursorY + row.height - Blockly.BlockSvg.DISTANCE_45_OUTSIDE)); + highlightSteps.push( + Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_LTR); + highlightSteps.push('H', inputRows.rightEdge - 0.5); + } + // Create statement connection. + connectionX = this.RTL ? -cursorX : cursorX + 1; + input.connection.setOffsetInBlock(connectionX, cursorY + 1); + + if (input.connection.isConnected()) { + this.width = Math.max(this.width, inputRows.statementEdge + + input.connection.targetBlock().getHeightWidth().width); + } + if (y == inputRows.length - 1 || + inputRows[y + 1].type == Blockly.NEXT_STATEMENT) { + // If the final input is a statement stack, add a small row underneath. + // Consecutive statement stacks are also separated by a small divider. + steps.push('v', Blockly.BlockSvg.SEP_SPACE_Y); + if (this.RTL) { + highlightSteps.push('v', Blockly.BlockSvg.SEP_SPACE_Y - 1); + } + cursorY += Blockly.BlockSvg.SEP_SPACE_Y; + } + } + cursorY += row.height; + } + if (!inputRows.length) { + cursorY = Blockly.BlockSvg.MIN_BLOCK_Y; + steps.push('V', cursorY); + if (this.RTL) { + highlightSteps.push('V', cursorY - 1); + } + } + return cursorY; +}; + +/** + * Render the bottom edge of the block. + * @param {!Array.} steps Path of block outline. + * @param {!Array.} highlightSteps Path of block highlights. + * @param {number} cursorY Height of block. + * @private + */ +Blockly.BlockSvg.prototype.renderDrawBottom_ = + function(steps, highlightSteps, cursorY) { + /* eslint-disable indent */ + this.height += cursorY + 1; // Add one for the shadow. + if (this.nextConnection) { + steps.push('H', (Blockly.BlockSvg.NOTCH_WIDTH + (this.RTL ? 0.5 : - 0.5)) + + ' ' + Blockly.BlockSvg.NOTCH_PATH_RIGHT); + // Create next block connection. + var connectionX; + if (this.RTL) { + connectionX = -Blockly.BlockSvg.NOTCH_WIDTH; + } else { + connectionX = Blockly.BlockSvg.NOTCH_WIDTH; + } + this.nextConnection.setOffsetInBlock(connectionX, cursorY + 1); + this.height += 4; // Height of tab. + } + + // Should the bottom-left corner be rounded or square? + if (this.squareBottomLeftCorner_) { + steps.push('H 0'); + if (!this.RTL) { + highlightSteps.push('M', '0.5,' + (cursorY - 0.5)); + } + } else { + steps.push('H', Blockly.BlockSvg.CORNER_RADIUS); + steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 -' + + Blockly.BlockSvg.CORNER_RADIUS + ',-' + + Blockly.BlockSvg.CORNER_RADIUS); + if (!this.RTL) { + highlightSteps.push('M', Blockly.BlockSvg.DISTANCE_45_INSIDE + ',' + + (cursorY - Blockly.BlockSvg.DISTANCE_45_INSIDE)); + highlightSteps.push('A', (Blockly.BlockSvg.CORNER_RADIUS - 0.5) + ',' + + (Blockly.BlockSvg.CORNER_RADIUS - 0.5) + ' 0 0,1 ' + + '0.5,' + (cursorY - Blockly.BlockSvg.CORNER_RADIUS)); + } + } +}; /* eslint-enable indent */ + +/** + * Render the left edge of the block. + * @param {!Array.} steps Path of block outline. + * @param {!Array.} highlightSteps Path of block highlights. + * @private + */ +Blockly.BlockSvg.prototype.renderDrawLeft_ = function(steps, highlightSteps) { + if (this.outputConnection) { + // Create output connection. + this.outputConnection.setOffsetInBlock(0, 0); + steps.push('V', Blockly.BlockSvg.TAB_HEIGHT); + steps.push('c 0,-10 -' + Blockly.BlockSvg.TAB_WIDTH + ',8 -' + + Blockly.BlockSvg.TAB_WIDTH + ',-7.5 s ' + Blockly.BlockSvg.TAB_WIDTH + + ',2.5 ' + Blockly.BlockSvg.TAB_WIDTH + ',-7.5'); + if (this.RTL) { + highlightSteps.push('M', (Blockly.BlockSvg.TAB_WIDTH * -0.25) + ',8.4'); + highlightSteps.push('l', (Blockly.BlockSvg.TAB_WIDTH * -0.45) + ',-2.1'); + } else { + highlightSteps.push('V', Blockly.BlockSvg.TAB_HEIGHT - 1.5); + highlightSteps.push('m', (Blockly.BlockSvg.TAB_WIDTH * -0.92) + + ',-0.5 q ' + (Blockly.BlockSvg.TAB_WIDTH * -0.19) + + ',-5.5 0,-11'); + highlightSteps.push('m', (Blockly.BlockSvg.TAB_WIDTH * 0.92) + + ',1 V 0.5 H 1'); + } + this.width += Blockly.BlockSvg.TAB_WIDTH; + } else if (!this.RTL) { + if (this.squareTopLeftCorner_) { + // Statement block in a stack. + highlightSteps.push('V', 0.5); + } else { + highlightSteps.push('V', Blockly.BlockSvg.CORNER_RADIUS); + } + } + steps.push('z'); +}; diff --git a/src/opsoro/server/static/js/blockly/core/block_svg.js b/src/opsoro/server/static/js/blockly/core/block_svg.js new file mode 100644 index 0000000..d8edb10 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/block_svg.js @@ -0,0 +1,1772 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Methods for graphically rendering a block as SVG. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.BlockSvg'); + +goog.require('Blockly.Block'); +goog.require('Blockly.ContextMenu'); +goog.require('Blockly.RenderedConnection'); +goog.require('Blockly.Touch'); +goog.require('Blockly.utils'); +goog.require('goog.Timer'); +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.math.Coordinate'); +goog.require('goog.userAgent'); + + +/** + * Class for a block's SVG representation. + * Not normally called directly, workspace.newBlock() is preferred. + * @param {!Blockly.Workspace} workspace The block's workspace. + * @param {?string} prototypeName Name of the language object containing + * type-specific functions for this block. + * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise + * create a new id. + * @extends {Blockly.Block} + * @constructor + */ +Blockly.BlockSvg = function(workspace, prototypeName, opt_id) { + // Create core elements for the block. + /** + * @type {SVGElement} + * @private + */ + this.svgGroup_ = Blockly.utils.createSvgElement('g', {}, null); + + /** + * @type {SVGElement} + * @private + */ + this.svgPathDark_ = Blockly.utils.createSvgElement('path', + {'class': 'blocklyPathDark', 'transform': 'translate(1,1)'}, + this.svgGroup_); + + /** + * @type {SVGElement} + * @private + */ + this.svgPath_ = Blockly.utils.createSvgElement('path', {'class': 'blocklyPath'}, + this.svgGroup_); + + /** + * @type {SVGElement} + * @private + */ + this.svgPathLight_ = Blockly.utils.createSvgElement('path', + {'class': 'blocklyPathLight'}, this.svgGroup_); + this.svgPath_.tooltip = this; + + /** @type {boolean} */ + this.rendered = false; + + /** + * Whether to move the block to the drag surface when it is dragged. + * True if it should move, false if it should be translated directly. + * @type {boolean} + * @private + */ + this.useDragSurface_ = Blockly.utils.is3dSupported() && workspace.blockDragSurface_; + + Blockly.Tooltip.bindMouseEvents(this.svgPath_); + Blockly.BlockSvg.superClass_.constructor.call(this, + workspace, prototypeName, opt_id); +}; +goog.inherits(Blockly.BlockSvg, Blockly.Block); + +/** + * Height of this block, not including any statement blocks above or below. + */ +Blockly.BlockSvg.prototype.height = 0; +/** + * Width of this block, including any connected value blocks. + */ +Blockly.BlockSvg.prototype.width = 0; + +/** + * Original location of block being dragged. + * @type {goog.math.Coordinate} + * @private + */ +Blockly.BlockSvg.prototype.dragStartXY_ = null; + +/** + * Constant for identifying rows that are to be rendered inline. + * Don't collide with Blockly.INPUT_VALUE and friends. + * @const + */ +Blockly.BlockSvg.INLINE = -1; + +/** + * Create and initialize the SVG representation of the block. + * May be called more than once. + */ +Blockly.BlockSvg.prototype.initSvg = function() { + goog.asserts.assert(this.workspace.rendered, 'Workspace is headless.'); + for (var i = 0, input; input = this.inputList[i]; i++) { + input.init(); + } + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + icons[i].createIcon(); + } + this.updateColour(); + this.updateMovable(); + if (!this.workspace.options.readOnly && !this.eventsInit_) { + Blockly.bindEventWithChecks_(this.getSvgRoot(), 'mousedown', this, + this.onMouseDown_); + var thisBlock = this; + Blockly.bindEvent_(this.getSvgRoot(), 'touchstart', null, + function(e) {Blockly.longStart_(e, thisBlock);}); + } + this.eventsInit_ = true; + + if (!this.getSvgRoot().parentNode) { + this.workspace.getCanvas().appendChild(this.getSvgRoot()); + } +}; + +/** + * Select this block. Highlight it visually. + */ +Blockly.BlockSvg.prototype.select = function() { + if (this.isShadow() && this.getParent()) { + // Shadow blocks should not be selected. + this.getParent().select(); + return; + } + if (Blockly.selected == this) { + return; + } + var oldId = null; + if (Blockly.selected) { + oldId = Blockly.selected.id; + // Unselect any previously selected block. + Blockly.Events.disable(); + try { + Blockly.selected.unselect(); + } finally { + Blockly.Events.enable(); + } + } + var event = new Blockly.Events.Ui(null, 'selected', oldId, this.id); + event.workspaceId = this.workspace.id; + Blockly.Events.fire(event); + Blockly.selected = this; + this.addSelect(); +}; + +/** + * Unselect this block. Remove its highlighting. + */ +Blockly.BlockSvg.prototype.unselect = function() { + if (Blockly.selected != this) { + return; + } + var event = new Blockly.Events.Ui(null, 'selected', this.id, null); + event.workspaceId = this.workspace.id; + Blockly.Events.fire(event); + Blockly.selected = null; + this.removeSelect(); +}; + +/** + * Block's mutator icon (if any). + * @type {Blockly.Mutator} + */ +Blockly.BlockSvg.prototype.mutator = null; + +/** + * Block's comment icon (if any). + * @type {Blockly.Comment} + */ +Blockly.BlockSvg.prototype.comment = null; + +/** + * Block's warning icon (if any). + * @type {Blockly.Warning} + */ +Blockly.BlockSvg.prototype.warning = null; + +/** + * Returns a list of mutator, comment, and warning icons. + * @return {!Array} List of icons. + */ +Blockly.BlockSvg.prototype.getIcons = function() { + var icons = []; + if (this.mutator) { + icons.push(this.mutator); + } + if (this.comment) { + icons.push(this.comment); + } + if (this.warning) { + icons.push(this.warning); + } + return icons; +}; + +/** + * Wrapper function called when a mouseUp occurs during a drag operation. + * @type {Array.} + * @private + */ +Blockly.BlockSvg.onMouseUpWrapper_ = null; + +/** + * Wrapper function called when a mouseMove occurs during a drag operation. + * @type {Array.} + * @private + */ +Blockly.BlockSvg.onMouseMoveWrapper_ = null; + +/** + * Stop binding to the global mouseup and mousemove events. + * @package + */ +Blockly.BlockSvg.terminateDrag = function() { + Blockly.BlockSvg.disconnectUiStop_(); + if (Blockly.BlockSvg.onMouseUpWrapper_) { + Blockly.unbindEvent_(Blockly.BlockSvg.onMouseUpWrapper_); + Blockly.BlockSvg.onMouseUpWrapper_ = null; + } + if (Blockly.BlockSvg.onMouseMoveWrapper_) { + Blockly.unbindEvent_(Blockly.BlockSvg.onMouseMoveWrapper_); + Blockly.BlockSvg.onMouseMoveWrapper_ = null; + } + var selected = Blockly.selected; + if (Blockly.dragMode_ == Blockly.DRAG_FREE) { + // Terminate a drag operation. + if (selected) { + // Update the connection locations. + var xy = selected.getRelativeToSurfaceXY(); + var dxy = goog.math.Coordinate.difference(xy, selected.dragStartXY_); + var event = new Blockly.Events.Move(selected); + event.oldCoordinate = selected.dragStartXY_; + event.recordNew(); + Blockly.Events.fire(event); + + selected.moveConnections_(dxy.x, dxy.y); + delete selected.draggedBubbles_; + selected.setDragging_(false); + selected.moveOffDragSurface_(); + selected.render(); + selected.workspace.setResizesEnabled(true); + // Ensure that any snap and bump are part of this move's event group. + var group = Blockly.Events.getGroup(); + setTimeout(function() { + Blockly.Events.setGroup(group); + selected.snapToGrid(); + Blockly.Events.setGroup(false); + }, Blockly.BUMP_DELAY / 2); + setTimeout(function() { + Blockly.Events.setGroup(group); + selected.bumpNeighbours_(); + Blockly.Events.setGroup(false); + }, Blockly.BUMP_DELAY); + } + } + Blockly.dragMode_ = Blockly.DRAG_NONE; + Blockly.Css.setCursor(Blockly.Css.Cursor.OPEN); +}; + +/** + * Set parent of this block to be a new block or null. + * @param {Blockly.BlockSvg} newParent New parent block. + */ +Blockly.BlockSvg.prototype.setParent = function(newParent) { + if (newParent == this.parentBlock_) { + return; + } + var svgRoot = this.getSvgRoot(); + if (this.parentBlock_ && svgRoot) { + // Move this block up the DOM. Keep track of x/y translations. + var xy = this.getRelativeToSurfaceXY(); + this.workspace.getCanvas().appendChild(svgRoot); + svgRoot.setAttribute('transform', 'translate(' + xy.x + ',' + xy.y + ')'); + } + + Blockly.Field.startCache(); + Blockly.BlockSvg.superClass_.setParent.call(this, newParent); + Blockly.Field.stopCache(); + + if (newParent) { + var oldXY = this.getRelativeToSurfaceXY(); + newParent.getSvgRoot().appendChild(svgRoot); + var newXY = this.getRelativeToSurfaceXY(); + // Move the connections to match the child's new position. + this.moveConnections_(newXY.x - oldXY.x, newXY.y - oldXY.y); + } +}; + +/** + * Return the coordinates of the top-left corner of this block relative to the + * drawing surface's origin (0,0). + * @return {!goog.math.Coordinate} Object with .x and .y properties. + */ +Blockly.BlockSvg.prototype.getRelativeToSurfaceXY = function() { + var x = 0; + var y = 0; + + var dragSurfaceGroup = this.useDragSurface_ ? + this.workspace.blockDragSurface_.getGroup() : null; + + var element = this.getSvgRoot(); + if (element) { + do { + // Loop through this block and every parent. + var xy = Blockly.utils.getRelativeXY(element); + x += xy.x; + y += xy.y; + // If this element is the current element on the drag surface, include + // the translation of the drag surface itself. + if (this.useDragSurface_ && + this.workspace.blockDragSurface_.getCurrentBlock() == element) { + var surfaceTranslation = this.workspace.blockDragSurface_.getSurfaceTranslation(); + x += surfaceTranslation.x; + y += surfaceTranslation.y; + } + element = element.parentNode; + } while (element && element != this.workspace.getCanvas() && + element != dragSurfaceGroup); + } + return new goog.math.Coordinate(x, y); +}; + +/** + * Move a block by a relative offset. + * @param {number} dx Horizontal offset. + * @param {number} dy Vertical offset. + */ +Blockly.BlockSvg.prototype.moveBy = function(dx, dy) { + goog.asserts.assert(!this.parentBlock_, 'Block has parent.'); + var event = new Blockly.Events.Move(this); + var xy = this.getRelativeToSurfaceXY(); + this.translate(xy.x + dx, xy.y + dy); + this.moveConnections_(dx, dy); + event.recordNew(); + this.workspace.resizeContents(); + Blockly.Events.fire(event); +}; + +/** + * Transforms a block by setting the translation on the transform attribute + * of the block's SVG. + * @param {number} x The x coordinate of the translation. + * @param {number} y The y coordinate of the translation. + */ +Blockly.BlockSvg.prototype.translate = function(x, y) { + this.getSvgRoot().setAttribute('transform', + 'translate(' + x + ',' + y + ')'); +}; + +/** + * Move this block to its workspace's drag surface, accounting for positioning. + * Generally should be called at the same time as setDragging_(true). + * Does nothing if useDragSurface_ is false. + * @private + */ +Blockly.BlockSvg.prototype.moveToDragSurface_ = function() { + if (!this.useDragSurface_) { + return; + } + // The translation for drag surface blocks, + // is equal to the current relative-to-surface position, + // to keep the position in sync as it move on/off the surface. + var xy = this.getRelativeToSurfaceXY(); + this.clearTransformAttributes_(); + this.workspace.blockDragSurface_.translateSurface(xy.x, xy.y); + // Execute the move on the top-level SVG component + this.workspace.blockDragSurface_.setBlocksAndShow(this.getSvgRoot()); +}; + +/** + * Move this block back to the workspace block canvas. + * Generally should be called at the same time as setDragging_(false). + * Does nothing if useDragSurface_ is false. + * @private + */ +Blockly.BlockSvg.prototype.moveOffDragSurface_ = function() { + if (!this.useDragSurface_) { + return; + } + // Translate to current position, turning off 3d. + var xy = this.getRelativeToSurfaceXY(); + this.clearTransformAttributes_(); + this.translate(xy.x, xy.y); + this.workspace.blockDragSurface_.clearAndHide(this.workspace.getCanvas()); +}; + +/** + * Clear the block of transform="..." attributes. + * Used when the block is switching from 3d to 2d transform or vice versa. + * @private + */ +Blockly.BlockSvg.prototype.clearTransformAttributes_ = function() { + Blockly.utils.removeAttribute(this.getSvgRoot(), 'transform'); +}; + +/** + * Snap this block to the nearest grid point. + */ +Blockly.BlockSvg.prototype.snapToGrid = function() { + if (!this.workspace) { + return; // Deleted block. + } + if (Blockly.dragMode_ != Blockly.DRAG_NONE) { + return; // Don't bump blocks during a drag. + } + if (this.getParent()) { + return; // Only snap top-level blocks. + } + if (this.isInFlyout) { + return; // Don't move blocks around in a flyout. + } + if (!this.workspace.options.gridOptions || + !this.workspace.options.gridOptions['snap']) { + return; // Config says no snapping. + } + var spacing = this.workspace.options.gridOptions['spacing']; + var half = spacing / 2; + var xy = this.getRelativeToSurfaceXY(); + var dx = Math.round((xy.x - half) / spacing) * spacing + half - xy.x; + var dy = Math.round((xy.y - half) / spacing) * spacing + half - xy.y; + dx = Math.round(dx); + dy = Math.round(dy); + if (dx != 0 || dy != 0) { + this.moveBy(dx, dy); + } +}; + +/** + * Returns a bounding box describing the dimensions of this block + * and any blocks stacked below it. + * @return {!{height: number, width: number}} Object with height and width + * properties. + */ +Blockly.BlockSvg.prototype.getHeightWidth = function() { + var height = this.height; + var width = this.width; + // Recursively add size of subsequent blocks. + var nextBlock = this.getNextBlock(); + if (nextBlock) { + var nextHeightWidth = nextBlock.getHeightWidth(); + height += nextHeightWidth.height - 4; // Height of tab. + width = Math.max(width, nextHeightWidth.width); + } else if (!this.nextConnection && !this.outputConnection) { + // Add a bit of margin under blocks with no bottom tab. + height += 2; + } + return {height: height, width: width}; +}; + +/** + * Returns the coordinates of a bounding box describing the dimensions of this + * block and any blocks stacked below it. + * @return {!{topLeft: goog.math.Coordinate, bottomRight: goog.math.Coordinate}} + * Object with top left and bottom right coordinates of the bounding box. + */ +Blockly.BlockSvg.prototype.getBoundingRectangle = function() { + var blockXY = this.getRelativeToSurfaceXY(this); + var tab = this.outputConnection ? Blockly.BlockSvg.TAB_WIDTH : 0; + var blockBounds = this.getHeightWidth(); + var topLeft; + var bottomRight; + if (this.RTL) { + // Width has the tab built into it already so subtract it here. + topLeft = new goog.math.Coordinate(blockXY.x - (blockBounds.width - tab), + blockXY.y); + // Add the width of the tab/puzzle piece knob to the x coordinate + // since X is the corner of the rectangle, not the whole puzzle piece. + bottomRight = new goog.math.Coordinate(blockXY.x + tab, + blockXY.y + blockBounds.height); + } else { + // Subtract the width of the tab/puzzle piece knob to the x coordinate + // since X is the corner of the rectangle, not the whole puzzle piece. + topLeft = new goog.math.Coordinate(blockXY.x - tab, blockXY.y); + // Width has the tab built into it already so subtract it here. + bottomRight = new goog.math.Coordinate(blockXY.x + blockBounds.width - tab, + blockXY.y + blockBounds.height); + } + return {topLeft: topLeft, bottomRight: bottomRight}; +}; + +/** + * Set whether the block is collapsed or not. + * @param {boolean} collapsed True if collapsed. + */ +Blockly.BlockSvg.prototype.setCollapsed = function(collapsed) { + if (this.collapsed_ == collapsed) { + return; + } + var renderList = []; + // Show/hide the inputs. + for (var i = 0, input; input = this.inputList[i]; i++) { + renderList.push.apply(renderList, input.setVisible(!collapsed)); + } + + var COLLAPSED_INPUT_NAME = '_TEMP_COLLAPSED_INPUT'; + if (collapsed) { + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + icons[i].setVisible(false); + } + var text = this.toString(Blockly.COLLAPSE_CHARS); + this.appendDummyInput(COLLAPSED_INPUT_NAME).appendField(text).init(); + } else { + this.removeInput(COLLAPSED_INPUT_NAME); + // Clear any warnings inherited from enclosed blocks. + this.setWarningText(null); + } + Blockly.BlockSvg.superClass_.setCollapsed.call(this, collapsed); + + if (!renderList.length) { + // No child blocks, just render this block. + renderList[0] = this; + } + if (this.rendered) { + for (var i = 0, block; block = renderList[i]; i++) { + block.render(); + } + // Don't bump neighbours. + // Although bumping neighbours would make sense, users often collapse + // all their functions and store them next to each other. Expanding and + // bumping causes all their definitions to go out of alignment. + } +}; + +/** + * Open the next (or previous) FieldTextInput. + * @param {Blockly.Field|Blockly.Block} start Current location. + * @param {boolean} forward If true go forward, otherwise backward. + */ +Blockly.BlockSvg.prototype.tab = function(start, forward) { + // This function need not be efficient since it runs once on a keypress. + // Create an ordered list of all text fields and connected inputs. + var list = []; + for (var i = 0, input; input = this.inputList[i]; i++) { + for (var j = 0, field; field = input.fieldRow[j]; j++) { + if (field instanceof Blockly.FieldTextInput) { + // TODO: Also support dropdown fields. + list.push(field); + } + } + if (input.connection) { + var block = input.connection.targetBlock(); + if (block) { + list.push(block); + } + } + } + var i = list.indexOf(start); + if (i == -1) { + // No start location, start at the beginning or end. + i = forward ? -1 : list.length; + } + var target = list[forward ? i + 1 : i - 1]; + if (!target) { + // Ran off of list. + var parent = this.getParent(); + if (parent) { + parent.tab(this, forward); + } + } else if (target instanceof Blockly.Field) { + target.showEditor_(); + } else { + target.tab(null, forward); + } +}; + +/** + * Handle a mouse-down on an SVG block. + * @param {!Event} e Mouse down event or touch start event. + * @private + */ +Blockly.BlockSvg.prototype.onMouseDown_ = function(e) { + if (this.workspace.options.readOnly) { + return; + } + if (this.isInFlyout) { + // longStart's simulation of right-clicks for longpresses on touch devices + // calls the onMouseDown_ function defined on the prototype of the object + // the was longpressed (in this case, a Blockly.BlockSvg). In this case + // that behaviour is wrong, because Blockly.Flyout.prototype.blockMouseDown + // should be called for a mousedown on a block in the flyout, which blocks + // execution of the block's onMouseDown_ function. + if (e.type == 'touchstart' && Blockly.utils.isRightButton(e)) { + Blockly.Flyout.blockRightClick_(e, this); + e.stopPropagation(); + e.preventDefault(); + } + return; + } + if (this.isInMutator) { + // Mutator's coordinate system could be out of date because the bubble was + // dragged, the block was moved, the parent workspace zoomed, etc. + this.workspace.resize(); + } + + this.workspace.updateScreenCalculationsIfScrolled(); + this.workspace.markFocused(); + Blockly.terminateDrag_(); + this.select(); + Blockly.hideChaff(); + if (Blockly.utils.isRightButton(e)) { + // Right-click. + this.showContextMenu_(e); + // Click, not drag, so stop waiting for other touches from this identifier. + Blockly.Touch.clearTouchIdentifier(); + } else if (!this.isMovable()) { + // Allow immovable blocks to be selected and context menued, but not + // dragged. Let this event bubble up to document, so the workspace may be + // dragged instead. + return; + } else { + if (!Blockly.Events.getGroup()) { + Blockly.Events.setGroup(true); + } + // Left-click (or middle click) + Blockly.Css.setCursor(Blockly.Css.Cursor.CLOSED); + + this.dragStartXY_ = this.getRelativeToSurfaceXY(); + this.workspace.startDrag(e, this.dragStartXY_); + + Blockly.dragMode_ = Blockly.DRAG_STICKY; + Blockly.BlockSvg.onMouseUpWrapper_ = Blockly.bindEventWithChecks_(document, + 'mouseup', this, this.onMouseUp_); + Blockly.BlockSvg.onMouseMoveWrapper_ = Blockly.bindEventWithChecks_( + document, 'mousemove', this, this.onMouseMove_); + // Build a list of bubbles that need to be moved and where they started. + this.draggedBubbles_ = []; + var descendants = this.getDescendants(); + for (var i = 0, descendant; descendant = descendants[i]; i++) { + var icons = descendant.getIcons(); + for (var j = 0; j < icons.length; j++) { + var data = icons[j].getIconLocation(); + data.bubble = icons[j]; + this.draggedBubbles_.push(data); + } + } + } + // This event has been handled. No need to bubble up to the document. + e.stopPropagation(); + e.preventDefault(); +}; + +/** + * Handle a mouse-up anywhere in the SVG pane. Is only registered when a + * block is clicked. We can't use mouseUp on the block since a fast-moving + * cursor can briefly escape the block before it catches up. + * @param {!Event} e Mouse up event. + * @private + */ +Blockly.BlockSvg.prototype.onMouseUp_ = function(e) { + Blockly.Touch.clearTouchIdentifier(); + if (Blockly.dragMode_ != Blockly.DRAG_FREE && + !Blockly.WidgetDiv.isVisible()) { + Blockly.Events.fire( + new Blockly.Events.Ui(this, 'click', undefined, undefined)); + } + Blockly.terminateDrag_(); + + var deleteArea = this.workspace.isDeleteArea(e); + + // Connect to a nearby block, but not if it's over the toolbox. + if (Blockly.selected && Blockly.highlightedConnection_ && + deleteArea != Blockly.DELETE_AREA_TOOLBOX) { + // Connect two blocks together. + Blockly.localConnection_.connect(Blockly.highlightedConnection_); + if (this.rendered) { + // Trigger a connection animation. + // Determine which connection is inferior (lower in the source stack). + var inferiorConnection = Blockly.localConnection_.isSuperior() ? + Blockly.highlightedConnection_ : Blockly.localConnection_; + inferiorConnection.getSourceBlock().connectionUiEffect(); + } + if (this.workspace.trashcan) { + // Don't throw an object in the trash can if it just got connected. + this.workspace.trashcan.close(); + } + } else if (deleteArea && !this.getParent() && Blockly.selected.isDeletable()) { + // We didn't connect the block, and it was over the trash can or the + // toolbox. Delete it. + var trashcan = this.workspace.trashcan; + if (trashcan) { + goog.Timer.callOnce(trashcan.close, 100, trashcan); + } + Blockly.selected.dispose(false, true); + } + if (Blockly.highlightedConnection_) { + Blockly.highlightedConnection_.unhighlight(); + Blockly.highlightedConnection_ = null; + } + Blockly.Css.setCursor(Blockly.Css.Cursor.OPEN); + if (!Blockly.WidgetDiv.isVisible()) { + Blockly.Events.setGroup(false); + } +}; + +/** + * Load the block's help page in a new window. + * @private + */ +Blockly.BlockSvg.prototype.showHelp_ = function() { + var url = goog.isFunction(this.helpUrl) ? this.helpUrl() : this.helpUrl; + if (url) { + window.open(url); + } +}; + +/** + * Show the context menu for this block. + * @param {!Event} e Mouse event. + * @private + */ +Blockly.BlockSvg.prototype.showContextMenu_ = function(e) { + if (this.workspace.options.readOnly || !this.contextMenu) { + return; + } + // Save the current block in a variable for use in closures. + var block = this; + var menuOptions = []; + + if (this.isDeletable() && this.isMovable() && !block.isInFlyout) { + // Option to duplicate this block. + var duplicateOption = { + text: Blockly.Msg.DUPLICATE_BLOCK, + enabled: true, + callback: function() { + Blockly.duplicate_(block); + } + }; + if (this.getDescendants().length > this.workspace.remainingCapacity()) { + duplicateOption.enabled = false; + } + menuOptions.push(duplicateOption); + + if (this.isEditable() && !this.collapsed_ && + this.workspace.options.comments) { + // Option to add/remove a comment. + var commentOption = {enabled: !goog.userAgent.IE}; + if (this.comment) { + commentOption.text = Blockly.Msg.REMOVE_COMMENT; + commentOption.callback = function() { + block.setCommentText(null); + }; + } else { + commentOption.text = Blockly.Msg.ADD_COMMENT; + commentOption.callback = function() { + block.setCommentText(''); + }; + } + menuOptions.push(commentOption); + } + + // Option to make block inline. + if (!this.collapsed_) { + for (var i = 1; i < this.inputList.length; i++) { + if (this.inputList[i - 1].type != Blockly.NEXT_STATEMENT && + this.inputList[i].type != Blockly.NEXT_STATEMENT) { + // Only display this option if there are two value or dummy inputs + // next to each other. + var inlineOption = {enabled: true}; + var isInline = this.getInputsInline(); + inlineOption.text = isInline ? + Blockly.Msg.EXTERNAL_INPUTS : Blockly.Msg.INLINE_INPUTS; + inlineOption.callback = function() { + block.setInputsInline(!isInline); + }; + menuOptions.push(inlineOption); + break; + } + } + } + + if (this.workspace.options.collapse) { + // Option to collapse/expand block. + if (this.collapsed_) { + var expandOption = {enabled: true}; + expandOption.text = Blockly.Msg.EXPAND_BLOCK; + expandOption.callback = function() { + block.setCollapsed(false); + }; + menuOptions.push(expandOption); + } else { + var collapseOption = {enabled: true}; + collapseOption.text = Blockly.Msg.COLLAPSE_BLOCK; + collapseOption.callback = function() { + block.setCollapsed(true); + }; + menuOptions.push(collapseOption); + } + } + + if (this.workspace.options.disable) { + // Option to disable/enable block. + var disableOption = { + text: this.disabled ? + Blockly.Msg.ENABLE_BLOCK : Blockly.Msg.DISABLE_BLOCK, + enabled: !this.getInheritedDisabled(), + callback: function() { + block.setDisabled(!block.disabled); + } + }; + menuOptions.push(disableOption); + } + + // Option to delete this block. + // Count the number of blocks that are nested in this block. + var descendantCount = this.getDescendants().length; + var nextBlock = this.getNextBlock(); + if (nextBlock) { + // Blocks in the current stack would survive this block's deletion. + descendantCount -= nextBlock.getDescendants().length; + } + var deleteOption = { + text: descendantCount == 1 ? Blockly.Msg.DELETE_BLOCK : + Blockly.Msg.DELETE_X_BLOCKS.replace('%1', String(descendantCount)), + enabled: true, + callback: function() { + Blockly.Events.setGroup(true); + block.dispose(true, true); + Blockly.Events.setGroup(false); + } + }; + menuOptions.push(deleteOption); + } + + // Option to get help. + var url = goog.isFunction(this.helpUrl) ? this.helpUrl() : this.helpUrl; + var helpOption = {enabled: !!url}; + helpOption.text = Blockly.Msg.HELP; + helpOption.callback = function() { + block.showHelp_(); + }; + menuOptions.push(helpOption); + + // Allow the block to add or modify menuOptions. + if (this.customContextMenu && !block.isInFlyout) { + this.customContextMenu(menuOptions); + } + + Blockly.ContextMenu.show(e, menuOptions, this.RTL); + Blockly.ContextMenu.currentBlock = this; +}; + +/** + * Move the connections for this block and all blocks attached under it. + * Also update any attached bubbles. + * @param {number} dx Horizontal offset from current location. + * @param {number} dy Vertical offset from current location. + * @private + */ +Blockly.BlockSvg.prototype.moveConnections_ = function(dx, dy) { + if (!this.rendered) { + // Rendering is required to lay out the blocks. + // This is probably an invisible block attached to a collapsed block. + return; + } + var myConnections = this.getConnections_(false); + for (var i = 0; i < myConnections.length; i++) { + myConnections[i].moveBy(dx, dy); + } + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + icons[i].computeIconLocation(); + } + + // Recurse through all blocks attached under this one. + for (var i = 0; i < this.childBlocks_.length; i++) { + this.childBlocks_[i].moveConnections_(dx, dy); + } +}; + +/** + * Recursively adds or removes the dragging class to this node and its children. + * @param {boolean} adding True if adding, false if removing. + * @private + */ +Blockly.BlockSvg.prototype.setDragging_ = function(adding) { + if (adding) { + var group = this.getSvgRoot(); + group.translate_ = ''; + group.skew_ = ''; + Blockly.draggingConnections_ = + Blockly.draggingConnections_.concat(this.getConnections_(true)); + Blockly.utils.addClass(/** @type {!Element} */ (this.svgGroup_), + 'blocklyDragging'); + } else { + Blockly.draggingConnections_ = []; + Blockly.utils.removeClass(/** @type {!Element} */ (this.svgGroup_), + 'blocklyDragging'); + } + // Recurse through all blocks attached under this one. + for (var i = 0; i < this.childBlocks_.length; i++) { + this.childBlocks_[i].setDragging_(adding); + } +}; + +/** + * Drag this block to follow the mouse. + * @param {!Event} e Mouse move event. + * @private + */ +Blockly.BlockSvg.prototype.onMouseMove_ = function(e) { + if (e.type == 'mousemove' && e.clientX <= 1 && e.clientY == 0 && + e.button == 0) { + /* HACK: + Safari Mobile 6.0 and Chrome for Android 18.0 fire rogue mousemove + events on certain touch actions. Ignore events with these signatures. + This may result in a one-pixel blind spot in other browsers, + but this shouldn't be noticeable. */ + e.stopPropagation(); + return; + } + + var oldXY = this.getRelativeToSurfaceXY(); + var newXY = this.workspace.moveDrag(e); + + if (Blockly.dragMode_ == Blockly.DRAG_STICKY) { + // Still dragging within the sticky DRAG_RADIUS. + var dr = goog.math.Coordinate.distance(oldXY, newXY) * this.workspace.scale; + if (dr > Blockly.DRAG_RADIUS) { + // Switch to unrestricted dragging. + Blockly.dragMode_ = Blockly.DRAG_FREE; + Blockly.longStop_(); + this.workspace.setResizesEnabled(false); + + var disconnectEffect = !!this.parentBlock_; + // If in a stack, either split the stack, or pull out single block. + var healStack = !Blockly.DRAG_STACK; + if (e.altKey || e.ctrlKey || e.metaKey) { + healStack = !healStack; + } + // Push this block to the very top of the stack. + this.unplug(healStack); + if (disconnectEffect) { + var group = this.getSvgRoot(); + group.translate_ = 'translate(' + newXY.x + ',' + newXY.y + ')'; + this.disconnectUiEffect(); + } + this.setDragging_(true); + this.moveToDragSurface_(); + } + } + if (Blockly.dragMode_ == Blockly.DRAG_FREE) { + // Unrestricted dragging. + var dxy = goog.math.Coordinate.difference(oldXY, this.dragStartXY_); + var group = this.getSvgRoot(); + if (this.useDragSurface_) { + this.workspace.blockDragSurface_.translateSurface(newXY.x, newXY.y); + } else { + group.translate_ = 'translate(' + newXY.x + ',' + newXY.y + ')'; + group.setAttribute('transform', group.translate_ + group.skew_); + } + // Drag all the nested bubbles. + for (var i = 0; i < this.draggedBubbles_.length; i++) { + var commentData = this.draggedBubbles_[i]; + commentData.bubble.setIconLocation( + goog.math.Coordinate.sum(commentData, dxy)); + } + + // Check to see if any of this block's connections are within range of + // another block's connection. + var myConnections = this.getConnections_(false); + // Also check the last connection on this stack + var lastOnStack = this.lastConnectionInStack_(); + if (lastOnStack && lastOnStack != this.nextConnection) { + myConnections.push(lastOnStack); + } + var closestConnection = null; + var localConnection = null; + var radiusConnection = Blockly.SNAP_RADIUS; + for (var i = 0; i < myConnections.length; i++) { + var myConnection = myConnections[i]; + var neighbour = myConnection.closest(radiusConnection, dxy); + if (neighbour.connection) { + closestConnection = neighbour.connection; + localConnection = myConnection; + radiusConnection = neighbour.radius; + } + } + + // Remove connection highlighting if needed. + if (Blockly.highlightedConnection_ && + Blockly.highlightedConnection_ != closestConnection) { + Blockly.highlightedConnection_.unhighlight(); + Blockly.highlightedConnection_ = null; + Blockly.localConnection_ = null; + } + + var wouldDeleteBlock = this.updateCursor_(e, closestConnection); + + // Add connection highlighting if needed. + if (!wouldDeleteBlock && closestConnection && + closestConnection != Blockly.highlightedConnection_) { + closestConnection.highlight(); + Blockly.highlightedConnection_ = closestConnection; + Blockly.localConnection_ = localConnection; + } + } + // This event has been handled. No need to bubble up to the document. + e.stopPropagation(); + e.preventDefault(); +}; + +/** + * Provide visual indication of whether the block will be deleted if + * dropped here. + * Prefer connecting over dropping into the trash can, but prefer dragging to + * the toolbox over connecting to other blocks. + * @param {!Event} e Mouse move event. + * @param {Blockly.Connection} closestConnection The connection this block would + * potentially connect to if dropped here, or null. + * @return {boolean} True if the block would be deleted if dropped here, + * otherwise false. + * @private + */ +Blockly.BlockSvg.prototype.updateCursor_ = function(e, closestConnection) { + var deleteArea = this.workspace.isDeleteArea(e); + var wouldConnect = Blockly.selected && closestConnection && + deleteArea != Blockly.DELETE_AREA_TOOLBOX; + var wouldDelete = deleteArea && !this.getParent() && + Blockly.selected.isDeletable(); + var showDeleteCursor = wouldDelete && !wouldConnect; + + if (showDeleteCursor) { + Blockly.Css.setCursor(Blockly.Css.Cursor.DELETE); + if (deleteArea == Blockly.DELETE_AREA_TRASH && this.workspace.trashcan) { + this.workspace.trashcan.setOpen_(true); + } + return true; + } else { + Blockly.Css.setCursor(Blockly.Css.Cursor.CLOSED); + if (this.workspace.trashcan) { + this.workspace.trashcan.setOpen_(false); + } + return false; + } +}; + +/** + * Add or remove the UI indicating if this block is movable or not. + */ +Blockly.BlockSvg.prototype.updateMovable = function() { + if (this.isMovable()) { + Blockly.utils.addClass(/** @type {!Element} */ (this.svgGroup_), + 'blocklyDraggable'); + } else { + Blockly.utils.removeClass(/** @type {!Element} */ (this.svgGroup_), + 'blocklyDraggable'); + } +}; + +/** + * Set whether this block is movable or not. + * @param {boolean} movable True if movable. + */ +Blockly.BlockSvg.prototype.setMovable = function(movable) { + Blockly.BlockSvg.superClass_.setMovable.call(this, movable); + this.updateMovable(); +}; + +/** + * Set whether this block is editable or not. + * @param {boolean} editable True if editable. + */ +Blockly.BlockSvg.prototype.setEditable = function(editable) { + Blockly.BlockSvg.superClass_.setEditable.call(this, editable); + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + icons[i].updateEditable(); + } +}; + +/** + * Set whether this block is a shadow block or not. + * @param {boolean} shadow True if a shadow. + */ +Blockly.BlockSvg.prototype.setShadow = function(shadow) { + Blockly.BlockSvg.superClass_.setShadow.call(this, shadow); + this.updateColour(); +}; + +/** + * Return the root node of the SVG or null if none exists. + * @return {Element} The root SVG node (probably a group). + */ +Blockly.BlockSvg.prototype.getSvgRoot = function() { + return this.svgGroup_; +}; + +/** + * Dispose of this block. + * @param {boolean} healStack If true, then try to heal any gap by connecting + * the next statement with the previous statement. Otherwise, dispose of + * all children of this block. + * @param {boolean} animate If true, show a disposal animation and sound. + */ +Blockly.BlockSvg.prototype.dispose = function(healStack, animate) { + if (!this.workspace) { + // The block has already been deleted. + return; + } + Blockly.Tooltip.hide(); + Blockly.Field.startCache(); + // Save the block's workspace temporarily so we can resize the + // contents once the block is disposed. + var blockWorkspace = this.workspace; + // If this block is being dragged, unlink the mouse events. + if (Blockly.selected == this) { + this.unselect(); + Blockly.terminateDrag_(); + } + // If this block has a context menu open, close it. + if (Blockly.ContextMenu.currentBlock == this) { + Blockly.ContextMenu.hide(); + } + + if (animate && this.rendered) { + this.unplug(healStack); + this.disposeUiEffect(); + } + // Stop rerendering. + this.rendered = false; + + Blockly.Events.disable(); + try { + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + icons[i].dispose(); + } + } finally { + Blockly.Events.enable(); + } + Blockly.BlockSvg.superClass_.dispose.call(this, healStack); + + goog.dom.removeNode(this.svgGroup_); + blockWorkspace.resizeContents(); + // Sever JavaScript to DOM connections. + this.svgGroup_ = null; + this.svgPath_ = null; + this.svgPathLight_ = null; + this.svgPathDark_ = null; + Blockly.Field.stopCache(); +}; + +/** + * Play some UI effects (sound, animation) when disposing of a block. + */ +Blockly.BlockSvg.prototype.disposeUiEffect = function() { + this.workspace.playAudio('delete'); + + var xy = this.workspace.getSvgXY(/** @type {!Element} */ (this.svgGroup_)); + // Deeply clone the current block. + var clone = this.svgGroup_.cloneNode(true); + clone.translateX_ = xy.x; + clone.translateY_ = xy.y; + clone.setAttribute('transform', + 'translate(' + clone.translateX_ + ',' + clone.translateY_ + ')'); + this.workspace.getParentSvg().appendChild(clone); + clone.bBox_ = clone.getBBox(); + // Start the animation. + Blockly.BlockSvg.disposeUiStep_(clone, this.RTL, new Date, + this.workspace.scale); +}; + +/** + * Animate a cloned block and eventually dispose of it. + * This is a class method, not an instance method since the original block has + * been destroyed and is no longer accessible. + * @param {!Element} clone SVG element to animate and dispose of. + * @param {boolean} rtl True if RTL, false if LTR. + * @param {!Date} start Date of animation's start. + * @param {number} workspaceScale Scale of workspace. + * @private + */ +Blockly.BlockSvg.disposeUiStep_ = function(clone, rtl, start, workspaceScale) { + var ms = new Date - start; + var percent = ms / 150; + if (percent > 1) { + goog.dom.removeNode(clone); + } else { + var x = clone.translateX_ + + (rtl ? -1 : 1) * clone.bBox_.width * workspaceScale / 2 * percent; + var y = clone.translateY_ + clone.bBox_.height * workspaceScale * percent; + var scale = (1 - percent) * workspaceScale; + clone.setAttribute('transform', 'translate(' + x + ',' + y + ')' + + ' scale(' + scale + ')'); + var closure = function() { + Blockly.BlockSvg.disposeUiStep_(clone, rtl, start, workspaceScale); + }; + setTimeout(closure, 10); + } +}; + +/** + * Play some UI effects (sound, ripple) after a connection has been established. + */ +Blockly.BlockSvg.prototype.connectionUiEffect = function() { + this.workspace.playAudio('click'); + if (this.workspace.scale < 1) { + return; // Too small to care about visual effects. + } + // Determine the absolute coordinates of the inferior block. + var xy = this.workspace.getSvgXY(/** @type {!Element} */ (this.svgGroup_)); + // Offset the coordinates based on the two connection types, fix scale. + if (this.outputConnection) { + xy.x += (this.RTL ? 3 : -3) * this.workspace.scale; + xy.y += 13 * this.workspace.scale; + } else if (this.previousConnection) { + xy.x += (this.RTL ? -23 : 23) * this.workspace.scale; + xy.y += 3 * this.workspace.scale; + } + var ripple = Blockly.utils.createSvgElement('circle', + {'cx': xy.x, 'cy': xy.y, 'r': 0, 'fill': 'none', + 'stroke': '#888', 'stroke-width': 10}, + this.workspace.getParentSvg()); + // Start the animation. + Blockly.BlockSvg.connectionUiStep_(ripple, new Date, this.workspace.scale); +}; + +/** + * Expand a ripple around a connection. + * @param {!Element} ripple Element to animate. + * @param {!Date} start Date of animation's start. + * @param {number} workspaceScale Scale of workspace. + * @private + */ +Blockly.BlockSvg.connectionUiStep_ = function(ripple, start, workspaceScale) { + var ms = new Date - start; + var percent = ms / 150; + if (percent > 1) { + goog.dom.removeNode(ripple); + } else { + ripple.setAttribute('r', percent * 25 * workspaceScale); + ripple.style.opacity = 1 - percent; + var closure = function() { + Blockly.BlockSvg.connectionUiStep_(ripple, start, workspaceScale); + }; + Blockly.BlockSvg.disconnectUiStop_.pid_ = setTimeout(closure, 10); + } +}; + +/** + * Play some UI effects (sound, animation) when disconnecting a block. + */ +Blockly.BlockSvg.prototype.disconnectUiEffect = function() { + this.workspace.playAudio('disconnect'); + if (this.workspace.scale < 1) { + return; // Too small to care about visual effects. + } + // Horizontal distance for bottom of block to wiggle. + var DISPLACEMENT = 10; + // Scale magnitude of skew to height of block. + var height = this.getHeightWidth().height; + var magnitude = Math.atan(DISPLACEMENT / height) / Math.PI * 180; + if (!this.RTL) { + magnitude *= -1; + } + // Start the animation. + Blockly.BlockSvg.disconnectUiStep_(this.svgGroup_, magnitude, new Date); +}; + +/** + * Animate a brief wiggle of a disconnected block. + * @param {!Element} group SVG element to animate. + * @param {number} magnitude Maximum degrees skew (reversed for RTL). + * @param {!Date} start Date of animation's start. + * @private + */ +Blockly.BlockSvg.disconnectUiStep_ = function(group, magnitude, start) { + var DURATION = 200; // Milliseconds. + var WIGGLES = 3; // Half oscillations. + + var ms = new Date - start; + var percent = ms / DURATION; + + if (percent > 1) { + group.skew_ = ''; + } else { + var skew = Math.round(Math.sin(percent * Math.PI * WIGGLES) * + (1 - percent) * magnitude); + group.skew_ = 'skewX(' + skew + ')'; + var closure = function() { + Blockly.BlockSvg.disconnectUiStep_(group, magnitude, start); + }; + Blockly.BlockSvg.disconnectUiStop_.group = group; + Blockly.BlockSvg.disconnectUiStop_.pid = setTimeout(closure, 10); + } + group.setAttribute('transform', group.translate_ + group.skew_); +}; + +/** + * Stop the disconnect UI animation immediately. + * @private + */ +Blockly.BlockSvg.disconnectUiStop_ = function() { + if (Blockly.BlockSvg.disconnectUiStop_.group) { + clearTimeout(Blockly.BlockSvg.disconnectUiStop_.pid); + var group = Blockly.BlockSvg.disconnectUiStop_.group; + group.skew_ = ''; + group.setAttribute('transform', group.translate_); + Blockly.BlockSvg.disconnectUiStop_.group = null; + } +}; + +/** + * PID of disconnect UI animation. There can only be one at a time. + * @type {number} + */ +Blockly.BlockSvg.disconnectUiStop_.pid = 0; + +/** + * SVG group of wobbling block. There can only be one at a time. + * @type {Element} + */ +Blockly.BlockSvg.disconnectUiStop_.group = null; + +/** + * Change the colour of a block. + */ +Blockly.BlockSvg.prototype.updateColour = function() { + if (this.disabled) { + // Disabled blocks don't have colour. + return; + } + var hexColour = this.getColour(); + var rgb = goog.color.hexToRgb(hexColour); + if (this.isShadow()) { + rgb = goog.color.lighten(rgb, 0.6); + hexColour = goog.color.rgbArrayToHex(rgb); + this.svgPathLight_.style.display = 'none'; + this.svgPathDark_.setAttribute('fill', hexColour); + } else { + this.svgPathLight_.style.display = ''; + var hexLight = goog.color.rgbArrayToHex(goog.color.lighten(rgb, 0.3)); + var hexDark = goog.color.rgbArrayToHex(goog.color.darken(rgb, 0.2)); + this.svgPathLight_.setAttribute('stroke', hexLight); + this.svgPathDark_.setAttribute('fill', hexDark); + } + this.svgPath_.setAttribute('fill', hexColour); + + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + icons[i].updateColour(); + } + + // Bump every dropdown to change its colour. + for (var x = 0, input; input = this.inputList[x]; x++) { + for (var y = 0, field; field = input.fieldRow[y]; y++) { + field.setText(null); + } + } +}; + +/** + * Enable or disable a block. + */ +Blockly.BlockSvg.prototype.updateDisabled = function() { + if (this.disabled || this.getInheritedDisabled()) { + if (Blockly.utils.addClass(/** @type {!Element} */ (this.svgGroup_), + 'blocklyDisabled')) { + this.svgPath_.setAttribute('fill', + 'url(#' + this.workspace.options.disabledPatternId + ')'); + } + } else { + if (Blockly.utils.removeClass(/** @type {!Element} */ (this.svgGroup_), + 'blocklyDisabled')) { + this.updateColour(); + } + } + var children = this.getChildren(); + for (var i = 0, child; child = children[i]; i++) { + child.updateDisabled(); + } +}; + +/** + * Returns the comment on this block (or '' if none). + * @return {string} Block's comment. + */ +Blockly.BlockSvg.prototype.getCommentText = function() { + if (this.comment) { + var comment = this.comment.getText(); + // Trim off trailing whitespace. + return comment.replace(/\s+$/, '').replace(/ +\n/g, '\n'); + } + return ''; +}; + +/** + * Set this block's comment text. + * @param {?string} text The text, or null to delete. + */ +Blockly.BlockSvg.prototype.setCommentText = function(text) { + var changedState = false; + if (goog.isString(text)) { + if (!this.comment) { + this.comment = new Blockly.Comment(this); + changedState = true; + } + this.comment.setText(/** @type {string} */ (text)); + } else { + if (this.comment) { + this.comment.dispose(); + changedState = true; + } + } + if (changedState && this.rendered) { + this.render(); + // Adding or removing a comment icon will cause the block to change shape. + this.bumpNeighbours_(); + } +}; + +/** + * Set this block's warning text. + * @param {?string} text The text, or null to delete. + * @param {string=} opt_id An optional ID for the warning text to be able to + * maintain multiple warnings. + */ +Blockly.BlockSvg.prototype.setWarningText = function(text, opt_id) { + if (!this.setWarningText.pid_) { + // Create a database of warning PIDs. + // Only runs once per block (and only those with warnings). + this.setWarningText.pid_ = Object.create(null); + } + var id = opt_id || ''; + if (!id) { + // Kill all previous pending processes, this edit supersedes them all. + for (var n in this.setWarningText.pid_) { + clearTimeout(this.setWarningText.pid_[n]); + delete this.setWarningText.pid_[n]; + } + } else if (this.setWarningText.pid_[id]) { + // Only queue up the latest change. Kill any earlier pending process. + clearTimeout(this.setWarningText.pid_[id]); + delete this.setWarningText.pid_[id]; + } + if (Blockly.dragMode_ == Blockly.DRAG_FREE) { + // Don't change the warning text during a drag. + // Wait until the drag finishes. + var thisBlock = this; + this.setWarningText.pid_[id] = setTimeout(function() { + if (thisBlock.workspace) { // Check block wasn't deleted. + delete thisBlock.setWarningText.pid_[id]; + thisBlock.setWarningText(text, id); + } + }, 100); + return; + } + if (this.isInFlyout) { + text = null; + } + + // Bubble up to add a warning on top-most collapsed block. + var parent = this.getSurroundParent(); + var collapsedParent = null; + while (parent) { + if (parent.isCollapsed()) { + collapsedParent = parent; + } + parent = parent.getSurroundParent(); + } + if (collapsedParent) { + collapsedParent.setWarningText(text, 'collapsed ' + this.id + ' ' + id); + } + + var changedState = false; + if (goog.isString(text)) { + if (!this.warning) { + this.warning = new Blockly.Warning(this); + changedState = true; + } + this.warning.setText(/** @type {string} */ (text), id); + } else { + // Dispose all warnings if no id is given. + if (this.warning && !id) { + this.warning.dispose(); + changedState = true; + } else if (this.warning) { + var oldText = this.warning.getText(); + this.warning.setText('', id); + var newText = this.warning.getText(); + if (!newText) { + this.warning.dispose(); + } + changedState = oldText != newText; + } + } + if (changedState && this.rendered) { + this.render(); + // Adding or removing a warning icon will cause the block to change shape. + this.bumpNeighbours_(); + } +}; + +/** + * Give this block a mutator dialog. + * @param {Blockly.Mutator} mutator A mutator dialog instance or null to remove. + */ +Blockly.BlockSvg.prototype.setMutator = function(mutator) { + if (this.mutator && this.mutator !== mutator) { + this.mutator.dispose(); + } + if (mutator) { + mutator.block_ = this; + this.mutator = mutator; + mutator.createIcon(); + } +}; + +/** + * Set whether the block is disabled or not. + * @param {boolean} disabled True if disabled. + */ +Blockly.BlockSvg.prototype.setDisabled = function(disabled) { + if (this.disabled != disabled) { + Blockly.BlockSvg.superClass_.setDisabled.call(this, disabled); + if (this.rendered) { + this.updateDisabled(); + } + } +}; + +/** + * Set whether the block is highlighted or not. Block highlighting is + * often used to visually mark blocks currently being executed. + * @param {boolean} highlighted True if highlighted. + */ +Blockly.BlockSvg.prototype.setHighlighted = function(highlighted) { + if (!this.rendered) { + return; + } + if (highlighted) { + this.svgPath_.setAttribute('filter', + 'url(#' + this.workspace.options.embossFilterId + ')'); + this.svgPathLight_.style.display = 'none'; + } else { + Blockly.utils.removeAttribute(this.svgPath_, 'filter'); + delete this.svgPathLight_.style.display; + } +}; + +/** + * Select this block. Highlight it visually. + */ +Blockly.BlockSvg.prototype.addSelect = function() { + Blockly.utils.addClass(/** @type {!Element} */ (this.svgGroup_), + 'blocklySelected'); + // Move the selected block to the top of the stack. + var block = this; + do { + var root = block.getSvgRoot(); + root.parentNode.appendChild(root); + block = block.getParent(); + } while (block); +}; + +/** + * Unselect this block. Remove its highlighting. + */ +Blockly.BlockSvg.prototype.removeSelect = function() { + Blockly.utils.removeClass(/** @type {!Element} */ (this.svgGroup_), + 'blocklySelected'); +}; + +// Overrides of functions on Blockly.Block that take into account whether the +// block has been rendered. + +/** + * Change the colour of a block. + * @param {number|string} colour HSV hue value, or #RRGGBB string. + */ +Blockly.BlockSvg.prototype.setColour = function(colour) { + Blockly.BlockSvg.superClass_.setColour.call(this, colour); + + if (this.rendered) { + this.updateColour(); + } +}; + +/** + * Set whether this block can chain onto the bottom of another block. + * @param {boolean} newBoolean True if there can be a previous statement. + * @param {string|Array.|null|undefined} opt_check Statement type or + * list of statement types. Null/undefined if any type could be connected. + */ +Blockly.BlockSvg.prototype.setPreviousStatement = + function(newBoolean, opt_check) { + /* eslint-disable indent */ + Blockly.BlockSvg.superClass_.setPreviousStatement.call(this, newBoolean, + opt_check); + + if (this.rendered) { + this.render(); + this.bumpNeighbours_(); + } +}; /* eslint-enable indent */ + +/** + * Set whether another block can chain onto the bottom of this block. + * @param {boolean} newBoolean True if there can be a next statement. + * @param {string|Array.|null|undefined} opt_check Statement type or + * list of statement types. Null/undefined if any type could be connected. + */ +Blockly.BlockSvg.prototype.setNextStatement = function(newBoolean, opt_check) { + Blockly.BlockSvg.superClass_.setNextStatement.call(this, newBoolean, + opt_check); + + if (this.rendered) { + this.render(); + this.bumpNeighbours_(); + } +}; + +/** + * Set whether this block returns a value. + * @param {boolean} newBoolean True if there is an output. + * @param {string|Array.|null|undefined} opt_check Returned type or list + * of returned types. Null or undefined if any type could be returned + * (e.g. variable get). + */ +Blockly.BlockSvg.prototype.setOutput = function(newBoolean, opt_check) { + Blockly.BlockSvg.superClass_.setOutput.call(this, newBoolean, opt_check); + + if (this.rendered) { + this.render(); + this.bumpNeighbours_(); + } +}; + +/** + * Set whether value inputs are arranged horizontally or vertically. + * @param {boolean} newBoolean True if inputs are horizontal. + */ +Blockly.BlockSvg.prototype.setInputsInline = function(newBoolean) { + Blockly.BlockSvg.superClass_.setInputsInline.call(this, newBoolean); + + if (this.rendered) { + this.render(); + this.bumpNeighbours_(); + } +}; + +/** + * Remove an input from this block. + * @param {string} name The name of the input. + * @param {boolean=} opt_quiet True to prevent error if input is not present. + * @throws {goog.asserts.AssertionError} if the input is not present and + * opt_quiet is not true. + */ +Blockly.BlockSvg.prototype.removeInput = function(name, opt_quiet) { + Blockly.BlockSvg.superClass_.removeInput.call(this, name, opt_quiet); + + if (this.rendered) { + this.render(); + // Removing an input will cause the block to change shape. + this.bumpNeighbours_(); + } +}; + +/** + * Move a numbered input to a different location on this block. + * @param {number} inputIndex Index of the input to move. + * @param {number} refIndex Index of input that should be after the moved input. + */ +Blockly.BlockSvg.prototype.moveNumberedInputBefore = function( + inputIndex, refIndex) { + Blockly.BlockSvg.superClass_.moveNumberedInputBefore.call(this, inputIndex, + refIndex); + + if (this.rendered) { + this.render(); + // Moving an input will cause the block to change shape. + this.bumpNeighbours_(); + } +}; + +/** + * Add a value input, statement input or local variable to this block. + * @param {number} type Either Blockly.INPUT_VALUE or Blockly.NEXT_STATEMENT or + * Blockly.DUMMY_INPUT. + * @param {string} name Language-neutral identifier which may used to find this + * input again. Should be unique to this block. + * @return {!Blockly.Input} The input object created. + * @private + */ +Blockly.BlockSvg.prototype.appendInput_ = function(type, name) { + var input = Blockly.BlockSvg.superClass_.appendInput_.call(this, type, name); + + if (this.rendered) { + this.render(); + // Adding an input will cause the block to change shape. + this.bumpNeighbours_(); + } + return input; +}; + +/** + * Returns connections originating from this block. + * @param {boolean} all If true, return all connections even hidden ones. + * Otherwise, for a non-rendered block return an empty list, and for a + * collapsed block don't return inputs connections. + * @return {!Array.} Array of connections. + * @private + */ +Blockly.BlockSvg.prototype.getConnections_ = function(all) { + var myConnections = []; + if (all || this.rendered) { + if (this.outputConnection) { + myConnections.push(this.outputConnection); + } + if (this.previousConnection) { + myConnections.push(this.previousConnection); + } + if (this.nextConnection) { + myConnections.push(this.nextConnection); + } + if (all || !this.collapsed_) { + for (var i = 0, input; input = this.inputList[i]; i++) { + if (input.connection) { + myConnections.push(input.connection); + } + } + } + } + return myConnections; +}; + +/** + * Create a connection of the specified type. + * @param {number} type The type of the connection to create. + * @return {!Blockly.RenderedConnection} A new connection of the specified type. + * @private + */ +Blockly.BlockSvg.prototype.makeConnection_ = function(type) { + return new Blockly.RenderedConnection(this, type); +}; diff --git a/src/opsoro/server/static/js/blockly/core/blockly.js b/src/opsoro/server/static/js/blockly/core/blockly.js new file mode 100644 index 0000000..54c8a5d --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/blockly.js @@ -0,0 +1,571 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2011 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Core JavaScript library for Blockly. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +/** + * The top level namespace used to access the Blockly library. + * @namespace Blockly + **/ +goog.provide('Blockly'); + +goog.require('Blockly.BlockSvg.render'); +goog.require('Blockly.Events'); +goog.require('Blockly.FieldAngle'); +goog.require('Blockly.FieldCheckbox'); +goog.require('Blockly.FieldColour'); +// Date picker commented out since it increases footprint by 60%. +// Add it only if you need it. +//goog.require('Blockly.FieldDate'); +goog.require('Blockly.FieldDropdown'); +goog.require('Blockly.FieldImage'); +goog.require('Blockly.FieldTextInput'); +goog.require('Blockly.FieldNumber'); +goog.require('Blockly.FieldVariable'); +goog.require('Blockly.Generator'); +goog.require('Blockly.Msg'); +goog.require('Blockly.Procedures'); +goog.require('Blockly.Toolbox'); +goog.require('Blockly.Touch'); +goog.require('Blockly.WidgetDiv'); +goog.require('Blockly.WorkspaceSvg'); +goog.require('Blockly.constants'); +goog.require('Blockly.inject'); +goog.require('Blockly.utils'); +goog.require('goog.color'); +goog.require('goog.userAgent'); + + +// Turn off debugging when compiled. +var CLOSURE_DEFINES = {'goog.DEBUG': false}; + +/** + * The main workspace most recently used. + * Set by Blockly.WorkspaceSvg.prototype.markFocused + * @type {Blockly.Workspace} + */ +Blockly.mainWorkspace = null; + +/** + * Currently selected block. + * @type {Blockly.Block} + */ +Blockly.selected = null; + +/** + * Currently highlighted connection (during a drag). + * @type {Blockly.Connection} + * @private + */ +Blockly.highlightedConnection_ = null; + +/** + * Connection on dragged block that matches the highlighted connection. + * @type {Blockly.Connection} + * @private + */ +Blockly.localConnection_ = null; + +/** + * All of the connections on blocks that are currently being dragged. + * @type {!Array.} + * @private + */ +Blockly.draggingConnections_ = []; + +/** + * Contents of the local clipboard. + * @type {Element} + * @private + */ +Blockly.clipboardXml_ = null; + +/** + * Source of the local clipboard. + * @type {Blockly.WorkspaceSvg} + * @private + */ +Blockly.clipboardSource_ = null; + +/** + * Is the mouse dragging a block? + * DRAG_NONE - No drag operation. + * DRAG_STICKY - Still inside the sticky DRAG_RADIUS. + * DRAG_FREE - Freely draggable. + * @private + */ +Blockly.dragMode_ = Blockly.DRAG_NONE; + +/** + * Cached value for whether 3D is supported. + * @type {!boolean} + * @private + */ +Blockly.cache3dSupported_ = null; + +/** + * Convert a hue (HSV model) into an RGB hex triplet. + * @param {number} hue Hue on a colour wheel (0-360). + * @return {string} RGB code, e.g. '#5ba65b'. + */ +Blockly.hueToRgb = function(hue) { + return goog.color.hsvToHex(hue, Blockly.HSV_SATURATION, + Blockly.HSV_VALUE * 255); +}; + +/** + * Returns the dimensions of the specified SVG image. + * @param {!Element} svg SVG image. + * @return {!Object} Contains width and height properties. + */ +Blockly.svgSize = function(svg) { + return {width: svg.cachedWidth_, + height: svg.cachedHeight_}; +}; + +/** + * Size the workspace when the contents change. This also updates + * scrollbars accordingly. + * @param {!Blockly.WorkspaceSvg} workspace The workspace to resize. + */ +Blockly.resizeSvgContents = function(workspace) { + workspace.resizeContents(); +}; + +/** + * Size the SVG image to completely fill its container. Call this when the view + * actually changes sizes (e.g. on a window resize/device orientation change). + * See Blockly.resizeSvgContents to resize the workspace when the contents + * change (e.g. when a block is added or removed). + * Record the height/width of the SVG image. + * @param {!Blockly.WorkspaceSvg} workspace Any workspace in the SVG. + */ +Blockly.svgResize = function(workspace) { + var mainWorkspace = workspace; + while (mainWorkspace.options.parentWorkspace) { + mainWorkspace = mainWorkspace.options.parentWorkspace; + } + var svg = mainWorkspace.getParentSvg(); + var div = svg.parentNode; + if (!div) { + // Workspace deleted, or something. + return; + } + var width = div.offsetWidth; + var height = div.offsetHeight; + if (svg.cachedWidth_ != width) { + svg.setAttribute('width', width + 'px'); + svg.cachedWidth_ = width; + } + if (svg.cachedHeight_ != height) { + svg.setAttribute('height', height + 'px'); + svg.cachedHeight_ = height; + } + mainWorkspace.resize(); +}; + +/** + * Handle a key-down on SVG drawing surface. + * @param {!Event} e Key down event. + * @private + */ +Blockly.onKeyDown_ = function(e) { + if (Blockly.mainWorkspace.options.readOnly || Blockly.utils.isTargetInput(e)) { + // No key actions on readonly workspaces. + // When focused on an HTML text input widget, don't trap any keys. + return; + } + var deleteBlock = false; + if (e.keyCode == 27) { + // Pressing esc closes the context menu. + Blockly.hideChaff(); + } else if (e.keyCode == 8 || e.keyCode == 46) { + // Delete or backspace. + // Stop the browser from going back to the previous page. + // Do this first to prevent an error in the delete code from resulting in + // data loss. + e.preventDefault(); + if (Blockly.selected && Blockly.selected.isDeletable()) { + deleteBlock = true; + } + } else if (e.altKey || e.ctrlKey || e.metaKey) { + if (Blockly.selected && + Blockly.selected.isDeletable() && Blockly.selected.isMovable()) { + if (e.keyCode == 67) { + // 'c' for copy. + Blockly.hideChaff(); + Blockly.copy_(Blockly.selected); + } else if (e.keyCode == 88) { + // 'x' for cut. + Blockly.copy_(Blockly.selected); + deleteBlock = true; + } + } + if (e.keyCode == 86) { + // 'v' for paste. + if (Blockly.clipboardXml_) { + Blockly.Events.setGroup(true); + Blockly.clipboardSource_.paste(Blockly.clipboardXml_); + Blockly.Events.setGroup(false); + } + } else if (e.keyCode == 90) { + // 'z' for undo 'Z' is for redo. + Blockly.hideChaff(); + Blockly.mainWorkspace.undo(e.shiftKey); + } + } + if (deleteBlock) { + // Common code for delete and cut. + Blockly.Events.setGroup(true); + Blockly.hideChaff(); + var heal = Blockly.dragMode_ != Blockly.DRAG_FREE; + Blockly.selected.dispose(heal, true); + if (Blockly.highlightedConnection_) { + Blockly.highlightedConnection_.unhighlight(); + Blockly.highlightedConnection_ = null; + } + Blockly.Events.setGroup(false); + } +}; + +/** + * Stop binding to the global mouseup and mousemove events. + * @private + */ +Blockly.terminateDrag_ = function() { + Blockly.BlockSvg.terminateDrag(); + Blockly.Flyout.terminateDrag_(); +}; + +/** + * Copy a block onto the local clipboard. + * @param {!Blockly.Block} block Block to be copied. + * @private + */ +Blockly.copy_ = function(block) { + var xmlBlock = Blockly.Xml.blockToDom(block); + if (Blockly.dragMode_ != Blockly.DRAG_FREE) { + Blockly.Xml.deleteNext(xmlBlock); + } + // Encode start position in XML. + var xy = block.getRelativeToSurfaceXY(); + xmlBlock.setAttribute('x', block.RTL ? -xy.x : xy.x); + xmlBlock.setAttribute('y', xy.y); + Blockly.clipboardXml_ = xmlBlock; + Blockly.clipboardSource_ = block.workspace; +}; + +/** + * Duplicate this block and its children. + * @param {!Blockly.Block} block Block to be copied. + * @private + */ +Blockly.duplicate_ = function(block) { + // Save the clipboard. + var clipboardXml = Blockly.clipboardXml_; + var clipboardSource = Blockly.clipboardSource_; + + // Create a duplicate via a copy/paste operation. + Blockly.copy_(block); + block.workspace.paste(Blockly.clipboardXml_); + + // Restore the clipboard. + Blockly.clipboardXml_ = clipboardXml; + Blockly.clipboardSource_ = clipboardSource; +}; + +/** + * Cancel the native context menu, unless the focus is on an HTML input widget. + * @param {!Event} e Mouse down event. + * @private + */ +Blockly.onContextMenu_ = function(e) { + if (!Blockly.utils.isTargetInput(e)) { + // When focused on an HTML text input widget, don't cancel the context menu. + e.preventDefault(); + } +}; + +/** + * Close tooltips, context menus, dropdown selections, etc. + * @param {boolean=} opt_allowToolbox If true, don't close the toolbox. + */ +Blockly.hideChaff = function(opt_allowToolbox) { + Blockly.Tooltip.hide(); + Blockly.WidgetDiv.hide(); + if (!opt_allowToolbox) { + var workspace = Blockly.getMainWorkspace(); + if (workspace.toolbox_ && + workspace.toolbox_.flyout_ && + workspace.toolbox_.flyout_.autoClose) { + workspace.toolbox_.clearSelection(); + } + } +}; + +/** + * When something in Blockly's workspace changes, call a function. + * @param {!Function} func Function to call. + * @return {!Array.} Opaque data that can be passed to + * removeChangeListener. + * @deprecated April 2015 + */ +Blockly.addChangeListener = function(func) { + // Backwards compatibility from before there could be multiple workspaces. + console.warn('Deprecated call to Blockly.addChangeListener, ' + + 'use workspace.addChangeListener instead.'); + return Blockly.getMainWorkspace().addChangeListener(func); +}; + +/** + * Returns the main workspace. Returns the last used main workspace (based on + * focus). Try not to use this function, particularly if there are multiple + * Blockly instances on a page. + * @return {!Blockly.Workspace} The main workspace. + */ +Blockly.getMainWorkspace = function() { + return Blockly.mainWorkspace; +}; + +/** + * Wrapper to window.alert() that app developers may override to + * provide alternatives to the modal browser window. + * @param {string} message The message to display to the user. + * @param {function()=} opt_callback The callback when the alert is dismissed. + */ +Blockly.alert = function(message, opt_callback) { + window.alert(message); + if (opt_callback) { + opt_callback(); + } +}; + +/** + * Wrapper to window.confirm() that app developers may override to + * provide alternatives to the modal browser window. + * @param {string} message The message to display to the user. + * @param {!function(boolean)} callback The callback for handling user response. + */ +Blockly.confirm = function(message, callback) { + callback(window.confirm(message)); +}; + +/** + * Wrapper to window.prompt() that app developers may override to provide + * alternatives to the modal browser window. Built-in browser prompts are + * often used for better text input experience on mobile device. We strongly + * recommend testing mobile when overriding this. + * @param {string} message The message to display to the user. + * @param {string} defaultValue The value to initialize the prompt with. + * @param {!function(string)} callback The callback for handling user response. + */ +Blockly.prompt = function(message, defaultValue, callback) { + callback(window.prompt(message, defaultValue)); +}; + +/** + * Helper function for defining a block from JSON. The resulting function has + * the correct value of jsonDef at the point in code where jsonInit is called. + * @param {!Object} jsonDef The JSON definition of a block. + * @return {function()} A function that calls jsonInit with the correct value + * of jsonDef. + * @private + */ +Blockly.jsonInitFactory_ = function(jsonDef) { + return function() { + this.jsonInit(jsonDef); + }; +}; + +/** + * Define blocks from an array of JSON block definitions, as might be generated + * by the Blockly Developer Tools. + * @param {!Array.} jsonArray An array of JSON block definitions. + */ +Blockly.defineBlocksWithJsonArray = function(jsonArray) { + for (var i = 0, elem; elem = jsonArray[i]; i++) { + var typename = elem.type; + if (typename == null || typename === '') { + console.warn('Block definition #' + i + + ' in JSON array is missing a type attribute. Skipping.'); + } else { + if (Blockly.Blocks[typename]) { + console.warn('Block definition #' + i + + ' in JSON array overwrites prior definition of "' + typename + '".'); + } + Blockly.Blocks[typename] = { + init: Blockly.jsonInitFactory_(elem) + }; + } + } +}; + +/** + * Bind an event to a function call. When calling the function, verifies that + * it belongs to the touch stream that is currently being processed, and splits + * multitouch events into multiple events as needed. + * @param {!Node} node Node upon which to listen. + * @param {string} name Event name to listen to (e.g. 'mousedown'). + * @param {Object} thisObject The value of 'this' in the function. + * @param {!Function} func Function to call when event is triggered. + * @param {boolean} opt_noCaptureIdentifier True if triggering on this event + * should not block execution of other event handlers on this touch or other + * simultaneous touches. + * @return {!Array.} Opaque data that can be passed to unbindEvent_. + * @private + */ +Blockly.bindEventWithChecks_ = function(node, name, thisObject, func, + opt_noCaptureIdentifier) { + var handled = false; + var wrapFunc = function(e) { + var captureIdentifier = !opt_noCaptureIdentifier; + // Handle each touch point separately. If the event was a mouse event, this + // will hand back an array with one element, which we're fine handling. + var events = Blockly.Touch.splitEventByTouches(e); + for (var i = 0, event; event = events[i]; i++) { + if (captureIdentifier && !Blockly.Touch.shouldHandleEvent(event)) { + continue; + } + Blockly.Touch.setClientFromTouch(event); + if (thisObject) { + func.call(thisObject, event); + } else { + func(event); + } + handled = true; + } + }; + + node.addEventListener(name, wrapFunc, false); + var bindData = [[node, name, wrapFunc]]; + + // Add equivalent touch event. + if (name in Blockly.Touch.TOUCH_MAP) { + var touchWrapFunc = function(e) { + wrapFunc(e); + // Stop the browser from scrolling/zooming the page. + if (handled) { + e.preventDefault(); + } + }; + for (var i = 0, eventName; + eventName = Blockly.Touch.TOUCH_MAP[name][i]; i++) { + node.addEventListener(eventName, touchWrapFunc, false); + bindData.push([node, eventName, touchWrapFunc]); + } + } + return bindData; +}; + + +/** + * Bind an event to a function call. Handles multitouch events by using the + * coordinates of the first changed touch, and doesn't do any safety checks for + * simultaneous event processing. + * @deprecated in favor of bindEventWithChecks_, but preserved for external + * users. + * @param {!Node} node Node upon which to listen. + * @param {string} name Event name to listen to (e.g. 'mousedown'). + * @param {Object} thisObject The value of 'this' in the function. + * @param {!Function} func Function to call when event is triggered. + * @return {!Array.} Opaque data that can be passed to unbindEvent_. + * @private + */ +Blockly.bindEvent_ = function(node, name, thisObject, func) { + var wrapFunc = function(e) { + if (thisObject) { + func.call(thisObject, e); + } else { + func(e); + } + }; + + node.addEventListener(name, wrapFunc, false); + var bindData = [[node, name, wrapFunc]]; + + // Add equivalent touch event. + if (name in Blockly.Touch.TOUCH_MAP) { + var touchWrapFunc = function(e) { + // Punt on multitouch events. + if (e.changedTouches.length == 1) { + // Map the touch event's properties to the event. + var touchPoint = e.changedTouches[0]; + e.clientX = touchPoint.clientX; + e.clientY = touchPoint.clientY; + } + wrapFunc(e); + + // Stop the browser from scrolling/zooming the page. + e.preventDefault(); + }; + for (var i = 0, eventName; + eventName = Blockly.Touch.TOUCH_MAP[name][i]; i++) { + node.addEventListener(eventName, touchWrapFunc, false); + bindData.push([node, eventName, touchWrapFunc]); + } + } + return bindData; +}; + +/** + * Unbind one or more events event from a function call. + * @param {!Array.} bindData Opaque data from bindEvent_. + * This list is emptied during the course of calling this function. + * @return {!Function} The function call. + * @private + */ +Blockly.unbindEvent_ = function(bindData) { + while (bindData.length) { + var bindDatum = bindData.pop(); + var node = bindDatum[0]; + var name = bindDatum[1]; + var func = bindDatum[2]; + node.removeEventListener(name, func, false); + } + return func; +}; + +/** + * Is the given string a number (includes negative and decimals). + * @param {string} str Input string. + * @return {boolean} True if number, false otherwise. + */ +Blockly.isNumber = function(str) { + return !!str.match(/^\s*-?\d+(\.\d+)?\s*$/); +}; + +// IE9 does not have a console. Create a stub to stop errors. +if (!goog.global['console']) { + goog.global['console'] = { + 'log': function() {}, + 'warn': function() {} + }; +} + +// Export symbols that would otherwise be renamed by Closure compiler. +if (!goog.global['Blockly']) { + goog.global['Blockly'] = {}; +} +goog.global['Blockly']['getMainWorkspace'] = Blockly.getMainWorkspace; +goog.global['Blockly']['addChangeListener'] = Blockly.addChangeListener; diff --git a/src/opsoro/server/static/js/blockly/core/blocks.js b/src/opsoro/server/static/js/blockly/core/blocks.js new file mode 100644 index 0000000..5b78050 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/blocks.js @@ -0,0 +1,37 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2013 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview A mapping of block type names to block prototype objects. + * @author spertus@google.com (Ellen Spertus) + */ +'use strict'; + +/** + * A mapping of block type names to block prototype objects. + * @name Blockly.Blocks + */ +goog.provide('Blockly.Blocks'); + +/* + * A mapping of block type names to block prototype objects. + * @type {!Object} + */ +Blockly.Blocks = new Object(null); diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/bubble.js b/src/opsoro/server/static/js/blockly/core/bubble.js similarity index 82% rename from src/opsoro/apps/visual_programming/static/blockly/core/bubble.js rename to src/opsoro/server/static/js/blockly/core/bubble.js index 144ff05..143ba25 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/core/bubble.js +++ b/src/opsoro/server/static/js/blockly/core/bubble.js @@ -26,26 +26,27 @@ goog.provide('Blockly.Bubble'); +goog.require('Blockly.Touch'); goog.require('Blockly.Workspace'); goog.require('goog.dom'); goog.require('goog.math'); +goog.require('goog.math.Coordinate'); goog.require('goog.userAgent'); /** * Class for UI bubble. - * @param {!Blockly.Workspace} workspace The workspace on which to draw the + * @param {!Blockly.WorkspaceSvg} workspace The workspace on which to draw the * bubble. * @param {!Element} content SVG content for the bubble. * @param {Element} shape SVG element to avoid eclipsing. - * @param {number} anchorX Absolute horizontal position of bubbles anchor point. - * @param {number} anchorY Absolute vertical position of bubbles anchor point. + * @param {!goog.math.Coodinate} anchorXY Absolute position of bubble's anchor + * point. * @param {?number} bubbleWidth Width of bubble, or null if not resizable. * @param {?number} bubbleHeight Height of bubble, or null if not resizable. * @constructor */ -Blockly.Bubble = function(workspace, content, shape, - anchorX, anchorY, +Blockly.Bubble = function(workspace, content, shape, anchorXY, bubbleWidth, bubbleHeight) { this.workspace_ = workspace; this.content_ = content; @@ -60,7 +61,7 @@ Blockly.Bubble = function(workspace, content, shape, var canvas = workspace.getBubbleCanvas(); canvas.appendChild(this.createDom_(content, !!(bubbleWidth && bubbleHeight))); - this.setAnchorLocation(anchorX, anchorY); + this.setAnchorLocation(anchorXY); if (!bubbleWidth || !bubbleHeight) { var bBox = /** @type {SVGLocatable} */ (this.content_).getBBox(); bubbleWidth = bBox.width + 2 * Blockly.Bubble.BORDER_WIDTH; @@ -74,10 +75,10 @@ Blockly.Bubble = function(workspace, content, shape, this.rendered_ = true; if (!workspace.options.readOnly) { - Blockly.bindEvent_(this.bubbleBack_, 'mousedown', this, + Blockly.bindEventWithChecks_(this.bubbleBack_, 'mousedown', this, this.bubbleMouseDown_); if (this.resizeGroup_) { - Blockly.bindEvent_(this.resizeGroup_, 'mousedown', this, + Blockly.bindEventWithChecks_(this.resizeGroup_, 'mousedown', this, this.resizeMouseDown_); } } @@ -92,7 +93,7 @@ Blockly.Bubble.BORDER_WIDTH = 6; * Determines the thickness of the base of the arrow in relation to the size * of the bubble. Higher numbers result in thinner arrows. */ -Blockly.Bubble.ARROW_THICKNESS = 10; +Blockly.Bubble.ARROW_THICKNESS = 5; /** * The number of degrees that the arrow bends counter-clockwise. @@ -123,6 +124,12 @@ Blockly.Bubble.onMouseUpWrapper_ = null; */ Blockly.Bubble.onMouseMoveWrapper_ = null; +/** + * Function to call on resize of bubble. + * @type {Function} + */ +Blockly.Bubble.prototype.resizeCallback_ = null; + /** * Stop binding to the global mouseup and mousemove events. * @private @@ -138,23 +145,29 @@ Blockly.Bubble.unbindDragEvents_ = function() { } }; -/** - * Flag to stop incremental rendering during construction. +/* + * Handle a mouse-up event while dragging a bubble's border or resize handle. + * @param {!Event} e Mouse up event. * @private */ -Blockly.Bubble.prototype.rendered_ = false; +Blockly.Bubble.bubbleMouseUp_ = function(/*e*/) { + Blockly.Touch.clearTouchIdentifier(); + Blockly.Css.setCursor(Blockly.Css.Cursor.OPEN); + Blockly.Bubble.unbindDragEvents_(); +}; /** - * Absolute X coordinate of anchor point. + * Flag to stop incremental rendering during construction. * @private */ -Blockly.Bubble.prototype.anchorX_ = 0; +Blockly.Bubble.prototype.rendered_ = false; /** - * Absolute Y coordinate of anchor point. + * Absolute coordinate of anchor point. + * @type {goog.math.Coordinate} * @private */ -Blockly.Bubble.prototype.anchorY_ = 0; +Blockly.Bubble.prototype.anchorXY_ = null; /** * Relative X coordinate of bubble with respect to the anchor's centre. @@ -209,7 +222,7 @@ Blockly.Bubble.prototype.createDom_ = function(content, hasResize) { [...content goes here...] */ - this.bubbleGroup_ = Blockly.createSvgElement('g', {}, null); + this.bubbleGroup_ = Blockly.utils.createSvgElement('g', {}, null); var filter = {'filter': 'url(#' + this.workspace_.options.embossFilterId + ')'}; if (goog.userAgent.getUserAgentString().indexOf('JavaFX') != -1) { @@ -219,27 +232,27 @@ Blockly.Bubble.prototype.createDom_ = function(content, hasResize) { // https://github.com/google/blockly/issues/99 filter = {}; } - var bubbleEmboss = Blockly.createSvgElement('g', + var bubbleEmboss = Blockly.utils.createSvgElement('g', filter, this.bubbleGroup_); - this.bubbleArrow_ = Blockly.createSvgElement('path', {}, bubbleEmboss); - this.bubbleBack_ = Blockly.createSvgElement('rect', + this.bubbleArrow_ = Blockly.utils.createSvgElement('path', {}, bubbleEmboss); + this.bubbleBack_ = Blockly.utils.createSvgElement('rect', {'class': 'blocklyDraggable', 'x': 0, 'y': 0, 'rx': Blockly.Bubble.BORDER_WIDTH, 'ry': Blockly.Bubble.BORDER_WIDTH}, bubbleEmboss); if (hasResize) { - this.resizeGroup_ = Blockly.createSvgElement('g', + this.resizeGroup_ = Blockly.utils.createSvgElement('g', {'class': this.workspace_.RTL ? 'blocklyResizeSW' : 'blocklyResizeSE'}, this.bubbleGroup_); var resizeSize = 2 * Blockly.Bubble.BORDER_WIDTH; - Blockly.createSvgElement('polygon', + Blockly.utils.createSvgElement('polygon', {'points': '0,x x,x x,0'.replace(/x/g, resizeSize.toString())}, this.resizeGroup_); - Blockly.createSvgElement('line', + Blockly.utils.createSvgElement('line', {'class': 'blocklyResizeLine', 'x1': resizeSize / 3, 'y1': resizeSize - 1, 'x2': resizeSize - 1, 'y2': resizeSize / 3}, this.resizeGroup_); - Blockly.createSvgElement('line', + Blockly.utils.createSvgElement('line', {'class': 'blocklyResizeLine', 'x1': resizeSize * 2 / 3, 'y1': resizeSize - 1, 'x2': resizeSize - 1, 'y2': resizeSize * 2 / 3}, this.resizeGroup_); @@ -258,24 +271,24 @@ Blockly.Bubble.prototype.createDom_ = function(content, hasResize) { Blockly.Bubble.prototype.bubbleMouseDown_ = function(e) { this.promote_(); Blockly.Bubble.unbindDragEvents_(); - if (Blockly.isRightButton(e)) { + if (Blockly.utils.isRightButton(e)) { // No right-click. e.stopPropagation(); return; - } else if (Blockly.isTargetInput_(e)) { + } else if (Blockly.utils.isTargetInput(e)) { // When focused on an HTML text input widget, don't trap any events. return; } // Left-click (or middle click) Blockly.Css.setCursor(Blockly.Css.Cursor.CLOSED); - this.workspace_.startDrag(e, + this.workspace_.startDrag(e, new goog.math.Coordinate( this.workspace_.RTL ? -this.relativeLeft_ : this.relativeLeft_, - this.relativeTop_); + this.relativeTop_)); - Blockly.Bubble.onMouseUpWrapper_ = Blockly.bindEvent_(document, - 'mouseup', this, Blockly.Bubble.unbindDragEvents_); - Blockly.Bubble.onMouseMoveWrapper_ = Blockly.bindEvent_(document, + Blockly.Bubble.onMouseUpWrapper_ = Blockly.bindEventWithChecks_(document, + 'mouseup', this, Blockly.Bubble.bubbleMouseUp_); + Blockly.Bubble.onMouseMoveWrapper_ = Blockly.bindEventWithChecks_(document, 'mousemove', this, this.bubbleMouseMove_); Blockly.hideChaff(); // This event has been handled. No need to bubble up to the document. @@ -304,7 +317,7 @@ Blockly.Bubble.prototype.bubbleMouseMove_ = function(e) { Blockly.Bubble.prototype.resizeMouseDown_ = function(e) { this.promote_(); Blockly.Bubble.unbindDragEvents_(); - if (Blockly.isRightButton(e)) { + if (Blockly.utils.isRightButton(e)) { // No right-click. e.stopPropagation(); return; @@ -312,12 +325,12 @@ Blockly.Bubble.prototype.resizeMouseDown_ = function(e) { // Left-click (or middle click) Blockly.Css.setCursor(Blockly.Css.Cursor.CLOSED); - this.workspace_.startDrag(e, - this.workspace_.RTL ? -this.width_ : this.width_, this.height_); + this.workspace_.startDrag(e, new goog.math.Coordinate( + this.workspace_.RTL ? -this.width_ : this.width_, this.height_)); - Blockly.Bubble.onMouseUpWrapper_ = Blockly.bindEvent_(document, - 'mouseup', this, Blockly.Bubble.unbindDragEvents_); - Blockly.Bubble.onMouseMoveWrapper_ = Blockly.bindEvent_(document, + Blockly.Bubble.onMouseUpWrapper_ = Blockly.bindEventWithChecks_(document, + 'mouseup', this, Blockly.Bubble.bubbleMouseUp_); + Blockly.Bubble.onMouseMoveWrapper_ = Blockly.bindEventWithChecks_(document, 'mousemove', this, this.resizeMouseMove_); Blockly.hideChaff(); // This event has been handled. No need to bubble up to the document. @@ -341,11 +354,10 @@ Blockly.Bubble.prototype.resizeMouseMove_ = function(e) { /** * Register a function as a callback event for when the bubble is resized. - * @param {Object} thisObject The value of 'this' in the callback. * @param {!Function} callback The function to call on resize. */ -Blockly.Bubble.prototype.registerResizeEvent = function(thisObject, callback) { - Blockly.bindEvent_(this.bubbleGroup_, 'resize', thisObject, callback); +Blockly.Bubble.prototype.registerResizeEvent = function(callback) { + this.resizeCallback_ = callback; }; /** @@ -360,12 +372,10 @@ Blockly.Bubble.prototype.promote_ = function() { /** * Notification that the anchor has moved. * Update the arrow and bubble accordingly. - * @param {number} x Absolute horizontal location. - * @param {number} y Absolute vertical location. + * @param {!goog.math.Coordinate} xy Absolute location. */ -Blockly.Bubble.prototype.setAnchorLocation = function(x, y) { - this.anchorX_ = x; - this.anchorY_ = y; +Blockly.Bubble.prototype.setAnchorLocation = function(xy) { + this.anchorXY_ = xy; if (this.rendered_) { this.positionBubble_(); } @@ -383,31 +393,32 @@ Blockly.Bubble.prototype.layoutBubble_ = function() { var metrics = this.workspace_.getMetrics(); metrics.viewWidth /= this.workspace_.scale; metrics.viewLeft /= this.workspace_.scale; + var anchorX = this.anchorXY_.x; if (this.workspace_.RTL) { - if (this.anchorX_ - metrics.viewLeft - relativeLeft - this.width_ < + if (anchorX - metrics.viewLeft - relativeLeft - this.width_ < Blockly.Scrollbar.scrollbarThickness) { // Slide the bubble right until it is onscreen. - relativeLeft = this.anchorX_ - metrics.viewLeft - this.width_ - + relativeLeft = anchorX - metrics.viewLeft - this.width_ - Blockly.Scrollbar.scrollbarThickness; - } else if (this.anchorX_ - metrics.viewLeft - relativeLeft > + } else if (anchorX - metrics.viewLeft - relativeLeft > metrics.viewWidth) { // Slide the bubble left until it is onscreen. - relativeLeft = this.anchorX_ - metrics.viewLeft - metrics.viewWidth; + relativeLeft = anchorX - metrics.viewLeft - metrics.viewWidth; } } else { - if (this.anchorX_ + relativeLeft < metrics.viewLeft) { + if (anchorX + relativeLeft < metrics.viewLeft) { // Slide the bubble right until it is onscreen. - relativeLeft = metrics.viewLeft - this.anchorX_; + relativeLeft = metrics.viewLeft - anchorX; } else if (metrics.viewLeft + metrics.viewWidth < - this.anchorX_ + relativeLeft + this.width_ + + anchorX + relativeLeft + this.width_ + Blockly.BlockSvg.SEP_SPACE_X + Blockly.Scrollbar.scrollbarThickness) { // Slide the bubble left until it is onscreen. - relativeLeft = metrics.viewLeft + metrics.viewWidth - this.anchorX_ - + relativeLeft = metrics.viewLeft + metrics.viewWidth - anchorX - this.width_ - Blockly.Scrollbar.scrollbarThickness; } } - if (this.anchorY_ + relativeTop < metrics.viewTop) { + if (this.anchorXY_.y + relativeTop < metrics.viewTop) { // Slide the bubble below the block. var bBox = /** @type {SVGLocatable} */ (this.shape_).getBBox(); relativeTop = bBox.height; @@ -421,13 +432,13 @@ Blockly.Bubble.prototype.layoutBubble_ = function() { * @private */ Blockly.Bubble.prototype.positionBubble_ = function() { - var left; + var left = this.anchorXY_.x; if (this.workspace_.RTL) { - left = this.anchorX_ - this.relativeLeft_ - this.width_; + left -= this.relativeLeft_ + this.width_; } else { - left = this.anchorX_ + this.relativeLeft_; + left += this.relativeLeft_; } - var top = this.relativeTop_ + this.anchorY_; + var top = this.relativeTop_ + this.anchorXY_.y; this.bubbleGroup_.setAttribute('transform', 'translate(' + left + ',' + top + ')'); }; @@ -473,8 +484,10 @@ Blockly.Bubble.prototype.setBubbleSize = function(width, height) { this.positionBubble_(); this.renderArrow_(); } - // Fire an event to allow the contents to resize. - Blockly.fireUiEvent(this.bubbleGroup_, 'resize'); + // Allow the contents to resize. + if (this.resizeCallback_) { + this.resizeCallback_(); + } }; /** @@ -517,7 +530,7 @@ Blockly.Bubble.prototype.renderArrow_ = function() { var bubbleSize = this.getBubbleSize(); var thickness = (bubbleSize.width + bubbleSize.height) / Blockly.Bubble.ARROW_THICKNESS; - thickness = Math.min(thickness, bubbleSize.width, bubbleSize.height) / 2; + thickness = Math.min(thickness, bubbleSize.width, bubbleSize.height) / 4; // Back the tip of the arrow off of the anchor. var backoffRatio = 1 - Blockly.Bubble.ANCHOR_RADIUS / hypotenuse; diff --git a/src/opsoro/server/static/js/blockly/core/comment.js b/src/opsoro/server/static/js/blockly/core/comment.js new file mode 100644 index 0000000..dc65073 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/comment.js @@ -0,0 +1,278 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2011 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Object representing a code comment. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Comment'); + +goog.require('Blockly.Bubble'); +goog.require('Blockly.Icon'); +goog.require('goog.userAgent'); + + +/** + * Class for a comment. + * @param {!Blockly.Block} block The block associated with this comment. + * @extends {Blockly.Icon} + * @constructor + */ +Blockly.Comment = function(block) { + Blockly.Comment.superClass_.constructor.call(this, block); + this.createIcon(); +}; +goog.inherits(Blockly.Comment, Blockly.Icon); + +/** + * Comment text (if bubble is not visible). + * @private + */ +Blockly.Comment.prototype.text_ = ''; + +/** + * Width of bubble. + * @private + */ +Blockly.Comment.prototype.width_ = 160; + +/** + * Height of bubble. + * @private + */ +Blockly.Comment.prototype.height_ = 80; + +/** + * Draw the comment icon. + * @param {!Element} group The icon group. + * @private + */ +Blockly.Comment.prototype.drawIcon_ = function(group) { + // Circle. + Blockly.utils.createSvgElement('circle', + {'class': 'blocklyIconShape', 'r': '8', 'cx': '8', 'cy': '8'}, + group); + // Can't use a real '?' text character since different browsers and operating + // systems render it differently. + // Body of question mark. + Blockly.utils.createSvgElement('path', + {'class': 'blocklyIconSymbol', + 'd': 'm6.8,10h2c0.003,-0.617 0.271,-0.962 0.633,-1.266 2.875,-2.405 0.607,-5.534 -3.765,-3.874v1.7c3.12,-1.657 3.698,0.118 2.336,1.25 -1.201,0.998 -1.201,1.528 -1.204,2.19z'}, + group); + // Dot of question mark. + Blockly.utils.createSvgElement('rect', + {'class': 'blocklyIconSymbol', + 'x': '6.8', 'y': '10.78', 'height': '2', 'width': '2'}, + group); +}; + +/** + * Create the editor for the comment's bubble. + * @return {!Element} The top-level node of the editor. + * @private + */ +Blockly.Comment.prototype.createEditor_ = function() { + /* Create the editor. Here's the markup that will be generated: + + + + + + */ + this.foreignObject_ = Blockly.utils.createSvgElement('foreignObject', + {'x': Blockly.Bubble.BORDER_WIDTH, 'y': Blockly.Bubble.BORDER_WIDTH}, + null); + var body = document.createElementNS(Blockly.HTML_NS, 'body'); + body.setAttribute('xmlns', Blockly.HTML_NS); + body.className = 'blocklyMinimalBody'; + var textarea = document.createElementNS(Blockly.HTML_NS, 'textarea'); + textarea.className = 'blocklyCommentTextarea'; + textarea.setAttribute('dir', this.block_.RTL ? 'RTL' : 'LTR'); + body.appendChild(textarea); + this.textarea_ = textarea; + this.foreignObject_.appendChild(body); + Blockly.bindEventWithChecks_(textarea, 'mouseup', this, this.textareaFocus_); + // Don't zoom with mousewheel. + Blockly.bindEventWithChecks_(textarea, 'wheel', this, function(e) { + e.stopPropagation(); + }); + Blockly.bindEventWithChecks_(textarea, 'change', this, function(e) { + if (this.text_ != textarea.value) { + Blockly.Events.fire(new Blockly.Events.Change( + this.block_, 'comment', null, this.text_, textarea.value)); + this.text_ = textarea.value; + } + }); + setTimeout(function() { + textarea.focus(); + }, 0); + return this.foreignObject_; +}; + +/** + * Add or remove editability of the comment. + * @override + */ +Blockly.Comment.prototype.updateEditable = function() { + if (this.isVisible()) { + // Toggling visibility will force a rerendering. + this.setVisible(false); + this.setVisible(true); + } + // Allow the icon to update. + Blockly.Icon.prototype.updateEditable.call(this); +}; + +/** + * Callback function triggered when the bubble has resized. + * Resize the text area accordingly. + * @private + */ +Blockly.Comment.prototype.resizeBubble_ = function() { + if (this.isVisible()) { + var size = this.bubble_.getBubbleSize(); + var doubleBorderWidth = 2 * Blockly.Bubble.BORDER_WIDTH; + this.foreignObject_.setAttribute('width', size.width - doubleBorderWidth); + this.foreignObject_.setAttribute('height', size.height - doubleBorderWidth); + this.textarea_.style.width = (size.width - doubleBorderWidth - 4) + 'px'; + this.textarea_.style.height = (size.height - doubleBorderWidth - 4) + 'px'; + } +}; + +/** + * Show or hide the comment bubble. + * @param {boolean} visible True if the bubble should be visible. + */ +Blockly.Comment.prototype.setVisible = function(visible) { + if (visible == this.isVisible()) { + // No change. + return; + } + Blockly.Events.fire( + new Blockly.Events.Ui(this.block_, 'commentOpen', !visible, visible)); + if ((!this.block_.isEditable() && !this.textarea_) || goog.userAgent.IE) { + // Steal the code from warnings to make an uneditable text bubble. + // MSIE does not support foreignobject; textareas are impossible. + // http://msdn.microsoft.com/en-us/library/hh834675%28v=vs.85%29.aspx + // Always treat comments in IE as uneditable. + Blockly.Warning.prototype.setVisible.call(this, visible); + return; + } + // Save the bubble stats before the visibility switch. + var text = this.getText(); + var size = this.getBubbleSize(); + if (visible) { + // Create the bubble. + this.bubble_ = new Blockly.Bubble( + /** @type {!Blockly.WorkspaceSvg} */ (this.block_.workspace), + this.createEditor_(), this.block_.svgPath_, + this.iconXY_, this.width_, this.height_); + this.bubble_.registerResizeEvent(this.resizeBubble_.bind(this)); + this.updateColour(); + } else { + // Dispose of the bubble. + this.bubble_.dispose(); + this.bubble_ = null; + this.textarea_ = null; + this.foreignObject_ = null; + } + // Restore the bubble stats after the visibility switch. + this.setText(text); + this.setBubbleSize(size.width, size.height); +}; + +/** + * Bring the comment to the top of the stack when clicked on. + * @param {!Event} e Mouse up event. + * @private + */ +Blockly.Comment.prototype.textareaFocus_ = function(e) { + // Ideally this would be hooked to the focus event for the comment. + // However doing so in Firefox swallows the cursor for unknown reasons. + // So this is hooked to mouseup instead. No big deal. + this.bubble_.promote_(); + // Since the act of moving this node within the DOM causes a loss of focus, + // we need to reapply the focus. + this.textarea_.focus(); +}; + +/** + * Get the dimensions of this comment's bubble. + * @return {!Object} Object with width and height properties. + */ +Blockly.Comment.prototype.getBubbleSize = function() { + if (this.isVisible()) { + return this.bubble_.getBubbleSize(); + } else { + return {width: this.width_, height: this.height_}; + } +}; + +/** + * Size this comment's bubble. + * @param {number} width Width of the bubble. + * @param {number} height Height of the bubble. + */ +Blockly.Comment.prototype.setBubbleSize = function(width, height) { + if (this.textarea_) { + this.bubble_.setBubbleSize(width, height); + } else { + this.width_ = width; + this.height_ = height; + } +}; + +/** + * Returns this comment's text. + * @return {string} Comment text. + */ +Blockly.Comment.prototype.getText = function() { + return this.textarea_ ? this.textarea_.value : this.text_; +}; + +/** + * Set this comment's text. + * @param {string} text Comment text. + */ +Blockly.Comment.prototype.setText = function(text) { + if (this.text_ != text) { + Blockly.Events.fire(new Blockly.Events.Change( + this.block_, 'comment', null, this.text_, text)); + this.text_ = text; + } + if (this.textarea_) { + this.textarea_.value = text; + } +}; + +/** + * Dispose of this comment. + */ +Blockly.Comment.prototype.dispose = function() { + if (Blockly.Events.isEnabled()) { + this.setText(''); // Fire event to delete comment. + } + this.block_.comment = null; + Blockly.Icon.prototype.dispose.call(this); +}; diff --git a/src/opsoro/server/static/js/blockly/core/connection.js b/src/opsoro/server/static/js/blockly/core/connection.js new file mode 100644 index 0000000..2b87398 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/connection.js @@ -0,0 +1,669 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2011 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Components for creating connections between blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Connection'); + +goog.require('goog.asserts'); +goog.require('goog.dom'); + + +/** + * Class for a connection between blocks. + * @param {!Blockly.Block} source The block establishing this connection. + * @param {number} type The type of the connection. + * @constructor + */ +Blockly.Connection = function(source, type) { + /** + * @type {!Blockly.Block} + * @private + */ + this.sourceBlock_ = source; + /** @type {number} */ + this.type = type; + // Shortcut for the databases for this connection's workspace. + if (source.workspace.connectionDBList) { + this.db_ = source.workspace.connectionDBList[type]; + this.dbOpposite_ = + source.workspace.connectionDBList[Blockly.OPPOSITE_TYPE[type]]; + this.hidden_ = !this.db_; + } +}; + +/** + * Constants for checking whether two connections are compatible. + */ +Blockly.Connection.CAN_CONNECT = 0; +Blockly.Connection.REASON_SELF_CONNECTION = 1; +Blockly.Connection.REASON_WRONG_TYPE = 2; +Blockly.Connection.REASON_TARGET_NULL = 3; +Blockly.Connection.REASON_CHECKS_FAILED = 4; +Blockly.Connection.REASON_DIFFERENT_WORKSPACES = 5; +Blockly.Connection.REASON_SHADOW_PARENT = 6; + +/** + * Connection this connection connects to. Null if not connected. + * @type {Blockly.Connection} + */ +Blockly.Connection.prototype.targetConnection = null; + +/** + * List of compatible value types. Null if all types are compatible. + * @type {Array} + * @private + */ +Blockly.Connection.prototype.check_ = null; + +/** + * DOM representation of a shadow block, or null if none. + * @type {Element} + * @private + */ +Blockly.Connection.prototype.shadowDom_ = null; + +/** + * Horizontal location of this connection. + * @type {number} + * @private + */ +Blockly.Connection.prototype.x_ = 0; + +/** + * Vertical location of this connection. + * @type {number} + * @private + */ +Blockly.Connection.prototype.y_ = 0; + +/** + * Has this connection been added to the connection database? + * @type {boolean} + * @private + */ +Blockly.Connection.prototype.inDB_ = false; + +/** + * Connection database for connections of this type on the current workspace. + * @type {Blockly.ConnectionDB} + * @private + */ +Blockly.Connection.prototype.db_ = null; + +/** + * Connection database for connections compatible with this type on the + * current workspace. + * @type {Blockly.ConnectionDB} + * @private + */ +Blockly.Connection.prototype.dbOpposite_ = null; + +/** + * Whether this connections is hidden (not tracked in a database) or not. + * @type {boolean} + * @private + */ +Blockly.Connection.prototype.hidden_ = null; + +/** + * Connect two connections together. This is the connection on the superior + * block. + * @param {!Blockly.Connection} childConnection Connection on inferior block. + * @private + */ +Blockly.Connection.prototype.connect_ = function(childConnection) { + var parentConnection = this; + var parentBlock = parentConnection.getSourceBlock(); + var childBlock = childConnection.getSourceBlock(); + // Disconnect any existing parent on the child connection. + if (childConnection.isConnected()) { + childConnection.disconnect(); + } + if (parentConnection.isConnected()) { + // Other connection is already connected to something. + // Disconnect it and reattach it or bump it as needed. + var orphanBlock = parentConnection.targetBlock(); + var shadowDom = parentConnection.getShadowDom(); + // Temporarily set the shadow DOM to null so it does not respawn. + parentConnection.setShadowDom(null); + // Displaced shadow blocks dissolve rather than reattaching or bumping. + if (orphanBlock.isShadow()) { + // Save the shadow block so that field values are preserved. + shadowDom = Blockly.Xml.blockToDom(orphanBlock); + orphanBlock.dispose(); + orphanBlock = null; + } else if (parentConnection.type == Blockly.INPUT_VALUE) { + // Value connections. + // If female block is already connected, disconnect and bump the male. + if (!orphanBlock.outputConnection) { + throw 'Orphan block does not have an output connection.'; + } + // Attempt to reattach the orphan at the end of the newly inserted + // block. Since this block may be a row, walk down to the end + // or to the first (and only) shadow block. + var connection = Blockly.Connection.lastConnectionInRow_( + childBlock, orphanBlock); + if (connection) { + orphanBlock.outputConnection.connect(connection); + orphanBlock = null; + } + } else if (parentConnection.type == Blockly.NEXT_STATEMENT) { + // Statement connections. + // Statement blocks may be inserted into the middle of a stack. + // Split the stack. + if (!orphanBlock.previousConnection) { + throw 'Orphan block does not have a previous connection.'; + } + // Attempt to reattach the orphan at the bottom of the newly inserted + // block. Since this block may be a stack, walk down to the end. + var newBlock = childBlock; + while (newBlock.nextConnection) { + var nextBlock = newBlock.getNextBlock(); + if (nextBlock && !nextBlock.isShadow()) { + newBlock = nextBlock; + } else { + if (orphanBlock.previousConnection.checkType_( + newBlock.nextConnection)) { + newBlock.nextConnection.connect(orphanBlock.previousConnection); + orphanBlock = null; + } + break; + } + } + } + if (orphanBlock) { + // Unable to reattach orphan. + parentConnection.disconnect(); + if (Blockly.Events.recordUndo) { + // Bump it off to the side after a moment. + var group = Blockly.Events.getGroup(); + setTimeout(function() { + // Verify orphan hasn't been deleted or reconnected (user on meth). + if (orphanBlock.workspace && !orphanBlock.getParent()) { + Blockly.Events.setGroup(group); + if (orphanBlock.outputConnection) { + orphanBlock.outputConnection.bumpAwayFrom_(parentConnection); + } else if (orphanBlock.previousConnection) { + orphanBlock.previousConnection.bumpAwayFrom_(parentConnection); + } + Blockly.Events.setGroup(false); + } + }, Blockly.BUMP_DELAY); + } + } + // Restore the shadow DOM. + parentConnection.setShadowDom(shadowDom); + } + + var event; + if (Blockly.Events.isEnabled()) { + event = new Blockly.Events.Move(childBlock); + } + // Establish the connections. + Blockly.Connection.connectReciprocally_(parentConnection, childConnection); + // Demote the inferior block so that one is a child of the superior one. + childBlock.setParent(parentBlock); + if (event) { + event.recordNew(); + Blockly.Events.fire(event); + } +}; + +/** + * Sever all links to this connection (not including from the source object). + */ +Blockly.Connection.prototype.dispose = function() { + if (this.isConnected()) { + throw 'Disconnect connection before disposing of it.'; + } + if (this.inDB_) { + this.db_.removeConnection_(this); + } + if (Blockly.highlightedConnection_ == this) { + Blockly.highlightedConnection_ = null; + } + if (Blockly.localConnection_ == this) { + Blockly.localConnection_ = null; + } + this.db_ = null; + this.dbOpposite_ = null; +}; + +/** + * Get the source block for this connection. + * @return {Blockly.Block} The source block, or null if there is none. + */ +Blockly.Connection.prototype.getSourceBlock = function() { + return this.sourceBlock_; +}; + +/** + * Does the connection belong to a superior block (higher in the source stack)? + * @return {boolean} True if connection faces down or right. + */ +Blockly.Connection.prototype.isSuperior = function() { + return this.type == Blockly.INPUT_VALUE || + this.type == Blockly.NEXT_STATEMENT; +}; + +/** + * Is the connection connected? + * @return {boolean} True if connection is connected to another connection. + */ +Blockly.Connection.prototype.isConnected = function() { + return !!this.targetConnection; +}; + +/** + * Checks whether the current connection can connect with the target + * connection. + * @param {Blockly.Connection} target Connection to check compatibility with. + * @return {number} Blockly.Connection.CAN_CONNECT if the connection is legal, + * an error code otherwise. + * @private + */ +Blockly.Connection.prototype.canConnectWithReason_ = function(target) { + if (!target) { + return Blockly.Connection.REASON_TARGET_NULL; + } + if (this.isSuperior()) { + var blockA = this.sourceBlock_; + var blockB = target.getSourceBlock(); + } else { + var blockB = this.sourceBlock_; + var blockA = target.getSourceBlock(); + } + if (blockA && blockA == blockB) { + return Blockly.Connection.REASON_SELF_CONNECTION; + } else if (target.type != Blockly.OPPOSITE_TYPE[this.type]) { + return Blockly.Connection.REASON_WRONG_TYPE; + } else if (blockA && blockB && blockA.workspace !== blockB.workspace) { + return Blockly.Connection.REASON_DIFFERENT_WORKSPACES; + } else if (!this.checkType_(target)) { + return Blockly.Connection.REASON_CHECKS_FAILED; + } else if (blockA.isShadow() && !blockB.isShadow()) { + return Blockly.Connection.REASON_SHADOW_PARENT; + } + return Blockly.Connection.CAN_CONNECT; +}; + +/** + * Checks whether the current connection and target connection are compatible + * and throws an exception if they are not. + * @param {Blockly.Connection} target The connection to check compatibility + * with. + * @private + */ +Blockly.Connection.prototype.checkConnection_ = function(target) { + switch (this.canConnectWithReason_(target)) { + case Blockly.Connection.CAN_CONNECT: + break; + case Blockly.Connection.REASON_SELF_CONNECTION: + throw 'Attempted to connect a block to itself.'; + case Blockly.Connection.REASON_DIFFERENT_WORKSPACES: + // Usually this means one block has been deleted. + throw 'Blocks not on same workspace.'; + case Blockly.Connection.REASON_WRONG_TYPE: + throw 'Attempt to connect incompatible types.'; + case Blockly.Connection.REASON_TARGET_NULL: + throw 'Target connection is null.'; + case Blockly.Connection.REASON_CHECKS_FAILED: + var msg = 'Connection checks failed. '; + msg += this + ' expected ' + this.check_ + ', found ' + target.check_; + throw msg; + case Blockly.Connection.REASON_SHADOW_PARENT: + throw 'Connecting non-shadow to shadow block.'; + default: + throw 'Unknown connection failure: this should never happen!'; + } +}; + +/** + * Check if the two connections can be dragged to connect to each other. + * @param {!Blockly.Connection} candidate A nearby connection to check. + * @return {boolean} True if the connection is allowed, false otherwise. + */ +Blockly.Connection.prototype.isConnectionAllowed = function(candidate) { + // Type checking. + var canConnect = this.canConnectWithReason_(candidate); + if (canConnect != Blockly.Connection.CAN_CONNECT) { + return false; + } + + // Don't offer to connect an already connected left (male) value plug to + // an available right (female) value plug. Don't offer to connect the + // bottom of a statement block to one that's already connected. + if (candidate.type == Blockly.OUTPUT_VALUE || + candidate.type == Blockly.PREVIOUS_STATEMENT) { + if (candidate.isConnected() || this.isConnected()) { + return false; + } + } + + // Offering to connect the left (male) of a value block to an already + // connected value pair is ok, we'll splice it in. + // However, don't offer to splice into an immovable block. + if (candidate.type == Blockly.INPUT_VALUE && candidate.isConnected() && + !candidate.targetBlock().isMovable() && + !candidate.targetBlock().isShadow()) { + return false; + } + + // Don't let a block with no next connection bump other blocks out of the + // stack. But covering up a shadow block or stack of shadow blocks is fine. + // Similarly, replacing a terminal statement with another terminal statement + // is allowed. + if (this.type == Blockly.PREVIOUS_STATEMENT && + candidate.isConnected() && + !this.sourceBlock_.nextConnection && + !candidate.targetBlock().isShadow() && + candidate.targetBlock().nextConnection) { + return false; + } + + // Don't let blocks try to connect to themselves or ones they nest. + if (Blockly.draggingConnections_.indexOf(candidate) != -1) { + return false; + } + + return true; +}; + +/** + * Connect this connection to another connection. + * @param {!Blockly.Connection} otherConnection Connection to connect to. + */ +Blockly.Connection.prototype.connect = function(otherConnection) { + if (this.targetConnection == otherConnection) { + // Already connected together. NOP. + return; + } + this.checkConnection_(otherConnection); + // Determine which block is superior (higher in the source stack). + if (this.isSuperior()) { + // Superior block. + this.connect_(otherConnection); + } else { + // Inferior block. + otherConnection.connect_(this); + } +}; + +/** + * Update two connections to target each other. + * @param {Blockly.Connection} first The first connection to update. + * @param {Blockly.Connection} second The second connection to update. + * @private + */ +Blockly.Connection.connectReciprocally_ = function(first, second) { + goog.asserts.assert(first && second, 'Cannot connect null connections.'); + first.targetConnection = second; + second.targetConnection = first; +}; + +/** + * Does the given block have one and only one connection point that will accept + * an orphaned block? + * @param {!Blockly.Block} block The superior block. + * @param {!Blockly.Block} orphanBlock The inferior block. + * @return {Blockly.Connection} The suitable connection point on 'block', + * or null. + * @private + */ +Blockly.Connection.singleConnection_ = function(block, orphanBlock) { + var connection = false; + for (var i = 0; i < block.inputList.length; i++) { + var thisConnection = block.inputList[i].connection; + if (thisConnection && thisConnection.type == Blockly.INPUT_VALUE && + orphanBlock.outputConnection.checkType_(thisConnection)) { + if (connection) { + return null; // More than one connection. + } + connection = thisConnection; + } + } + return connection; +}; + +/** + * Walks down a row a blocks, at each stage checking if there are any + * connections that will accept the orphaned block. If at any point there + * are zero or multiple eligible connections, returns null. Otherwise + * returns the only input on the last block in the chain. + * Terminates early for shadow blocks. + * @param {!Blockly.Block} startBlock The block on which to start the search. + * @param {!Blockly.Block} orphanBlock The block that is looking for a home. + * @return {Blockly.Connection} The suitable connection point on the chain + * of blocks, or null. + * @private + */ +Blockly.Connection.lastConnectionInRow_ = function(startBlock, orphanBlock) { + var newBlock = startBlock; + var connection; + while (connection = Blockly.Connection.singleConnection_( + /** @type {!Blockly.Block} */ (newBlock), orphanBlock)) { + // '=' is intentional in line above. + newBlock = connection.targetBlock(); + if (!newBlock || newBlock.isShadow()) { + return connection; + } + } + return null; +}; + +/** + * Disconnect this connection. + */ +Blockly.Connection.prototype.disconnect = function() { + var otherConnection = this.targetConnection; + goog.asserts.assert(otherConnection, 'Source connection not connected.'); + goog.asserts.assert(otherConnection.targetConnection == this, + 'Target connection not connected to source connection.'); + + var parentBlock, childBlock, parentConnection; + if (this.isSuperior()) { + // Superior block. + parentBlock = this.sourceBlock_; + childBlock = otherConnection.getSourceBlock(); + parentConnection = this; + } else { + // Inferior block. + parentBlock = otherConnection.getSourceBlock(); + childBlock = this.sourceBlock_; + parentConnection = otherConnection; + } + this.disconnectInternal_(parentBlock, childBlock); + parentConnection.respawnShadow_(); +}; + +/** + * Disconnect two blocks that are connected by this connection. + * @param {!Blockly.Block} parentBlock The superior block. + * @param {!Blockly.Block} childBlock The inferior block. + * @private + */ +Blockly.Connection.prototype.disconnectInternal_ = function(parentBlock, + childBlock) { + var event; + if (Blockly.Events.isEnabled()) { + event = new Blockly.Events.Move(childBlock); + } + var otherConnection = this.targetConnection; + otherConnection.targetConnection = null; + this.targetConnection = null; + childBlock.setParent(null); + if (event) { + event.recordNew(); + Blockly.Events.fire(event); + } +}; + +/** + * Respawn the shadow block if there was one connected to the this connection. + * @private + */ +Blockly.Connection.prototype.respawnShadow_ = function() { + var parentBlock = this.getSourceBlock(); + var shadow = this.getShadowDom(); + if (parentBlock.workspace && shadow && Blockly.Events.recordUndo) { + var blockShadow = + Blockly.Xml.domToBlock(shadow, parentBlock.workspace); + if (blockShadow.outputConnection) { + this.connect(blockShadow.outputConnection); + } else if (blockShadow.previousConnection) { + this.connect(blockShadow.previousConnection); + } else { + throw 'Child block does not have output or previous statement.'; + } + } +}; + +/** + * Returns the block that this connection connects to. + * @return {Blockly.Block} The connected block or null if none is connected. + */ +Blockly.Connection.prototype.targetBlock = function() { + if (this.isConnected()) { + return this.targetConnection.getSourceBlock(); + } + return null; +}; + +/** + * Is this connection compatible with another connection with respect to the + * value type system. E.g. square_root("Hello") is not compatible. + * @param {!Blockly.Connection} otherConnection Connection to compare against. + * @return {boolean} True if the connections share a type. + * @private + */ +Blockly.Connection.prototype.checkType_ = function(otherConnection) { + if (!this.check_ || !otherConnection.check_) { + // One or both sides are promiscuous enough that anything will fit. + return true; + } + // Find any intersection in the check lists. + for (var i = 0; i < this.check_.length; i++) { + if (otherConnection.check_.indexOf(this.check_[i]) != -1) { + return true; + } + } + // No intersection. + return false; +}; + +/** + * Function to be called when this connection's compatible types have changed. + * @private + */ +Blockly.Connection.prototype.onCheckChanged_ = function() { + // The new value type may not be compatible with the existing connection. + if (this.isConnected() && !this.checkType_(this.targetConnection)) { + var child = this.isSuperior() ? this.targetBlock() : this.sourceBlock_; + child.unplug(); + } +}; + +/** + * Change a connection's compatibility. + * @param {*} check Compatible value type or list of value types. + * Null if all types are compatible. + * @return {!Blockly.Connection} The connection being modified + * (to allow chaining). + */ +Blockly.Connection.prototype.setCheck = function(check) { + if (check) { + // Ensure that check is in an array. + if (!goog.isArray(check)) { + check = [check]; + } + this.check_ = check; + this.onCheckChanged_(); + } else { + this.check_ = null; + } + return this; +}; + +/** + * Change a connection's shadow block. + * @param {Element} shadow DOM representation of a block or null. + */ +Blockly.Connection.prototype.setShadowDom = function(shadow) { + this.shadowDom_ = shadow; +}; + +/** + * Return a connection's shadow block. + * @return {Element} shadow DOM representation of a block or null. + */ +Blockly.Connection.prototype.getShadowDom = function() { + return this.shadowDom_; +}; + +/** + * Find all nearby compatible connections to this connection. + * Type checking does not apply, since this function is used for bumping. + * + * Headless configurations (the default) do not have neighboring connection, + * and always return an empty list (the default). + * {@link Blockly.RenderedConnection} overrides this behavior with a list + * computed from the rendered positioning. + * @param {number} maxLimit The maximum radius to another connection. + * @return {!Array.} List of connections. + * @private + */ +Blockly.Connection.prototype.neighbours_ = function(/* maxLimit */) { + return []; +}; + +/** + * This method returns a string describing this Connection in developer terms + * (English only). Intended to on be used in console logs and errors. + * @return {string} The description. + */ +Blockly.Connection.prototype.toString = function() { + var msg; + var block = this.sourceBlock_; + if (!block) { + return 'Orphan Connection'; + } else if (block.outputConnection == this) { + msg = 'Output Connection of '; + } else if (block.previousConnection == this) { + msg = 'Previous Connection of '; + } else if (block.nextConnection == this) { + msg = 'Next Connection of '; + } else { + var parentInput = goog.array.find(block.inputList, function(input) { + return input.connection == this; + }, this); + if (parentInput) { + msg = 'Input "' + parentInput.name + '" connection on '; + } else { + console.warn('Connection not actually connected to sourceBlock_'); + return 'Orphan Connection'; + } + } + return msg + block.toDevString(); +}; diff --git a/src/opsoro/server/static/js/blockly/core/connection_db.js b/src/opsoro/server/static/js/blockly/core/connection_db.js new file mode 100644 index 0000000..8b3c300 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/connection_db.js @@ -0,0 +1,301 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2011 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Components for managing connections between blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.ConnectionDB'); + +goog.require('Blockly.Connection'); + + +/** + * Database of connections. + * Connections are stored in order of their vertical component. This way + * connections in an area may be looked up quickly using a binary search. + * @constructor + */ +Blockly.ConnectionDB = function() { +}; + +Blockly.ConnectionDB.prototype = new Array(); +/** + * Don't inherit the constructor from Array. + * @type {!Function} + */ +Blockly.ConnectionDB.constructor = Blockly.ConnectionDB; + +/** + * Add a connection to the database. Must not already exist in DB. + * @param {!Blockly.Connection} connection The connection to be added. + */ +Blockly.ConnectionDB.prototype.addConnection = function(connection) { + if (connection.inDB_) { + throw 'Connection already in database.'; + } + if (connection.getSourceBlock().isInFlyout) { + // Don't bother maintaining a database of connections in a flyout. + return; + } + var position = this.findPositionForConnection_(connection); + this.splice(position, 0, connection); + connection.inDB_ = true; +}; + +/** + * Find the given connection. + * Starts by doing a binary search to find the approximate location, then + * linearly searches nearby for the exact connection. + * @param {!Blockly.Connection} conn The connection to find. + * @return {number} The index of the connection, or -1 if the connection was + * not found. + */ +Blockly.ConnectionDB.prototype.findConnection = function(conn) { + if (!this.length) { + return -1; + } + + var bestGuess = this.findPositionForConnection_(conn); + if (bestGuess >= this.length) { + // Not in list + return -1; + } + + var yPos = conn.y_; + // Walk forward and back on the y axis looking for the connection. + var pointerMin = bestGuess; + var pointerMax = bestGuess; + while (pointerMin >= 0 && this[pointerMin].y_ == yPos) { + if (this[pointerMin] == conn) { + return pointerMin; + } + pointerMin--; + } + + while (pointerMax < this.length && this[pointerMax].y_ == yPos) { + if (this[pointerMax] == conn) { + return pointerMax; + } + pointerMax++; + } + return -1; +}; + +/** + * Finds a candidate position for inserting this connection into the list. + * This will be in the correct y order but makes no guarantees about ordering in + * the x axis. + * @param {!Blockly.Connection} connection The connection to insert. + * @return {number} The candidate index. + * @private + */ +Blockly.ConnectionDB.prototype.findPositionForConnection_ = + function(connection) { + /* eslint-disable indent */ + if (!this.length) { + return 0; + } + var pointerMin = 0; + var pointerMax = this.length; + while (pointerMin < pointerMax) { + var pointerMid = Math.floor((pointerMin + pointerMax) / 2); + if (this[pointerMid].y_ < connection.y_) { + pointerMin = pointerMid + 1; + } else if (this[pointerMid].y_ > connection.y_) { + pointerMax = pointerMid; + } else { + pointerMin = pointerMid; + break; + } + } + return pointerMin; +}; /* eslint-enable indent */ + +/** + * Remove a connection from the database. Must already exist in DB. + * @param {!Blockly.Connection} connection The connection to be removed. + * @private + */ +Blockly.ConnectionDB.prototype.removeConnection_ = function(connection) { + if (!connection.inDB_) { + throw 'Connection not in database.'; + } + var removalIndex = this.findConnection(connection); + if (removalIndex == -1) { + throw 'Unable to find connection in connectionDB.'; + } + connection.inDB_ = false; + this.splice(removalIndex, 1); +}; + +/** + * Find all nearby connections to the given connection. + * Type checking does not apply, since this function is used for bumping. + * @param {!Blockly.Connection} connection The connection whose neighbours + * should be returned. + * @param {number} maxRadius The maximum radius to another connection. + * @return {!Array.} List of connections. + */ +Blockly.ConnectionDB.prototype.getNeighbours = function(connection, maxRadius) { + var db = this; + var currentX = connection.x_; + var currentY = connection.y_; + + // Binary search to find the closest y location. + var pointerMin = 0; + var pointerMax = db.length - 2; + var pointerMid = pointerMax; + while (pointerMin < pointerMid) { + if (db[pointerMid].y_ < currentY) { + pointerMin = pointerMid; + } else { + pointerMax = pointerMid; + } + pointerMid = Math.floor((pointerMin + pointerMax) / 2); + } + + var neighbours = []; + /** + * Computes if the current connection is within the allowed radius of another + * connection. + * This function is a closure and has access to outside variables. + * @param {number} yIndex The other connection's index in the database. + * @return {boolean} True if the current connection's vertical distance from + * the other connection is less than the allowed radius. + */ + function checkConnection_(yIndex) { + var dx = currentX - db[yIndex].x_; + var dy = currentY - db[yIndex].y_; + var r = Math.sqrt(dx * dx + dy * dy); + if (r <= maxRadius) { + neighbours.push(db[yIndex]); + } + return dy < maxRadius; + } + + // Walk forward and back on the y axis looking for the closest x,y point. + pointerMin = pointerMid; + pointerMax = pointerMid; + if (db.length) { + while (pointerMin >= 0 && checkConnection_(pointerMin)) { + pointerMin--; + } + do { + pointerMax++; + } while (pointerMax < db.length && checkConnection_(pointerMax)); + } + + return neighbours; +}; + + +/** + * Is the candidate connection close to the reference connection. + * Extremely fast; only looks at Y distance. + * @param {number} index Index in database of candidate connection. + * @param {number} baseY Reference connection's Y value. + * @param {number} maxRadius The maximum radius to another connection. + * @return {boolean} True if connection is in range. + * @private + */ +Blockly.ConnectionDB.prototype.isInYRange_ = function(index, baseY, maxRadius) { + return (Math.abs(this[index].y_ - baseY) <= maxRadius); +}; + +/** + * Find the closest compatible connection to this connection. + * @param {!Blockly.Connection} conn The connection searching for a compatible + * mate. + * @param {number} maxRadius The maximum radius to another connection. + * @param {!goog.math.Coordinate} dxy Offset between this connection's location + * in the database and the current location (as a result of dragging). + * @return {!{connection: ?Blockly.Connection, radius: number}} Contains two + * properties:' connection' which is either another connection or null, + * and 'radius' which is the distance. + */ +Blockly.ConnectionDB.prototype.searchForClosest = function(conn, maxRadius, + dxy) { + // Don't bother. + if (!this.length) { + return {connection: null, radius: maxRadius}; + } + + // Stash the values of x and y from before the drag. + var baseY = conn.y_; + var baseX = conn.x_; + + conn.x_ = baseX + dxy.x; + conn.y_ = baseY + dxy.y; + + // findPositionForConnection finds an index for insertion, which is always + // after any block with the same y index. We want to search both forward + // and back, so search on both sides of the index. + var closestIndex = this.findPositionForConnection_(conn); + + var bestConnection = null; + var bestRadius = maxRadius; + var temp; + + // Walk forward and back on the y axis looking for the closest x,y point. + var pointerMin = closestIndex - 1; + while (pointerMin >= 0 && this.isInYRange_(pointerMin, conn.y_, maxRadius)) { + temp = this[pointerMin]; + if (conn.isConnectionAllowed(temp, bestRadius)) { + bestConnection = temp; + bestRadius = temp.distanceFrom(conn); + } + pointerMin--; + } + + var pointerMax = closestIndex; + while (pointerMax < this.length && this.isInYRange_(pointerMax, conn.y_, + maxRadius)) { + temp = this[pointerMax]; + if (conn.isConnectionAllowed(temp, bestRadius)) { + bestConnection = temp; + bestRadius = temp.distanceFrom(conn); + } + pointerMax++; + } + + // Reset the values of x and y. + conn.x_ = baseX; + conn.y_ = baseY; + + // If there were no valid connections, bestConnection will be null. + return {connection: bestConnection, radius: bestRadius}; +}; + +/** + * Initialize a set of connection DBs for a specified workspace. + * @param {!Blockly.Workspace} workspace The workspace this DB is for. + */ +Blockly.ConnectionDB.init = function(workspace) { + // Create four databases, one for each connection type. + var dbList = []; + dbList[Blockly.INPUT_VALUE] = new Blockly.ConnectionDB(); + dbList[Blockly.OUTPUT_VALUE] = new Blockly.ConnectionDB(); + dbList[Blockly.NEXT_STATEMENT] = new Blockly.ConnectionDB(); + dbList[Blockly.PREVIOUS_STATEMENT] = new Blockly.ConnectionDB(); + workspace.connectionDBList = dbList; +}; diff --git a/src/opsoro/server/static/js/blockly/core/constants.js b/src/opsoro/server/static/js/blockly/core/constants.js new file mode 100644 index 0000000..f69531e --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/constants.js @@ -0,0 +1,238 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Blockly constants. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.constants'); + + +/** + * Number of pixels the mouse must move before a drag starts. + */ +Blockly.DRAG_RADIUS = 5; + +/** + * Maximum misalignment between connections for them to snap together. + */ +Blockly.SNAP_RADIUS = 20; + +/** + * Delay in ms between trigger and bumping unconnected block out of alignment. + */ +Blockly.BUMP_DELAY = 250; + +/** + * Number of characters to truncate a collapsed block to. + */ +Blockly.COLLAPSE_CHARS = 30; + +/** + * Length in ms for a touch to become a long press. + */ +Blockly.LONGPRESS = 750; + +/** + * Prevent a sound from playing if another sound preceded it within this many + * milliseconds. + */ +Blockly.SOUND_LIMIT = 100; + +/** + * When dragging a block out of a stack, split the stack in two (true), or drag + * out the block healing the stack (false). + */ +Blockly.DRAG_STACK = true; + +/** + * The richness of block colours, regardless of the hue. + * Must be in the range of 0 (inclusive) to 1 (exclusive). + */ +Blockly.HSV_SATURATION = 0.45; + +/** + * The intensity of block colours, regardless of the hue. + * Must be in the range of 0 (inclusive) to 1 (exclusive). + */ +Blockly.HSV_VALUE = 0.65; + +/** + * Sprited icons and images. + */ +Blockly.SPRITE = { + width: 96, + height: 124, + url: 'sprites.png' +}; + +// Constants below this point are not intended to be changed. + +/** + * Required name space for SVG elements. + * @const + */ +Blockly.SVG_NS = 'http://www.w3.org/2000/svg'; + +/** + * Required name space for HTML elements. + * @const + */ +Blockly.HTML_NS = 'http://www.w3.org/1999/xhtml'; + +/** + * ENUM for a right-facing value input. E.g. 'set item to' or 'return'. + * @const + */ +Blockly.INPUT_VALUE = 1; + +/** + * ENUM for a left-facing value output. E.g. 'random fraction'. + * @const + */ +Blockly.OUTPUT_VALUE = 2; + +/** + * ENUM for a down-facing block stack. E.g. 'if-do' or 'else'. + * @const + */ +Blockly.NEXT_STATEMENT = 3; + +/** + * ENUM for an up-facing block stack. E.g. 'break out of loop'. + * @const + */ +Blockly.PREVIOUS_STATEMENT = 4; + +/** + * ENUM for an dummy input. Used to add field(s) with no input. + * @const + */ +Blockly.DUMMY_INPUT = 5; + +/** + * ENUM for left alignment. + * @const + */ +Blockly.ALIGN_LEFT = -1; + +/** + * ENUM for centre alignment. + * @const + */ +Blockly.ALIGN_CENTRE = 0; + +/** + * ENUM for right alignment. + * @const + */ +Blockly.ALIGN_RIGHT = 1; + +/** + * ENUM for no drag operation. + * @const + */ +Blockly.DRAG_NONE = 0; + +/** + * ENUM for inside the sticky DRAG_RADIUS. + * @const + */ +Blockly.DRAG_STICKY = 1; + +/** + * ENUM for inside the non-sticky DRAG_RADIUS, for differentiating between + * clicks and drags. + * @const + */ +Blockly.DRAG_BEGIN = 1; + +/** + * ENUM for freely draggable (outside the DRAG_RADIUS, if one applies). + * @const + */ +Blockly.DRAG_FREE = 2; + +/** + * Lookup table for determining the opposite type of a connection. + * @const + */ +Blockly.OPPOSITE_TYPE = []; +Blockly.OPPOSITE_TYPE[Blockly.INPUT_VALUE] = Blockly.OUTPUT_VALUE; +Blockly.OPPOSITE_TYPE[Blockly.OUTPUT_VALUE] = Blockly.INPUT_VALUE; +Blockly.OPPOSITE_TYPE[Blockly.NEXT_STATEMENT] = Blockly.PREVIOUS_STATEMENT; +Blockly.OPPOSITE_TYPE[Blockly.PREVIOUS_STATEMENT] = Blockly.NEXT_STATEMENT; + + +/** + * ENUM for toolbox and flyout at top of screen. + * @const + */ +Blockly.TOOLBOX_AT_TOP = 0; + +/** + * ENUM for toolbox and flyout at bottom of screen. + * @const + */ +Blockly.TOOLBOX_AT_BOTTOM = 1; + +/** + * ENUM for toolbox and flyout at left of screen. + * @const + */ +Blockly.TOOLBOX_AT_LEFT = 2; + +/** + * ENUM for toolbox and flyout at right of screen. + * @const + */ +Blockly.TOOLBOX_AT_RIGHT = 3; + + +/** + * ENUM representing that an event is in the delete area of the trash can. + * @const + */ +Blockly.DELETE_AREA_TRASH = 1; + +/** + * ENUM representing that an event is in the delete area of the toolbox or + * flyout. + * @const + */ +Blockly.DELETE_AREA_TOOLBOX = 2; + +/** + * String for use in the "custom" attribute of a category in toolbox xml. + * This string indicates that the category should be dynamically populated with + * variable blocks. + * @const {string} + */ +Blockly.VARIABLE_CATEGORY_NAME = 'VARIABLE'; + +/** + * String for use in the "custom" attribute of a category in toolbox xml. + * This string indicates that the category should be dynamically populated with + * procedure blocks. + * @const {string} + */ +Blockly.PROCEDURE_CATEGORY_NAME = 'PROCEDURE'; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/contextmenu.js b/src/opsoro/server/static/js/blockly/core/contextmenu.js similarity index 76% rename from src/opsoro/apps/visual_programming/static/blockly/core/contextmenu.js rename to src/opsoro/server/static/js/blockly/core/contextmenu.js index 55a41be..b19702c 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/core/contextmenu.js +++ b/src/opsoro/server/static/js/blockly/core/contextmenu.js @@ -24,6 +24,10 @@ */ 'use strict'; +/** + * @name Blockly.ContextMenu + * @namespace + */ goog.provide('Blockly.ContextMenu'); goog.require('goog.dom'); @@ -58,17 +62,18 @@ Blockly.ContextMenu.show = function(e, options, rtl) { */ var menu = new goog.ui.Menu(); menu.setRightToLeft(rtl); - for (var x = 0, option; option = options[x]; x++) { + for (var i = 0, option; option = options[i]; i++) { var menuItem = new goog.ui.MenuItem(option.text); menuItem.setRightToLeft(rtl); menu.addChild(menuItem, true); menuItem.setEnabled(option.enabled); if (option.enabled) { - var evtHandlerCapturer = function(callback) { - return function() { Blockly.doCommand(callback); }; - }; goog.events.listen(menuItem, goog.ui.Component.EventType.ACTION, - evtHandlerCapturer(option.callback)); + option.callback); + menuItem.handleContextMenu = function(e) { + // Right-clicking on menu option should count as a click. + goog.events.dispatchEvent(this, goog.ui.Component.EventType.ACTION); + }; } } goog.events.listen(menu, goog.ui.Component.EventType.ACTION, @@ -79,7 +84,10 @@ Blockly.ContextMenu.show = function(e, options, rtl) { var div = Blockly.WidgetDiv.DIV; menu.render(div); var menuDom = menu.getElement(); - Blockly.addClass_(menuDom, 'blocklyContextMenu'); + Blockly.utils.addClass(menuDom, 'blocklyContextMenu'); + // Prevent system context menu when right-clicking a Blockly context menu. + Blockly.bindEventWithChecks_(menuDom, 'contextmenu', null, + Blockly.utils.noEvent); // Record menuSize after adding menu. var menuSize = goog.style.getSize(menuDom); @@ -126,16 +134,24 @@ Blockly.ContextMenu.hide = function() { */ Blockly.ContextMenu.callbackFactory = function(block, xml) { return function() { - var newBlock = Blockly.Xml.domToBlock(block.workspace, xml); - // Move the new block next to the old block. - var xy = block.getRelativeToSurfaceXY(); - if (block.RTL) { - xy.x -= Blockly.SNAP_RADIUS; - } else { - xy.x += Blockly.SNAP_RADIUS; + Blockly.Events.disable(); + try { + var newBlock = Blockly.Xml.domToBlock(xml, block.workspace); + // Move the new block next to the old block. + var xy = block.getRelativeToSurfaceXY(); + if (block.RTL) { + xy.x -= Blockly.SNAP_RADIUS; + } else { + xy.x += Blockly.SNAP_RADIUS; + } + xy.y += Blockly.SNAP_RADIUS * 2; + newBlock.moveBy(xy.x, xy.y); + } finally { + Blockly.Events.enable(); + } + if (Blockly.Events.isEnabled() && !newBlock.isShadow()) { + Blockly.Events.fire(new Blockly.Events.Create(newBlock)); } - xy.y += Blockly.SNAP_RADIUS * 2; - newBlock.moveBy(xy.x, xy.y); newBlock.select(); }; }; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/css.js b/src/opsoro/server/static/js/blockly/core/css.js similarity index 87% rename from src/opsoro/apps/visual_programming/static/blockly/core/css.js rename to src/opsoro/server/static/js/blockly/core/css.js index 371a909..1e630bf 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/core/css.js +++ b/src/opsoro/server/static/js/blockly/core/css.js @@ -24,6 +24,10 @@ */ 'use strict'; +/** + * @name Blockly.Css + * @namespace + */ goog.provide('Blockly.Css'); @@ -84,9 +88,10 @@ Blockly.Css.inject = function(hasCss, pathToMedia) { // Strip off any trailing slash (either Unix or Windows). Blockly.Css.mediaPath_ = pathToMedia.replace(/[\\\/]$/, ''); text = text.replace(/<<>>/g, Blockly.Css.mediaPath_); - // Inject CSS tag. + // Inject CSS tag at start of head. var cssNode = document.createElement('style'); - document.head.appendChild(cssNode); + document.head.insertBefore(cssNode, document.head.firstChild); + var cssTextNode = document.createTextNode(text); cssNode.appendChild(cssTextNode); Blockly.Css.styleSheet_ = cssNode.sheet; @@ -135,12 +140,46 @@ Blockly.Css.CONTENT = [ 'background-color: #fff;', 'outline: none;', 'overflow: hidden;', /* IE overflows by default. */ + 'position: absolute;', + 'display: block;', '}', '.blocklyWidgetDiv {', 'display: none;', 'position: absolute;', - 'z-index: 999;', + 'z-index: 99999;', /* big value for bootstrap3 compatibility */ + '}', + + '.injectionDiv {', + 'height: 100%;', + 'position: relative;', + 'overflow: hidden;', /* So blocks in drag surface disappear at edges */ + '}', + + '.blocklyNonSelectable {', + 'user-select: none;', + '-moz-user-select: none;', + '-webkit-user-select: none;', + '-ms-user-select: none;', + '}', + + '.blocklyWsDragSurface {', + 'display: none;', + 'position: absolute;', + 'overflow: visible;', + 'top: 0;', + 'left: 0;', + '}', + + '.blocklyBlockDragSurface {', + 'display: none;', + 'position: absolute;', + 'top: 0;', + 'left: 0;', + 'right: 0;', + 'bottom: 0;', + 'overflow: visible !important;', + 'z-index: 50;', /* Display below toolbox, but above everything else. */ '}', '.blocklyTooltipDiv {', @@ -154,7 +193,7 @@ Blockly.Css.CONTENT = [ 'opacity: 0.9;', 'padding: 2px;', 'position: absolute;', - 'z-index: 1000;', + 'z-index: 100000;', /* big value for bootstrap3 compatibility */ '}', '.blocklyResizeSE {', @@ -244,11 +283,40 @@ Blockly.Css.CONTENT = [ 'fill: #000;', '}', + '.blocklyFlyout {', + 'position: absolute;', + 'z-index: 20;', + '}', + '.blocklyFlyoutButton {', + 'fill: #888;', + 'cursor: default;', + '}', + + '.blocklyFlyoutButtonShadow {', + 'fill: #666;', + '}', + + '.blocklyFlyoutButton:hover {', + 'fill: #aaa;', + '}', + + '.blocklyFlyoutLabel {', + 'cursor: default;', + '}', + + '.blocklyFlyoutLabelBackground {', + 'opacity: 0;', + '}', + + '.blocklyFlyoutLabelText {', + 'fill: #000;', + '}', + /* Don't allow users to select text. It gets annoying when trying to drag a block and selected text moves instead. */ - '.blocklySvg text {', + '.blocklySvg text, .blocklyBlockDragSurface text {', 'user-select: none;', '-moz-user-select: none;', '-webkit-user-select: none;', @@ -272,6 +340,16 @@ Blockly.Css.CONTENT = [ 'opacity: .6;', '}', + '.blocklyIconShape {', + 'fill: #00f;', + 'stroke: #fff;', + 'stroke-width: 1px;', + '}', + + '.blocklyIconSymbol {', + 'fill: #fff;', + '}', + '.blocklyMinimalBody {', 'margin: 0;', 'padding: 0;', @@ -312,16 +390,29 @@ Blockly.Css.CONTENT = [ 'fill-opacity: .8;', '}', + '.blocklyMainWorkspaceScrollbar {', + 'z-index: 20;', + '}', + + '.blocklyFlyoutScrollbar {', + 'z-index: 30;', + '}', + + '.blocklyScrollbarHorizontal, .blocklyScrollbarVertical {', + 'position: absolute;', + 'outline: none;', + '}', + '.blocklyScrollbarBackground {', 'opacity: 0;', '}', - '.blocklyScrollbarKnob {', + '.blocklyScrollbarHandle {', 'fill: #ccc;', '}', - '.blocklyScrollbarBackground:hover+.blocklyScrollbarKnob,', - '.blocklyScrollbarKnob:hover {', + '.blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,', + '.blocklyScrollbarHandle:hover {', 'fill: #bbb;', '}', @@ -339,12 +430,12 @@ Blockly.Css.CONTENT = [ /* Darken flyout scrollbars due to being on a grey background. */ /* By contrast, workspace scrollbars are on a white background. */ - '.blocklyFlyout .blocklyScrollbarKnob {', + '.blocklyFlyout .blocklyScrollbarHandle {', 'fill: #bbb;', '}', - '.blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarKnob,', - '.blocklyFlyout .blocklyScrollbarKnob:hover {', + '.blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,', + '.blocklyFlyout .blocklyScrollbarHandle:hover {', 'fill: #aaa;', '}', @@ -366,13 +457,14 @@ Blockly.Css.CONTENT = [ '.blocklyAngleGauge {', 'fill: #f88;', - 'fill-opacity: .8; ', + 'fill-opacity: .8;', '}', '.blocklyAngleLine {', 'stroke: #f00;', 'stroke-width: 2;', 'stroke-linecap: round;', + 'pointer-events: none;', '}', '.blocklyContextMenu {', @@ -395,6 +487,7 @@ Blockly.Css.CONTENT = [ 'overflow-x: visible;', 'overflow-y: auto;', 'position: absolute;', + 'z-index: 70;', /* so blocks go under toolbox when dragging */ '}', '.blocklyTreeRoot {', @@ -413,9 +506,18 @@ Blockly.Css.CONTENT = [ 'white-space: nowrap;', '}', + '.blocklyHorizontalTree {', + 'float: left;', + 'margin: 1px 5px 8px 0;', + '}', + + '.blocklyHorizontalTreeRtl {', + 'float: right;', + 'margin: 1px 0 8px 5px;', + '}', + '.blocklyToolboxDiv[dir="RTL"] .blocklyTreeRow {', - 'padding-right: 0;', - 'padding-left: 8px !important;', + 'margin-left: 8px;', '}', '.blocklyTreeRow:not(.blocklyTreeSelected):hover {', @@ -424,10 +526,18 @@ Blockly.Css.CONTENT = [ '.blocklyTreeSeparator {', 'border-bottom: solid #e5e5e5 1px;', - 'height: 0px;', + 'height: 0;', 'margin: 5px 0;', '}', + '.blocklyTreeSeparatorHorizontal {', + 'border-right: solid #e5e5e5 1px;', + 'width: 0;', + 'padding: 5px 0;', + 'margin: 0 5px;', + '}', + + '.blocklyTreeIcon {', 'background-image: url(<<>>/sprites.png);', 'height: 16px;', diff --git a/src/opsoro/server/static/js/blockly/core/events.js b/src/opsoro/server/static/js/blockly/core/events.js new file mode 100644 index 0000000..a5f5b71 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/events.js @@ -0,0 +1,833 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Events fired as a result of actions in Blockly's editor. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +/** + * Events fired as a result of actions in Blockly's editor. + * @namespace Blockly.Events + */ +goog.provide('Blockly.Events'); + +goog.require('goog.array'); +goog.require('goog.math.Coordinate'); + + +/** + * Group ID for new events. Grouped events are indivisible. + * @type {string} + * @private + */ +Blockly.Events.group_ = ''; + +/** + * Sets whether events should be added to the undo stack. + * @type {boolean} + */ +Blockly.Events.recordUndo = true; + +/** + * Allow change events to be created and fired. + * @type {number} + * @private + */ +Blockly.Events.disabled_ = 0; + +/** + * Name of event that creates a block. + * @const + */ +Blockly.Events.CREATE = 'create'; + +/** + * Name of event that deletes a block. + * @const + */ +Blockly.Events.DELETE = 'delete'; + +/** + * Name of event that changes a block. + * @const + */ +Blockly.Events.CHANGE = 'change'; + +/** + * Name of event that moves a block. + * @const + */ +Blockly.Events.MOVE = 'move'; + +/** + * Name of event that records a UI change. + * @const + */ +Blockly.Events.UI = 'ui'; + +/** + * List of events queued for firing. + * @private + */ +Blockly.Events.FIRE_QUEUE_ = []; + +/** + * Create a custom event and fire it. + * @param {!Blockly.Events.Abstract} event Custom data for event. + */ +Blockly.Events.fire = function(event) { + if (!Blockly.Events.isEnabled()) { + return; + } + if (!Blockly.Events.FIRE_QUEUE_.length) { + // First event added; schedule a firing of the event queue. + setTimeout(Blockly.Events.fireNow_, 0); + } + Blockly.Events.FIRE_QUEUE_.push(event); +}; + +/** + * Fire all queued events. + * @private + */ +Blockly.Events.fireNow_ = function() { + var queue = Blockly.Events.filter(Blockly.Events.FIRE_QUEUE_, true); + Blockly.Events.FIRE_QUEUE_.length = 0; + for (var i = 0, event; event = queue[i]; i++) { + var workspace = Blockly.Workspace.getById(event.workspaceId); + if (workspace) { + workspace.fireChangeListener(event); + } + } +}; + +/** + * Filter the queued events and merge duplicates. + * @param {!Array.} queueIn Array of events. + * @param {boolean} forward True if forward (redo), false if backward (undo). + * @return {!Array.} Array of filtered events. + */ +Blockly.Events.filter = function(queueIn, forward) { + var queue = goog.array.clone(queueIn); + if (!forward) { + // Undo is merged in reverse order. + queue.reverse(); + } + // Merge duplicates. O(n^2), but n should be very small. + for (var i = 0, event1; event1 = queue[i]; i++) { + for (var j = i + 1, event2; event2 = queue[j]; j++) { + if (event1.type == event2.type && + event1.blockId == event2.blockId && + event1.workspaceId == event2.workspaceId) { + if (event1.type == Blockly.Events.MOVE) { + // Merge move events. + event1.newParentId = event2.newParentId; + event1.newInputName = event2.newInputName; + event1.newCoordinate = event2.newCoordinate; + queue.splice(j, 1); + j--; + } else if (event1.type == Blockly.Events.CHANGE && + event1.element == event2.element && + event1.name == event2.name) { + // Merge change events. + event1.newValue = event2.newValue; + queue.splice(j, 1); + j--; + } else if (event1.type == Blockly.Events.UI && + event2.element == 'click' && + (event1.element == 'commentOpen' || + event1.element == 'mutatorOpen' || + event1.element == 'warningOpen')) { + // Merge change events. + event1.newValue = event2.newValue; + queue.splice(j, 1); + j--; + } + } + } + } + // Remove null events. + for (var i = queue.length - 1; i >= 0; i--) { + if (queue[i].isNull()) { + queue.splice(i, 1); + } + } + if (!forward) { + // Restore undo order. + queue.reverse(); + } + // Move mutation events to the top of the queue. + // Intentionally skip first event. + for (var i = 1, event; event = queue[i]; i++) { + if (event.type == Blockly.Events.CHANGE && + event.element == 'mutation') { + queue.unshift(queue.splice(i, 1)[0]); + } + } + return queue; +}; + +/** + * Modify pending undo events so that when they are fired they don't land + * in the undo stack. Called by Blockly.Workspace.clearUndo. + */ +Blockly.Events.clearPendingUndo = function() { + for (var i = 0, event; event = Blockly.Events.FIRE_QUEUE_[i]; i++) { + event.recordUndo = false; + } +}; + +/** + * Stop sending events. Every call to this function MUST also call enable. + */ +Blockly.Events.disable = function() { + Blockly.Events.disabled_++; +}; + +/** + * Start sending events. Unless events were already disabled when the + * corresponding call to disable was made. + */ +Blockly.Events.enable = function() { + Blockly.Events.disabled_--; +}; + +/** + * Returns whether events may be fired or not. + * @return {boolean} True if enabled. + */ +Blockly.Events.isEnabled = function() { + return Blockly.Events.disabled_ == 0; +}; + +/** + * Current group. + * @return {string} ID string. + */ +Blockly.Events.getGroup = function() { + return Blockly.Events.group_; +}; + +/** + * Start or stop a group. + * @param {boolean|string} state True to start new group, false to end group. + * String to set group explicitly. + */ +Blockly.Events.setGroup = function(state) { + if (typeof state == 'boolean') { + Blockly.Events.group_ = state ? Blockly.utils.genUid() : ''; + } else { + Blockly.Events.group_ = state; + } +}; + +/** + * Compute a list of the IDs of the specified block and all its descendants. + * @param {!Blockly.Block} block The root block. + * @return {!Array.} List of block IDs. + * @private + */ +Blockly.Events.getDescendantIds_ = function(block) { + var ids = []; + var descendants = block.getDescendants(); + for (var i = 0, descendant; descendant = descendants[i]; i++) { + ids[i] = descendant.id; + } + return ids; +}; + +/** + * Decode the JSON into an event. + * @param {!Object} json JSON representation. + * @param {!Blockly.Workspace} workspace Target workspace for event. + * @return {!Blockly.Events.Abstract} The event represented by the JSON. + */ +Blockly.Events.fromJson = function(json, workspace) { + var event; + switch (json.type) { + case Blockly.Events.CREATE: + event = new Blockly.Events.Create(null); + break; + case Blockly.Events.DELETE: + event = new Blockly.Events.Delete(null); + break; + case Blockly.Events.CHANGE: + event = new Blockly.Events.Change(null); + break; + case Blockly.Events.MOVE: + event = new Blockly.Events.Move(null); + break; + case Blockly.Events.UI: + event = new Blockly.Events.Ui(null); + break; + default: + throw 'Unknown event type.'; + } + event.fromJson(json); + event.workspaceId = workspace.id; + return event; +}; + +/** + * Abstract class for an event. + * @param {Blockly.Block} block The block. + * @constructor + */ +Blockly.Events.Abstract = function(block) { + if (block) { + this.blockId = block.id; + this.workspaceId = block.workspace.id; + } + this.group = Blockly.Events.group_; + this.recordUndo = Blockly.Events.recordUndo; +}; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Abstract.prototype.toJson = function() { + var json = { + 'type': this.type + }; + if (this.blockId) { + json['blockId'] = this.blockId; + } + if (this.group) { + json['group'] = this.group; + } + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Abstract.prototype.fromJson = function(json) { + this.blockId = json['blockId']; + this.group = json['group']; +}; + +/** + * Does this event record any change of state? + * @return {boolean} True if null, false if something changed. + */ +Blockly.Events.Abstract.prototype.isNull = function() { + return false; +}; + +/** + * Run an event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.Abstract.prototype.run = function(forward) { + // Defined by subclasses. +}; + +/** + * Class for a block creation event. + * @param {Blockly.Block} block The created block. Null for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ +Blockly.Events.Create = function(block) { + if (!block) { + return; // Blank event to be populated by fromJson. + } + Blockly.Events.Create.superClass_.constructor.call(this, block); + + if (block.workspace.rendered) { + this.xml = Blockly.Xml.blockToDomWithXY(block); + } else { + this.xml = Blockly.Xml.blockToDom(block); + } + this.ids = Blockly.Events.getDescendantIds_(block); +}; +goog.inherits(Blockly.Events.Create, Blockly.Events.Abstract); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Create.prototype.type = Blockly.Events.CREATE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Create.prototype.toJson = function() { + var json = Blockly.Events.Create.superClass_.toJson.call(this); + json['xml'] = Blockly.Xml.domToText(this.xml); + json['ids'] = this.ids; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Create.prototype.fromJson = function(json) { + Blockly.Events.Create.superClass_.fromJson.call(this, json); + this.xml = Blockly.Xml.textToDom('' + json['xml'] + '').firstChild; + this.ids = json['ids']; +}; + +/** + * Run a creation event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.Create.prototype.run = function(forward) { + var workspace = Blockly.Workspace.getById(this.workspaceId); + if (forward) { + var xml = goog.dom.createDom('xml'); + xml.appendChild(this.xml); + Blockly.Xml.domToWorkspace(xml, workspace); + } else { + for (var i = 0, id; id = this.ids[i]; i++) { + var block = workspace.getBlockById(id); + if (block) { + block.dispose(false, false); + } else if (id == this.blockId) { + // Only complain about root-level block. + console.warn("Can't uncreate non-existant block: " + id); + } + } + } +}; + +/** + * Class for a block deletion event. + * @param {Blockly.Block} block The deleted block. Null for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ +Blockly.Events.Delete = function(block) { + if (!block) { + return; // Blank event to be populated by fromJson. + } + if (block.getParent()) { + throw 'Connected blocks cannot be deleted.'; + } + Blockly.Events.Delete.superClass_.constructor.call(this, block); + + if (block.workspace.rendered) { + this.oldXml = Blockly.Xml.blockToDomWithXY(block); + } else { + this.oldXml = Blockly.Xml.blockToDom(block); + } + this.ids = Blockly.Events.getDescendantIds_(block); +}; +goog.inherits(Blockly.Events.Delete, Blockly.Events.Abstract); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Delete.prototype.type = Blockly.Events.DELETE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Delete.prototype.toJson = function() { + var json = Blockly.Events.Delete.superClass_.toJson.call(this); + json['ids'] = this.ids; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Delete.prototype.fromJson = function(json) { + Blockly.Events.Delete.superClass_.fromJson.call(this, json); + this.ids = json['ids']; +}; + +/** + * Run a deletion event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.Delete.prototype.run = function(forward) { + var workspace = Blockly.Workspace.getById(this.workspaceId); + if (forward) { + for (var i = 0, id; id = this.ids[i]; i++) { + var block = workspace.getBlockById(id); + if (block) { + block.dispose(false, false); + } else if (id == this.blockId) { + // Only complain about root-level block. + console.warn("Can't delete non-existant block: " + id); + } + } + } else { + var xml = goog.dom.createDom('xml'); + xml.appendChild(this.oldXml); + Blockly.Xml.domToWorkspace(xml, workspace); + } +}; + +/** + * Class for a block change event. + * @param {Blockly.Block} block The changed block. Null for a blank event. + * @param {string} element One of 'field', 'comment', 'disabled', etc. + * @param {?string} name Name of input or field affected, or null. + * @param {string} oldValue Previous value of element. + * @param {string} newValue New value of element. + * @extends {Blockly.Events.Abstract} + * @constructor + */ +Blockly.Events.Change = function(block, element, name, oldValue, newValue) { + if (!block) { + return; // Blank event to be populated by fromJson. + } + Blockly.Events.Change.superClass_.constructor.call(this, block); + this.element = element; + this.name = name; + this.oldValue = oldValue; + this.newValue = newValue; +}; +goog.inherits(Blockly.Events.Change, Blockly.Events.Abstract); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Change.prototype.type = Blockly.Events.CHANGE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Change.prototype.toJson = function() { + var json = Blockly.Events.Change.superClass_.toJson.call(this); + json['element'] = this.element; + if (this.name) { + json['name'] = this.name; + } + json['newValue'] = this.newValue; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Change.prototype.fromJson = function(json) { + Blockly.Events.Change.superClass_.fromJson.call(this, json); + this.element = json['element']; + this.name = json['name']; + this.newValue = json['newValue']; +}; + +/** + * Does this event record any change of state? + * @return {boolean} True if something changed. + */ +Blockly.Events.Change.prototype.isNull = function() { + return this.oldValue == this.newValue; +}; + +/** + * Run a change event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.Change.prototype.run = function(forward) { + var workspace = Blockly.Workspace.getById(this.workspaceId); + var block = workspace.getBlockById(this.blockId); + if (!block) { + console.warn("Can't change non-existant block: " + this.blockId); + return; + } + if (block.mutator) { + // Close the mutator (if open) since we don't want to update it. + block.mutator.setVisible(false); + } + var value = forward ? this.newValue : this.oldValue; + switch (this.element) { + case 'field': + var field = block.getField(this.name); + if (field) { + // Run the validator for any side-effects it may have. + // The validator's opinion on validity is ignored. + field.callValidator(value); + field.setValue(value); + } else { + console.warn("Can't set non-existant field: " + this.name); + } + break; + case 'comment': + block.setCommentText(value || null); + break; + case 'collapsed': + block.setCollapsed(value); + break; + case 'disabled': + block.setDisabled(value); + break; + case 'inline': + block.setInputsInline(value); + break; + case 'mutation': + var oldMutation = ''; + if (block.mutationToDom) { + var oldMutationDom = block.mutationToDom(); + oldMutation = oldMutationDom && Blockly.Xml.domToText(oldMutationDom); + } + if (block.domToMutation) { + value = value || ''; + var dom = Blockly.Xml.textToDom('' + value + ''); + block.domToMutation(dom.firstChild); + } + Blockly.Events.fire(new Blockly.Events.Change( + block, 'mutation', null, oldMutation, value)); + break; + default: + console.warn('Unknown change type: ' + this.element); + } +}; + +/** + * Class for a block move event. Created before the move. + * @param {Blockly.Block} block The moved block. Null for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ +Blockly.Events.Move = function(block) { + if (!block) { + return; // Blank event to be populated by fromJson. + } + Blockly.Events.Move.superClass_.constructor.call(this, block); + var location = this.currentLocation_(); + this.oldParentId = location.parentId; + this.oldInputName = location.inputName; + this.oldCoordinate = location.coordinate; +}; +goog.inherits(Blockly.Events.Move, Blockly.Events.Abstract); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Move.prototype.type = Blockly.Events.MOVE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Move.prototype.toJson = function() { + var json = Blockly.Events.Move.superClass_.toJson.call(this); + if (this.newParentId) { + json['newParentId'] = this.newParentId; + } + if (this.newInputName) { + json['newInputName'] = this.newInputName; + } + if (this.newCoordinate) { + json['newCoordinate'] = Math.round(this.newCoordinate.x) + ',' + + Math.round(this.newCoordinate.y); + } + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Move.prototype.fromJson = function(json) { + Blockly.Events.Move.superClass_.fromJson.call(this, json); + this.newParentId = json['newParentId']; + this.newInputName = json['newInputName']; + if (json['newCoordinate']) { + var xy = json['newCoordinate'].split(','); + this.newCoordinate = + new goog.math.Coordinate(parseFloat(xy[0]), parseFloat(xy[1])); + } +}; + +/** + * Record the block's new location. Called after the move. + */ +Blockly.Events.Move.prototype.recordNew = function() { + var location = this.currentLocation_(); + this.newParentId = location.parentId; + this.newInputName = location.inputName; + this.newCoordinate = location.coordinate; +}; + +/** + * Returns the parentId and input if the block is connected, + * or the XY location if disconnected. + * @return {!Object} Collection of location info. + * @private + */ +Blockly.Events.Move.prototype.currentLocation_ = function() { + var workspace = Blockly.Workspace.getById(this.workspaceId); + var block = workspace.getBlockById(this.blockId); + var location = {}; + var parent = block.getParent(); + if (parent) { + location.parentId = parent.id; + var input = parent.getInputWithBlock(block); + if (input) { + location.inputName = input.name; + } + } else { + location.coordinate = block.getRelativeToSurfaceXY(); + } + return location; +}; + +/** + * Does this event record any change of state? + * @return {boolean} True if something changed. + */ +Blockly.Events.Move.prototype.isNull = function() { + return this.oldParentId == this.newParentId && + this.oldInputName == this.newInputName && + goog.math.Coordinate.equals(this.oldCoordinate, this.newCoordinate); +}; + +/** + * Run a move event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.Move.prototype.run = function(forward) { + var workspace = Blockly.Workspace.getById(this.workspaceId); + var block = workspace.getBlockById(this.blockId); + if (!block) { + console.warn("Can't move non-existant block: " + this.blockId); + return; + } + var parentId = forward ? this.newParentId : this.oldParentId; + var inputName = forward ? this.newInputName : this.oldInputName; + var coordinate = forward ? this.newCoordinate : this.oldCoordinate; + var parentBlock = null; + if (parentId) { + parentBlock = workspace.getBlockById(parentId); + if (!parentBlock) { + console.warn("Can't connect to non-existant block: " + parentId); + return; + } + } + if (block.getParent()) { + block.unplug(); + } + if (coordinate) { + var xy = block.getRelativeToSurfaceXY(); + block.moveBy(coordinate.x - xy.x, coordinate.y - xy.y); + } else { + var blockConnection = block.outputConnection || block.previousConnection; + var parentConnection; + if (inputName) { + var input = parentBlock.getInput(inputName); + if (input) { + parentConnection = input.connection; + } + } else if (blockConnection.type == Blockly.PREVIOUS_STATEMENT) { + parentConnection = parentBlock.nextConnection; + } + if (parentConnection) { + blockConnection.connect(parentConnection); + } else { + console.warn("Can't connect to non-existant input: " + inputName); + } + } +}; + +/** + * Class for a UI event. + * @param {Blockly.Block} block The affected block. + * @param {string} element One of 'selected', 'comment', 'mutator', etc. + * @param {string} oldValue Previous value of element. + * @param {string} newValue New value of element. + * @extends {Blockly.Events.Abstract} + * @constructor + */ +Blockly.Events.Ui = function(block, element, oldValue, newValue) { + Blockly.Events.Ui.superClass_.constructor.call(this, block); + this.element = element; + this.oldValue = oldValue; + this.newValue = newValue; + this.recordUndo = false; +}; +goog.inherits(Blockly.Events.Ui, Blockly.Events.Abstract); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Ui.prototype.type = Blockly.Events.UI; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Ui.prototype.toJson = function() { + var json = Blockly.Events.Ui.superClass_.toJson.call(this); + json['element'] = this.element; + if (this.newValue !== undefined) { + json['newValue'] = this.newValue; + } + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Ui.prototype.fromJson = function(json) { + Blockly.Events.Ui.superClass_.fromJson.call(this, json); + this.element = json['element']; + this.newValue = json['newValue']; +}; + +/** + * Enable/disable a block depending on whether it is properly connected. + * Use this on applications where all blocks should be connected to a top block. + * Recommend setting the 'disable' option to 'false' in the config so that + * users don't try to reenable disabled orphan blocks. + * @param {!Blockly.Events.Abstract} event Custom data for event. + */ +Blockly.Events.disableOrphans = function(event) { + if (event.type == Blockly.Events.MOVE || + event.type == Blockly.Events.CREATE) { + Blockly.Events.disable(); + var workspace = Blockly.Workspace.getById(event.workspaceId); + var block = workspace.getBlockById(event.blockId); + if (block) { + if (block.getParent() && !block.getParent().disabled) { + var children = block.getDescendants(); + for (var i = 0, child; child = children[i]; i++) { + child.setDisabled(false); + } + } else if ((block.outputConnection || block.previousConnection) && + Blockly.dragMode_ == Blockly.DRAG_NONE) { + do { + block.setDisabled(true); + block = block.getNextBlock(); + } while (block); + } + } + Blockly.Events.enable(); + } +}; diff --git a/src/opsoro/server/static/js/blockly/core/extensions.js b/src/opsoro/server/static/js/blockly/core/extensions.js new file mode 100644 index 0000000..6660268 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/extensions.js @@ -0,0 +1,446 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2017 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Extensions are functions that help initialize blocks, usually + * adding dynamic behavior such as onchange handlers and mutators. These + * are applied using Block.applyExtension(), or the JSON "extensions" + * array attribute. + * @author Anm@anm.me (Andrew n marshall) + */ +'use strict'; + +/** + * @name Blockly.Extensions + * @namespace + **/ +goog.provide('Blockly.Extensions'); + + +/** + * The set of all registered extensions, keyed by extension name/id. + * @private + */ +Blockly.Extensions.ALL_ = {}; + +/** + * The set of properties on a block that may only be set by a mutator. + * @type {!Array.} + * @private + * @constant + */ +Blockly.Extensions.MUTATOR_PROPERTIES_ = + ['domToMutation', 'mutationToDom', 'compose', 'decompose']; + +/** + * Registers a new extension function. Extensions are functions that help + * initialize blocks, usually adding dynamic behavior such as onchange + * handlers and mutators. These are applied using Block.applyExtension(), or + * the JSON "extensions" array attribute. + * @param {string} name The name of this extension. + * @param {function} initFn The function to initialize an extended block. + * @throws {Error} if the extension name is empty, the extension is already + * registered, or extensionFn is not a function. + */ +Blockly.Extensions.register = function(name, initFn) { + if (!goog.isString(name) || goog.string.isEmptyOrWhitespace(name)) { + throw new Error('Error: Invalid extension name "' + name + '"'); + } + if (Blockly.Extensions.ALL_[name]) { + throw new Error('Error: Extension "' + name + '" is already registered.'); + } + if (!goog.isFunction(initFn)) { + throw new Error('Error: Extension "' + name + '" must be a function'); + } + Blockly.Extensions.ALL_[name] = initFn; +}; + +/** + * Registers a new extension function that adds all key/value of mixinObj. + * @param {string} name The name of this extension. + * @param {!Object} mixinObj The values to mix in. + * @throws {Error} if the extension name is empty or the extension is already + * registered. + */ +Blockly.Extensions.registerMixin = function(name, mixinObj) { + Blockly.Extensions.register(name, function() { + this.mixin(mixinObj); + }); +}; + +/** + * Registers a new extension function that adds a mutator to the block. + * At register time this performs some basic sanity checks on the mutator. + * The wrapper may also add a mutator dialog to the block, if both compose and + * decompose are defined on the mixin. + * @param {string} name The name of this mutator extension. + * @param {!Object} mixinObj The values to mix in. + * @param {function()=} opt_helperFn An optional function to apply after mixing + * in the object. + * @param {Array.=} opt_blockList A list of blocks to appear in the + * flyout of the mutator dialog. + * @throws {Error} if the mutation is invalid or can't be applied to the block. + */ +Blockly.Extensions.registerMutator = function(name, mixinObj, opt_helperFn, + opt_blockList) { + var errorPrefix = 'Error when registering mutator "' + name + '": '; + + // Sanity check the mixin object before registering it. + Blockly.Extensions.checkHasFunction_(errorPrefix, mixinObj, 'domToMutation'); + Blockly.Extensions.checkHasFunction_(errorPrefix, mixinObj, 'mutationToDom'); + + var hasMutatorDialog = Blockly.Extensions.checkMutatorDialog_(mixinObj, + errorPrefix); + + if (opt_helperFn && !goog.isFunction(opt_helperFn)) { + throw new Error('Extension "' + name + '" is not a function'); + } + + // Sanity checks passed. + Blockly.Extensions.register(name, function() { + if (hasMutatorDialog) { + this.setMutator(new Blockly.Mutator(opt_blockList)); + } + // Mixin the object. + this.mixin(mixinObj); + + if (opt_helperFn) { + opt_helperFn.apply(this); + } + }); +}; + +/** + * Applies an extension method to a block. This should only be called during + * block construction. + * @param {string} name The name of the extension. + * @param {!Blockly.Block} block The block to apply the named extension to. + * @param {boolean} isMutator True if this extension defines a mutator. + * @throws {Error} if the extension is not found. + */ +Blockly.Extensions.apply = function(name, block, isMutator) { + var extensionFn = Blockly.Extensions.ALL_[name]; + if (!goog.isFunction(extensionFn)) { + throw new Error('Error: Extension "' + name + '" not found.'); + } + if (isMutator) { + // Fail early if the block already has mutation properties. + Blockly.Extensions.checkNoMutatorProperties_(name, block); + } else { + // Record the old properties so we can make sure they don't change after + // applying the extension. + var mutatorProperties = Blockly.Extensions.getMutatorProperties_(block); + } + extensionFn.apply(block); + + if (isMutator) { + var errorPrefix = 'Error after applying mutator "' + name + '": '; + Blockly.Extensions.checkBlockHasMutatorProperties_(name, block, errorPrefix); + } else { + if (!Blockly.Extensions.mutatorPropertiesMatch_(mutatorProperties, block)) { + throw new Error('Error when applying extension "' + name + + '": mutation properties changed when applying a non-mutator extension.'); + } + } +}; + +/** + * Check that the given object has a property with the given name, and that the + * property is a function. + * @param {string} errorPrefix The string to prepend to any error message. + * @param {!Object} object The object to check. + * @param {string} propertyName Which property to check. + * @throws {Error} if the property does not exist or is not a function. + * @private + */ +Blockly.Extensions.checkHasFunction_ = function(errorPrefix, object, + propertyName) { + if (!object.hasOwnProperty(propertyName)) { + throw new Error(errorPrefix + + 'missing required property "' + propertyName + '"'); + } else if (typeof object[propertyName] !== "function") { + throw new Error(errorPrefix + + '" required property "' + propertyName + '" must be a function'); + } +}; + +/** + * Check that the given block does not have any of the four mutator properties + * defined on it. This function should be called before applying a mutator + * extension to a block, to make sure we are not overwriting properties. + * @param {string} mutationName The name of the mutation to reference in error + * messages. + * @param {!Blockly.Block} block The block to check. + * @throws {Error} if any of the properties already exist on the block. + * @private + */ +Blockly.Extensions.checkNoMutatorProperties_ = function(mutationName, block) { + for (var i = 0; i < Blockly.Extensions.MUTATOR_PROPERTIES_.length; i++) { + var propertyName = Blockly.Extensions.MUTATOR_PROPERTIES_[i]; + if (block.hasOwnProperty(propertyName)) { + throw new Error('Error: tried to apply mutation "' + mutationName + + '" to a block that already has a "' + propertyName + + '" function. Block id: ' + block.id); + } + } +}; + +/** + * Check that the given object has both or neither of the functions required + * to have a mutator dialog. + * These functions are 'compose' and 'decompose'. If a block has one, it must + * have both. + * @param {!Object} object The object to check. + * @param {string} errorPrefix The string to prepend to any error message. + * @return {boolean} True if the object has both functions. False if it has + * neither function. + * @throws {Error} if the object has only one of the functions. + * @private + */ +Blockly.Extensions.checkMutatorDialog_ = function(object, errorPrefix) { + var hasCompose = object.hasOwnProperty('compose'); + var hasDecompose = object.hasOwnProperty('decompose'); + + if (hasCompose && hasDecompose) { + if (typeof object['compose'] !== "function") { + throw new Error(errorPrefix + 'compose must be a function.'); + } else if (typeof object['decompose'] !== "function") { + throw new Error(errorPrefix + 'decompose must be a function.'); + } + return true; + } else if (!hasCompose && !hasDecompose) { + return false; + } else { + throw new Error(errorPrefix + + 'Must have both or neither of "compose" and "decompose"'); + } +}; + +/** + * Check that a block has required mutator properties. This should be called + * after applying a mutation extension. + * @param {string} errorPrefix The string to prepend to any error message. + * @param {!Blockly.Block} block The block to inspect. + * @private + */ +Blockly.Extensions.checkBlockHasMutatorProperties_ = function(errorPrefix, + block) { + if (!block.hasOwnProperty('domToMutation')) { + throw new Error(errorPrefix + 'Applying a mutator didn\'t add "domToMutation"'); + } + if (!block.hasOwnProperty('mutationToDom')) { + throw new Error(errorPrefix + 'Applying a mutator didn\'t add "mutationToDom"'); + } + + // A block with a mutator isn't required to have a mutation dialog, but + // it should still have both or neither of compose and decompose. + Blockly.Extensions.checkMutatorDialog_(block, errorPrefix); +}; + +/** + * Get a list of values of mutator properties on the given block. + * @param {!Blockly.Block} block The block to inspect. + * @return {!Array.} a list with all of the properties, which should be + * functions or undefined, but are not guaranteed to be. + * @private + */ +Blockly.Extensions.getMutatorProperties_ = function(block) { + var result = []; + for (var i = 0; i < Blockly.Extensions.MUTATOR_PROPERTIES_.length; i++) { + result.push(block[Blockly.Extensions.MUTATOR_PROPERTIES_[i]]); + } + return result; +}; + +/** + * Check that the current mutator properties match a list of old mutator + * properties. This should be called after applying a non-mutator extension, + * to verify that the extension didn't change properties it shouldn't. + * @param {!Array.} oldProperties The old values to compare to. + * @param {!Blockly.Block} block The block to inspect for new values. + * @return {boolean} True if the property lists match. + * @private + */ +Blockly.Extensions.mutatorPropertiesMatch_ = function(oldProperties, block) { + var match = true; + var newProperties = Blockly.Extensions.getMutatorProperties_(block); + if (newProperties.length != oldProperties.length) { + match = false; + } else { + for (var i = 0; i < newProperties.length; i++) { + if (oldProperties[i] != newProperties[i]) { + match = false; + } + } + } + + return match; +}; + +/** + * Builds an extension function that will map a dropdown value to a tooltip + * string. + * + * This method includes multiple checks to ensure tooltips, dropdown options, + * and message references are aligned. This aims to catch errors as early as + * possible, without requiring developers to manually test tooltips under each + * option. After the page is loaded, each tooltip text string will be checked + * for matching message keys in the internationalized string table. Deferring + * this until the page is loaded decouples loading dependencies. Later, upon + * loading the first block of any given type, the extension will validate every + * dropdown option has a matching tooltip in the lookupTable. Errors are + * reported as warnings in the console, and are never fatal. + * @param {string} dropdownName The name of the field whose value is the key + * to the lookup table. + * @param {!Object} lookupTable The table of field values to + * tooltip text. + * @return {Function} The extension function. + */ +Blockly.Extensions.buildTooltipForDropdown = function(dropdownName, lookupTable) { + // List of block types already validated, to minimize duplicate warnings. + var blockTypesChecked = []; + + // Check the tooltip string messages for invalid references. + // Wait for load, in case Blockly.Msg is not yet populated. + // runAfterPageLoad() does not run in a Node.js environment due to lack of + // document object, in which case skip the validation. + if (document) { // Relies on document.readyState + Blockly.utils.runAfterPageLoad(function() { + for (var key in lookupTable) { + // Will print warnings is reference is missing. + Blockly.utils.checkMessageReferences(lookupTable[key]); + } + }); + } + + /** + * The actual extension. + * @this {Blockly.Block} + */ + var extensionFn = function() { + if (this.type && blockTypesChecked.indexOf(this.type) === -1) { + Blockly.Extensions.checkDropdownOptionsInTable_( + this, dropdownName, lookupTable); + blockTypesChecked.push(this.type); + } + + this.setTooltip(function() { + var value = this.getFieldValue(dropdownName); + var tooltip = lookupTable[value]; + if (tooltip == null) { + if (blockTypesChecked.indexOf(this.type) === -1) { + // Warn for missing values on generated tooltips + var warning = 'No tooltip mapping for value ' + value + + ' of field ' + dropdownName; + if (this.type != null) { + warning += (' of block type ' + this.type); + } + console.warn(warning + '.'); + } + } else { + tooltip = Blockly.utils.replaceMessageReferences(tooltip); + } + return tooltip; + }.bind(this)); + }; + return extensionFn; +}; + +/** + * Checks all options keys are present in the provided string lookup table. + * Emits console warnings when they are not. + * @param {!Blockly.Block} block The block containing the dropdown + * @param {string} dropdownName The name of the dropdown + * @param {!Object} lookupTable The string lookup table + * @private + */ +Blockly.Extensions.checkDropdownOptionsInTable_ = + function(block, dropdownName, lookupTable) { + // Validate all dropdown options have values. + var dropdown = block.getField(dropdownName); + if (!dropdown.isOptionListDynamic()) { + var options = dropdown.getOptions(); + for (var i = 0; i < options.length; ++i) { + var optionKey = options[i][1]; // label, then value + if (lookupTable[optionKey] == null) { + console.warn('No tooltip mapping for value ' + optionKey + + ' of field ' + dropdownName + ' of block type ' + block.type); + } + } + } + }; + +/** + * Builds an extension function that will install a dynamic tooltip. The + * tooltip message should include the string '%1' and that string will be + * replaced with the value of the named field. + * @param {string} msgTemplate The template form to of the message text, with + * %1 placeholder. + * @param {string} fieldName The field with the replacement value. + * @returns {Function} The extension function. + */ +Blockly.Extensions.buildTooltipWithFieldValue = + function(msgTemplate, fieldName) { + // Check the tooltip string messages for invalid references. + // Wait for load, in case Blockly.Msg is not yet populated. + // runAfterPageLoad() does not run in a Node.js environment due to lack of + // document object, in which case skip the validation. + if (document) { // Relies on document.readyState + Blockly.utils.runAfterPageLoad(function() { + // Will print warnings is reference is missing. + Blockly.utils.checkMessageReferences(msgTemplate); + }); + } + + /** + * The actual extension. + * @this {Blockly.Block} + */ + var extensionFn = function() { + this.setTooltip(function() { + return Blockly.utils.replaceMessageReferences(msgTemplate) + .replace('%1', this.getFieldValue(fieldName)); + }.bind(this)); + }; + return extensionFn; + }; + +/** + * Configures the tooltip to mimic the parent block when connected. Otherwise, + * uses the tooltip text at the time this extension is initialized. This takes + * advantage of the fact that all other values from JSON are initialized before + * extensions. + * @this {Blockly.Block} + * @private + */ +Blockly.Extensions.extensionParentTooltip_ = function() { + this.tooltipWhenNotConnected_ = this.tooltip; + this.setTooltip(function() { + var parent = this.getParent(); + return (parent && + parent.getInputsInline() && + parent.tooltip) || + this.tooltipWhenNotConnected_; + }.bind(this)); +}; +Blockly.Extensions.register('parent_tooltip_when_inline', + Blockly.Extensions.extensionParentTooltip_); + + diff --git a/src/opsoro/server/static/js/blockly/core/field.js b/src/opsoro/server/static/js/blockly/core/field.js new file mode 100644 index 0000000..e815683 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/field.js @@ -0,0 +1,539 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Field. Used for editable titles, variables, etc. + * This is an abstract class that defines the UI on the block. Actual + * instances would be Blockly.FieldTextInput, Blockly.FieldDropdown, etc. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Field'); + +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.math.Size'); +goog.require('goog.style'); +goog.require('goog.userAgent'); + + +/** + * Abstract class for an editable field. + * @param {string} text The initial content of the field. + * @param {Function=} opt_validator An optional function that is called + * to validate any constraints on what the user entered. Takes the new + * text as an argument and returns either the accepted text, a replacement + * text, or null to abort the change. + * @constructor + */ +Blockly.Field = function(text, opt_validator) { + this.size_ = new goog.math.Size(0, Blockly.BlockSvg.MIN_BLOCK_Y); + this.setValue(text); + this.setValidator(opt_validator); +}; + +/** + * Temporary cache of text widths. + * @type {Object} + * @private + */ +Blockly.Field.cacheWidths_ = null; + +/** + * Number of current references to cache. + * @type {number} + * @private + */ +Blockly.Field.cacheReference_ = 0; + + +/** + * Name of field. Unique within each block. + * Static labels are usually unnamed. + * @type {string|undefined} + */ +Blockly.Field.prototype.name = undefined; + +/** + * Maximum characters of text to display before adding an ellipsis. + * @type {number} + */ +Blockly.Field.prototype.maxDisplayLength = 50; + +/** + * Visible text to display. + * @type {string} + * @private + */ +Blockly.Field.prototype.text_ = ''; + +/** + * Block this field is attached to. Starts as null, then in set in init. + * @type {Blockly.Block} + * @private + */ +Blockly.Field.prototype.sourceBlock_ = null; + +/** + * Is the field visible, or hidden due to the block being collapsed? + * @type {boolean} + * @private + */ +Blockly.Field.prototype.visible_ = true; + +/** + * Validation function called when user edits an editable field. + * @type {Function} + * @private + */ +Blockly.Field.prototype.validator_ = null; + +/** + * Non-breaking space. + * @const + */ +Blockly.Field.NBSP = '\u00A0'; + +/** + * Editable fields are saved by the XML renderer, non-editable fields are not. + */ +Blockly.Field.prototype.EDITABLE = true; + +/** + * Attach this field to a block. + * @param {!Blockly.Block} block The block containing this field. + */ +Blockly.Field.prototype.setSourceBlock = function(block) { + goog.asserts.assert(!this.sourceBlock_, 'Field already bound to a block.'); + this.sourceBlock_ = block; +}; + +/** + * Install this field on a block. + */ +Blockly.Field.prototype.init = function() { + if (this.fieldGroup_) { + // Field has already been initialized once. + return; + } + // Build the DOM. + this.fieldGroup_ = Blockly.utils.createSvgElement('g', {}, null); + if (!this.visible_) { + this.fieldGroup_.style.display = 'none'; + } + this.borderRect_ = Blockly.utils.createSvgElement('rect', + {'rx': 4, + 'ry': 4, + 'x': -Blockly.BlockSvg.SEP_SPACE_X / 2, + 'y': 0, + 'height': 16}, this.fieldGroup_, this.sourceBlock_.workspace); + /** @type {!Element} */ + this.textElement_ = Blockly.utils.createSvgElement('text', + {'class': 'blocklyText', 'y': this.size_.height - 12.5}, + this.fieldGroup_); + + this.updateEditable(); + this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_); + this.mouseUpWrapper_ = + Blockly.bindEventWithChecks_(this.fieldGroup_, 'mouseup', this, + this.onMouseUp_); + // Force a render. + this.render_(); +}; + +/** + * Dispose of all DOM objects belonging to this editable field. + */ +Blockly.Field.prototype.dispose = function() { + if (this.mouseUpWrapper_) { + Blockly.unbindEvent_(this.mouseUpWrapper_); + this.mouseUpWrapper_ = null; + } + this.sourceBlock_ = null; + goog.dom.removeNode(this.fieldGroup_); + this.fieldGroup_ = null; + this.textElement_ = null; + this.borderRect_ = null; + this.validator_ = null; +}; + +/** + * Add or remove the UI indicating if this field is editable or not. + */ +Blockly.Field.prototype.updateEditable = function() { + var group = this.fieldGroup_; + if (!this.EDITABLE || !group) { + return; + } + if (this.sourceBlock_.isEditable()) { + Blockly.utils.addClass(group, 'blocklyEditableText'); + Blockly.utils.removeClass(group, 'blocklyNonEditableText'); + this.fieldGroup_.style.cursor = this.CURSOR; + } else { + Blockly.utils.addClass(group, 'blocklyNonEditableText'); + Blockly.utils.removeClass(group, 'blocklyEditableText'); + this.fieldGroup_.style.cursor = ''; + } +}; + +/** + * Check whether this field is currently editable. Some fields are never + * editable (e.g. text labels). Those fields are not serialized to XML. Other + * fields may be editable, and therefore serialized, but may exist on + * non-editable blocks. + * @return {boolean} whether this field is editable and on an editable block + */ +Blockly.Field.prototype.isCurrentlyEditable = function() { + return this.EDITABLE && !!this.sourceBlock_ && this.sourceBlock_.isEditable(); +}; + +/** + * Gets whether this editable field is visible or not. + * @return {boolean} True if visible. + */ +Blockly.Field.prototype.isVisible = function() { + return this.visible_; +}; + +/** + * Sets whether this editable field is visible or not. + * @param {boolean} visible True if visible. + */ +Blockly.Field.prototype.setVisible = function(visible) { + if (this.visible_ == visible) { + return; + } + this.visible_ = visible; + var root = this.getSvgRoot(); + if (root) { + root.style.display = visible ? 'block' : 'none'; + this.render_(); + } +}; + +/** + * Sets a new validation function for editable fields. + * @param {Function} handler New validation function, or null. + */ +Blockly.Field.prototype.setValidator = function(handler) { + this.validator_ = handler; +}; + +/** + * Gets the validation function for editable fields. + * @return {Function} Validation function, or null. + */ +Blockly.Field.prototype.getValidator = function() { + return this.validator_; +}; + +/** + * Validates a change. Does nothing. Subclasses may override this. + * @param {string} text The user's text. + * @return {string} No change needed. + */ +Blockly.Field.prototype.classValidator = function(text) { + return text; +}; + +/** + * Calls the validation function for this field, as well as all the validation + * function for the field's class and its parents. + * @param {string} text Proposed text. + * @return {?string} Revised text, or null if invalid. + */ +Blockly.Field.prototype.callValidator = function(text) { + var classResult = this.classValidator(text); + if (classResult === null) { + // Class validator rejects value. Game over. + return null; + } else if (classResult !== undefined) { + text = classResult; + } + var userValidator = this.getValidator(); + if (userValidator) { + var userResult = userValidator.call(this, text); + if (userResult === null) { + // User validator rejects value. Game over. + return null; + } else if (userResult !== undefined) { + text = userResult; + } + } + return text; +}; + +/** + * Gets the group element for this editable field. + * Used for measuring the size and for positioning. + * @return {!Element} The group element. + */ +Blockly.Field.prototype.getSvgRoot = function() { + return /** @type {!Element} */ (this.fieldGroup_); +}; + +/** + * Draws the border with the correct width. + * Saves the computed width in a property. + * @private + */ +Blockly.Field.prototype.render_ = function() { + if (!this.visible_) { + this.size_.width = 0; + return; + } + + // Replace the text. + goog.dom.removeChildren(/** @type {!Element} */ (this.textElement_)); + var textNode = document.createTextNode(this.getDisplayText_()); + this.textElement_.appendChild(textNode); + + this.updateWidth(); +}; + +/** + * Updates thw width of the field. This calls getCachedWidth which won't cache + * the approximated width on IE/Edge when `getComputedTextLength` fails. Once + * it eventually does succeed, the result will be cached. + **/ +Blockly.Field.prototype.updateWidth = function() { + var width = Blockly.Field.getCachedWidth(this.textElement_); + if (this.borderRect_) { + this.borderRect_.setAttribute('width', + width + Blockly.BlockSvg.SEP_SPACE_X); + } + this.size_.width = width; +}; + +/** + * Gets the width of a text element, caching it in the process. + * @param {!Element} textElement An SVG 'text' element. + * @return {number} Width of element. + */ +Blockly.Field.getCachedWidth = function(textElement) { + var key = textElement.textContent + '\n' + textElement.className.baseVal; + var width; + + // Return the cached width if it exists. + if (Blockly.Field.cacheWidths_) { + width = Blockly.Field.cacheWidths_[key]; + if (width) { + return width; + } + } + + // Attempt to compute fetch the width of the SVG text element. + try { + width = textElement.getComputedTextLength(); + } catch (e) { + // MSIE 11 and Edge are known to throw "Unexpected call to method or + // property access." if the block is hidden. Instead, use an + // approximation and do not cache the result. At some later point in time + // when the block is inserted into the visible DOM, this method will be + // called again and, at that point in time, will not throw an exception. + return textElement.textContent.length * 8; + } + + // Cache the computed width and return. + if (Blockly.Field.cacheWidths_) { + Blockly.Field.cacheWidths_[key] = width; + } + return width; +}; + +/** + * Start caching field widths. Every call to this function MUST also call + * stopCache. Caches must not survive between execution threads. + */ +Blockly.Field.startCache = function() { + Blockly.Field.cacheReference_++; + if (!Blockly.Field.cacheWidths_) { + Blockly.Field.cacheWidths_ = {}; + } +}; + +/** + * Stop caching field widths. Unless caching was already on when the + * corresponding call to startCache was made. + */ +Blockly.Field.stopCache = function() { + Blockly.Field.cacheReference_--; + if (!Blockly.Field.cacheReference_) { + Blockly.Field.cacheWidths_ = null; + } +}; + +/** + * Returns the height and width of the field. + * @return {!goog.math.Size} Height and width. + */ +Blockly.Field.prototype.getSize = function() { + if (!this.size_.width) { + this.render_(); + } + return this.size_; +}; + +/** + * Returns the height and width of the field, + * accounting for the workspace scaling. + * @return {!goog.math.Size} Height and width. + * @private + */ +Blockly.Field.prototype.getScaledBBox_ = function() { + var bBox = this.borderRect_.getBBox(); + // Create new object, as getBBox can return an uneditable SVGRect in IE. + return new goog.math.Size(bBox.width * this.sourceBlock_.workspace.scale, + bBox.height * this.sourceBlock_.workspace.scale); +}; + +/** + * Get the text from this field as displayed on screen. May differ from getText + * due to ellipsis, and other formatting. + * @return {string} Currently displayed text. + * @private + */ +Blockly.Field.prototype.getDisplayText_ = function() { + var text = this.text_; + if (!text) { + // Prevent the field from disappearing if empty. + return Blockly.Field.NBSP; + } + if (text.length > this.maxDisplayLength) { + // Truncate displayed string and add an ellipsis ('...'). + text = text.substring(0, this.maxDisplayLength - 2) + '\u2026'; + } + // Replace whitespace with non-breaking spaces so the text doesn't collapse. + text = text.replace(/\s/g, Blockly.Field.NBSP); + if (this.sourceBlock_.RTL) { + // The SVG is LTR, force text to be RTL. + text += '\u200F'; + } + return text; +}; + +/** + * Get the text from this field. + * @return {string} Current text. + */ +Blockly.Field.prototype.getText = function() { + return this.text_; +}; + +/** + * Set the text in this field. Trigger a rerender of the source block. + * @param {*} newText New text. + */ +Blockly.Field.prototype.setText = function(newText) { + if (newText === null) { + // No change if null. + return; + } + newText = String(newText); + if (newText === this.text_) { + // No change. + return; + } + this.text_ = newText; + // Set width to 0 to force a rerender of this field. + this.size_.width = 0; + + if (this.sourceBlock_ && this.sourceBlock_.rendered) { + this.sourceBlock_.render(); + this.sourceBlock_.bumpNeighbours_(); + } +}; + +/** + * By default there is no difference between the human-readable text and + * the language-neutral values. Subclasses (such as dropdown) may define this. + * @return {string} Current value. + */ +Blockly.Field.prototype.getValue = function() { + return this.getText(); +}; + +/** + * By default there is no difference between the human-readable text and + * the language-neutral values. Subclasses (such as dropdown) may define this. + * @param {string} newValue New value. + */ +Blockly.Field.prototype.setValue = function(newValue) { + if (newValue === null) { + // No change if null. + return; + } + var oldValue = this.getValue(); + if (oldValue == newValue) { + return; + } + if (this.sourceBlock_ && Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Change( + this.sourceBlock_, 'field', this.name, oldValue, newValue)); + } + this.setText(newValue); +}; + +/** + * Handle a mouse up event on an editable field. + * @param {!Event} e Mouse up event. + * @private + */ +Blockly.Field.prototype.onMouseUp_ = function(e) { + if ((goog.userAgent.IPHONE || goog.userAgent.IPAD) && + !goog.userAgent.isVersionOrHigher('537.51.2') && + e.layerX !== 0 && e.layerY !== 0) { + // Old iOS spawns a bogus event on the next touch after a 'prompt()' edit. + // Unlike the real events, these have a layerX and layerY set. + return; + } else if (Blockly.utils.isRightButton(e)) { + // Right-click. + return; + } else if (this.sourceBlock_.workspace.isDragging()) { + // Drag operation is concluding. Don't open the editor. + return; + } else if (this.sourceBlock_.isEditable()) { + // Non-abstract sub-classes must define a showEditor_ method. + this.showEditor_(); + // The field is handling the touch, but we also want the blockSvg onMouseUp + // handler to fire, so we will leave the touch identifier as it is. + // The next onMouseUp is responsible for nulling it out. + } +}; + +/** + * Change the tooltip text for this field. + * @param {string|!Element} newTip Text for tooltip or a parent element to + * link to for its tooltip. + */ +Blockly.Field.prototype.setTooltip = function(newTip) { + // Non-abstract sub-classes may wish to implement this. See FieldLabel. +}; + +/** + * Return the absolute coordinates of the top-left corner of this field. + * The origin (0,0) is the top-left corner of the page body. + * @return {!goog.math.Coordinate} Object with .x and .y properties. + * @private + */ +Blockly.Field.prototype.getAbsoluteXY_ = function() { + return goog.style.getPageOffset(this.borderRect_); +}; diff --git a/src/opsoro/server/static/js/blockly/core/field_angle.js b/src/opsoro/server/static/js/blockly/core/field_angle.js new file mode 100644 index 0000000..85f4c6a --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/field_angle.js @@ -0,0 +1,304 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2013 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Angle input field. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.FieldAngle'); + +goog.require('Blockly.FieldTextInput'); +goog.require('goog.math'); +goog.require('goog.userAgent'); + + +/** + * Class for an editable angle field. + * @param {(string|number)=} opt_value The initial content of the field. The + * value should cast to a number, and if it does not, '0' will be used. + * @param {Function=} opt_validator An optional function that is called + * to validate any constraints on what the user entered. Takes the new + * text as an argument and returns the accepted text or null to abort + * the change. + * @extends {Blockly.FieldTextInput} + * @constructor + */ +Blockly.FieldAngle = function(opt_value, opt_validator) { + // Add degree symbol: '360°' (LTR) or '°360' (RTL) + this.symbol_ = Blockly.utils.createSvgElement('tspan', {}, null); + this.symbol_.appendChild(document.createTextNode('\u00B0')); + + opt_value = (opt_value && !isNaN(opt_value)) ? String(opt_value) : '0'; + Blockly.FieldAngle.superClass_.constructor.call( + this, opt_value, opt_validator); +}; +goog.inherits(Blockly.FieldAngle, Blockly.FieldTextInput); + +/** + * Round angles to the nearest 15 degrees when using mouse. + * Set to 0 to disable rounding. + */ +Blockly.FieldAngle.ROUND = 15; + +/** + * Half the width of protractor image. + */ +Blockly.FieldAngle.HALF = 100 / 2; + +/* The following two settings work together to set the behaviour of the angle + * picker. While many combinations are possible, two modes are typical: + * Math mode. + * 0 deg is right, 90 is up. This is the style used by protractors. + * Blockly.FieldAngle.CLOCKWISE = false; + * Blockly.FieldAngle.OFFSET = 0; + * Compass mode. + * 0 deg is up, 90 is right. This is the style used by maps. + * Blockly.FieldAngle.CLOCKWISE = true; + * Blockly.FieldAngle.OFFSET = 90; + */ + +/** + * Angle increases clockwise (true) or counterclockwise (false). + */ +Blockly.FieldAngle.CLOCKWISE = false; + +/** + * Offset the location of 0 degrees (and all angles) by a constant. + * Usually either 0 (0 = right) or 90 (0 = up). + */ +Blockly.FieldAngle.OFFSET = 0; + +/** + * Maximum allowed angle before wrapping. + * Usually either 360 (for 0 to 359.9) or 180 (for -179.9 to 180). + */ +Blockly.FieldAngle.WRAP = 360; + + +/** + * Radius of protractor circle. Slightly smaller than protractor size since + * otherwise SVG crops off half the border at the edges. + */ +Blockly.FieldAngle.RADIUS = Blockly.FieldAngle.HALF - 1; + +/** + * Clean up this FieldAngle, as well as the inherited FieldTextInput. + * @return {!Function} Closure to call on destruction of the WidgetDiv. + * @private + */ +Blockly.FieldAngle.prototype.dispose_ = function() { + var thisField = this; + return function() { + Blockly.FieldAngle.superClass_.dispose_.call(thisField)(); + thisField.gauge_ = null; + if (thisField.clickWrapper_) { + Blockly.unbindEvent_(thisField.clickWrapper_); + } + if (thisField.moveWrapper1_) { + Blockly.unbindEvent_(thisField.moveWrapper1_); + } + if (thisField.moveWrapper2_) { + Blockly.unbindEvent_(thisField.moveWrapper2_); + } + }; +}; + +/** + * Show the inline free-text editor on top of the text. + * @private + */ +Blockly.FieldAngle.prototype.showEditor_ = function() { + var noFocus = + goog.userAgent.MOBILE || goog.userAgent.ANDROID || goog.userAgent.IPAD; + // Mobile browsers have issues with in-line textareas (focus & keyboards). + Blockly.FieldAngle.superClass_.showEditor_.call(this, noFocus); + var div = Blockly.WidgetDiv.DIV; + if (!div.firstChild) { + // Mobile interface uses Blockly.prompt. + return; + } + // Build the SVG DOM. + var svg = Blockly.utils.createSvgElement('svg', { + 'xmlns': 'http://www.w3.org/2000/svg', + 'xmlns:html': 'http://www.w3.org/1999/xhtml', + 'xmlns:xlink': 'http://www.w3.org/1999/xlink', + 'version': '1.1', + 'height': (Blockly.FieldAngle.HALF * 2) + 'px', + 'width': (Blockly.FieldAngle.HALF * 2) + 'px' + }, div); + var circle = Blockly.utils.createSvgElement('circle', { + 'cx': Blockly.FieldAngle.HALF, 'cy': Blockly.FieldAngle.HALF, + 'r': Blockly.FieldAngle.RADIUS, + 'class': 'blocklyAngleCircle' + }, svg); + this.gauge_ = Blockly.utils.createSvgElement('path', + {'class': 'blocklyAngleGauge'}, svg); + this.line_ = Blockly.utils.createSvgElement('line',{ + 'x1': Blockly.FieldAngle.HALF, + 'y1': Blockly.FieldAngle.HALF, + 'class': 'blocklyAngleLine', + }, svg); + // Draw markers around the edge. + for (var angle = 0; angle < 360; angle += 15) { + Blockly.utils.createSvgElement('line', { + 'x1': Blockly.FieldAngle.HALF + Blockly.FieldAngle.RADIUS, + 'y1': Blockly.FieldAngle.HALF, + 'x2': Blockly.FieldAngle.HALF + Blockly.FieldAngle.RADIUS - + (angle % 45 == 0 ? 10 : 5), + 'y2': Blockly.FieldAngle.HALF, + 'class': 'blocklyAngleMarks', + 'transform': 'rotate(' + angle + ',' + + Blockly.FieldAngle.HALF + ',' + Blockly.FieldAngle.HALF + ')' + }, svg); + } + svg.style.marginLeft = (15 - Blockly.FieldAngle.RADIUS) + 'px'; + + // The angle picker is different from other fields in that it updates on + // mousemove even if it's not in the middle of a drag. In future we may + // change this behavior. For now, using bindEvent_ instead of + // bindEventWithChecks_ allows it to work without a mousedown/touchstart. + this.clickWrapper_ = + Blockly.bindEvent_(svg, 'click', this, Blockly.WidgetDiv.hide); + this.moveWrapper1_ = + Blockly.bindEvent_(circle, 'mousemove', this, this.onMouseMove); + this.moveWrapper2_ = + Blockly.bindEvent_(this.gauge_, 'mousemove', this, + this.onMouseMove); + this.updateGraph_(); +}; + +/** + * Set the angle to match the mouse's position. + * @param {!Event} e Mouse move event. + */ +Blockly.FieldAngle.prototype.onMouseMove = function(e) { + var bBox = this.gauge_.ownerSVGElement.getBoundingClientRect(); + var dx = e.clientX - bBox.left - Blockly.FieldAngle.HALF; + var dy = e.clientY - bBox.top - Blockly.FieldAngle.HALF; + var angle = Math.atan(-dy / dx); + if (isNaN(angle)) { + // This shouldn't happen, but let's not let this error propagate further. + return; + } + angle = goog.math.toDegrees(angle); + // 0: East, 90: North, 180: West, 270: South. + if (dx < 0) { + angle += 180; + } else if (dy > 0) { + angle += 360; + } + if (Blockly.FieldAngle.CLOCKWISE) { + angle = Blockly.FieldAngle.OFFSET + 360 - angle; + } else { + angle -= Blockly.FieldAngle.OFFSET; + } + if (Blockly.FieldAngle.ROUND) { + angle = Math.round(angle / Blockly.FieldAngle.ROUND) * + Blockly.FieldAngle.ROUND; + } + angle = this.callValidator(angle); + Blockly.FieldTextInput.htmlInput_.value = angle; + this.setValue(angle); + this.validate_(); + this.resizeEditor_(); +}; + +/** + * Insert a degree symbol. + * @param {?string} text New text. + */ +Blockly.FieldAngle.prototype.setText = function(text) { + Blockly.FieldAngle.superClass_.setText.call(this, text); + if (!this.textElement_) { + // Not rendered yet. + return; + } + this.updateGraph_(); + // Insert degree symbol. + if (this.sourceBlock_.RTL) { + this.textElement_.insertBefore(this.symbol_, this.textElement_.firstChild); + } else { + this.textElement_.appendChild(this.symbol_); + } + // Cached width is obsolete. Clear it. + this.size_.width = 0; +}; + +/** + * Redraw the graph with the current angle. + * @private + */ +Blockly.FieldAngle.prototype.updateGraph_ = function() { + if (!this.gauge_) { + return; + } + var angleDegrees = Number(this.getText()) + Blockly.FieldAngle.OFFSET; + var angleRadians = goog.math.toRadians(angleDegrees); + var path = ['M ', Blockly.FieldAngle.HALF, ',', Blockly.FieldAngle.HALF]; + var x2 = Blockly.FieldAngle.HALF; + var y2 = Blockly.FieldAngle.HALF; + if (!isNaN(angleRadians)) { + var angle1 = goog.math.toRadians(Blockly.FieldAngle.OFFSET); + var x1 = Math.cos(angle1) * Blockly.FieldAngle.RADIUS; + var y1 = Math.sin(angle1) * -Blockly.FieldAngle.RADIUS; + if (Blockly.FieldAngle.CLOCKWISE) { + angleRadians = 2 * angle1 - angleRadians; + } + x2 += Math.cos(angleRadians) * Blockly.FieldAngle.RADIUS; + y2 -= Math.sin(angleRadians) * Blockly.FieldAngle.RADIUS; + // Don't ask how the flag calculations work. They just do. + var largeFlag = Math.abs(Math.floor((angleRadians - angle1) / Math.PI) % 2); + if (Blockly.FieldAngle.CLOCKWISE) { + largeFlag = 1 - largeFlag; + } + var sweepFlag = Number(Blockly.FieldAngle.CLOCKWISE); + path.push(' l ', x1, ',', y1, + ' A ', Blockly.FieldAngle.RADIUS, ',', Blockly.FieldAngle.RADIUS, + ' 0 ', largeFlag, ' ', sweepFlag, ' ', x2, ',', y2, ' z'); + } + this.gauge_.setAttribute('d', path.join('')); + this.line_.setAttribute('x2', x2); + this.line_.setAttribute('y2', y2); +}; + +/** + * Ensure that only an angle may be entered. + * @param {string} text The user's text. + * @return {?string} A string representing a valid angle, or null if invalid. + */ +Blockly.FieldAngle.prototype.classValidator = function(text) { + if (text === null) { + return null; + } + var n = parseFloat(text || 0); + if (isNaN(n)) { + return null; + } + n = n % 360; + if (n < 0) { + n += 360; + } + if (n > Blockly.FieldAngle.WRAP) { + n -= 360; + } + return String(n); +}; diff --git a/src/opsoro/server/static/js/blockly/core/field_checkbox.js b/src/opsoro/server/static/js/blockly/core/field_checkbox.js new file mode 100644 index 0000000..9a834d6 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/field_checkbox.js @@ -0,0 +1,119 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Checkbox field. Checked or not checked. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.FieldCheckbox'); + +goog.require('Blockly.Field'); + + +/** + * Class for a checkbox field. + * @param {string} state The initial state of the field ('TRUE' or 'FALSE'). + * @param {Function=} opt_validator A function that is executed when a new + * option is selected. Its sole argument is the new checkbox state. If + * it returns a value, this becomes the new checkbox state, unless the + * value is null, in which case the change is aborted. + * @extends {Blockly.Field} + * @constructor + */ +Blockly.FieldCheckbox = function(state, opt_validator) { + Blockly.FieldCheckbox.superClass_.constructor.call(this, '', opt_validator); + // Set the initial state. + this.setValue(state); +}; +goog.inherits(Blockly.FieldCheckbox, Blockly.Field); + +/** + * Character for the checkmark. + */ +Blockly.FieldCheckbox.CHECK_CHAR = '\u2713'; + +/** + * Mouse cursor style when over the hotspot that initiates editability. + */ +Blockly.FieldCheckbox.prototype.CURSOR = 'default'; + +/** + * Install this checkbox on a block. + */ +Blockly.FieldCheckbox.prototype.init = function() { + if (this.fieldGroup_) { + // Checkbox has already been initialized once. + return; + } + Blockly.FieldCheckbox.superClass_.init.call(this); + // The checkbox doesn't use the inherited text element. + // Instead it uses a custom checkmark element that is either visible or not. + this.checkElement_ = Blockly.utils.createSvgElement('text', + {'class': 'blocklyText blocklyCheckbox', 'x': -3, 'y': 14}, + this.fieldGroup_); + var textNode = document.createTextNode(Blockly.FieldCheckbox.CHECK_CHAR); + this.checkElement_.appendChild(textNode); + this.checkElement_.style.display = this.state_ ? 'block' : 'none'; +}; + +/** + * Return 'TRUE' if the checkbox is checked, 'FALSE' otherwise. + * @return {string} Current state. + */ +Blockly.FieldCheckbox.prototype.getValue = function() { + return String(this.state_).toUpperCase(); +}; + +/** + * Set the checkbox to be checked if newBool is 'TRUE' or true, + * unchecks otherwise. + * @param {string|boolean} newBool New state. + */ +Blockly.FieldCheckbox.prototype.setValue = function(newBool) { + var newState = (typeof newBool == 'string') ? + (newBool.toUpperCase() == 'TRUE') : !!newBool; + if (this.state_ !== newState) { + if (this.sourceBlock_ && Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Change( + this.sourceBlock_, 'field', this.name, this.state_, newState)); + } + this.state_ = newState; + if (this.checkElement_) { + this.checkElement_.style.display = newState ? 'block' : 'none'; + } + } +}; + +/** + * Toggle the state of the checkbox. + * @private + */ +Blockly.FieldCheckbox.prototype.showEditor_ = function() { + var newState = !this.state_; + if (this.sourceBlock_) { + // Call any validation function, and allow it to override. + newState = this.callValidator(newState); + } + if (newState !== null) { + this.setValue(String(newState).toUpperCase()); + } +}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/field_colour.js b/src/opsoro/server/static/js/blockly/core/field_colour.js similarity index 85% rename from src/opsoro/apps/visual_programming/static/blockly/core/field_colour.js rename to src/opsoro/server/static/js/blockly/core/field_colour.js index 6bca8aa..a538ba8 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/core/field_colour.js +++ b/src/opsoro/server/static/js/blockly/core/field_colour.js @@ -36,7 +36,7 @@ goog.require('goog.ui.ColorPicker'); /** * Class for a colour input field. * @param {string} colour The initial colour in '#rrggbb' format. - * @param {Function=} opt_changeHandler A function that is executed when a new + * @param {Function=} opt_validator A function that is executed when a new * colour is selected. Its sole argument is the new colour value. Its * return value becomes the selected colour, unless it is undefined, in * which case the new colour stands, or it is null, in which case the change @@ -44,12 +44,9 @@ goog.require('goog.ui.ColorPicker'); * @extends {Blockly.Field} * @constructor */ -Blockly.FieldColour = function(colour, opt_changeHandler) { - Blockly.FieldColour.superClass_.constructor.call(this, '\u00A0\u00A0\u00A0'); - - this.setChangeHandler(opt_changeHandler); - // Set the initial state. - this.setValue(colour); +Blockly.FieldColour = function(colour, opt_validator) { + Blockly.FieldColour.superClass_.constructor.call(this, colour, opt_validator); + this.setText(Blockly.Field.NBSP + Blockly.Field.NBSP + Blockly.Field.NBSP); }; goog.inherits(Blockly.FieldColour, Blockly.Field); @@ -69,10 +66,9 @@ Blockly.FieldColour.prototype.columns_ = 0; /** * Install this field on a block. - * @param {!Blockly.Block} block The block containing this field. */ -Blockly.FieldColour.prototype.init = function(block) { - Blockly.FieldColour.superClass_.init.call(this, block); +Blockly.FieldColour.prototype.init = function() { + Blockly.FieldColour.superClass_.init.call(this); this.borderRect_.style['fillOpacity'] = 1; this.setValue(this.getValue()); }; @@ -103,16 +99,15 @@ Blockly.FieldColour.prototype.getValue = function() { * @param {string} colour The new colour in '#rrggbb' format. */ Blockly.FieldColour.prototype.setValue = function(colour) { + if (this.sourceBlock_ && Blockly.Events.isEnabled() && + this.colour_ != colour) { + Blockly.Events.fire(new Blockly.Events.Change( + this.sourceBlock_, 'field', this.name, this.colour_, colour)); + } this.colour_ = colour; if (this.borderRect_) { this.borderRect_.style.fill = colour; } - if (this.sourceBlock_ && this.sourceBlock_.rendered) { - // Since we're not re-rendering we need to explicitly call - // Blockly.Realtime.blockChanged() - Blockly.Realtime.blockChanged(this.sourceBlock_); - this.sourceBlock_.workspace.fireChangeEvent(); - } }; /** @@ -121,6 +116,7 @@ Blockly.FieldColour.prototype.setValue = function(colour) { */ Blockly.FieldColour.prototype.getText = function() { var colour = this.colour_; + // Try to use #rgb format if possible, rather than #rrggbb. var m = colour.match(/^#(.)\1(.)\2(.)\3$/); if (m) { colour = '#' + m[1] + m[2] + m[3]; @@ -217,12 +213,9 @@ Blockly.FieldColour.prototype.showEditor_ = function() { function(event) { var colour = event.target.getSelectedColor() || '#000000'; Blockly.WidgetDiv.hide(); - if (thisField.sourceBlock_ && thisField.changeHandler_) { - // Call any change handler, and allow it to override. - var override = thisField.changeHandler_(colour); - if (override !== undefined) { - colour = override; - } + if (thisField.sourceBlock_) { + // Call any validation function, and allow it to override. + colour = thisField.callValidator(colour); } if (colour !== null) { thisField.setValue(colour); @@ -238,4 +231,5 @@ Blockly.FieldColour.widgetDispose_ = function() { if (Blockly.FieldColour.changeEventKey_) { goog.events.unlistenByKey(Blockly.FieldColour.changeEventKey_); } + Blockly.Events.setGroup(false); }; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/field_date.js b/src/opsoro/server/static/js/blockly/core/field_date.js similarity index 92% rename from src/opsoro/apps/visual_programming/static/blockly/core/field_date.js rename to src/opsoro/server/static/js/blockly/core/field_date.js index 11f47d9..9e19c63 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/core/field_date.js +++ b/src/opsoro/server/static/js/blockly/core/field_date.js @@ -39,7 +39,7 @@ goog.require('goog.ui.DatePicker'); /** * Class for a date input field. * @param {string} date The initial date. - * @param {Function=} opt_changeHandler A function that is executed when a new + * @param {Function=} opt_validator A function that is executed when a new * date is selected. Its sole argument is the new date value. Its * return value becomes the selected date, unless it is undefined, in * which case the new date stands, or it is null, in which case the change @@ -47,13 +47,12 @@ goog.require('goog.ui.DatePicker'); * @extends {Blockly.Field} * @constructor */ -Blockly.FieldDate = function(date, opt_changeHandler) { +Blockly.FieldDate = function(date, opt_validator) { if (!date) { date = new goog.date.Date().toIsoString(true); } - Blockly.FieldDate.superClass_.constructor.call(this, date); + Blockly.FieldDate.superClass_.constructor.call(this, date, opt_validator); this.setValue(date); - this.setChangeHandler(opt_changeHandler); }; goog.inherits(Blockly.FieldDate, Blockly.Field); @@ -83,11 +82,11 @@ Blockly.FieldDate.prototype.getValue = function() { * @param {string} date The new date. */ Blockly.FieldDate.prototype.setValue = function(date) { - if (this.sourceBlock_ && this.changeHandler_) { - var validated = this.changeHandler_(date); + if (this.sourceBlock_) { + var validated = this.callValidator(date); // If the new date is invalid, validation returns null. // In this case we still want to display the illegal result. - if (validated !== null && validated !== undefined) { + if (validated !== null) { date = validated; } } @@ -150,12 +149,9 @@ Blockly.FieldDate.prototype.showEditor_ = function() { function(event) { var date = event.date ? event.date.toIsoString(true) : ''; Blockly.WidgetDiv.hide(); - if (thisField.sourceBlock_ && thisField.changeHandler_) { - // Call any change handler, and allow it to override. - var override = thisField.changeHandler_(date); - if (override !== undefined) { - date = override; - } + if (thisField.sourceBlock_) { + // Call any validation function, and allow it to override. + date = thisField.callValidator(date); } thisField.setValue(date); }); @@ -169,6 +165,7 @@ Blockly.FieldDate.widgetDispose_ = function() { if (Blockly.FieldDate.changeEventKey_) { goog.events.unlistenByKey(Blockly.FieldDate.changeEventKey_); } + Blockly.Events.setGroup(false); }; /** @@ -194,14 +191,14 @@ Blockly.FieldDate.loadLanguage_ = function() { */ Blockly.FieldDate.CSS = [ /* Copied from: goog/css/datepicker.css */ - /* + /** * Copyright 2009 The Closure Library Authors. All Rights Reserved. * * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ - /* + /** * Standard styling for a goog.ui.DatePicker. * * @author arv@google.com (Erik Arvidsson) diff --git a/src/opsoro/server/static/js/blockly/core/field_dropdown.js b/src/opsoro/server/static/js/blockly/core/field_dropdown.js new file mode 100644 index 0000000..62d50a3 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/field_dropdown.js @@ -0,0 +1,422 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Dropdown input field. Used for editable titles and variables. + * In the interests of a consistent UI, the toolbox shares some functions and + * properties with the context menu. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.FieldDropdown'); + +goog.require('Blockly.Field'); +goog.require('goog.dom'); +goog.require('goog.events'); +goog.require('goog.style'); +goog.require('goog.ui.Menu'); +goog.require('goog.ui.MenuItem'); +goog.require('goog.userAgent'); + + +/** + * Class for an editable dropdown field. + * @param {(!Array.|!Function)} menuGenerator An array of options + * for a dropdown list, or a function which generates these options. + * @param {Function=} opt_validator A function that is executed when a new + * option is selected, with the newly selected value as its sole argument. + * If it returns a value, that value (which must be one of the options) will + * become selected in place of the newly selected option, unless the return + * value is null, in which case the change is aborted. + * @extends {Blockly.Field} + * @constructor + */ +Blockly.FieldDropdown = function(menuGenerator, opt_validator) { + this.menuGenerator_ = menuGenerator; + this.trimOptions_(); + var firstTuple = this.getOptions()[0]; + + // Call parent's constructor. + Blockly.FieldDropdown.superClass_.constructor.call(this, firstTuple[1], + opt_validator); +}; +goog.inherits(Blockly.FieldDropdown, Blockly.Field); + +/** + * Horizontal distance that a checkmark overhangs the dropdown. + */ +Blockly.FieldDropdown.CHECKMARK_OVERHANG = 25; + +/** + * Android can't (in 2014) display "▾", so use "▼" instead. + */ +Blockly.FieldDropdown.ARROW_CHAR = goog.userAgent.ANDROID ? '\u25BC' : '\u25BE'; + +/** + * Mouse cursor style when over the hotspot that initiates the editor. + */ +Blockly.FieldDropdown.prototype.CURSOR = 'default'; + +/** + * Language-neutral currently selected string or image object. + * @type {string|!Object} + * @private + */ +Blockly.FieldDropdown.prototype.value_ = ''; + +/** + * SVG image element if currently selected option is an image, or null. + * @type {SVGElement} + * @private + */ +Blockly.FieldDropdown.prototype.imageElement_ = null; + +/** + * Object with src, height, width, and alt attributes if currently selected + * option is an image, or null. + * @type {Object} + * @private + */ +Blockly.FieldDropdown.prototype.imageJson_ = null; + +/** + * Install this dropdown on a block. + */ +Blockly.FieldDropdown.prototype.init = function() { + if (this.fieldGroup_) { + // Dropdown has already been initialized once. + return; + } + // Add dropdown arrow: "option ▾" (LTR) or "▾ אופציה" (RTL) + this.arrow_ = Blockly.utils.createSvgElement('tspan', {}, null); + this.arrow_.appendChild(document.createTextNode(this.sourceBlock_.RTL ? + Blockly.FieldDropdown.ARROW_CHAR + ' ' : + ' ' + Blockly.FieldDropdown.ARROW_CHAR)); + + Blockly.FieldDropdown.superClass_.init.call(this); + // Force a reset of the text to add the arrow. + var text = this.text_; + this.text_ = null; + this.setText(text); +}; + +/** + * Create a dropdown menu under the text. + * @private + */ +Blockly.FieldDropdown.prototype.showEditor_ = function() { + Blockly.WidgetDiv.show(this, this.sourceBlock_.RTL, null); + var thisField = this; + + function callback(e) { + var menu = this; + var menuItem = e.target; + if (menuItem) { + thisField.onItemSelected(menu, menuItem); + } + Blockly.WidgetDiv.hideIfOwner(thisField); + Blockly.Events.setGroup(false); + } + + var menu = new goog.ui.Menu(); + menu.setRightToLeft(this.sourceBlock_.RTL); + var options = this.getOptions(); + for (var i = 0; i < options.length; i++) { + var content = options[i][0]; // Human-readable text or image. + var value = options[i][1]; // Language-neutral value. + if (typeof content == 'object') { + // An image, not text. + var image = new Image(content['width'], content['height']); + image.src = content['src']; + image.alt = content['alt'] || ''; + content = image; + } + var menuItem = new goog.ui.MenuItem(content); + menuItem.setRightToLeft(this.sourceBlock_.RTL); + menuItem.setValue(value); + menuItem.setCheckable(true); + menu.addChild(menuItem, true); + menuItem.setChecked(value == this.value_); + } + // Listen for mouse/keyboard events. + goog.events.listen(menu, goog.ui.Component.EventType.ACTION, callback); + // Listen for touch events (why doesn't Closure handle this already?). + function callbackTouchStart(e) { + var control = this.getOwnerControl(/** @type {Node} */ (e.target)); + // Highlight the menu item. + control.handleMouseDown(e); + } + function callbackTouchEnd(e) { + var control = this.getOwnerControl(/** @type {Node} */ (e.target)); + // Activate the menu item. + control.performActionInternal(e); + } + menu.getHandler().listen(menu.getElement(), goog.events.EventType.TOUCHSTART, + callbackTouchStart); + menu.getHandler().listen(menu.getElement(), goog.events.EventType.TOUCHEND, + callbackTouchEnd); + + // Record windowSize and scrollOffset before adding menu. + var windowSize = goog.dom.getViewportSize(); + var scrollOffset = goog.style.getViewportPageOffset(document); + var xy = this.getAbsoluteXY_(); + var borderBBox = this.getScaledBBox_(); + var div = Blockly.WidgetDiv.DIV; + menu.render(div); + var menuDom = menu.getElement(); + Blockly.utils.addClass(menuDom, 'blocklyDropdownMenu'); + // Record menuSize after adding menu. + var menuSize = goog.style.getSize(menuDom); + // Recalculate height for the total content, not only box height. + menuSize.height = menuDom.scrollHeight; + + // Position the menu. + // Flip menu vertically if off the bottom. + if (xy.y + menuSize.height + borderBBox.height >= + windowSize.height + scrollOffset.y) { + xy.y -= menuSize.height + 2; + } else { + xy.y += borderBBox.height; + } + if (this.sourceBlock_.RTL) { + xy.x += borderBBox.width; + xy.x += Blockly.FieldDropdown.CHECKMARK_OVERHANG; + // Don't go offscreen left. + if (xy.x < scrollOffset.x + menuSize.width) { + xy.x = scrollOffset.x + menuSize.width; + } + } else { + xy.x -= Blockly.FieldDropdown.CHECKMARK_OVERHANG; + // Don't go offscreen right. + if (xy.x > windowSize.width + scrollOffset.x - menuSize.width) { + xy.x = windowSize.width + scrollOffset.x - menuSize.width; + } + } + Blockly.WidgetDiv.position(xy.x, xy.y, windowSize, scrollOffset, + this.sourceBlock_.RTL); + menu.setAllowAutoFocus(true); + menuDom.focus(); +}; + +/** + * Handle the selection of an item in the dropdown menu. + * @param {!goog.ui.Menu} menu The Menu component clicked. + * @param {!goog.ui.MenuItem} menuItem The MenuItem selected within menu. + */ +Blockly.FieldDropdown.prototype.onItemSelected = function(menu, menuItem) { + var value = menuItem.getValue(); + if (this.sourceBlock_) { + // Call any validation function, and allow it to override. + value = this.callValidator(value); + } + if (value !== null) { + this.setValue(value); + } +}; + +/** + * Factor out common words in statically defined options. + * Create prefix and/or suffix labels. + * @private + */ +Blockly.FieldDropdown.prototype.trimOptions_ = function() { + this.prefixField = null; + this.suffixField = null; + var options = this.menuGenerator_; + if (!goog.isArray(options)) { + return; + } + var hasImages = false; + + // Localize label text and image alt text. + for (var i = 0; i < options.length; i++) { + var label = options[i][0]; + if (typeof label == 'string') { + options[i][0] = Blockly.utils.replaceMessageReferences(label); + } else { + if (label.alt != null) { + options[i][0].alt = Blockly.utils.replaceMessageReferences(label.alt); + } + hasImages = true; + } + } + if (hasImages || options.length < 2) { + return; // Do nothing if too few items or at least one label is an image. + } + var strings = []; + for (var i = 0; i < options.length; i++) { + strings.push(options[i][0]); + } + var shortest = Blockly.utils.shortestStringLength(strings); + var prefixLength = Blockly.utils.commonWordPrefix(strings, shortest); + var suffixLength = Blockly.utils.commonWordSuffix(strings, shortest); + if (!prefixLength && !suffixLength) { + return; + } + if (shortest <= prefixLength + suffixLength) { + // One or more strings will entirely vanish if we proceed. Abort. + return; + } + if (prefixLength) { + this.prefixField = strings[0].substring(0, prefixLength - 1); + } + if (suffixLength) { + this.suffixField = strings[0].substr(1 - suffixLength); + } + // Remove the prefix and suffix from the options. + var newOptions = []; + for (var i = 0; i < options.length; i++) { + var text = options[i][0]; + var value = options[i][1]; + text = text.substring(prefixLength, text.length - suffixLength); + newOptions[i] = [text, value]; + } + this.menuGenerator_ = newOptions; +}; + +/** + * @return {boolean} True if the option list is generated by a function. Otherwise false. + */ +Blockly.FieldDropdown.prototype.isOptionListDynamic = function() { + return goog.isFunction(this.menuGenerator_); +}; + +/** + * Return a list of the options for this dropdown. + * @return {!Array.} Array of option tuples: + * (human-readable text or image, language-neutral name). + */ +Blockly.FieldDropdown.prototype.getOptions = function() { + if (goog.isFunction(this.menuGenerator_)) { + return this.menuGenerator_.call(this); + } + return /** @type {!Array.>} */ (this.menuGenerator_); +}; + +/** + * Get the language-neutral value from this dropdown menu. + * @return {string} Current text. + */ +Blockly.FieldDropdown.prototype.getValue = function() { + return this.value_; +}; + +/** + * Set the language-neutral value for this dropdown menu. + * @param {string} newValue New value to set. + */ +Blockly.FieldDropdown.prototype.setValue = function(newValue) { + if (newValue === null || newValue === this.value_) { + return; // No change if null. + } + if (this.sourceBlock_ && Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Change( + this.sourceBlock_, 'field', this.name, this.value_, newValue)); + } + this.value_ = newValue; + // Look up and display the human-readable text. + var options = this.getOptions(); + for (var i = 0; i < options.length; i++) { + // Options are tuples of human-readable text and language-neutral values. + if (options[i][1] == newValue) { + var content = options[i][0]; + if (typeof content == 'object') { + this.imageJson_ = content; + this.setText(content.alt); + } else { + this.imageJson_ = null; + this.setText(content); + } + return; + } + } + // Value not found. Add it, maybe it will become valid once set + // (like variable names). + this.setText(newValue); +}; + +/** + * Draws the border with the correct width. + * @private + */ +Blockly.FieldDropdown.prototype.render_ = function() { + if (!this.visible_) { + this.size_.width = 0; + return; + } + if (this.sourceBlock_ && this.arrow_) { + // Update arrow's colour. + this.arrow_.style.fill = this.sourceBlock_.getColour(); + } + goog.dom.removeChildren(/** @type {!Element} */ (this.textElement_)); + goog.dom.removeNode(this.imageElement_); + this.imageElement_ = null; + + if (this.imageJson_) { + // Image option is selected. + this.imageElement_ = Blockly.utils.createSvgElement('image', + {'y': 5, + 'height': this.imageJson_.height + 'px', + 'width': this.imageJson_.width + 'px'}, this.fieldGroup_); + this.imageElement_.setAttributeNS('http://www.w3.org/1999/xlink', + 'xlink:href', this.imageJson_.src); + // Insert dropdown arrow. + this.textElement_.appendChild(this.arrow_); + var arrowWidth = Blockly.Field.getCachedWidth(this.arrow_); + this.size_.height = Number(this.imageJson_.height) + 19; + this.size_.width = Number(this.imageJson_.width) + arrowWidth; + if (this.sourceBlock_.RTL) { + this.imageElement_.setAttribute('x', arrowWidth); + this.textElement_.setAttribute('x', -1); + } else { + this.textElement_.setAttribute('text-anchor', 'end'); + this.textElement_.setAttribute('x', this.size_.width + 1); + } + + } else { + // Text option is selected. + // Replace the text. + var textNode = document.createTextNode(this.getDisplayText_()); + this.textElement_.appendChild(textNode); + // Insert dropdown arrow. + if (this.sourceBlock_.RTL) { + this.textElement_.insertBefore(this.arrow_, this.textElement_.firstChild); + } else { + this.textElement_.appendChild(this.arrow_); + } + this.textElement_.setAttribute('text-anchor', 'start'); + this.textElement_.setAttribute('x', 0); + + this.size_.height = Blockly.BlockSvg.MIN_BLOCK_Y; + this.size_.width = Blockly.Field.getCachedWidth(this.textElement_); + } + this.borderRect_.setAttribute('height', this.size_.height - 9); + this.borderRect_.setAttribute('width', + this.size_.width + Blockly.BlockSvg.SEP_SPACE_X); +}; + +/** + * Close the dropdown menu if this input is being deleted. + */ +Blockly.FieldDropdown.prototype.dispose = function() { + Blockly.WidgetDiv.hideIfOwner(this); + Blockly.FieldDropdown.superClass_.dispose.call(this); +}; diff --git a/src/opsoro/server/static/js/blockly/core/field_image.js b/src/opsoro/server/static/js/blockly/core/field_image.js new file mode 100644 index 0000000..09ee479 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/field_image.js @@ -0,0 +1,162 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Image field. Used for pictures, icons, etc. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.FieldImage'); + +goog.require('Blockly.Field'); +goog.require('goog.dom'); +goog.require('goog.math.Size'); +goog.require('goog.userAgent'); + + +/** + * Class for an image on a block. + * @param {string} src The URL of the image. + * @param {number} width Width of the image. + * @param {number} height Height of the image. + * @param {string=} opt_alt Optional alt text for when block is collapsed. + * @extends {Blockly.Field} + * @constructor + */ +Blockly.FieldImage = function(src, width, height, opt_alt) { + this.sourceBlock_ = null; + + // Ensure height and width are numbers. Strings are bad at math. + this.height_ = Number(height); + this.width_ = Number(width); + this.size_ = new goog.math.Size(this.width_, + this.height_ + 2 * Blockly.BlockSvg.INLINE_PADDING_Y); + this.text_ = opt_alt || ''; + this.setValue(src); +}; +goog.inherits(Blockly.FieldImage, Blockly.Field); + +/** + * Editable fields are saved by the XML renderer, non-editable fields are not. + */ +Blockly.FieldImage.prototype.EDITABLE = false; + +/** + * Install this image on a block. + */ +Blockly.FieldImage.prototype.init = function() { + if (this.fieldGroup_) { + // Image has already been initialized once. + return; + } + // Build the DOM. + /** @type {SVGElement} */ + this.fieldGroup_ = Blockly.utils.createSvgElement('g', {}, null); + if (!this.visible_) { + this.fieldGroup_.style.display = 'none'; + } + /** @type {SVGElement} */ + this.imageElement_ = Blockly.utils.createSvgElement( + 'image', + { + 'height': this.height_ + 'px', + 'width': this.width_ + 'px' + }, + this.fieldGroup_); + this.setValue(this.src_); + this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_); + + // Configure the field to be transparent with respect to tooltips. + this.setTooltip(this.sourceBlock_); + Blockly.Tooltip.bindMouseEvents(this.imageElement_); +}; + +/** + * Dispose of all DOM objects belonging to this text. + */ +Blockly.FieldImage.prototype.dispose = function() { + goog.dom.removeNode(this.fieldGroup_); + this.fieldGroup_ = null; + this.imageElement_ = null; +}; + +/** + * Change the tooltip text for this field. + * @param {string|!Element} newTip Text for tooltip or a parent element to + * link to for its tooltip. + */ +Blockly.FieldImage.prototype.setTooltip = function(newTip) { + this.imageElement_.tooltip = newTip; +}; + +/** + * Get the source URL of this image. + * @return {string} Current text. + * @override + */ +Blockly.FieldImage.prototype.getValue = function() { + return this.src_; +}; + +/** + * Set the source URL of this image. + * @param {?string} src New source. + * @override + */ +Blockly.FieldImage.prototype.setValue = function(src) { + if (src === null) { + // No change if null. + return; + } + this.src_ = src; + if (this.imageElement_) { + this.imageElement_.setAttributeNS('http://www.w3.org/1999/xlink', + 'xlink:href', src || ''); + } +}; + +/** + * Set the alt text of this image. + * @param {?string} alt New alt text. + * @override + */ +Blockly.FieldImage.prototype.setText = function(alt) { + if (alt === null) { + // No change if null. + return; + } + this.text_ = alt; +}; + +/** + * Images are fixed width, no need to render. + * @private + */ +Blockly.FieldImage.prototype.render_ = function() { + // NOP +}; +/** + * Images are fixed width, no need to update. + * @private + */ +Blockly.FieldImage.prototype.updateWidth = function() { + // NOP +}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/field_label.js b/src/opsoro/server/static/js/blockly/core/field_label.js similarity index 87% rename from src/opsoro/apps/visual_programming/static/blockly/core/field_label.js rename to src/opsoro/server/static/js/blockly/core/field_label.js index da52f8d..f4bca6a 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/core/field_label.js +++ b/src/opsoro/server/static/js/blockly/core/field_label.js @@ -42,7 +42,7 @@ goog.require('goog.math.Size'); Blockly.FieldLabel = function(text, opt_class) { this.size_ = new goog.math.Size(0, 17.5); this.class_ = opt_class; - this.setText(text); + this.setValue(text); }; goog.inherits(Blockly.FieldLabel, Blockly.Field); @@ -53,31 +53,28 @@ Blockly.FieldLabel.prototype.EDITABLE = false; /** * Install this text on a block. - * @param {!Blockly.Block} block The block containing this text. */ -Blockly.FieldLabel.prototype.init = function(block) { - if (this.sourceBlock_) { +Blockly.FieldLabel.prototype.init = function() { + if (this.textElement_) { // Text has already been initialized once. return; } - this.sourceBlock_ = block; - // Build the DOM. - this.textElement_ = Blockly.createSvgElement('text', + this.textElement_ = Blockly.utils.createSvgElement('text', {'class': 'blocklyText', 'y': this.size_.height - 5}, null); if (this.class_) { - Blockly.addClass_(this.textElement_, this.class_); + Blockly.utils.addClass(this.textElement_, this.class_); } if (!this.visible_) { this.textElement_.style.display = 'none'; } - block.getSvgRoot().appendChild(this.textElement_); + this.sourceBlock_.getSvgRoot().appendChild(this.textElement_); // Configure the field to be transparent with respect to tooltips. this.textElement_.tooltip = this.sourceBlock_; Blockly.Tooltip.bindMouseEvents(this.textElement_); // Force a render. - this.updateTextNode_(); + this.render_(); }; /** diff --git a/src/opsoro/server/static/js/blockly/core/field_number.js b/src/opsoro/server/static/js/blockly/core/field_number.js new file mode 100644 index 0000000..722b0ee --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/field_number.js @@ -0,0 +1,103 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Number input field + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.FieldNumber'); + +goog.require('Blockly.FieldTextInput'); +goog.require('goog.math'); + +/** + * Class for an editable number field. + * @param {(string|number)=} opt_value The initial content of the field. The value + * should cast to a number, and if it does not, '0' will be used. + * @param {(string|number)=} opt_min Minimum value. + * @param {(string|number)=} opt_max Maximum value. + * @param {(string|number)=} opt_precision Precision for value. + * @param {Function=} opt_validator An optional function that is called + * to validate any constraints on what the user entered. Takes the new + * text as an argument and returns either the accepted text, a replacement + * text, or null to abort the change. + * @extends {Blockly.FieldTextInput} + * @constructor + */ +Blockly.FieldNumber = function(opt_value, opt_min, opt_max, opt_precision, + opt_validator) { + opt_value = (opt_value && !isNaN(opt_value)) ? String(opt_value) : '0'; + Blockly.FieldNumber.superClass_.constructor.call( + this, opt_value, opt_validator); + this.setConstraints(opt_min, opt_max, opt_precision); +}; +goog.inherits(Blockly.FieldNumber, Blockly.FieldTextInput); + +/** + * Set the maximum, minimum and precision constraints on this field. + * Any of these properties may be undefiend or NaN to be disabled. + * Setting precision (usually a power of 10) enforces a minimum step between + * values. That is, the user's value will rounded to the closest multiple of + * precision. The least significant digit place is inferred from the precision. + * Integers values can be enforces by choosing an integer precision. + * @param {number|string|undefined} min Minimum value. + * @param {number|string|undefined} max Maximum value. + * @param {number|string|undefined} precision Precision for value. + */ +Blockly.FieldNumber.prototype.setConstraints = function(min, max, precision) { + precision = parseFloat(precision); + this.precision_ = isNaN(precision) ? 0 : precision; + min = parseFloat(min); + this.min_ = isNaN(min) ? -Infinity : min; + max = parseFloat(max); + this.max_ = isNaN(max) ? Infinity : max; + this.setValue(this.callValidator(this.getValue())); +}; + +/** + * Ensure that only a number in the correct range may be entered. + * @param {string} text The user's text. + * @return {?string} A string representing a valid number, or null if invalid. + */ +Blockly.FieldNumber.prototype.classValidator = function(text) { + if (text === null) { + return null; + } + text = String(text); + // TODO: Handle cases like 'ten', '1.203,14', etc. + // 'O' is sometimes mistaken for '0' by inexperienced users. + text = text.replace(/O/ig, '0'); + // Strip out thousands separators. + text = text.replace(/,/g, ''); + var n = parseFloat(text || 0); + if (isNaN(n)) { + // Invalid number. + return null; + } + // Round to nearest multiple of precision. + if (this.precision_ && isFinite(n)) { + n = Math.round(n / this.precision_) * this.precision_; + } + // Get the value in range. + n = goog.math.clamp(n, this.min_, this.max_); + return String(n); +}; diff --git a/src/opsoro/server/static/js/blockly/core/field_textinput.js b/src/opsoro/server/static/js/blockly/core/field_textinput.js new file mode 100644 index 0000000..ed7d5af --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/field_textinput.js @@ -0,0 +1,355 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Text input field. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.FieldTextInput'); + +goog.require('Blockly.Field'); +goog.require('Blockly.Msg'); +goog.require('goog.asserts'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.userAgent'); + + +/** + * Class for an editable text field. + * @param {string} text The initial content of the field. + * @param {Function=} opt_validator An optional function that is called + * to validate any constraints on what the user entered. Takes the new + * text as an argument and returns either the accepted text, a replacement + * text, or null to abort the change. + * @extends {Blockly.Field} + * @constructor + */ +Blockly.FieldTextInput = function(text, opt_validator) { + Blockly.FieldTextInput.superClass_.constructor.call(this, text, + opt_validator); +}; +goog.inherits(Blockly.FieldTextInput, Blockly.Field); + +/** + * Point size of text. Should match blocklyText's font-size in CSS. + */ +Blockly.FieldTextInput.FONTSIZE = 11; + +/** + * Mouse cursor style when over the hotspot that initiates the editor. + */ +Blockly.FieldTextInput.prototype.CURSOR = 'text'; + +/** + * Allow browser to spellcheck this field. + * @private + */ +Blockly.FieldTextInput.prototype.spellcheck_ = true; + +/** + * Close the input widget if this input is being deleted. + */ +Blockly.FieldTextInput.prototype.dispose = function() { + Blockly.WidgetDiv.hideIfOwner(this); + Blockly.FieldTextInput.superClass_.dispose.call(this); +}; + +/** + * Set the value of this field. + * @param {?string} newValue New value. + * @override + */ +Blockly.FieldTextInput.prototype.setValue = function(newValue) { + if (newValue === null) { + return; // No change if null. + } + if (this.sourceBlock_) { + var validated = this.callValidator(newValue); + // If the new value is invalid, validation returns null. + // In this case we still want to display the illegal result. + if (validated !== null) { + newValue = validated; + } + } + Blockly.Field.prototype.setValue.call(this, newValue); +}; + +/** + * Set the text in this field and fire a change event. + * @param {*} newText New text. + */ +Blockly.FieldTextInput.prototype.setText = function(newText) { + if (newText === null) { + // No change if null. + return; + } + newText = String(newText); + if (newText === this.text_) { + // No change. + return; + } + if (this.sourceBlock_ && Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Change( + this.sourceBlock_, 'field', this.name, this.text_, newText)); + } + Blockly.Field.prototype.setText.call(this, newText); +}; + +/** + * Set whether this field is spellchecked by the browser. + * @param {boolean} check True if checked. + */ +Blockly.FieldTextInput.prototype.setSpellcheck = function(check) { + this.spellcheck_ = check; +}; + +/** + * Show the inline free-text editor on top of the text. + * @param {boolean=} opt_quietInput True if editor should be created without + * focus. Defaults to false. + * @private + */ +Blockly.FieldTextInput.prototype.showEditor_ = function(opt_quietInput) { + this.workspace_ = this.sourceBlock_.workspace; + var quietInput = opt_quietInput || false; + if (!quietInput && (goog.userAgent.MOBILE || goog.userAgent.ANDROID || + goog.userAgent.IPAD)) { + // Mobile browsers have issues with in-line textareas (focus & keyboards). + var fieldText = this; + Blockly.prompt(Blockly.Msg.CHANGE_VALUE_TITLE, this.text_, + function(newValue) { + if (fieldText.sourceBlock_) { + newValue = fieldText.callValidator(newValue); + } + fieldText.setValue(newValue); + }); + return; + } + + Blockly.WidgetDiv.show(this, this.sourceBlock_.RTL, this.widgetDispose_()); + var div = Blockly.WidgetDiv.DIV; + // Create the input. + var htmlInput = + goog.dom.createDom(goog.dom.TagName.INPUT, 'blocklyHtmlInput'); + htmlInput.setAttribute('spellcheck', this.spellcheck_); + var fontSize = + (Blockly.FieldTextInput.FONTSIZE * this.workspace_.scale) + 'pt'; + div.style.fontSize = fontSize; + htmlInput.style.fontSize = fontSize; + /** @type {!HTMLInputElement} */ + Blockly.FieldTextInput.htmlInput_ = htmlInput; + div.appendChild(htmlInput); + + htmlInput.value = htmlInput.defaultValue = this.text_; + htmlInput.oldValue_ = null; + this.validate_(); + this.resizeEditor_(); + if (!quietInput) { + htmlInput.focus(); + htmlInput.select(); + } + + // Bind to keydown -- trap Enter without IME and Esc to hide. + htmlInput.onKeyDownWrapper_ = + Blockly.bindEventWithChecks_(htmlInput, 'keydown', this, + this.onHtmlInputKeyDown_); + // Bind to keyup -- trap Enter; resize after every keystroke. + htmlInput.onKeyUpWrapper_ = + Blockly.bindEventWithChecks_(htmlInput, 'keyup', this, + this.onHtmlInputChange_); + // Bind to keyPress -- repeatedly resize when holding down a key. + htmlInput.onKeyPressWrapper_ = + Blockly.bindEventWithChecks_(htmlInput, 'keypress', this, + this.onHtmlInputChange_); + htmlInput.onWorkspaceChangeWrapper_ = this.resizeEditor_.bind(this); + this.workspace_.addChangeListener(htmlInput.onWorkspaceChangeWrapper_); +}; + +/** + * Handle key down to the editor. + * @param {!Event} e Keyboard event. + * @private + */ +Blockly.FieldTextInput.prototype.onHtmlInputKeyDown_ = function(e) { + var htmlInput = Blockly.FieldTextInput.htmlInput_; + var tabKey = 9, enterKey = 13, escKey = 27; + if (e.keyCode == enterKey) { + Blockly.WidgetDiv.hide(); + } else if (e.keyCode == escKey) { + htmlInput.value = htmlInput.defaultValue; + Blockly.WidgetDiv.hide(); + } else if (e.keyCode == tabKey) { + Blockly.WidgetDiv.hide(); + this.sourceBlock_.tab(this, !e.shiftKey); + e.preventDefault(); + } +}; + +/** + * Handle a change to the editor. + * @param {!Event} e Keyboard event. + * @private + */ +Blockly.FieldTextInput.prototype.onHtmlInputChange_ = function(e) { + var htmlInput = Blockly.FieldTextInput.htmlInput_; + // Update source block. + var text = htmlInput.value; + if (text !== htmlInput.oldValue_) { + htmlInput.oldValue_ = text; + this.setValue(text); + this.validate_(); + } else if (goog.userAgent.WEBKIT) { + // Cursor key. Render the source block to show the caret moving. + // Chrome only (version 26, OS X). + this.sourceBlock_.render(); + } + this.resizeEditor_(); + Blockly.svgResize(this.sourceBlock_.workspace); +}; + +/** + * Check to see if the contents of the editor validates. + * Style the editor accordingly. + * @private + */ +Blockly.FieldTextInput.prototype.validate_ = function() { + var valid = true; + goog.asserts.assertObject(Blockly.FieldTextInput.htmlInput_); + var htmlInput = Blockly.FieldTextInput.htmlInput_; + if (this.sourceBlock_) { + valid = this.callValidator(htmlInput.value); + } + if (valid === null) { + Blockly.utils.addClass(htmlInput, 'blocklyInvalidInput'); + } else { + Blockly.utils.removeClass(htmlInput, 'blocklyInvalidInput'); + } +}; + +/** + * Resize the editor and the underlying block to fit the text. + * @private + */ +Blockly.FieldTextInput.prototype.resizeEditor_ = function() { + var div = Blockly.WidgetDiv.DIV; + var bBox = this.fieldGroup_.getBBox(); + div.style.width = bBox.width * this.workspace_.scale + 'px'; + div.style.height = bBox.height * this.workspace_.scale + 'px'; + var xy = this.getAbsoluteXY_(); + // In RTL mode block fields and LTR input fields the left edge moves, + // whereas the right edge is fixed. Reposition the editor. + if (this.sourceBlock_.RTL) { + var borderBBox = this.getScaledBBox_(); + xy.x += borderBBox.width; + xy.x -= div.offsetWidth; + } + // Shift by a few pixels to line up exactly. + xy.y += 1; + if (goog.userAgent.GECKO && Blockly.WidgetDiv.DIV.style.top) { + // Firefox mis-reports the location of the border by a pixel + // once the WidgetDiv is moved into position. + xy.x -= 1; + xy.y -= 1; + } + if (goog.userAgent.WEBKIT) { + xy.y -= 3; + } + div.style.left = xy.x + 'px'; + div.style.top = xy.y + 'px'; +}; + +/** + * Close the editor, save the results, and dispose of the editable + * text field's elements. + * @return {!Function} Closure to call on destruction of the WidgetDiv. + * @private + */ +Blockly.FieldTextInput.prototype.widgetDispose_ = function() { + var thisField = this; + return function() { + var htmlInput = Blockly.FieldTextInput.htmlInput_; + // Save the edit (if it validates). + var text = htmlInput.value; + if (thisField.sourceBlock_) { + var text1 = thisField.callValidator(text); + if (text1 === null) { + // Invalid edit. + text = htmlInput.defaultValue; + } else { + // Validation function has changed the text. + text = text1; + if (thisField.onFinishEditing_) { + thisField.onFinishEditing_(text); + } + } + } + thisField.setText(text); + thisField.sourceBlock_.rendered && thisField.sourceBlock_.render(); + Blockly.unbindEvent_(htmlInput.onKeyDownWrapper_); + Blockly.unbindEvent_(htmlInput.onKeyUpWrapper_); + Blockly.unbindEvent_(htmlInput.onKeyPressWrapper_); + thisField.workspace_.removeChangeListener( + htmlInput.onWorkspaceChangeWrapper_); + Blockly.FieldTextInput.htmlInput_ = null; + Blockly.Events.setGroup(false); + // Delete style properties. + var style = Blockly.WidgetDiv.DIV.style; + style.width = 'auto'; + style.height = 'auto'; + style.fontSize = ''; + }; +}; + +/** + * Ensure that only a number may be entered. + * @param {string} text The user's text. + * @return {?string} A string representing a valid number, or null if invalid. + */ +Blockly.FieldTextInput.numberValidator = function(text) { + console.warn('Blockly.FieldTextInput.numberValidator is deprecated. ' + + 'Use Blockly.FieldNumber instead.'); + if (text === null) { + return null; + } + text = String(text); + // TODO: Handle cases like 'ten', '1.203,14', etc. + // 'O' is sometimes mistaken for '0' by inexperienced users. + text = text.replace(/O/ig, '0'); + // Strip out thousands separators. + text = text.replace(/,/g, ''); + var n = parseFloat(text || 0); + return isNaN(n) ? null : String(n); +}; + +/** + * Ensure that only a nonnegative integer may be entered. + * @param {string} text The user's text. + * @return {?string} A string representing a valid int, or null if invalid. + */ +Blockly.FieldTextInput.nonnegativeIntegerValidator = function(text) { + var n = Blockly.FieldTextInput.numberValidator(text); + if (n) { + n = String(Math.max(0, Math.floor(n))); + } + return n; +}; diff --git a/src/opsoro/server/static/js/blockly/core/field_variable.js b/src/opsoro/server/static/js/blockly/core/field_variable.js new file mode 100644 index 0000000..be8a680 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/field_variable.js @@ -0,0 +1,196 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Variable input field. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.FieldVariable'); + +goog.require('Blockly.FieldDropdown'); +goog.require('Blockly.Msg'); +goog.require('Blockly.Variables'); +goog.require('goog.asserts'); +goog.require('goog.string'); + + +/** + * Class for a variable's dropdown field. + * @param {?string} varname The default name for the variable. If null, + * a unique variable name will be generated. + * @param {Function=} opt_validator A function that is executed when a new + * option is selected. Its sole argument is the new option value. + * @extends {Blockly.FieldDropdown} + * @constructor + */ +Blockly.FieldVariable = function(varname, opt_validator) { + Blockly.FieldVariable.superClass_.constructor.call(this, + Blockly.FieldVariable.dropdownCreate, opt_validator); + this.setValue(varname || ''); +}; +goog.inherits(Blockly.FieldVariable, Blockly.FieldDropdown); + +/** + * The menu item index for the rename variable option. + * @type {number} + * @private + */ +Blockly.FieldVariable.prototype.renameVarItemIndex_ = -1; + +/** + * The menu item index for the delete variable option. + * @type {number} + * @private + */ +Blockly.FieldVariable.prototype.deleteVarItemIndex_ = -1; + + +/** + * Install this dropdown on a block. + */ +Blockly.FieldVariable.prototype.init = function() { + if (this.fieldGroup_) { + // Dropdown has already been initialized once. + return; + } + Blockly.FieldVariable.superClass_.init.call(this); + if (!this.getValue()) { + // Variables without names get uniquely named for this workspace. + var workspace = + this.sourceBlock_.isInFlyout ? + this.sourceBlock_.workspace.targetWorkspace : + this.sourceBlock_.workspace; + this.setValue(Blockly.Variables.generateUniqueName(workspace)); + } + // If the selected variable doesn't exist yet, create it. + // For instance, some blocks in the toolbox have variable dropdowns filled + // in by default. + if (!this.sourceBlock_.isInFlyout) { + this.sourceBlock_.workspace.createVariable(this.getValue()); + } +}; + +/** + * Attach this field to a block. + * @param {!Blockly.Block} block The block containing this field. + */ +Blockly.FieldVariable.prototype.setSourceBlock = function(block) { + goog.asserts.assert(!block.isShadow(), + 'Variable fields are not allowed to exist on shadow blocks.'); + Blockly.FieldVariable.superClass_.setSourceBlock.call(this, block); +}; + +/** + * Get the variable's name (use a variableDB to convert into a real name). + * Unline a regular dropdown, variables are literal and have no neutral value. + * @return {string} Current text. + */ +Blockly.FieldVariable.prototype.getValue = function() { + return this.getText(); +}; + +/** + * Set the variable name. + * @param {string} newValue New text. + */ +Blockly.FieldVariable.prototype.setValue = function(newValue) { + if (this.sourceBlock_ && Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Change( + this.sourceBlock_, 'field', this.name, this.value_, newValue)); + } + this.value_ = newValue; + this.setText(newValue); +}; + +/** + * Return a sorted list of variable names for variable dropdown menus. + * Include a special option at the end for creating a new variable name. + * @return {!Array.} Array of variable names. + * @this {Blockly.FieldVariable} + */ +Blockly.FieldVariable.dropdownCreate = function() { + if (this.sourceBlock_ && this.sourceBlock_.workspace) { + // Get a copy of the list, so that adding rename and new variable options + // doesn't modify the workspace's list. + var variableList = this.sourceBlock_.workspace.variableList.slice(0); + } else { + var variableList = []; + } + // Ensure that the currently selected variable is an option. + var name = this.getText(); + if (name && variableList.indexOf(name) == -1) { + variableList.push(name); + } + variableList.sort(goog.string.caseInsensitiveCompare); + + this.renameVarItemIndex_ = variableList.length; + variableList.push(Blockly.Msg.RENAME_VARIABLE); + + this.deleteVarItemIndex_ = variableList.length; + variableList.push(Blockly.Msg.DELETE_VARIABLE.replace('%1', name)); + // Variables are not language-specific, use the name as both the user-facing + // text and the internal representation. + var options = []; + for (var i = 0; i < variableList.length; i++) { + options[i] = [variableList[i], variableList[i]]; + } + return options; +}; + +/** + * Handle the selection of an item in the variable dropdown menu. + * Special case the 'Rename variable...' and 'Delete variable...' options. + * In the rename case, prompt the user for a new name. + * @param {!goog.ui.Menu} menu The Menu component clicked. + * @param {!goog.ui.MenuItem} menuItem The MenuItem selected within menu. + */ +Blockly.FieldVariable.prototype.onItemSelected = function(menu, menuItem) { + var itemText = menuItem.getValue(); + if (this.sourceBlock_) { + var workspace = this.sourceBlock_.workspace; + if (this.renameVarItemIndex_ >= 0 && + menu.getChildAt(this.renameVarItemIndex_) === menuItem) { + // Rename variable. + var oldName = this.getText(); + Blockly.hideChaff(); + Blockly.Variables.promptName( + Blockly.Msg.RENAME_VARIABLE_TITLE.replace('%1', oldName), oldName, + function(newName) { + if (newName) { + workspace.renameVariable(oldName, newName); + } + }); + return; + } else if (this.deleteVarItemIndex_ >= 0 && + menu.getChildAt(this.deleteVarItemIndex_) === menuItem) { + // Delete variable. + workspace.deleteVariable(this.getText()); + return; + } + + // Call any validation function, and allow it to override. + itemText = this.callValidator(itemText); + } + if (itemText !== null) { + this.setValue(itemText); + } +}; diff --git a/src/opsoro/server/static/js/blockly/core/flyout.js b/src/opsoro/server/static/js/blockly/core/flyout.js new file mode 100644 index 0000000..6bf4ac0 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/flyout.js @@ -0,0 +1,1486 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2011 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Flyout tray containing blocks which may be created. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Flyout'); + +goog.require('Blockly.Block'); +goog.require('Blockly.Comment'); +goog.require('Blockly.Events'); +goog.require('Blockly.FlyoutButton'); +goog.require('Blockly.Touch'); +goog.require('Blockly.WorkspaceSvg'); +goog.require('goog.dom'); +goog.require('goog.events'); +goog.require('goog.math.Rect'); +goog.require('goog.userAgent'); + + +/** + * Class for a flyout. + * @param {!Object} workspaceOptions Dictionary of options for the workspace. + * @constructor + */ +Blockly.Flyout = function(workspaceOptions) { + workspaceOptions.getMetrics = this.getMetrics_.bind(this); + workspaceOptions.setMetrics = this.setMetrics_.bind(this); + /** + * @type {!Blockly.Workspace} + * @private + */ + this.workspace_ = new Blockly.WorkspaceSvg(workspaceOptions); + this.workspace_.isFlyout = true; + + /** + * Is RTL vs LTR. + * @type {boolean} + */ + this.RTL = !!workspaceOptions.RTL; + + /** + * Flyout should be laid out horizontally vs vertically. + * @type {boolean} + * @private + */ + this.horizontalLayout_ = workspaceOptions.horizontalLayout; + + /** + * Position of the toolbox and flyout relative to the workspace. + * @type {number} + * @private + */ + this.toolboxPosition_ = workspaceOptions.toolboxPosition; + + /** + * Opaque data that can be passed to Blockly.unbindEvent_. + * @type {!Array.} + * @private + */ + this.eventWrappers_ = []; + + /** + * List of background buttons that lurk behind each block to catch clicks + * landing in the blocks' lakes and bays. + * @type {!Array.} + * @private + */ + this.backgroundButtons_ = []; + + /** + * List of visible buttons. + * @type {!Array.} + * @private + */ + this.buttons_ = []; + + /** + * List of event listeners. + * @type {!Array.} + * @private + */ + this.listeners_ = []; + + /** + * List of blocks that should always be disabled. + * @type {!Array.} + * @private + */ + this.permanentlyDisabled_ = []; + + /** + * y coordinate of mousedown - used to calculate scroll distances. + * @type {number} + * @private + */ + this.startDragMouseY_ = 0; + + /** + * x coordinate of mousedown - used to calculate scroll distances. + * @type {number} + * @private + */ + this.startDragMouseX_ = 0; +}; + +/** + * When a flyout drag is in progress, this is a reference to the flyout being + * dragged. This is used by Flyout.terminateDrag_ to reset dragMode_. + * @type {Blockly.Flyout} + * @private + */ +Blockly.Flyout.startFlyout_ = null; + +/** + * Event that started a drag. Used to determine the drag distance/direction and + * also passed to BlockSvg.onMouseDown_() after creating a new block. + * @type {Event} + * @private + */ +Blockly.Flyout.startDownEvent_ = null; + +/** + * Flyout block where the drag/click was initiated. Used to fire click events or + * create a new block. + * @type {Event} + * @private + */ +Blockly.Flyout.startBlock_ = null; + +/** + * Wrapper function called when a mouseup occurs during a background or block + * drag operation. + * @type {Array.} + * @private + */ +Blockly.Flyout.onMouseUpWrapper_ = null; + +/** + * Wrapper function called when a mousemove occurs during a background drag. + * @type {Array.} + * @private + */ +Blockly.Flyout.onMouseMoveWrapper_ = null; + +/** + * Wrapper function called when a mousemove occurs during a block drag. + * @type {Array.} + * @private + */ +Blockly.Flyout.onMouseMoveBlockWrapper_ = null; + +/** + * Does the flyout automatically close when a block is created? + * @type {boolean} + */ +Blockly.Flyout.prototype.autoClose = true; + +/** + * Whether the flyout is visible. + * @type {boolean} + * @private + */ +Blockly.Flyout.prototype.isVisible_ = false; + +/** + * Whether the workspace containing this flyout is visible. + * @type {boolean} + * @private + */ +Blockly.Flyout.prototype.containerVisible_ = true; + +/** + * Corner radius of the flyout background. + * @type {number} + * @const + */ +Blockly.Flyout.prototype.CORNER_RADIUS = 8; + +/** + * Number of pixels the mouse must move before a drag/scroll starts. Because the + * drag-intention is determined when this is reached, it is larger than + * Blockly.DRAG_RADIUS so that the drag-direction is clearer. + */ +Blockly.Flyout.prototype.DRAG_RADIUS = 10; + +/** + * Margin around the edges of the blocks in the flyout. + * @type {number} + * @const + */ +Blockly.Flyout.prototype.MARGIN = Blockly.Flyout.prototype.CORNER_RADIUS; + +/** + * Gap between items in horizontal flyouts. Can be overridden with the "sep" + * element. + * @const {number} + */ +Blockly.Flyout.prototype.GAP_X = Blockly.Flyout.prototype.MARGIN * 3; + +/** + * Gap between items in vertical flyouts. Can be overridden with the "sep" + * element. + * @const {number} + */ +Blockly.Flyout.prototype.GAP_Y = Blockly.Flyout.prototype.MARGIN * 3; + +/** + * Top/bottom padding between scrollbar and edge of flyout background. + * @type {number} + * @const + */ +Blockly.Flyout.prototype.SCROLLBAR_PADDING = 2; + +/** + * Width of flyout. + * @type {number} + * @private + */ +Blockly.Flyout.prototype.width_ = 0; + +/** + * Height of flyout. + * @type {number} + * @private + */ +Blockly.Flyout.prototype.height_ = 0; + +/** + * Is the flyout dragging (scrolling)? + * DRAG_NONE - no drag is ongoing or state is undetermined. + * DRAG_STICKY - still within the sticky drag radius. + * DRAG_FREE - in scroll mode (never create a new block). + * @private + */ +Blockly.Flyout.prototype.dragMode_ = Blockly.DRAG_NONE; + +/** + * Range of a drag angle from a flyout considered "dragging toward workspace". + * Drags that are within the bounds of this many degrees from the orthogonal + * line to the flyout edge are considered to be "drags toward the workspace". + * Example: + * Flyout Edge Workspace + * [block] / <-within this angle, drags "toward workspace" | + * [block] ---- orthogonal to flyout boundary ---- | + * [block] \ | + * The angle is given in degrees from the orthogonal. + * + * This is used to know when to create a new block and when to scroll the + * flyout. Setting it to 360 means that all drags create a new block. + * @type {number} + * @private +*/ +Blockly.Flyout.prototype.dragAngleRange_ = 70; + +/** + * Creates the flyout's DOM. Only needs to be called once. The flyout can + * either exist as its own svg element or be a g element nested inside a + * separate svg element. + * @param {string} tagName The type of tag to put the flyout in. This + * should be or . + * @return {!Element} The flyout's SVG group. + */ +Blockly.Flyout.prototype.createDom = function(tagName) { + /* + + + + + */ + // Setting style to display:none to start. The toolbox and flyout + // hide/show code will set up proper visibility and size later. + this.svgGroup_ = Blockly.utils.createSvgElement(tagName, + {'class': 'blocklyFlyout', 'style': 'display: none'}, null); + this.svgBackground_ = Blockly.utils.createSvgElement('path', + {'class': 'blocklyFlyoutBackground'}, this.svgGroup_); + this.svgGroup_.appendChild(this.workspace_.createDom()); + return this.svgGroup_; +}; + +/** + * Initializes the flyout. + * @param {!Blockly.Workspace} targetWorkspace The workspace in which to create + * new blocks. + */ +Blockly.Flyout.prototype.init = function(targetWorkspace) { + this.targetWorkspace_ = targetWorkspace; + this.workspace_.targetWorkspace = targetWorkspace; + // Add scrollbar. + this.scrollbar_ = new Blockly.Scrollbar(this.workspace_, + this.horizontalLayout_, false, 'blocklyFlyoutScrollbar'); + + this.hide(); + + Array.prototype.push.apply(this.eventWrappers_, + Blockly.bindEventWithChecks_(this.svgGroup_, 'wheel', this, this.wheel_)); + if (!this.autoClose) { + this.filterWrapper_ = this.filterForCapacity_.bind(this); + this.targetWorkspace_.addChangeListener(this.filterWrapper_); + } + // Dragging the flyout up and down. + Array.prototype.push.apply(this.eventWrappers_, + Blockly.bindEventWithChecks_(this.svgGroup_, 'mousedown', this, + this.onMouseDown_)); +}; + +/** + * Dispose of this flyout. + * Unlink from all DOM elements to prevent memory leaks. + */ +Blockly.Flyout.prototype.dispose = function() { + this.hide(); + Blockly.unbindEvent_(this.eventWrappers_); + if (this.filterWrapper_) { + this.targetWorkspace_.removeChangeListener(this.filterWrapper_); + this.filterWrapper_ = null; + } + if (this.scrollbar_) { + this.scrollbar_.dispose(); + this.scrollbar_ = null; + } + if (this.workspace_) { + this.workspace_.targetWorkspace = null; + this.workspace_.dispose(); + this.workspace_ = null; + } + if (this.svgGroup_) { + goog.dom.removeNode(this.svgGroup_); + this.svgGroup_ = null; + } + this.svgBackground_ = null; + this.targetWorkspace_ = null; +}; + +/** + * Get the width of the flyout. + * @return {number} The width of the flyout. + */ +Blockly.Flyout.prototype.getWidth = function() { + return this.width_; +}; + +/** + * Get the height of the flyout. + * @return {number} The width of the flyout. + */ +Blockly.Flyout.prototype.getHeight = function() { + return this.height_; +}; + +/** + * Return an object with all the metrics required to size scrollbars for the + * flyout. The following properties are computed: + * .viewHeight: Height of the visible rectangle, + * .viewWidth: Width of the visible rectangle, + * .contentHeight: Height of the contents, + * .contentWidth: Width of the contents, + * .viewTop: Offset of top edge of visible rectangle from parent, + * .contentTop: Offset of the top-most content from the y=0 coordinate, + * .absoluteTop: Top-edge of view. + * .viewLeft: Offset of the left edge of visible rectangle from parent, + * .contentLeft: Offset of the left-most content from the x=0 coordinate, + * .absoluteLeft: Left-edge of view. + * @return {Object} Contains size and position metrics of the flyout. + * @private + */ +Blockly.Flyout.prototype.getMetrics_ = function() { + if (!this.isVisible()) { + // Flyout is hidden. + return null; + } + + try { + var optionBox = this.workspace_.getCanvas().getBBox(); + } catch (e) { + // Firefox has trouble with hidden elements (Bug 528969). + var optionBox = {height: 0, y: 0, width: 0, x: 0}; + } + + var absoluteTop = this.SCROLLBAR_PADDING; + var absoluteLeft = this.SCROLLBAR_PADDING; + if (this.horizontalLayout_) { + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_BOTTOM) { + absoluteTop = 0; + } + var viewHeight = this.height_; + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { + viewHeight -= this.SCROLLBAR_PADDING; + } + var viewWidth = this.width_ - 2 * this.SCROLLBAR_PADDING; + } else { + absoluteLeft = 0; + var viewHeight = this.height_ - 2 * this.SCROLLBAR_PADDING; + var viewWidth = this.width_; + if (!this.RTL) { + viewWidth -= this.SCROLLBAR_PADDING; + } + } + + var metrics = { + viewHeight: viewHeight, + viewWidth: viewWidth, + contentHeight: (optionBox.height + 2 * this.MARGIN) * this.workspace_.scale, + contentWidth: (optionBox.width + 2 * this.MARGIN) * this.workspace_.scale, + viewTop: -this.workspace_.scrollY, + viewLeft: -this.workspace_.scrollX, + contentTop: optionBox.y, + contentLeft: optionBox.x, + absoluteTop: absoluteTop, + absoluteLeft: absoluteLeft + }; + return metrics; +}; + +/** + * Sets the translation of the flyout to match the scrollbars. + * @param {!Object} xyRatio Contains a y property which is a float + * between 0 and 1 specifying the degree of scrolling and a + * similar x property. + * @private + */ +Blockly.Flyout.prototype.setMetrics_ = function(xyRatio) { + var metrics = this.getMetrics_(); + // This is a fix to an apparent race condition. + if (!metrics) { + return; + } + if (!this.horizontalLayout_ && goog.isNumber(xyRatio.y)) { + this.workspace_.scrollY = -metrics.contentHeight * xyRatio.y; + } else if (this.horizontalLayout_ && goog.isNumber(xyRatio.x)) { + this.workspace_.scrollX = -metrics.contentWidth * xyRatio.x; + } + + this.workspace_.translate(this.workspace_.scrollX + metrics.absoluteLeft, + this.workspace_.scrollY + metrics.absoluteTop); +}; + +/** + * Move the flyout to the edge of the workspace. + */ +Blockly.Flyout.prototype.position = function() { + if (!this.isVisible()) { + return; + } + var targetWorkspaceMetrics = this.targetWorkspace_.getMetrics(); + if (!targetWorkspaceMetrics) { + // Hidden components will return null. + return; + } + var edgeWidth = this.horizontalLayout_ ? + targetWorkspaceMetrics.viewWidth - 2 * this.CORNER_RADIUS : + this.width_ - this.CORNER_RADIUS; + + var edgeHeight = this.horizontalLayout_ ? + this.height_ - this.CORNER_RADIUS : + targetWorkspaceMetrics.viewHeight - 2 * this.CORNER_RADIUS; + + this.setBackgroundPath_(edgeWidth, edgeHeight); + + var x = targetWorkspaceMetrics.absoluteLeft; + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_RIGHT) { + x += targetWorkspaceMetrics.viewWidth; + x -= this.width_; + } + + var y = targetWorkspaceMetrics.absoluteTop; + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_BOTTOM) { + y += targetWorkspaceMetrics.viewHeight; + y -= this.height_; + } + + // Record the height for Blockly.Flyout.getMetrics_, or width if the layout is + // horizontal. + if (this.horizontalLayout_) { + this.width_ = targetWorkspaceMetrics.viewWidth; + } else { + this.height_ = targetWorkspaceMetrics.viewHeight; + } + + this.svgGroup_.setAttribute("width", this.width_); + this.svgGroup_.setAttribute("height", this.height_); + var transform = 'translate(' + x + 'px,' + y + 'px)'; + Blockly.utils.setCssTransform(this.svgGroup_, transform); + + // Update the scrollbar (if one exists). + if (this.scrollbar_) { + // Set the scrollbars origin to be the top left of the flyout. + this.scrollbar_.setOrigin(x, y); + this.scrollbar_.resize(); + } +}; + +/** + * Create and set the path for the visible boundaries of the flyout. + * @param {number} width The width of the flyout, not including the + * rounded corners. + * @param {number} height The height of the flyout, not including + * rounded corners. + * @private + */ +Blockly.Flyout.prototype.setBackgroundPath_ = function(width, height) { + if (this.horizontalLayout_) { + this.setBackgroundPathHorizontal_(width, height); + } else { + this.setBackgroundPathVertical_(width, height); + } +}; + +/** + * Create and set the path for the visible boundaries of the flyout in vertical + * mode. + * @param {number} width The width of the flyout, not including the + * rounded corners. + * @param {number} height The height of the flyout, not including + * rounded corners. + * @private + */ +Blockly.Flyout.prototype.setBackgroundPathVertical_ = function(width, height) { + var atRight = this.toolboxPosition_ == Blockly.TOOLBOX_AT_RIGHT; + var totalWidth = width + this.CORNER_RADIUS; + + // Decide whether to start on the left or right. + var path = ['M ' + (atRight ? totalWidth : 0) + ',0']; + // Top. + path.push('h', atRight ? -width : width); + // Rounded corner. + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, + atRight ? 0 : 1, + atRight ? -this.CORNER_RADIUS : this.CORNER_RADIUS, + this.CORNER_RADIUS); + // Side closest to workspace. + path.push('v', Math.max(0, height)); + // Rounded corner. + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, + atRight ? 0 : 1, + atRight ? this.CORNER_RADIUS : -this.CORNER_RADIUS, + this.CORNER_RADIUS); + // Bottom. + path.push('h', atRight ? width : -width); + path.push('z'); + this.svgBackground_.setAttribute('d', path.join(' ')); +}; + +/** + * Create and set the path for the visible boundaries of the flyout in + * horizontal mode. + * @param {number} width The width of the flyout, not including the + * rounded corners. + * @param {number} height The height of the flyout, not including + * rounded corners. + * @private + */ +Blockly.Flyout.prototype.setBackgroundPathHorizontal_ = function(width, + height) { + var atTop = this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP; + // Start at top left. + var path = ['M 0,' + (atTop ? 0 : this.CORNER_RADIUS)]; + + if (atTop) { + // Top. + path.push('h', width + 2 * this.CORNER_RADIUS); + // Right. + path.push('v', height); + // Bottom. + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, + -this.CORNER_RADIUS, this.CORNER_RADIUS); + path.push('h', -1 * width); + // Left. + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, + -this.CORNER_RADIUS, -this.CORNER_RADIUS); + path.push('z'); + } else { + // Top. + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, + this.CORNER_RADIUS, -this.CORNER_RADIUS); + path.push('h', width); + // Right. + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, + this.CORNER_RADIUS, this.CORNER_RADIUS); + path.push('v', height); + // Bottom. + path.push('h', -width - 2 * this.CORNER_RADIUS); + // Left. + path.push('z'); + } + this.svgBackground_.setAttribute('d', path.join(' ')); +}; + +/** + * Scroll the flyout to the top. + */ +Blockly.Flyout.prototype.scrollToStart = function() { + this.scrollbar_.set((this.horizontalLayout_ && this.RTL) ? Infinity : 0); +}; + +/** + * Scroll the flyout. + * @param {!Event} e Mouse wheel scroll event. + * @private + */ +Blockly.Flyout.prototype.wheel_ = function(e) { + var delta = this.horizontalLayout_ ? e.deltaX : e.deltaY; + + if (delta) { + if (goog.userAgent.GECKO) { + // Firefox's deltas are a tenth that of Chrome/Safari. + delta *= 10; + } + var metrics = this.getMetrics_(); + var pos = this.horizontalLayout_ ? metrics.viewLeft + delta : + metrics.viewTop + delta; + var limit = this.horizontalLayout_ ? + metrics.contentWidth - metrics.viewWidth : + metrics.contentHeight - metrics.viewHeight; + pos = Math.min(pos, limit); + pos = Math.max(pos, 0); + this.scrollbar_.set(pos); + } + + // Don't scroll the page. + e.preventDefault(); + // Don't propagate mousewheel event (zooming). + e.stopPropagation(); +}; + +/** + * Is the flyout visible? + * @return {boolean} True if visible. + */ +Blockly.Flyout.prototype.isVisible = function() { + return this.isVisible_; +}; + + /** + * Set whether the flyout is visible. A value of true does not necessarily mean + * that the flyout is shown. It could be hidden because its container is hidden. + * @param {boolean} visible True if visible. + */ +Blockly.Flyout.prototype.setVisible = function(visible) { + var visibilityChanged = (visible != this.isVisible()); + + this.isVisible_ = visible; + if (visibilityChanged) { + this.updateDisplay_(); + } +}; + +/** + * Set whether this flyout's container is visible. + * @param {boolean} visible Whether the container is visible. + */ +Blockly.Flyout.prototype.setContainerVisible = function(visible) { + var visibilityChanged = (visible != this.containerVisible_); + this.containerVisible_ = visible; + if (visibilityChanged) { + this.updateDisplay_(); + } +}; + +/** + * Update the display property of the flyout based whether it thinks it should + * be visible and whether its containing workspace is visible. + * @private + */ +Blockly.Flyout.prototype.updateDisplay_ = function() { + var show = true; + if (!this.containerVisible_) { + show = false; + } else { + show = this.isVisible(); + } + this.svgGroup_.style.display = show ? 'block' : 'none'; + // Update the scrollbar's visiblity too since it should mimic the + // flyout's visibility. + this.scrollbar_.setContainerVisible(show); +}; + +/** + * Hide and empty the flyout. + */ +Blockly.Flyout.prototype.hide = function() { + if (!this.isVisible()) { + return; + } + this.setVisible(false); + // Delete all the event listeners. + for (var x = 0, listen; listen = this.listeners_[x]; x++) { + Blockly.unbindEvent_(listen); + } + this.listeners_.length = 0; + if (this.reflowWrapper_) { + this.workspace_.removeChangeListener(this.reflowWrapper_); + this.reflowWrapper_ = null; + } + // Do NOT delete the blocks here. Wait until Flyout.show. + // https://neil.fraser.name/news/2014/08/09/ +}; + +/** + * Show and populate the flyout. + * @param {!Array|string} xmlList List of blocks to show. + * Variables and procedures have a custom set of blocks. + */ +Blockly.Flyout.prototype.show = function(xmlList) { + this.workspace_.setResizesEnabled(false); + this.hide(); + this.clearOldBlocks_(); + + // Handle dynamic categories, represented by a name instead of a list of XML. + // Look up the correct category generation function and call that to get a + // valid XML list. + if (typeof xmlList == 'string') { + var fnToApply = this.workspace_.targetWorkspace.getToolboxCategoryCallback( + xmlList); + goog.asserts.assert(goog.isFunction(fnToApply), + 'Couldn\'t find a callback function when opening a toolbox category.'); + xmlList = fnToApply(this.workspace_.targetWorkspace); + goog.asserts.assert(goog.isArray(xmlList), + 'The result of a toolbox category callback must be an array.'); + } + + this.setVisible(true); + // Create the blocks to be shown in this flyout. + var contents = []; + var gaps = []; + this.permanentlyDisabled_.length = 0; + for (var i = 0, xml; xml = xmlList[i]; i++) { + if (xml.tagName) { + var tagName = xml.tagName.toUpperCase(); + var default_gap = this.horizontalLayout_ ? this.GAP_X : this.GAP_Y; + if (tagName == 'BLOCK') { + var curBlock = Blockly.Xml.domToBlock(xml, this.workspace_); + if (curBlock.disabled) { + // Record blocks that were initially disabled. + // Do not enable these blocks as a result of capacity filtering. + this.permanentlyDisabled_.push(curBlock); + } + contents.push({type: 'block', block: curBlock}); + var gap = parseInt(xml.getAttribute('gap'), 10); + gaps.push(isNaN(gap) ? default_gap : gap); + } else if (xml.tagName.toUpperCase() == 'SEP') { + // Change the gap between two blocks. + // + // The default gap is 24, can be set larger or smaller. + // This overwrites the gap attribute on the previous block. + // Note that a deprecated method is to add a gap to a block. + // + var newGap = parseInt(xml.getAttribute('gap'), 10); + // Ignore gaps before the first block. + if (!isNaN(newGap) && gaps.length > 0) { + gaps[gaps.length - 1] = newGap; + } else { + gaps.push(default_gap); + } + } else if (tagName == 'BUTTON' || tagName == 'LABEL') { + // Labels behave the same as buttons, but are styled differently. + var isLabel = tagName == 'LABEL'; + var curButton = new Blockly.FlyoutButton(this.workspace_, + this.targetWorkspace_, xml, isLabel); + contents.push({type: 'button', button: curButton}); + gaps.push(default_gap); + } + } + } + + this.layout_(contents, gaps); + + // IE 11 is an incompetent browser that fails to fire mouseout events. + // When the mouse is over the background, deselect all blocks. + var deselectAll = function() { + var topBlocks = this.workspace_.getTopBlocks(false); + for (var i = 0, block; block = topBlocks[i]; i++) { + block.removeSelect(); + } + }; + + this.listeners_.push(Blockly.bindEventWithChecks_(this.svgBackground_, + 'mouseover', this, deselectAll)); + + if (this.horizontalLayout_) { + this.height_ = 0; + } else { + this.width_ = 0; + } + this.workspace_.setResizesEnabled(true); + this.reflow(); + + this.filterForCapacity_(); + + // Correctly position the flyout's scrollbar when it opens. + this.position(); + + this.reflowWrapper_ = this.reflow.bind(this); + this.workspace_.addChangeListener(this.reflowWrapper_); +}; + +/** + * Lay out the blocks in the flyout. + * @param {!Array.} contents The blocks and buttons to lay out. + * @param {!Array.} gaps The visible gaps between blocks. + * @private + */ +Blockly.Flyout.prototype.layout_ = function(contents, gaps) { + this.workspace_.scale = this.targetWorkspace_.scale; + var margin = this.MARGIN; + var cursorX = this.RTL ? margin : margin + Blockly.BlockSvg.TAB_WIDTH; + var cursorY = margin; + if (this.horizontalLayout_ && this.RTL) { + contents = contents.reverse(); + } + + for (var i = 0, item; item = contents[i]; i++) { + if (item.type == 'block') { + var block = item.block; + var allBlocks = block.getDescendants(); + for (var j = 0, child; child = allBlocks[j]; j++) { + // Mark blocks as being inside a flyout. This is used to detect and + // prevent the closure of the flyout if the user right-clicks on such a + // block. + child.isInFlyout = true; + } + block.render(); + var root = block.getSvgRoot(); + var blockHW = block.getHeightWidth(); + var tab = block.outputConnection ? Blockly.BlockSvg.TAB_WIDTH : 0; + if (this.horizontalLayout_) { + cursorX += tab; + } + block.moveBy((this.horizontalLayout_ && this.RTL) ? + cursorX + blockHW.width - tab : cursorX, + cursorY); + if (this.horizontalLayout_) { + cursorX += (blockHW.width + gaps[i] - tab); + } else { + cursorY += blockHW.height + gaps[i]; + } + + // Create an invisible rectangle under the block to act as a button. Just + // using the block as a button is poor, since blocks have holes in them. + var rect = Blockly.utils.createSvgElement('rect', {'fill-opacity': 0}, null); + rect.tooltip = block; + Blockly.Tooltip.bindMouseEvents(rect); + // Add the rectangles under the blocks, so that the blocks' tooltips work. + this.workspace_.getCanvas().insertBefore(rect, block.getSvgRoot()); + block.flyoutRect_ = rect; + this.backgroundButtons_[i] = rect; + + this.addBlockListeners_(root, block, rect); + } else if (item.type == 'button') { + var button = item.button; + var buttonSvg = button.createDom(); + button.moveTo(cursorX, cursorY); + button.show(); + Blockly.bindEventWithChecks_(buttonSvg, 'mouseup', button, + button.onMouseUp); + + this.buttons_.push(button); + if (this.horizontalLayout_) { + cursorX += (button.width + gaps[i]); + } else { + cursorY += button.height + gaps[i]; + } + } + } +}; + +/** + * Delete blocks and background buttons from a previous showing of the flyout. + * @private + */ +Blockly.Flyout.prototype.clearOldBlocks_ = function() { + // Delete any blocks from a previous showing. + var oldBlocks = this.workspace_.getTopBlocks(false); + for (var i = 0, block; block = oldBlocks[i]; i++) { + if (block.workspace == this.workspace_) { + block.dispose(false, false); + } + } + // Delete any background buttons from a previous showing. + for (var j = 0, rect; rect = this.backgroundButtons_[j]; j++) { + goog.dom.removeNode(rect); + } + this.backgroundButtons_.length = 0; + + for (var i = 0, button; button = this.buttons_[i]; i++) { + button.dispose(); + } + this.buttons_.length = 0; +}; + +/** + * Add listeners to a block that has been added to the flyout. + * @param {!Element} root The root node of the SVG group the block is in. + * @param {!Blockly.Block} block The block to add listeners for. + * @param {!Element} rect The invisible rectangle under the block that acts as + * a button for that block. + * @private + */ +Blockly.Flyout.prototype.addBlockListeners_ = function(root, block, rect) { + this.listeners_.push(Blockly.bindEventWithChecks_(root, 'mousedown', null, + this.blockMouseDown_(block))); + this.listeners_.push(Blockly.bindEventWithChecks_(rect, 'mousedown', null, + this.blockMouseDown_(block))); + this.listeners_.push(Blockly.bindEvent_(root, 'mouseover', block, + block.addSelect)); + this.listeners_.push(Blockly.bindEvent_(root, 'mouseout', block, + block.removeSelect)); + this.listeners_.push(Blockly.bindEvent_(rect, 'mouseover', block, + block.addSelect)); + this.listeners_.push(Blockly.bindEvent_(rect, 'mouseout', block, + block.removeSelect)); +}; + +/** + * Actions to take when a block in the flyout is right-clicked. + * @param {!Event} e Event that triggered the right-click. Could originate from + * a long-press in a touch environment. + * @param {Blockly.BlockSvg} block The block that was clicked. + */ +Blockly.Flyout.blockRightClick_ = function(e, block) { + Blockly.terminateDrag_(); + Blockly.hideChaff(true); + block.showContextMenu_(e); + // This was a right-click, so end the gesture immediately. + Blockly.Touch.clearTouchIdentifier(); +}; + +/** + * Handle a mouse-down on an SVG block in a non-closing flyout. + * @param {!Blockly.Block} block The flyout block to copy. + * @return {!Function} Function to call when block is clicked. + * @private + */ +Blockly.Flyout.prototype.blockMouseDown_ = function(block) { + var flyout = this; + return function(e) { + if (Blockly.utils.isRightButton(e)) { + Blockly.Flyout.blockRightClick_(e, block); + } else { + Blockly.terminateDrag_(); + Blockly.hideChaff(true); + // Left-click (or middle click) + Blockly.Css.setCursor(Blockly.Css.Cursor.CLOSED); + // Record the current mouse position. + flyout.startDragMouseY_ = e.clientY; + flyout.startDragMouseX_ = e.clientX; + Blockly.Flyout.startDownEvent_ = e; + Blockly.Flyout.startBlock_ = block; + Blockly.Flyout.startFlyout_ = flyout; + Blockly.Flyout.onMouseUpWrapper_ = Blockly.bindEventWithChecks_(document, + 'mouseup', flyout, flyout.onMouseUp_); + Blockly.Flyout.onMouseMoveBlockWrapper_ = Blockly.bindEventWithChecks_( + document, 'mousemove', flyout, flyout.onMouseMoveBlock_); + } + // This event has been handled. No need to bubble up to the document. + e.stopPropagation(); + e.preventDefault(); + }; +}; + +/** + * Mouse down on the flyout background. Start a vertical scroll drag. + * @param {!Event} e Mouse down event. + * @private + */ +Blockly.Flyout.prototype.onMouseDown_ = function(e) { + if (Blockly.utils.isRightButton(e)) { + // Don't start drags with right clicks. + Blockly.Touch.clearTouchIdentifier(); + return; + } + Blockly.hideChaff(true); + this.dragMode_ = Blockly.DRAG_FREE; + this.startDragMouseY_ = e.clientY; + this.startDragMouseX_ = e.clientX; + Blockly.Flyout.startFlyout_ = this; + Blockly.Flyout.onMouseMoveWrapper_ = Blockly.bindEventWithChecks_(document, + 'mousemove', this, this.onMouseMove_); + Blockly.Flyout.onMouseUpWrapper_ = Blockly.bindEventWithChecks_(document, + 'mouseup', this, Blockly.Flyout.terminateDrag_); + // This event has been handled. No need to bubble up to the document. + e.preventDefault(); + e.stopPropagation(); +}; + +/** + * Handle a mouse-up anywhere in the SVG pane. Is only registered when a + * block is clicked. We can't use mouseUp on the block since a fast-moving + * cursor can briefly escape the block before it catches up. + * @param {!Event} e Mouse up event. + * @private + */ +Blockly.Flyout.prototype.onMouseUp_ = function(e) { + if (!this.workspace_.isDragging()) { + // This was a click, not a drag. End the gesture. + Blockly.Touch.clearTouchIdentifier(); + if (this.autoClose) { + this.createBlockFunc_(Blockly.Flyout.startBlock_)( + Blockly.Flyout.startDownEvent_); + } else if (!Blockly.WidgetDiv.isVisible()) { + Blockly.Events.fire( + new Blockly.Events.Ui(Blockly.Flyout.startBlock_, 'click', + undefined, undefined)); + } + } + Blockly.terminateDrag_(); +}; + +/** + * Handle a mouse-move to vertically drag the flyout. + * @param {!Event} e Mouse move event. + * @private + */ +Blockly.Flyout.prototype.onMouseMove_ = function(e) { + var metrics = this.getMetrics_(); + if (this.horizontalLayout_) { + if (metrics.contentWidth - metrics.viewWidth < 0) { + return; + } + var dx = e.clientX - this.startDragMouseX_; + this.startDragMouseX_ = e.clientX; + var x = metrics.viewLeft - dx; + x = goog.math.clamp(x, 0, metrics.contentWidth - metrics.viewWidth); + this.scrollbar_.set(x); + } else { + if (metrics.contentHeight - metrics.viewHeight < 0) { + return; + } + var dy = e.clientY - this.startDragMouseY_; + this.startDragMouseY_ = e.clientY; + var y = metrics.viewTop - dy; + y = goog.math.clamp(y, 0, metrics.contentHeight - metrics.viewHeight); + this.scrollbar_.set(y); + } +}; + +/** + * Mouse button is down on a block in a non-closing flyout. Create the block + * if the mouse moves beyond a small radius. This allows one to play with + * fields without instantiating blocks that instantly self-destruct. + * @param {!Event} e Mouse move event. + * @private + */ +Blockly.Flyout.prototype.onMouseMoveBlock_ = function(e) { + if (e.type == 'mousemove' && e.clientX <= 1 && e.clientY == 0 && + e.button == 0) { + /* HACK: + Safari Mobile 6.0 and Chrome for Android 18.0 fire rogue mousemove events + on certain touch actions. Ignore events with these signatures. + This may result in a one-pixel blind spot in other browsers, + but this shouldn't be noticeable. */ + e.stopPropagation(); + return; + } + var dx = e.clientX - Blockly.Flyout.startDownEvent_.clientX; + var dy = e.clientY - Blockly.Flyout.startDownEvent_.clientY; + + var createBlock = this.determineDragIntention_(dx, dy); + if (createBlock) { + Blockly.longStop_(); + this.createBlockFunc_(Blockly.Flyout.startBlock_)( + Blockly.Flyout.startDownEvent_); + } else if (this.dragMode_ == Blockly.DRAG_FREE) { + Blockly.longStop_(); + // Do a scroll. + this.onMouseMove_(e); + } + e.stopPropagation(); +}; + +/** + * Determine the intention of a drag. + * Updates dragMode_ based on a drag delta and the current mode, + * and returns true if we should create a new block. + * @param {number} dx X delta of the drag. + * @param {number} dy Y delta of the drag. + * @return {boolean} True if a new block should be created. + * @private + */ +Blockly.Flyout.prototype.determineDragIntention_ = function(dx, dy) { + if (this.dragMode_ == Blockly.DRAG_FREE) { + // Once in free mode, always stay in free mode and never create a block. + return false; + } + var dragDistance = Math.sqrt(dx * dx + dy * dy); + if (dragDistance < this.DRAG_RADIUS) { + // Still within the sticky drag radius. + this.dragMode_ = Blockly.DRAG_STICKY; + return false; + } else { + if (this.isDragTowardWorkspace_(dx, dy) || !this.scrollbar_.isVisible()) { + // Immediately create a block. + return true; + } else { + // Immediately move to free mode - the drag is away from the workspace. + this.dragMode_ = Blockly.DRAG_FREE; + return false; + } + } +}; + +/** + * Determine if a drag delta is toward the workspace, based on the position + * and orientation of the flyout. This is used in determineDragIntention_ to + * determine if a new block should be created or if the flyout should scroll. + * @param {number} dx X delta of the drag. + * @param {number} dy Y delta of the drag. + * @return {boolean} true if the drag is toward the workspace. + * @private + */ +Blockly.Flyout.prototype.isDragTowardWorkspace_ = function(dx, dy) { + // Direction goes from -180 to 180, with 0 toward the right and 90 on top. + var dragDirection = Math.atan2(dy, dx) / Math.PI * 180; + + var range = this.dragAngleRange_; + if (this.horizontalLayout_) { + // Check for up or down dragging. + if ((dragDirection < 90 + range && dragDirection > 90 - range) || + (dragDirection > -90 - range && dragDirection < -90 + range)) { + return true; + } + } else { + // Check for left or right dragging. + if ((dragDirection < range && dragDirection > -range) || + (dragDirection < -180 + range || dragDirection > 180 - range)) { + return true; + } + } + return false; +}; + +/** + * Create a copy of this block on the workspace. + * @param {!Blockly.Block} originBlock The flyout block to copy. + * @return {!Function} Function to call when block is clicked. + * @private + */ +Blockly.Flyout.prototype.createBlockFunc_ = function(originBlock) { + var flyout = this; + return function(e) { + if (Blockly.utils.isRightButton(e)) { + // Right-click. Don't create a block, let the context menu show. + return; + } + if (originBlock.disabled) { + // Beyond capacity. + return; + } + Blockly.Events.disable(); + // Disable workspace resizing. Reenable at the end of the drag. This avoids + // a spurious resize between creating the new block and placing it in the + // workspace. + flyout.targetWorkspace_.setResizesEnabled(false); + try { + var block = flyout.placeNewBlock_(originBlock); + } finally { + Blockly.Events.enable(); + } + if (Blockly.Events.isEnabled()) { + Blockly.Events.setGroup(true); + Blockly.Events.fire(new Blockly.Events.Create(block)); + } + if (flyout.autoClose) { + flyout.hide(); + } else { + flyout.filterForCapacity_(); + } + + // Re-render the blocks before starting the drag: + // Force a render on IE and Edge to get around the issue described in + // Blockly.Field.getCachedWidth + if (goog.userAgent.IE || goog.userAgent.EDGE) { + var blocks = block.getDescendants(); + for (var i = blocks.length - 1; i >= 0; i--) { + blocks[i].render(false); + } + } + + // Start a dragging operation on the new block. + block.onMouseDown_(e); + Blockly.dragMode_ = Blockly.DRAG_FREE; + block.setDragging_(true); + block.moveToDragSurface_(); + }; +}; + +/** + * Copy a block from the flyout to the workspace and position it correctly. + * @param {!Blockly.Block} originBlock The flyout block to copy.. + * @return {!Blockly.Block} The new block in the main workspace. + * @private + */ +Blockly.Flyout.prototype.placeNewBlock_ = function(originBlock) { + var targetWorkspace = this.targetWorkspace_; + var svgRootOld = originBlock.getSvgRoot(); + if (!svgRootOld) { + throw 'originBlock is not rendered.'; + } + // Figure out where the original block is on the screen, relative to the upper + // left corner of the main workspace. + if (targetWorkspace.isMutator) { + var xyOld = this.workspace_.getSvgXY(/** @type {!Element} */ (svgRootOld)); + } else { + var xyOld = Blockly.utils.getInjectionDivXY_(svgRootOld); + } + // Take into account that the flyout might have been scrolled horizontally + // (separately from the main workspace). + // Generally a no-op in vertical mode but likely to happen in horizontal + // mode. + var scrollX = this.workspace_.scrollX; + var scale = this.workspace_.scale; + xyOld.x += scrollX / scale - scrollX; + // If the flyout is on the right side, (0, 0) in the flyout is offset to + // the right of (0, 0) in the main workspace. Add an offset to take that + // into account. + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_RIGHT) { + scrollX = targetWorkspace.getMetrics().viewWidth - this.width_; + scale = targetWorkspace.scale; + // Scale the scroll (getSvgXY_ did not do this). + xyOld.x += scrollX / scale - scrollX; + } + + // Take into account that the flyout might have been scrolled vertically + // (separately from the main workspace). + // Generally a no-op in horizontal mode but likely to happen in vertical + // mode. + var scrollY = this.workspace_.scrollY; + scale = this.workspace_.scale; + xyOld.y += scrollY / scale - scrollY; + // If the flyout is on the bottom, (0, 0) in the flyout is offset to be below + // (0, 0) in the main workspace. Add an offset to take that into account. + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_BOTTOM) { + scrollY = targetWorkspace.getMetrics().viewHeight - this.height_; + scale = targetWorkspace.scale; + xyOld.y += scrollY / scale - scrollY; + } + + // Create the new block by cloning the block in the flyout (via XML). + var xml = Blockly.Xml.blockToDom(originBlock); + var block = Blockly.Xml.domToBlock(xml, targetWorkspace); + var svgRootNew = block.getSvgRoot(); + if (!svgRootNew) { + throw 'block is not rendered.'; + } + // Figure out where the new block got placed on the screen, relative to the + // upper left corner of the workspace. This may not be the same as the + // original block because the flyout's origin may not be the same as the + // main workspace's origin. + if (targetWorkspace.isMutator) { + var xyNew = targetWorkspace.getSvgXY(/* @type {!Element} */(svgRootNew)); + } else { + var xyNew = Blockly.utils.getInjectionDivXY_(svgRootNew); + } + + // Scale the scroll (getSvgXY_ did not do this). + xyNew.x += + targetWorkspace.scrollX / targetWorkspace.scale - targetWorkspace.scrollX; + xyNew.y += + targetWorkspace.scrollY / targetWorkspace.scale - targetWorkspace.scrollY; + // If the flyout is collapsible and the workspace can't be scrolled. + if (targetWorkspace.toolbox_ && !targetWorkspace.scrollbar) { + xyNew.x += targetWorkspace.toolbox_.getWidth() / targetWorkspace.scale; + xyNew.y += targetWorkspace.toolbox_.getHeight() / targetWorkspace.scale; + } + + // Move the new block to where the old block is. + block.moveBy(xyOld.x - xyNew.x, xyOld.y - xyNew.y); + return block; +}; + +/** + * Filter the blocks on the flyout to disable the ones that are above the + * capacity limit. + * @private + */ +Blockly.Flyout.prototype.filterForCapacity_ = function() { + var remainingCapacity = this.targetWorkspace_.remainingCapacity(); + var blocks = this.workspace_.getTopBlocks(false); + for (var i = 0, block; block = blocks[i]; i++) { + if (this.permanentlyDisabled_.indexOf(block) == -1) { + var allBlocks = block.getDescendants(); + block.setDisabled(allBlocks.length > remainingCapacity); + } + } +}; + +/** + * Return the deletion rectangle for this flyout. + * @return {goog.math.Rect} Rectangle in which to delete. + */ +Blockly.Flyout.prototype.getClientRect = function() { + if (!this.svgGroup_) { + return null; + } + + var flyoutRect = this.svgGroup_.getBoundingClientRect(); + // BIG_NUM is offscreen padding so that blocks dragged beyond the shown flyout + // area are still deleted. Must be larger than the largest screen size, + // but be smaller than half Number.MAX_SAFE_INTEGER (not available on IE). + var BIG_NUM = 1000000000; + var x = flyoutRect.left; + var y = flyoutRect.top; + var width = flyoutRect.width; + var height = flyoutRect.height; + + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { + return new goog.math.Rect(-BIG_NUM, y - BIG_NUM, BIG_NUM * 2, + BIG_NUM + height); + } else if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_BOTTOM) { + return new goog.math.Rect(-BIG_NUM, y, BIG_NUM * 2, + BIG_NUM + height); + } else if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_LEFT) { + return new goog.math.Rect(x - BIG_NUM, -BIG_NUM, BIG_NUM + width, + BIG_NUM * 2); + } else { // Right + return new goog.math.Rect(x, -BIG_NUM, BIG_NUM + width, BIG_NUM * 2); + } +}; + +/** + * Stop binding to the global mouseup and mousemove events. + * @private + */ +Blockly.Flyout.terminateDrag_ = function() { + if (Blockly.Flyout.startFlyout_) { + // User was dragging the flyout background, and has stopped. + if (Blockly.Flyout.startFlyout_.dragMode_ == Blockly.DRAG_FREE) { + Blockly.Touch.clearTouchIdentifier(); + } + Blockly.Flyout.startFlyout_.dragMode_ = Blockly.DRAG_NONE; + Blockly.Flyout.startFlyout_ = null; + } + if (Blockly.Flyout.onMouseUpWrapper_) { + Blockly.unbindEvent_(Blockly.Flyout.onMouseUpWrapper_); + Blockly.Flyout.onMouseUpWrapper_ = null; + } + if (Blockly.Flyout.onMouseMoveBlockWrapper_) { + Blockly.unbindEvent_(Blockly.Flyout.onMouseMoveBlockWrapper_); + Blockly.Flyout.onMouseMoveBlockWrapper_ = null; + } + if (Blockly.Flyout.onMouseMoveWrapper_) { + Blockly.unbindEvent_(Blockly.Flyout.onMouseMoveWrapper_); + Blockly.Flyout.onMouseMoveWrapper_ = null; + } + Blockly.Flyout.startDownEvent_ = null; + Blockly.Flyout.startBlock_ = null; +}; + +/** + * Compute height of flyout. Position button under each block. + * For RTL: Lay out the blocks right-aligned. + * @param {!Array} blocks The blocks to reflow. + */ +Blockly.Flyout.prototype.reflowHorizontal = function(blocks) { + this.workspace_.scale = this.targetWorkspace_.scale; + var flyoutHeight = 0; + for (var i = 0, block; block = blocks[i]; i++) { + flyoutHeight = Math.max(flyoutHeight, block.getHeightWidth().height); + } + flyoutHeight += this.MARGIN * 1.5; + flyoutHeight *= this.workspace_.scale; + flyoutHeight += Blockly.Scrollbar.scrollbarThickness; + if (this.height_ != flyoutHeight) { + for (var i = 0, block; block = blocks[i]; i++) { + var blockHW = block.getHeightWidth(); + if (block.flyoutRect_) { + block.flyoutRect_.setAttribute('width', blockHW.width); + block.flyoutRect_.setAttribute('height', blockHW.height); + // Rectangles behind blocks with output tabs are shifted a bit. + var tab = block.outputConnection ? Blockly.BlockSvg.TAB_WIDTH : 0; + var blockXY = block.getRelativeToSurfaceXY(); + block.flyoutRect_.setAttribute('y', blockXY.y); + block.flyoutRect_.setAttribute('x', + this.RTL ? blockXY.x - blockHW.width + tab : blockXY.x - tab); + // For hat blocks we want to shift them down by the hat height + // since the y coordinate is the corner, not the top of the hat. + var hatOffset = + block.startHat_ ? Blockly.BlockSvg.START_HAT_HEIGHT : 0; + if (hatOffset) { + block.moveBy(0, hatOffset); + } + block.flyoutRect_.setAttribute('y', blockXY.y); + } + } + // Record the height for .getMetrics_ and .position. + this.height_ = flyoutHeight; + // Call this since it is possible the trash and zoom buttons need + // to move. e.g. on a bottom positioned flyout when zoom is clicked. + this.targetWorkspace_.resize(); + } +}; + +/** + * Compute width of flyout. Position button under each block. + * For RTL: Lay out the blocks right-aligned. + * @param {!Array} blocks The blocks to reflow. + */ +Blockly.Flyout.prototype.reflowVertical = function(blocks) { + this.workspace_.scale = this.targetWorkspace_.scale; + var flyoutWidth = 0; + for (var i = 0, block; block = blocks[i]; i++) { + var width = block.getHeightWidth().width; + if (block.outputConnection) { + width -= Blockly.BlockSvg.TAB_WIDTH; + } + flyoutWidth = Math.max(flyoutWidth, width); + } + for (var i = 0, button; button = this.buttons_[i]; i++) { + flyoutWidth = Math.max(flyoutWidth, button.width); + } + flyoutWidth += this.MARGIN * 1.5 + Blockly.BlockSvg.TAB_WIDTH; + flyoutWidth *= this.workspace_.scale; + flyoutWidth += Blockly.Scrollbar.scrollbarThickness; + if (this.width_ != flyoutWidth) { + for (var i = 0, block; block = blocks[i]; i++) { + var blockHW = block.getHeightWidth(); + if (this.RTL) { + // With the flyoutWidth known, right-align the blocks. + var oldX = block.getRelativeToSurfaceXY().x; + var newX = flyoutWidth / this.workspace_.scale - this.MARGIN; + newX -= Blockly.BlockSvg.TAB_WIDTH; + block.moveBy(newX - oldX, 0); + } + if (block.flyoutRect_) { + block.flyoutRect_.setAttribute('width', blockHW.width); + block.flyoutRect_.setAttribute('height', blockHW.height); + // Blocks with output tabs are shifted a bit. + var tab = block.outputConnection ? Blockly.BlockSvg.TAB_WIDTH : 0; + var blockXY = block.getRelativeToSurfaceXY(); + block.flyoutRect_.setAttribute('x', + this.RTL ? blockXY.x - blockHW.width + tab : blockXY.x - tab); + // For hat blocks we want to shift them down by the hat height + // since the y coordinate is the corner, not the top of the hat. + var hatOffset = + block.startHat_ ? Blockly.BlockSvg.START_HAT_HEIGHT : 0; + if (hatOffset) { + block.moveBy(0, hatOffset); + } + block.flyoutRect_.setAttribute('y', blockXY.y); + } + } + // Record the width for .getMetrics_ and .position. + this.width_ = flyoutWidth; + // Call this since it is possible the trash and zoom buttons need + // to move. e.g. on a bottom positioned flyout when zoom is clicked. + this.targetWorkspace_.resize(); + } +}; + +/** + * Reflow blocks and their buttons. + */ +Blockly.Flyout.prototype.reflow = function() { + if (this.reflowWrapper_) { + this.workspace_.removeChangeListener(this.reflowWrapper_); + } + var blocks = this.workspace_.getTopBlocks(false); + if (this.horizontalLayout_) { + this.reflowHorizontal(blocks); + } else { + this.reflowVertical(blocks); + } + if (this.reflowWrapper_) { + this.workspace_.addChangeListener(this.reflowWrapper_); + } +}; diff --git a/src/opsoro/server/static/js/blockly/core/flyout_button.js b/src/opsoro/server/static/js/blockly/core/flyout_button.js new file mode 100644 index 0000000..334cb3e --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/flyout_button.js @@ -0,0 +1,235 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Class for a button in the flyout. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.FlyoutButton'); + +goog.require('goog.dom'); +goog.require('goog.math.Coordinate'); + + +/** + * Class for a button in the flyout. + * @param {!Blockly.WorkspaceSvg} workspace The workspace in which to place this + * button. + * @param {!Blockly.WorkspaceSvg} targetWorkspace The flyout's target workspace. + * @param {!Element} xml The XML specifying the label/button. + * @param {boolean} isLabel Whether this button should be styled as a label. + * @constructor + */ +Blockly.FlyoutButton = function(workspace, targetWorkspace, xml, isLabel) { + // Labels behave the same as buttons, but are styled differently. + + /** + * @type {!Blockly.WorkspaceSvg} + * @private + */ + this.workspace_ = workspace; + + /** + * @type {!Blockly.Workspace} + * @private + */ + this.targetWorkspace_ = targetWorkspace; + + /** + * @type {string} + * @private + */ + this.text_ = xml.getAttribute('text'); + + /** + * @type {!goog.math.Coordinate} + * @private + */ + this.position_ = new goog.math.Coordinate(0, 0); + + /** + * Whether this button should be styled as a label. + * @type {boolean} + * @private + */ + this.isLabel_ = isLabel; + + /** + * Function to call when this button is clicked. + * @type {function(!Blockly.FlyoutButton)} + * @private + */ + this.callback_ = null; + + var callbackKey = xml.getAttribute('callbackKey'); + if (this.isLabel_ && callbackKey) { + console.warn('Labels should not have callbacks. Label text: ' + this.text_); + } else if (!this.isLabel_ && + !(callbackKey && targetWorkspace.getButtonCallback(callbackKey))) { + console.warn('Buttons should have callbacks. Button text: ' + this.text_); + } else { + this.callback_ = targetWorkspace.getButtonCallback(callbackKey); + } + + /** + * If specified, a CSS class to add to this button. + * @type {?string} + * @private + */ + this.cssClass_ = xml.getAttribute('web-class') || null; +}; + +/** + * The margin around the text in the button. + */ +Blockly.FlyoutButton.MARGIN = 5; + +/** + * The width of the button's rect. + * @type {number} + */ +Blockly.FlyoutButton.prototype.width = 0; + +/** + * The height of the button's rect. + * @type {number} + */ +Blockly.FlyoutButton.prototype.height = 0; + +/** + * Create the button elements. + * @return {!Element} The button's SVG group. + */ +Blockly.FlyoutButton.prototype.createDom = function() { + var cssClass = this.isLabel_ ? 'blocklyFlyoutLabel' : 'blocklyFlyoutButton'; + if (this.cssClass_) { + cssClass += ' ' + this.cssClass_; + } + + this.svgGroup_ = Blockly.utils.createSvgElement('g', {'class': cssClass}, + this.workspace_.getCanvas()); + + if (!this.isLabel_) { + // Shadow rectangle (light source does not mirror in RTL). + var shadow = Blockly.utils.createSvgElement('rect', + {'class': 'blocklyFlyoutButtonShadow', + 'rx': 4, 'ry': 4, 'x': 1, 'y': 1}, + this.svgGroup_); + } + // Background rectangle. + var rect = Blockly.utils.createSvgElement('rect', + {'class': this.isLabel_ ? + 'blocklyFlyoutLabelBackground' : 'blocklyFlyoutButtonBackground', + 'rx': 4, 'ry': 4}, + this.svgGroup_); + + var svgText = Blockly.utils.createSvgElement('text', + {'class': this.isLabel_ ? 'blocklyFlyoutLabelText' : 'blocklyText', + 'x': 0, 'y': 0, 'text-anchor': 'middle'}, + this.svgGroup_); + svgText.textContent = this.text_; + + this.width = svgText.getComputedTextLength() + + 2 * Blockly.FlyoutButton.MARGIN; + this.height = 20; // Can't compute it :( + + if (!this.isLabel_) { + shadow.setAttribute('width', this.width); + shadow.setAttribute('height', this.height); + } + rect.setAttribute('width', this.width); + rect.setAttribute('height', this.height); + + svgText.setAttribute('x', this.width / 2); + svgText.setAttribute('y', this.height - Blockly.FlyoutButton.MARGIN); + + this.updateTransform_(); + return this.svgGroup_; +}; + +/** + * Correctly position the flyout button and make it visible. + */ +Blockly.FlyoutButton.prototype.show = function() { + this.updateTransform_(); + this.svgGroup_.setAttribute('display', 'block'); +}; + +/** + * Update svg attributes to match internal state. + * @private + */ +Blockly.FlyoutButton.prototype.updateTransform_ = function() { + this.svgGroup_.setAttribute('transform', + 'translate(' + this.position_.x + ',' + this.position_.y + ')'); +}; + +/** + * Move the button to the given x, y coordinates. + * @param {number} x The new x coordinate. + * @param {number} y The new y coordinate. + */ +Blockly.FlyoutButton.prototype.moveTo = function(x, y) { + this.position_.x = x; + this.position_.y = y; + this.updateTransform_(); +}; + +/** + * Get the button's target workspace. + * @return {!Blockly.WorkspaceSvg} The target workspace of the flyout where this + * button resides. + */ +Blockly.FlyoutButton.prototype.getTargetWorkspace = function() { + return this.targetWorkspace_; +}; + +/** + * Dispose of this button. + */ +Blockly.FlyoutButton.prototype.dispose = function() { + if (this.svgGroup_) { + goog.dom.removeNode(this.svgGroup_); + this.svgGroup_ = null; + } + this.workspace_ = null; + this.targetWorkspace_ = null; +}; + +/** + * Do something when the button is clicked. + * @param {!Event} e Mouse up event. + */ +Blockly.FlyoutButton.prototype.onMouseUp = function(e) { + // Don't scroll the page. + e.preventDefault(); + // Don't propagate mousewheel event (zooming). + e.stopPropagation(); + // Stop binding to mouseup and mousemove events--flyout mouseup would normally + // do this, but we're skipping that. + Blockly.Flyout.terminateDrag_(); + + // Call the callback registered to this button. + if (this.callback_) { + this.callback_(this); + } +}; diff --git a/src/opsoro/server/static/js/blockly/core/generator.js b/src/opsoro/server/static/js/blockly/core/generator.js new file mode 100644 index 0000000..cba266f --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/generator.js @@ -0,0 +1,415 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Utility functions for generating executable code from + * Blockly code. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Generator'); + +goog.require('Blockly.Block'); +goog.require('goog.asserts'); + + +/** + * Class for a code generator that translates the blocks into a language. + * @param {string} name Language name of this generator. + * @constructor + */ +Blockly.Generator = function(name) { + this.name_ = name; + this.FUNCTION_NAME_PLACEHOLDER_REGEXP_ = + new RegExp(this.FUNCTION_NAME_PLACEHOLDER_, 'g'); +}; + +/** + * Category to separate generated function names from variables and procedures. + */ +Blockly.Generator.NAME_TYPE = 'generated_function'; + +/** + * Arbitrary code to inject into locations that risk causing infinite loops. + * Any instances of '%1' will be replaced by the block ID that failed. + * E.g. ' checkTimeout(%1);\n' + * @type {?string} + */ +Blockly.Generator.prototype.INFINITE_LOOP_TRAP = null; + +/** + * Arbitrary code to inject before every statement. + * Any instances of '%1' will be replaced by the block ID of the statement. + * E.g. 'highlight(%1);\n' + * @type {?string} + */ +Blockly.Generator.prototype.STATEMENT_PREFIX = null; + +/** + * The method of indenting. Defaults to two spaces, but language generators + * may override this to increase indent or change to tabs. + * @type {string} + */ +Blockly.Generator.prototype.INDENT = ' '; + +/** + * Maximum length for a comment before wrapping. Does not account for + * indenting level. + * @type {number} + */ +Blockly.Generator.prototype.COMMENT_WRAP = 60; + +/** + * List of outer-inner pairings that do NOT require parentheses. + * @type {!Array.>} + */ +Blockly.Generator.prototype.ORDER_OVERRIDES = []; + +/** + * Generate code for all blocks in the workspace to the specified language. + * @param {Blockly.Workspace} workspace Workspace to generate code from. + * @return {string} Generated code. + */ +Blockly.Generator.prototype.workspaceToCode = function(workspace) { + if (!workspace) { + // Backwards compatibility from before there could be multiple workspaces. + console.warn('No workspace specified in workspaceToCode call. Guessing.'); + workspace = Blockly.getMainWorkspace(); + } + var code = []; + this.init(workspace); + var blocks = workspace.getTopBlocks(true); + for (var x = 0, block; block = blocks[x]; x++) { + var line = this.blockToCode(block); + if (goog.isArray(line)) { + // Value blocks return tuples of code and operator order. + // Top-level blocks don't care about operator order. + line = line[0]; + } + if (line) { + if (block.outputConnection && this.scrubNakedValue) { + // This block is a naked value. Ask the language's code generator if + // it wants to append a semicolon, or something. + line = this.scrubNakedValue(line); + } + code.push(line); + } + } + code = code.join('\n'); // Blank line between each section. + code = this.finish(code); + // Final scrubbing of whitespace. + code = code.replace(/^\s+\n/, ''); + code = code.replace(/\n\s+$/, '\n'); + code = code.replace(/[ \t]+\n/g, '\n'); + return code; +}; + +// The following are some helpful functions which can be used by multiple +// languages. + +/** + * Prepend a common prefix onto each line of code. + * @param {string} text The lines of code. + * @param {string} prefix The common prefix. + * @return {string} The prefixed lines of code. + */ +Blockly.Generator.prototype.prefixLines = function(text, prefix) { + return prefix + text.replace(/(?!\n$)\n/g, '\n' + prefix); +}; + +/** + * Recursively spider a tree of blocks, returning all their comments. + * @param {!Blockly.Block} block The block from which to start spidering. + * @return {string} Concatenated list of comments. + */ +Blockly.Generator.prototype.allNestedComments = function(block) { + var comments = []; + var blocks = block.getDescendants(); + for (var i = 0; i < blocks.length; i++) { + var comment = blocks[i].getCommentText(); + if (comment) { + comments.push(comment); + } + } + // Append an empty string to create a trailing line break when joined. + if (comments.length) { + comments.push(''); + } + return comments.join('\n'); +}; + +/** + * Generate code for the specified block (and attached blocks). + * @param {Blockly.Block} block The block to generate code for. + * @return {string|!Array} For statement blocks, the generated code. + * For value blocks, an array containing the generated code and an + * operator order value. Returns '' if block is null. + */ +Blockly.Generator.prototype.blockToCode = function(block) { + if (!block) { + return ''; + } + if (block.disabled) { + // Skip past this block if it is disabled. + return this.blockToCode(block.getNextBlock()); + } + + var func = this[block.type]; + goog.asserts.assertFunction(func, + 'Language "%s" does not know how to generate code for block type "%s".', + this.name_, block.type); + // First argument to func.call is the value of 'this' in the generator. + // Prior to 24 September 2013 'this' was the only way to access the block. + // The current prefered method of accessing the block is through the second + // argument to func.call, which becomes the first parameter to the generator. + var code = func.call(block, block); + if (goog.isArray(code)) { + // Value blocks return tuples of code and operator order. + goog.asserts.assert(block.outputConnection, + 'Expecting string from statement block "%s".', block.type); + return [this.scrub_(block, code[0]), code[1]]; + } else if (goog.isString(code)) { + var id = block.id.replace(/\$/g, '$$$$'); // Issue 251. + if (this.STATEMENT_PREFIX) { + code = this.STATEMENT_PREFIX.replace(/%1/g, '\'' + id + '\'') + + code; + } + return this.scrub_(block, code); + } else if (code === null) { + // Block has handled code generation itself. + return ''; + } else { + goog.asserts.fail('Invalid code generated: %s', code); + } +}; + +/** + * Generate code representing the specified value input. + * @param {!Blockly.Block} block The block containing the input. + * @param {string} name The name of the input. + * @param {number} outerOrder The maximum binding strength (minimum order value) + * of any operators adjacent to "block". + * @return {string} Generated code or '' if no blocks are connected or the + * specified input does not exist. + */ +Blockly.Generator.prototype.valueToCode = function(block, name, outerOrder) { + if (isNaN(outerOrder)) { + goog.asserts.fail('Expecting valid order from block "%s".', block.type); + } + var targetBlock = block.getInputTargetBlock(name); + if (!targetBlock) { + return ''; + } + var tuple = this.blockToCode(targetBlock); + if (tuple === '') { + // Disabled block. + return ''; + } + // Value blocks must return code and order of operations info. + // Statement blocks must only return code. + goog.asserts.assertArray(tuple, 'Expecting tuple from value block "%s".', + targetBlock.type); + var code = tuple[0]; + var innerOrder = tuple[1]; + if (isNaN(innerOrder)) { + goog.asserts.fail('Expecting valid order from value block "%s".', + targetBlock.type); + } + if (!code) { + return ''; + } + + // Add parentheses if needed. + var parensNeeded = false; + var outerOrderClass = Math.floor(outerOrder); + var innerOrderClass = Math.floor(innerOrder); + if (outerOrderClass <= innerOrderClass) { + if (outerOrderClass == innerOrderClass && + (outerOrderClass == 0 || outerOrderClass == 99)) { + // Don't generate parens around NONE-NONE and ATOMIC-ATOMIC pairs. + // 0 is the atomic order, 99 is the none order. No parentheses needed. + // In all known languages multiple such code blocks are not order + // sensitive. In fact in Python ('a' 'b') 'c' would fail. + } else { + // The operators outside this code are stronger than the operators + // inside this code. To prevent the code from being pulled apart, + // wrap the code in parentheses. + parensNeeded = true; + // Check for special exceptions. + for (var i = 0; i < this.ORDER_OVERRIDES.length; i++) { + if (this.ORDER_OVERRIDES[i][0] == outerOrder && + this.ORDER_OVERRIDES[i][1] == innerOrder) { + parensNeeded = false; + break; + } + } + } + } + if (parensNeeded) { + // Technically, this should be handled on a language-by-language basis. + // However all known (sane) languages use parentheses for grouping. + code = '(' + code + ')'; + } + return code; +}; + +/** + * Generate code representing the statement. Indent the code. + * @param {!Blockly.Block} block The block containing the input. + * @param {string} name The name of the input. + * @return {string} Generated code or '' if no blocks are connected. + */ +Blockly.Generator.prototype.statementToCode = function(block, name) { + var targetBlock = block.getInputTargetBlock(name); + var code = this.blockToCode(targetBlock); + // Value blocks must return code and order of operations info. + // Statement blocks must only return code. + goog.asserts.assertString(code, 'Expecting code from statement block "%s".', + targetBlock && targetBlock.type); + if (code) { + code = this.prefixLines(/** @type {string} */ (code), this.INDENT); + } + return code; +}; + +/** + * Add an infinite loop trap to the contents of a loop. + * If loop is empty, add a statment prefix for the loop block. + * @param {string} branch Code for loop contents. + * @param {string} id ID of enclosing block. + * @return {string} Loop contents, with infinite loop trap added. + */ +Blockly.Generator.prototype.addLoopTrap = function(branch, id) { + id = id.replace(/\$/g, '$$$$'); // Issue 251. + if (this.INFINITE_LOOP_TRAP) { + branch = this.INFINITE_LOOP_TRAP.replace(/%1/g, '\'' + id + '\'') + branch; + } + if (this.STATEMENT_PREFIX) { + branch += this.prefixLines(this.STATEMENT_PREFIX.replace(/%1/g, + '\'' + id + '\''), this.INDENT); + } + return branch; +}; + +/** + * Comma-separated list of reserved words. + * @type {string} + * @private + */ +Blockly.Generator.prototype.RESERVED_WORDS_ = ''; + +/** + * Add one or more words to the list of reserved words for this language. + * @param {string} words Comma-separated list of words to add to the list. + * No spaces. Duplicates are ok. + */ +Blockly.Generator.prototype.addReservedWords = function(words) { + this.RESERVED_WORDS_ += words + ','; +}; + +/** + * This is used as a placeholder in functions defined using + * Blockly.Generator.provideFunction_. It must not be legal code that could + * legitimately appear in a function definition (or comment), and it must + * not confuse the regular expression parser. + * @type {string} + * @private + */ +Blockly.Generator.prototype.FUNCTION_NAME_PLACEHOLDER_ = '{leCUI8hutHZI4480Dc}'; + +/** + * Define a function to be included in the generated code. + * The first time this is called with a given desiredName, the code is + * saved and an actual name is generated. Subsequent calls with the + * same desiredName have no effect but have the same return value. + * + * It is up to the caller to make sure the same desiredName is not + * used for different code values. + * + * The code gets output when Blockly.Generator.finish() is called. + * + * @param {string} desiredName The desired name of the function (e.g., isPrime). + * @param {!Array.} code A list of statements. Use ' ' for indents. + * @return {string} The actual name of the new function. This may differ + * from desiredName if the former has already been taken by the user. + * @private + */ +Blockly.Generator.prototype.provideFunction_ = function(desiredName, code) { + if (!this.definitions_[desiredName]) { + var functionName = this.variableDB_.getDistinctName(desiredName, + Blockly.Procedures.NAME_TYPE); + this.functionNames_[desiredName] = functionName; + var codeText = code.join('\n').replace( + this.FUNCTION_NAME_PLACEHOLDER_REGEXP_, functionName); + // Change all ' ' indents into the desired indent. + // To avoid an infinite loop of replacements, change all indents to '\0' + // character first, then replace them all with the indent. + // We are assuming that no provided functions contain a literal null char. + var oldCodeText; + while (oldCodeText != codeText) { + oldCodeText = codeText; + codeText = codeText.replace(/^(( )*) /gm, '$1\0'); + } + codeText = codeText.replace(/\0/g, this.INDENT); + this.definitions_[desiredName] = codeText; + } + return this.functionNames_[desiredName]; +}; + +/** + * Hook for code to run before code generation starts. + * Subclasses may override this, e.g. to initialise the database of variable + * names. + * @param {!Blockly.Workspace} workspace Workspace to generate code from. + */ +Blockly.Generator.prototype.init = undefined; + +/** + * Common tasks for generating code from blocks. This is called from + * blockToCode and is called on every block, not just top level blocks. + * Subclasses may override this, e.g. to generate code for statements following + * the block, or to handle comments for the specified block and any connected + * value blocks. + * @param {!Blockly.Block} block The current block. + * @param {string} code The JavaScript code created for this block. + * @return {string} JavaScript code with comments and subsequent blocks added. + * @private + */ +Blockly.Generator.prototype.scrub_ = undefined; + +/** + * Hook for code to run at end of code generation. + * Subclasses may override this, e.g. to prepend the generated code with the + * variable definitions. + * @param {string} code Generated code. + * @return {string} Completed code. + */ +Blockly.Generator.prototype.finish = undefined; + +/** + * Naked values are top-level blocks with outputs that aren't plugged into + * anything. + * Subclasses may override this, e.g. if their language does not allow + * naked values. + * @param {string} line Line of generated code. + * @return {string} Legal line of code. + */ +Blockly.Generator.prototype.scrubNakedValue = undefined; diff --git a/src/opsoro/server/static/js/blockly/core/icon.js b/src/opsoro/server/static/js/blockly/core/icon.js new file mode 100644 index 0000000..539ce6f --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/icon.js @@ -0,0 +1,204 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2013 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Object representing an icon on a block. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Icon'); + +goog.require('goog.dom'); +goog.require('goog.math.Coordinate'); + + +/** + * Class for an icon. + * @param {Blockly.Block} block The block associated with this icon. + * @constructor + */ +Blockly.Icon = function(block) { + this.block_ = block; +}; + +/** + * Does this icon get hidden when the block is collapsed. + */ +Blockly.Icon.prototype.collapseHidden = true; + +/** + * Height and width of icons. + */ +Blockly.Icon.prototype.SIZE = 17; + +/** + * Bubble UI (if visible). + * @type {Blockly.Bubble} + * @private + */ +Blockly.Icon.prototype.bubble_ = null; + +/** + * Absolute coordinate of icon's center. + * @type {goog.math.Coordinate} + * @private + */ +Blockly.Icon.prototype.iconXY_ = null; + +/** + * Create the icon on the block. + */ +Blockly.Icon.prototype.createIcon = function() { + if (this.iconGroup_) { + // Icon already exists. + return; + } + /* Here's the markup that will be generated: + + ... + + */ + this.iconGroup_ = Blockly.utils.createSvgElement('g', + {'class': 'blocklyIconGroup'}, null); + if (this.block_.isInFlyout) { + Blockly.utils.addClass(/** @type {!Element} */ (this.iconGroup_), + 'blocklyIconGroupReadonly'); + } + this.drawIcon_(this.iconGroup_); + + this.block_.getSvgRoot().appendChild(this.iconGroup_); + Blockly.bindEventWithChecks_(this.iconGroup_, 'mouseup', this, + this.iconClick_); + this.updateEditable(); +}; + +/** + * Dispose of this icon. + */ +Blockly.Icon.prototype.dispose = function() { + // Dispose of and unlink the icon. + goog.dom.removeNode(this.iconGroup_); + this.iconGroup_ = null; + // Dispose of and unlink the bubble. + this.setVisible(false); + this.block_ = null; +}; + +/** + * Add or remove the UI indicating if this icon may be clicked or not. + */ +Blockly.Icon.prototype.updateEditable = function() { +}; + +/** + * Is the associated bubble visible? + * @return {boolean} True if the bubble is visible. + */ +Blockly.Icon.prototype.isVisible = function() { + return !!this.bubble_; +}; + +/** + * Clicking on the icon toggles if the bubble is visible. + * @param {!Event} e Mouse click event. + * @private + */ +Blockly.Icon.prototype.iconClick_ = function(e) { + if (this.block_.workspace.isDragging()) { + // Drag operation is concluding. Don't open the editor. + return; + } + if (!this.block_.isInFlyout && !Blockly.utils.isRightButton(e)) { + this.setVisible(!this.isVisible()); + } +}; + +/** + * Change the colour of the associated bubble to match its block. + */ +Blockly.Icon.prototype.updateColour = function() { + if (this.isVisible()) { + this.bubble_.setColour(this.block_.getColour()); + } +}; + +/** + * Render the icon. + * @param {number} cursorX Horizontal offset at which to position the icon. + * @return {number} Horizontal offset for next item to draw. + */ +Blockly.Icon.prototype.renderIcon = function(cursorX) { + if (this.collapseHidden && this.block_.isCollapsed()) { + this.iconGroup_.setAttribute('display', 'none'); + return cursorX; + } + this.iconGroup_.setAttribute('display', 'block'); + + var TOP_MARGIN = 5; + var width = this.SIZE; + if (this.block_.RTL) { + cursorX -= width; + } + this.iconGroup_.setAttribute('transform', + 'translate(' + cursorX + ',' + TOP_MARGIN + ')'); + this.computeIconLocation(); + if (this.block_.RTL) { + cursorX -= Blockly.BlockSvg.SEP_SPACE_X; + } else { + cursorX += width + Blockly.BlockSvg.SEP_SPACE_X; + } + return cursorX; +}; + +/** + * Notification that the icon has moved. Update the arrow accordingly. + * @param {!goog.math.Coordinate} xy Absolute location. + */ +Blockly.Icon.prototype.setIconLocation = function(xy) { + this.iconXY_ = xy; + if (this.isVisible()) { + this.bubble_.setAnchorLocation(xy); + } +}; + +/** + * Notification that the icon has moved, but we don't really know where. + * Recompute the icon's location from scratch. + */ +Blockly.Icon.prototype.computeIconLocation = function() { + // Find coordinates for the centre of the icon and update the arrow. + var blockXY = this.block_.getRelativeToSurfaceXY(); + var iconXY = Blockly.utils.getRelativeXY(this.iconGroup_); + var newXY = new goog.math.Coordinate( + blockXY.x + iconXY.x + this.SIZE / 2, + blockXY.y + iconXY.y + this.SIZE / 2); + if (!goog.math.Coordinate.equals(this.getIconLocation(), newXY)) { + this.setIconLocation(newXY); + } +}; + +/** + * Returns the center of the block's icon relative to the surface. + * @return {!goog.math.Coordinate} Object with x and y properties. + */ +Blockly.Icon.prototype.getIconLocation = function() { + return this.iconXY_; +}; diff --git a/src/opsoro/server/static/js/blockly/core/inject.js b/src/opsoro/server/static/js/blockly/core/inject.js new file mode 100644 index 0000000..54509db --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/inject.js @@ -0,0 +1,414 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2011 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Functions for injecting Blockly into a web page. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.inject'); + +goog.require('Blockly.BlockDragSurfaceSvg'); +goog.require('Blockly.Css'); +goog.require('Blockly.Options'); +goog.require('Blockly.WorkspaceSvg'); +goog.require('Blockly.WorkspaceDragSurfaceSvg'); +goog.require('goog.dom'); +goog.require('goog.ui.Component'); +goog.require('goog.userAgent'); + + +/** + * Inject a Blockly editor into the specified container element (usually a div). + * @param {!Element|string} container Containing element, or its ID, + * or a CSS selector. + * @param {Object=} opt_options Optional dictionary of options. + * @return {!Blockly.Workspace} Newly created main workspace. + */ +Blockly.inject = function(container, opt_options) { + if (goog.isString(container)) { + container = document.getElementById(container) || + document.querySelector(container); + } + // Verify that the container is in document. + if (!goog.dom.contains(document, container)) { + throw 'Error: container is not in current document.'; + } + var options = new Blockly.Options(opt_options || {}); + var subContainer = goog.dom.createDom('div', 'injectionDiv'); + container.appendChild(subContainer); + var svg = Blockly.createDom_(subContainer, options); + + // Create surfaces for dragging things. These are optimizations + // so that the broowser does not repaint during the drag. + var blockDragSurface = new Blockly.BlockDragSurfaceSvg(subContainer); + var workspaceDragSurface = new Blockly.workspaceDragSurfaceSvg(subContainer); + + var workspace = Blockly.createMainWorkspace_(svg, options, blockDragSurface, + workspaceDragSurface); + Blockly.init_(workspace); + Blockly.mainWorkspace = workspace; + + Blockly.svgResize(workspace); + return workspace; +}; + +/** + * Create the SVG image. + * @param {!Element} container Containing element. + * @param {!Blockly.Options} options Dictionary of options. + * @return {!Element} Newly created SVG image. + * @private + */ +Blockly.createDom_ = function(container, options) { + // Sadly browsers (Chrome vs Firefox) are currently inconsistent in laying + // out content in RTL mode. Therefore Blockly forces the use of LTR, + // then manually positions content in RTL as needed. + container.setAttribute('dir', 'LTR'); + // Closure can be trusted to create HTML widgets with the proper direction. + goog.ui.Component.setDefaultRightToLeft(options.RTL); + + // Load CSS. + Blockly.Css.inject(options.hasCss, options.pathToMedia); + + // Build the SVG DOM. + /* + + ... + + */ + var svg = Blockly.utils.createSvgElement('svg', { + 'xmlns': 'http://www.w3.org/2000/svg', + 'xmlns:html': 'http://www.w3.org/1999/xhtml', + 'xmlns:xlink': 'http://www.w3.org/1999/xlink', + 'version': '1.1', + 'class': 'blocklySvg' + }, container); + /* + + ... filters go here ... + + */ + var defs = Blockly.utils.createSvgElement('defs', {}, svg); + // Each filter/pattern needs a unique ID for the case of multiple Blockly + // instances on a page. Browser behaviour becomes undefined otherwise. + // https://neil.fraser.name/news/2015/11/01/ + var rnd = String(Math.random()).substring(2); + /* + + + + + + + + + */ + var embossFilter = Blockly.utils.createSvgElement('filter', + {'id': 'blocklyEmbossFilter' + rnd}, defs); + Blockly.utils.createSvgElement('feGaussianBlur', + {'in': 'SourceAlpha', 'stdDeviation': 1, 'result': 'blur'}, embossFilter); + var feSpecularLighting = Blockly.utils.createSvgElement('feSpecularLighting', + {'in': 'blur', 'surfaceScale': 1, 'specularConstant': 0.5, + 'specularExponent': 10, 'lighting-color': 'white', 'result': 'specOut'}, + embossFilter); + Blockly.utils.createSvgElement('fePointLight', + {'x': -5000, 'y': -10000, 'z': 20000}, feSpecularLighting); + Blockly.utils.createSvgElement('feComposite', + {'in': 'specOut', 'in2': 'SourceAlpha', 'operator': 'in', + 'result': 'specOut'}, embossFilter); + Blockly.utils.createSvgElement('feComposite', + {'in': 'SourceGraphic', 'in2': 'specOut', 'operator': 'arithmetic', + 'k1': 0, 'k2': 1, 'k3': 1, 'k4': 0}, embossFilter); + options.embossFilterId = embossFilter.id; + /* + + + + + */ + var disabledPattern = Blockly.utils.createSvgElement('pattern', + {'id': 'blocklyDisabledPattern' + rnd, + 'patternUnits': 'userSpaceOnUse', + 'width': 10, 'height': 10}, defs); + Blockly.utils.createSvgElement('rect', + {'width': 10, 'height': 10, 'fill': '#aaa'}, disabledPattern); + Blockly.utils.createSvgElement('path', + {'d': 'M 0 0 L 10 10 M 10 0 L 0 10', 'stroke': '#cc0'}, disabledPattern); + options.disabledPatternId = disabledPattern.id; + /* + + + + + */ + var gridPattern = Blockly.utils.createSvgElement('pattern', + {'id': 'blocklyGridPattern' + rnd, + 'patternUnits': 'userSpaceOnUse'}, defs); + if (options.gridOptions['length'] > 0 && options.gridOptions['spacing'] > 0) { + Blockly.utils.createSvgElement('line', + {'stroke': options.gridOptions['colour']}, + gridPattern); + if (options.gridOptions['length'] > 1) { + Blockly.utils.createSvgElement('line', + {'stroke': options.gridOptions['colour']}, + gridPattern); + } + // x1, y1, x1, x2 properties will be set later in updateGridPattern_. + } + options.gridPattern = gridPattern; + return svg; +}; + +/** + * Create a main workspace and add it to the SVG. + * @param {!Element} svg SVG element with pattern defined. + * @param {!Blockly.Options} options Dictionary of options. + * @param {!Blockly.BlockDragSurfaceSvg} blockDragSurface Drag surface SVG + * for the blocks. + * @param {!Blockly.WorkspaceDragSurfaceSvg} workspaceDragSurface Drag surface + * SVG for the workspace. + * @return {!Blockly.Workspace} Newly created main workspace. + * @private + */ +Blockly.createMainWorkspace_ = function(svg, options, blockDragSurface, workspaceDragSurface) { + options.parentWorkspace = null; + var mainWorkspace = new Blockly.WorkspaceSvg(options, blockDragSurface, workspaceDragSurface); + mainWorkspace.scale = options.zoomOptions.startScale; + svg.appendChild(mainWorkspace.createDom('blocklyMainBackground')); + + if (!options.hasCategories && options.languageTree) { + // Add flyout as an that is a sibling of the workspace svg. + var flyout = mainWorkspace.addFlyout_('svg'); + Blockly.utils.insertAfter_(flyout, svg); + } + + // A null translation will also apply the correct initial scale. + mainWorkspace.translate(0, 0); + Blockly.mainWorkspace = mainWorkspace; + + if (!options.readOnly && !options.hasScrollbars) { + var workspaceChanged = function() { + if (Blockly.dragMode_ == Blockly.DRAG_NONE) { + var metrics = mainWorkspace.getMetrics(); + var edgeLeft = metrics.viewLeft + metrics.absoluteLeft; + var edgeTop = metrics.viewTop + metrics.absoluteTop; + if (metrics.contentTop < edgeTop || + metrics.contentTop + metrics.contentHeight > + metrics.viewHeight + edgeTop || + metrics.contentLeft < + (options.RTL ? metrics.viewLeft : edgeLeft) || + metrics.contentLeft + metrics.contentWidth > (options.RTL ? + metrics.viewWidth : metrics.viewWidth + edgeLeft)) { + // One or more blocks may be out of bounds. Bump them back in. + var MARGIN = 25; + var blocks = mainWorkspace.getTopBlocks(false); + for (var b = 0, block; block = blocks[b]; b++) { + var blockXY = block.getRelativeToSurfaceXY(); + var blockHW = block.getHeightWidth(); + // Bump any block that's above the top back inside. + var overflowTop = edgeTop + MARGIN - blockHW.height - blockXY.y; + if (overflowTop > 0) { + block.moveBy(0, overflowTop); + } + // Bump any block that's below the bottom back inside. + var overflowBottom = + edgeTop + metrics.viewHeight - MARGIN - blockXY.y; + if (overflowBottom < 0) { + block.moveBy(0, overflowBottom); + } + // Bump any block that's off the left back inside. + var overflowLeft = MARGIN + edgeLeft - + blockXY.x - (options.RTL ? 0 : blockHW.width); + if (overflowLeft > 0) { + block.moveBy(overflowLeft, 0); + } + // Bump any block that's off the right back inside. + var overflowRight = edgeLeft + metrics.viewWidth - MARGIN - + blockXY.x + (options.RTL ? blockHW.width : 0); + if (overflowRight < 0) { + block.moveBy(overflowRight, 0); + } + } + } + } + }; + mainWorkspace.addChangeListener(workspaceChanged); + } + // The SVG is now fully assembled. + Blockly.svgResize(mainWorkspace); + Blockly.WidgetDiv.createDom(); + Blockly.Tooltip.createDom(); + return mainWorkspace; +}; + +/** + * Initialize Blockly with various handlers. + * @param {!Blockly.Workspace} mainWorkspace Newly created main workspace. + * @private + */ +Blockly.init_ = function(mainWorkspace) { + var options = mainWorkspace.options; + var svg = mainWorkspace.getParentSvg(); + + // Suppress the browser's context menu. + Blockly.bindEventWithChecks_(svg, 'contextmenu', null, + function(e) { + if (!Blockly.utils.isTargetInput(e)) { + e.preventDefault(); + } + }); + + var workspaceResizeHandler = Blockly.bindEventWithChecks_(window, 'resize', + null, + function() { + Blockly.hideChaff(true); + Blockly.svgResize(mainWorkspace); + }); + mainWorkspace.setResizeHandlerWrapper(workspaceResizeHandler); + + Blockly.inject.bindDocumentEvents_(); + + if (options.languageTree) { + if (mainWorkspace.toolbox_) { + mainWorkspace.toolbox_.init(mainWorkspace); + } else if (mainWorkspace.flyout_) { + // Build a fixed flyout with the root blocks. + mainWorkspace.flyout_.init(mainWorkspace); + mainWorkspace.flyout_.show(options.languageTree.childNodes); + mainWorkspace.flyout_.scrollToStart(); + // Translate the workspace sideways to avoid the fixed flyout. + mainWorkspace.scrollX = mainWorkspace.flyout_.width_; + if (options.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { + mainWorkspace.scrollX *= -1; + } + mainWorkspace.translate(mainWorkspace.scrollX, 0); + } + } + + if (options.hasScrollbars) { + mainWorkspace.scrollbar = new Blockly.ScrollbarPair(mainWorkspace); + mainWorkspace.scrollbar.resize(); + } + + // Load the sounds. + if (options.hasSounds) { + Blockly.inject.loadSounds_(options.pathToMedia, mainWorkspace); + } +}; + +/** + * Bind document events, but only once. Destroying and reinjecting Blockly + * should not bind again. + * Bind events for scrolling the workspace. + * Most of these events should be bound to the SVG's surface. + * However, 'mouseup' has to be on the whole document so that a block dragged + * out of bounds and released will know that it has been released. + * Also, 'keydown' has to be on the whole document since the browser doesn't + * understand a concept of focus on the SVG image. + * @private + */ +Blockly.inject.bindDocumentEvents_ = function() { + if (!Blockly.documentEventsBound_) { + Blockly.bindEventWithChecks_(document, 'keydown', null, Blockly.onKeyDown_); + // longStop needs to run to stop the context menu from showing up. It + // should run regardless of what other touch event handlers have run. + Blockly.bindEvent_(document, 'touchend', null, Blockly.longStop_); + Blockly.bindEvent_(document, 'touchcancel', null, Blockly.longStop_); + // Don't use bindEvent_ for document's mouseup since that would create a + // corresponding touch handler that would squelch the ability to interact + // with non-Blockly elements. + document.addEventListener('mouseup', Blockly.onMouseUp_, false); + // Some iPad versions don't fire resize after portrait to landscape change. + if (goog.userAgent.IPAD) { + Blockly.bindEventWithChecks_(window, 'orientationchange', document, + function() { + // TODO(#397): Fix for multiple blockly workspaces. + Blockly.svgResize(Blockly.getMainWorkspace()); + }); + } + } + Blockly.documentEventsBound_ = true; +}; + +/** + * Load sounds for the given workspace. + * @param {string} pathToMedia The path to the media directory. + * @param {!Blockly.Workspace} workspace The workspace to load sounds for. + * @private + */ +Blockly.inject.loadSounds_ = function(pathToMedia, workspace) { + workspace.loadAudio_( + [pathToMedia + 'click.mp3', + pathToMedia + 'click.wav', + pathToMedia + 'click.ogg'], 'click'); + workspace.loadAudio_( + [pathToMedia + 'disconnect.wav', + pathToMedia + 'disconnect.mp3', + pathToMedia + 'disconnect.ogg'], 'disconnect'); + workspace.loadAudio_( + [pathToMedia + 'delete.mp3', + pathToMedia + 'delete.ogg', + pathToMedia + 'delete.wav'], 'delete'); + + // Bind temporary hooks that preload the sounds. + var soundBinds = []; + var unbindSounds = function() { + while (soundBinds.length) { + Blockly.unbindEvent_(soundBinds.pop()); + } + workspace.preloadAudio_(); + }; + + // These are bound on mouse/touch events with Blockly.bindEventWithChecks_, so + // they restrict the touch identifier that will be recognized. But this is + // really something that happens on a click, not a drag, so that's not + // necessary. + + // Android ignores any sound not loaded as a result of a user action. + soundBinds.push( + Blockly.bindEventWithChecks_(document, 'mousemove', null, unbindSounds, + true)); + soundBinds.push( + Blockly.bindEventWithChecks_(document, 'touchstart', null, unbindSounds, + true)); +}; + +/** + * Modify the block tree on the existing toolbox. + * @param {Node|string} tree DOM tree of blocks, or text representation of same. + * @deprecated April 2015 + */ +Blockly.updateToolbox = function(tree) { + console.warn('Deprecated call to Blockly.updateToolbox, ' + + 'use workspace.updateToolbox instead.'); + Blockly.getMainWorkspace().updateToolbox(tree); +}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/input.js b/src/opsoro/server/static/js/blockly/core/input.js similarity index 85% rename from src/opsoro/apps/visual_programming/static/blockly/core/input.js rename to src/opsoro/server/static/js/blockly/core/input.js index b924337..c5a4a8f 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/core/input.js +++ b/src/opsoro/server/static/js/blockly/core/input.js @@ -26,8 +26,6 @@ goog.provide('Blockly.Input'); -// TODO(scr): Fix circular dependencies -// goog.require('Blockly.Block'); goog.require('Blockly.Connection'); goog.require('Blockly.FieldLabel'); goog.require('goog.asserts'); @@ -47,7 +45,10 @@ Blockly.Input = function(type, name, block, connection) { this.type = type; /** @type {string} */ this.name = name; - /** @type {!Blockly.Block} */ + /** + * @type {!Blockly.Block} + * @private + */ this.sourceBlock_ = block; /** @type {Blockly.Connection} */ this.connection = connection; @@ -69,13 +70,32 @@ Blockly.Input.prototype.align = Blockly.ALIGN_LEFT; Blockly.Input.prototype.visible_ = true; /** - * Add an item to the end of the input's field row. + * Add a field (or label from string), and all prefix and suffix fields, to the + * end of the input's field row. * @param {string|!Blockly.Field} field Something to add as a field. * @param {string=} opt_name Language-neutral identifier which may used to find * this field again. Should be unique to the host block. * @return {!Blockly.Input} The input being append to (to allow chaining). */ Blockly.Input.prototype.appendField = function(field, opt_name) { + this.insertFieldAt(this.fieldRow.length, field, opt_name); + return this; +}; + +/** + * Inserts a field (or label from string), and all prefix and suffix fields, at + * the location of the input's field row. + * @param {number} index The index at which to insert field. + * @param {string|!Blockly.Field} field Something to add as a field. + * @param {string=} opt_name Language-neutral identifier which may used to find + * this field again. Should be unique to the host block. + * @return {number} The index following the last inserted field. + */ +Blockly.Input.prototype.insertFieldAt = function(index, field, opt_name) { + if (index < 0 || index > this.fieldRow.length) { + throw new Error('index ' + index + ' out of bounds.'); + } + // Empty string, Null or undefined generates no field, unless field is named. if (!field && !opt_name) { return this; @@ -84,20 +104,22 @@ Blockly.Input.prototype.appendField = function(field, opt_name) { if (goog.isString(field)) { field = new Blockly.FieldLabel(/** @type {string} */ (field)); } + field.setSourceBlock(this.sourceBlock_); if (this.sourceBlock_.rendered) { - field.init(this.sourceBlock_); + field.init(); } field.name = opt_name; if (field.prefixField) { // Add any prefix. - this.appendField(field.prefixField); + index = this.insertFieldAt(index, field.prefixField); } // Add the field to the field row. - this.fieldRow.push(field); + this.fieldRow.splice(index, 0, field); + ++index; if (field.suffixField) { // Add any suffix. - this.appendField(field.suffixField); + index = this.insertFieldAt(index, field.suffixField); } if (this.sourceBlock_.rendered) { @@ -105,20 +127,7 @@ Blockly.Input.prototype.appendField = function(field, opt_name) { // Adding a field will cause the block to change shape. this.sourceBlock_.bumpNeighbours_(); } - return this; -}; - -/** - * Add an item to the end of the input's field row. - * @param {*} field Something to add as a field. - * @param {string=} opt_name Language-neutral identifier which may used to find - * this field again. Should be unique to the host block. - * @return {!Blockly.Input} The input being append to (to allow chaining). - * @deprecated December 2013 - */ -Blockly.Input.prototype.appendTitle = function(field, opt_name) { - console.warn('Deprecated call to appendTitle, use appendField instead.'); - return this.appendField(field, opt_name); + return index; }; /** @@ -220,8 +229,8 @@ Blockly.Input.prototype.init = function() { if (!this.sourceBlock_.workspace.rendered) { return; // Headless blocks don't need fields initialized. } - for (var x = 0; x < this.fieldRow.length; x++) { - this.fieldRow[x].init(this.sourceBlock_); + for (var i = 0; i < this.fieldRow.length; i++) { + this.fieldRow[i].init(); } }; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/msg.js b/src/opsoro/server/static/js/blockly/core/msg.js similarity index 96% rename from src/opsoro/apps/visual_programming/static/blockly/core/msg.js rename to src/opsoro/server/static/js/blockly/core/msg.js index 7bea1f6..4ebcad1 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/core/msg.js +++ b/src/opsoro/server/static/js/blockly/core/msg.js @@ -19,7 +19,7 @@ */ /** - * @fileoverview Core JavaScript library for Blockly. + * @fileoverview Empty name space for the Message singleton. * @author scr@google.com (Sheridan Rawlins) */ 'use strict'; diff --git a/src/opsoro/server/static/js/blockly/core/mutator.js b/src/opsoro/server/static/js/blockly/core/mutator.js new file mode 100644 index 0000000..641273e --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/mutator.js @@ -0,0 +1,397 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Object representing a mutator dialog. A mutator allows the + * user to change the shape of a block using a nested blocks editor. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Mutator'); + +goog.require('Blockly.Bubble'); +goog.require('Blockly.Icon'); +goog.require('Blockly.WorkspaceSvg'); +goog.require('goog.Timer'); +goog.require('goog.dom'); + + +/** + * Class for a mutator dialog. + * @param {!Array.} quarkNames List of names of sub-blocks for flyout. + * @extends {Blockly.Icon} + * @constructor + */ +Blockly.Mutator = function(quarkNames) { + Blockly.Mutator.superClass_.constructor.call(this, null); + this.quarkNames_ = quarkNames; +}; +goog.inherits(Blockly.Mutator, Blockly.Icon); + +/** + * Width of workspace. + * @private + */ +Blockly.Mutator.prototype.workspaceWidth_ = 0; + +/** + * Height of workspace. + * @private + */ +Blockly.Mutator.prototype.workspaceHeight_ = 0; + +/** + * Draw the mutator icon. + * @param {!Element} group The icon group. + * @private + */ +Blockly.Mutator.prototype.drawIcon_ = function(group) { + // Square with rounded corners. + Blockly.utils.createSvgElement('rect', + {'class': 'blocklyIconShape', + 'rx': '4', 'ry': '4', + 'height': '16', 'width': '16'}, + group); + // Gear teeth. + Blockly.utils.createSvgElement('path', + {'class': 'blocklyIconSymbol', + 'd': 'm4.203,7.296 0,1.368 -0.92,0.677 -0.11,0.41 0.9,1.559 0.41,0.11 1.043,-0.457 1.187,0.683 0.127,1.134 0.3,0.3 1.8,0 0.3,-0.299 0.127,-1.138 1.185,-0.682 1.046,0.458 0.409,-0.11 0.9,-1.559 -0.11,-0.41 -0.92,-0.677 0,-1.366 0.92,-0.677 0.11,-0.41 -0.9,-1.559 -0.409,-0.109 -1.046,0.458 -1.185,-0.682 -0.127,-1.138 -0.3,-0.299 -1.8,0 -0.3,0.3 -0.126,1.135 -1.187,0.682 -1.043,-0.457 -0.41,0.11 -0.899,1.559 0.108,0.409z'}, + group); + // Axle hole. + Blockly.utils.createSvgElement('circle', + {'class': 'blocklyIconShape', 'r': '2.7', 'cx': '8', 'cy': '8'}, + group); +}; + +/** + * Clicking on the icon toggles if the mutator bubble is visible. + * Disable if block is uneditable. + * @param {!Event} e Mouse click event. + * @private + * @override + */ +Blockly.Mutator.prototype.iconClick_ = function(e) { + if (this.block_.isEditable()) { + Blockly.Icon.prototype.iconClick_.call(this, e); + } +}; + +/** + * Create the editor for the mutator's bubble. + * @return {!Element} The top-level node of the editor. + * @private + */ +Blockly.Mutator.prototype.createEditor_ = function() { + /* Create the editor. Here's the markup that will be generated: + + [Workspace] + + */ + this.svgDialog_ = Blockly.utils.createSvgElement('svg', + {'x': Blockly.Bubble.BORDER_WIDTH, 'y': Blockly.Bubble.BORDER_WIDTH}, + null); + // Convert the list of names into a list of XML objects for the flyout. + if (this.quarkNames_.length) { + var quarkXml = goog.dom.createDom('xml'); + for (var i = 0, quarkName; quarkName = this.quarkNames_[i]; i++) { + quarkXml.appendChild(goog.dom.createDom('block', {'type': quarkName})); + } + } else { + var quarkXml = null; + } + var workspaceOptions = { + languageTree: quarkXml, + parentWorkspace: this.block_.workspace, + pathToMedia: this.block_.workspace.options.pathToMedia, + RTL: this.block_.RTL, + toolboxPosition: this.block_.RTL ? Blockly.TOOLBOX_AT_RIGHT : + Blockly.TOOLBOX_AT_LEFT, + horizontalLayout: false, + getMetrics: this.getFlyoutMetrics_.bind(this), + setMetrics: null + }; + this.workspace_ = new Blockly.WorkspaceSvg(workspaceOptions); + this.workspace_.isMutator = true; + + // Mutator flyouts go inside the mutator workspace's rather than in + // a top level svg. Instead of handling scale themselves, mutators + // inherit scale from the parent workspace. + // To fix this, scale needs to be applied at a different level in the dom. + var flyoutSvg = this.workspace_.addFlyout_('g'); + var background = this.workspace_.createDom('blocklyMutatorBackground'); + background.appendChild(flyoutSvg); + this.svgDialog_.appendChild(background); + + return this.svgDialog_; +}; + +/** + * Add or remove the UI indicating if this icon may be clicked or not. + */ +Blockly.Mutator.prototype.updateEditable = function() { + if (!this.block_.isInFlyout) { + if (this.block_.isEditable()) { + if (this.iconGroup_) { + Blockly.utils.removeClass(/** @type {!Element} */ (this.iconGroup_), + 'blocklyIconGroupReadonly'); + } + } else { + // Close any mutator bubble. Icon is not clickable. + this.setVisible(false); + if (this.iconGroup_) { + Blockly.utils.addClass(/** @type {!Element} */ (this.iconGroup_), + 'blocklyIconGroupReadonly'); + } + } + } + // Default behaviour for an icon. + Blockly.Icon.prototype.updateEditable.call(this); +}; + +/** + * Callback function triggered when the bubble has resized. + * Resize the workspace accordingly. + * @private + */ +Blockly.Mutator.prototype.resizeBubble_ = function() { + var doubleBorderWidth = 2 * Blockly.Bubble.BORDER_WIDTH; + var workspaceSize = this.workspace_.getCanvas().getBBox(); + var width; + if (this.block_.RTL) { + width = -workspaceSize.x; + } else { + width = workspaceSize.width + workspaceSize.x; + } + var height = workspaceSize.height + doubleBorderWidth * 3; + if (this.workspace_.flyout_) { + var flyoutMetrics = this.workspace_.flyout_.getMetrics_(); + height = Math.max(height, flyoutMetrics.contentHeight + 20); + } + width += doubleBorderWidth * 3; + // Only resize if the size difference is significant. Eliminates shuddering. + if (Math.abs(this.workspaceWidth_ - width) > doubleBorderWidth || + Math.abs(this.workspaceHeight_ - height) > doubleBorderWidth) { + // Record some layout information for getFlyoutMetrics_. + this.workspaceWidth_ = width; + this.workspaceHeight_ = height; + // Resize the bubble. + this.bubble_.setBubbleSize(width + doubleBorderWidth, + height + doubleBorderWidth); + this.svgDialog_.setAttribute('width', this.workspaceWidth_); + this.svgDialog_.setAttribute('height', this.workspaceHeight_); + } + + if (this.block_.RTL) { + // Scroll the workspace to always left-align. + var translation = 'translate(' + this.workspaceWidth_ + ',0)'; + this.workspace_.getCanvas().setAttribute('transform', translation); + } + this.workspace_.resize(); +}; + +/** + * Show or hide the mutator bubble. + * @param {boolean} visible True if the bubble should be visible. + */ +Blockly.Mutator.prototype.setVisible = function(visible) { + if (visible == this.isVisible()) { + // No change. + return; + } + Blockly.Events.fire( + new Blockly.Events.Ui(this.block_, 'mutatorOpen', !visible, visible)); + if (visible) { + // Create the bubble. + this.bubble_ = new Blockly.Bubble( + /** @type {!Blockly.WorkspaceSvg} */ (this.block_.workspace), + this.createEditor_(), this.block_.svgPath_, this.iconXY_, null, null); + var tree = this.workspace_.options.languageTree; + if (tree) { + this.workspace_.flyout_.init(this.workspace_); + this.workspace_.flyout_.show(tree.childNodes); + } + + this.rootBlock_ = this.block_.decompose(this.workspace_); + var blocks = this.rootBlock_.getDescendants(); + for (var i = 0, child; child = blocks[i]; i++) { + child.render(); + } + // The root block should not be dragable or deletable. + this.rootBlock_.setMovable(false); + this.rootBlock_.setDeletable(false); + if (this.workspace_.flyout_) { + var margin = this.workspace_.flyout_.CORNER_RADIUS * 2; + var x = this.workspace_.flyout_.width_ + margin; + } else { + var margin = 16; + var x = margin; + } + if (this.block_.RTL) { + x = -x; + } + this.rootBlock_.moveBy(x, margin); + // Save the initial connections, then listen for further changes. + if (this.block_.saveConnections) { + var thisMutator = this; + this.block_.saveConnections(this.rootBlock_); + this.sourceListener_ = function() { + thisMutator.block_.saveConnections(thisMutator.rootBlock_); + }; + this.block_.workspace.addChangeListener(this.sourceListener_); + } + this.resizeBubble_(); + // When the mutator's workspace changes, update the source block. + this.workspace_.addChangeListener(this.workspaceChanged_.bind(this)); + this.updateColour(); + } else { + // Dispose of the bubble. + this.svgDialog_ = null; + this.workspace_.dispose(); + this.workspace_ = null; + this.rootBlock_ = null; + this.bubble_.dispose(); + this.bubble_ = null; + this.workspaceWidth_ = 0; + this.workspaceHeight_ = 0; + if (this.sourceListener_) { + this.block_.workspace.removeChangeListener(this.sourceListener_); + this.sourceListener_ = null; + } + } +}; + +/** + * Update the source block when the mutator's blocks are changed. + * Bump down any block that's too high. + * Fired whenever a change is made to the mutator's workspace. + * @private + */ +Blockly.Mutator.prototype.workspaceChanged_ = function() { + if (Blockly.dragMode_ == Blockly.DRAG_NONE) { + var blocks = this.workspace_.getTopBlocks(false); + var MARGIN = 20; + for (var b = 0, block; block = blocks[b]; b++) { + var blockXY = block.getRelativeToSurfaceXY(); + var blockHW = block.getHeightWidth(); + if (blockXY.y + blockHW.height < MARGIN) { + // Bump any block that's above the top back inside. + block.moveBy(0, MARGIN - blockHW.height - blockXY.y); + } + } + } + + // When the mutator's workspace changes, update the source block. + if (this.rootBlock_.workspace == this.workspace_) { + Blockly.Events.setGroup(true); + var block = this.block_; + var oldMutationDom = block.mutationToDom(); + var oldMutation = oldMutationDom && Blockly.Xml.domToText(oldMutationDom); + // Switch off rendering while the source block is rebuilt. + var savedRendered = block.rendered; + block.rendered = false; + // Allow the source block to rebuild itself. + block.compose(this.rootBlock_); + // Restore rendering and show the changes. + block.rendered = savedRendered; + // Mutation may have added some elements that need initializing. + block.initSvg(); + var newMutationDom = block.mutationToDom(); + var newMutation = newMutationDom && Blockly.Xml.domToText(newMutationDom); + if (oldMutation != newMutation) { + Blockly.Events.fire(new Blockly.Events.Change( + block, 'mutation', null, oldMutation, newMutation)); + // Ensure that any bump is part of this mutation's event group. + var group = Blockly.Events.getGroup(); + setTimeout(function() { + Blockly.Events.setGroup(group); + block.bumpNeighbours_(); + Blockly.Events.setGroup(false); + }, Blockly.BUMP_DELAY); + } + if (block.rendered) { + block.render(); + } + this.resizeBubble_(); + Blockly.Events.setGroup(false); + } +}; + +/** + * Return an object with all the metrics required to size scrollbars for the + * mutator flyout. The following properties are computed: + * .viewHeight: Height of the visible rectangle, + * .viewWidth: Width of the visible rectangle, + * .absoluteTop: Top-edge of view. + * .absoluteLeft: Left-edge of view. + * @return {!Object} Contains size and position metrics of mutator dialog's + * workspace. + * @private + */ +Blockly.Mutator.prototype.getFlyoutMetrics_ = function() { + return { + viewHeight: this.workspaceHeight_, + viewWidth: this.workspaceWidth_, + absoluteTop: 0, + absoluteLeft: 0 + }; +}; + +/** + * Dispose of this mutator. + */ +Blockly.Mutator.prototype.dispose = function() { + this.block_.mutator = null; + Blockly.Icon.prototype.dispose.call(this); +}; + +/** + * Reconnect an block to a mutated input. + * @param {Blockly.Connection} connectionChild Connection on child block. + * @param {!Blockly.Block} block Parent block. + * @param {string} inputName Name of input on parent block. + * @return {boolean} True iff a reconnection was made, false otherwise. + */ +Blockly.Mutator.reconnect = function(connectionChild, block, inputName) { + if (!connectionChild || !connectionChild.getSourceBlock().workspace) { + return false; // No connection or block has been deleted. + } + var connectionParent = block.getInput(inputName).connection; + var currentParent = connectionChild.targetBlock(); + if ((!currentParent || currentParent == block) && + connectionParent.targetConnection != connectionChild) { + if (connectionParent.isConnected()) { + // There's already something connected here. Get rid of it. + connectionParent.disconnect(); + } + connectionParent.connect(connectionChild); + return true; + } + return false; +}; + +// Export symbols that would otherwise be renamed by Closure compiler. +if (!goog.global['Blockly']) { + goog.global['Blockly'] = {}; +} +if (!goog.global['Blockly']['Mutator']) { + goog.global['Blockly']['Mutator'] = {}; +} +goog.global['Blockly']['Mutator']['reconnect'] = Blockly.Mutator.reconnect; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/names.js b/src/opsoro/server/static/js/blockly/core/names.js similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/core/names.js rename to src/opsoro/server/static/js/blockly/core/names.js diff --git a/src/opsoro/server/static/js/blockly/core/options.js b/src/opsoro/server/static/js/blockly/core/options.js new file mode 100644 index 0000000..f9ab040 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/options.js @@ -0,0 +1,237 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Object that controls settings for the workspace. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.Options'); + + +/** + * Parse the user-specified options, using reasonable defaults where behaviour + * is unspecified. + * @param {!Object} options Dictionary of options. Specification: + * https://developers.google.com/blockly/guides/get-started/web#configuration + * @constructor + */ +Blockly.Options = function(options) { + var readOnly = !!options['readOnly']; + if (readOnly) { + var languageTree = null; + var hasCategories = false; + var hasTrashcan = false; + var hasCollapse = false; + var hasComments = false; + var hasDisable = false; + var hasSounds = false; + } else { + var languageTree = Blockly.Options.parseToolboxTree(options['toolbox']); + var hasCategories = Boolean(languageTree && + languageTree.getElementsByTagName('category').length); + var hasTrashcan = options['trashcan']; + if (hasTrashcan === undefined) { + hasTrashcan = hasCategories; + } + var hasCollapse = options['collapse']; + if (hasCollapse === undefined) { + hasCollapse = hasCategories; + } + var hasComments = options['comments']; + if (hasComments === undefined) { + hasComments = hasCategories; + } + var hasDisable = options['disable']; + if (hasDisable === undefined) { + hasDisable = hasCategories; + } + var hasSounds = options['sounds']; + if (hasSounds === undefined) { + hasSounds = true; + } + } + var rtl = !!options['rtl']; + var horizontalLayout = options['horizontalLayout']; + if (horizontalLayout === undefined) { + horizontalLayout = false; + } + var toolboxAtStart = options['toolboxPosition']; + if (toolboxAtStart === 'end') { + toolboxAtStart = false; + } else { + toolboxAtStart = true; + } + + if (horizontalLayout) { + var toolboxPosition = toolboxAtStart ? + Blockly.TOOLBOX_AT_TOP : Blockly.TOOLBOX_AT_BOTTOM; + } else { + var toolboxPosition = (toolboxAtStart == rtl) ? + Blockly.TOOLBOX_AT_RIGHT : Blockly.TOOLBOX_AT_LEFT; + } + + var hasScrollbars = options['scrollbars']; + if (hasScrollbars === undefined) { + hasScrollbars = hasCategories; + } + var hasCss = options['css']; + if (hasCss === undefined) { + hasCss = true; + } + var pathToMedia = 'https://blockly-demo.appspot.com/static/media/'; + if (options['media']) { + pathToMedia = options['media']; + } else if (options['path']) { + // 'path' is a deprecated option which has been replaced by 'media'. + pathToMedia = options['path'] + 'media/'; + } + if (options['oneBasedIndex'] === undefined) { + var oneBasedIndex = true; + } else { + var oneBasedIndex = !!options['oneBasedIndex']; + } + + this.RTL = rtl; + this.oneBasedIndex = oneBasedIndex; + this.collapse = hasCollapse; + this.comments = hasComments; + this.disable = hasDisable; + this.readOnly = readOnly; + this.maxBlocks = options['maxBlocks'] || Infinity; + this.pathToMedia = pathToMedia; + this.hasCategories = hasCategories; + this.hasScrollbars = hasScrollbars; + this.hasTrashcan = hasTrashcan; + this.hasSounds = hasSounds; + this.hasCss = hasCss; + this.horizontalLayout = horizontalLayout; + this.languageTree = languageTree; + this.gridOptions = Blockly.Options.parseGridOptions_(options); + this.zoomOptions = Blockly.Options.parseZoomOptions_(options); + this.toolboxPosition = toolboxPosition; +}; + +/** + * The parent of the current workspace, or null if there is no parent workspace. + * @type {Blockly.Workspace} + **/ +Blockly.Options.prototype.parentWorkspace = null; + +/** + * If set, sets the translation of the workspace to match the scrollbars. + */ +Blockly.Options.prototype.setMetrics = null; + +/** + * Return an object with the metrics required to size the workspace. + * @return {Object} Contains size and position metrics, or null. + */ +Blockly.Options.prototype.getMetrics = null; + +/** + * Parse the user-specified zoom options, using reasonable defaults where + * behaviour is unspecified. See zoom documentation: + * https://developers.google.com/blockly/guides/configure/web/zoom + * @param {!Object} options Dictionary of options. + * @return {!Object} A dictionary of normalized options. + * @private + */ +Blockly.Options.parseZoomOptions_ = function(options) { + var zoom = options['zoom'] || {}; + var zoomOptions = {}; + if (zoom['controls'] === undefined) { + zoomOptions.controls = false; + } else { + zoomOptions.controls = !!zoom['controls']; + } + if (zoom['wheel'] === undefined) { + zoomOptions.wheel = false; + } else { + zoomOptions.wheel = !!zoom['wheel']; + } + if (zoom['startScale'] === undefined) { + zoomOptions.startScale = 1; + } else { + zoomOptions.startScale = parseFloat(zoom['startScale']); + } + if (zoom['maxScale'] === undefined) { + zoomOptions.maxScale = 3; + } else { + zoomOptions.maxScale = parseFloat(zoom['maxScale']); + } + if (zoom['minScale'] === undefined) { + zoomOptions.minScale = 0.3; + } else { + zoomOptions.minScale = parseFloat(zoom['minScale']); + } + if (zoom['scaleSpeed'] === undefined) { + zoomOptions.scaleSpeed = 1.2; + } else { + zoomOptions.scaleSpeed = parseFloat(zoom['scaleSpeed']); + } + return zoomOptions; +}; + +/** + * Parse the user-specified grid options, using reasonable defaults where + * behaviour is unspecified. See grid documentation: + * https://developers.google.com/blockly/guides/configure/web/grid + * @param {!Object} options Dictionary of options. + * @return {!Object} A dictionary of normalized options. + * @private + */ +Blockly.Options.parseGridOptions_ = function(options) { + var grid = options['grid'] || {}; + var gridOptions = {}; + gridOptions.spacing = parseFloat(grid['spacing']) || 0; + gridOptions.colour = grid['colour'] || '#888'; + gridOptions.length = parseFloat(grid['length']) || 1; + gridOptions.snap = gridOptions.spacing > 0 && !!grid['snap']; + return gridOptions; +}; + +/** + * Parse the provided toolbox tree into a consistent DOM format. + * @param {Node|string} tree DOM tree of blocks, or text representation of same. + * @return {Node} DOM tree of blocks, or null. + */ +Blockly.Options.parseToolboxTree = function(tree) { + if (tree) { + if (typeof tree != 'string') { + if (typeof XSLTProcessor == 'undefined' && tree.outerHTML) { + // In this case the tree will not have been properly built by the + // browser. The HTML will be contained in the element, but it will + // not have the proper DOM structure since the browser doesn't support + // XSLTProcessor (XML -> HTML). This is the case in IE 9+. + tree = tree.outerHTML; + } else if (!(tree instanceof Element)) { + tree = null; + } + } + if (typeof tree == 'string') { + tree = Blockly.Xml.textToDom(tree); + } + } else { + tree = null; + } + return tree; +}; diff --git a/src/opsoro/server/static/js/blockly/core/procedures.js b/src/opsoro/server/static/js/blockly/core/procedures.js new file mode 100644 index 0000000..aa8f1fa --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/procedures.js @@ -0,0 +1,299 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Utility functions for handling procedures. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +/** + * @name Blockly.Procedures + * @namespace + **/ +goog.provide('Blockly.Procedures'); + +goog.require('Blockly.Blocks'); +goog.require('Blockly.constants'); +goog.require('Blockly.Field'); +goog.require('Blockly.Names'); +goog.require('Blockly.Workspace'); + + +/** + * Find all user-created procedure definitions in a workspace. + * @param {!Blockly.Workspace} root Root workspace. + * @return {!Array.>} Pair of arrays, the + * first contains procedures without return variables, the second with. + * Each procedure is defined by a three-element list of name, parameter + * list, and return value boolean. + */ +Blockly.Procedures.allProcedures = function(root) { + var blocks = root.getAllBlocks(); + var proceduresReturn = []; + var proceduresNoReturn = []; + for (var i = 0; i < blocks.length; i++) { + if (blocks[i].getProcedureDef) { + var tuple = blocks[i].getProcedureDef(); + if (tuple) { + if (tuple[2]) { + proceduresReturn.push(tuple); + } else { + proceduresNoReturn.push(tuple); + } + } + } + } + proceduresNoReturn.sort(Blockly.Procedures.procTupleComparator_); + proceduresReturn.sort(Blockly.Procedures.procTupleComparator_); + return [proceduresNoReturn, proceduresReturn]; +}; + +/** + * Comparison function for case-insensitive sorting of the first element of + * a tuple. + * @param {!Array} ta First tuple. + * @param {!Array} tb Second tuple. + * @return {number} -1, 0, or 1 to signify greater than, equality, or less than. + * @private + */ +Blockly.Procedures.procTupleComparator_ = function(ta, tb) { + return ta[0].toLowerCase().localeCompare(tb[0].toLowerCase()); +}; + +/** + * Ensure two identically-named procedures don't exist. + * @param {string} name Proposed procedure name. + * @param {!Blockly.Block} block Block to disambiguate. + * @return {string} Non-colliding name. + */ +Blockly.Procedures.findLegalName = function(name, block) { + if (block.isInFlyout) { + // Flyouts can have multiple procedures called 'do something'. + return name; + } + while (!Blockly.Procedures.isLegalName_(name, block.workspace, block)) { + // Collision with another procedure. + var r = name.match(/^(.*?)(\d+)$/); + if (!r) { + name += '2'; + } else { + name = r[1] + (parseInt(r[2], 10) + 1); + } + } + return name; +}; + +/** + * Does this procedure have a legal name? Illegal names include names of + * procedures already defined. + * @param {string} name The questionable name. + * @param {!Blockly.Workspace} workspace The workspace to scan for collisions. + * @param {Blockly.Block=} opt_exclude Optional block to exclude from + * comparisons (one doesn't want to collide with oneself). + * @return {boolean} True if the name is legal. + * @private + */ +Blockly.Procedures.isLegalName_ = function(name, workspace, opt_exclude) { + var blocks = workspace.getAllBlocks(); + // Iterate through every block and check the name. + for (var i = 0; i < blocks.length; i++) { + if (blocks[i] == opt_exclude) { + continue; + } + if (blocks[i].getProcedureDef) { + var procName = blocks[i].getProcedureDef(); + if (Blockly.Names.equals(procName[0], name)) { + return false; + } + } + } + return true; +}; + +/** + * Rename a procedure. Called by the editable field. + * @param {string} name The proposed new name. + * @return {string} The accepted name. + * @this {Blockly.Field} + */ +Blockly.Procedures.rename = function(name) { + // Strip leading and trailing whitespace. Beyond this, all names are legal. + name = name.replace(/^[\s\xa0]+|[\s\xa0]+$/g, ''); + + // Ensure two identically-named procedures don't exist. + var legalName = Blockly.Procedures.findLegalName(name, this.sourceBlock_); + var oldName = this.text_; + if (oldName != name && oldName != legalName) { + // Rename any callers. + var blocks = this.sourceBlock_.workspace.getAllBlocks(); + for (var i = 0; i < blocks.length; i++) { + if (blocks[i].renameProcedure) { + blocks[i].renameProcedure(oldName, legalName); + } + } + } + return legalName; +}; + +/** + * Construct the blocks required by the flyout for the procedure category. + * @param {!Blockly.Workspace} workspace The workspace contianing procedures. + * @return {!Array.} Array of XML block elements. + */ +Blockly.Procedures.flyoutCategory = function(workspace) { + var xmlList = []; + if (Blockly.Blocks['procedures_defnoreturn']) { + // + // do something + // + var block = goog.dom.createDom('block'); + block.setAttribute('type', 'procedures_defnoreturn'); + block.setAttribute('gap', 16); + var nameField = goog.dom.createDom('field', null, + Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE); + nameField.setAttribute('name', 'NAME'); + block.appendChild(nameField); + xmlList.push(block); + } + if (Blockly.Blocks['procedures_defreturn']) { + // + // do something + // + var block = goog.dom.createDom('block'); + block.setAttribute('type', 'procedures_defreturn'); + block.setAttribute('gap', 16); + var nameField = goog.dom.createDom('field', null, + Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE); + nameField.setAttribute('name', 'NAME'); + block.appendChild(nameField); + xmlList.push(block); + } + if (Blockly.Blocks['procedures_ifreturn']) { + // + var block = goog.dom.createDom('block'); + block.setAttribute('type', 'procedures_ifreturn'); + block.setAttribute('gap', 16); + xmlList.push(block); + } + if (xmlList.length) { + // Add slightly larger gap between system blocks and user calls. + xmlList[xmlList.length - 1].setAttribute('gap', 24); + } + + function populateProcedures(procedureList, templateName) { + for (var i = 0; i < procedureList.length; i++) { + var name = procedureList[i][0]; + var args = procedureList[i][1]; + // + // + // + // + // + var block = goog.dom.createDom('block'); + block.setAttribute('type', templateName); + block.setAttribute('gap', 16); + var mutation = goog.dom.createDom('mutation'); + mutation.setAttribute('name', name); + block.appendChild(mutation); + for (var j = 0; j < args.length; j++) { + var arg = goog.dom.createDom('arg'); + arg.setAttribute('name', args[j]); + mutation.appendChild(arg); + } + xmlList.push(block); + } + } + + var tuple = Blockly.Procedures.allProcedures(workspace); + populateProcedures(tuple[0], 'procedures_callnoreturn'); + populateProcedures(tuple[1], 'procedures_callreturn'); + return xmlList; +}; + +/** + * Find all the callers of a named procedure. + * @param {string} name Name of procedure. + * @param {!Blockly.Workspace} workspace The workspace to find callers in. + * @return {!Array.} Array of caller blocks. + */ +Blockly.Procedures.getCallers = function(name, workspace) { + var callers = []; + var blocks = workspace.getAllBlocks(); + // Iterate through every block and check the name. + for (var i = 0; i < blocks.length; i++) { + if (blocks[i].getProcedureCall) { + var procName = blocks[i].getProcedureCall(); + // Procedure name may be null if the block is only half-built. + if (procName && Blockly.Names.equals(procName, name)) { + callers.push(blocks[i]); + } + } + } + return callers; +}; + +/** + * When a procedure definition changes its parameters, find and edit all its + * callers. + * @param {!Blockly.Block} defBlock Procedure definition block. + */ +Blockly.Procedures.mutateCallers = function(defBlock) { + var oldRecordUndo = Blockly.Events.recordUndo; + var name = defBlock.getProcedureDef()[0]; + var xmlElement = defBlock.mutationToDom(true); + var callers = Blockly.Procedures.getCallers(name, defBlock.workspace); + for (var i = 0, caller; caller = callers[i]; i++) { + var oldMutationDom = caller.mutationToDom(); + var oldMutation = oldMutationDom && Blockly.Xml.domToText(oldMutationDom); + caller.domToMutation(xmlElement); + var newMutationDom = caller.mutationToDom(); + var newMutation = newMutationDom && Blockly.Xml.domToText(newMutationDom); + if (oldMutation != newMutation) { + // Fire a mutation on every caller block. But don't record this as an + // undo action since it is deterministically tied to the procedure's + // definition mutation. + Blockly.Events.recordUndo = false; + Blockly.Events.fire(new Blockly.Events.Change( + caller, 'mutation', null, oldMutation, newMutation)); + Blockly.Events.recordUndo = oldRecordUndo; + } + } +}; + +/** + * Find the definition block for the named procedure. + * @param {string} name Name of procedure. + * @param {!Blockly.Workspace} workspace The workspace to search. + * @return {Blockly.Block} The procedure definition block, or null not found. + */ +Blockly.Procedures.getDefinition = function(name, workspace) { + // Assume that a procedure definition is a top block. + var blocks = workspace.getTopBlocks(false); + for (var i = 0; i < blocks.length; i++) { + if (blocks[i].getProcedureDef) { + var tuple = blocks[i].getProcedureDef(); + if (tuple && Blockly.Names.equals(tuple[0], name)) { + return blocks[i]; + } + } + } + return null; +}; diff --git a/src/opsoro/server/static/js/blockly/core/rendered_connection.js b/src/opsoro/server/static/js/blockly/core/rendered_connection.js new file mode 100644 index 0000000..6425dcd --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/rendered_connection.js @@ -0,0 +1,409 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Components for creating connections between blocks. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.RenderedConnection'); + +goog.require('Blockly.Connection'); + + +/** + * Class for a connection between blocks that may be rendered on screen. + * @param {!Blockly.Block} source The block establishing this connection. + * @param {number} type The type of the connection. + * @extends {Blockly.Connection} + * @constructor + */ +Blockly.RenderedConnection = function(source, type) { + Blockly.RenderedConnection.superClass_.constructor.call(this, source, type); + this.offsetInBlock_ = new goog.math.Coordinate(0, 0); +}; +goog.inherits(Blockly.RenderedConnection, Blockly.Connection); + +/** + * Returns the distance between this connection and another connection. + * @param {!Blockly.Connection} otherConnection The other connection to measure + * the distance to. + * @return {number} The distance between connections. + */ +Blockly.RenderedConnection.prototype.distanceFrom = function(otherConnection) { + var xDiff = this.x_ - otherConnection.x_; + var yDiff = this.y_ - otherConnection.y_; + return Math.sqrt(xDiff * xDiff + yDiff * yDiff); +}; + +/** + * Move the block(s) belonging to the connection to a point where they don't + * visually interfere with the specified connection. + * @param {!Blockly.Connection} staticConnection The connection to move away + * from. + * @private + */ +Blockly.RenderedConnection.prototype.bumpAwayFrom_ = function(staticConnection) { + if (Blockly.dragMode_ != Blockly.DRAG_NONE) { + // Don't move blocks around while the user is doing the same. + return; + } + // Move the root block. + var rootBlock = this.sourceBlock_.getRootBlock(); + if (rootBlock.isInFlyout) { + // Don't move blocks around in a flyout. + return; + } + var reverse = false; + if (!rootBlock.isMovable()) { + // Can't bump an uneditable block away. + // Check to see if the other block is movable. + rootBlock = staticConnection.getSourceBlock().getRootBlock(); + if (!rootBlock.isMovable()) { + return; + } + // Swap the connections and move the 'static' connection instead. + staticConnection = this; + reverse = true; + } + // Raise it to the top for extra visibility. + var selected = Blockly.selected == rootBlock; + selected || rootBlock.addSelect(); + var dx = (staticConnection.x_ + Blockly.SNAP_RADIUS) - this.x_; + var dy = (staticConnection.y_ + Blockly.SNAP_RADIUS) - this.y_; + if (reverse) { + // When reversing a bump due to an uneditable block, bump up. + dy = -dy; + } + if (rootBlock.RTL) { + dx = -dx; + } + rootBlock.moveBy(dx, dy); + selected || rootBlock.removeSelect(); +}; + +/** + * Change the connection's coordinates. + * @param {number} x New absolute x coordinate. + * @param {number} y New absolute y coordinate. + */ +Blockly.RenderedConnection.prototype.moveTo = function(x, y) { + // Remove it from its old location in the database (if already present) + if (this.inDB_) { + this.db_.removeConnection_(this); + } + this.x_ = x; + this.y_ = y; + // Insert it into its new location in the database. + if (!this.hidden_) { + this.db_.addConnection(this); + } +}; + +/** + * Change the connection's coordinates. + * @param {number} dx Change to x coordinate. + * @param {number} dy Change to y coordinate. + */ +Blockly.RenderedConnection.prototype.moveBy = function(dx, dy) { + this.moveTo(this.x_ + dx, this.y_ + dy); +}; + +/** + * Move this connection to the location given by its offset within the block and + * the coordinate of the block's top left corner. + * @param {!goog.math.Coordinate} blockTL The coordinate of the top left corner + * of the block. + */ +Blockly.RenderedConnection.prototype.moveToOffset = function(blockTL) { + this.moveTo(blockTL.x + this.offsetInBlock_.x, + blockTL.y + this.offsetInBlock_.y); +}; + +/** + * Set the offset of this connection relative to the top left of its block. + * @param {number} x The new relative x. + * @param {number} y The new relative y. + */ +Blockly.RenderedConnection.prototype.setOffsetInBlock = function(x, y) { + this.offsetInBlock_.x = x; + this.offsetInBlock_.y = y; +}; + +/** + * Move the blocks on either side of this connection right next to each other. + * @private + */ +Blockly.RenderedConnection.prototype.tighten_ = function() { + var dx = this.targetConnection.x_ - this.x_; + var dy = this.targetConnection.y_ - this.y_; + if (dx != 0 || dy != 0) { + var block = this.targetBlock(); + var svgRoot = block.getSvgRoot(); + if (!svgRoot) { + throw 'block is not rendered.'; + } + var xy = Blockly.utils.getRelativeXY(svgRoot); + block.getSvgRoot().setAttribute('transform', + 'translate(' + (xy.x - dx) + ',' + (xy.y - dy) + ')'); + block.moveConnections_(-dx, -dy); + } +}; + +/** + * Find the closest compatible connection to this connection. + * @param {number} maxLimit The maximum radius to another connection. + * @param {number} dx Horizontal offset between this connection's location + * in the database and the current location (as a result of dragging). + * @param {number} dy Vertical offset between this connection's location + * in the database and the current location (as a result of dragging). + * @return {!{connection: ?Blockly.Connection, radius: number}} Contains two + * properties: 'connection' which is either another connection or null, + * and 'radius' which is the distance. + */ +Blockly.RenderedConnection.prototype.closest = function(maxLimit, dx, dy) { + return this.dbOpposite_.searchForClosest(this, maxLimit, dx, dy); +}; + +/** + * Add highlighting around this connection. + */ +Blockly.RenderedConnection.prototype.highlight = function() { + var steps; + if (this.type == Blockly.INPUT_VALUE || this.type == Blockly.OUTPUT_VALUE) { + steps = 'm 0,0 ' + Blockly.BlockSvg.TAB_PATH_DOWN + ' v 5'; + } else { + steps = 'm -20,0 h 5 ' + Blockly.BlockSvg.NOTCH_PATH_LEFT + ' h 5'; + } + var xy = this.sourceBlock_.getRelativeToSurfaceXY(); + var x = this.x_ - xy.x; + var y = this.y_ - xy.y; + Blockly.Connection.highlightedPath_ = Blockly.utils.createSvgElement('path', + {'class': 'blocklyHighlightedConnectionPath', + 'd': steps, + transform: 'translate(' + x + ',' + y + ')' + + (this.sourceBlock_.RTL ? ' scale(-1 1)' : '')}, + this.sourceBlock_.getSvgRoot()); +}; + +/** + * Unhide this connection, as well as all down-stream connections on any block + * attached to this connection. This happens when a block is expanded. + * Also unhides down-stream comments. + * @return {!Array.} List of blocks to render. + */ +Blockly.RenderedConnection.prototype.unhideAll = function() { + this.setHidden(false); + // All blocks that need unhiding must be unhidden before any rendering takes + // place, since rendering requires knowing the dimensions of lower blocks. + // Also, since rendering a block renders all its parents, we only need to + // render the leaf nodes. + var renderList = []; + if (this.type != Blockly.INPUT_VALUE && this.type != Blockly.NEXT_STATEMENT) { + // Only spider down. + return renderList; + } + var block = this.targetBlock(); + if (block) { + var connections; + if (block.isCollapsed()) { + // This block should only be partially revealed since it is collapsed. + connections = []; + block.outputConnection && connections.push(block.outputConnection); + block.nextConnection && connections.push(block.nextConnection); + block.previousConnection && connections.push(block.previousConnection); + } else { + // Show all connections of this block. + connections = block.getConnections_(true); + } + for (var i = 0; i < connections.length; i++) { + renderList.push.apply(renderList, connections[i].unhideAll()); + } + if (!renderList.length) { + // Leaf block. + renderList[0] = block; + } + } + return renderList; +}; + +/** + * Remove the highlighting around this connection. + */ +Blockly.RenderedConnection.prototype.unhighlight = function() { + goog.dom.removeNode(Blockly.Connection.highlightedPath_); + delete Blockly.Connection.highlightedPath_; +}; + +/** + * Set whether this connections is hidden (not tracked in a database) or not. + * @param {boolean} hidden True if connection is hidden. + */ +Blockly.RenderedConnection.prototype.setHidden = function(hidden) { + this.hidden_ = hidden; + if (hidden && this.inDB_) { + this.db_.removeConnection_(this); + } else if (!hidden && !this.inDB_) { + this.db_.addConnection(this); + } +}; + +/** + * Hide this connection, as well as all down-stream connections on any block + * attached to this connection. This happens when a block is collapsed. + * Also hides down-stream comments. + */ +Blockly.RenderedConnection.prototype.hideAll = function() { + this.setHidden(true); + if (this.targetConnection) { + var blocks = this.targetBlock().getDescendants(); + for (var i = 0; i < blocks.length; i++) { + var block = blocks[i]; + // Hide all connections of all children. + var connections = block.getConnections_(true); + for (var j = 0; j < connections.length; j++) { + connections[j].setHidden(true); + } + // Close all bubbles of all children. + var icons = block.getIcons(); + for (var j = 0; j < icons.length; j++) { + icons[j].setVisible(false); + } + } + } +}; + +/** + * Check if the two connections can be dragged to connect to each other. + * @param {!Blockly.Connection} candidate A nearby connection to check. + * @param {number} maxRadius The maximum radius allowed for connections. + * @return {boolean} True if the connection is allowed, false otherwise. + */ +Blockly.RenderedConnection.prototype.isConnectionAllowed = function(candidate, + maxRadius) { + if (this.distanceFrom(candidate) > maxRadius) { + return false; + } + + return Blockly.RenderedConnection.superClass_.isConnectionAllowed.call(this, + candidate); +}; + +/** + * Disconnect two blocks that are connected by this connection. + * @param {!Blockly.Block} parentBlock The superior block. + * @param {!Blockly.Block} childBlock The inferior block. + * @private + */ +Blockly.RenderedConnection.prototype.disconnectInternal_ = function(parentBlock, + childBlock) { + Blockly.RenderedConnection.superClass_.disconnectInternal_.call(this, + parentBlock, childBlock); + // Rerender the parent so that it may reflow. + if (parentBlock.rendered) { + parentBlock.render(); + } + if (childBlock.rendered) { + childBlock.updateDisabled(); + childBlock.render(); + } +}; + +/** + * Respawn the shadow block if there was one connected to the this connection. + * Render/rerender blocks as needed. + * @private + */ +Blockly.RenderedConnection.prototype.respawnShadow_ = function() { + var parentBlock = this.getSourceBlock(); + // Respawn the shadow block if there is one. + var shadow = this.getShadowDom(); + if (parentBlock.workspace && shadow && Blockly.Events.recordUndo) { + Blockly.RenderedConnection.superClass_.respawnShadow_.call(this); + var blockShadow = this.targetBlock(); + if (!blockShadow) { + throw 'Couldn\'t respawn the shadow block that should exist here.'; + } + blockShadow.initSvg(); + blockShadow.render(false); + if (parentBlock.rendered) { + parentBlock.render(); + } + } +}; + +/** + * Find all nearby compatible connections to this connection. + * Type checking does not apply, since this function is used for bumping. + * @param {number} maxLimit The maximum radius to another connection. + * @return {!Array.} List of connections. + * @private + */ +Blockly.RenderedConnection.prototype.neighbours_ = function(maxLimit) { + return this.dbOpposite_.getNeighbours(this, maxLimit); +}; + +/** + * Connect two connections together. This is the connection on the superior + * block. Rerender blocks as needed. + * @param {!Blockly.Connection} childConnection Connection on inferior block. + * @private + */ +Blockly.RenderedConnection.prototype.connect_ = function(childConnection) { + Blockly.RenderedConnection.superClass_.connect_.call(this, childConnection); + + var parentConnection = this; + var parentBlock = parentConnection.getSourceBlock(); + var childBlock = childConnection.getSourceBlock(); + + if (parentBlock.rendered) { + parentBlock.updateDisabled(); + } + if (childBlock.rendered) { + childBlock.updateDisabled(); + } + if (parentBlock.rendered && childBlock.rendered) { + if (parentConnection.type == Blockly.NEXT_STATEMENT || + parentConnection.type == Blockly.PREVIOUS_STATEMENT) { + // Child block may need to square off its corners if it is in a stack. + // Rendering a child will render its parent. + childBlock.render(); + } else { + // Child block does not change shape. Rendering the parent node will + // move its connected children into position. + parentBlock.render(); + } + } +}; + +/** + * Function to be called when this connection's compatible types have changed. + * @private + */ +Blockly.RenderedConnection.prototype.onCheckChanged_ = function() { + // The new value type may not be compatible with the existing connection. + if (this.isConnected() && !this.checkType_(this.targetConnection)) { + var child = this.isSuperior() ? this.targetBlock() : this.sourceBlock_; + child.unplug(); + // Bump away. + this.sourceBlock_.bumpNeighbours_(); + } +}; diff --git a/src/opsoro/server/static/js/blockly/core/scrollbar.js b/src/opsoro/server/static/js/blockly/core/scrollbar.js new file mode 100644 index 0000000..3103f14 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/scrollbar.js @@ -0,0 +1,831 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2011 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Library for creating scrollbars. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Scrollbar'); +goog.provide('Blockly.ScrollbarPair'); + +goog.require('goog.dom'); +goog.require('goog.events'); + + +/** + * Class for a pair of scrollbars. Horizontal and vertical. + * @param {!Blockly.Workspace} workspace Workspace to bind the scrollbars to. + * @constructor + */ +Blockly.ScrollbarPair = function(workspace) { + this.workspace_ = workspace; + this.hScroll = new Blockly.Scrollbar(workspace, true, true, + 'blocklyMainWorkspaceScrollbar'); + this.vScroll = new Blockly.Scrollbar(workspace, false, true, + 'blocklyMainWorkspaceScrollbar'); + this.corner_ = Blockly.utils.createSvgElement('rect', + {'height': Blockly.Scrollbar.scrollbarThickness, + 'width': Blockly.Scrollbar.scrollbarThickness, + 'class': 'blocklyScrollbarBackground'}, null); + Blockly.utils.insertAfter_(this.corner_, workspace.getBubbleCanvas()); +}; + +/** + * Previously recorded metrics from the workspace. + * @type {Object} + * @private + */ +Blockly.ScrollbarPair.prototype.oldHostMetrics_ = null; + +/** + * Dispose of this pair of scrollbars. + * Unlink from all DOM elements to prevent memory leaks. + */ +Blockly.ScrollbarPair.prototype.dispose = function() { + goog.dom.removeNode(this.corner_); + this.corner_ = null; + this.workspace_ = null; + this.oldHostMetrics_ = null; + this.hScroll.dispose(); + this.hScroll = null; + this.vScroll.dispose(); + this.vScroll = null; +}; + +/** + * Recalculate both of the scrollbars' locations and lengths. + * Also reposition the corner rectangle. + */ +Blockly.ScrollbarPair.prototype.resize = function() { + // Look up the host metrics once, and use for both scrollbars. + var hostMetrics = this.workspace_.getMetrics(); + if (!hostMetrics) { + // Host element is likely not visible. + return; + } + + // Only change the scrollbars if there has been a change in metrics. + var resizeH = false; + var resizeV = false; + if (!this.oldHostMetrics_ || + this.oldHostMetrics_.viewWidth != hostMetrics.viewWidth || + this.oldHostMetrics_.viewHeight != hostMetrics.viewHeight || + this.oldHostMetrics_.absoluteTop != hostMetrics.absoluteTop || + this.oldHostMetrics_.absoluteLeft != hostMetrics.absoluteLeft) { + // The window has been resized or repositioned. + resizeH = true; + resizeV = true; + } else { + // Has the content been resized or moved? + if (!this.oldHostMetrics_ || + this.oldHostMetrics_.contentWidth != hostMetrics.contentWidth || + this.oldHostMetrics_.viewLeft != hostMetrics.viewLeft || + this.oldHostMetrics_.contentLeft != hostMetrics.contentLeft) { + resizeH = true; + } + if (!this.oldHostMetrics_ || + this.oldHostMetrics_.contentHeight != hostMetrics.contentHeight || + this.oldHostMetrics_.viewTop != hostMetrics.viewTop || + this.oldHostMetrics_.contentTop != hostMetrics.contentTop) { + resizeV = true; + } + } + if (resizeH) { + this.hScroll.resize(hostMetrics); + } + if (resizeV) { + this.vScroll.resize(hostMetrics); + } + + // Reposition the corner square. + if (!this.oldHostMetrics_ || + this.oldHostMetrics_.viewWidth != hostMetrics.viewWidth || + this.oldHostMetrics_.absoluteLeft != hostMetrics.absoluteLeft) { + this.corner_.setAttribute('x', this.vScroll.position_.x); + } + if (!this.oldHostMetrics_ || + this.oldHostMetrics_.viewHeight != hostMetrics.viewHeight || + this.oldHostMetrics_.absoluteTop != hostMetrics.absoluteTop) { + this.corner_.setAttribute('y', this.hScroll.position_.y); + } + + // Cache the current metrics to potentially short-cut the next resize event. + this.oldHostMetrics_ = hostMetrics; +}; + +/** + * Set the sliders of both scrollbars to be at a certain position. + * @param {number} x Horizontal scroll value. + * @param {number} y Vertical scroll value. + */ +Blockly.ScrollbarPair.prototype.set = function(x, y) { + // This function is equivalent to: + // this.hScroll.set(x); + // this.vScroll.set(y); + // However, that calls setMetrics twice which causes a chain of + // getAttribute->setAttribute->getAttribute resulting in an extra layout pass. + // Combining them speeds up rendering. + var xyRatio = {}; + + var hHandlePosition = x * this.hScroll.ratio_; + var vHandlePosition = y * this.vScroll.ratio_; + + var hBarLength = this.hScroll.scrollViewSize_; + var vBarLength = this.vScroll.scrollViewSize_; + + xyRatio.x = this.getRatio_(hHandlePosition, hBarLength); + xyRatio.y = this.getRatio_(vHandlePosition, vBarLength); + this.workspace_.setMetrics(xyRatio); + + this.hScroll.setHandlePosition(hHandlePosition); + this.vScroll.setHandlePosition(vHandlePosition); +}; + +/** + * Helper to calculate the ratio of handle position to scrollbar view size. + * @param {number} handlePosition The value of the handle. + * @param {number} viewSize The total size of the scrollbar's view. + * @return {number} Ratio. + * @private + */ +Blockly.ScrollbarPair.prototype.getRatio_ = function(handlePosition, viewSize) { + var ratio = handlePosition / viewSize; + if (isNaN(ratio)) { + return 0; + } + return ratio; +}; + +// -------------------------------------------------------------------- + +/** + * Class for a pure SVG scrollbar. + * This technique offers a scrollbar that is guaranteed to work, but may not + * look or behave like the system's scrollbars. + * @param {!Blockly.Workspace} workspace Workspace to bind the scrollbar to. + * @param {boolean} horizontal True if horizontal, false if vertical. + * @param {boolean=} opt_pair True if scrollbar is part of a horiz/vert pair. + * @param {string} opt_class A class to be applied to this scrollbar. + * @constructor + */ +Blockly.Scrollbar = function(workspace, horizontal, opt_pair, opt_class) { + this.workspace_ = workspace; + this.pair_ = opt_pair || false; + this.horizontal_ = horizontal; + this.oldHostMetrics_ = null; + + this.createDom_(opt_class); + + /** + * The upper left corner of the scrollbar's svg group. + * @type {goog.math.Coordinate} + * @private + */ + this.position_ = new goog.math.Coordinate(0, 0); + + if (horizontal) { + this.svgBackground_.setAttribute('height', + Blockly.Scrollbar.scrollbarThickness); + this.outerSvg_.setAttribute('height', + Blockly.Scrollbar.scrollbarThickness); + this.svgHandle_.setAttribute('height', + Blockly.Scrollbar.scrollbarThickness - 5); + this.svgHandle_.setAttribute('y', 2.5); + + this.lengthAttribute_ = 'width'; + this.positionAttribute_ = 'x'; + } else { + this.svgBackground_.setAttribute('width', + Blockly.Scrollbar.scrollbarThickness); + this.outerSvg_.setAttribute('width', + Blockly.Scrollbar.scrollbarThickness); + this.svgHandle_.setAttribute('width', + Blockly.Scrollbar.scrollbarThickness - 5); + this.svgHandle_.setAttribute('x', 2.5); + + this.lengthAttribute_ = 'height'; + this.positionAttribute_ = 'y'; + } + var scrollbar = this; + this.onMouseDownBarWrapper_ = Blockly.bindEventWithChecks_( + this.svgBackground_, 'mousedown', scrollbar, scrollbar.onMouseDownBar_); + this.onMouseDownHandleWrapper_ = Blockly.bindEventWithChecks_(this.svgHandle_, + 'mousedown', scrollbar, scrollbar.onMouseDownHandle_); +}; +/** + * The coordinate of the upper left corner of the scrollbar SVG. + * @type {goog.math.Coordinate} + * @private + */ +Blockly.Scrollbar.prototype.origin_ = new goog.math.Coordinate(0, 0); + +/** + * The size of the area within which the scrollbar handle can move. + * @type {number} + * @private + */ +Blockly.Scrollbar.prototype.scrollViewSize_ = 0; + +/** + * The length of the scrollbar handle. + * @type {number} + * @private + */ +Blockly.Scrollbar.prototype.handleLength_ = 0; + +/** + * The offset of the start of the handle from the start of the scrollbar range. + * @type {number} + * @private + */ +Blockly.Scrollbar.prototype.handlePosition_ = 0; + +/** + * Whether the scrollbar handle is visible. + * @type {boolean} + * @private + */ +Blockly.Scrollbar.prototype.isVisible_ = true; + +/** + * Whether the workspace containing this scrollbar is visible. + * @type {boolean} + * @private + */ +Blockly.Scrollbar.prototype.containerVisible_ = true; + +/** + * Width of vertical scrollbar or height of horizontal scrollbar. + * Increase the size of scrollbars on touch devices. + * Don't define if there is no document object (e.g. node.js). + */ +Blockly.Scrollbar.scrollbarThickness = 15; +if (goog.events.BrowserFeature.TOUCH_ENABLED) { + Blockly.Scrollbar.scrollbarThickness = 25; +} + +/** + * @param {!Object} first An object containing computed measurements of a + * workspace. + * @param {!Object} second Another object containing computed measurements of a + * workspace. + * @return {boolean} Whether the two sets of metrics are equivalent. + * @private + */ +Blockly.Scrollbar.metricsAreEquivalent_ = function(first, second) { + if (!(first && second)) { + return false; + } + + if (first.viewWidth != second.viewWidth || + first.viewHeight != second.viewHeight || + first.viewLeft != second.viewLeft || + first.viewTop != second.viewTop || + first.absoluteTop != second.absoluteTop || + first.absoluteLeft != second.absoluteLeft || + first.contentWidth != second.contentWidth || + first.contentHeight != second.contentHeight || + first.contentLeft != second.contentLeft || + first.contentTop != second.contentTop) { + return false; + } + + return true; +}; + +/** + * Dispose of this scrollbar. + * Unlink from all DOM elements to prevent memory leaks. + */ +Blockly.Scrollbar.prototype.dispose = function() { + this.cleanUp_(); + Blockly.unbindEvent_(this.onMouseDownBarWrapper_); + this.onMouseDownBarWrapper_ = null; + Blockly.unbindEvent_(this.onMouseDownHandleWrapper_); + this.onMouseDownHandleWrapper_ = null; + + goog.dom.removeNode(this.outerSvg_); + this.outerSvg_ = null; + this.svgGroup_ = null; + this.svgBackground_ = null; + this.svgHandle_ = null; + this.workspace_ = null; +}; + +/** + * Set the length of the scrollbar's handle and change the SVG attribute + * accordingly. + * @param {number} newLength The new scrollbar handle length. + */ +Blockly.Scrollbar.prototype.setHandleLength_ = function(newLength) { + this.handleLength_ = newLength; + this.svgHandle_.setAttribute(this.lengthAttribute_, this.handleLength_); +}; + +/** + * Set the offset of the scrollbar's handle and change the SVG attribute + * accordingly. + * @param {number} newPosition The new scrollbar handle offset. + */ +Blockly.Scrollbar.prototype.setHandlePosition = function(newPosition) { + this.handlePosition_ = newPosition; + this.svgHandle_.setAttribute(this.positionAttribute_, this.handlePosition_); +}; + +/** + * Set the size of the scrollbar's background and change the SVG attribute + * accordingly. + * @param {number} newSize The new scrollbar background length. + * @private + */ +Blockly.Scrollbar.prototype.setScrollViewSize_ = function(newSize) { + this.scrollViewSize_ = newSize; + this.outerSvg_.setAttribute(this.lengthAttribute_, this.scrollViewSize_); + this.svgBackground_.setAttribute(this.lengthAttribute_, this.scrollViewSize_); +}; + +/** + * Set whether this scrollbar's container is visible. + * @param {boolean} visible Whether the container is visible. + */ +Blockly.ScrollbarPair.prototype.setContainerVisible = function(visible) { + this.hScroll.setContainerVisible(visible); + this.vScroll.setContainerVisible(visible); +}; + +/** + * Set the position of the scrollbar's svg group. + * @param {number} x The new x coordinate. + * @param {number} y The new y coordinate. + */ +Blockly.Scrollbar.prototype.setPosition = function(x, y) { + this.position_.x = x; + this.position_.y = y; + + var tempX = this.position_.x + this.origin_.x; + var tempY = this.position_.y + this.origin_.y; + var transform = 'translate(' + tempX + 'px,' + tempY + 'px)'; + Blockly.utils.setCssTransform(this.outerSvg_, transform); +}; + +/** + * Recalculate the scrollbar's location and its length. + * @param {Object=} opt_metrics A data structure of from the describing all the + * required dimensions. If not provided, it will be fetched from the host + * object. + */ +Blockly.Scrollbar.prototype.resize = function(opt_metrics) { + // Determine the location, height and width of the host element. + var hostMetrics = opt_metrics; + if (!hostMetrics) { + hostMetrics = this.workspace_.getMetrics(); + if (!hostMetrics) { + // Host element is likely not visible. + return; + } + } + + if (Blockly.Scrollbar.metricsAreEquivalent_(hostMetrics, + this.oldHostMetrics_)) { + return; + } + this.oldHostMetrics_ = hostMetrics; + + /* hostMetrics is an object with the following properties. + * .viewHeight: Height of the visible rectangle, + * .viewWidth: Width of the visible rectangle, + * .contentHeight: Height of the contents, + * .contentWidth: Width of the content, + * .viewTop: Offset of top edge of visible rectangle from parent, + * .viewLeft: Offset of left edge of visible rectangle from parent, + * .contentTop: Offset of the top-most content from the y=0 coordinate, + * .contentLeft: Offset of the left-most content from the x=0 coordinate, + * .absoluteTop: Top-edge of view. + * .absoluteLeft: Left-edge of view. + */ + if (this.horizontal_) { + this.resizeHorizontal_(hostMetrics); + } else { + this.resizeVertical_(hostMetrics); + } + // Resizing may have caused some scrolling. + this.onScroll_(); +}; + +/** + * Recalculate a horizontal scrollbar's location and length. + * @param {!Object} hostMetrics A data structure describing all the + * required dimensions, possibly fetched from the host object. + * @private + */ +Blockly.Scrollbar.prototype.resizeHorizontal_ = function(hostMetrics) { + // TODO: Inspect metrics to determine if we can get away with just a content + // resize. + this.resizeViewHorizontal(hostMetrics); +}; + +/** + * Recalculate a horizontal scrollbar's location on the screen and path length. + * This should be called when the layout or size of the window has changed. + * @param {!Object} hostMetrics A data structure describing all the + * required dimensions, possibly fetched from the host object. + */ +Blockly.Scrollbar.prototype.resizeViewHorizontal = function(hostMetrics) { + var viewSize = hostMetrics.viewWidth - 1; + if (this.pair_) { + // Shorten the scrollbar to make room for the corner square. + viewSize -= Blockly.Scrollbar.scrollbarThickness; + } + this.setScrollViewSize_(Math.max(0, viewSize)); + + var xCoordinate = hostMetrics.absoluteLeft + 0.5; + if (this.pair_ && this.workspace_.RTL) { + xCoordinate += Blockly.Scrollbar.scrollbarThickness; + } + + // Horizontal toolbar should always be just above the bottom of the workspace. + var yCoordinate = hostMetrics.absoluteTop + hostMetrics.viewHeight - + Blockly.Scrollbar.scrollbarThickness - 0.5; + this.setPosition(xCoordinate, yCoordinate); + + // If the view has been resized, a content resize will also be necessary. The + // reverse is not true. + this.resizeContentHorizontal(hostMetrics); +}; + +/** + * Recalculate a horizontal scrollbar's location within its path and length. + * This should be called when the contents of the workspace have changed. + * @param {!Object} hostMetrics A data structure describing all the + * required dimensions, possibly fetched from the host object. + */ +Blockly.Scrollbar.prototype.resizeContentHorizontal = function(hostMetrics) { + if (!this.pair_) { + // Only show the scrollbar if needed. + // Ideally this would also apply to scrollbar pairs, but that's a bigger + // headache (due to interactions with the corner square). + this.setVisible(this.scrollViewSize_ < hostMetrics.contentWidth); + } + + this.ratio_ = this.scrollViewSize_ / hostMetrics.contentWidth; + if (this.ratio_ == -Infinity || this.ratio_ == Infinity || + isNaN(this.ratio_)) { + this.ratio_ = 0; + } + + var handleLength = hostMetrics.viewWidth * this.ratio_; + this.setHandleLength_(Math.max(0, handleLength)); + + var handlePosition = (hostMetrics.viewLeft - hostMetrics.contentLeft) * + this.ratio_; + this.setHandlePosition(this.constrainHandle_(handlePosition)); +}; + +/** + * Recalculate a vertical scrollbar's location and length. + * @param {!Object} hostMetrics A data structure describing all the + * required dimensions, possibly fetched from the host object. + * @private + */ +Blockly.Scrollbar.prototype.resizeVertical_ = function(hostMetrics) { + // TODO: Inspect metrics to determine if we can get away with just a content + // resize. + this.resizeViewVertical(hostMetrics); +}; + +/** + * Recalculate a vertical scrollbar's location on the screen and path length. + * This should be called when the layout or size of the window has changed. + * @param {!Object} hostMetrics A data structure describing all the + * required dimensions, possibly fetched from the host object. + */ +Blockly.Scrollbar.prototype.resizeViewVertical = function(hostMetrics) { + var viewSize = hostMetrics.viewHeight - 1; + if (this.pair_) { + // Shorten the scrollbar to make room for the corner square. + viewSize -= Blockly.Scrollbar.scrollbarThickness; + } + this.setScrollViewSize_(Math.max(0, viewSize)); + + var xCoordinate = hostMetrics.absoluteLeft + 0.5; + if (!this.workspace_.RTL) { + xCoordinate += hostMetrics.viewWidth - + Blockly.Scrollbar.scrollbarThickness - 1; + } + var yCoordinate = hostMetrics.absoluteTop + 0.5; + this.setPosition(xCoordinate, yCoordinate); + + // If the view has been resized, a content resize will also be necessary. The + // reverse is not true. + this.resizeContentVertical(hostMetrics); +}; + +/** + * Recalculate a vertical scrollbar's location within its path and length. + * This should be called when the contents of the workspace have changed. + * @param {!Object} hostMetrics A data structure describing all the + * required dimensions, possibly fetched from the host object. + */ +Blockly.Scrollbar.prototype.resizeContentVertical = function(hostMetrics) { + if (!this.pair_) { + // Only show the scrollbar if needed. + this.setVisible(this.scrollViewSize_ < hostMetrics.contentHeight); + } + + this.ratio_ = this.scrollViewSize_ / hostMetrics.contentHeight; + if (this.ratio_ == -Infinity || this.ratio_ == Infinity || + isNaN(this.ratio_)) { + this.ratio_ = 0; + } + + var handleLength = hostMetrics.viewHeight * this.ratio_; + this.setHandleLength_(Math.max(0, handleLength)); + + var handlePosition = (hostMetrics.viewTop - hostMetrics.contentTop) * + this.ratio_; + this.setHandlePosition(this.constrainHandle_(handlePosition)); +}; + +/** + * Create all the DOM elements required for a scrollbar. + * The resulting widget is not sized. + * @param {string} opt_class A class to be applied to this scrollbar. + * @private + */ +Blockly.Scrollbar.prototype.createDom_ = function(opt_class) { + /* Create the following DOM: + + + + + + + */ + var className = 'blocklyScrollbar' + + (this.horizontal_ ? 'Horizontal' : 'Vertical'); + if (opt_class) { + className += ' ' + opt_class; + } + this.outerSvg_ = Blockly.utils.createSvgElement('svg', {'class': className}, + null); + this.svgGroup_ = Blockly.utils.createSvgElement('g', {}, this.outerSvg_); + this.svgBackground_ = Blockly.utils.createSvgElement('rect', + {'class': 'blocklyScrollbarBackground'}, this.svgGroup_); + var radius = Math.floor((Blockly.Scrollbar.scrollbarThickness - 5) / 2); + this.svgHandle_ = Blockly.utils.createSvgElement('rect', + {'class': 'blocklyScrollbarHandle', 'rx': radius, 'ry': radius}, + this.svgGroup_); + Blockly.utils.insertAfter_(this.outerSvg_, + this.workspace_.getParentSvg()); +}; + +/** + * Is the scrollbar visible. Non-paired scrollbars disappear when they aren't + * needed. + * @return {boolean} True if visible. + */ +Blockly.Scrollbar.prototype.isVisible = function() { + return this.isVisible_; +}; + +/** + * Set whether the scrollbar's container is visible and update + * display accordingly if visibility has changed. + * @param {boolean} visible Whether the container is visible + */ +Blockly.Scrollbar.prototype.setContainerVisible = function(visible) { + var visibilityChanged = (visible != this.containerVisible_); + + this.containerVisible_ = visible; + if (visibilityChanged) { + this.updateDisplay_(); + } +}; + +/** + * Set whether the scrollbar is visible. + * Only applies to non-paired scrollbars. + * @param {boolean} visible True if visible. + */ +Blockly.Scrollbar.prototype.setVisible = function(visible) { + var visibilityChanged = (visible != this.isVisible()); + + // Ideally this would also apply to scrollbar pairs, but that's a bigger + // headache (due to interactions with the corner square). + if (this.pair_) { + throw 'Unable to toggle visibility of paired scrollbars.'; + } + this.isVisible_ = visible; + if (visibilityChanged) { + this.updateDisplay_(); + } +}; + +/** + * Update visibility of scrollbar based on whether it thinks it should + * be visible and whether its containing workspace is visible. + * We cannot rely on the containing workspace being hidden to hide us + * because it is not necessarily our parent in the dom. + */ +Blockly.Scrollbar.prototype.updateDisplay_ = function() { + var show = true; + // Check whether our parent/container is visible. + if (!this.containerVisible_) { + show = false; + } else { + show = this.isVisible(); + } + if (show) { + this.outerSvg_.setAttribute('display', 'block'); + } else { + this.outerSvg_.setAttribute('display', 'none'); + } +}; + +/** + * Scroll by one pageful. + * Called when scrollbar background is clicked. + * @param {!Event} e Mouse down event. + * @private + */ +Blockly.Scrollbar.prototype.onMouseDownBar_ = function(e) { + this.workspace_.markFocused(); + Blockly.Touch.clearTouchIdentifier(); // This is really a click. + this.cleanUp_(); + if (Blockly.utils.isRightButton(e)) { + // Right-click. + // Scrollbars have no context menu. + e.stopPropagation(); + return; + } + var mouseXY = Blockly.utils.mouseToSvg(e, this.workspace_.getParentSvg(), + this.workspace_.getInverseScreenCTM()); + var mouseLocation = this.horizontal_ ? mouseXY.x : mouseXY.y; + + var handleXY = Blockly.utils.getInjectionDivXY_(this.svgHandle_); + var handleStart = this.horizontal_ ? handleXY.x : handleXY.y; + var handlePosition = this.handlePosition_; + + var pageLength = this.handleLength_ * 0.95; + if (mouseLocation <= handleStart) { + // Decrease the scrollbar's value by a page. + handlePosition -= pageLength; + } else if (mouseLocation >= handleStart + this.handleLength_) { + // Increase the scrollbar's value by a page. + handlePosition += pageLength; + } + + this.setHandlePosition(this.constrainHandle_(handlePosition)); + + this.onScroll_(); + e.stopPropagation(); + e.preventDefault(); +}; + +/** + * Start a dragging operation. + * Called when scrollbar handle is clicked. + * @param {!Event} e Mouse down event. + * @private + */ +Blockly.Scrollbar.prototype.onMouseDownHandle_ = function(e) { + this.workspace_.markFocused(); + this.cleanUp_(); + if (Blockly.utils.isRightButton(e)) { + // Right-click. + // Scrollbars have no context menu. + e.stopPropagation(); + return; + } + // Look up the current translation and record it. + this.startDragHandle = this.handlePosition_; + + // Tell the workspace to setup its drag surface since it is about to move. + // onMouseMoveHandle will call onScroll which actually tells the workspace + // to move. + this.workspace_.setupDragSurface(); + + // Record the current mouse position. + this.startDragMouse = this.horizontal_ ? e.clientX : e.clientY; + Blockly.Scrollbar.onMouseUpWrapper_ = Blockly.bindEventWithChecks_(document, + 'mouseup', this, this.onMouseUpHandle_); + Blockly.Scrollbar.onMouseMoveWrapper_ = Blockly.bindEventWithChecks_(document, + 'mousemove', this, this.onMouseMoveHandle_); + e.stopPropagation(); + e.preventDefault(); +}; + +/** + * Drag the scrollbar's handle. + * @param {!Event} e Mouse up event. + * @private + */ +Blockly.Scrollbar.prototype.onMouseMoveHandle_ = function(e) { + var currentMouse = this.horizontal_ ? e.clientX : e.clientY; + var mouseDelta = currentMouse - this.startDragMouse; + var handlePosition = this.startDragHandle + mouseDelta; + // Position the bar. + this.setHandlePosition(this.constrainHandle_(handlePosition)); + this.onScroll_(); +}; + +/** + * Release the scrollbar handle and reset state accordingly. + * @private + */ +Blockly.Scrollbar.prototype.onMouseUpHandle_ = function() { + // Tell the workspace to clean up now that the workspace is done moving. + this.workspace_.resetDragSurface(); + Blockly.Touch.clearTouchIdentifier(); + this.cleanUp_(); +}; + +/** + * Hide chaff and stop binding to mouseup and mousemove events. Call this to + * wrap up lose ends associated with the scrollbar. + * @private + */ +Blockly.Scrollbar.prototype.cleanUp_ = function() { + Blockly.hideChaff(true); + if (Blockly.Scrollbar.onMouseUpWrapper_) { + Blockly.unbindEvent_(Blockly.Scrollbar.onMouseUpWrapper_); + Blockly.Scrollbar.onMouseUpWrapper_ = null; + } + if (Blockly.Scrollbar.onMouseMoveWrapper_) { + Blockly.unbindEvent_(Blockly.Scrollbar.onMouseMoveWrapper_); + Blockly.Scrollbar.onMouseMoveWrapper_ = null; + } +}; + +/** + * Constrain the handle's position within the minimum (0) and maximum + * (length of scrollbar) values allowed for the scrollbar. + * @param {number} value Value that is potentially out of bounds. + * @return {number} Constrained value. + * @private + */ +Blockly.Scrollbar.prototype.constrainHandle_ = function(value) { + if (value <= 0 || isNaN(value) || this.scrollViewSize_ < this.handleLength_) { + value = 0; + } else { + value = Math.min(value, this.scrollViewSize_ - this.handleLength_); + } + return value; +}; + +/** + * Called when scrollbar is moved. + * @private + */ +Blockly.Scrollbar.prototype.onScroll_ = function() { + var ratio = this.handlePosition_ / this.scrollViewSize_; + if (isNaN(ratio)) { + ratio = 0; + } + var xyRatio = {}; + if (this.horizontal_) { + xyRatio.x = ratio; + } else { + xyRatio.y = ratio; + } + this.workspace_.setMetrics(xyRatio); +}; + +/** + * Set the scrollbar slider's position. + * @param {number} value The distance from the top/left end of the bar. + */ +Blockly.Scrollbar.prototype.set = function(value) { + this.setHandlePosition(this.constrainHandle_(value * this.ratio_)); + this.onScroll_(); +}; + +/** + * Set the origin of the upper left of the scrollbar. This if for times + * when the scrollbar is used in an object whose origin isn't the same + * as the main workspace (e.g. in a flyout.) + * @param {number} x The x coordinate of the scrollbar's origin. + * @param {number} y The y coordinate of the scrollbar's origin. + */ +Blockly.Scrollbar.prototype.setOrigin = function(x, y) { + this.origin_ = new goog.math.Coordinate(x, y); +}; diff --git a/src/opsoro/server/static/js/blockly/core/toolbox.js b/src/opsoro/server/static/js/blockly/core/toolbox.js new file mode 100644 index 0000000..4f98199 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/toolbox.js @@ -0,0 +1,659 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2011 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Toolbox from whence to create blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Toolbox'); + +goog.require('Blockly.Flyout'); +goog.require('Blockly.Touch'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.events'); +goog.require('goog.events.BrowserFeature'); +goog.require('goog.html.SafeHtml'); +goog.require('goog.html.SafeStyle'); +goog.require('goog.math.Rect'); +goog.require('goog.style'); +goog.require('goog.ui.tree.TreeControl'); +goog.require('goog.ui.tree.TreeNode'); + + +/** + * Class for a Toolbox. + * Creates the toolbox's DOM. + * @param {!Blockly.Workspace} workspace The workspace in which to create new + * blocks. + * @constructor + */ +Blockly.Toolbox = function(workspace) { + /** + * @type {!Blockly.Workspace} + * @private + */ + this.workspace_ = workspace; + + /** + * Is RTL vs LTR. + * @type {boolean} + */ + this.RTL = workspace.options.RTL; + + /** + * Whether the toolbox should be laid out horizontally. + * @type {boolean} + * @private + */ + this.horizontalLayout_ = workspace.options.horizontalLayout; + + /** + * Position of the toolbox and flyout relative to the workspace. + * @type {number} + */ + this.toolboxPosition = workspace.options.toolboxPosition; + + /** + * Configuration constants for Closure's tree UI. + * @type {Object.} + * @private + */ + this.config_ = { + indentWidth: 19, + cssRoot: 'blocklyTreeRoot', + cssHideRoot: 'blocklyHidden', + cssItem: '', + cssTreeRow: 'blocklyTreeRow', + cssItemLabel: 'blocklyTreeLabel', + cssTreeIcon: 'blocklyTreeIcon', + cssExpandedFolderIcon: 'blocklyTreeIconOpen', + cssFileIcon: 'blocklyTreeIconNone', + cssSelectedRow: 'blocklyTreeSelected' + }; + + + /** + * Configuration constants for tree separator. + * @type {Object.} + * @private + */ + this.treeSeparatorConfig_ = { + cssTreeRow: 'blocklyTreeSeparator' + }; + + if (this.horizontalLayout_) { + this.config_['cssTreeRow'] = + this.config_['cssTreeRow'] + + (workspace.RTL ? + ' blocklyHorizontalTreeRtl' : ' blocklyHorizontalTree'); + + this.treeSeparatorConfig_['cssTreeRow'] = + 'blocklyTreeSeparatorHorizontal ' + + (workspace.RTL ? + 'blocklyHorizontalTreeRtl' : 'blocklyHorizontalTree'); + this.config_['cssTreeIcon'] = ''; + } +}; + +/** + * Width of the toolbox, which changes only in vertical layout. + * @type {number} + */ +Blockly.Toolbox.prototype.width = 0; + +/** + * Height of the toolbox, which changes only in horizontal layout. + * @type {number} + */ +Blockly.Toolbox.prototype.height = 0; + +/** + * The SVG group currently selected. + * @type {SVGGElement} + * @private + */ +Blockly.Toolbox.prototype.selectedOption_ = null; + +/** + * The tree node most recently selected. + * @type {goog.ui.tree.BaseNode} + * @private + */ +Blockly.Toolbox.prototype.lastCategory_ = null; + +/** + * Initializes the toolbox. + */ +Blockly.Toolbox.prototype.init = function() { + var workspace = this.workspace_; + var svg = this.workspace_.getParentSvg(); + + /** + * HTML container for the Toolbox menu. + * @type {Element} + */ + this.HtmlDiv = + goog.dom.createDom(goog.dom.TagName.DIV, 'blocklyToolboxDiv'); + this.HtmlDiv.setAttribute('dir', workspace.RTL ? 'RTL' : 'LTR'); + svg.parentNode.insertBefore(this.HtmlDiv, svg); + + // Clicking on toolbox closes popups. + Blockly.bindEventWithChecks_(this.HtmlDiv, 'mousedown', this, + function(e) { + if (Blockly.utils.isRightButton(e) || e.target == this.HtmlDiv) { + // Close flyout. + Blockly.hideChaff(false); + } else { + // Just close popups. + Blockly.hideChaff(true); + } + Blockly.Touch.clearTouchIdentifier(); // Don't block future drags. + }); + var workspaceOptions = { + disabledPatternId: workspace.options.disabledPatternId, + parentWorkspace: workspace, + RTL: workspace.RTL, + oneBasedIndex: workspace.options.oneBasedIndex, + horizontalLayout: workspace.horizontalLayout, + toolboxPosition: workspace.options.toolboxPosition + }; + /** + * @type {!Blockly.Flyout} + * @private + */ + this.flyout_ = new Blockly.Flyout(workspaceOptions); + goog.dom.insertSiblingAfter(this.flyout_.createDom('svg'), + this.workspace_.getParentSvg()); + this.flyout_.init(workspace); + + this.config_['cleardotPath'] = workspace.options.pathToMedia + '1x1.gif'; + this.config_['cssCollapsedFolderIcon'] = + 'blocklyTreeIconClosed' + (workspace.RTL ? 'Rtl' : 'Ltr'); + var tree = new Blockly.Toolbox.TreeControl(this, this.config_); + this.tree_ = tree; + tree.setShowRootNode(false); + tree.setShowLines(false); + tree.setShowExpandIcons(false); + tree.setSelectedItem(null); + var openNode = this.populate_(workspace.options.languageTree); + tree.render(this.HtmlDiv); + if (openNode) { + tree.setSelectedItem(openNode); + } + this.addColour_(); + this.position(); +}; + +/** + * Dispose of this toolbox. + */ +Blockly.Toolbox.prototype.dispose = function() { + this.flyout_.dispose(); + this.tree_.dispose(); + goog.dom.removeNode(this.HtmlDiv); + this.workspace_ = null; + this.lastCategory_ = null; +}; + +/** + * Get the width of the toolbox. + * @return {number} The width of the toolbox. + */ +Blockly.Toolbox.prototype.getWidth = function() { + return this.width; +}; + +/** + * Get the height of the toolbox. + * @return {number} The width of the toolbox. + */ +Blockly.Toolbox.prototype.getHeight = function() { + return this.height; +}; + +/** + * Move the toolbox to the edge. + */ +Blockly.Toolbox.prototype.position = function() { + var treeDiv = this.HtmlDiv; + if (!treeDiv) { + // Not initialized yet. + return; + } + var svg = this.workspace_.getParentSvg(); + var svgSize = Blockly.svgSize(svg); + if (this.horizontalLayout_) { + treeDiv.style.left = '0'; + treeDiv.style.height = 'auto'; + treeDiv.style.width = svgSize.width + 'px'; + this.height = treeDiv.offsetHeight; + if (this.toolboxPosition == Blockly.TOOLBOX_AT_TOP) { // Top + treeDiv.style.top = '0'; + } else { // Bottom + treeDiv.style.bottom = '0'; + } + } else { + if (this.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { // Right + treeDiv.style.right = '0'; + } else { // Left + treeDiv.style.left = '0'; + } + treeDiv.style.height = svgSize.height + 'px'; + this.width = treeDiv.offsetWidth; + } + this.flyout_.position(); +}; + +/** + * Fill the toolbox with categories and blocks. + * @param {!Node} newTree DOM tree of blocks. + * @return {Node} Tree node to open at startup (or null). + * @private + */ +Blockly.Toolbox.prototype.populate_ = function(newTree) { + this.tree_.removeChildren(); // Delete any existing content. + this.tree_.blocks = []; + this.hasColours_ = false; + var openNode = + this.syncTrees_(newTree, this.tree_, this.workspace_.options.pathToMedia); + + if (this.tree_.blocks.length) { + throw 'Toolbox cannot have both blocks and categories in the root level.'; + } + + // Fire a resize event since the toolbox may have changed width and height. + this.workspace_.resizeContents(); + return openNode; +}; + +/** + * Sync trees of the toolbox. + * @param {!Node} treeIn DOM tree of blocks. + * @param {!Blockly.Toolbox.TreeControl} treeOut + * @param {string} pathToMedia + * @return {Node} Tree node to open at startup (or null). + * @private + */ +Blockly.Toolbox.prototype.syncTrees_ = function(treeIn, treeOut, pathToMedia) { + var openNode = null; + var lastElement = null; + for (var i = 0, childIn; childIn = treeIn.childNodes[i]; i++) { + if (!childIn.tagName) { + // Skip over text. + continue; + } + switch (childIn.tagName.toUpperCase()) { + case 'CATEGORY': + var childOut = this.tree_.createNode(childIn.getAttribute('name')); + childOut.blocks = []; + treeOut.add(childOut); + var custom = childIn.getAttribute('custom'); + if (custom) { + // Variables and procedures are special dynamic categories. + childOut.blocks = custom; + } else { + var newOpenNode = this.syncTrees_(childIn, childOut, pathToMedia); + if (newOpenNode) { + openNode = newOpenNode; + } + } + var colour = childIn.getAttribute('colour'); + if (goog.isString(colour)) { + if (colour.match(/^#[0-9a-fA-F]{6}$/)) { + childOut.hexColour = colour; + } else { + childOut.hexColour = Blockly.hueToRgb(colour); + } + this.hasColours_ = true; + } else { + childOut.hexColour = ''; + } + if (childIn.getAttribute('expanded') == 'true') { + if (childOut.blocks.length) { + // This is a category that directly contains blocks. + // After the tree is rendered, open this category and show flyout. + openNode = childOut; + } + childOut.setExpanded(true); + } else { + childOut.setExpanded(false); + } + lastElement = childIn; + break; + case 'SEP': + if (lastElement) { + if (lastElement.tagName.toUpperCase() == 'CATEGORY') { + // Separator between two categories. + // + treeOut.add(new Blockly.Toolbox.TreeSeparator( + this.treeSeparatorConfig_)); + } else { + // Change the gap between two blocks. + // + // The default gap is 24, can be set larger or smaller. + // Note that a deprecated method is to add a gap to a block. + // + var newGap = parseFloat(childIn.getAttribute('gap')); + if (!isNaN(newGap) && lastElement) { + lastElement.setAttribute('gap', newGap); + } + } + } + break; + case 'BLOCK': + case 'SHADOW': + case 'LABEL': + case 'BUTTON': + treeOut.blocks.push(childIn); + lastElement = childIn; + break; + } + } + return openNode; +}; + +/** + * Recursively add colours to this toolbox. + * @param {Blockly.Toolbox.TreeNode} opt_tree Starting point of tree. + * Defaults to the root node. + * @private + */ +Blockly.Toolbox.prototype.addColour_ = function(opt_tree) { + var tree = opt_tree || this.tree_; + var children = tree.getChildren(); + for (var i = 0, child; child = children[i]; i++) { + var element = child.getRowElement(); + if (element) { + if (this.hasColours_) { + var border = '8px solid ' + (child.hexColour || '#ddd'); + } else { + var border = 'none'; + } + if (this.workspace_.RTL) { + element.style.borderRight = border; + } else { + element.style.borderLeft = border; + } + } + this.addColour_(child); + } +}; + +/** + * Unhighlight any previously specified option. + */ +Blockly.Toolbox.prototype.clearSelection = function() { + this.tree_.setSelectedItem(null); +}; + +/** + * Return the deletion rectangle for this toolbox. + * @return {goog.math.Rect} Rectangle in which to delete. + */ +Blockly.Toolbox.prototype.getClientRect = function() { + if (!this.HtmlDiv) { + return null; + } + + // BIG_NUM is offscreen padding so that blocks dragged beyond the toolbox + // area are still deleted. Must be smaller than Infinity, but larger than + // the largest screen size. + var BIG_NUM = 10000000; + var toolboxRect = this.HtmlDiv.getBoundingClientRect(); + + var x = toolboxRect.left; + var y = toolboxRect.top; + var width = toolboxRect.width; + var height = toolboxRect.height; + + // Assumes that the toolbox is on the SVG edge. If this changes + // (e.g. toolboxes in mutators) then this code will need to be more complex. + if (this.toolboxPosition == Blockly.TOOLBOX_AT_LEFT) { + return new goog.math.Rect(-BIG_NUM, -BIG_NUM, BIG_NUM + x + width, + 2 * BIG_NUM); + } else if (this.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { + return new goog.math.Rect(x, -BIG_NUM, BIG_NUM + width, 2 * BIG_NUM); + } else if (this.toolboxPosition == Blockly.TOOLBOX_AT_TOP) { + return new goog.math.Rect(-BIG_NUM, -BIG_NUM, 2 * BIG_NUM, + BIG_NUM + y + height); + } else { // Bottom + return new goog.math.Rect(0, y, 2 * BIG_NUM, BIG_NUM + width); + } +}; + +/** + * Update the flyout's contents without closing it. Should be used in response + * to a change in one of the dynamic categories, such as variables or + * procedures. + */ +Blockly.Toolbox.prototype.refreshSelection = function() { + var selectedItem = this.tree_.getSelectedItem(); + if (selectedItem && selectedItem.blocks) { + this.flyout_.show(selectedItem.blocks); + } +}; + +// Extending Closure's Tree UI. + +/** + * Extension of a TreeControl object that uses a custom tree node. + * @param {Blockly.Toolbox} toolbox The parent toolbox for this tree. + * @param {Object} config The configuration for the tree. See + * goog.ui.tree.TreeControl.DefaultConfig. + * @constructor + * @extends {goog.ui.tree.TreeControl} + */ +Blockly.Toolbox.TreeControl = function(toolbox, config) { + this.toolbox_ = toolbox; + goog.ui.tree.TreeControl.call(this, goog.html.SafeHtml.EMPTY, config); +}; +goog.inherits(Blockly.Toolbox.TreeControl, goog.ui.tree.TreeControl); + +/** + * Adds touch handling to TreeControl. + * @override + */ +Blockly.Toolbox.TreeControl.prototype.enterDocument = function() { + Blockly.Toolbox.TreeControl.superClass_.enterDocument.call(this); + + // Add touch handler. + if (goog.events.BrowserFeature.TOUCH_ENABLED) { + var el = this.getElement(); + Blockly.bindEventWithChecks_(el, goog.events.EventType.TOUCHSTART, this, + this.handleTouchEvent_); + } +}; + +/** + * Handles touch events. + * @param {!goog.events.BrowserEvent} e The browser event. + * @private + */ +Blockly.Toolbox.TreeControl.prototype.handleTouchEvent_ = function(e) { + e.preventDefault(); + var node = this.getNodeFromEvent_(e); + if (node && e.type === goog.events.EventType.TOUCHSTART) { + // Fire asynchronously since onMouseDown takes long enough that the browser + // would fire the default mouse event before this method returns. + setTimeout(function() { + node.onMouseDown(e); // Same behaviour for click and touch. + }, 1); + } +}; + +/** + * Creates a new tree node using a custom tree node. + * @param {string=} opt_html The HTML content of the node label. + * @return {!goog.ui.tree.TreeNode} The new item. + * @override + */ +Blockly.Toolbox.TreeControl.prototype.createNode = function(opt_html) { + return new Blockly.Toolbox.TreeNode(this.toolbox_, opt_html ? + goog.html.SafeHtml.htmlEscape(opt_html) : goog.html.SafeHtml.EMPTY, + this.getConfig(), this.getDomHelper()); +}; + +/** + * Display/hide the flyout when an item is selected. + * @param {goog.ui.tree.BaseNode} node The item to select. + * @override + */ +Blockly.Toolbox.TreeControl.prototype.setSelectedItem = function(node) { + var toolbox = this.toolbox_; + if (node == this.selectedItem_ || node == toolbox.tree_) { + return; + } + if (toolbox.lastCategory_) { + toolbox.lastCategory_.getRowElement().style.backgroundColor = ''; + } + if (node) { + var hexColour = node.hexColour || '#57e'; + node.getRowElement().style.backgroundColor = hexColour; + // Add colours to child nodes which may have been collapsed and thus + // not rendered. + toolbox.addColour_(node); + } + var oldNode = this.getSelectedItem(); + goog.ui.tree.TreeControl.prototype.setSelectedItem.call(this, node); + if (node && node.blocks && node.blocks.length) { + toolbox.flyout_.show(node.blocks); + // Scroll the flyout to the top if the category has changed. + if (toolbox.lastCategory_ != node) { + toolbox.flyout_.scrollToStart(); + } + } else { + // Hide the flyout. + toolbox.flyout_.hide(); + } + if (oldNode != node && oldNode != this) { + var event = new Blockly.Events.Ui(null, 'category', + oldNode && oldNode.getHtml(), node && node.getHtml()); + event.workspaceId = toolbox.workspace_.id; + Blockly.Events.fire(event); + } + if (node) { + toolbox.lastCategory_ = node; + } +}; + +/** + * A single node in the tree, customized for Blockly's UI. + * @param {Blockly.Toolbox} toolbox The parent toolbox for this tree. + * @param {!goog.html.SafeHtml} html The HTML content of the node label. + * @param {Object=} opt_config The configuration for the tree. See + * goog.ui.tree.TreeControl.DefaultConfig. If not specified, a default config + * will be used. + * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper. + * @constructor + * @extends {goog.ui.tree.TreeNode} + */ +Blockly.Toolbox.TreeNode = function(toolbox, html, opt_config, opt_domHelper) { + goog.ui.tree.TreeNode.call(this, html, opt_config, opt_domHelper); + if (toolbox) { + var resize = function() { + // Even though the div hasn't changed size, the visible workspace + // surface of the workspace has, so we may need to reposition everything. + Blockly.svgResize(toolbox.workspace_); + }; + // Fire a resize event since the toolbox may have changed width. + goog.events.listen(toolbox.tree_, + goog.ui.tree.BaseNode.EventType.EXPAND, resize); + goog.events.listen(toolbox.tree_, + goog.ui.tree.BaseNode.EventType.COLLAPSE, resize); + } +}; +goog.inherits(Blockly.Toolbox.TreeNode, goog.ui.tree.TreeNode); + +/** + * Suppress population of the +/- icon. + * @return {!goog.html.SafeHtml} The source for the icon. + * @override + */ +Blockly.Toolbox.TreeNode.prototype.getExpandIconSafeHtml = function() { + return goog.html.SafeHtml.create('span'); +}; + +/** + * Expand or collapse the node on mouse click. + * @param {!goog.events.BrowserEvent} e The browser event. + * @override + */ +Blockly.Toolbox.TreeNode.prototype.onMouseDown = function(e) { + // Expand icon. + if (this.hasChildren() && this.isUserCollapsible_) { + this.toggle(); + this.select(); + } else if (this.isSelected()) { + this.getTree().setSelectedItem(null); + } else { + this.select(); + } + this.updateRow(); +}; + +/** + * Suppress the inherited double-click behaviour. + * @param {!goog.events.BrowserEvent} e The browser event. + * @override + * @private + */ +Blockly.Toolbox.TreeNode.prototype.onDoubleClick_ = function(e) { + // NOP. +}; + +/** + * Remap event.keyCode in horizontalLayout so that arrow + * keys work properly and call original onKeyDown handler. + * @param {!goog.events.BrowserEvent} e The browser event. + * @return {boolean} The handled value. + * @override + * @private + */ +Blockly.Toolbox.TreeNode.prototype.onKeyDown = function(e) { + if (this.tree.toolbox_.horizontalLayout_) { + var map = {}; + var next = goog.events.KeyCodes.DOWN; + var prev = goog.events.KeyCodes.UP; + map[goog.events.KeyCodes.RIGHT] = this.rightToLeft_ ? prev : next; + map[goog.events.KeyCodes.LEFT] = this.rightToLeft_ ? next : prev; + map[goog.events.KeyCodes.UP] = goog.events.KeyCodes.LEFT; + map[goog.events.KeyCodes.DOWN] = goog.events.KeyCodes.RIGHT; + + var newKeyCode = map[e.keyCode]; + e.keyCode = newKeyCode || e.keyCode; + } + return Blockly.Toolbox.TreeNode.superClass_.onKeyDown.call(this, e); +}; + +/** + * A blank separator node in the tree. + * @param {Object=} config The configuration for the tree. See + * goog.ui.tree.TreeControl.DefaultConfig. If not specified, a default config + * will be used. + * @constructor + * @extends {Blockly.Toolbox.TreeNode} + */ +Blockly.Toolbox.TreeSeparator = function(config) { + Blockly.Toolbox.TreeNode.call(this, null, '', config); +}; +goog.inherits(Blockly.Toolbox.TreeSeparator, Blockly.Toolbox.TreeNode); diff --git a/src/opsoro/server/static/js/blockly/core/tooltip.js b/src/opsoro/server/static/js/blockly/core/tooltip.js new file mode 100644 index 0000000..310e6b9 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/tooltip.js @@ -0,0 +1,296 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2011 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Library to create tooltips for Blockly. + * First, call Blockly.Tooltip.init() after onload. + * Second, set the 'tooltip' property on any SVG element that needs a tooltip. + * If the tooltip is a string, then that message will be displayed. + * If the tooltip is an SVG element, then that object's tooltip will be used. + * Third, call Blockly.Tooltip.bindMouseEvents(e) passing the SVG element. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +/** + * @name Blockly.Tooltip + * @namespace + **/ +goog.provide('Blockly.Tooltip'); + +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); + + +/** + * Is a tooltip currently showing? + */ +Blockly.Tooltip.visible = false; + +/** + * Maximum width (in characters) of a tooltip. + */ +Blockly.Tooltip.LIMIT = 50; + +/** + * PID of suspended thread to clear tooltip on mouse out. + * @private + */ +Blockly.Tooltip.mouseOutPid_ = 0; + +/** + * PID of suspended thread to show the tooltip. + * @private + */ +Blockly.Tooltip.showPid_ = 0; + +/** + * Last observed X location of the mouse pointer (freezes when tooltip appears). + * @private + */ +Blockly.Tooltip.lastX_ = 0; + +/** + * Last observed Y location of the mouse pointer (freezes when tooltip appears). + * @private + */ +Blockly.Tooltip.lastY_ = 0; + +/** + * Current element being pointed at. + * @private + */ +Blockly.Tooltip.element_ = null; + +/** + * Once a tooltip has opened for an element, that element is 'poisoned' and + * cannot respawn a tooltip until the pointer moves over a different element. + * @private + */ +Blockly.Tooltip.poisonedElement_ = null; + +/** + * Horizontal offset between mouse cursor and tooltip. + */ +Blockly.Tooltip.OFFSET_X = 0; + +/** + * Vertical offset between mouse cursor and tooltip. + */ +Blockly.Tooltip.OFFSET_Y = 10; + +/** + * Radius mouse can move before killing tooltip. + */ +Blockly.Tooltip.RADIUS_OK = 10; + +/** + * Delay before tooltip appears. + */ +Blockly.Tooltip.HOVER_MS = 750; + +/** + * Horizontal padding between tooltip and screen edge. + */ +Blockly.Tooltip.MARGINS = 5; + +/** + * The HTML container. Set once by Blockly.Tooltip.createDom. + * @type {Element} + */ +Blockly.Tooltip.DIV = null; + +/** + * Create the tooltip div and inject it onto the page. + */ +Blockly.Tooltip.createDom = function() { + if (Blockly.Tooltip.DIV) { + return; // Already created. + } + // Create an HTML container for popup overlays (e.g. editor widgets). + Blockly.Tooltip.DIV = + goog.dom.createDom(goog.dom.TagName.DIV, 'blocklyTooltipDiv'); + document.body.appendChild(Blockly.Tooltip.DIV); +}; + +/** + * Binds the required mouse events onto an SVG element. + * @param {!Element} element SVG element onto which tooltip is to be bound. + */ +Blockly.Tooltip.bindMouseEvents = function(element) { + Blockly.bindEvent_(element, 'mouseover', null, + Blockly.Tooltip.onMouseOver_); + Blockly.bindEvent_(element, 'mouseout', null, + Blockly.Tooltip.onMouseOut_); + + // Don't use bindEvent_ for mousemove since that would create a + // corresponding touch handler, even though this only makes sense in the + // context of a mouseover/mouseout. + element.addEventListener('mousemove', Blockly.Tooltip.onMouseMove_, false); +}; + +/** + * Hide the tooltip if the mouse is over a different object. + * Initialize the tooltip to potentially appear for this object. + * @param {!Event} e Mouse event. + * @private + */ +Blockly.Tooltip.onMouseOver_ = function(e) { + // If the tooltip is an object, treat it as a pointer to the next object in + // the chain to look at. Terminate when a string or function is found. + var element = e.target; + while (!goog.isString(element.tooltip) && !goog.isFunction(element.tooltip)) { + element = element.tooltip; + } + if (Blockly.Tooltip.element_ != element) { + Blockly.Tooltip.hide(); + Blockly.Tooltip.poisonedElement_ = null; + Blockly.Tooltip.element_ = element; + } + // Forget about any immediately preceding mouseOut event. + clearTimeout(Blockly.Tooltip.mouseOutPid_); +}; + +/** + * Hide the tooltip if the mouse leaves the object and enters the workspace. + * @param {!Event} e Mouse event. + * @private + */ +Blockly.Tooltip.onMouseOut_ = function(e) { + // Moving from one element to another (overlapping or with no gap) generates + // a mouseOut followed instantly by a mouseOver. Fork off the mouseOut + // event and kill it if a mouseOver is received immediately. + // This way the task only fully executes if mousing into the void. + Blockly.Tooltip.mouseOutPid_ = setTimeout(function() { + Blockly.Tooltip.element_ = null; + Blockly.Tooltip.poisonedElement_ = null; + Blockly.Tooltip.hide(); + }, 1); + clearTimeout(Blockly.Tooltip.showPid_); +}; + +/** + * When hovering over an element, schedule a tooltip to be shown. If a tooltip + * is already visible, hide it if the mouse strays out of a certain radius. + * @param {!Event} e Mouse event. + * @private + */ +Blockly.Tooltip.onMouseMove_ = function(e) { + if (!Blockly.Tooltip.element_ || !Blockly.Tooltip.element_.tooltip) { + // No tooltip here to show. + return; + } else if (Blockly.dragMode_ != Blockly.DRAG_NONE) { + // Don't display a tooltip during a drag. + return; + } else if (Blockly.WidgetDiv.isVisible()) { + // Don't display a tooltip if a widget is open (tooltip would be under it). + return; + } + if (Blockly.Tooltip.visible) { + // Compute the distance between the mouse position when the tooltip was + // shown and the current mouse position. Pythagorean theorem. + var dx = Blockly.Tooltip.lastX_ - e.pageX; + var dy = Blockly.Tooltip.lastY_ - e.pageY; + if (Math.sqrt(dx * dx + dy * dy) > Blockly.Tooltip.RADIUS_OK) { + Blockly.Tooltip.hide(); + } + } else if (Blockly.Tooltip.poisonedElement_ != Blockly.Tooltip.element_) { + // The mouse moved, clear any previously scheduled tooltip. + clearTimeout(Blockly.Tooltip.showPid_); + // Maybe this time the mouse will stay put. Schedule showing of tooltip. + Blockly.Tooltip.lastX_ = e.pageX; + Blockly.Tooltip.lastY_ = e.pageY; + Blockly.Tooltip.showPid_ = + setTimeout(Blockly.Tooltip.show_, Blockly.Tooltip.HOVER_MS); + } +}; + +/** + * Hide the tooltip. + */ +Blockly.Tooltip.hide = function() { + if (Blockly.Tooltip.visible) { + Blockly.Tooltip.visible = false; + if (Blockly.Tooltip.DIV) { + Blockly.Tooltip.DIV.style.display = 'none'; + } + } + clearTimeout(Blockly.Tooltip.showPid_); +}; + +/** + * Create the tooltip and show it. + * @private + */ +Blockly.Tooltip.show_ = function() { + Blockly.Tooltip.poisonedElement_ = Blockly.Tooltip.element_; + if (!Blockly.Tooltip.DIV) { + return; + } + // Erase all existing text. + goog.dom.removeChildren(/** @type {!Element} */ (Blockly.Tooltip.DIV)); + // Get the new text. + var tip = Blockly.Tooltip.element_.tooltip; + while (goog.isFunction(tip)) { + tip = tip(); + } + tip = Blockly.utils.wrap(tip, Blockly.Tooltip.LIMIT); + // Create new text, line by line. + var lines = tip.split('\n'); + for (var i = 0; i < lines.length; i++) { + var div = document.createElement('div'); + div.appendChild(document.createTextNode(lines[i])); + Blockly.Tooltip.DIV.appendChild(div); + } + var rtl = Blockly.Tooltip.element_.RTL; + var windowSize = goog.dom.getViewportSize(); + // Display the tooltip. + Blockly.Tooltip.DIV.style.direction = rtl ? 'rtl' : 'ltr'; + Blockly.Tooltip.DIV.style.display = 'block'; + Blockly.Tooltip.visible = true; + // Move the tooltip to just below the cursor. + var anchorX = Blockly.Tooltip.lastX_; + if (rtl) { + anchorX -= Blockly.Tooltip.OFFSET_X + Blockly.Tooltip.DIV.offsetWidth; + } else { + anchorX += Blockly.Tooltip.OFFSET_X; + } + var anchorY = Blockly.Tooltip.lastY_ + Blockly.Tooltip.OFFSET_Y; + + if (anchorY + Blockly.Tooltip.DIV.offsetHeight > + windowSize.height + window.scrollY) { + // Falling off the bottom of the screen; shift the tooltip up. + anchorY -= Blockly.Tooltip.DIV.offsetHeight + 2 * Blockly.Tooltip.OFFSET_Y; + } + if (rtl) { + // Prevent falling off left edge in RTL mode. + anchorX = Math.max(Blockly.Tooltip.MARGINS - window.scrollX, anchorX); + } else { + if (anchorX + Blockly.Tooltip.DIV.offsetWidth > + windowSize.width + window.scrollX - 2 * Blockly.Tooltip.MARGINS) { + // Falling off the right edge of the screen; + // clamp the tooltip on the edge. + anchorX = windowSize.width - Blockly.Tooltip.DIV.offsetWidth - + 2 * Blockly.Tooltip.MARGINS; + } + } + Blockly.Tooltip.DIV.style.top = anchorY + 'px'; + Blockly.Tooltip.DIV.style.left = anchorX + 'px'; +}; diff --git a/src/opsoro/server/static/js/blockly/core/touch.js b/src/opsoro/server/static/js/blockly/core/touch.js new file mode 100644 index 0000000..b736151 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/touch.js @@ -0,0 +1,279 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Touch handling for Blockly. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +/** + * @name Blockly.Touch + * @namespace + **/ +goog.provide('Blockly.Touch'); + +goog.require('goog.events'); +goog.require('goog.events.BrowserFeature'); +goog.require('goog.string'); + +/** + * Which touch events are we currently paying attention to? + * @type {DOMString} + * @private + */ +Blockly.Touch.touchIdentifier_ = null; + +/** + * Wrapper function called when a touch mouseUp occurs during a drag operation. + * @type {Array.} + * @private + */ +Blockly.Touch.onTouchUpWrapper_ = null; + +/** + * The TOUCH_MAP lookup dictionary specifies additional touch events to fire, + * in conjunction with mouse events. + * @type {Object} + */ +Blockly.Touch.TOUCH_MAP = {}; +if (goog.events.BrowserFeature.TOUCH_ENABLED) { + Blockly.Touch.TOUCH_MAP = { + 'mousedown': ['touchstart'], + 'mousemove': ['touchmove'], + 'mouseup': ['touchend', 'touchcancel'] + }; +} + +/** + * PID of queued long-press task. + * @private + */ +Blockly.longPid_ = 0; + +/** + * Context menus on touch devices are activated using a long-press. + * Unfortunately the contextmenu touch event is currently (2015) only suported + * by Chrome. This function is fired on any touchstart event, queues a task, + * which after about a second opens the context menu. The tasks is killed + * if the touch event terminates early. + * @param {!Event} e Touch start event. + * @param {!Blockly.Block|!Blockly.WorkspaceSvg} uiObject The block or workspace + * under the touchstart event. + * @private + */ +Blockly.longStart_ = function(e, uiObject) { + Blockly.longStop_(); + // Punt on multitouch events. + if (e.changedTouches.length != 1) { + return; + } + Blockly.longPid_ = setTimeout(function() { + e.button = 2; // Simulate a right button click. + // e was a touch event. It needs to pretend to be a mouse event. + e.clientX = e.changedTouches[0].clientX; + e.clientY = e.changedTouches[0].clientY; + uiObject.onMouseDown_(e); + }, Blockly.LONGPRESS); +}; + +/** + * Nope, that's not a long-press. Either touchend or touchcancel was fired, + * or a drag hath begun. Kill the queued long-press task. + * @private + */ +Blockly.longStop_ = function() { + if (Blockly.longPid_) { + clearTimeout(Blockly.longPid_); + Blockly.longPid_ = 0; + } +}; + + +/** + * Handle a mouse-up anywhere on the page. + * @param {!Event} e Mouse up event. + * @private + */ +Blockly.onMouseUp_ = function(e) { + var workspace = Blockly.getMainWorkspace(); + if (workspace.dragMode_ == Blockly.DRAG_NONE) { + return; + } + Blockly.Touch.clearTouchIdentifier(); + + // TODO(#781): Check whether this needs to be called for all drag modes. + workspace.resetDragSurface(); + Blockly.Css.setCursor(Blockly.Css.Cursor.OPEN); + workspace.dragMode_ = Blockly.DRAG_NONE; + // Unbind the touch event if it exists. + if (Blockly.Touch.onTouchUpWrapper_) { + Blockly.unbindEvent_(Blockly.Touch.onTouchUpWrapper_); + Blockly.Touch.onTouchUpWrapper_ = null; + } + if (Blockly.onMouseMoveWrapper_) { + Blockly.unbindEvent_(Blockly.onMouseMoveWrapper_); + Blockly.onMouseMoveWrapper_ = null; + } +}; + +/** + * Handle a mouse-move on SVG drawing surface. + * @param {!Event} e Mouse move event. + * @private + */ +Blockly.onMouseMove_ = function(e) { + var workspace = Blockly.getMainWorkspace(); + if (workspace.dragMode_ != Blockly.DRAG_NONE) { + var dx = e.clientX - workspace.startDragMouseX; + var dy = e.clientY - workspace.startDragMouseY; + var metrics = workspace.startDragMetrics; + var x = workspace.startScrollX + dx; + var y = workspace.startScrollY + dy; + x = Math.min(x, -metrics.contentLeft); + y = Math.min(y, -metrics.contentTop); + x = Math.max(x, metrics.viewWidth - metrics.contentLeft - + metrics.contentWidth); + y = Math.max(y, metrics.viewHeight - metrics.contentTop - + metrics.contentHeight); + + // Move the scrollbars and the page will scroll automatically. + workspace.scrollbar.set(-x - metrics.contentLeft, + -y - metrics.contentTop); + // Cancel the long-press if the drag has moved too far. + if (Math.sqrt(dx * dx + dy * dy) > Blockly.DRAG_RADIUS) { + Blockly.longStop_(); + workspace.dragMode_ = Blockly.DRAG_FREE; + } + e.stopPropagation(); + e.preventDefault(); + } +}; + +/** + * Clear the touch identifier that tracks which touch stream to pay attention + * to. This ends the current drag/gesture and allows other pointers to be + * captured. + */ +Blockly.Touch.clearTouchIdentifier = function() { + Blockly.Touch.touchIdentifier_ = null; +}; + +/** + * Decide whether Blockly should handle or ignore this event. + * Mouse and touch events require special checks because we only want to deal + * with one touch stream at a time. All other events should always be handled. + * @param {!Event} e The event to check. + * @return {boolean} True if this event should be passed through to the + * registered handler; false if it should be blocked. + */ +Blockly.Touch.shouldHandleEvent = function(e) { + return !Blockly.Touch.isMouseOrTouchEvent(e) || + Blockly.Touch.checkTouchIdentifier(e); +}; + +/** + * Check whether the touch identifier on the event matches the current saved + * identifier. If there is no identifier, that means it's a mouse event and + * we'll use the identifier "mouse". This means we won't deal well with + * multiple mice being used at the same time. That seems okay. + * If the current identifier was unset, save the identifier from the + * event. This starts a drag/gesture, during which touch events with other + * identifiers will be silently ignored. + * @param {!Event} e Mouse event or touch event. + * @return {boolean} Whether the identifier on the event matches the current + * saved identifier. + */ +Blockly.Touch.checkTouchIdentifier = function(e) { + var identifier = (e.changedTouches && e.changedTouches[0] && + e.changedTouches[0].identifier != undefined && + e.changedTouches[0].identifier != null) ? + e.changedTouches[0].identifier : 'mouse'; + + // if (Blockly.touchIdentifier_ )is insufficient because android touch + // identifiers may be zero. + if (Blockly.Touch.touchIdentifier_ != undefined && + Blockly.Touch.touchIdentifier_ != null) { + // We're already tracking some touch/mouse event. Is this from the same + // source? + return Blockly.Touch.touchIdentifier_ == identifier; + } + if (e.type == 'mousedown' || e.type == 'touchstart') { + // No identifier set yet, and this is the start of a drag. Set it and + // return. + Blockly.Touch.touchIdentifier_ = identifier; + return true; + } + // There was no identifier yet, but this wasn't a start event so we're going + // to ignore it. This probably means that another drag finished while this + // pointer was down. + return false; +}; + +/** + * Set an event's clientX and clientY from its first changed touch. Use this to + * make a touch event work in a mouse event handler. + * @param {!Event} e A touch event. + */ +Blockly.Touch.setClientFromTouch = function(e) { + if (goog.string.startsWith(e.type, 'touch')) { + // Map the touch event's properties to the event. + var touchPoint = e.changedTouches[0]; + e.clientX = touchPoint.clientX; + e.clientY = touchPoint.clientY; + } +}; + +/** + * Check whether a given event is a mouse or touch event. + * @param {!Event} e An event. + * @return {boolean} true if it is a mouse or touch event; false otherwise. + */ +Blockly.Touch.isMouseOrTouchEvent = function(e) { + return goog.string.startsWith(e.type, 'touch') || + goog.string.startsWith(e.type, 'mouse'); +}; + +/** + * Split an event into an array of events, one per changed touch or mouse + * point. + * @param {!Event} e A mouse event or a touch event with one or more changed + * touches. + * @return {!Array.} An array of mouse or touch events. Each touch + * event will have exactly one changed touch. + */ +Blockly.Touch.splitEventByTouches = function(e) { + var events = []; + if (e.changedTouches) { + for (var i = 0; i < e.changedTouches.length; i++) { + var newEvent = { + type: e.type, + changedTouches: [e.changedTouches[i]], + target: e.target, + stopPropagation: function(){ e.stopPropagation(); }, + preventDefault: function(){ e.preventDefault(); } + }; + events[i] = newEvent; + } + } else { + events.push(e); + } + return events; +}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/trashcan.js b/src/opsoro/server/static/js/blockly/core/trashcan.js similarity index 75% rename from src/opsoro/apps/visual_programming/static/blockly/core/trashcan.js rename to src/opsoro/server/static/js/blockly/core/trashcan.js index ef491a0..7373a0b 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/core/trashcan.js +++ b/src/opsoro/server/static/js/blockly/core/trashcan.js @@ -81,7 +81,21 @@ Blockly.Trashcan.prototype.MARGIN_SIDE_ = 20; * @type {number} * @private */ -Blockly.Trashcan.prototype.MARGIN_HOTSPOT_ = 25; +Blockly.Trashcan.prototype.MARGIN_HOTSPOT_ = 10; + +/** + * Location of trashcan in sprite image. + * @type {number} + * @private + */ +Blockly.Trashcan.prototype.SPRITE_LEFT_ = 0; + +/** + * Location of trashcan in sprite image. + * @type {number} + * @private + */ +Blockly.Trashcan.prototype.SPRITE_TOP_ = 32; /** * Current open/close state of the lid. @@ -150,35 +164,38 @@ Blockly.Trashcan.prototype.createDom = function() { clip-path="url(#blocklyTrashLidClipPath837493)"> */ - this.svgGroup_ = Blockly.createSvgElement('g', + this.svgGroup_ = Blockly.utils.createSvgElement('g', {'class': 'blocklyTrash'}, null); var rnd = String(Math.random()).substring(2); - var clip = Blockly.createSvgElement('clipPath', + var clip = Blockly.utils.createSvgElement('clipPath', {'id': 'blocklyTrashBodyClipPath' + rnd}, this.svgGroup_); - Blockly.createSvgElement('rect', + Blockly.utils.createSvgElement('rect', {'width': this.WIDTH_, 'height': this.BODY_HEIGHT_, 'y': this.LID_HEIGHT_}, clip); - var body = Blockly.createSvgElement('image', - {'width': Blockly.SPRITE.width, 'height': Blockly.SPRITE.height, 'y': -32, + var body = Blockly.utils.createSvgElement('image', + {'width': Blockly.SPRITE.width, 'x': -this.SPRITE_LEFT_, + 'height': Blockly.SPRITE.height, 'y': -this.SPRITE_TOP_, 'clip-path': 'url(#blocklyTrashBodyClipPath' + rnd + ')'}, this.svgGroup_); body.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', this.workspace_.options.pathToMedia + Blockly.SPRITE.url); - var clip = Blockly.createSvgElement('clipPath', + var clip = Blockly.utils.createSvgElement('clipPath', {'id': 'blocklyTrashLidClipPath' + rnd}, this.svgGroup_); - Blockly.createSvgElement('rect', + Blockly.utils.createSvgElement('rect', {'width': this.WIDTH_, 'height': this.LID_HEIGHT_}, clip); - this.svgLid_ = Blockly.createSvgElement('image', - {'width': Blockly.SPRITE.width, 'height': Blockly.SPRITE.height, 'y': -32, + this.svgLid_ = Blockly.utils.createSvgElement('image', + {'width': Blockly.SPRITE.width, 'x': -this.SPRITE_LEFT_, + 'height': Blockly.SPRITE.height, 'y': -this.SPRITE_TOP_, 'clip-path': 'url(#blocklyTrashLidClipPath' + rnd + ')'}, this.svgGroup_); this.svgLid_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', this.workspace_.options.pathToMedia + Blockly.SPRITE.url); + Blockly.bindEventWithChecks_(this.svgGroup_, 'mouseup', this, this.click); this.animateLid_(); return this.svgGroup_; }; @@ -189,7 +206,7 @@ Blockly.Trashcan.prototype.createDom = function() { * @return {number} Distance from workspace bottom to the top of trashcan. */ Blockly.Trashcan.prototype.init = function(bottom) { - this.bottom_ = this.MARGIN_BOTTOM_ + bottom; + this.bottom_ = this.MARGIN_BOTTOM_ + bottom; this.setOpen_(false); return this.bottom_ + this.BODY_HEIGHT_ + this.LID_HEIGHT_; }; @@ -219,12 +236,26 @@ Blockly.Trashcan.prototype.position = function() { } if (this.workspace_.RTL) { this.left_ = this.MARGIN_SIDE_ + Blockly.Scrollbar.scrollbarThickness; + if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_LEFT) { + this.left_ += metrics.flyoutWidth; + if (this.workspace_.toolbox_) { + this.left_ += metrics.absoluteLeft; + } + } } else { this.left_ = metrics.viewWidth + metrics.absoluteLeft - this.WIDTH_ - this.MARGIN_SIDE_ - Blockly.Scrollbar.scrollbarThickness; + + if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { + this.left_ -= metrics.flyoutWidth; + } } this.top_ = metrics.viewHeight + metrics.absoluteTop - (this.BODY_HEIGHT_ + this.LID_HEIGHT_) - this.bottom_; + + if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_BOTTOM) { + this.top_ -= metrics.flyoutHeight; + } this.svgGroup_.setAttribute('transform', 'translate(' + this.left_ + ',' + this.top_ + ')'); }; @@ -233,13 +264,18 @@ Blockly.Trashcan.prototype.position = function() { * Return the deletion rectangle for this trash can. * @return {goog.math.Rect} Rectangle in which to delete. */ -Blockly.Trashcan.prototype.getRect = function() { - var trashXY = Blockly.getSvgXY_(this.svgGroup_, this.workspace_); - return new goog.math.Rect( - trashXY.x - this.MARGIN_HOTSPOT_, - trashXY.y - this.MARGIN_HOTSPOT_, - this.WIDTH_ + 2 * this.MARGIN_HOTSPOT_, - this.BODY_HEIGHT_ + this.LID_HEIGHT_ + 2 * this.MARGIN_HOTSPOT_); +Blockly.Trashcan.prototype.getClientRect = function() { + if (!this.svgGroup_) { + return null; + } + + var trashRect = this.svgGroup_.getBoundingClientRect(); + var left = trashRect.left + this.SPRITE_LEFT_ - this.MARGIN_HOTSPOT_; + var top = trashRect.top + this.SPRITE_TOP_ - this.MARGIN_HOTSPOT_; + var width = this.WIDTH_ + 2 * this.MARGIN_HOTSPOT_; + var height = this.LID_HEIGHT_ + this.BODY_HEIGHT_ + 2 * this.MARGIN_HOTSPOT_; + return new goog.math.Rect(left, top, width, height); + }; /** @@ -282,3 +318,15 @@ Blockly.Trashcan.prototype.animateLid_ = function() { Blockly.Trashcan.prototype.close = function() { this.setOpen_(false); }; + +/** + * Inspect the contents of the trash. + */ +Blockly.Trashcan.prototype.click = function() { + var dx = this.workspace_.startScrollX - this.workspace_.scrollX; + var dy = this.workspace_.startScrollY - this.workspace_.scrollY; + if (Math.sqrt(dx * dx + dy * dy) > Blockly.DRAG_RADIUS) { + return; + } + console.log('TODO: Inspect trash.'); +}; diff --git a/src/opsoro/server/static/js/blockly/core/utils.js b/src/opsoro/server/static/js/blockly/core/utils.js new file mode 100644 index 0000000..464fd0e --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/utils.js @@ -0,0 +1,905 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Utility methods. + * These methods are not specific to Blockly, and could be factored out into + * a JavaScript framework such as Closure. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +/** + * @name Blockly.utils + * @namespace + **/ +goog.provide('Blockly.utils'); + +goog.require('Blockly.Touch'); +goog.require('goog.dom'); +goog.require('goog.events.BrowserFeature'); +goog.require('goog.math.Coordinate'); +goog.require('goog.userAgent'); + +/** + * Remove an attribute from a element even if it's in IE 10. + * Similar to Element.removeAttribute() but it works on SVG elements in IE 10. + * Sets the attribute to null in IE 10, which treats removeAttribute as a no-op + * if it's called on an SVG element. + * @param {!Element} element DOM element to remove attribute from. + * @param {string} attributeName Name of attribute to remove. + */ +Blockly.utils.removeAttribute = function(element, attributeName) { + // goog.userAgent.isVersion is deprecated, but the replacement is + // goog.userAgent.isVersionOrHigher. + if (goog.userAgent.IE && goog.userAgent.isVersion('10.0')) { + element.setAttribute(attributeName, null); + } else { + element.removeAttribute(attributeName); + } +}; + +/** + * Add a CSS class to a element. + * Similar to Closure's goog.dom.classes.add, except it handles SVG elements. + * @param {!Element} element DOM element to add class to. + * @param {string} className Name of class to add. + * @return {boolean} True if class was added, false if already present. + */ +Blockly.utils.addClass = function(element, className) { + var classes = element.getAttribute('class') || ''; + if ((' ' + classes + ' ').indexOf(' ' + className + ' ') != -1) { + return false; + } + if (classes) { + classes += ' '; + } + element.setAttribute('class', classes + className); + return true; +}; + +/** + * Remove a CSS class from a element. + * Similar to Closure's goog.dom.classes.remove, except it handles SVG elements. + * @param {!Element} element DOM element to remove class from. + * @param {string} className Name of class to remove. + * @return {boolean} True if class was removed, false if never present. + */ +Blockly.utils.removeClass = function(element, className) { + var classes = element.getAttribute('class'); + if ((' ' + classes + ' ').indexOf(' ' + className + ' ') == -1) { + return false; + } + var classList = classes.split(/\s+/); + for (var i = 0; i < classList.length; i++) { + if (!classList[i] || classList[i] == className) { + classList.splice(i, 1); + i--; + } + } + if (classList.length) { + element.setAttribute('class', classList.join(' ')); + } else { + Blockly.utils.removeAttribute(element, 'class'); + } + return true; +}; + +/** + * Checks if an element has the specified CSS class. + * Similar to Closure's goog.dom.classes.has, except it handles SVG elements. + * @param {!Element} element DOM element to check. + * @param {string} className Name of class to check. + * @return {boolean} True if class exists, false otherwise. + * @private + */ +Blockly.utils.hasClass = function(element, className) { + var classes = element.getAttribute('class'); + return (' ' + classes + ' ').indexOf(' ' + className + ' ') != -1; +}; + +/** + * Don't do anything for this event, just halt propagation. + * @param {!Event} e An event. + */ +Blockly.utils.noEvent = function(e) { + // This event has been handled. No need to bubble up to the document. + e.preventDefault(); + e.stopPropagation(); +}; + +/** + * Is this event targeting a text input widget? + * @param {!Event} e An event. + * @return {boolean} True if text input. + */ +Blockly.utils.isTargetInput = function(e) { + return e.target.type == 'textarea' || e.target.type == 'text' || + e.target.type == 'number' || e.target.type == 'email' || + e.target.type == 'password' || e.target.type == 'search' || + e.target.type == 'tel' || e.target.type == 'url' || + e.target.isContentEditable; +}; + +/** + * Return the coordinates of the top-left corner of this element relative to + * its parent. Only for SVG elements and children (e.g. rect, g, path). + * @param {!Element} element SVG element to find the coordinates of. + * @return {!goog.math.Coordinate} Object with .x and .y properties. + */ +Blockly.utils.getRelativeXY = function(element) { + var xy = new goog.math.Coordinate(0, 0); + // First, check for x and y attributes. + var x = element.getAttribute('x'); + if (x) { + xy.x = parseInt(x, 10); + } + var y = element.getAttribute('y'); + if (y) { + xy.y = parseInt(y, 10); + } + // Second, check for transform="translate(...)" attribute. + var transform = element.getAttribute('transform'); + var r = transform && transform.match(Blockly.utils.getRelativeXY.XY_REGEX_); + if (r) { + xy.x += parseFloat(r[1]); + if (r[3]) { + xy.y += parseFloat(r[3]); + } + } + + // Then check for style = transform: translate(...) or translate3d(...) + var style = element.getAttribute('style'); + if (style && style.indexOf('translate') > -1) { + var styleComponents = style.match(Blockly.utils.getRelativeXY.XY_2D_REGEX_); + // Try transform3d if 2d transform wasn't there. + if (!styleComponents) { + styleComponents = style.match(Blockly.utils.getRelativeXY.XY_3D_REGEX_); + } + if (styleComponents) { + xy.x += parseFloat(styleComponents[1]); + if (styleComponents[3]) { + xy.y += parseFloat(styleComponents[3]); + } + } + } + return xy; +}; + +/** + * Return the coordinates of the top-left corner of this element relative to + * the div blockly was injected into. + * @param {!Element} element SVG element to find the coordinates of. If this is + * not a child of the div blockly was injected into, the behaviour is + * undefined. + * @return {!goog.math.Coordinate} Object with .x and .y properties. + */ +Blockly.utils.getInjectionDivXY_ = function(element) { + var x = 0; + var y = 0; + var scale = 1; + while (element) { + var xy = Blockly.utils.getRelativeXY(element); + var scale = Blockly.utils.getScale_(element); + x = (x * scale) + xy.x; + y = (y * scale) + xy.y; + var classes = element.getAttribute('class') || ''; + if ((' ' + classes + ' ').indexOf(' injectionDiv ') != -1) { + break; + } + element = element.parentNode; + } + return new goog.math.Coordinate(x, y); +}; + +/** + * Return the scale of this element. + * @param {!Element} element The element to find the coordinates of. + * @return {!number} number represending the scale applied to the element. + * @private + */ +Blockly.utils.getScale_ = function(element) { + var scale = 1; + var transform = element.getAttribute('transform'); + if (transform) { + var transformComponents = + transform.match(Blockly.utils.getScale_.REGEXP_); + if (transformComponents && transformComponents[0]) { + scale = parseFloat(transformComponents[0]); + } + } + return scale; +}; + +/** + * Static regex to pull the x,y values out of an SVG translate() directive. + * Note that Firefox and IE (9,10) return 'translate(12)' instead of + * 'translate(12, 0)'. + * Note that IE (9,10) returns 'translate(16 8)' instead of 'translate(16, 8)'. + * Note that IE has been reported to return scientific notation (0.123456e-42). + * @type {!RegExp} + * @private + */ +Blockly.utils.getRelativeXY.XY_REGEX_ = + /translate\(\s*([-+\d.e]+)([ ,]\s*([-+\d.e]+)\s*\))?/; + + +/** + * Static regex to pull the scale values out of a transform style property. + * Accounts for same exceptions as XY_REGEXP_. + * @type {!RegExp} + * @private + */ +Blockly.utils.getScale_REGEXP_ = /scale\(\s*([-+\d.e]+)\s*\)/; + +/** + * Static regex to pull the x,y,z values out of a translate3d() style property. + * Accounts for same exceptions as XY_REGEXP_. + * @type {!RegExp} + * @private + */ +Blockly.utils.getRelativeXY.XY_3D_REGEX_ = + /transform:\s*translate3d\(\s*([-+\d.e]+)px([ ,]\s*([-+\d.e]+)\s*)px([ ,]\s*([-+\d.e]+)\s*)px\)?/; + +/** + * Static regex to pull the x,y,z values out of a translate3d() style property. + * Accounts for same exceptions as XY_REGEXP_. + * @type {!RegExp} + * @private + */ +Blockly.utils.getRelativeXY.XY_2D_REGEX_ = + /transform:\s*translate\(\s*([-+\d.e]+)px([ ,]\s*([-+\d.e]+)\s*)px\)?/; + +/** + * Helper method for creating SVG elements. + * @param {string} name Element's tag name. + * @param {!Object} attrs Dictionary of attribute names and values. + * @param {Element} parent Optional parent on which to append the element. + * @param {Blockly.Workspace=} opt_workspace Optional workspace for access to + * context (scale...). + * @return {!SVGElement} Newly created SVG element. + */ +Blockly.utils.createSvgElement = function(name, attrs, parent /*, opt_workspace */) { + var e = /** @type {!SVGElement} */ ( + document.createElementNS(Blockly.SVG_NS, name)); + for (var key in attrs) { + e.setAttribute(key, attrs[key]); + } + // IE defines a unique attribute "runtimeStyle", it is NOT applied to + // elements created with createElementNS. However, Closure checks for IE + // and assumes the presence of the attribute and crashes. + if (document.body.runtimeStyle) { // Indicates presence of IE-only attr. + e.runtimeStyle = e.currentStyle = e.style; + } + if (parent) { + parent.appendChild(e); + } + return e; +}; + +/** + * Is this event a right-click? + * @param {!Event} e Mouse event. + * @return {boolean} True if right-click. + */ +Blockly.utils.isRightButton = function(e) { + if (e.ctrlKey && goog.userAgent.MAC) { + // Control-clicking on Mac OS X is treated as a right-click. + // WebKit on Mac OS X fails to change button to 2 (but Gecko does). + return true; + } + return e.button == 2; +}; + +/** + * Return the converted coordinates of the given mouse event. + * The origin (0,0) is the top-left corner of the Blockly SVG. + * @param {!Event} e Mouse event. + * @param {!Element} svg SVG element. + * @param {SVGMatrix} matrix Inverted screen CTM to use. + * @return {!Object} Object with .x and .y properties. + */ +Blockly.utils.mouseToSvg = function(e, svg, matrix) { + var svgPoint = svg.createSVGPoint(); + svgPoint.x = e.clientX; + svgPoint.y = e.clientY; + + if (!matrix) { + matrix = svg.getScreenCTM().inverse(); + } + return svgPoint.matrixTransform(matrix); +}; + +/** + * Given an array of strings, return the length of the shortest one. + * @param {!Array.} array Array of strings. + * @return {number} Length of shortest string. + */ +Blockly.utils.shortestStringLength = function(array) { + if (!array.length) { + return 0; + } + return array.reduce(function(a, b) { + return a.length < b.length ? a : b; + }).length; +}; + +/** + * Given an array of strings, return the length of the common prefix. + * Words may not be split. Any space after a word is included in the length. + * @param {!Array.} array Array of strings. + * @param {number=} opt_shortest Length of shortest string. + * @return {number} Length of common prefix. + */ +Blockly.utils.commonWordPrefix = function(array, opt_shortest) { + if (!array.length) { + return 0; + } else if (array.length == 1) { + return array[0].length; + } + var wordPrefix = 0; + var max = opt_shortest || Blockly.utils.shortestStringLength(array); + for (var len = 0; len < max; len++) { + var letter = array[0][len]; + for (var i = 1; i < array.length; i++) { + if (letter != array[i][len]) { + return wordPrefix; + } + } + if (letter == ' ') { + wordPrefix = len + 1; + } + } + for (var i = 1; i < array.length; i++) { + var letter = array[i][len]; + if (letter && letter != ' ') { + return wordPrefix; + } + } + return max; +}; + +/** + * Given an array of strings, return the length of the common suffix. + * Words may not be split. Any space after a word is included in the length. + * @param {!Array.} array Array of strings. + * @param {number=} opt_shortest Length of shortest string. + * @return {number} Length of common suffix. + */ +Blockly.utils.commonWordSuffix = function(array, opt_shortest) { + if (!array.length) { + return 0; + } else if (array.length == 1) { + return array[0].length; + } + var wordPrefix = 0; + var max = opt_shortest || Blockly.utils.shortestStringLength(array); + for (var len = 0; len < max; len++) { + var letter = array[0].substr(-len - 1, 1); + for (var i = 1; i < array.length; i++) { + if (letter != array[i].substr(-len - 1, 1)) { + return wordPrefix; + } + } + if (letter == ' ') { + wordPrefix = len + 1; + } + } + for (var i = 1; i < array.length; i++) { + var letter = array[i].charAt(array[i].length - len - 1); + if (letter && letter != ' ') { + return wordPrefix; + } + } + return max; +}; + +/** + * Parse a string with any number of interpolation tokens (%1, %2, ...). + * It will also replace string table references (e.g., %{bky_my_msg} and + * %{BKY_MY_MSG} will both be replaced with the value in + * Blockly.Msg['MY_MSG']). Percentage sign characters '%' may be self-escaped + * (e.g., '%%'). + * @param {string} message Text which might contain string table references and + * interpolation tokens. + * @return {!Array.} Array of strings and numbers. + */ +Blockly.utils.tokenizeInterpolation = function(message) { + return Blockly.utils.tokenizeInterpolation_(message, true); +}; + +/** + * Replaces string table references in a message, if the message is a string. + * For example, "%{bky_my_msg}" and "%{BKY_MY_MSG}" will both be replaced with + * the value in Blockly.Msg['MY_MSG']. + * @param {string|?} message Message, which may be a string that contains + * string table references. + * @return {!string} String with message references replaced. + */ +Blockly.utils.replaceMessageReferences = function(message) { + if (!goog.isString(message)) { + return message; + } + var interpolatedResult = Blockly.utils.tokenizeInterpolation_(message, false); + // When parseInterpolationTokens == false, interpolatedResult should be at + // most length 1. + return interpolatedResult.length ? interpolatedResult[0] : ""; +}; + +/** + * Validates that any %{BKY_...} references in the message refer to keys of + * the Blockly.Msg string table. + * @param {string} message Text which might contain string table references. + * @return {boolean} True if all message references have matching values. + * Otherwise, false. + */ +Blockly.utils.checkMessageReferences = function(message) { + var isValid = true; // True until a bad reference is found + + var regex = /%{BKY_([a-zA-Z][a-zA-Z0-9_]*)}/g; + var match = regex.exec(message); + while (match != null) { + var msgKey = match[1]; + if (Blockly.Msg[msgKey] == null) { + console.log('WARNING: No message string for %{BKY_' + msgKey + '}.'); + isValid = false; + } + + // Re-run on remainder of sting. + message = message.substring(match.index + msgKey.length + 1); + match = regex.exec(message); + } + + return isValid; +}; + +/** + * Internal implemention of the message reference and interpolation token + * parsing used by tokenizeInterpolation() and replaceMessageReferences(). + * @param {string} message Text which might contain string table references and + * interpolation tokens. + * @param {boolean} parseInterpolationTokens Option to parse numeric + * interpolation tokens (%1, %2, ...) when true. + * @return {!Array.} Array of strings and numbers. + * @private + */ +Blockly.utils.tokenizeInterpolation_ = function(message, parseInterpolationTokens) { + var tokens = []; + var chars = message.split(''); + chars.push(''); // End marker. + // Parse the message with a finite state machine. + // 0 - Base case. + // 1 - % found. + // 2 - Digit found. + // 3 - Message ref found + var state = 0; + var buffer = []; + var number = null; + for (var i = 0; i < chars.length; i++) { + var c = chars[i]; + if (state == 0) { + if (c == '%') { + var text = buffer.join(''); + if (text) { + tokens.push(text); + } + buffer.length = 0; + state = 1; // Start escape. + } else { + buffer.push(c); // Regular char. + } + } else if (state == 1) { + if (c == '%') { + buffer.push(c); // Escaped %: %% + state = 0; + } else if (parseInterpolationTokens && '0' <= c && c <= '9') { + state = 2; + number = c; + var text = buffer.join(''); + if (text) { + tokens.push(text); + } + buffer.length = 0; + } else if (c == '{') { + state = 3; + } else { + buffer.push('%', c); // Not recognized. Return as literal. + state = 0; + } + } else if (state == 2) { + if ('0' <= c && c <= '9') { + number += c; // Multi-digit number. + } else { + tokens.push(parseInt(number, 10)); + i--; // Parse this char again. + state = 0; + } + } else if (state == 3) { // String table reference + if (c == '') { + // Premature end before closing '}' + buffer.splice(0, 0, '%{'); // Re-insert leading delimiter + i--; // Parse this char again. + state = 0; // and parse as string literal. + } else if (c != '}') { + buffer.push(c); + } else { + var rawKey = buffer.join(''); + if (/[a-zA-Z][a-zA-Z0-9_]*/.test(rawKey)) { // Strict matching + // Found a valid string key. Attempt case insensitive match. + var keyUpper = rawKey.toUpperCase(); + + // BKY_ is the prefix used to namespace the strings used in Blockly + // core files and the predefined blocks in ../blocks/. These strings + // are defined in ../msgs/ files. + var bklyKey = goog.string.startsWith(keyUpper, 'BKY_') ? + keyUpper.substring(4) : null; + if (bklyKey && bklyKey in Blockly.Msg) { + var rawValue = Blockly.Msg[bklyKey]; + if (goog.isString(rawValue)) { + // Attempt to dereference substrings, too, appending to the end. + Array.prototype.push.apply(tokens, + Blockly.utils.tokenizeInterpolation(rawValue)); + } else if (parseInterpolationTokens) { + // When parsing interpolation tokens, numbers are special + // placeholders (%1, %2, etc). Make sure all other values are + // strings. + tokens.push(String(rawValue)); + } else { + tokens.push(rawValue); + } + } else { + // No entry found in the string table. Pass reference as string. + tokens.push('%{' + rawKey + '}'); + } + buffer.length = 0; // Clear the array + state = 0; + } else { + tokens.push('%{' + rawKey + '}'); + buffer.length = 0; + state = 0; // and parse as string literal. + } + } + } + } + var text = buffer.join(''); + if (text) { + tokens.push(text); + } + + // Merge adjacent text tokens into a single string. + var mergedTokens = []; + buffer.length = 0; + for (var i = 0; i < tokens.length; ++i) { + if (typeof tokens[i] == 'string') { + buffer.push(tokens[i]); + } else { + text = buffer.join(''); + if (text) { + mergedTokens.push(text); + } + buffer.length = 0; + mergedTokens.push(tokens[i]); + } + } + text = buffer.join(''); + if (text) { + mergedTokens.push(text); + } + buffer.length = 0; + + return mergedTokens; +}; + +/** + * Generate a unique ID. This should be globally unique. + * 87 characters ^ 20 length > 128 bits (better than a UUID). + * @return {string} A globally unique ID string. + */ +Blockly.utils.genUid = function() { + var length = 20; + var soupLength = Blockly.utils.genUid.soup_.length; + var id = []; + for (var i = 0; i < length; i++) { + id[i] = Blockly.utils.genUid.soup_.charAt(Math.random() * soupLength); + } + return id.join(''); +}; + +/** + * Legal characters for the unique ID. Should be all on a US keyboard. + * No characters that conflict with XML or JSON. Requests to remove additional + * 'problematic' characters from this soup will be denied. That's your failure + * to properly escape in your own environment. Issues #251, #625, #682. + * @private + */ +Blockly.utils.genUid.soup_ = '!#$%()*+,-./:;=?@[]^_`{|}~' + + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + +/** + * Wrap text to the specified width. + * @param {string} text Text to wrap. + * @param {number} limit Width to wrap each line. + * @return {string} Wrapped text. + */ +Blockly.utils.wrap = function(text, limit) { + var lines = text.split('\n'); + for (var i = 0; i < lines.length; i++) { + lines[i] = Blockly.utils.wrapLine_(lines[i], limit); + } + return lines.join('\n'); +}; + +/** + * Wrap single line of text to the specified width. + * @param {string} text Text to wrap. + * @param {number} limit Width to wrap each line. + * @return {string} Wrapped text. + * @private + */ +Blockly.utils.wrapLine_ = function(text, limit) { + if (text.length <= limit) { + // Short text, no need to wrap. + return text; + } + // Split the text into words. + var words = text.trim().split(/\s+/); + // Set limit to be the length of the largest word. + for (var i = 0; i < words.length; i++) { + if (words[i].length > limit) { + limit = words[i].length; + } + } + + var lastScore; + var score = -Infinity; + var lastText; + var lineCount = 1; + do { + lastScore = score; + lastText = text; + // Create a list of booleans representing if a space (false) or + // a break (true) appears after each word. + var wordBreaks = []; + // Seed the list with evenly spaced linebreaks. + var steps = words.length / lineCount; + var insertedBreaks = 1; + for (var i = 0; i < words.length - 1; i++) { + if (insertedBreaks < (i + 1.5) / steps) { + insertedBreaks++; + wordBreaks[i] = true; + } else { + wordBreaks[i] = false; + } + } + wordBreaks = Blockly.utils.wrapMutate_(words, wordBreaks, limit); + score = Blockly.utils.wrapScore_(words, wordBreaks, limit); + text = Blockly.utils.wrapToText_(words, wordBreaks); + lineCount++; + } while (score > lastScore); + return lastText; +}; + +/** + * Compute a score for how good the wrapping is. + * @param {!Array.} words Array of each word. + * @param {!Array.} wordBreaks Array of line breaks. + * @param {number} limit Width to wrap each line. + * @return {number} Larger the better. + * @private + */ +Blockly.utils.wrapScore_ = function(words, wordBreaks, limit) { + // If this function becomes a performance liability, add caching. + // Compute the length of each line. + var lineLengths = [0]; + var linePunctuation = []; + for (var i = 0; i < words.length; i++) { + lineLengths[lineLengths.length - 1] += words[i].length; + if (wordBreaks[i] === true) { + lineLengths.push(0); + linePunctuation.push(words[i].charAt(words[i].length - 1)); + } else if (wordBreaks[i] === false) { + lineLengths[lineLengths.length - 1]++; + } + } + var maxLength = Math.max.apply(Math, lineLengths); + + var score = 0; + for (var i = 0; i < lineLengths.length; i++) { + // Optimize for width. + // -2 points per char over limit (scaled to the power of 1.5). + score -= Math.pow(Math.abs(limit - lineLengths[i]), 1.5) * 2; + // Optimize for even lines. + // -1 point per char smaller than max (scaled to the power of 1.5). + score -= Math.pow(maxLength - lineLengths[i], 1.5); + // Optimize for structure. + // Add score to line endings after punctuation. + if ('.?!'.indexOf(linePunctuation[i]) != -1) { + score += limit / 3; + } else if (',;)]}'.indexOf(linePunctuation[i]) != -1) { + score += limit / 4; + } + } + // All else being equal, the last line should not be longer than the + // previous line. For example, this looks wrong: + // aaa bbb + // ccc ddd eee + if (lineLengths.length > 1 && lineLengths[lineLengths.length - 1] <= + lineLengths[lineLengths.length - 2]) { + score += 0.5; + } + return score; +}; + +/** + * Mutate the array of line break locations until an optimal solution is found. + * No line breaks are added or deleted, they are simply moved around. + * @param {!Array.} words Array of each word. + * @param {!Array.} wordBreaks Array of line breaks. + * @param {number} limit Width to wrap each line. + * @return {!Array.} New array of optimal line breaks. + * @private + */ +Blockly.utils.wrapMutate_ = function(words, wordBreaks, limit) { + var bestScore = Blockly.utils.wrapScore_(words, wordBreaks, limit); + var bestBreaks; + // Try shifting every line break forward or backward. + for (var i = 0; i < wordBreaks.length - 1; i++) { + if (wordBreaks[i] == wordBreaks[i + 1]) { + continue; + } + var mutatedWordBreaks = [].concat(wordBreaks); + mutatedWordBreaks[i] = !mutatedWordBreaks[i]; + mutatedWordBreaks[i + 1] = !mutatedWordBreaks[i + 1]; + var mutatedScore = + Blockly.utils.wrapScore_(words, mutatedWordBreaks, limit); + if (mutatedScore > bestScore) { + bestScore = mutatedScore; + bestBreaks = mutatedWordBreaks; + } + } + if (bestBreaks) { + // Found an improvement. See if it may be improved further. + return Blockly.utils.wrapMutate_(words, bestBreaks, limit); + } + // No improvements found. Done. + return wordBreaks; +}; + +/** + * Reassemble the array of words into text, with the specified line breaks. + * @param {!Array.} words Array of each word. + * @param {!Array.} wordBreaks Array of line breaks. + * @return {string} Plain text. + * @private + */ +Blockly.utils.wrapToText_ = function(words, wordBreaks) { + var text = []; + for (var i = 0; i < words.length; i++) { + text.push(words[i]); + if (wordBreaks[i] !== undefined) { + text.push(wordBreaks[i] ? '\n' : ' '); + } + } + return text.join(''); +}; + +/** + * Check if 3D transforms are supported by adding an element + * and attempting to set the property. + * @return {boolean} true if 3D transforms are supported. + */ +Blockly.utils.is3dSupported = function() { + if (Blockly.utils.is3dSupported.cached_ !== undefined) { + return Blockly.utils.is3dSupported.cached_; + } + // CC-BY-SA Lorenzo Polidori + // stackoverflow.com/questions/5661671/detecting-transform-translate3d-support + if (!goog.global.getComputedStyle) { + return false; + } + + var el = document.createElement('p'); + var has3d = 'none'; + var transforms = { + 'webkitTransform': '-webkit-transform', + 'OTransform': '-o-transform', + 'msTransform': '-ms-transform', + 'MozTransform': '-moz-transform', + 'transform': 'transform' + }; + + // Add it to the body to get the computed style. + document.body.insertBefore(el, null); + + for (var t in transforms) { + if (el.style[t] !== undefined) { + el.style[t] = 'translate3d(1px,1px,1px)'; + var computedStyle = goog.global.getComputedStyle(el); + if (!computedStyle) { + // getComputedStyle in Firefox returns null when blockly is loaded + // inside an iframe with display: none. Returning false and not + // caching is3dSupported means we try again later. This is most likely + // when users are interacting with blocks which should mean blockly is + // visible again. + // See https://bugzilla.mozilla.org/show_bug.cgi?id=548397 + document.body.removeChild(el); + return false; + } + has3d = computedStyle.getPropertyValue(transforms[t]); + } + } + document.body.removeChild(el); + Blockly.utils.is3dSupported.cached_ = has3d !== 'none'; + return Blockly.utils.is3dSupported.cached_; +}; + +/** + * Insert a node after a reference node. + * Contrast with node.insertBefore function. + * @param {!Element} newNode New element to insert. + * @param {!Element} refNode Existing element to precede new node. + * @private + */ +Blockly.utils.insertAfter_ = function(newNode, refNode) { + var siblingNode = refNode.nextSibling; + var parentNode = refNode.parentNode; + if (!parentNode) { + throw 'Reference node has no parent.'; + } + if (siblingNode) { + parentNode.insertBefore(newNode, siblingNode); + } else { + parentNode.appendChild(newNode); + } +}; + +/** + * Calls a function after the page has loaded, possibly immediately. + * @param {function()} fn Function to run. + * @throws Error Will throw if no global document can be found (e.g., Node.js). + */ +Blockly.utils.runAfterPageLoad = function(fn) { + if (!document) { + throw new Error('Blockly.utils.runAfterPageLoad() requires browser document.'); + } + if (document.readyState === 'complete') { + fn(); // Page has already loaded. Call immediately. + } else { + // Poll readyState. + var readyStateCheckInterval = setInterval(function() { + if (document.readyState === 'complete') { + clearInterval(readyStateCheckInterval); + fn(); + } + }, 10); + } +}; + +/** + * Sets the CSS transform property on an element. This function sets the + * non-vendor-prefixed and vendor-prefixed versions for backwards compatibility + * with older browsers. See http://caniuse.com/#feat=transforms2d + * @param {!Element} node The node which the CSS transform should be applied. + * @param {string} transform The value of the CSS `transform` property. + */ +Blockly.utils.setCssTransform = function(node, transform) { + node.style['transform'] = transform; + node.style['-webkit-transform'] = transform; +}; diff --git a/src/opsoro/server/static/js/blockly/core/variables.js b/src/opsoro/server/static/js/blockly/core/variables.js new file mode 100644 index 0000000..e131286 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/variables.js @@ -0,0 +1,262 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Utility functions for handling variables. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +/** + * @name Blockly.Variables + * @namespace + **/ +goog.provide('Blockly.Variables'); + +goog.require('Blockly.Blocks'); +goog.require('Blockly.constants'); +goog.require('Blockly.Workspace'); +goog.require('goog.string'); + + +/** + * Find all user-created variables that are in use in the workspace. + * For use by generators. + * @param {!Blockly.Block|!Blockly.Workspace} root Root block or workspace. + * @return {!Array.} Array of variable names. + */ +Blockly.Variables.allUsedVariables = function(root) { + var blocks; + if (root instanceof Blockly.Block) { + // Root is Block. + blocks = root.getDescendants(); + } else if (root.getAllBlocks) { + // Root is Workspace. + blocks = root.getAllBlocks(); + } else { + throw 'Not Block or Workspace: ' + root; + } + var variableHash = Object.create(null); + // Iterate through every block and add each variable to the hash. + for (var x = 0; x < blocks.length; x++) { + var blockVariables = blocks[x].getVars(); + if (blockVariables) { + for (var y = 0; y < blockVariables.length; y++) { + var varName = blockVariables[y]; + // Variable name may be null if the block is only half-built. + if (varName) { + variableHash[varName.toLowerCase()] = varName; + } + } + } + } + // Flatten the hash into a list. + var variableList = []; + for (var name in variableHash) { + variableList.push(variableHash[name]); + } + return variableList; +}; + +/** + * Find all variables that the user has created through the workspace or + * toolbox. For use by generators. + * @param {!Blockly.Workspace} root The workspace to inspect. + * @return {!Array.} Array of variable names. + */ +Blockly.Variables.allVariables = function(root) { + if (root instanceof Blockly.Block) { + // Root is Block. + console.warn('Deprecated call to Blockly.Variables.allVariables ' + + 'with a block instead of a workspace. You may want ' + + 'Blockly.Variables.allUsedVariables'); + } + return root.variableList; +}; + +/** + * Construct the blocks required by the flyout for the variable category. + * @param {!Blockly.Workspace} workspace The workspace contianing variables. + * @return {!Array.} Array of XML block elements. + */ +Blockly.Variables.flyoutCategory = function(workspace) { + var variableList = workspace.variableList; + variableList.sort(goog.string.caseInsensitiveCompare); + + var xmlList = []; + var button = goog.dom.createDom('button'); + button.setAttribute('text', Blockly.Msg.NEW_VARIABLE); + button.setAttribute('callbackKey', 'CREATE_VARIABLE'); + + workspace.registerButtonCallback('CREATE_VARIABLE', function(button) { + Blockly.Variables.createVariable(button.getTargetWorkspace()); + }); + + xmlList.push(button); + + if (variableList.length > 0) { + if (Blockly.Blocks['variables_set']) { + var gap = Blockly.Blocks['math_change'] ? 8 : 24; + var blockText = '' + + '' + + '' + variableList[0] + '' + + '' + + ''; + var block = Blockly.Xml.textToDom(blockText).firstChild; + xmlList.push(block); + } + if (Blockly.Blocks['math_change']) { + var gap = Blockly.Blocks['variables_get'] ? 20 : 8; + var blockText = '' + + '' + + '' + variableList[0] + '' + + '' + + '' + + '1' + + '' + + '' + + '' + + ''; + var block = Blockly.Xml.textToDom(blockText).firstChild; + xmlList.push(block); + } + + for (var i = 0; i < variableList.length; i++) { + if (Blockly.Blocks['variables_get']) { + var blockText = '' + + '' + + '' + variableList[i] + '' + + '' + + ''; + var block = Blockly.Xml.textToDom(blockText).firstChild; + xmlList.push(block); + } + } + } + return xmlList; +}; + +/** +* Return a new variable name that is not yet being used. This will try to +* generate single letter variable names in the range 'i' to 'z' to start with. +* If no unique name is located it will try 'i' to 'z', 'a' to 'h', +* then 'i2' to 'z2' etc. Skip 'l'. + * @param {!Blockly.Workspace} workspace The workspace to be unique in. +* @return {string} New variable name. +*/ +Blockly.Variables.generateUniqueName = function(workspace) { + var variableList = workspace.variableList; + var newName = ''; + if (variableList.length) { + var nameSuffix = 1; + var letters = 'ijkmnopqrstuvwxyzabcdefgh'; // No 'l'. + var letterIndex = 0; + var potName = letters.charAt(letterIndex); + while (!newName) { + var inUse = false; + for (var i = 0; i < variableList.length; i++) { + if (variableList[i].toLowerCase() == potName) { + // This potential name is already used. + inUse = true; + break; + } + } + if (inUse) { + // Try the next potential name. + letterIndex++; + if (letterIndex == letters.length) { + // Reached the end of the character sequence so back to 'i'. + // a new suffix. + letterIndex = 0; + nameSuffix++; + } + potName = letters.charAt(letterIndex); + if (nameSuffix > 1) { + potName += nameSuffix; + } + } else { + // We can use the current potential name. + newName = potName; + } + } + } else { + newName = 'i'; + } + return newName; +}; + +/** + * Create a new variable on the given workspace. + * @param {!Blockly.Workspace} workspace The workspace on which to create the + * variable. + * @param {function(?string=)=} opt_callback A callback. It will + * be passed an acceptable new variable name, or null if change is to be + * aborted (cancel button), or undefined if an existing variable was chosen. + */ +Blockly.Variables.createVariable = function(workspace, opt_callback) { + var promptAndCheckWithAlert = function(defaultName) { + Blockly.Variables.promptName(Blockly.Msg.NEW_VARIABLE_TITLE, defaultName, + function(text) { + if (text) { + if (workspace.variableIndexOf(text) != -1) { + Blockly.alert(Blockly.Msg.VARIABLE_ALREADY_EXISTS.replace('%1', + text.toLowerCase()), + function() { + promptAndCheckWithAlert(text); // Recurse + }); + } else { + workspace.createVariable(text); + if (opt_callback) { + opt_callback(text); + } + } + } else { + // User canceled prompt without a value. + if (opt_callback) { + opt_callback(null); + } + } + }); + }; + promptAndCheckWithAlert(''); +}; + +/** + * Prompt the user for a new variable name. + * @param {string} promptText The string of the prompt. + * @param {string} defaultText The default value to show in the prompt's field. + * @param {function(?string)} callback A callback. It will return the new + * variable name, or null if the user picked something illegal. + */ +Blockly.Variables.promptName = function(promptText, defaultText, callback) { + Blockly.prompt(promptText, defaultText, function(newVar) { + // Merge runs of whitespace. Strip leading and trailing whitespace. + // Beyond this, all names are legal. + if (newVar) { + newVar = newVar.replace(/[\s\xa0]+/g, ' ').replace(/^ | $/g, ''); + if (newVar == Blockly.Msg.RENAME_VARIABLE || + newVar == Blockly.Msg.NEW_VARIABLE) { + // Ok, not ALL names are legal... + newVar = null; + } + } + callback(newVar); + }); +}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/warning.js b/src/opsoro/server/static/js/blockly/core/warning.js similarity index 78% rename from src/opsoro/apps/visual_programming/static/blockly/core/warning.js rename to src/opsoro/server/static/js/blockly/core/warning.js index 19bad66..86413fa 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/core/warning.js +++ b/src/opsoro/server/static/js/blockly/core/warning.js @@ -50,10 +50,29 @@ goog.inherits(Blockly.Warning, Blockly.Icon); Blockly.Warning.prototype.collapseHidden = false; /** - * Icon in base64 format. + * Draw the warning icon. + * @param {!Element} group The icon group. * @private */ -Blockly.Warning.prototype.png_ = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAANyAAADcgBffIlqAAAAAd0SU1FB98DGgApDBpIGrEAAAGfSURBVDjLnZM9S2NREIbfc2P8AF27BXshpIzK5g9ssUj8C2tnYyUoiBGSyk4sbCLs1vkRgoW1jYWFICwsMV2Se3JPboLe+FhcNCZcjXFgOMzHeec9M2ekDwTIAEUgo68IsOQczdNTIudoAksTg/g+5+UyDxKUyzz4PueTsvhZr+NmZkCC6Wmo1QiAX58FmLKWf4VCDPCiGxtgLf+B9FiQXo+9y0ucBIUCnJ3B+noMdHGBC0P2xrH4HoYEmUx8qVQCgMPD2F5ehjDEjTbZe2s4p5NKRenb2+Qid3dSpaK0tTp+j8VKq0VncXHQh2IxZrK/P/AtLECjQQf4McQEMNbq786O5qwdANfr8Xl/P/AFgbS7qzlr9Qcwr4EoYvPmBud5wxPJ5+HqCtbWhv3GwPU1Lor4/fKMeedo5vPDiRKsrsLWFuRyybFOhxbwTd0upWqVcDQpaTqjWq0SdruU5PvUkiol/ZNRzeXA96mp3aaRzSYnjdNsFtptGiYI2PY8HaVSmu33xWf3K5WS6ffVe3rSgXnzT+YlpSfY00djjJOkZ/wpr41bQMIsAAAAAElFTkSuQmCC'; +Blockly.Warning.prototype.drawIcon_ = function(group) { + // Triangle with rounded corners. + Blockly.utils.createSvgElement('path', + {'class': 'blocklyIconShape', + 'd': 'M2,15Q-1,15 0.5,12L6.5,1.7Q8,-1 9.5,1.7L15.5,12Q17,15 14,15z'}, + group); + // Can't use a real '!' text character since different browsers and operating + // systems render it differently. + // Body of exclamation point. + Blockly.utils.createSvgElement('path', + {'class': 'blocklyIconSymbol', + 'd': 'm7,4.8v3.16l0.27,2.27h1.46l0.27,-2.27v-3.16z'}, + group); + // Dot of exclamation point. + Blockly.utils.createSvgElement('rect', + {'class': 'blocklyIconSymbol', + 'x': '7', 'y': '11', 'height': '2', 'width': '2'}, + group); +}; /** * Create the text for the warning's bubble. @@ -63,13 +82,13 @@ Blockly.Warning.prototype.png_ = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA */ Blockly.Warning.textToDom_ = function(text) { var paragraph = /** @type {!SVGTextElement} */ ( - Blockly.createSvgElement('text', + Blockly.utils.createSvgElement('text', {'class': 'blocklyText blocklyBubbleText', 'y': Blockly.Bubble.BORDER_WIDTH}, null)); var lines = text.split('\n'); for (var i = 0; i < lines.length; i++) { - var tspanElement = Blockly.createSvgElement('tspan', + var tspanElement = Blockly.utils.createSvgElement('tspan', {'dy': '1em', 'x': Blockly.Bubble.BORDER_WIDTH}, paragraph); var textNode = document.createTextNode(lines[i]); tspanElement.appendChild(textNode); @@ -86,13 +105,14 @@ Blockly.Warning.prototype.setVisible = function(visible) { // No change. return; } + Blockly.Events.fire( + new Blockly.Events.Ui(this.block_, 'warningOpen', !visible, visible)); if (visible) { // Create the bubble to display all warnings. var paragraph = Blockly.Warning.textToDom_(this.getText()); this.bubble_ = new Blockly.Bubble( - /** @type {!Blockly.Workspace} */ (this.block_.workspace), - paragraph, this.block_.svgPath_, - this.iconX_, this.iconY_, null, null); + /** @type {!Blockly.WorkspaceSvg} */ (this.block_.workspace), + paragraph, this.block_.svgPath_, this.iconXY_, null, null); if (this.block_.RTL) { // Right-align the paragraph. // This cannot be done until the bubble is rendered on screen. diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/widgetdiv.js b/src/opsoro/server/static/js/blockly/core/widgetdiv.js similarity index 95% rename from src/opsoro/apps/visual_programming/static/blockly/core/widgetdiv.js rename to src/opsoro/server/static/js/blockly/core/widgetdiv.js index 3342aa3..c2a9a65 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/core/widgetdiv.js +++ b/src/opsoro/server/static/js/blockly/core/widgetdiv.js @@ -26,10 +26,15 @@ */ 'use strict'; +/** + * @name Blockly.WidgetDiv + * @namespace + **/ goog.provide('Blockly.WidgetDiv'); goog.require('Blockly.Css'); goog.require('goog.dom'); +goog.require('goog.dom.TagName'); goog.require('goog.style'); @@ -61,7 +66,8 @@ Blockly.WidgetDiv.createDom = function() { return; // Already created. } // Create an HTML container for popup overlays (e.g. editor widgets). - Blockly.WidgetDiv.DIV = goog.dom.createDom('div', 'blocklyWidgetDiv'); + Blockly.WidgetDiv.DIV = + goog.dom.createDom(goog.dom.TagName.DIV, 'blocklyWidgetDiv'); document.body.appendChild(Blockly.WidgetDiv.DIV); }; @@ -89,12 +95,11 @@ Blockly.WidgetDiv.show = function(newOwner, rtl, dispose) { */ Blockly.WidgetDiv.hide = function() { if (Blockly.WidgetDiv.owner_) { + Blockly.WidgetDiv.owner_ = null; Blockly.WidgetDiv.DIV.style.display = 'none'; Blockly.WidgetDiv.DIV.style.left = ''; Blockly.WidgetDiv.DIV.style.top = ''; - Blockly.WidgetDiv.DIV.style.height = ''; Blockly.WidgetDiv.dispose_ && Blockly.WidgetDiv.dispose_(); - Blockly.WidgetDiv.owner_ = null; Blockly.WidgetDiv.dispose_ = null; goog.dom.removeChildren(Blockly.WidgetDiv.DIV); } @@ -147,6 +152,5 @@ Blockly.WidgetDiv.position = function(anchorX, anchorY, windowSize, } Blockly.WidgetDiv.DIV.style.left = anchorX + 'px'; Blockly.WidgetDiv.DIV.style.top = anchorY + 'px'; - Blockly.WidgetDiv.DIV.style.height = - (windowSize.height - anchorY + scrollOffset.y) + 'px'; + Blockly.WidgetDiv.DIV.style.height = windowSize.height + 'px'; }; diff --git a/src/opsoro/server/static/js/blockly/core/workspace.js b/src/opsoro/server/static/js/blockly/core/workspace.js new file mode 100644 index 0000000..95dc26c --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/workspace.js @@ -0,0 +1,520 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Object representing a workspace. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Workspace'); + +goog.require('goog.array'); +goog.require('goog.math'); + + +/** + * Class for a workspace. This is a data structure that contains blocks. + * There is no UI, and can be created headlessly. + * @param {Blockly.Options} opt_options Dictionary of options. + * @constructor + */ +Blockly.Workspace = function(opt_options) { + /** @type {string} */ + this.id = Blockly.utils.genUid(); + Blockly.Workspace.WorkspaceDB_[this.id] = this; + /** @type {!Blockly.Options} */ + this.options = opt_options || {}; + /** @type {boolean} */ + this.RTL = !!this.options.RTL; + /** @type {boolean} */ + this.horizontalLayout = !!this.options.horizontalLayout; + /** @type {number} */ + this.toolboxPosition = this.options.toolboxPosition; + + /** + * @type {!Array.} + * @private + */ + this.topBlocks_ = []; + /** + * @type {!Array.} + * @private + */ + this.listeners_ = []; + /** + * @type {!Array.} + * @private + */ + this.undoStack_ = []; + /** + * @type {!Array.} + * @private + */ + this.redoStack_ = []; + /** + * @type {!Object} + * @private + */ + this.blockDB_ = Object.create(null); + /* + * @type {!Array.} + * A list of all of the named variables in the workspace, including variables + * that are not currently in use. + */ + this.variableList = []; +}; + +/** + * Returns `true` if the workspace is visible and `false` if it's headless. + * @type {boolean} + */ +Blockly.Workspace.prototype.rendered = false; + +/** + * Maximum number of undo events in stack. `0` turns off undo, `Infinity` sets it to unlimited. + * @type {number} + */ +Blockly.Workspace.prototype.MAX_UNDO = 1024; + +/** + * Dispose of this workspace. + * Unlink from all DOM elements to prevent memory leaks. + */ +Blockly.Workspace.prototype.dispose = function() { + this.listeners_.length = 0; + this.clear(); + // Remove from workspace database. + delete Blockly.Workspace.WorkspaceDB_[this.id]; +}; + +/** + * Angle away from the horizontal to sweep for blocks. Order of execution is + * generally top to bottom, but a small angle changes the scan to give a bit of + * a left to right bias (reversed in RTL). Units are in degrees. + * See: http://tvtropes.org/pmwiki/pmwiki.php/Main/DiagonalBilling. + */ +Blockly.Workspace.SCAN_ANGLE = 3; + +/** + * Add a block to the list of top blocks. + * @param {!Blockly.Block} block Block to remove. + */ +Blockly.Workspace.prototype.addTopBlock = function(block) { + this.topBlocks_.push(block); + if (this.isFlyout) { + // This is for the (unlikely) case where you have a variable in a block in + // an always-open flyout. It needs to be possible to edit the block in the + // flyout, so the contents of the dropdown need to be correct. + var variables = Blockly.Variables.allUsedVariables(block); + for (var i = 0; i < variables.length; i++) { + if (this.variableList.indexOf(variables[i]) == -1) { + this.variableList.push(variables[i]); + } + } + } +}; + +/** + * Remove a block from the list of top blocks. + * @param {!Blockly.Block} block Block to remove. + */ +Blockly.Workspace.prototype.removeTopBlock = function(block) { + if (!goog.array.remove(this.topBlocks_, block)) { + throw 'Block not present in workspace\'s list of top-most blocks.'; + } +}; + +/** + * Finds the top-level blocks and returns them. Blocks are optionally sorted + * by position; top to bottom (with slight LTR or RTL bias). + * @param {boolean} ordered Sort the list if true. + * @return {!Array.} The top-level block objects. + */ +Blockly.Workspace.prototype.getTopBlocks = function(ordered) { + // Copy the topBlocks_ list. + var blocks = [].concat(this.topBlocks_); + if (ordered && blocks.length > 1) { + var offset = Math.sin(goog.math.toRadians(Blockly.Workspace.SCAN_ANGLE)); + if (this.RTL) { + offset *= -1; + } + blocks.sort(function(a, b) { + var aXY = a.getRelativeToSurfaceXY(); + var bXY = b.getRelativeToSurfaceXY(); + return (aXY.y + offset * aXY.x) - (bXY.y + offset * bXY.x); + }); + } + return blocks; +}; + +/** + * Find all blocks in workspace. No particular order. + * @return {!Array.} Array of blocks. + */ +Blockly.Workspace.prototype.getAllBlocks = function() { + var blocks = this.getTopBlocks(false); + for (var i = 0; i < blocks.length; i++) { + blocks.push.apply(blocks, blocks[i].getChildren()); + } + return blocks; +}; + +/** + * Dispose of all blocks in workspace. + */ +Blockly.Workspace.prototype.clear = function() { + var existingGroup = Blockly.Events.getGroup(); + if (!existingGroup) { + Blockly.Events.setGroup(true); + } + while (this.topBlocks_.length) { + this.topBlocks_[0].dispose(); + } + if (!existingGroup) { + Blockly.Events.setGroup(false); + } + + this.variableList.length = 0; +}; + +/** + * Walk the workspace and update the list of variables to only contain ones in + * use on the workspace. Use when loading new workspaces from disk. + * @param {boolean} clearList True if the old variable list should be cleared. + */ +Blockly.Workspace.prototype.updateVariableList = function(clearList) { + // TODO: Sort + if (!this.isFlyout) { + // Update the list in place so that the flyout's references stay correct. + if (clearList) { + this.variableList.length = 0; + } + var allVariables = Blockly.Variables.allUsedVariables(this); + for (var i = 0; i < allVariables.length; i++) { + this.createVariable(allVariables[i]); + } + } +}; + +/** + * Rename a variable by updating its name in the variable list. + * TODO: #468 + * @param {string} oldName Variable to rename. + * @param {string} newName New variable name. + */ +Blockly.Workspace.prototype.renameVariable = function(oldName, newName) { + // Find the old name in the list. + var variableIndex = this.variableIndexOf(oldName); + var newVariableIndex = this.variableIndexOf(newName); + + // We might be renaming to an existing name but with different case. If so, + // we will also update all of the blocks using the new name to have the + // correct case. + if (newVariableIndex != -1 && + this.variableList[newVariableIndex] != newName) { + var oldCase = this.variableList[newVariableIndex]; + } + + Blockly.Events.setGroup(true); + var blocks = this.getAllBlocks(); + // Iterate through every block. + for (var i = 0; i < blocks.length; i++) { + blocks[i].renameVar(oldName, newName); + if (oldCase) { + blocks[i].renameVar(oldCase, newName); + } + } + Blockly.Events.setGroup(false); + + + if (variableIndex == newVariableIndex || + variableIndex != -1 && newVariableIndex == -1) { + // Only changing case, or renaming to a completely novel name. + this.variableList[variableIndex] = newName; + } else if (variableIndex != -1 && newVariableIndex != -1) { + // Renaming one existing variable to another existing variable. + // The case might have changed, so we update the destination ID. + this.variableList[newVariableIndex] = newName; + this.variableList.splice(variableIndex, 1); + } else { + this.variableList.push(newName); + console.log('Tried to rename an non-existent variable.'); + } +}; + +/** + * Create a variable with the given name. + * TODO: #468 + * @param {string} name The new variable's name. + */ +Blockly.Workspace.prototype.createVariable = function(name) { + var index = this.variableIndexOf(name); + if (index == -1) { + this.variableList.push(name); + } +}; + +/** + * Find all the uses of a named variable. + * @param {string} name Name of variable. + * @return {!Array.} Array of block usages. + */ +Blockly.Workspace.prototype.getVariableUses = function(name) { + var uses = []; + var blocks = this.getAllBlocks(); + // Iterate through every block and check the name. + for (var i = 0; i < blocks.length; i++) { + var blockVariables = blocks[i].getVars(); + if (blockVariables) { + for (var j = 0; j < blockVariables.length; j++) { + var varName = blockVariables[j]; + // Variable name may be null if the block is only half-built. + if (varName && Blockly.Names.equals(varName, name)) { + uses.push(blocks[i]); + } + } + } + } + return uses; +}; + +/** + * Delete a variables and all of its uses from this workspace. + * @param {string} name Name of variable to delete. + */ +Blockly.Workspace.prototype.deleteVariable = function(name) { + var variableIndex = this.variableIndexOf(name); + if (variableIndex == -1) { + return; + } + // Check whether this variable is a function parameter before deleting. + var uses = this.getVariableUses(name); + for (var i = 0, block; block = uses[i]; i++) { + if (block.type == 'procedures_defnoreturn' || + block.type == 'procedures_defreturn') { + var procedureName = block.getFieldValue('NAME'); + Blockly.alert( + Blockly.Msg.CANNOT_DELETE_VARIABLE_PROCEDURE. + replace('%1', name). + replace('%2', procedureName)); + return; + } + } + + var workspace = this; + function doDeletion() { + Blockly.Events.setGroup(true); + for (var i = 0; i < uses.length; i++) { + uses[i].dispose(true, false); + } + Blockly.Events.setGroup(false); + workspace.variableList.splice(variableIndex, 1); + } + if (uses.length > 1) { + // Confirm before deleting multiple blocks. + Blockly.confirm( + Blockly.Msg.DELETE_VARIABLE_CONFIRMATION.replace('%1', uses.length). + replace('%2', name), + function(ok) { + if (ok) { + doDeletion(); + } + }); + } else { + // No confirmation necessary for a single block. + doDeletion(); + } +}; + +/** + * Check whether a variable exists with the given name. The check is + * case-insensitive. + * @param {string} name The name to check for. + * @return {number} The index of the name in the variable list, or -1 if it is + * not present. + */ +Blockly.Workspace.prototype.variableIndexOf = function(name) { + for (var i = 0, varname; varname = this.variableList[i]; i++) { + if (Blockly.Names.equals(varname, name)) { + return i; + } + } + return -1; +}; + +/** + * Returns the horizontal offset of the workspace. + * Intended for LTR/RTL compatibility in XML. + * Not relevant for a headless workspace. + * @return {number} Width. + */ +Blockly.Workspace.prototype.getWidth = function() { + return 0; +}; + +/** + * Obtain a newly created block. + * @param {?string} prototypeName Name of the language object containing + * type-specific functions for this block. + * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise + * create a new id. + * @return {!Blockly.Block} The created block. + */ +Blockly.Workspace.prototype.newBlock = function(prototypeName, opt_id) { + return new Blockly.Block(this, prototypeName, opt_id); +}; + +/** + * The number of blocks that may be added to the workspace before reaching + * the maxBlocks. + * @return {number} Number of blocks left. + */ +Blockly.Workspace.prototype.remainingCapacity = function() { + if (isNaN(this.options.maxBlocks)) { + return Infinity; + } + return this.options.maxBlocks - this.getAllBlocks().length; +}; + +/** + * Undo or redo the previous action. + * @param {boolean} redo False if undo, true if redo. + */ +Blockly.Workspace.prototype.undo = function(redo) { + var inputStack = redo ? this.redoStack_ : this.undoStack_; + var outputStack = redo ? this.undoStack_ : this.redoStack_; + var inputEvent = inputStack.pop(); + if (!inputEvent) { + return; + } + var events = [inputEvent]; + // Do another undo/redo if the next one is of the same group. + while (inputStack.length && inputEvent.group && + inputEvent.group == inputStack[inputStack.length - 1].group) { + events.push(inputStack.pop()); + } + // Push these popped events on the opposite stack. + for (var i = 0, event; event = events[i]; i++) { + outputStack.push(event); + } + events = Blockly.Events.filter(events, redo); + Blockly.Events.recordUndo = false; + for (var i = 0, event; event = events[i]; i++) { + event.run(redo); + } + Blockly.Events.recordUndo = true; +}; + +/** + * Clear the undo/redo stacks. + */ +Blockly.Workspace.prototype.clearUndo = function() { + this.undoStack_.length = 0; + this.redoStack_.length = 0; + // Stop any events already in the firing queue from being undoable. + Blockly.Events.clearPendingUndo(); +}; + +/** + * When something in this workspace changes, call a function. + * @param {!Function} func Function to call. + * @return {!Function} Function that can be passed to + * removeChangeListener. + */ +Blockly.Workspace.prototype.addChangeListener = function(func) { + this.listeners_.push(func); + return func; +}; + +/** + * Stop listening for this workspace's changes. + * @param {Function} func Function to stop calling. + */ +Blockly.Workspace.prototype.removeChangeListener = function(func) { + goog.array.remove(this.listeners_, func); +}; + +/** + * Fire a change event. + * @param {!Blockly.Events.Abstract} event Event to fire. + */ +Blockly.Workspace.prototype.fireChangeListener = function(event) { + if (event.recordUndo) { + this.undoStack_.push(event); + this.redoStack_.length = 0; + if (this.undoStack_.length > this.MAX_UNDO) { + this.undoStack_.unshift(); + } + } + for (var i = 0, func; func = this.listeners_[i]; i++) { + func(event); + } +}; + +/** + * Find the block on this workspace with the specified ID. + * @param {string} id ID of block to find. + * @return {Blockly.Block} The sought after block or null if not found. + */ +Blockly.Workspace.prototype.getBlockById = function(id) { + return this.blockDB_[id] || null; +}; + +/** + * Checks whether all value and statement inputs in the workspace are filled + * with blocks. + * @param {boolean=} opt_shadowBlocksAreFilled An optional argument controlling + * whether shadow blocks are counted as filled. Defaults to true. + * @return {boolean} True if all inputs are filled, false otherwise. + */ +Blockly.Workspace.prototype.allInputsFilled = function(opt_shadowBlocksAreFilled) { + var blocks = this.getTopBlocks(false); + for (var i = 0, block; block = blocks[i]; i++) { + if (!block.allInputsFilled(opt_shadowBlocksAreFilled)) { + return false; + } + } + return true; +}; + +/** + * Database of all workspaces. + * @private + */ +Blockly.Workspace.WorkspaceDB_ = Object.create(null); + +/** + * Find the workspace with the specified ID. + * @param {string} id ID of workspace to find. + * @return {Blockly.Workspace} The sought after workspace or null if not found. + */ +Blockly.Workspace.getById = function(id) { + return Blockly.Workspace.WorkspaceDB_[id] || null; +}; + +// Export symbols that would otherwise be renamed by Closure compiler. +Blockly.Workspace.prototype['clear'] = Blockly.Workspace.prototype.clear; +Blockly.Workspace.prototype['clearUndo'] = + Blockly.Workspace.prototype.clearUndo; +Blockly.Workspace.prototype['addChangeListener'] = + Blockly.Workspace.prototype.addChangeListener; +Blockly.Workspace.prototype['removeChangeListener'] = + Blockly.Workspace.prototype.removeChangeListener; diff --git a/src/opsoro/server/static/js/blockly/core/workspace_drag_surface_svg.js b/src/opsoro/server/static/js/blockly/core/workspace_drag_surface_svg.js new file mode 100644 index 0000000..00128c4 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/workspace_drag_surface_svg.js @@ -0,0 +1,191 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview An SVG that floats on top of the workspace. + * Blocks are moved into this SVG during a drag, improving performance. + * The entire SVG is translated using css translation instead of SVG so the + * blocks are never repainted during drag improving performance. + * @author katelyn@google.com (Katelyn Mann) + */ + +'use strict'; + +goog.provide('Blockly.WorkspaceDragSurfaceSvg'); + +goog.require('Blockly.utils'); + +goog.require('goog.asserts'); +goog.require('goog.math.Coordinate'); + + +/** + * Blocks are moved into this SVG during a drag, improving performance. + * The entire SVG is translated using css transforms instead of SVG so the + * blocks are never repainted during drag improving performance. + * @param {!Element} container Containing element. + * @constructor + */ +Blockly.workspaceDragSurfaceSvg = function(container) { + this.container_ = container; + this.createDom(); +}; + +/** + * The SVG drag surface. Set once by Blockly.workspaceDragSurfaceSvg.createDom. + * @type {Element} + * @private + */ +Blockly.workspaceDragSurfaceSvg.prototype.SVG_ = null; + +/** + * SVG group inside the drag surface that holds blocks while a drag is in + * progress. Blocks are moved here by the workspace at start of a drag and moved + * back into the main SVG at the end of a drag. + * + * @type {Element} + * @private + */ +Blockly.workspaceDragSurfaceSvg.prototype.dragGroup_ = null; + +/** + * Containing HTML element; parent of the workspace and the drag surface. + * @type {Element} + * @private + */ +Blockly.workspaceDragSurfaceSvg.prototype.container_ = null; + +/** + * Create the drag surface and inject it into the container. + */ +Blockly.workspaceDragSurfaceSvg.prototype.createDom = function() { + if (this.SVG_) { + return; // Already created. + } + + /** + * Dom structure when the workspace is being dragged. If there is no drag in + * progress, the SVG is empty and display: none. + * + * + * /g> + * + */ + this.SVG_ = Blockly.utils.createSvgElement('svg', { + 'xmlns': Blockly.SVG_NS, + 'xmlns:html': Blockly.HTML_NS, + 'xmlns:xlink': 'http://www.w3.org/1999/xlink', + 'version': '1.1', + 'class': 'blocklyWsDragSurface' + }, null); + this.container_.appendChild(this.SVG_); +}; + +/** + * Translate the entire drag surface during a drag. + * We translate the drag surface instead of the blocks inside the surface + * so that the browser avoids repainting the SVG. + * Because of this, the drag coordinates must be adjusted by scale. + * @param {number} x X translation for the entire surface + * @param {number} y Y translation for the entire surface + * @package + */ +Blockly.workspaceDragSurfaceSvg.prototype.translateSurface = function(x, y) { + // This is a work-around to prevent a the blocks from rendering + // fuzzy while they are being moved on the drag surface. + x = x.toFixed(0); + y = y.toFixed(0); + + this.SVG_.style.display = 'block'; + Blockly.utils.setCssTransform(this.SVG_, + 'translate3d(' + x + 'px, ' + y + 'px, 0px)'); +}; + +/** + * Reports the surface translation in scaled workspace coordinates. + * Use this when finishing a drag to return blocks to the correct position. + * @return {!goog.math.Coordinate} Current translation of the surface + * @package + */ +Blockly.workspaceDragSurfaceSvg.prototype.getSurfaceTranslation = function() { + return Blockly.utils.getRelativeXY(this.SVG_); +}; + +/** + * Move the blockCanvas and bubbleCanvas out of the surface SVG and on to + * newSurface. + * @param {!SVGElement} newSurface The element to put the drag surface contents + * into. + * @package + */ +Blockly.workspaceDragSurfaceSvg.prototype.clearAndHide = function(newSurface) { + var blockCanvas = this.SVG_.childNodes[0]; + var bubbleCanvas = this.SVG_.childNodes[1]; + if (!blockCanvas || !bubbleCanvas || + !Blockly.utils.hasClass(blockCanvas, 'blocklyBlockCanvas') || + !Blockly.utils.hasClass(bubbleCanvas, 'blocklyBubbleCanvas')) { + throw 'Couldn\'t clear and hide the drag surface. A node was missing.'; + } + + // If there is a previous sibling, put the blockCanvas back right afterwards, + // otherwise insert it as the first child node in newSurface. + if (this.previousSibling_ != null) { + Blockly.utils.insertAfter_(blockCanvas, this.previousSibling_); + } else { + newSurface.insertBefore(blockCanvas, newSurface.firstChild); + } + + // Reattach the bubble canvas after the blockCanvas. + Blockly.utils.insertAfter_(bubbleCanvas, blockCanvas); + // Hide the drag surface. + this.SVG_.style.display = 'none'; + goog.asserts.assert(this.SVG_.childNodes.length == 0, + 'Drag surface was not cleared.'); + Blockly.utils.setCssTransform(this.SVG_, ''); + this.previousSibling_ = null; +}; + +/** + * Set the SVG to have the block canvas and bubble canvas in it and then + * show the surface. + * @param {!Element} blockCanvas The block canvas element from the workspace. + * @param {!Element} bubbleCanvas The element that contains the bubbles. + * @param {?Element} previousSibling The element to insert the block canvas & + bubble canvas after when it goes back in the dom at the end of a drag. + * @param {number} width The width of the workspace svg element. + * @param {number} height The height of the workspace svg element. + * @param {number} scale The scale of the workspace being dragged. + * @package + */ +Blockly.workspaceDragSurfaceSvg.prototype.setContentsAndShow = function( + blockCanvas, bubbleCanvas, previousSibling, width, height, scale) { + goog.asserts.assert(this.SVG_.childNodes.length == 0, + 'Already dragging a block.'); + this.previousSibling_ = previousSibling; + // Make sure the blocks and bubble canvas are scaled appropriately. + blockCanvas.setAttribute('transform', 'translate(0, 0) scale(' + scale + ')'); + bubbleCanvas.setAttribute('transform', + 'translate(0, 0) scale(' + scale + ')'); + this.SVG_.setAttribute('width', width); + this.SVG_.setAttribute('height', height); + this.SVG_.appendChild(blockCanvas); + this.SVG_.appendChild(bubbleCanvas); + this.SVG_.style.display = 'block'; +}; diff --git a/src/opsoro/server/static/js/blockly/core/workspace_svg.js b/src/opsoro/server/static/js/blockly/core/workspace_svg.js new file mode 100644 index 0000000..77600be --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/workspace_svg.js @@ -0,0 +1,1788 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2014 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Object representing a workspace rendered as SVG. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.WorkspaceSvg'); + +// TODO(scr): Fix circular dependencies +//goog.require('Blockly.BlockSvg'); +goog.require('Blockly.ConnectionDB'); +goog.require('Blockly.constants'); +goog.require('Blockly.Options'); +goog.require('Blockly.ScrollbarPair'); +goog.require('Blockly.Touch'); +goog.require('Blockly.Trashcan'); +goog.require('Blockly.Workspace'); +goog.require('Blockly.WorkspaceDragSurfaceSvg'); +goog.require('Blockly.Xml'); +goog.require('Blockly.ZoomControls'); + +goog.require('goog.array'); +goog.require('goog.dom'); +goog.require('goog.math.Coordinate'); +goog.require('goog.userAgent'); + + +/** + * Class for a workspace. This is an onscreen area with optional trashcan, + * scrollbars, bubbles, and dragging. + * @param {!Blockly.Options} options Dictionary of options. + * @param {Blockly.BlockDragSurfaceSvg=} opt_blockDragSurface Drag surface for + * blocks. + * @param {Blockly.workspaceDragSurfaceSvg=} opt_wsDragSurface Drag surface for + * the workspace. + * @extends {Blockly.Workspace} + * @constructor + */ +Blockly.WorkspaceSvg = function(options, opt_blockDragSurface, opt_wsDragSurface) { + Blockly.WorkspaceSvg.superClass_.constructor.call(this, options); + this.getMetrics = + options.getMetrics || Blockly.WorkspaceSvg.getTopLevelWorkspaceMetrics_; + this.setMetrics = + options.setMetrics || Blockly.WorkspaceSvg.setTopLevelWorkspaceMetrics_; + + Blockly.ConnectionDB.init(this); + + if (opt_blockDragSurface) { + this.blockDragSurface_ = opt_blockDragSurface; + } + + if (opt_wsDragSurface) { + this.workspaceDragSurface_ = opt_wsDragSurface; + } + + this.useWorkspaceDragSurface_ = + this.workspaceDragSurface_ && Blockly.utils.is3dSupported(); + + /** + * Database of pre-loaded sounds. + * @private + * @const + */ + this.SOUNDS_ = Object.create(null); + /** + * List of currently highlighted blocks. Block highlighting is often used to + * visually mark blocks currently being executed. + * @type !Array. + * @private + */ + this.highlightedBlocks_ = []; + + this.registerToolboxCategoryCallback(Blockly.VARIABLE_CATEGORY_NAME, + Blockly.Variables.flyoutCategory); + this.registerToolboxCategoryCallback(Blockly.PROCEDURE_CATEGORY_NAME, + Blockly.Procedures.flyoutCategory); +}; +goog.inherits(Blockly.WorkspaceSvg, Blockly.Workspace); + +/** + * A wrapper function called when a resize event occurs. + * You can pass the result to `unbindEvent_`. + * @type {Array.} + */ +Blockly.WorkspaceSvg.prototype.resizeHandlerWrapper_ = null; + +/** + * The render status of an SVG workspace. + * Returns `true` for visible workspaces and `false` for non-visible, + * or headless, workspaces. + * @type {boolean} + */ +Blockly.WorkspaceSvg.prototype.rendered = true; + +/** + * Is this workspace the surface for a flyout? + * @type {boolean} + */ +Blockly.WorkspaceSvg.prototype.isFlyout = false; + +/** + * Is this workspace the surface for a mutator? + * @type {boolean} + * @package + */ +Blockly.WorkspaceSvg.prototype.isMutator = false; + +/** + * Is this workspace currently being dragged around? + * DRAG_NONE - No drag operation. + * DRAG_BEGIN - Still inside the initial DRAG_RADIUS. + * DRAG_FREE - Workspace has been dragged further than DRAG_RADIUS. + * @private + */ +Blockly.WorkspaceSvg.prototype.dragMode_ = Blockly.DRAG_NONE; + +/** + * Whether this workspace has resizes enabled. + * Disable during batch operations for a performance improvement. + * @type {boolean} + * @private + */ +Blockly.WorkspaceSvg.prototype.resizesEnabled_ = true; + +/** + * Current horizontal scrolling offset. + * @type {number} + */ +Blockly.WorkspaceSvg.prototype.scrollX = 0; + +/** + * Current vertical scrolling offset. + * @type {number} + */ +Blockly.WorkspaceSvg.prototype.scrollY = 0; + +/** + * Horizontal scroll value when scrolling started. + * @type {number} + */ +Blockly.WorkspaceSvg.prototype.startScrollX = 0; + +/** + * Vertical scroll value when scrolling started. + * @type {number} + */ +Blockly.WorkspaceSvg.prototype.startScrollY = 0; + +/** + * Distance from mouse to object being dragged. + * @type {goog.math.Coordinate} + * @private + */ +Blockly.WorkspaceSvg.prototype.dragDeltaXY_ = null; + +/** + * Current scale. + * @type {number} + */ +Blockly.WorkspaceSvg.prototype.scale = 1; + +/** + * The workspace's trashcan (if any). + * @type {Blockly.Trashcan} + */ +Blockly.WorkspaceSvg.prototype.trashcan = null; + +/** + * This workspace's scrollbars, if they exist. + * @type {Blockly.ScrollbarPair} + */ +Blockly.WorkspaceSvg.prototype.scrollbar = null; + +/** + * This workspace's surface for dragging blocks, if it exists. + * @type {Blockly.BlockDragSurfaceSvg} + * @private + */ +Blockly.WorkspaceSvg.prototype.blockDragSurface_ = null; + +/** + * This workspace's drag surface, if it exists. + * @type {Blockly.WorkspaceDragSurfaceSvg} + * @private + */ +Blockly.WorkspaceSvg.prototype.workspaceDragSurface_ = null; + +/** + * Whether to move workspace to the drag surface when it is dragged. + * True if it should move, false if it should be translated directly. + * @type {boolean} + * @private + */ +Blockly.WorkspaceSvg.prototype.useWorkspaceDragSurface_ = false; + +/** + * Whether the drag surface is actively in use. When true, calls to + * translate will translate the drag surface instead of the translating the + * workspace directly. + * This is set to true in setupDragSurface and to false in resetDragSurface. + * @type {boolean} + * @private + */ +Blockly.WorkspaceSvg.prototype.isDragSurfaceActive_ = false; + +/** + * Time that the last sound was played. + * @type {Date} + * @private + */ +Blockly.WorkspaceSvg.prototype.lastSound_ = null; + +/** + * Last known position of the page scroll. + * This is used to determine whether we have recalculated screen coordinate + * stuff since the page scrolled. + * @type {!goog.math.Coordinate} + * @private + */ +Blockly.WorkspaceSvg.prototype.lastRecordedPageScroll_ = null; + +/** + * Map from function names to callbacks, for deciding what to do when a button + * is clicked. + * @type {!Object} + * @private + */ +Blockly.WorkspaceSvg.prototype.flyoutButtonCallbacks_ = {}; + +/** + * Map from function names to callbacks, for deciding what to do when a custom + * toolbox category is opened. + * @type {!Object>} + * @private + */ +Blockly.WorkspaceSvg.prototype.toolboxCategoryCallbacks_ = {}; + +/** + * Inverted screen CTM, for use in mouseToSvg. + * @type {SVGMatrix} + * @private + */ +Blockly.WorkspaceSvg.prototype.inverseScreenCTM_ = null; + +/** + * Getter for the inverted screen CTM. + * @return {SVGMatrix} The matrix to use in mouseToSvg + */ +Blockly.WorkspaceSvg.prototype.getInverseScreenCTM = function() { + return this.inverseScreenCTM_; +}; + +/** + * Update the inverted screen CTM. + */ +Blockly.WorkspaceSvg.prototype.updateInverseScreenCTM = function() { + var ctm = this.getParentSvg().getScreenCTM(); + if (ctm) { + this.inverseScreenCTM_ = ctm.inverse(); + } +}; + +/** + * Return the absolute coordinates of the top-left corner of this element, + * scales that after canvas SVG element, if it's a descendant. + * The origin (0,0) is the top-left corner of the Blockly SVG. + * @param {!Element} element Element to find the coordinates of. + * @return {!goog.math.Coordinate} Object with .x and .y properties. + * @private + */ +Blockly.WorkspaceSvg.prototype.getSvgXY = function(element) { + var x = 0; + var y = 0; + var scale = 1; + if (goog.dom.contains(this.getCanvas(), element) || + goog.dom.contains(this.getBubbleCanvas(), element)) { + // Before the SVG canvas, scale the coordinates. + scale = this.scale; + } + do { + // Loop through this block and every parent. + var xy = Blockly.utils.getRelativeXY(element); + if (element == this.getCanvas() || + element == this.getBubbleCanvas()) { + // After the SVG canvas, don't scale the coordinates. + scale = 1; + } + x += xy.x * scale; + y += xy.y * scale; + element = element.parentNode; + } while (element && element != this.getParentSvg()); + return new goog.math.Coordinate(x, y); +}; + +/** + * Save resize handler data so we can delete it later in dispose. + * @param {!Array.} handler Data that can be passed to unbindEvent_. + */ +Blockly.WorkspaceSvg.prototype.setResizeHandlerWrapper = function(handler) { + this.resizeHandlerWrapper_ = handler; +}; + +/** + * Create the workspace DOM elements. + * @param {string=} opt_backgroundClass Either 'blocklyMainBackground' or + * 'blocklyMutatorBackground'. + * @return {!Element} The workspace's SVG group. + */ +Blockly.WorkspaceSvg.prototype.createDom = function(opt_backgroundClass) { + /** + * + * + * [Trashcan and/or flyout may go here] + * + * + * + * @type {SVGElement} + */ + this.svgGroup_ = Blockly.utils.createSvgElement('g', + {'class': 'blocklyWorkspace'}, null); + if (opt_backgroundClass) { + /** @type {SVGElement} */ + this.svgBackground_ = Blockly.utils.createSvgElement('rect', + {'height': '100%', 'width': '100%', 'class': opt_backgroundClass}, + this.svgGroup_); + if (opt_backgroundClass == 'blocklyMainBackground') { + this.svgBackground_.style.fill = + 'url(#' + this.options.gridPattern.id + ')'; + } + } + /** @type {SVGElement} */ + this.svgBlockCanvas_ = Blockly.utils.createSvgElement('g', + {'class': 'blocklyBlockCanvas'}, this.svgGroup_, this); + /** @type {SVGElement} */ + this.svgBubbleCanvas_ = Blockly.utils.createSvgElement('g', + {'class': 'blocklyBubbleCanvas'}, this.svgGroup_, this); + var bottom = Blockly.Scrollbar.scrollbarThickness; + if (this.options.hasTrashcan) { + bottom = this.addTrashcan_(bottom); + } + if (this.options.zoomOptions && this.options.zoomOptions.controls) { + bottom = this.addZoomControls_(bottom); + } + + if (!this.isFlyout) { + Blockly.bindEventWithChecks_(this.svgGroup_, 'mousedown', this, + this.onMouseDown_); + var thisWorkspace = this; + Blockly.bindEvent_(this.svgGroup_, 'touchstart', null, + function(e) {Blockly.longStart_(e, thisWorkspace);}); + if (this.options.zoomOptions && this.options.zoomOptions.wheel) { + // Mouse-wheel. + Blockly.bindEventWithChecks_(this.svgGroup_, 'wheel', this, + this.onMouseWheel_); + } + } + + // Determine if there needs to be a category tree, or a simple list of + // blocks. This cannot be changed later, since the UI is very different. + if (this.options.hasCategories) { + /** + * @type {Blockly.Toolbox} + * @private + */ + this.toolbox_ = new Blockly.Toolbox(this); + } + this.updateGridPattern_(); + this.recordDeleteAreas(); + return this.svgGroup_; +}; + +/** + * Dispose of this workspace. + * Unlink from all DOM elements to prevent memory leaks. + */ +Blockly.WorkspaceSvg.prototype.dispose = function() { + // Stop rerendering. + this.rendered = false; + Blockly.WorkspaceSvg.superClass_.dispose.call(this); + if (this.svgGroup_) { + goog.dom.removeNode(this.svgGroup_); + this.svgGroup_ = null; + } + this.svgBlockCanvas_ = null; + this.svgBubbleCanvas_ = null; + if (this.toolbox_) { + this.toolbox_.dispose(); + this.toolbox_ = null; + } + if (this.flyout_) { + this.flyout_.dispose(); + this.flyout_ = null; + } + if (this.trashcan) { + this.trashcan.dispose(); + this.trashcan = null; + } + if (this.scrollbar) { + this.scrollbar.dispose(); + this.scrollbar = null; + } + if (this.zoomControls_) { + this.zoomControls_.dispose(); + this.zoomControls_ = null; + } + + if (this.toolboxCategoryCallbacks_) { + this.toolboxCategoryCallbacks_ = null; + } + if (this.flyoutButtonCallbacks_) { + this.flyoutButtonCallbacks_ = null; + } + if (!this.options.parentWorkspace) { + // Top-most workspace. Dispose of the div that the + // svg is injected into (i.e. injectionDiv). + goog.dom.removeNode(this.getParentSvg().parentNode); + } + if (this.resizeHandlerWrapper_) { + Blockly.unbindEvent_(this.resizeHandlerWrapper_); + this.resizeHandlerWrapper_ = null; + } +}; + +/** + * Obtain a newly created block. + * @param {?string} prototypeName Name of the language object containing + * type-specific functions for this block. + * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise + * create a new ID. + * @return {!Blockly.BlockSvg} The created block. + */ +Blockly.WorkspaceSvg.prototype.newBlock = function(prototypeName, opt_id) { + return new Blockly.BlockSvg(this, prototypeName, opt_id); +}; + +/** + * Add a trashcan. + * @param {number} bottom Distance from workspace bottom to bottom of trashcan. + * @return {number} Distance from workspace bottom to the top of trashcan. + * @private + */ +Blockly.WorkspaceSvg.prototype.addTrashcan_ = function(bottom) { + /** @type {Blockly.Trashcan} */ + this.trashcan = new Blockly.Trashcan(this); + var svgTrashcan = this.trashcan.createDom(); + this.svgGroup_.insertBefore(svgTrashcan, this.svgBlockCanvas_); + return this.trashcan.init(bottom); +}; + +/** + * Add zoom controls. + * @param {number} bottom Distance from workspace bottom to bottom of controls. + * @return {number} Distance from workspace bottom to the top of controls. + * @private + */ +Blockly.WorkspaceSvg.prototype.addZoomControls_ = function(bottom) { + /** @type {Blockly.ZoomControls} */ + this.zoomControls_ = new Blockly.ZoomControls(this); + var svgZoomControls = this.zoomControls_.createDom(); + this.svgGroup_.appendChild(svgZoomControls); + return this.zoomControls_.init(bottom); +}; + +/** + * Add a flyout element in an element with the given tag name. + * @param {string} tagName What type of tag the flyout belongs in. + * @return {!Element} The element containing the flyout dom. + * @private + */ +Blockly.WorkspaceSvg.prototype.addFlyout_ = function(tagName) { + var workspaceOptions = { + disabledPatternId: this.options.disabledPatternId, + parentWorkspace: this, + RTL: this.RTL, + oneBasedIndex: this.options.oneBasedIndex, + horizontalLayout: this.horizontalLayout, + toolboxPosition: this.options.toolboxPosition + }; + /** @type {Blockly.Flyout} */ + this.flyout_ = new Blockly.Flyout(workspaceOptions); + this.flyout_.autoClose = false; + + // Return the element so that callers can place it in their desired + // spot in the dom. For exmaple, mutator flyouts do not go in the same place + // as main workspace flyouts. + return this.flyout_.createDom(tagName); +}; + +/** + * Getter for the flyout associated with this workspace. This flyout may be + * owned by either the toolbox or the workspace, depending on toolbox + * configuration. It will be null if there is no flyout. + * @return {Blockly.Flyout} The flyout on this workspace. + * @package + */ +Blockly.WorkspaceSvg.prototype.getFlyout_ = function() { + if (this.flyout_) { + return this.flyout_; + } + if (this.toolbox_) { + return this.toolbox_.flyout_; + } + return null; +}; + +/** + * Update items that use screen coordinate calculations + * because something has changed (e.g. scroll position, window size). + * @private + */ +Blockly.WorkspaceSvg.prototype.updateScreenCalculations_ = function() { + this.updateInverseScreenCTM(); + this.recordDeleteAreas(); +}; + +/** + * If enabled, resize the parts of the workspace that change when the workspace + * contents (e.g. block positions) change. This will also scroll the + * workspace contents if needed. + * @package + */ +Blockly.WorkspaceSvg.prototype.resizeContents = function() { + if (!this.resizesEnabled_ || !this.rendered) { + return; + } + if (this.scrollbar) { + // TODO(picklesrus): Once rachel-fenichel's scrollbar refactoring + // is complete, call the method that only resizes scrollbar + // based on contents. + this.scrollbar.resize(); + } + this.updateInverseScreenCTM(); +}; + +/** + * Resize and reposition all of the workspace chrome (toolbox, + * trash, scrollbars etc.) + * This should be called when something changes that + * requires recalculating dimensions and positions of the + * trash, zoom, toolbox, etc. (e.g. window resize). + */ +Blockly.WorkspaceSvg.prototype.resize = function() { + if (this.toolbox_) { + this.toolbox_.position(); + } + if (this.flyout_) { + this.flyout_.position(); + } + if (this.trashcan) { + this.trashcan.position(); + } + if (this.zoomControls_) { + this.zoomControls_.position(); + } + if (this.scrollbar) { + this.scrollbar.resize(); + } + this.updateScreenCalculations_(); +}; + +/** + * Resizes and repositions workspace chrome if the page has a new + * scroll position. + * @package + */ +Blockly.WorkspaceSvg.prototype.updateScreenCalculationsIfScrolled + = function() { + /* eslint-disable indent */ + var currScroll = goog.dom.getDocumentScroll(); + if (!goog.math.Coordinate.equals(this.lastRecordedPageScroll_, + currScroll)) { + this.lastRecordedPageScroll_ = currScroll; + this.updateScreenCalculations_(); + } +}; /* eslint-enable indent */ + +/** + * Get the SVG element that forms the drawing surface. + * @return {!Element} SVG element. + */ +Blockly.WorkspaceSvg.prototype.getCanvas = function() { + return this.svgBlockCanvas_; +}; + +/** + * Get the SVG element that forms the bubble surface. + * @return {!SVGGElement} SVG element. + */ +Blockly.WorkspaceSvg.prototype.getBubbleCanvas = function() { + return this.svgBubbleCanvas_; +}; + +/** + * Get the SVG element that contains this workspace. + * @return {!Element} SVG element. + */ +Blockly.WorkspaceSvg.prototype.getParentSvg = function() { + if (this.cachedParentSvg_) { + return this.cachedParentSvg_; + } + var element = this.svgGroup_; + while (element) { + if (element.tagName == 'svg') { + this.cachedParentSvg_ = element; + return element; + } + element = element.parentNode; + } + return null; +}; + +/** + * Translate this workspace to new coordinates. + * @param {number} x Horizontal translation. + * @param {number} y Vertical translation. + */ +Blockly.WorkspaceSvg.prototype.translate = function(x, y) { + if (this.useWorkspaceDragSurface_ && this.isDragSurfaceActive_) { + this.workspaceDragSurface_.translateSurface(x,y); + } else { + var translation = 'translate(' + x + ',' + y + ') ' + + 'scale(' + this.scale + ')'; + this.svgBlockCanvas_.setAttribute('transform', translation); + this.svgBubbleCanvas_.setAttribute('transform', translation); + } + // Now update the block drag surface if we're using one. + if (this.blockDragSurface_) { + this.blockDragSurface_.translateAndScaleGroup(x, y, this.scale); + } +}; + +/** + * Called at the end of a workspace drag to take the contents + * out of the drag surface and put them back into the workspace svg. + * Does nothing if the workspace drag surface is not enabled. + * @package + */ +Blockly.WorkspaceSvg.prototype.resetDragSurface = function() { + // Don't do anything if we aren't using a drag surface. + if (!this.useWorkspaceDragSurface_) { + return; + } + + this.isDragSurfaceActive_ = false; + + var trans = this.workspaceDragSurface_.getSurfaceTranslation(); + this.workspaceDragSurface_.clearAndHide(this.svgGroup_); + var translation = 'translate(' + trans.x + ',' + trans.y + ') ' + + 'scale(' + this.scale + ')'; + this.svgBlockCanvas_.setAttribute('transform', translation); + this.svgBubbleCanvas_.setAttribute('transform', translation); +}; + +/** + * Called at the beginning of a workspace drag to move contents of + * the workspace to the drag surface. + * Does nothing if the drag surface is not enabled. + * @package + */ +Blockly.WorkspaceSvg.prototype.setupDragSurface = function() { + // Don't do anything if we aren't using a drag surface. + if (!this.useWorkspaceDragSurface_) { + return; + } + + // This can happen if the user starts a drag, mouses up outside of the + // document where the mouseup listener is registered (e.g. outside of an + // iframe) and then moves the mouse back in the workspace. On mobile and ff, + // we get the mouseup outside the frame. On chrome and safari desktop we do + // not. + if (this.isDragSurfaceActive_) { + return; + } + + this.isDragSurfaceActive_ = true; + + // Figure out where we want to put the canvas back. The order + // in the is important because things are layered. + var previousElement = this.svgBlockCanvas_.previousSibling; + var width = this.getParentSvg().getAttribute("width"); + var height = this.getParentSvg().getAttribute("height"); + var coord = Blockly.utils.getRelativeXY(this.svgBlockCanvas_); + this.workspaceDragSurface_.setContentsAndShow(this.svgBlockCanvas_, + this.svgBubbleCanvas_, previousElement, width, height, this.scale); + this.workspaceDragSurface_.translateSurface(coord.x, coord.y); +}; + +/** + * Returns the horizontal offset of the workspace. + * Intended for LTR/RTL compatibility in XML. + * @return {number} Width. + */ +Blockly.WorkspaceSvg.prototype.getWidth = function() { + var metrics = this.getMetrics(); + return metrics ? metrics.viewWidth / this.scale : 0; +}; + +/** + * Toggles the visibility of the workspace. + * Currently only intended for main workspace. + * @param {boolean} isVisible True if workspace should be visible. + */ +Blockly.WorkspaceSvg.prototype.setVisible = function(isVisible) { + + // Tell the scrollbar whether its container is visible so it can + // tell when to hide itself. + if (this.scrollbar) { + this.scrollbar.setContainerVisible(isVisible); + } + + // Tell the flyout whether its container is visible so it can + // tell when to hide itself. + if (this.getFlyout_()) { + this.getFlyout_().setContainerVisible(isVisible); + } + + this.getParentSvg().style.display = isVisible ? 'block' : 'none'; + if (this.toolbox_) { + // Currently does not support toolboxes in mutators. + this.toolbox_.HtmlDiv.style.display = isVisible ? 'block' : 'none'; + } + if (isVisible) { + this.render(); + if (this.toolbox_) { + this.toolbox_.position(); + } + } else { + Blockly.hideChaff(true); + } +}; + +/** + * Render all blocks in workspace. + */ +Blockly.WorkspaceSvg.prototype.render = function() { + // Generate list of all blocks. + var blocks = this.getAllBlocks(); + // Render each block. + for (var i = blocks.length - 1; i >= 0; i--) { + blocks[i].render(false); + } +}; + +/** + * Was used back when block highlighting (for execution) and block selection + * (for editing) were the same thing. + * Any calls of this function can be deleted. + * @deprecated October 2016 + */ +Blockly.WorkspaceSvg.prototype.traceOn = function() { + console.warn('Deprecated call to traceOn, delete this.'); +}; + +/** + * Highlight or unhighlight a block in the workspace. Block highlighting is + * often used to visually mark blocks currently being executed. + * @param {?string} id ID of block to highlight/unhighlight, + * or null for no block (used to unhighlight all blocks). + * @param {boolean=} opt_state If undefined, highlight specified block and + * automatically unhighlight all others. If true or false, manually + * highlight/unhighlight the specified block. + */ +Blockly.WorkspaceSvg.prototype.highlightBlock = function(id, opt_state) { + if (opt_state === undefined) { + // Unhighlight all blocks. + for (var i = 0, block; block = this.highlightedBlocks_[i]; i++) { + block.setHighlighted(false); + } + this.highlightedBlocks_.length = 0; + } + // Highlight/unhighlight the specified block. + var block = id ? this.getBlockById(id) : null; + if (block) { + var state = (opt_state === undefined) || opt_state; + // Using Set here would be great, but at the cost of IE10 support. + if (!state) { + goog.array.remove(this.highlightedBlocks_, block); + } else if (this.highlightedBlocks_.indexOf(block) == -1) { + this.highlightedBlocks_.push(block); + } + block.setHighlighted(state); + } +}; + +/** + * Paste the provided block onto the workspace. + * @param {!Element} xmlBlock XML block element. + */ +Blockly.WorkspaceSvg.prototype.paste = function(xmlBlock) { + if (!this.rendered || xmlBlock.getElementsByTagName('block').length >= + this.remainingCapacity()) { + return; + } + Blockly.terminateDrag_(); // Dragging while pasting? No. + Blockly.Events.disable(); + try { + var block = Blockly.Xml.domToBlock(xmlBlock, this); + // Move the duplicate to original position. + var blockX = parseInt(xmlBlock.getAttribute('x'), 10); + var blockY = parseInt(xmlBlock.getAttribute('y'), 10); + if (!isNaN(blockX) && !isNaN(blockY)) { + if (this.RTL) { + blockX = -blockX; + } + // Offset block until not clobbering another block and not in connection + // distance with neighbouring blocks. + do { + var collide = false; + var allBlocks = this.getAllBlocks(); + for (var i = 0, otherBlock; otherBlock = allBlocks[i]; i++) { + var otherXY = otherBlock.getRelativeToSurfaceXY(); + if (Math.abs(blockX - otherXY.x) <= 1 && + Math.abs(blockY - otherXY.y) <= 1) { + collide = true; + break; + } + } + if (!collide) { + // Check for blocks in snap range to any of its connections. + var connections = block.getConnections_(false); + for (var i = 0, connection; connection = connections[i]; i++) { + var neighbour = connection.closest(Blockly.SNAP_RADIUS, + new goog.math.Coordinate(blockX, blockY)); + if (neighbour.connection) { + collide = true; + break; + } + } + } + if (collide) { + if (this.RTL) { + blockX -= Blockly.SNAP_RADIUS; + } else { + blockX += Blockly.SNAP_RADIUS; + } + blockY += Blockly.SNAP_RADIUS * 2; + } + } while (collide); + block.moveBy(blockX, blockY); + } + } finally { + Blockly.Events.enable(); + } + if (Blockly.Events.isEnabled() && !block.isShadow()) { + Blockly.Events.fire(new Blockly.Events.Create(block)); + } + block.select(); +}; + +/** + * Create a new variable with the given name. Update the flyout to show the new + * variable immediately. + * TODO: #468 + * @param {string} name The new variable's name. + */ +Blockly.WorkspaceSvg.prototype.createVariable = function(name) { + Blockly.WorkspaceSvg.superClass_.createVariable.call(this, name); + // Don't refresh the toolbox if there's a drag in progress. + if (this.toolbox_ && this.toolbox_.flyout_ && !Blockly.Flyout.startFlyout_) { + this.toolbox_.refreshSelection(); + } +}; + +/** + * Make a list of all the delete areas for this workspace. + */ +Blockly.WorkspaceSvg.prototype.recordDeleteAreas = function() { + if (this.trashcan) { + this.deleteAreaTrash_ = this.trashcan.getClientRect(); + } else { + this.deleteAreaTrash_ = null; + } + if (this.flyout_) { + this.deleteAreaToolbox_ = this.flyout_.getClientRect(); + } else if (this.toolbox_) { + this.deleteAreaToolbox_ = this.toolbox_.getClientRect(); + } else { + this.deleteAreaToolbox_ = null; + } +}; + +/** + * Is the mouse event over a delete area (toolbox or non-closing flyout)? + * Opens or closes the trashcan and sets the cursor as a side effect. + * @param {!Event} e Mouse move event. + * @return {?number} Null if not over a delete area, or an enum representing + * which delete area the event is over. + */ +Blockly.WorkspaceSvg.prototype.isDeleteArea = function(e) { + var xy = new goog.math.Coordinate(e.clientX, e.clientY); + if (this.deleteAreaTrash_ && this.deleteAreaTrash_.contains(xy)) { + return Blockly.DELETE_AREA_TRASH; + } + if (this.deleteAreaToolbox_ && this.deleteAreaToolbox_.contains(xy)) { + return Blockly.DELETE_AREA_TOOLBOX; + } + return null; +}; + +/** + * Handle a mouse-down on SVG drawing surface. + * @param {!Event} e Mouse down event. + * @private + */ +Blockly.WorkspaceSvg.prototype.onMouseDown_ = function(e) { + this.markFocused(); + if (Blockly.utils.isTargetInput(e)) { + Blockly.Touch.clearTouchIdentifier(); + return; + } + Blockly.terminateDrag_(); // In case mouse-up event was lost. + Blockly.hideChaff(); + var isTargetWorkspace = e.target && e.target.nodeName && + (e.target.nodeName.toLowerCase() == 'svg' || + e.target == this.svgBackground_); + if (isTargetWorkspace && Blockly.selected && !this.options.readOnly) { + // Clicking on the document clears the selection. + Blockly.selected.unselect(); + } + if (Blockly.utils.isRightButton(e)) { + // Right-click. + this.showContextMenu_(e); + // This is to handle the case where the event is pretending to be a right + // click event but it was really a long press. In that case, we want to make + // sure any in progress drags are stopped. + Blockly.onMouseUp_(e); + // Since this was a click, not a drag, end the gesture immediately. + Blockly.Touch.clearTouchIdentifier(); + } else if (this.scrollbar) { + this.dragMode_ = Blockly.DRAG_BEGIN; + // Record the current mouse position. + this.startDragMouseX = e.clientX; + this.startDragMouseY = e.clientY; + this.startDragMetrics = this.getMetrics(); + this.startScrollX = this.scrollX; + this.startScrollY = this.scrollY; + + this.setupDragSurface(); + // If this is a touch event then bind to the mouseup so workspace drag mode + // is turned off and double move events are not performed on a block. + // See comment in inject.js Blockly.init_ as to why mouseup events are + // bound to the document instead of the SVG's surface. + if ('mouseup' in Blockly.Touch.TOUCH_MAP) { + Blockly.Touch.onTouchUpWrapper_ = Blockly.Touch.onTouchUpWrapper_ || []; + Blockly.Touch.onTouchUpWrapper_ = Blockly.Touch.onTouchUpWrapper_.concat( + Blockly.bindEventWithChecks_(document, 'mouseup', null, + Blockly.onMouseUp_)); + } + Blockly.onMouseMoveWrapper_ = Blockly.onMouseMoveWrapper_ || []; + Blockly.onMouseMoveWrapper_ = Blockly.onMouseMoveWrapper_.concat( + Blockly.bindEventWithChecks_(document, 'mousemove', null, + Blockly.onMouseMove_)); + } else { + // It was a click, but the workspace isn't draggable. + Blockly.Touch.clearTouchIdentifier(); + } + // This event has been handled. No need to bubble up to the document. + e.stopPropagation(); + e.preventDefault(); +}; + +/** + * Start tracking a drag of an object on this workspace. + * @param {!Event} e Mouse down event. + * @param {!goog.math.Coordinate} xy Starting location of object. + */ +Blockly.WorkspaceSvg.prototype.startDrag = function(e, xy) { + // Record the starting offset between the bubble's location and the mouse. + var point = Blockly.utils.mouseToSvg(e, this.getParentSvg(), + this.getInverseScreenCTM()); + // Fix scale of mouse event. + point.x /= this.scale; + point.y /= this.scale; + this.dragDeltaXY_ = goog.math.Coordinate.difference(xy, point); +}; + +/** + * Track a drag of an object on this workspace. + * @param {!Event} e Mouse move event. + * @return {!goog.math.Coordinate} New location of object. + */ +Blockly.WorkspaceSvg.prototype.moveDrag = function(e) { + var point = Blockly.utils.mouseToSvg(e, this.getParentSvg(), + this.getInverseScreenCTM()); + // Fix scale of mouse event. + point.x /= this.scale; + point.y /= this.scale; + return goog.math.Coordinate.sum(this.dragDeltaXY_, point); +}; + +/** + * Is the user currently dragging a block or scrolling the flyout/workspace? + * @return {boolean} True if currently dragging or scrolling. + */ +Blockly.WorkspaceSvg.prototype.isDragging = function() { + return Blockly.dragMode_ == Blockly.DRAG_FREE || + (Blockly.Flyout.startFlyout_ && + Blockly.Flyout.startFlyout_.dragMode_ == Blockly.DRAG_FREE) || + this.dragMode_ == Blockly.DRAG_FREE; +}; + +/** + * Is this workspace draggable and scrollable? + * @return {boolean} True if this workspace may be dragged. + */ +Blockly.WorkspaceSvg.prototype.isDraggable = function() { + return !!this.scrollbar; +}; + +/** + * Handle a mouse-wheel on SVG drawing surface. + * @param {!Event} e Mouse wheel event. + * @private + */ +Blockly.WorkspaceSvg.prototype.onMouseWheel_ = function(e) { + // TODO: Remove terminateDrag and compensate for coordinate skew during zoom. + Blockly.terminateDrag_(); + // The vertical scroll distance that corresponds to a click of a zoom button. + var PIXELS_PER_ZOOM_STEP = 50; + var delta = -e.deltaY / PIXELS_PER_ZOOM_STEP; + var position = Blockly.utils.mouseToSvg(e, this.getParentSvg(), + this.getInverseScreenCTM()); + this.zoom(position.x, position.y, delta); + e.preventDefault(); +}; + +/** + * Calculate the bounding box for the blocks on the workspace. + * + * @return {Object} Contains the position and size of the bounding box + * containing the blocks on the workspace. + */ +Blockly.WorkspaceSvg.prototype.getBlocksBoundingBox = function() { + var topBlocks = this.getTopBlocks(false); + // There are no blocks, return empty rectangle. + if (!topBlocks.length) { + return {x: 0, y: 0, width: 0, height: 0}; + } + + // Initialize boundary using the first block. + var boundary = topBlocks[0].getBoundingRectangle(); + + // Start at 1 since the 0th block was used for initialization + for (var i = 1; i < topBlocks.length; i++) { + var blockBoundary = topBlocks[i].getBoundingRectangle(); + if (blockBoundary.topLeft.x < boundary.topLeft.x) { + boundary.topLeft.x = blockBoundary.topLeft.x; + } + if (blockBoundary.bottomRight.x > boundary.bottomRight.x) { + boundary.bottomRight.x = blockBoundary.bottomRight.x; + } + if (blockBoundary.topLeft.y < boundary.topLeft.y) { + boundary.topLeft.y = blockBoundary.topLeft.y; + } + if (blockBoundary.bottomRight.y > boundary.bottomRight.y) { + boundary.bottomRight.y = blockBoundary.bottomRight.y; + } + } + return { + x: boundary.topLeft.x, + y: boundary.topLeft.y, + width: boundary.bottomRight.x - boundary.topLeft.x, + height: boundary.bottomRight.y - boundary.topLeft.y + }; +}; + +/** + * Clean up the workspace by ordering all the blocks in a column. + */ +Blockly.WorkspaceSvg.prototype.cleanUp = function() { + Blockly.Events.setGroup(true); + var topBlocks = this.getTopBlocks(true); + var cursorY = 0; + for (var i = 0, block; block = topBlocks[i]; i++) { + var xy = block.getRelativeToSurfaceXY(); + block.moveBy(-xy.x, cursorY - xy.y); + block.snapToGrid(); + cursorY = block.getRelativeToSurfaceXY().y + + block.getHeightWidth().height + Blockly.BlockSvg.MIN_BLOCK_Y; + } + Blockly.Events.setGroup(false); + // Fire an event to allow scrollbars to resize. + this.resizeContents(); +}; + +/** + * Show the context menu for the workspace. + * @param {!Event} e Mouse event. + * @private + */ +Blockly.WorkspaceSvg.prototype.showContextMenu_ = function(e) { + if (this.options.readOnly || this.isFlyout) { + return; + } + var menuOptions = []; + var topBlocks = this.getTopBlocks(true); + var eventGroup = Blockly.utils.genUid(); + + // Options to undo/redo previous action. + var undoOption = {}; + undoOption.text = Blockly.Msg.UNDO; + undoOption.enabled = this.undoStack_.length > 0; + undoOption.callback = this.undo.bind(this, false); + menuOptions.push(undoOption); + var redoOption = {}; + redoOption.text = Blockly.Msg.REDO; + redoOption.enabled = this.redoStack_.length > 0; + redoOption.callback = this.undo.bind(this, true); + menuOptions.push(redoOption); + + // Option to clean up blocks. + if (this.scrollbar) { + var cleanOption = {}; + cleanOption.text = Blockly.Msg.CLEAN_UP; + cleanOption.enabled = topBlocks.length > 1; + cleanOption.callback = this.cleanUp.bind(this); + menuOptions.push(cleanOption); + } + + // Add a little animation to collapsing and expanding. + var DELAY = 10; + if (this.options.collapse) { + var hasCollapsedBlocks = false; + var hasExpandedBlocks = false; + for (var i = 0; i < topBlocks.length; i++) { + var block = topBlocks[i]; + while (block) { + if (block.isCollapsed()) { + hasCollapsedBlocks = true; + } else { + hasExpandedBlocks = true; + } + block = block.getNextBlock(); + } + } + + /** + * Option to collapse or expand top blocks. + * @param {boolean} shouldCollapse Whether a block should collapse. + * @private + */ + var toggleOption = function(shouldCollapse) { + var ms = 0; + for (var i = 0; i < topBlocks.length; i++) { + var block = topBlocks[i]; + while (block) { + setTimeout(block.setCollapsed.bind(block, shouldCollapse), ms); + block = block.getNextBlock(); + ms += DELAY; + } + } + }; + + // Option to collapse top blocks. + var collapseOption = {enabled: hasExpandedBlocks}; + collapseOption.text = Blockly.Msg.COLLAPSE_ALL; + collapseOption.callback = function() { + toggleOption(true); + }; + menuOptions.push(collapseOption); + + // Option to expand top blocks. + var expandOption = {enabled: hasCollapsedBlocks}; + expandOption.text = Blockly.Msg.EXPAND_ALL; + expandOption.callback = function() { + toggleOption(false); + }; + menuOptions.push(expandOption); + } + + // Option to delete all blocks. + // Count the number of blocks that are deletable. + var deleteList = []; + function addDeletableBlocks(block) { + if (block.isDeletable()) { + deleteList = deleteList.concat(block.getDescendants()); + } else { + var children = block.getChildren(); + for (var i = 0; i < children.length; i++) { + addDeletableBlocks(children[i]); + } + } + } + for (var i = 0; i < topBlocks.length; i++) { + addDeletableBlocks(topBlocks[i]); + } + + function deleteNext() { + Blockly.Events.setGroup(eventGroup); + var block = deleteList.shift(); + if (block) { + if (block.workspace) { + block.dispose(false, true); + setTimeout(deleteNext, DELAY); + } else { + deleteNext(); + } + } + Blockly.Events.setGroup(false); + } + + var deleteOption = { + text: deleteList.length == 1 ? Blockly.Msg.DELETE_BLOCK : + Blockly.Msg.DELETE_X_BLOCKS.replace('%1', String(deleteList.length)), + enabled: deleteList.length > 0, + callback: function() { + if (deleteList.length < 2 ) { + deleteNext(); + } else { + Blockly.confirm(Blockly.Msg.DELETE_ALL_BLOCKS. + replace('%1', deleteList.length), + function(ok) { + if (ok) { + deleteNext(); + } + }); + } + } + }; + menuOptions.push(deleteOption); + + Blockly.ContextMenu.show(e, menuOptions, this.RTL); +}; + +/** + * Load an audio file. Cache it, ready for instantaneous playing. + * @param {!Array.} filenames List of file types in decreasing order of + * preference (i.e. increasing size). E.g. ['media/go.mp3', 'media/go.wav'] + * Filenames include path from Blockly's root. File extensions matter. + * @param {string} name Name of sound. + * @private + */ +Blockly.WorkspaceSvg.prototype.loadAudio_ = function(filenames, name) { + if (!filenames.length) { + return; + } + try { + var audioTest = new window['Audio'](); + } catch (e) { + // No browser support for Audio. + // IE can throw an error even if the Audio object exists. + return; + } + var sound; + for (var i = 0; i < filenames.length; i++) { + var filename = filenames[i]; + var ext = filename.match(/\.(\w+)$/); + if (ext && audioTest.canPlayType('audio/' + ext[1])) { + // Found an audio format we can play. + sound = new window['Audio'](filename); + break; + } + } + if (sound && sound.play) { + this.SOUNDS_[name] = sound; + } +}; + +/** + * Preload all the audio files so that they play quickly when asked for. + * @private + */ +Blockly.WorkspaceSvg.prototype.preloadAudio_ = function() { + for (var name in this.SOUNDS_) { + var sound = this.SOUNDS_[name]; + sound.volume = .01; + sound.play(); + sound.pause(); + // iOS can only process one sound at a time. Trying to load more than one + // corrupts the earlier ones. Just load one and leave the others uncached. + if (goog.userAgent.IPAD || goog.userAgent.IPHONE) { + break; + } + } +}; + +/** + * Play a named sound at specified volume. If volume is not specified, + * use full volume (1). + * @param {string} name Name of sound. + * @param {number=} opt_volume Volume of sound (0-1). + */ +Blockly.WorkspaceSvg.prototype.playAudio = function(name, opt_volume) { + var sound = this.SOUNDS_[name]; + if (sound) { + // Don't play one sound on top of another. + var now = new Date; + if (now - this.lastSound_ < Blockly.SOUND_LIMIT) { + return; + } + this.lastSound_ = now; + var mySound; + var ie9 = goog.userAgent.DOCUMENT_MODE && + goog.userAgent.DOCUMENT_MODE === 9; + if (ie9 || goog.userAgent.IPAD || goog.userAgent.ANDROID) { + // Creating a new audio node causes lag in IE9, Android and iPad. Android + // and IE9 refetch the file from the server, iPad uses a singleton audio + // node which must be deleted and recreated for each new audio tag. + mySound = sound; + } else { + mySound = sound.cloneNode(); + } + mySound.volume = (opt_volume === undefined ? 1 : opt_volume); + mySound.play(); + } else if (this.options.parentWorkspace) { + // Maybe a workspace on a lower level knows about this sound. + this.options.parentWorkspace.playAudio(name, opt_volume); + } +}; + +/** + * Modify the block tree on the existing toolbox. + * @param {Node|string} tree DOM tree of blocks, or text representation of same. + */ +Blockly.WorkspaceSvg.prototype.updateToolbox = function(tree) { + tree = Blockly.Options.parseToolboxTree(tree); + if (!tree) { + if (this.options.languageTree) { + throw 'Can\'t nullify an existing toolbox.'; + } + return; // No change (null to null). + } + if (!this.options.languageTree) { + throw 'Existing toolbox is null. Can\'t create new toolbox.'; + } + if (tree.getElementsByTagName('category').length) { + if (!this.toolbox_) { + throw 'Existing toolbox has no categories. Can\'t change mode.'; + } + this.options.languageTree = tree; + this.toolbox_.populate_(tree); + this.toolbox_.addColour_(); + } else { + if (!this.flyout_) { + throw 'Existing toolbox has categories. Can\'t change mode.'; + } + this.options.languageTree = tree; + this.flyout_.show(tree.childNodes); + } +}; + +/** + * Mark this workspace as the currently focused main workspace. + */ +Blockly.WorkspaceSvg.prototype.markFocused = function() { + if (this.options.parentWorkspace) { + this.options.parentWorkspace.markFocused(); + } else { + Blockly.mainWorkspace = this; + // We call e.preventDefault in many event handlers which means we + // need to explicitly grab focus (e.g from a textarea) because + // the browser will not do it for us. How to do this is browser dependant. + this.setBrowserFocus(); + } +}; + +/** + * Set the workspace to have focus in the browser. + * @private + */ +Blockly.WorkspaceSvg.prototype.setBrowserFocus = function() { + // Blur whatever was focused since explcitly grabbing focus below does not + // work in Edge. + if (document.activeElement) { + document.activeElement.blur(); + } + try { + // Focus the workspace SVG - this is for Chrome and Firefox. + this.getParentSvg().focus(); + } catch (e) { + // IE and Edge do not support focus on SVG elements. When that fails + // above, get the injectionDiv (the workspace's parent) and focus that + // instead. This doesn't work in Chrome. + try { + // In IE11, use setActive (which is IE only) so the page doesn't scroll + // to the workspace gaining focus. + this.getParentSvg().parentNode.setActive(); + } catch (e) { + // setActive support was discontinued in Edge so when that fails, call + // focus instead. + this.getParentSvg().parentNode.focus(); + } + } +}; + +/** + * Zooming the blocks centered in (x, y) coordinate with zooming in or out. + * @param {number} x X coordinate of center. + * @param {number} y Y coordinate of center. + * @param {number} amount Amount of zooming + * (negative zooms out and positive zooms in). + */ +Blockly.WorkspaceSvg.prototype.zoom = function(x, y, amount) { + var speed = this.options.zoomOptions.scaleSpeed; + var metrics = this.getMetrics(); + var center = this.getParentSvg().createSVGPoint(); + center.x = x; + center.y = y; + center = center.matrixTransform(this.getCanvas().getCTM().inverse()); + x = center.x; + y = center.y; + var canvas = this.getCanvas(); + // Scale factor. + var scaleChange = Math.pow(speed, amount); + // Clamp scale within valid range. + var newScale = this.scale * scaleChange; + if (newScale > this.options.zoomOptions.maxScale) { + scaleChange = this.options.zoomOptions.maxScale / this.scale; + } else if (newScale < this.options.zoomOptions.minScale) { + scaleChange = this.options.zoomOptions.minScale / this.scale; + } + if (this.scale == newScale) { + return; // No change in zoom. + } + if (this.scrollbar) { + var matrix = canvas.getCTM() + .translate(x * (1 - scaleChange), y * (1 - scaleChange)) + .scale(scaleChange); + // newScale and matrix.a should be identical (within a rounding error). + this.scrollX = matrix.e - metrics.absoluteLeft; + this.scrollY = matrix.f - metrics.absoluteTop; + } + this.setScale(newScale); +}; + +/** + * Zooming the blocks centered in the center of view with zooming in or out. + * @param {number} type Type of zooming (-1 zooming out and 1 zooming in). + */ +Blockly.WorkspaceSvg.prototype.zoomCenter = function(type) { + var metrics = this.getMetrics(); + var x = metrics.viewWidth / 2; + var y = metrics.viewHeight / 2; + this.zoom(x, y, type); +}; + +/** + * Zoom the blocks to fit in the workspace if possible. + */ +Blockly.WorkspaceSvg.prototype.zoomToFit = function() { + var metrics = this.getMetrics(); + var blocksBox = this.getBlocksBoundingBox(); + var blocksWidth = blocksBox.width; + var blocksHeight = blocksBox.height; + if (!blocksWidth) { + return; // Prevents zooming to infinity. + } + var workspaceWidth = metrics.viewWidth; + var workspaceHeight = metrics.viewHeight; + if (this.flyout_) { + workspaceWidth -= this.flyout_.width_; + } + if (!this.scrollbar) { + // Origin point of 0,0 is fixed, blocks will not scroll to center. + blocksWidth += metrics.contentLeft; + blocksHeight += metrics.contentTop; + } + var ratioX = workspaceWidth / blocksWidth; + var ratioY = workspaceHeight / blocksHeight; + this.setScale(Math.min(ratioX, ratioY)); + this.scrollCenter(); +}; + +/** + * Center the workspace. + */ +Blockly.WorkspaceSvg.prototype.scrollCenter = function() { + if (!this.scrollbar) { + // Can't center a non-scrolling workspace. + return; + } + var metrics = this.getMetrics(); + var x = (metrics.contentWidth - metrics.viewWidth) / 2; + if (this.flyout_) { + x -= this.flyout_.width_ / 2; + } + var y = (metrics.contentHeight - metrics.viewHeight) / 2; + this.scrollbar.set(x, y); +}; + +/** + * Set the workspace's zoom factor. + * @param {number} newScale Zoom factor. + */ +Blockly.WorkspaceSvg.prototype.setScale = function(newScale) { + if (this.options.zoomOptions.maxScale && + newScale > this.options.zoomOptions.maxScale) { + newScale = this.options.zoomOptions.maxScale; + } else if (this.options.zoomOptions.minScale && + newScale < this.options.zoomOptions.minScale) { + newScale = this.options.zoomOptions.minScale; + } + this.scale = newScale; + this.updateGridPattern_(); + if (this.scrollbar) { + this.scrollbar.resize(); + } else { + this.translate(this.scrollX, this.scrollY); + } + Blockly.hideChaff(false); + if (this.flyout_) { + // No toolbox, resize flyout. + this.flyout_.reflow(); + } +}; + +/** + * Updates the grid pattern. + * @private + */ +Blockly.WorkspaceSvg.prototype.updateGridPattern_ = function() { + if (!this.options.gridPattern) { + return; // No grid. + } + // MSIE freaks if it sees a 0x0 pattern, so set empty patterns to 100x100. + var safeSpacing = (this.options.gridOptions['spacing'] * this.scale) || 100; + this.options.gridPattern.setAttribute('width', safeSpacing); + this.options.gridPattern.setAttribute('height', safeSpacing); + var half = Math.floor(this.options.gridOptions['spacing'] / 2) + 0.5; + var start = half - this.options.gridOptions['length'] / 2; + var end = half + this.options.gridOptions['length'] / 2; + var line1 = this.options.gridPattern.firstChild; + var line2 = line1 && line1.nextSibling; + half *= this.scale; + start *= this.scale; + end *= this.scale; + if (line1) { + line1.setAttribute('stroke-width', this.scale); + line1.setAttribute('x1', start); + line1.setAttribute('y1', half); + line1.setAttribute('x2', end); + line1.setAttribute('y2', half); + } + if (line2) { + line2.setAttribute('stroke-width', this.scale); + line2.setAttribute('x1', half); + line2.setAttribute('y1', start); + line2.setAttribute('x2', half); + line2.setAttribute('y2', end); + } +}; + + +/** + * Return an object with all the metrics required to size scrollbars for a + * top level workspace. The following properties are computed: + * .viewHeight: Height of the visible rectangle, + * .viewWidth: Width of the visible rectangle, + * .contentHeight: Height of the contents, + * .contentWidth: Width of the content, + * .viewTop: Offset of top edge of visible rectangle from parent, + * .viewLeft: Offset of left edge of visible rectangle from parent, + * .contentTop: Offset of the top-most content from the y=0 coordinate, + * .contentLeft: Offset of the left-most content from the x=0 coordinate. + * .absoluteTop: Top-edge of view. + * .absoluteLeft: Left-edge of view. + * .toolboxWidth: Width of toolbox, if it exists. Otherwise zero. + * .toolboxHeight: Height of toolbox, if it exists. Otherwise zero. + * .flyoutWidth: Width of the flyout if it is always open. Otherwise zero. + * .flyoutHeight: Height of flyout if it is always open. Otherwise zero. + * .toolboxPosition: Top, bottom, left or right. + * @return {!Object} Contains size and position metrics of a top level + * workspace. + * @private + * @this Blockly.WorkspaceSvg + */ +Blockly.WorkspaceSvg.getTopLevelWorkspaceMetrics_ = function() { + var svgSize = Blockly.svgSize(this.getParentSvg()); + if (this.toolbox_) { + if (this.toolboxPosition == Blockly.TOOLBOX_AT_TOP || + this.toolboxPosition == Blockly.TOOLBOX_AT_BOTTOM) { + svgSize.height -= this.toolbox_.getHeight(); + } else if (this.toolboxPosition == Blockly.TOOLBOX_AT_LEFT || + this.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { + svgSize.width -= this.toolbox_.getWidth(); + } + } + // Set the margin to match the flyout's margin so that the workspace does + // not jump as blocks are added. + var MARGIN = Blockly.Flyout.prototype.CORNER_RADIUS - 1; + var viewWidth = svgSize.width - MARGIN; + var viewHeight = svgSize.height - MARGIN; + var blockBox = this.getBlocksBoundingBox(); + + // Fix scale. + var contentWidth = blockBox.width * this.scale; + var contentHeight = blockBox.height * this.scale; + var contentX = blockBox.x * this.scale; + var contentY = blockBox.y * this.scale; + if (this.scrollbar) { + // Add a border around the content that is at least half a screenful wide. + // Ensure border is wide enough that blocks can scroll over entire screen. + var leftEdge = Math.min(contentX - viewWidth / 2, + contentX + contentWidth - viewWidth); + var rightEdge = Math.max(contentX + contentWidth + viewWidth / 2, + contentX + viewWidth); + var topEdge = Math.min(contentY - viewHeight / 2, + contentY + contentHeight - viewHeight); + var bottomEdge = Math.max(contentY + contentHeight + viewHeight / 2, + contentY + viewHeight); + } else { + var leftEdge = blockBox.x; + var rightEdge = leftEdge + blockBox.width; + var topEdge = blockBox.y; + var bottomEdge = topEdge + blockBox.height; + } + var absoluteLeft = 0; + if (this.toolbox_ && this.toolboxPosition == Blockly.TOOLBOX_AT_LEFT) { + absoluteLeft = this.toolbox_.getWidth(); + } + var absoluteTop = 0; + if (this.toolbox_ && this.toolboxPosition == Blockly.TOOLBOX_AT_TOP) { + absoluteTop = this.toolbox_.getHeight(); + } + + var metrics = { + viewHeight: svgSize.height, + viewWidth: svgSize.width, + contentHeight: bottomEdge - topEdge, + contentWidth: rightEdge - leftEdge, + viewTop: -this.scrollY, + viewLeft: -this.scrollX, + contentTop: topEdge, + contentLeft: leftEdge, + absoluteTop: absoluteTop, + absoluteLeft: absoluteLeft, + toolboxWidth: this.toolbox_ ? this.toolbox_.getWidth() : 0, + toolboxHeight: this.toolbox_ ? this.toolbox_.getHeight() : 0, + flyoutWidth: this.flyout_ ? this.flyout_.getWidth() : 0, + flyoutHeight: this.flyout_ ? this.flyout_.getHeight() : 0, + toolboxPosition: this.toolboxPosition + }; + return metrics; +}; + +/** + * Sets the X/Y translations of a top level workspace to match the scrollbars. + * @param {!Object} xyRatio Contains an x and/or y property which is a float + * between 0 and 1 specifying the degree of scrolling. + * @private + * @this Blockly.WorkspaceSvg + */ +Blockly.WorkspaceSvg.setTopLevelWorkspaceMetrics_ = function(xyRatio) { + if (!this.scrollbar) { + throw 'Attempt to set top level workspace scroll without scrollbars.'; + } + var metrics = this.getMetrics(); + if (goog.isNumber(xyRatio.x)) { + this.scrollX = -metrics.contentWidth * xyRatio.x - metrics.contentLeft; + } + if (goog.isNumber(xyRatio.y)) { + this.scrollY = -metrics.contentHeight * xyRatio.y - metrics.contentTop; + } + var x = this.scrollX + metrics.absoluteLeft; + var y = this.scrollY + metrics.absoluteTop; + this.translate(x, y); + if (this.options.gridPattern) { + this.options.gridPattern.setAttribute('x', x); + this.options.gridPattern.setAttribute('y', y); + if (goog.userAgent.IE || goog.userAgent.EDGE) { + // IE/Edge doesn't notice that the x/y offsets have changed. + // Force an update. + this.updateGridPattern_(); + } + } +}; + +/** + * Update whether this workspace has resizes enabled. + * If enabled, workspace will resize when appropriate. + * If disabled, workspace will not resize until re-enabled. + * Use to avoid resizing during a batch operation, for performance. + * @param {boolean} enabled Whether resizes should be enabled. + */ +Blockly.WorkspaceSvg.prototype.setResizesEnabled = function(enabled) { + var reenabled = (!this.resizesEnabled_ && enabled); + this.resizesEnabled_ = enabled; + if (reenabled) { + // Newly enabled. Trigger a resize. + this.resizeContents(); + } +}; + +/** + * Dispose of all blocks in workspace, with an optimization to prevent resizes. + */ +Blockly.WorkspaceSvg.prototype.clear = function() { + this.setResizesEnabled(false); + Blockly.WorkspaceSvg.superClass_.clear.call(this); + this.setResizesEnabled(true); +}; + +/** + * Register a callback function associated with a given key, for clicks on + * buttons and labels in the flyout. + * For instance, a button specified by the XML + * + * should be matched by a call to + * registerButtonCallback("CREATE_VARIABLE", yourCallbackFunction). + * @param {string} key The name to use to look up this function. + * @param {function(!Blockly.FlyoutButton)} func The function to call when the + * given button is clicked. + */ +Blockly.WorkspaceSvg.prototype.registerButtonCallback = function(key, func) { + goog.asserts.assert(goog.isFunction(func), + 'Button callbacks must be functions.'); + this.flyoutButtonCallbacks_[key] = func; +}; + +/** + * Get the callback function associated with a given key, for clicks on buttons + * and labels in the flyout. + * @param {string} key The name to use to look up the function. + * @return {?function(!Blockly.FlyoutButton)} The function corresponding to the + * given key for this workspace; null if no callback is registered. + */ +Blockly.WorkspaceSvg.prototype.getButtonCallback = function(key) { + var result = this.flyoutButtonCallbacks_[key]; + return result ? result : null; +}; + +/** + * Remove a callback for a click on a button in the flyout. + * @param {string} key The name associated with the callback function. + */ +Blockly.WorkspaceSvg.prototype.removeButtonCallback = function(key) { + this.flyoutButtonCallbacks_[key] = null; +}; + +/** + * Register a callback function associated with a given key, for populating + * custom toolbox categories in this workspace. See the variable and procedure + * categories as an example. + * @param {string} key The name to use to look up this function. + * @param {function(!Blockly.Workspace):!Array} func The function to + * call when the given toolbox category is opened. + */ +Blockly.WorkspaceSvg.prototype.registerToolboxCategoryCallback = function(key, + func) { + goog.asserts.assert(goog.isFunction(func), + 'Toolbox category callbacks must be functions.'); + this.toolboxCategoryCallbacks_[key] = func; +}; + +/** + * Get the callback function associated with a given key, for populating + * custom toolbox categories in this workspace. + * @param {string} key The name to use to look up the function. + * @return {?function(!Blockly.Workspace):!Array} The function + * corresponding to the given key for this workspace, or null if no function + * is registered. + */ +Blockly.WorkspaceSvg.prototype.getToolboxCategoryCallback = function(key) { + var result = this.toolboxCategoryCallbacks_[key]; + return result ? result : null; +}; + +/** + * Remove a callback for a click on a custom category's name in the toolbox. + * @param {string} key The name associated with the callback function. + */ +Blockly.WorkspaceSvg.prototype.removeToolboxCategoryCallback = function(key) { + this.toolboxCategoryCallbacks_[key] = null; +}; + +// Export symbols that would otherwise be renamed by Closure compiler. +Blockly.WorkspaceSvg.prototype['setVisible'] = + Blockly.WorkspaceSvg.prototype.setVisible; diff --git a/src/opsoro/server/static/js/blockly/core/xml.js b/src/opsoro/server/static/js/blockly/core/xml.js new file mode 100644 index 0000000..8506ca5 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/core/xml.js @@ -0,0 +1,645 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview XML reader and writer. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +/** + * @name Blockly.Xml + * @namespace + **/ +goog.provide('Blockly.Xml'); + +goog.require('goog.asserts'); +goog.require('goog.dom'); + + +/** + * Encode a block tree as XML. + * @param {!Blockly.Workspace} workspace The workspace containing blocks. + * @param {boolean} opt_noId True if the encoder should skip the block ids. + * @return {!Element} XML document. + */ +Blockly.Xml.workspaceToDom = function(workspace, opt_noId) { + var xml = goog.dom.createDom('xml'); + var blocks = workspace.getTopBlocks(true); + for (var i = 0, block; block = blocks[i]; i++) { + xml.appendChild(Blockly.Xml.blockToDomWithXY(block, opt_noId)); + } + return xml; +}; + +/** + * Encode a block subtree as XML with XY coordinates. + * @param {!Blockly.Block} block The root block to encode. + * @param {boolean} opt_noId True if the encoder should skip the block id. + * @return {!Element} Tree of XML elements. + */ +Blockly.Xml.blockToDomWithXY = function(block, opt_noId) { + var width; // Not used in LTR. + if (block.workspace.RTL) { + width = block.workspace.getWidth(); + } + var element = Blockly.Xml.blockToDom(block, opt_noId); + var xy = block.getRelativeToSurfaceXY(); + element.setAttribute('x', + Math.round(block.workspace.RTL ? width - xy.x : xy.x)); + element.setAttribute('y', Math.round(xy.y)); + return element; +}; + +/** + * Encode a block subtree as XML. + * @param {!Blockly.Block} block The root block to encode. + * @param {boolean} opt_noId True if the encoder should skip the block id. + * @return {!Element} Tree of XML elements. + */ +Blockly.Xml.blockToDom = function(block, opt_noId) { + var element = goog.dom.createDom(block.isShadow() ? 'shadow' : 'block'); + element.setAttribute('type', block.type); + if (!opt_noId) { + element.setAttribute('id', block.id); + } + if (block.mutationToDom) { + // Custom data for an advanced block. + var mutation = block.mutationToDom(); + if (mutation && (mutation.hasChildNodes() || mutation.hasAttributes())) { + element.appendChild(mutation); + } + } + function fieldToDom(field) { + if (field.name && field.EDITABLE) { + var container = goog.dom.createDom('field', null, field.getValue()); + container.setAttribute('name', field.name); + element.appendChild(container); + } + } + for (var i = 0, input; input = block.inputList[i]; i++) { + for (var j = 0, field; field = input.fieldRow[j]; j++) { + fieldToDom(field); + } + } + + var commentText = block.getCommentText(); + if (commentText) { + var commentElement = goog.dom.createDom('comment', null, commentText); + if (typeof block.comment == 'object') { + commentElement.setAttribute('pinned', block.comment.isVisible()); + var hw = block.comment.getBubbleSize(); + commentElement.setAttribute('h', hw.height); + commentElement.setAttribute('w', hw.width); + } + element.appendChild(commentElement); + } + + if (block.data) { + var dataElement = goog.dom.createDom('data', null, block.data); + element.appendChild(dataElement); + } + + for (var i = 0, input; input = block.inputList[i]; i++) { + var container; + var empty = true; + if (input.type == Blockly.DUMMY_INPUT) { + continue; + } else { + var childBlock = input.connection.targetBlock(); + if (input.type == Blockly.INPUT_VALUE) { + container = goog.dom.createDom('value'); + } else if (input.type == Blockly.NEXT_STATEMENT) { + container = goog.dom.createDom('statement'); + } + var shadow = input.connection.getShadowDom(); + if (shadow && (!childBlock || !childBlock.isShadow())) { + container.appendChild(Blockly.Xml.cloneShadow_(shadow)); + } + if (childBlock) { + container.appendChild(Blockly.Xml.blockToDom(childBlock, opt_noId)); + empty = false; + } + } + container.setAttribute('name', input.name); + if (!empty) { + element.appendChild(container); + } + } + if (block.inputsInlineDefault != block.inputsInline) { + element.setAttribute('inline', block.inputsInline); + } + if (block.isCollapsed()) { + element.setAttribute('collapsed', true); + } + if (block.disabled) { + element.setAttribute('disabled', true); + } + if (!block.isDeletable() && !block.isShadow()) { + element.setAttribute('deletable', false); + } + if (!block.isMovable() && !block.isShadow()) { + element.setAttribute('movable', false); + } + if (!block.isEditable()) { + element.setAttribute('editable', false); + } + + var nextBlock = block.getNextBlock(); + if (nextBlock) { + var container = goog.dom.createDom('next', null, + Blockly.Xml.blockToDom(nextBlock, opt_noId)); + element.appendChild(container); + } + var shadow = block.nextConnection && block.nextConnection.getShadowDom(); + if (shadow && (!nextBlock || !nextBlock.isShadow())) { + container.appendChild(Blockly.Xml.cloneShadow_(shadow)); + } + + return element; +}; + +/** + * Deeply clone the shadow's DOM so that changes don't back-wash to the block. + * @param {!Element} shadow A tree of XML elements. + * @return {!Element} A tree of XML elements. + * @private + */ +Blockly.Xml.cloneShadow_ = function(shadow) { + shadow = shadow.cloneNode(true); + // Walk the tree looking for whitespace. Don't prune whitespace in a tag. + var node = shadow; + var textNode; + while (node) { + if (node.firstChild) { + node = node.firstChild; + } else { + while (node && !node.nextSibling) { + textNode = node; + node = node.parentNode; + if (textNode.nodeType == 3 && textNode.data.trim() == '' && + node.firstChild != textNode) { + // Prune whitespace after a tag. + goog.dom.removeNode(textNode); + } + } + if (node) { + textNode = node; + node = node.nextSibling; + if (textNode.nodeType == 3 && textNode.data.trim() == '') { + // Prune whitespace before a tag. + goog.dom.removeNode(textNode); + } + } + } + } + return shadow; +}; + +/** + * Converts a DOM structure into plain text. + * Currently the text format is fairly ugly: all one line with no whitespace. + * @param {!Element} dom A tree of XML elements. + * @return {string} Text representation. + */ +Blockly.Xml.domToText = function(dom) { + var oSerializer = new XMLSerializer(); + return oSerializer.serializeToString(dom); +}; + +/** + * Converts a DOM structure into properly indented text. + * @param {!Element} dom A tree of XML elements. + * @return {string} Text representation. + */ +Blockly.Xml.domToPrettyText = function(dom) { + // This function is not guaranteed to be correct for all XML. + // But it handles the XML that Blockly generates. + var blob = Blockly.Xml.domToText(dom); + // Place every open and close tag on its own line. + var lines = blob.split('<'); + // Indent every line. + var indent = ''; + for (var i = 1; i < lines.length; i++) { + var line = lines[i]; + if (line[0] == '/') { + indent = indent.substring(2); + } + lines[i] = indent + '<' + line; + if (line[0] != '/' && line.slice(-2) != '/>') { + indent += ' '; + } + } + // Pull simple tags back together. + // E.g. + var text = lines.join('\n'); + text = text.replace(/(<(\w+)\b[^>]*>[^\n]*)\n *<\/\2>/g, '$1'); + // Trim leading blank line. + return text.replace(/^\n/, ''); +}; + +/** + * Converts plain text into a DOM structure. + * Throws an error if XML doesn't parse. + * @param {string} text Text representation. + * @return {!Element} A tree of XML elements. + */ +Blockly.Xml.textToDom = function(text) { + var oParser = new DOMParser(); + var dom = oParser.parseFromString(text, 'text/xml'); + // The DOM should have one and only one top-level node, an XML tag. + if (!dom || !dom.firstChild || + dom.firstChild.nodeName.toLowerCase() != 'xml' || + dom.firstChild !== dom.lastChild) { + // Whatever we got back from the parser is not XML. + goog.asserts.fail('Blockly.Xml.textToDom did not obtain a valid XML tree.'); + } + return dom.firstChild; +}; + +/** + * Decode an XML DOM and create blocks on the workspace. + * @param {!Element} xml XML DOM. + * @param {!Blockly.Workspace} workspace The workspace. + * @return {Array.} An array containing new block ids. + */ +Blockly.Xml.domToWorkspace = function(xml, workspace) { + if (xml instanceof Blockly.Workspace) { + var swap = xml; + xml = workspace; + workspace = swap; + console.warn('Deprecated call to Blockly.Xml.domToWorkspace, ' + + 'swap the arguments.'); + } + var width; // Not used in LTR. + if (workspace.RTL) { + width = workspace.getWidth(); + } + var newBlockIds = []; // A list of block ids added by this call. + Blockly.Field.startCache(); + // Safari 7.1.3 is known to provide node lists with extra references to + // children beyond the lists' length. Trust the length, do not use the + // looping pattern of checking the index for an object. + var childCount = xml.childNodes.length; + var existingGroup = Blockly.Events.getGroup(); + if (!existingGroup) { + Blockly.Events.setGroup(true); + } + + // Disable workspace resizes as an optimization. + if (workspace.setResizesEnabled) { + workspace.setResizesEnabled(false); + } + for (var i = 0; i < childCount; i++) { + var xmlChild = xml.childNodes[i]; + var name = xmlChild.nodeName.toLowerCase(); + if (name == 'block' || + (name == 'shadow' && !Blockly.Events.recordUndo)) { + // Allow top-level shadow blocks if recordUndo is disabled since + // that means an undo is in progress. Such a block is expected + // to be moved to a nested destination in the next operation. + var block = Blockly.Xml.domToBlock(xmlChild, workspace); + newBlockIds.push(block.id); + var blockX = parseInt(xmlChild.getAttribute('x'), 10); + var blockY = parseInt(xmlChild.getAttribute('y'), 10); + if (!isNaN(blockX) && !isNaN(blockY)) { + block.moveBy(workspace.RTL ? width - blockX : blockX, blockY); + } + } else if (name == 'shadow') { + goog.asserts.fail('Shadow block cannot be a top-level block.'); + } + } + if (!existingGroup) { + Blockly.Events.setGroup(false); + } + Blockly.Field.stopCache(); + + workspace.updateVariableList(false); + // Re-enable workspace resizing. + if (workspace.setResizesEnabled) { + workspace.setResizesEnabled(true); + } + return newBlockIds; +}; + +/** + * Decode an XML DOM and create blocks on the workspace. Position the new + * blocks immediately below prior blocks, aligned by their starting edge. + * @param {!Element} xml The XML DOM. + * @param {!Blockly.Workspace} workspace The workspace to add to. + * @return {Array.} An array containing new block ids. + */ +Blockly.Xml.appendDomToWorkspace = function(xml, workspace) { + var bbox; //bounding box of the current blocks + // first check if we have a workspaceSvg otherwise the block have no shape + // and the position does not matter + if (workspace.hasOwnProperty('scale')) { + var savetab = Blockly.BlockSvg.TAB_WIDTH; + try { + Blockly.BlockSvg.TAB_WIDTH = 0; + var bbox = workspace.getBlocksBoundingBox(); + } finally { + Blockly.BlockSvg.TAB_WIDTH = savetab; + } + } + // load the new blocks into the workspace and get the ids of the new blocks + var newBlockIds = Blockly.Xml.domToWorkspace(xml,workspace); + if (bbox && bbox.height) { // check if any previous block + var offsetY = 0; // offset to add to y of the new block + var offsetX = 0; + var farY = bbox.y + bbox.height; //bottom position + var topX = bbox.x; // x of bounding box + // check position of the new blocks + var newX = Infinity; // x of top corner + var newY = Infinity; // y of top corner + for (var i = 0; i < newBlockIds.length; i++) { + var blockXY = workspace.getBlockById(newBlockIds[i]).getRelativeToSurfaceXY(); + if (blockXY.y < newY) { + newY = blockXY.y; + } + if (blockXY.x < newX) { //if we align also on x + newX = blockXY.x; + } + } + offsetY = farY - newY + Blockly.BlockSvg.SEP_SPACE_Y; + offsetX = topX - newX; + // move the new blocks to append them at the bottom + var width; // Not used in LTR. + if (workspace.RTL) { + width = workspace.getWidth(); + } + for (var i = 0; i < newBlockIds.length; i++) { + var block = workspace.getBlockById(newBlockIds[i]); + block.moveBy(workspace.RTL ? width - offsetX : offsetX, offsetY); + } + } + return newBlockIds; +}; + +/** + * Decode an XML block tag and create a block (and possibly sub blocks) on the + * workspace. + * @param {!Element} xmlBlock XML block element. + * @param {!Blockly.Workspace} workspace The workspace. + * @return {!Blockly.Block} The root block created. + */ +Blockly.Xml.domToBlock = function(xmlBlock, workspace) { + if (xmlBlock instanceof Blockly.Workspace) { + var swap = xmlBlock; + xmlBlock = workspace; + workspace = swap; + console.warn('Deprecated call to Blockly.Xml.domToBlock, ' + + 'swap the arguments.'); + } + // Create top-level block. + Blockly.Events.disable(); + try { + var topBlock = Blockly.Xml.domToBlockHeadless_(xmlBlock, workspace); + if (workspace.rendered) { + // Hide connections to speed up assembly. + topBlock.setConnectionsHidden(true); + // Generate list of all blocks. + var blocks = topBlock.getDescendants(); + // Render each block. + for (var i = blocks.length - 1; i >= 0; i--) { + blocks[i].initSvg(); + } + for (var i = blocks.length - 1; i >= 0; i--) { + blocks[i].render(false); + } + // Populating the connection database may be deferred until after the + // blocks have rendered. + setTimeout(function() { + if (topBlock.workspace) { // Check that the block hasn't been deleted. + topBlock.setConnectionsHidden(false); + } + }, 1); + topBlock.updateDisabled(); + // Allow the scrollbars to resize and move based on the new contents. + // TODO(@picklesrus): #387. Remove when domToBlock avoids resizing. + workspace.resizeContents(); + } + } finally { + Blockly.Events.enable(); + } + if (Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Create(topBlock)); + } + return topBlock; +}; + +/** + * Decode an XML block tag and create a block (and possibly sub blocks) on the + * workspace. + * @param {!Element} xmlBlock XML block element. + * @param {!Blockly.Workspace} workspace The workspace. + * @return {!Blockly.Block} The root block created. + * @private + */ +Blockly.Xml.domToBlockHeadless_ = function(xmlBlock, workspace) { + var block = null; + var prototypeName = xmlBlock.getAttribute('type'); + goog.asserts.assert(prototypeName, 'Block type unspecified: %s', + xmlBlock.outerHTML); + var id = xmlBlock.getAttribute('id'); + block = workspace.newBlock(prototypeName, id); + + var blockChild = null; + for (var i = 0, xmlChild; xmlChild = xmlBlock.childNodes[i]; i++) { + if (xmlChild.nodeType == 3) { + // Ignore any text at the level. It's all whitespace anyway. + continue; + } + var input; + + // Find any enclosed blocks or shadows in this tag. + var childBlockNode = null; + var childShadowNode = null; + for (var j = 0, grandchildNode; grandchildNode = xmlChild.childNodes[j]; + j++) { + if (grandchildNode.nodeType == 1) { + if (grandchildNode.nodeName.toLowerCase() == 'block') { + childBlockNode = grandchildNode; + } else if (grandchildNode.nodeName.toLowerCase() == 'shadow') { + childShadowNode = grandchildNode; + } + } + } + // Use the shadow block if there is no child block. + if (!childBlockNode && childShadowNode) { + childBlockNode = childShadowNode; + } + + var name = xmlChild.getAttribute('name'); + switch (xmlChild.nodeName.toLowerCase()) { + case 'mutation': + // Custom data for an advanced block. + if (block.domToMutation) { + block.domToMutation(xmlChild); + if (block.initSvg) { + // Mutation may have added some elements that need initializing. + block.initSvg(); + } + } + break; + case 'comment': + block.setCommentText(xmlChild.textContent); + var visible = xmlChild.getAttribute('pinned'); + if (visible && !block.isInFlyout) { + // Give the renderer a millisecond to render and position the block + // before positioning the comment bubble. + setTimeout(function() { + if (block.comment && block.comment.setVisible) { + block.comment.setVisible(visible == 'true'); + } + }, 1); + } + var bubbleW = parseInt(xmlChild.getAttribute('w'), 10); + var bubbleH = parseInt(xmlChild.getAttribute('h'), 10); + if (!isNaN(bubbleW) && !isNaN(bubbleH) && + block.comment && block.comment.setVisible) { + block.comment.setBubbleSize(bubbleW, bubbleH); + } + break; + case 'data': + block.data = xmlChild.textContent; + break; + case 'title': + // Titles were renamed to field in December 2013. + // Fall through. + case 'field': + var field = block.getField(name); + if (!field) { + console.warn('Ignoring non-existent field ' + name + ' in block ' + + prototypeName); + break; + } + field.setValue(xmlChild.textContent); + break; + case 'value': + case 'statement': + input = block.getInput(name); + if (!input) { + console.warn('Ignoring non-existent input ' + name + ' in block ' + + prototypeName); + break; + } + if (childShadowNode) { + input.connection.setShadowDom(childShadowNode); + } + if (childBlockNode) { + blockChild = Blockly.Xml.domToBlockHeadless_(childBlockNode, + workspace); + if (blockChild.outputConnection) { + input.connection.connect(blockChild.outputConnection); + } else if (blockChild.previousConnection) { + input.connection.connect(blockChild.previousConnection); + } else { + goog.asserts.fail( + 'Child block does not have output or previous statement.'); + } + } + break; + case 'next': + if (childShadowNode && block.nextConnection) { + block.nextConnection.setShadowDom(childShadowNode); + } + if (childBlockNode) { + goog.asserts.assert(block.nextConnection, + 'Next statement does not exist.'); + // If there is more than one XML 'next' tag. + goog.asserts.assert(!block.nextConnection.isConnected(), + 'Next statement is already connected.'); + blockChild = Blockly.Xml.domToBlockHeadless_(childBlockNode, + workspace); + goog.asserts.assert(blockChild.previousConnection, + 'Next block does not have previous statement.'); + block.nextConnection.connect(blockChild.previousConnection); + } + break; + default: + // Unknown tag; ignore. Same principle as HTML parsers. + console.warn('Ignoring unknown tag: ' + xmlChild.nodeName); + } + } + + var inline = xmlBlock.getAttribute('inline'); + if (inline) { + block.setInputsInline(inline == 'true'); + } + var disabled = xmlBlock.getAttribute('disabled'); + if (disabled) { + block.setDisabled(disabled == 'true'); + } + var deletable = xmlBlock.getAttribute('deletable'); + if (deletable) { + block.setDeletable(deletable == 'true'); + } + var movable = xmlBlock.getAttribute('movable'); + if (movable) { + block.setMovable(movable == 'true'); + } + var editable = xmlBlock.getAttribute('editable'); + if (editable) { + block.setEditable(editable == 'true'); + } + var collapsed = xmlBlock.getAttribute('collapsed'); + if (collapsed) { + block.setCollapsed(collapsed == 'true'); + } + if (xmlBlock.nodeName.toLowerCase() == 'shadow') { + // Ensure all children are also shadows. + var children = block.getChildren(); + for (var i = 0, child; child = children[i]; i++) { + goog.asserts.assert(child.isShadow(), + 'Shadow block not allowed non-shadow child.'); + } + // Ensure this block doesn't have any variable inputs. + goog.asserts.assert(block.getVars().length == 0, + 'Shadow blocks cannot have variable fields.'); + block.setShadow(true); + } + return block; +}; + +/** + * Remove any 'next' block (statements in a stack). + * @param {!Element} xmlBlock XML block element. + */ +Blockly.Xml.deleteNext = function(xmlBlock) { + for (var i = 0, child; child = xmlBlock.childNodes[i]; i++) { + if (child.nodeName.toLowerCase() == 'next') { + xmlBlock.removeChild(child); + break; + } + } +}; + +// Export symbols that would otherwise be renamed by Closure compiler. +if (!goog.global['Blockly']) { + goog.global['Blockly'] = {}; +} +if (!goog.global['Blockly']['Xml']) { + goog.global['Blockly']['Xml'] = {}; +} +goog.global['Blockly']['Xml']['domToText'] = Blockly.Xml.domToText; +goog.global['Blockly']['Xml']['domToWorkspace'] = Blockly.Xml.domToWorkspace; +goog.global['Blockly']['Xml']['textToDom'] = Blockly.Xml.textToDom; +goog.global['Blockly']['Xml']['workspaceToDom'] = Blockly.Xml.workspaceToDom; diff --git a/src/opsoro/apps/visual_programming/static/blockly/core/zoom_controls.js b/src/opsoro/server/static/js/blockly/core/zoom_controls.js similarity index 75% rename from src/opsoro/apps/visual_programming/static/blockly/core/zoom_controls.js rename to src/opsoro/server/static/js/blockly/core/zoom_controls.js index a4b674a..0c827b3 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/core/zoom_controls.js +++ b/src/opsoro/server/static/js/blockly/core/zoom_controls.js @@ -26,6 +26,7 @@ goog.provide('Blockly.ZoomControls'); +goog.require('Blockly.Touch'); goog.require('goog.dom'); @@ -98,31 +99,31 @@ Blockly.ZoomControls.prototype.createDom = function() { - + - + - + */ - this.svgGroup_ = Blockly.createSvgElement('g', + this.svgGroup_ = Blockly.utils.createSvgElement('g', {'class': 'blocklyZoom'}, null); var rnd = String(Math.random()).substring(2); - var clip = Blockly.createSvgElement('clipPath', + var clip = Blockly.utils.createSvgElement('clipPath', {'id': 'blocklyZoomoutClipPath' + rnd}, this.svgGroup_); - Blockly.createSvgElement('rect', + Blockly.utils.createSvgElement('rect', {'width': 32, 'height': 32, 'y': 77}, clip); - var zoomoutSvg = Blockly.createSvgElement('image', + var zoomoutSvg = Blockly.utils.createSvgElement('image', {'width': Blockly.SPRITE.width, 'height': Blockly.SPRITE.height, 'x': -64, 'y': -15, @@ -131,13 +132,13 @@ Blockly.ZoomControls.prototype.createDom = function() { zoomoutSvg.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', workspace.options.pathToMedia + Blockly.SPRITE.url); - var clip = Blockly.createSvgElement('clipPath', + var clip = Blockly.utils.createSvgElement('clipPath', {'id': 'blocklyZoominClipPath' + rnd}, this.svgGroup_); - Blockly.createSvgElement('rect', + Blockly.utils.createSvgElement('rect', {'width': 32, 'height': 32, 'y': 43}, clip); - var zoominSvg = Blockly.createSvgElement('image', + var zoominSvg = Blockly.utils.createSvgElement('image', {'width': Blockly.SPRITE.width, 'height': Blockly.SPRITE.height, 'x': -32, @@ -147,13 +148,13 @@ Blockly.ZoomControls.prototype.createDom = function() { zoominSvg.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', workspace.options.pathToMedia + Blockly.SPRITE.url); - var clip = Blockly.createSvgElement('clipPath', + var clip = Blockly.utils.createSvgElement('clipPath', {'id': 'blocklyZoomresetClipPath' + rnd}, this.svgGroup_); - Blockly.createSvgElement('rect', + Blockly.utils.createSvgElement('rect', {'width': 32, 'height': 32}, clip); - var zoomresetSvg = Blockly.createSvgElement('image', + var zoomresetSvg = Blockly.utils.createSvgElement('image', {'width': Blockly.SPRITE.width, 'height': Blockly.SPRITE.height, 'y': -92, 'clip-path': 'url(#blocklyZoomresetClipPath' + rnd + ')'}, @@ -162,14 +163,27 @@ Blockly.ZoomControls.prototype.createDom = function() { workspace.options.pathToMedia + Blockly.SPRITE.url); // Attach event listeners. - Blockly.bindEvent_(zoomresetSvg, 'mousedown', workspace, workspace.zoomReset); - Blockly.bindEvent_(zoominSvg, 'mousedown', null, function(e) { + Blockly.bindEventWithChecks_(zoomresetSvg, 'mousedown', null, function(e) { + workspace.markFocused(); + workspace.setScale(workspace.options.zoomOptions.startScale); + workspace.scrollCenter(); + Blockly.Touch.clearTouchIdentifier(); // Don't block future drags. + e.stopPropagation(); // Don't start a workspace scroll. + e.preventDefault(); // Stop double-clicking from selecting text. + }); + Blockly.bindEventWithChecks_(zoominSvg, 'mousedown', null, function(e) { + workspace.markFocused(); workspace.zoomCenter(1); + Blockly.Touch.clearTouchIdentifier(); // Don't block future drags. e.stopPropagation(); // Don't start a workspace scroll. + e.preventDefault(); // Stop double-clicking from selecting text. }); - Blockly.bindEvent_(zoomoutSvg, 'mousedown', null, function(e) { + Blockly.bindEventWithChecks_(zoomoutSvg, 'mousedown', null, function(e) { + workspace.markFocused(); workspace.zoomCenter(-1); + Blockly.Touch.clearTouchIdentifier(); // Don't block future drags. e.stopPropagation(); // Don't start a workspace scroll. + e.preventDefault(); // Stop double-clicking from selecting text. }); return this.svgGroup_; @@ -208,12 +222,25 @@ Blockly.ZoomControls.prototype.position = function() { } if (this.workspace_.RTL) { this.left_ = this.MARGIN_SIDE_ + Blockly.Scrollbar.scrollbarThickness; + if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_LEFT) { + this.left_ += metrics.flyoutWidth; + if (this.workspace_.toolbox_) { + this.left_ += metrics.absoluteLeft; + } + } } else { this.left_ = metrics.viewWidth + metrics.absoluteLeft - this.WIDTH_ - this.MARGIN_SIDE_ - Blockly.Scrollbar.scrollbarThickness; + + if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { + this.left_ -= metrics.flyoutWidth; + } } this.top_ = metrics.viewHeight + metrics.absoluteTop - this.HEIGHT_ - this.bottom_; + if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_BOTTOM) { + this.top_ -= metrics.flyoutHeight; + } this.svgGroup_.setAttribute('transform', 'translate(' + this.left_ + ',' + this.top_ + ')'); }; diff --git a/src/opsoro/server/static/js/blockly/custom_blocks/expression.js b/src/opsoro/server/static/js/blockly/custom_blocks/expression.js new file mode 100644 index 0000000..59f5a0d --- /dev/null +++ b/src/opsoro/server/static/js/blockly/custom_blocks/expression.js @@ -0,0 +1,88 @@ +Blockly.Lua.addReservedWords("Expression"); + +Blockly.Blocks['expression_update'] = { + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/smile-o.svg", 16, 18, "")) + .appendField("Update expression"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(105); + this.setTooltip('Calculate and update servo motor positions based on the current expression.'); + } +}; +Blockly.Lua['expression_update'] = function(block) { + var code = "Expression:update()\n"; + return code; +}; + +Blockly.Blocks['expression_setekman'] = { + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/smile-o.svg", 16, 18, "")) + .appendField("set emotion to") + .appendField(new Blockly.FieldDropdown(expressionlist), "EMOTION"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(105); + this.setTooltip('Set the current facial expression using Ekman\'s basic emotions'); + } +}; +Blockly.Lua['expression_setekman'] = function(block) { + var dropdown_emotion = block.getFieldValue('EMOTION'); + var code = 'Expression:set_emotion_name("' + dropdown_emotion + '")\n'; + return code; +}; + +Blockly.Blocks['expression_setva'] = { + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/smile-o.svg", 16, 18, "")) + .appendField("Set emotion to"); + this.appendValueInput("VALENCE") + .setCheck("Number") + .setAlign(Blockly.ALIGN_RIGHT) + .appendField("Valence"); + this.appendValueInput("AROUSAL") + .setCheck("Number") + .setAlign(Blockly.ALIGN_RIGHT) + .appendField("Arousal"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(62); + this.setTooltip('Set the current facial expression using Valence and Arousal. Parameters range from -1.0 to +1.0.'); + } +}; +Blockly.Lua['expression_setva'] = function(block) { + var value_valence = Blockly.Lua.valueToCode(block, 'VALENCE', Blockly.Lua.ORDER_ATOMIC); + var value_arousal = Blockly.Lua.valueToCode(block, 'AROUSAL', Blockly.Lua.ORDER_ATOMIC); + + var code = 'Expression:set_emotion_val_ar(' + value_valence + ', ' + value_arousal +')\n'; + return code; +}; + +Blockly.Blocks['expression_setrphi'] = { + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/smile-o.svg", 16, 18, "")) + .appendField("Set emotion to"); + this.appendValueInput("R") + .setCheck("Number") + .setAlign(Blockly.ALIGN_RIGHT) + .appendField("R"); + this.appendValueInput("PHI") + .setCheck("Number") + .setAlign(Blockly.ALIGN_RIGHT) + .appendField("Phi"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(105); + this.setTooltip('Set the current facial expression using Phi and R. Phi is a value in degrees, R ranges from 0.0 to 1.0.'); + } +}; +Blockly.Lua['expression_setrphi'] = function(block) { + var value_phi = Blockly.Lua.valueToCode(block, 'PHI', Blockly.Lua.ORDER_ATOMIC); + var value_r = Blockly.Lua.valueToCode(block, 'R', Blockly.Lua.ORDER_ATOMIC); + var code = 'Expression:set_emotion_r_phi(' + value_phi + ', ' + value_r +', true)\n'; + return code; +}; diff --git a/src/opsoro/apps/visual_programming/static/custom_blocks/general.js b/src/opsoro/server/static/js/blockly/custom_blocks/general.js similarity index 100% rename from src/opsoro/apps/visual_programming/static/custom_blocks/general.js rename to src/opsoro/server/static/js/blockly/custom_blocks/general.js diff --git a/src/opsoro/apps/visual_programming/static/custom_blocks/hardware.js b/src/opsoro/server/static/js/blockly/custom_blocks/hardware.js similarity index 81% rename from src/opsoro/apps/visual_programming/static/custom_blocks/hardware.js rename to src/opsoro/server/static/js/blockly/custom_blocks/hardware.js index 1a80ac7..fb4bd09 100644 --- a/src/opsoro/apps/visual_programming/static/custom_blocks/hardware.js +++ b/src/opsoro/server/static/js/blockly/custom_blocks/hardware.js @@ -3,7 +3,7 @@ Blockly.Lua.addReservedWords("Hardware"); Blockly.Blocks['hardware_ledonoff'] = { init: function() { this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-wrench.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/wrench.svg", 16, 18, "")) .appendField("Turn status LED") .appendField(new Blockly.FieldDropdown([["on", "ON"], ["off", "OFF"]]), "ONOFF"); this.setPreviousStatement(true); @@ -26,7 +26,7 @@ Blockly.Lua['hardware_ledonoff'] = function(block) { Blockly.Blocks['hardware_readanalog'] = { init: function() { this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-wrench.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/wrench.svg", 16, 18, "")) .appendField("Read analog sensor") .appendField(new Blockly.FieldDropdown([["A0", "0"], ["A1", "1"], ["A2", "2"], ["A3", "3"]]), "CHANNEL"); this.setOutput(true); @@ -36,6 +36,6 @@ Blockly.Blocks['hardware_readanalog'] = { }; Blockly.Lua['hardware_readanalog'] = function(block) { var dropdown_channel = block.getFieldValue('CHANNEL'); - var code = 'Hardware:ana_read_channel(' + dropdown_channel + ')'; + var code = 'Hardware.Analog:read_channel(' + dropdown_channel + ')'; return [code, Blockly.Lua.ORDER_FUNCTION_CALL]; }; diff --git a/src/opsoro/apps/visual_programming/static/custom_blocks/interface.js b/src/opsoro/server/static/js/blockly/custom_blocks/interface.js similarity index 91% rename from src/opsoro/apps/visual_programming/static/custom_blocks/interface.js rename to src/opsoro/server/static/js/blockly/custom_blocks/interface.js index 12c1e0f..accdcbc 100644 --- a/src/opsoro/apps/visual_programming/static/custom_blocks/interface.js +++ b/src/opsoro/server/static/js/blockly/custom_blocks/interface.js @@ -3,7 +3,7 @@ Blockly.Lua.addReservedWords("UI"); Blockly.Blocks['interface_init'] = { init: function() { this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-gamepad.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/gamepad.svg", 16, 18, "")) .appendField("Initialize interface"); this.setPreviousStatement(true); this.setNextStatement(true); @@ -19,7 +19,7 @@ Blockly.Lua['interface_init'] = function(block) { Blockly.Blocks['interface_addbutton'] = { init: function() { this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-gamepad.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/gamepad.svg", 16, 18, "")) .appendField("Add button") .appendField(new Blockly.FieldTextInput("Press Me!"), "NAME") .appendField("with icon") @@ -46,7 +46,7 @@ Blockly.Lua['interface_addbutton'] = function(block) { Blockly.Blocks['interface_addtogglebutton'] = { init: function() { this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-gamepad.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/gamepad.svg", 16, 18, "")) .appendField("Add toggle button") .appendField(new Blockly.FieldTextInput("Toggle Me!"), "NAME") .appendField("with icon") @@ -73,7 +73,7 @@ Blockly.Lua['interface_addtogglebutton'] = function(block) { Blockly.Blocks['interface_addkey'] = { init: function() { this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-gamepad.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/gamepad.svg", 16, 18, "")) .appendField("Add keyboard key") .appendField(new Blockly.FieldDropdown([["up", "up"], ["down", "down"], ["left", "left"], ["right", "right"], ["space", "space"]]), "KEY"); this.setPreviousStatement(true); @@ -91,7 +91,7 @@ Blockly.Lua['interface_addkey'] = function(block) { Blockly.Blocks['interface_addkey2'] = { init: function() { this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-gamepad.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/gamepad.svg", 16, 18, "")) .appendField("Add keyboard key") .appendField(new Blockly.FieldTextInput("a"), "KEY"); this.setPreviousStatement(true); @@ -109,7 +109,7 @@ Blockly.Lua['interface_addkey2'] = function(block) { Blockly.Blocks['interface_keypress'] = { init: function() { this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-gamepad.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/gamepad.svg", 16, 18, "")) .appendField("When key") .appendField(new Blockly.FieldDropdown(interface_keypress_dd), "KEY") .appendField("is") @@ -163,7 +163,7 @@ Blockly.Lua['interface_keypress'] = function(block) { Blockly.Blocks['interface_buttonpress'] = { init: function() { this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-gamepad.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/gamepad.svg", 16, 18, "")) .appendField("When button") .appendField(new Blockly.FieldDropdown(interface_buttonpress_dd), "BUTTON") .appendField("is") diff --git a/src/opsoro/apps/visual_programming/static/custom_blocks/neopixel.js b/src/opsoro/server/static/js/blockly/custom_blocks/neopixel.js similarity index 76% rename from src/opsoro/apps/visual_programming/static/custom_blocks/neopixel.js rename to src/opsoro/server/static/js/blockly/custom_blocks/neopixel.js index 9d3eae2..3c83285 100644 --- a/src/opsoro/apps/visual_programming/static/custom_blocks/neopixel.js +++ b/src/opsoro/server/static/js/blockly/custom_blocks/neopixel.js @@ -1,7 +1,7 @@ Blockly.Blocks['neo_init'] = { init: function() { this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-lightbulb-o.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/lightbulb-o.svg", 16, 18, "")) .appendField("Initialize") .appendField(new Blockly.FieldTextInput("8"), "NUMPIXELS") .appendField("NeoPixels"); @@ -13,7 +13,7 @@ Blockly.Blocks['neo_init'] = { }; Blockly.Lua['neo_init'] = function(block) { var text_numpixels = block.getFieldValue('NUMPIXELS'); - var code = 'Hardware:neo_init(' + text_numpixels + ')\n'; + var code = 'Hardware.Neopixel:init(' + text_numpixels + ')\n'; return code; }; @@ -21,7 +21,7 @@ Blockly.Blocks['neo_brightness'] = { init: function() { this.appendValueInput("BRIGHTNESS") .setCheck("Number") - .appendField(new Blockly.FieldImage("static/icons/fa-lightbulb-o.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/lightbulb-o.svg", 16, 18, "")) .appendField("Set brightness to"); this.setPreviousStatement(true); this.setNextStatement(true); @@ -31,14 +31,14 @@ Blockly.Blocks['neo_brightness'] = { }; Blockly.Lua['neo_brightness'] = function(block) { var value_brightness = Blockly.Lua.valueToCode(block, 'BRIGHTNESS', Blockly.Lua.ORDER_ATOMIC); - var code = 'Hardware:neo_set_brightness(' + value_brightness + ')\n'; + var code = 'Hardware.Neopixel:set_brightness(' + value_brightness + ')\n'; return code; }; Blockly.Blocks['neo_update'] = { init: function() { this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-lightbulb-o.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/lightbulb-o.svg", 16, 18, "")) .appendField("Update pixels"); this.setPreviousStatement(true); this.setNextStatement(true); @@ -47,7 +47,7 @@ Blockly.Blocks['neo_update'] = { } }; Blockly.Lua['neo_update'] = function(block) { - var code = 'Hardware:neo_show()\n'; + var code = 'Hardware.Neopixel:show()\n'; return code; }; @@ -55,7 +55,7 @@ Blockly.Blocks['neo_setpixel'] = { init: function() { this.appendValueInput("PIXEL") .setCheck("Number") - .appendField(new Blockly.FieldImage("static/icons/fa-lightbulb-o.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/lightbulb-o.svg", 16, 18, "")) .appendField("Set pixel"); this.appendDummyInput() .appendField("to color") @@ -75,7 +75,7 @@ Blockly.Lua['neo_setpixel'] = function(block) { var g = (hex & 0x00ff00) >> 8; var b = hex & 0x0000ff; - var code = 'Hardware:neo_set_pixel(' + value_pixel + ', ' + r + ', ' + g + ', ' + b + ')\n'; + var code = 'Hardware.Neopixel:set_pixel(' + value_pixel + ', ' + r + ', ' + g + ', ' + b + ')\n'; return code; }; @@ -83,7 +83,7 @@ Blockly.Blocks['neo_setrange'] = { init: function() { this.appendValueInput("START") .setCheck("Number") - .appendField(new Blockly.FieldImage("static/icons/fa-lightbulb-o.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/lightbulb-o.svg", 16, 18, "")) .appendField("Set pixels from"); this.appendValueInput("END") .setCheck("Number") @@ -107,14 +107,14 @@ Blockly.Lua['neo_setrange'] = function(block) { var g = (hex & 0x00ff00) >> 8; var b = hex & 0x0000ff; - var code = 'Hardware:neo_set_range(' + value_start + ', ' + value_end + ', ' + r + ', ' + g + ', ' + b + ')\n'; + var code = 'Hardware.Neopixel:set_range(' + value_start + ', ' + value_end + ', ' + r + ', ' + g + ', ' + b + ')\n'; return code; }; Blockly.Blocks['neo_setall'] = { init: function() { this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-lightbulb-o.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/lightbulb-o.svg", 16, 18, "")) .appendField("Set all pixels to color") .appendField(new Blockly.FieldColour("#ff0000"), "COLOR"); this.setPreviousStatement(true); @@ -131,6 +131,6 @@ Blockly.Lua['neo_setall'] = function(block) { var g = (hex & 0x00ff00) >> 8; var b = hex & 0x0000ff; - var code = 'Hardware:neo_set_all(' + r + ', ' + g + ', ' + b + ')\n'; + var code = 'Hardware.Neopixel:set_all(' + r + ', ' + g + ', ' + b + ')\n'; return code; }; diff --git a/src/opsoro/server/static/js/blockly/custom_blocks/servo.js b/src/opsoro/server/static/js/blockly/custom_blocks/servo.js new file mode 100644 index 0000000..6866695 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/custom_blocks/servo.js @@ -0,0 +1,90 @@ +Blockly.Blocks['servo_init'] = { + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/gears.svg", 16, 18, "")) + .appendField("Initialize servos"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(345); + this.setTooltip('Initialize the servo control chip.\nThis must be done before servos can be used.'); + } +}; +Blockly.Lua['servo_init'] = function(block) { + var code = 'Hardware.Servo:init()\n'; + return code; +}; + +Blockly.Blocks['servo_enabledisable'] = { + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/gears.svg", 16, 18, "")) + .appendField("Turn all servos") + .appendField(new Blockly.FieldDropdown([["on", "ON"], ["off", "OFF"]]), "ONOFF"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(345); + this.setTooltip('Enables or disables all servos.'); + } +}; +Blockly.Lua['servo_enabledisable'] = function(block) { + var dropdown_onoff = block.getFieldValue('ONOFF'); + var code = ''; + if(dropdown_onoff == "ON"){ + code = "Hardware.Servo:enable()\n" + }else{ + code = "Hardware.Servo:disable()\n" + } + return code; +}; + +Blockly.Blocks['servo_set'] = { + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/gears.svg", 16, 18, "")) + .appendField("Set servo ") + .appendField(new Blockly.FieldDropdown( + [ + ["0", "0"], ["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"], ["5", "5"], + ["6", "6"], ["7", "7"], ["8", "8"], ["9", "9"], ["10", "10"], ["11", "11"], + ["12", "12"], ["13", "13"], ["14", "14"], ["15", "15"] + ]), + "CHANNEL"); + this.appendValueInput("POS") + .setCheck("Number") + .appendField("to position"); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(334); + this.setTooltip('Sets the position of one servo. Position should be between 500 and 2500.'); + } +}; +Blockly.Lua['servo_set'] = function(block) { + var dropdown_channel = block.getFieldValue('CHANNEL'); + var value_pos = Blockly.Lua.valueToCode(block, 'POS', Blockly.Lua.ORDER_ATOMIC); + var code = 'Hardware.Servo:set(' + dropdown_channel + ', ' + value_pos + ')\n'; + return code; +}; + +Blockly.Blocks['dof_set'] = { + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/gears.svg", 16, 18, "")) + .appendField("Set dof ") + .appendField(new Blockly.FieldDropdown(doflist), "DOF"); + this.appendValueInput("VALUE") + .setCheck("Number") + .appendField("to value"); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(205); + this.setTooltip('Sets the value of one DOF. Value should be between -1.0 and 1.0.'); + } +}; +Blockly.Lua['dof_set'] = function(block) { + var dropdown_channel = block.getFieldValue('DOF'); + var value_pos = Blockly.Lua.valueToCode(block, 'VALUE', Blockly.Lua.ORDER_ATOMIC); + var code = 'Robot:set_dof("' + dropdown_channel + '", ' + value_pos + ')\n'; + return code; +}; diff --git a/src/opsoro/apps/visual_programming/static/custom_blocks/sound.js b/src/opsoro/server/static/js/blockly/custom_blocks/sound.js similarity index 82% rename from src/opsoro/apps/visual_programming/static/custom_blocks/sound.js rename to src/opsoro/server/static/js/blockly/custom_blocks/sound.js index e313a3b..c490d7b 100644 --- a/src/opsoro/apps/visual_programming/static/custom_blocks/sound.js +++ b/src/opsoro/server/static/js/blockly/custom_blocks/sound.js @@ -3,7 +3,7 @@ Blockly.Lua.addReservedWords("Sound"); Blockly.Blocks['sound_saytts'] = { init: function() { this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-volume-down.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/volume-down.svg", 16, 18, "")) .appendField("Say") .appendField(new Blockly.FieldTextInput("I am a robot!"), "TEXT"); this.setPreviousStatement(true); @@ -21,7 +21,7 @@ Blockly.Lua['sound_saytts'] = function(block) { Blockly.Blocks['sound_play'] = { init: function() { this.appendDummyInput() - .appendField(new Blockly.FieldImage("static/icons/fa-volume-down.png", 16, 18, "")) + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/volume-down.svg", 16, 18, "")) .appendField("Play") .appendField(new Blockly.FieldDropdown(soundlist), "FILENAME"); this.setPreviousStatement(true); diff --git a/src/opsoro/server/static/js/blockly/custom_blocks/touch.js b/src/opsoro/server/static/js/blockly/custom_blocks/touch.js new file mode 100644 index 0000000..ba62277 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/custom_blocks/touch.js @@ -0,0 +1,62 @@ +Blockly.Blocks['touch_init'] = { + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/hand-o-up.svg", 16, 18, "")) + .appendField("Initialize with") + .appendField(new Blockly.FieldDropdown([["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"], ["5", "5"], ["6", "6"], ["7", "7"], ["8", "8"], ["9", "9"], ["10", "10"], ["11", "11"], ["12", "12"]]), "ELECTRODE") + .appendField("electrodes"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(210); + this.setTooltip('Initialize the capacitive touch sensor with a specified number of electrodes.'); + } +}; +Blockly.Lua['touch_init'] = function(block) { + var dropdown_electrode = block.getFieldValue('ELECTRODE'); + var code = 'Hardware.Capacitive:init(' + dropdown_electrode + ')\n'; + return code; +}; + +Blockly.Blocks['touch_etouched'] = { + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldImage("/static/images/fontawesome/white/svg/hand-o-up.svg", 16, 18, "")) + .appendField("When electrode") + .appendField(new Blockly.FieldDropdown([["E0", "0"], ["E1", "1"], ["E2", "2"], ["E3", "3"], ["E4", "4"], ["E5", "5"], ["E6", "6"], ["E7", "7"], ["E8", "8"], ["E9", "9"], ["E10", "10"], ["E11", "11"]]), "ELECTRODE") + .appendField("is") + this.appendStatementInput("BODY_TOU") + .appendField("Touched"); + this.appendStatementInput("BODY_REL") + .appendField("Released"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(210); + this.setTooltip('Execute a block of code when an electrode is touched or released.'); + } +}; +Blockly.Lua['touch_etouched'] = function(block) { + var dropdown_electrode = block.getFieldValue('ELECTRODE'); + var statements_body_tou = Blockly.Lua.statementToCode(block, 'BODY_TOU'); + var statements_body_rel = Blockly.Lua.statementToCode(block, 'BODY_REL'); + + var touch_var = Blockly.Lua.variableDB_.getDistinctName('e' + dropdown_electrode + '_touch', Blockly.Variables.NAME_TYPE); + + var code = 'local ' + touch_var + ' = Hardware.Capacitive:get_touched()\n'; + code += touch_var + ' = bit.band(' + touch_var + ', 2^' + dropdown_electrode + ') > 0\n'; + + if(statements_body_tou == '' && statements_body_rel == ''){ + return ''; + } + if(statements_body_tou != ''){ + code += 'if rising_edge("' + touch_var + '", ' + touch_var + ') then\n'; + code += statements_body_tou; + code += 'end\n'; + } + if(statements_body_rel != ''){ + code += 'if falling_edge("' + touch_var + '", ' + touch_var + ') then\n'; + code += statements_body_rel; + code += 'end\n'; + } + + return code; +}; diff --git a/src/opsoro/server/static/js/blockly/dart_compressed.js b/src/opsoro/server/static/js/blockly/dart_compressed.js new file mode 100644 index 0000000..bdaa909 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/dart_compressed.js @@ -0,0 +1,96 @@ +// Do not edit this file; automatically generated by build.py. +'use strict'; + + +// Copyright 2014 Google Inc. Apache License 2.0 +Blockly.Dart=new Blockly.Generator("Dart");Blockly.Dart.addReservedWords("assert,break,case,catch,class,const,continue,default,do,else,enum,extends,false,final,finally,for,if,in,is,new,null,rethrow,return,super,switch,this,throw,true,try,var,void,while,with,print,identityHashCode,identical,BidirectionalIterator,Comparable,double,Function,int,Invocation,Iterable,Iterator,List,Map,Match,num,Pattern,RegExp,Set,StackTrace,String,StringSink,Type,bool,DateTime,Deprecated,Duration,Expando,Null,Object,RuneIterator,Runes,Stopwatch,StringBuffer,Symbol,Uri,Comparator,AbstractClassInstantiationError,ArgumentError,AssertionError,CastError,ConcurrentModificationError,CyclicInitializationError,Error,Exception,FallThroughError,FormatException,IntegerDivisionByZeroException,NoSuchMethodError,NullThrownError,OutOfMemoryError,RangeError,StackOverflowError,StateError,TypeError,UnimplementedError,UnsupportedError"); +Blockly.Dart.ORDER_ATOMIC=0;Blockly.Dart.ORDER_UNARY_POSTFIX=1;Blockly.Dart.ORDER_UNARY_PREFIX=2;Blockly.Dart.ORDER_MULTIPLICATIVE=3;Blockly.Dart.ORDER_ADDITIVE=4;Blockly.Dart.ORDER_SHIFT=5;Blockly.Dart.ORDER_BITWISE_AND=6;Blockly.Dart.ORDER_BITWISE_XOR=7;Blockly.Dart.ORDER_BITWISE_OR=8;Blockly.Dart.ORDER_RELATIONAL=9;Blockly.Dart.ORDER_EQUALITY=10;Blockly.Dart.ORDER_LOGICAL_AND=11;Blockly.Dart.ORDER_LOGICAL_OR=12;Blockly.Dart.ORDER_IF_NULL=13;Blockly.Dart.ORDER_CONDITIONAL=14; +Blockly.Dart.ORDER_CASCADE=15;Blockly.Dart.ORDER_ASSIGNMENT=16;Blockly.Dart.ORDER_NONE=99; +Blockly.Dart.init=function(a){Blockly.Dart.definitions_=Object.create(null);Blockly.Dart.functionNames_=Object.create(null);Blockly.Dart.variableDB_?Blockly.Dart.variableDB_.reset():Blockly.Dart.variableDB_=new Blockly.Names(Blockly.Dart.RESERVED_WORDS_);var b=[];a=a.variableList;if(a.length){for(var c=0;cc&&(a=a+" - "+-c,g=Blockly.Dart.ORDER_ADDITIVE); +d&&(a=c?"-("+a+")":"-"+a,g=Blockly.Dart.ORDER_UNARY_PREFIX);g=Math.floor(g);e=Math.floor(e);g&&e>=g&&(a="("+a+")")}return a};Blockly.Dart.lists={};Blockly.Dart.addReservedWords("Math");Blockly.Dart.lists_create_empty=function(a){return["[]",Blockly.Dart.ORDER_ATOMIC]};Blockly.Dart.lists_create_with=function(a){for(var b=Array(a.itemCount_),c=0;c direction * a.compareTo(b),',' "TEXT": (a, b) => direction * a.toString().compareTo(b.toString()),',' "IGNORE_CASE": '," (a, b) => direction * ", +" a.toString().toLowerCase().compareTo(b.toString().toLowerCase())"," };"," list = new List.from(list);"," var compare = compareFuncs[type];"," list.sort(compare);"," return list;","}"])+"("+b+', "'+a+'", '+c+")",Blockly.Dart.ORDER_UNARY_POSTFIX]}; +Blockly.Dart.lists_split=function(a){var b=Blockly.Dart.valueToCode(a,"INPUT",Blockly.Dart.ORDER_UNARY_POSTFIX),c=Blockly.Dart.valueToCode(a,"DELIM",Blockly.Dart.ORDER_NONE)||"''";a=a.getFieldValue("MODE");if("SPLIT"==a)b||(b="''"),a="split";else if("JOIN"==a)b||(b="[]"),a="join";else throw"Unknown mode: "+a;return[b+"."+a+"("+c+")",Blockly.Dart.ORDER_UNARY_POSTFIX]}; +Blockly.Dart.lists_reverse=function(a){return["new List.from("+(Blockly.Dart.valueToCode(a,"LIST",Blockly.Dart.ORDER_NONE)||"[]")+".reversed)",Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.math={};Blockly.Dart.addReservedWords("Math");Blockly.Dart.math_number=function(a){a=parseFloat(a.getFieldValue("NUM"));var b;Infinity==a?(a="double.INFINITY",b=Blockly.Dart.ORDER_UNARY_POSTFIX):-Infinity==a?(a="-double.INFINITY",b=Blockly.Dart.ORDER_UNARY_PREFIX):b=0>a?Blockly.Dart.ORDER_UNARY_PREFIX:Blockly.Dart.ORDER_ATOMIC;return[a,b]}; +Blockly.Dart.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.Dart.ORDER_ADDITIVE],MINUS:[" - ",Blockly.Dart.ORDER_ADDITIVE],MULTIPLY:[" * ",Blockly.Dart.ORDER_MULTIPLICATIVE],DIVIDE:[" / ",Blockly.Dart.ORDER_MULTIPLICATIVE],POWER:[null,Blockly.Dart.ORDER_NONE]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.Dart.valueToCode(a,"A",b)||"0";a=Blockly.Dart.valueToCode(a,"B",b)||"0";return c?[d+c+a,b]:(Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;",["Math.pow("+d+", "+a+ +")",Blockly.Dart.ORDER_UNARY_POSTFIX])}; +Blockly.Dart.math_single=function(a){var b=a.getFieldValue("OP"),c;if("NEG"==b)return a=Blockly.Dart.valueToCode(a,"NUM",Blockly.Dart.ORDER_UNARY_PREFIX)||"0","-"==a[0]&&(a=" "+a),["-"+a,Blockly.Dart.ORDER_UNARY_PREFIX];Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";a="ABS"==b||"ROUND"==b.substring(0,5)?Blockly.Dart.valueToCode(a,"NUM",Blockly.Dart.ORDER_UNARY_POSTFIX)||"0":"SIN"==b||"COS"==b||"TAN"==b?Blockly.Dart.valueToCode(a,"NUM",Blockly.Dart.ORDER_MULTIPLICATIVE)|| +"0":Blockly.Dart.valueToCode(a,"NUM",Blockly.Dart.ORDER_NONE)||"0";switch(b){case "ABS":c=a+".abs()";break;case "ROOT":c="Math.sqrt("+a+")";break;case "LN":c="Math.log("+a+")";break;case "EXP":c="Math.exp("+a+")";break;case "POW10":c="Math.pow(10,"+a+")";break;case "ROUND":c=a+".round()";break;case "ROUNDUP":c=a+".ceil()";break;case "ROUNDDOWN":c=a+".floor()";break;case "SIN":c="Math.sin("+a+" / 180 * Math.PI)";break;case "COS":c="Math.cos("+a+" / 180 * Math.PI)";break;case "TAN":c="Math.tan("+a+ +" / 180 * Math.PI)"}if(c)return[c,Blockly.Dart.ORDER_UNARY_POSTFIX];switch(b){case "LOG10":c="Math.log("+a+") / Math.log(10)";break;case "ASIN":c="Math.asin("+a+") / Math.PI * 180";break;case "ACOS":c="Math.acos("+a+") / Math.PI * 180";break;case "ATAN":c="Math.atan("+a+") / Math.PI * 180";break;default:throw"Unknown math operator: "+b;}return[c,Blockly.Dart.ORDER_MULTIPLICATIVE]}; +Blockly.Dart.math_constant=function(a){var b={PI:["Math.PI",Blockly.Dart.ORDER_UNARY_POSTFIX],E:["Math.E",Blockly.Dart.ORDER_UNARY_POSTFIX],GOLDEN_RATIO:["(1 + Math.sqrt(5)) / 2",Blockly.Dart.ORDER_MULTIPLICATIVE],SQRT2:["Math.SQRT2",Blockly.Dart.ORDER_UNARY_POSTFIX],SQRT1_2:["Math.SQRT1_2",Blockly.Dart.ORDER_UNARY_POSTFIX],INFINITY:["double.INFINITY",Blockly.Dart.ORDER_ATOMIC]};a=a.getFieldValue("CONSTANT");"INFINITY"!=a&&(Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;"); +return b[a]}; +Blockly.Dart.math_number_property=function(a){var b=Blockly.Dart.valueToCode(a,"NUMBER_TO_CHECK",Blockly.Dart.ORDER_MULTIPLICATIVE);if(!b)return["false",Blockly.Python.ORDER_ATOMIC];var c=a.getFieldValue("PROPERTY"),d;if("PRIME"==c)return Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;",[Blockly.Dart.provideFunction_("math_isPrime",["bool "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(n) {"," // https://en.wikipedia.org/wiki/Primality_test#Naive_methods"," if (n == 2 || n == 3) {"," return true;", +" }"," // False if n is null, negative, is 1, or not whole."," // And false if n is divisible by 2 or 3."," if (n == null || n <= 1 || n % 1 != 0 || n % 2 == 0 || n % 3 == 0) {"," return false;"," }"," // Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {"," if (n % (x - 1) == 0 || n % (x + 1) == 0) {"," return false;"," }"," }"," return true;","}"])+"("+b+")",Blockly.Dart.ORDER_UNARY_POSTFIX];switch(c){case "EVEN":d=b+ +" % 2 == 0";break;case "ODD":d=b+" % 2 == 1";break;case "WHOLE":d=b+" % 1 == 0";break;case "POSITIVE":d=b+" > 0";break;case "NEGATIVE":d=b+" < 0";break;case "DIVISIBLE_BY":a=Blockly.Dart.valueToCode(a,"DIVISOR",Blockly.Dart.ORDER_MULTIPLICATIVE);if(!a)return["false",Blockly.Python.ORDER_ATOMIC];d=b+" % "+a+" == 0"}return[d,Blockly.Dart.ORDER_EQUALITY]}; +Blockly.Dart.math_change=function(a){var b=Blockly.Dart.valueToCode(a,"DELTA",Blockly.Dart.ORDER_ADDITIVE)||"0";a=Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);return a+" = ("+a+" is num ? "+a+" : 0) + "+b+";\n"};Blockly.Dart.math_round=Blockly.Dart.math_single;Blockly.Dart.math_trig=Blockly.Dart.math_single; +Blockly.Dart.math_on_list=function(a){var b=a.getFieldValue("OP");a=Blockly.Dart.valueToCode(a,"LIST",Blockly.Dart.ORDER_NONE)||"[]";switch(b){case "SUM":b=Blockly.Dart.provideFunction_("math_sum",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," num sumVal = 0;"," myList.forEach((num entry) {sumVal += entry;});"," return sumVal;","}"]);b=b+"("+a+")";break;case "MIN":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_min", +["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," if (myList.isEmpty) return null;"," num minVal = myList[0];"," myList.forEach((num entry) {minVal = Math.min(minVal, entry);});"," return minVal;","}"]);b=b+"("+a+")";break;case "MAX":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_max",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," if (myList.isEmpty) return null;"," num maxVal = myList[0];", +" myList.forEach((num entry) {maxVal = Math.max(maxVal, entry);});"," return maxVal;","}"]);b=b+"("+a+")";break;case "AVERAGE":b=Blockly.Dart.provideFunction_("math_mean",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," // First filter list for numbers only."," List localList = new List.from(myList);"," localList.removeWhere((a) => a is! num);"," if (localList.isEmpty) return null;"," num sumVal = 0;"," localList.forEach((num entry) {sumVal += entry;});"," return sumVal / localList.length;", +"}"]);b=b+"("+a+")";break;case "MEDIAN":b=Blockly.Dart.provideFunction_("math_median",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," // First filter list for numbers only, then sort, then return middle value"," // or the average of two middle values if list has an even number of elements."," List localList = new List.from(myList);"," localList.removeWhere((a) => a is! num);"," if (localList.isEmpty) return null;"," localList.sort((a, b) => (a - b));"," int index = localList.length ~/ 2;", +" if (localList.length % 2 == 1) {"," return localList[index];"," } else {"," return (localList[index - 1] + localList[index]) / 2;"," }","}"]);b=b+"("+a+")";break;case "MODE":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_modes",["List "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List values) {"," List modes = [];"," List counts = [];"," int maxCount = 0;"," for (int i = 0; i < values.length; i++) {"," var value = values[i];", +" bool found = false;"," int thisCount;"," for (int j = 0; j < counts.length; j++) {"," if (counts[j][0] == value) {"," thisCount = ++counts[j][1];"," found = true;"," break;"," }"," }"," if (!found) {"," counts.add([value, 1]);"," thisCount = 1;"," }"," maxCount = Math.max(thisCount, maxCount);"," }"," for (int j = 0; j < counts.length; j++) {"," if (counts[j][1] == maxCount) {"," modes.add(counts[j][0]);"," }"," }"," return modes;", +"}"]);b=b+"("+a+")";break;case "STD_DEV":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_standard_deviation",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," // First filter list for numbers only."," List numbers = new List.from(myList);"," numbers.removeWhere((a) => a is! num);"," if (numbers.isEmpty) return null;"," num n = numbers.length;"," num sum = 0;"," numbers.forEach((x) => sum += x);"," num mean = sum / n;", +" num sumSquare = 0;"," numbers.forEach((x) => sumSquare += Math.pow(x - mean, 2));"," return Math.sqrt(sumSquare / n);","}"]);b=b+"("+a+")";break;case "RANDOM":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_random_item",["dynamic "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," int x = new Math.Random().nextInt(myList.length);"," return myList[x];","}"]);b=b+"("+a+")";break;default:throw"Unknown operator: "+b;}return[b, +Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.math_modulo=function(a){var b=Blockly.Dart.valueToCode(a,"DIVIDEND",Blockly.Dart.ORDER_MULTIPLICATIVE)||"0";a=Blockly.Dart.valueToCode(a,"DIVISOR",Blockly.Dart.ORDER_MULTIPLICATIVE)||"0";return[b+" % "+a,Blockly.Dart.ORDER_MULTIPLICATIVE]}; +Blockly.Dart.math_constrain=function(a){Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";var b=Blockly.Dart.valueToCode(a,"VALUE",Blockly.Dart.ORDER_NONE)||"0",c=Blockly.Dart.valueToCode(a,"LOW",Blockly.Dart.ORDER_NONE)||"0";a=Blockly.Dart.valueToCode(a,"HIGH",Blockly.Dart.ORDER_NONE)||"double.INFINITY";return["Math.min(Math.max("+b+", "+c+"), "+a+")",Blockly.Dart.ORDER_UNARY_POSTFIX]}; +Blockly.Dart.math_random_int=function(a){Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";var b=Blockly.Dart.valueToCode(a,"FROM",Blockly.Dart.ORDER_NONE)||"0";a=Blockly.Dart.valueToCode(a,"TO",Blockly.Dart.ORDER_NONE)||"0";return[Blockly.Dart.provideFunction_("math_random_int",["int "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(num a, num b) {"," if (a > b) {"," // Swap a and b to ensure a is smaller."," num c = a;"," a = b;"," b = c;"," }"," return new Math.Random().nextInt(b - a + 1) + a;", +"}"])+"("+b+", "+a+")",Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.math_random_float=function(a){Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";return["new Math.Random().nextDouble()",Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.variables={};Blockly.Dart.variables_get=function(a){return[Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),Blockly.Dart.ORDER_ATOMIC]};Blockly.Dart.variables_set=function(a){var b=Blockly.Dart.valueToCode(a,"VALUE",Blockly.Dart.ORDER_ASSIGNMENT)||"0";return Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE)+" = "+b+";\n"};Blockly.Dart.colour={};Blockly.Dart.addReservedWords("Math");Blockly.Dart.colour_picker=function(a){return["'"+a.getFieldValue("COLOUR")+"'",Blockly.Dart.ORDER_ATOMIC]}; +Blockly.Dart.colour_random=function(a){Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";return[Blockly.Dart.provideFunction_("colour_random",["String "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"() {"," String hex = '0123456789abcdef';"," var rnd = new Math.Random();"," return '#${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}'"," '${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}'"," '${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}';","}"])+"()",Blockly.Dart.ORDER_UNARY_POSTFIX]}; +Blockly.Dart.colour_rgb=function(a){var b=Blockly.Dart.valueToCode(a,"RED",Blockly.Dart.ORDER_NONE)||0,c=Blockly.Dart.valueToCode(a,"GREEN",Blockly.Dart.ORDER_NONE)||0;a=Blockly.Dart.valueToCode(a,"BLUE",Blockly.Dart.ORDER_NONE)||0;Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";return[Blockly.Dart.provideFunction_("colour_rgb",["String "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(num r, num g, num b) {"," num rn = (Math.max(Math.min(r, 1), 0) * 255).round();"," String rs = rn.toInt().toRadixString(16);", +" rs = '0$rs';"," rs = rs.substring(rs.length - 2);"," num gn = (Math.max(Math.min(g, 1), 0) * 255).round();"," String gs = gn.toInt().toRadixString(16);"," gs = '0$gs';"," gs = gs.substring(gs.length - 2);"," num bn = (Math.max(Math.min(b, 1), 0) * 255).round();"," String bs = bn.toInt().toRadixString(16);"," bs = '0$bs';"," bs = bs.substring(bs.length - 2);"," return '#$rs$gs$bs';","}"])+"("+b+", "+c+", "+a+")",Blockly.Dart.ORDER_UNARY_POSTFIX]}; +Blockly.Dart.colour_blend=function(a){var b=Blockly.Dart.valueToCode(a,"COLOUR1",Blockly.Dart.ORDER_NONE)||"'#000000'",c=Blockly.Dart.valueToCode(a,"COLOUR2",Blockly.Dart.ORDER_NONE)||"'#000000'";a=Blockly.Dart.valueToCode(a,"RATIO",Blockly.Dart.ORDER_NONE)||.5;Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";return[Blockly.Dart.provideFunction_("colour_blend",["String "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(String c1, String c2, num ratio) {"," ratio = Math.max(Math.min(ratio, 1), 0);", +" int r1 = int.parse('0x${c1.substring(1, 3)}');"," int g1 = int.parse('0x${c1.substring(3, 5)}');"," int b1 = int.parse('0x${c1.substring(5, 7)}');"," int r2 = int.parse('0x${c2.substring(1, 3)}');"," int g2 = int.parse('0x${c2.substring(3, 5)}');"," int b2 = int.parse('0x${c2.substring(5, 7)}');"," num rn = (r1 * (1 - ratio) + r2 * ratio).round();"," String rs = rn.toInt().toRadixString(16);"," num gn = (g1 * (1 - ratio) + g2 * ratio).round();"," String gs = gn.toInt().toRadixString(16);", +" num bn = (b1 * (1 - ratio) + b2 * ratio).round();"," String bs = bn.toInt().toRadixString(16);"," rs = '0$rs';"," rs = rs.substring(rs.length - 2);"," gs = '0$gs';"," gs = gs.substring(gs.length - 2);"," bs = '0$bs';"," bs = bs.substring(bs.length - 2);"," return '#$rs$gs$bs';","}"])+"("+b+", "+c+", "+a+")",Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.procedures={}; +Blockly.Dart.procedures_defreturn=function(a){var b=Blockly.Dart.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE),c=Blockly.Dart.statementToCode(a,"STACK");Blockly.Dart.STATEMENT_PREFIX&&(c=Blockly.Dart.prefixLines(Blockly.Dart.STATEMENT_PREFIX.replace(/%1/g,"'"+a.id+"'"),Blockly.Dart.INDENT)+c);Blockly.Dart.INFINITE_LOOP_TRAP&&(c=Blockly.Dart.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+a.id+"'")+c);var d=Blockly.Dart.valueToCode(a,"RETURN",Blockly.Dart.ORDER_NONE)||"";d&&(d=" return "+ +d+";\n");for(var e=d?"dynamic":"void",f=[],g=0;g list = str.split(exp);"," final title = new StringBuffer();"," for (String part in list) {", +" if (part.length > 0) {"," title.write(part[0].toUpperCase());"," if (part.length > 0) {"," title.write(part.substring(1).toLowerCase());"," }"," }"," }"," return title.toString();","}"])+"("+a+")",Blockly.Dart.ORDER_UNARY_POSTFIX]}; +Blockly.Dart.text_trim=function(a){var b={LEFT:".replaceFirst(new RegExp(r'^\\s+'), '')",RIGHT:".replaceFirst(new RegExp(r'\\s+$'), '')",BOTH:".trim()"}[a.getFieldValue("MODE")];return[(Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_UNARY_POSTFIX)||"''")+b,Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.text_print=function(a){return"print("+(Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_NONE)||"''")+");\n"}; +Blockly.Dart.text_prompt_ext=function(a){Blockly.Dart.definitions_.import_dart_html="import 'dart:html' as Html;";var b="Html.window.prompt("+(a.getField("TEXT")?Blockly.Dart.quote_(a.getFieldValue("TEXT")):Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_NONE)||"''")+", '')";"NUMBER"==a.getFieldValue("TYPE")&&(Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;",b="Math.parseDouble("+b+")");return[b,Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.text_prompt=Blockly.Dart.text_prompt_ext; +Blockly.Dart.text_count=function(a){var b=Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_UNARY_POSTFIX)||"''";a=Blockly.Dart.valueToCode(a,"SUB",Blockly.Dart.ORDER_NONE)||"''";return[Blockly.Dart.provideFunction_("text_count",["int "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(String haystack, String needle) {"," if (needle.length == 0) {"," return haystack.length + 1;"," }"," int index = 0;"," int count = 0;"," while (index != -1) {"," index = haystack.indexOf(needle, index);"," if (index != -1) {", +" count++;"," index += needle.length;"," }"," }"," return count;","}"])+"("+b+", "+a+")",Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.text_replace=function(a){var b=Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_UNARY_POSTFIX)||"''",c=Blockly.Dart.valueToCode(a,"FROM",Blockly.Dart.ORDER_NONE)||"''";a=Blockly.Dart.valueToCode(a,"TO",Blockly.Dart.ORDER_NONE)||"''";return[b+".replaceAll("+c+", "+a+")",Blockly.Dart.ORDER_UNARY_POSTFIX]}; +Blockly.Dart.text_reverse=function(a){return["new String.fromCharCodes("+(Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_UNARY_POSTFIX)||"''")+".runes.toList().reversed)",Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.loops={}; +Blockly.Dart.controls_repeat_ext=function(a){var b=a.getField("TIMES")?String(Number(a.getFieldValue("TIMES"))):Blockly.Dart.valueToCode(a,"TIMES",Blockly.Dart.ORDER_ASSIGNMENT)||"0",c=Blockly.Dart.statementToCode(a,"DO"),c=Blockly.Dart.addLoopTrap(c,a.id);a="";var d=Blockly.Dart.variableDB_.getDistinctName("count",Blockly.Variables.NAME_TYPE),e=b;b.match(/^\w+$/)||Blockly.isNumber(b)||(e=Blockly.Dart.variableDB_.getDistinctName("repeat_end",Blockly.Variables.NAME_TYPE),a+="var "+e+" = "+b+";\n"); +return a+("for (int "+d+" = 0; "+d+" < "+e+"; "+d+"++) {\n"+c+"}\n")};Blockly.Dart.controls_repeat=Blockly.Dart.controls_repeat_ext;Blockly.Dart.controls_whileUntil=function(a){var b="UNTIL"==a.getFieldValue("MODE"),c=Blockly.Dart.valueToCode(a,"BOOL",b?Blockly.Dart.ORDER_UNARY_PREFIX:Blockly.Dart.ORDER_NONE)||"false",d=Blockly.Dart.statementToCode(a,"DO"),d=Blockly.Dart.addLoopTrap(d,a.id);b&&(c="!"+c);return"while ("+c+") {\n"+d+"}\n"}; +Blockly.Dart.controls_for=function(a){var b=Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.Dart.valueToCode(a,"FROM",Blockly.Dart.ORDER_ASSIGNMENT)||"0",d=Blockly.Dart.valueToCode(a,"TO",Blockly.Dart.ORDER_ASSIGNMENT)||"0",e=Blockly.Dart.valueToCode(a,"BY",Blockly.Dart.ORDER_ASSIGNMENT)||"1",f=Blockly.Dart.statementToCode(a,"DO"),f=Blockly.Dart.addLoopTrap(f,a.id);if(Blockly.isNumber(c)&&Blockly.isNumber(d)&&Blockly.isNumber(e)){var g=parseFloat(c)<= +parseFloat(d);a="for ("+b+" = "+c+"; "+b+(g?" <= ":" >= ")+d+"; "+b;b=Math.abs(parseFloat(e));a=(1==b?a+(g?"++":"--"):a+((g?" += ":" -= ")+b))+(") {\n"+f+"}\n")}else a="",g=c,c.match(/^\w+$/)||Blockly.isNumber(c)||(g=Blockly.Dart.variableDB_.getDistinctName(b+"_start",Blockly.Variables.NAME_TYPE),a+="var "+g+" = "+c+";\n"),c=d,d.match(/^\w+$/)||Blockly.isNumber(d)||(c=Blockly.Dart.variableDB_.getDistinctName(b+"_end",Blockly.Variables.NAME_TYPE),a+="var "+c+" = "+d+";\n"),d=Blockly.Dart.variableDB_.getDistinctName(b+ +"_inc",Blockly.Variables.NAME_TYPE),a+="num "+d+" = ",a=Blockly.isNumber(e)?a+(Math.abs(e)+";\n"):a+("("+e+").abs();\n"),a=a+("if ("+g+" > "+c+") {\n")+(Blockly.Dart.INDENT+d+" = -"+d+";\n"),a+="}\n",a+="for ("+b+" = "+g+"; "+d+" >= 0 ? "+b+" <= "+c+" : "+b+" >= "+c+"; "+b+" += "+d+") {\n"+f+"}\n";return a}; +Blockly.Dart.controls_forEach=function(a){var b=Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.Dart.valueToCode(a,"LIST",Blockly.Dart.ORDER_ASSIGNMENT)||"[]",d=Blockly.Dart.statementToCode(a,"DO"),d=Blockly.Dart.addLoopTrap(d,a.id);return"for (var "+b+" in "+c+") {\n"+d+"}\n"}; +Blockly.Dart.controls_flow_statements=function(a){switch(a.getFieldValue("FLOW")){case "BREAK":return"break;\n";case "CONTINUE":return"continue;\n"}throw"Unknown flow statement.";};Blockly.Dart.logic={};Blockly.Dart.controls_if=function(a){var b=0,c="",d,e;do e=Blockly.Dart.valueToCode(a,"IF"+b,Blockly.Dart.ORDER_NONE)||"false",d=Blockly.Dart.statementToCode(a,"DO"+b),c+=(0",GTE:">="}[a.getFieldValue("OP")],c="=="==b||"!="==b?Blockly.Dart.ORDER_EQUALITY:Blockly.Dart.ORDER_RELATIONAL,d=Blockly.Dart.valueToCode(a,"A",c)||"0";a=Blockly.Dart.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; +Blockly.Dart.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"&&":"||",c="&&"==b?Blockly.Dart.ORDER_LOGICAL_AND:Blockly.Dart.ORDER_LOGICAL_OR,d=Blockly.Dart.valueToCode(a,"A",c);a=Blockly.Dart.valueToCode(a,"B",c);if(d||a){var e="&&"==b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]};Blockly.Dart.logic_negate=function(a){var b=Blockly.Dart.ORDER_UNARY_PREFIX;return["!"+(Blockly.Dart.valueToCode(a,"BOOL",b)||"true"),b]}; +Blockly.Dart.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"true":"false",Blockly.Dart.ORDER_ATOMIC]};Blockly.Dart.logic_null=function(a){return["null",Blockly.Dart.ORDER_ATOMIC]};Blockly.Dart.logic_ternary=function(a){var b=Blockly.Dart.valueToCode(a,"IF",Blockly.Dart.ORDER_CONDITIONAL)||"false",c=Blockly.Dart.valueToCode(a,"THEN",Blockly.Dart.ORDER_CONDITIONAL)||"null";a=Blockly.Dart.valueToCode(a,"ELSE",Blockly.Dart.ORDER_CONDITIONAL)||"null";return[b+" ? "+c+" : "+a,Blockly.Dart.ORDER_CONDITIONAL]}; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/generators/dart.js b/src/opsoro/server/static/js/blockly/generators/dart.js new file mode 100644 index 0000000..094e772 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/dart.js @@ -0,0 +1,274 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2014 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Helper functions for generating Dart for blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Dart'); + +goog.require('Blockly.Generator'); + + +/** + * Dart code generator. + * @type {!Blockly.Generator} + */ +Blockly.Dart = new Blockly.Generator('Dart'); + +/** + * List of illegal variable names. + * This is not intended to be a security feature. Blockly is 100% client-side, + * so bypassing this list is trivial. This is intended to prevent users from + * accidentally clobbering a built-in object or function. + * @private + */ +Blockly.Dart.addReservedWords( + // https://www.dartlang.org/docs/spec/latest/dart-language-specification.pdf + // Section 16.1.1 + 'assert,break,case,catch,class,const,continue,default,do,else,enum,' + + 'extends,false,final,finally,for,if,in,is,new,null,rethrow,return,super,' + + 'switch,this,throw,true,try,var,void,while,with,' + + // https://api.dartlang.org/dart_core.html + 'print,identityHashCode,identical,BidirectionalIterator,Comparable,' + + 'double,Function,int,Invocation,Iterable,Iterator,List,Map,Match,num,' + + 'Pattern,RegExp,Set,StackTrace,String,StringSink,Type,bool,DateTime,' + + 'Deprecated,Duration,Expando,Null,Object,RuneIterator,Runes,Stopwatch,' + + 'StringBuffer,Symbol,Uri,Comparator,AbstractClassInstantiationError,' + + 'ArgumentError,AssertionError,CastError,ConcurrentModificationError,' + + 'CyclicInitializationError,Error,Exception,FallThroughError,' + + 'FormatException,IntegerDivisionByZeroException,NoSuchMethodError,' + + 'NullThrownError,OutOfMemoryError,RangeError,StackOverflowError,' + + 'StateError,TypeError,UnimplementedError,UnsupportedError' +); + +/** + * Order of operation ENUMs. + * https://www.dartlang.org/docs/dart-up-and-running/ch02.html#operator_table + */ +Blockly.Dart.ORDER_ATOMIC = 0; // 0 "" ... +Blockly.Dart.ORDER_UNARY_POSTFIX = 1; // expr++ expr-- () [] . ?. +Blockly.Dart.ORDER_UNARY_PREFIX = 2; // -expr !expr ~expr ++expr --expr +Blockly.Dart.ORDER_MULTIPLICATIVE = 3; // * / % ~/ +Blockly.Dart.ORDER_ADDITIVE = 4; // + - +Blockly.Dart.ORDER_SHIFT = 5; // << >> +Blockly.Dart.ORDER_BITWISE_AND = 6; // & +Blockly.Dart.ORDER_BITWISE_XOR = 7; // ^ +Blockly.Dart.ORDER_BITWISE_OR = 8; // | +Blockly.Dart.ORDER_RELATIONAL = 9; // >= > <= < as is is! +Blockly.Dart.ORDER_EQUALITY = 10; // == != +Blockly.Dart.ORDER_LOGICAL_AND = 11; // && +Blockly.Dart.ORDER_LOGICAL_OR = 12; // || +Blockly.Dart.ORDER_IF_NULL = 13; // ?? +Blockly.Dart.ORDER_CONDITIONAL = 14; // expr ? expr : expr +Blockly.Dart.ORDER_CASCADE = 15; // .. +Blockly.Dart.ORDER_ASSIGNMENT = 16; // = *= /= ~/= %= += -= <<= >>= &= ^= |= +Blockly.Dart.ORDER_NONE = 99; // (...) + +/** + * Initialise the database of variable names. + * @param {!Blockly.Workspace} workspace Workspace to generate code from. + */ +Blockly.Dart.init = function(workspace) { + // Create a dictionary of definitions to be printed before the code. + Blockly.Dart.definitions_ = Object.create(null); + // Create a dictionary mapping desired function names in definitions_ + // to actual function names (to avoid collisions with user functions). + Blockly.Dart.functionNames_ = Object.create(null); + + if (!Blockly.Dart.variableDB_) { + Blockly.Dart.variableDB_ = + new Blockly.Names(Blockly.Dart.RESERVED_WORDS_); + } else { + Blockly.Dart.variableDB_.reset(); + } + + var defvars = []; + var variables = workspace.variableList; + if (variables.length) { + for (var i = 0; i < variables.length; i++) { + defvars[i] = Blockly.Dart.variableDB_.getName(variables[i], + Blockly.Variables.NAME_TYPE); + } + Blockly.Dart.definitions_['variables'] = + 'var ' + defvars.join(', ') + ';'; + } +}; + +/** + * Prepend the generated code with the variable definitions. + * @param {string} code Generated code. + * @return {string} Completed code. + */ +Blockly.Dart.finish = function(code) { + // Indent every line. + if (code) { + code = Blockly.Dart.prefixLines(code, Blockly.Dart.INDENT); + } + code = 'main() {\n' + code + '}'; + + // Convert the definitions dictionary into a list. + var imports = []; + var definitions = []; + for (var name in Blockly.Dart.definitions_) { + var def = Blockly.Dart.definitions_[name]; + if (def.match(/^import\s/)) { + imports.push(def); + } else { + definitions.push(def); + } + } + // Clean up temporary data. + delete Blockly.Dart.definitions_; + delete Blockly.Dart.functionNames_; + Blockly.Dart.variableDB_.reset(); + var allDefs = imports.join('\n') + '\n\n' + definitions.join('\n\n'); + return allDefs.replace(/\n\n+/g, '\n\n').replace(/\n*$/, '\n\n\n') + code; +}; + +/** + * Naked values are top-level blocks with outputs that aren't plugged into + * anything. A trailing semicolon is needed to make this legal. + * @param {string} line Line of generated code. + * @return {string} Legal line of code. + */ +Blockly.Dart.scrubNakedValue = function(line) { + return line + ';\n'; +}; + +/** + * Encode a string as a properly escaped Dart string, complete with quotes. + * @param {string} string Text to encode. + * @return {string} Dart string. + * @private + */ +Blockly.Dart.quote_ = function(string) { + // Can't use goog.string.quote since $ must also be escaped. + string = string.replace(/\\/g, '\\\\') + .replace(/\n/g, '\\\n') + .replace(/\$/g, '\\$') + .replace(/'/g, '\\\''); + return '\'' + string + '\''; +}; + +/** + * Common tasks for generating Dart from blocks. + * Handles comments for the specified block and any connected value blocks. + * Calls any statements following this block. + * @param {!Blockly.Block} block The current block. + * @param {string} code The Dart code created for this block. + * @return {string} Dart code with comments and subsequent blocks added. + * @private + */ +Blockly.Dart.scrub_ = function(block, code) { + var commentCode = ''; + // Only collect comments for blocks that aren't inline. + if (!block.outputConnection || !block.outputConnection.targetConnection) { + // Collect comment for this block. + var comment = block.getCommentText(); + comment = Blockly.utils.wrap(comment, Blockly.Dart.COMMENT_WRAP - 3); + if (comment) { + if (block.getProcedureDef) { + // Use documentation comment for function comments. + commentCode += Blockly.Dart.prefixLines(comment + '\n', '/// '); + } else { + commentCode += Blockly.Dart.prefixLines(comment + '\n', '// '); + } + } + // Collect comments for all value arguments. + // Don't collect comments for nested statements. + for (var i = 0; i < block.inputList.length; i++) { + if (block.inputList[i].type == Blockly.INPUT_VALUE) { + var childBlock = block.inputList[i].connection.targetBlock(); + if (childBlock) { + var comment = Blockly.Dart.allNestedComments(childBlock); + if (comment) { + commentCode += Blockly.Dart.prefixLines(comment, '// '); + } + } + } + } + } + var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); + var nextCode = Blockly.Dart.blockToCode(nextBlock); + return commentCode + code + nextCode; +}; + +/** + * Gets a property and adjusts the value while taking into account indexing. + * @param {!Blockly.Block} block The block. + * @param {string} atId The property ID of the element to get. + * @param {number=} opt_delta Value to add. + * @param {boolean=} opt_negate Whether to negate the value. + * @param {number=} opt_order The highest order acting on this value. + * @return {string|number} + */ +Blockly.Dart.getAdjusted = function(block, atId, opt_delta, opt_negate, + opt_order) { + var delta = opt_delta || 0; + var order = opt_order || Blockly.Dart.ORDER_NONE; + if (block.workspace.options.oneBasedIndex) { + delta--; + } + var defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0'; + if (delta) { + var at = Blockly.Dart.valueToCode(block, atId, + Blockly.Dart.ORDER_ADDITIVE) || defaultAtIndex; + } else if (opt_negate) { + var at = Blockly.Dart.valueToCode(block, atId, + Blockly.Dart.ORDER_UNARY_PREFIX) || defaultAtIndex; + } else { + var at = Blockly.Dart.valueToCode(block, atId, order) || + defaultAtIndex; + } + + if (Blockly.isNumber(at)) { + // If the index is a naked number, adjust it right now. + at = parseInt(at, 10) + delta; + if (opt_negate) { + at = -at; + } + } else { + // If the index is dynamic, adjust it in code. + if (delta > 0) { + at = at + ' + ' + delta; + var innerOrder = Blockly.Dart.ORDER_ADDITIVE; + } else if (delta < 0) { + at = at + ' - ' + -delta; + var innerOrder = Blockly.Dart.ORDER_ADDITIVE; + } + if (opt_negate) { + if (delta) { + at = '-(' + at + ')'; + } else { + at = '-' + at; + } + var innerOrder = Blockly.Dart.ORDER_UNARY_PREFIX; + } + innerOrder = Math.floor(innerOrder); + order = Math.floor(order); + if (innerOrder && order >= innerOrder) { + at = '(' + at + ')'; + } + } + return at; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/dart/colour.js b/src/opsoro/server/static/js/blockly/generators/dart/colour.js new file mode 100644 index 0000000..7ded914 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/dart/colour.js @@ -0,0 +1,128 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2014 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Dart for colour blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Dart.colour'); + +goog.require('Blockly.Dart'); + + +Blockly.Dart.addReservedWords('Math'); + +Blockly.Dart['colour_picker'] = function(block) { + // Colour picker. + var code = '\'' + block.getFieldValue('COLOUR') + '\''; + return [code, Blockly.Dart.ORDER_ATOMIC]; +}; + +Blockly.Dart['colour_random'] = function(block) { + // Generate a random colour. + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + var functionName = Blockly.Dart.provideFunction_( + 'colour_random', + ['String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '() {', + ' String hex = \'0123456789abcdef\';', + ' var rnd = new Math.Random();', + ' return \'#${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}\'', + ' \'${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}\'', + ' \'${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}\';', + '}']); + var code = functionName + '()'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['colour_rgb'] = function(block) { + // Compose a colour from RGB components expressed as percentages. + var red = Blockly.Dart.valueToCode(block, 'RED', + Blockly.Dart.ORDER_NONE) || 0; + var green = Blockly.Dart.valueToCode(block, 'GREEN', + Blockly.Dart.ORDER_NONE) || 0; + var blue = Blockly.Dart.valueToCode(block, 'BLUE', + Blockly.Dart.ORDER_NONE) || 0; + + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + var functionName = Blockly.Dart.provideFunction_( + 'colour_rgb', + ['String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(num r, num g, num b) {', + ' num rn = (Math.max(Math.min(r, 1), 0) * 255).round();', + ' String rs = rn.toInt().toRadixString(16);', + ' rs = \'0$rs\';', + ' rs = rs.substring(rs.length - 2);', + ' num gn = (Math.max(Math.min(g, 1), 0) * 255).round();', + ' String gs = gn.toInt().toRadixString(16);', + ' gs = \'0$gs\';', + ' gs = gs.substring(gs.length - 2);', + ' num bn = (Math.max(Math.min(b, 1), 0) * 255).round();', + ' String bs = bn.toInt().toRadixString(16);', + ' bs = \'0$bs\';', + ' bs = bs.substring(bs.length - 2);', + ' return \'#$rs$gs$bs\';', + '}']); + var code = functionName + '(' + red + ', ' + green + ', ' + blue + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['colour_blend'] = function(block) { + // Blend two colours together. + var c1 = Blockly.Dart.valueToCode(block, 'COLOUR1', + Blockly.Dart.ORDER_NONE) || '\'#000000\''; + var c2 = Blockly.Dart.valueToCode(block, 'COLOUR2', + Blockly.Dart.ORDER_NONE) || '\'#000000\''; + var ratio = Blockly.Dart.valueToCode(block, 'RATIO', + Blockly.Dart.ORDER_NONE) || 0.5; + + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + var functionName = Blockly.Dart.provideFunction_( + 'colour_blend', + ['String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(String c1, String c2, num ratio) {', + ' ratio = Math.max(Math.min(ratio, 1), 0);', + ' int r1 = int.parse(\'0x${c1.substring(1, 3)}\');', + ' int g1 = int.parse(\'0x${c1.substring(3, 5)}\');', + ' int b1 = int.parse(\'0x${c1.substring(5, 7)}\');', + ' int r2 = int.parse(\'0x${c2.substring(1, 3)}\');', + ' int g2 = int.parse(\'0x${c2.substring(3, 5)}\');', + ' int b2 = int.parse(\'0x${c2.substring(5, 7)}\');', + ' num rn = (r1 * (1 - ratio) + r2 * ratio).round();', + ' String rs = rn.toInt().toRadixString(16);', + ' num gn = (g1 * (1 - ratio) + g2 * ratio).round();', + ' String gs = gn.toInt().toRadixString(16);', + ' num bn = (b1 * (1 - ratio) + b2 * ratio).round();', + ' String bs = bn.toInt().toRadixString(16);', + ' rs = \'0$rs\';', + ' rs = rs.substring(rs.length - 2);', + ' gs = \'0$gs\';', + ' gs = gs.substring(gs.length - 2);', + ' bs = \'0$bs\';', + ' bs = bs.substring(bs.length - 2);', + ' return \'#$rs$gs$bs\';', + '}']); + var code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/dart/lists.js b/src/opsoro/server/static/js/blockly/generators/dart/lists.js new file mode 100644 index 0000000..4255271 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/dart/lists.js @@ -0,0 +1,461 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2014 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Dart for list blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Dart.lists'); + +goog.require('Blockly.Dart'); + + +Blockly.Dart.addReservedWords('Math'); + +Blockly.Dart['lists_create_empty'] = function(block) { + // Create an empty list. + return ['[]', Blockly.Dart.ORDER_ATOMIC]; +}; + +Blockly.Dart['lists_create_with'] = function(block) { + // Create a list with any number of elements of any type. + var elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.Dart.valueToCode(block, 'ADD' + i, + Blockly.Dart.ORDER_NONE) || 'null'; + } + var code = '[' + elements.join(', ') + ']'; + return [code, Blockly.Dart.ORDER_ATOMIC]; +}; + +Blockly.Dart['lists_repeat'] = function(block) { + // Create a list with one element repeated. + var element = Blockly.Dart.valueToCode(block, 'ITEM', + Blockly.Dart.ORDER_NONE) || 'null'; + var repeatCount = Blockly.Dart.valueToCode(block, 'NUM', + Blockly.Dart.ORDER_NONE) || '0'; + var code = 'new List.filled(' + repeatCount + ', ' + element + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['lists_length'] = function(block) { + // String or array length. + var list = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; + return [list + '.length', Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['lists_isEmpty'] = function(block) { + // Is the string null or array empty? + var list = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; + return [list + '.isEmpty', Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['lists_indexOf'] = function(block) { + // Find an item in the list. + var operator = block.getFieldValue('END') == 'FIRST' ? + 'indexOf' : 'lastIndexOf'; + var item = Blockly.Dart.valueToCode(block, 'FIND', + Blockly.Dart.ORDER_NONE) || '\'\''; + var list = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; + var code = list + '.' + operator + '(' + item + ')'; + if (block.workspace.options.oneBasedIndex) { + return [code + ' + 1', Blockly.Dart.ORDER_ADDITIVE]; + } + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['lists_getIndex'] = function(block) { + // Get element at index. + // Note: Until January 2013 this block did not have MODE or WHERE inputs. + var mode = block.getFieldValue('MODE') || 'GET'; + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var listOrder = (where == 'RANDOM' || where == 'FROM_END') ? + Blockly.Dart.ORDER_NONE : Blockly.Dart.ORDER_UNARY_POSTFIX; + var list = Blockly.Dart.valueToCode(block, 'VALUE', listOrder) || '[]'; + // Cache non-trivial values to variables to prevent repeated look-ups. + // Closure, which accesses and modifies 'list'. + function cacheList() { + var listVar = Blockly.Dart.variableDB_.getDistinctName( + 'tmp_list', Blockly.Variables.NAME_TYPE); + var code = 'List ' + listVar + ' = ' + list + ';\n'; + list = listVar; + return code; + } + // If `list` would be evaluated more than once (which is the case for + // RANDOM REMOVE and FROM_END) and is non-trivial, make sure to access it + // only once. + if (((where == 'RANDOM' && mode == 'REMOVE') || where == 'FROM_END') && + !list.match(/^\w+$/)) { + // `list` is an expression, so we may not evaluate it more than once. + if (where == 'RANDOM') { + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + // We can use multiple statements. + var code = cacheList(); + var xVar = Blockly.Dart.variableDB_.getDistinctName( + 'tmp_x', Blockly.Variables.NAME_TYPE); + code += 'int ' + xVar + ' = new Math.Random().nextInt(' + list + + '.length);\n'; + code += list + '.removeAt(' + xVar + ');\n'; + return code; + } else { // where == 'FROM_END' + if (mode == 'REMOVE') { + // We can use multiple statements. + var at = Blockly.Dart.getAdjusted(block, 'AT', 1, false, + Blockly.Dart.ORDER_ADDITIVE); + var code = cacheList(); + code += list + '.removeAt(' + list + '.length' + ' - ' + at + ');\n'; + return code; + + } else if (mode == 'GET') { + var at = Blockly.Dart.getAdjusted(block, 'AT', 1); + // We need to create a procedure to avoid reevaluating values. + var functionName = Blockly.Dart.provideFunction_( + 'lists_get_from_end', + ['dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List my_list, num x) {', + ' x = my_list.length - x;', + ' return my_list[x];', + '}']); + var code = functionName + '(' + list + ', ' + at + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'GET_REMOVE') { + var at = Blockly.Dart.getAdjusted(block, 'AT', 1); + // We need to create a procedure to avoid reevaluating values. + var functionName = Blockly.Dart.provideFunction_( + 'lists_remove_from_end', + ['dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List my_list, num x) {', + ' x = my_list.length - x;', + ' return my_list.removeAt(x);', + '}']); + var code = functionName + '(' + list + ', ' + at + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } + } + } else { + // Either `list` is a simple variable, or we only need to refer to `list` + // once. + switch (where) { + case 'FIRST': + if (mode == 'GET') { + var code = list + '.first'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.removeAt(0)'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'REMOVE') { + return list + '.removeAt(0);\n'; + } + break; + case 'LAST': + if (mode == 'GET') { + var code = list + '.last'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.removeLast()'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'REMOVE') { + return list + '.removeLast();\n'; + } + break; + case 'FROM_START': + var at = Blockly.Dart.getAdjusted(block, 'AT'); + if (mode == 'GET') { + var code = list + '[' + at + ']'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.removeAt(' + at + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'REMOVE') { + return list + '.removeAt(' + at + ');\n'; + } + break; + case 'FROM_END': + var at = Blockly.Dart.getAdjusted(block, 'AT', 1, false, + Blockly.Dart.ORDER_ADDITIVE); + if (mode == 'GET') { + var code = list + '[' + list + '.length - ' + at + ']'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') { + var code = list + '.removeAt(' + list + '.length - ' + at + ')'; + if (mode == 'GET_REMOVE') { + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'REMOVE') { + return code + ';\n'; + } + } + break; + case 'RANDOM': + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + if (mode == 'REMOVE') { + // We can use multiple statements. + var xVar = Blockly.Dart.variableDB_.getDistinctName( + 'tmp_x', Blockly.Variables.NAME_TYPE); + var code = 'int ' + xVar + ' = new Math.Random().nextInt(' + list + + '.length);\n'; + code += list + '.removeAt(' + xVar + ');\n'; + return code; + } else if (mode == 'GET') { + var functionName = Blockly.Dart.provideFunction_( + 'lists_get_random_item', + ['dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List my_list) {', + ' int x = new Math.Random().nextInt(my_list.length);', + ' return my_list[x];', + '}']); + var code = functionName + '(' + list + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'GET_REMOVE') { + var functionName = Blockly.Dart.provideFunction_( + 'lists_remove_random_item', + ['dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List my_list) {', + ' int x = new Math.Random().nextInt(my_list.length);', + ' return my_list.removeAt(x);', + '}']); + var code = functionName + '(' + list + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } + break; + } + } + throw 'Unhandled combination (lists_getIndex).'; +}; + +Blockly.Dart['lists_setIndex'] = function(block) { + // Set element at index. + // Note: Until February 2013 this block did not have MODE or WHERE inputs. + var mode = block.getFieldValue('MODE') || 'GET'; + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var list = Blockly.Dart.valueToCode(block, 'LIST', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; + var value = Blockly.Dart.valueToCode(block, 'TO', + Blockly.Dart.ORDER_ASSIGNMENT) || 'null'; + // Cache non-trivial values to variables to prevent repeated look-ups. + // Closure, which accesses and modifies 'list'. + function cacheList() { + if (list.match(/^\w+$/)) { + return ''; + } + var listVar = Blockly.Dart.variableDB_.getDistinctName( + 'tmp_list', Blockly.Variables.NAME_TYPE); + var code = 'List ' + listVar + ' = ' + list + ';\n'; + list = listVar; + return code; + } + switch (where) { + case 'FIRST': + if (mode == 'SET') { + return list + '[0] = ' + value + ';\n'; + } else if (mode == 'INSERT') { + return list + '.insert(0, ' + value + ');\n'; + } + break; + case 'LAST': + if (mode == 'SET') { + var code = cacheList(); + code += list + '[' + list + '.length - 1] = ' + value + ';\n'; + return code; + } else if (mode == 'INSERT') { + return list + '.add(' + value + ');\n'; + } + break; + case 'FROM_START': + var at = Blockly.Dart.getAdjusted(block, 'AT'); + if (mode == 'SET') { + return list + '[' + at + '] = ' + value + ';\n'; + } else if (mode == 'INSERT') { + return list + '.insert(' + at + ', ' + value + ');\n'; + } + break; + case 'FROM_END': + var at = Blockly.Dart.getAdjusted(block, 'AT', 1, false, + Blockly.Dart.ORDER_ADDITIVE); + var code = cacheList(); + if (mode == 'SET') { + code += list + '[' + list + '.length - ' + at + '] = ' + value + + ';\n'; + return code; + } else if (mode == 'INSERT') { + code += list + '.insert(' + list + '.length - ' + at + ', ' + + value + ');\n'; + return code; + } + break; + case 'RANDOM': + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + var code = cacheList(); + var xVar = Blockly.Dart.variableDB_.getDistinctName( + 'tmp_x', Blockly.Variables.NAME_TYPE); + code += 'int ' + xVar + + ' = new Math.Random().nextInt(' + list + '.length);\n'; + if (mode == 'SET') { + code += list + '[' + xVar + '] = ' + value + ';\n'; + return code; + } else if (mode == 'INSERT') { + code += list + '.insert(' + xVar + ', ' + value + ');\n'; + return code; + } + break; + } + throw 'Unhandled combination (lists_setIndex).'; +}; + +Blockly.Dart['lists_getSublist'] = function(block) { + // Get sublist. + var list = Blockly.Dart.valueToCode(block, 'LIST', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + if (list.match(/^\w+$/) || (where1 != 'FROM_END' && where2 == 'FROM_START')) { + // If the list is a is a variable or doesn't require a call for length, + // don't generate a helper function. + switch (where1) { + case 'FROM_START': + var at1 = Blockly.Dart.getAdjusted(block, 'AT1'); + break; + case 'FROM_END': + var at1 = Blockly.Dart.getAdjusted(block, 'AT1', 1, false, + Blockly.Dart.ORDER_ADDITIVE); + at1 = list + '.length - ' + at1; + break; + case 'FIRST': + var at1 = '0'; + break; + default: + throw 'Unhandled option (lists_getSublist).'; + } + switch (where2) { + case 'FROM_START': + var at2 = Blockly.Dart.getAdjusted(block, 'AT2', 1); + break; + case 'FROM_END': + var at2 = Blockly.Dart.getAdjusted(block, 'AT2', 0, false, + Blockly.Dart.ORDER_ADDITIVE); + at2 = list + '.length - ' + at2; + break; + case 'LAST': + // There is no second index if LAST option is chosen. + break; + default: + throw 'Unhandled option (lists_getSublist).'; + } + if (where2 == 'LAST') { + var code = list + '.sublist(' + at1 + ')'; + } else { + var code = list + '.sublist(' + at1 + ', ' + at2 + ')'; + } + } else { + var at1 = Blockly.Dart.getAdjusted(block, 'AT1'); + var at2 = Blockly.Dart.getAdjusted(block, 'AT2'); + var functionName = Blockly.Dart.provideFunction_( + 'lists_get_sublist', + ['List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(list, where1, at1, where2, at2) {', + ' int getAt(where, at) {', + ' if (where == \'FROM_END\') {', + ' at = list.length - 1 - at;', + ' } else if (where == \'FIRST\') {', + ' at = 0;', + ' } else if (where == \'LAST\') {', + ' at = list.length - 1;', + ' } else if (where != \'FROM_START\') {', + ' throw \'Unhandled option (lists_getSublist).\';', + ' }', + ' return at;', + ' }', + ' at1 = getAt(where1, at1);', + ' at2 = getAt(where2, at2) + 1;', + ' return list.sublist(at1, at2);', + '}']); + var code = functionName + '(' + list + ', \'' + + where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; + } + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['lists_sort'] = function(block) { + // Block for sorting a list. + var list = Blockly.Dart.valueToCode(block, 'LIST', + Blockly.Dart.ORDER_NONE) || '[]'; + var direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1; + var type = block.getFieldValue('TYPE'); + var sortFunctionName = Blockly.Dart.provideFunction_( + 'lists_sort', + ['List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(list, type, direction) {', + ' var compareFuncs = {', + ' "NUMERIC": (a, b) => direction * a.compareTo(b),', + ' "TEXT": (a, b) => direction * ' + + 'a.toString().compareTo(b.toString()),', + ' "IGNORE_CASE": ', + ' (a, b) => direction * ', + ' a.toString().toLowerCase().compareTo(b.toString().toLowerCase())', + ' };', + ' list = new List.from(list);', // Clone the list. + ' var compare = compareFuncs[type];', + ' list.sort(compare);', + ' return list;', + '}']); + return [sortFunctionName + '(' + list + ', ' + + '"' + type + '", ' + direction + ')', + Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['lists_split'] = function(block) { + // Block for splitting text into a list, or joining a list into text. + var input = Blockly.Dart.valueToCode(block, 'INPUT', + Blockly.Dart.ORDER_UNARY_POSTFIX); + var delimiter = Blockly.Dart.valueToCode(block, 'DELIM', + Blockly.Dart.ORDER_NONE) || '\'\''; + var mode = block.getFieldValue('MODE'); + if (mode == 'SPLIT') { + if (!input) { + input = '\'\''; + } + var functionName = 'split'; + } else if (mode == 'JOIN') { + if (!input) { + input = '[]'; + } + var functionName = 'join'; + } else { + throw 'Unknown mode: ' + mode; + } + var code = input + '.' + functionName + '(' + delimiter + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['lists_reverse'] = function(block) { + // Block for reversing a list. + var list = Blockly.Dart.valueToCode(block, 'LIST', + Blockly.Dart.ORDER_NONE) || '[]'; + // XXX What should the operator precedence be for a `new`? + var code = 'new List.from(' + list + '.reversed)'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/dart/logic.js b/src/opsoro/server/static/js/blockly/generators/dart/logic.js new file mode 100644 index 0000000..620b55d --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/dart/logic.js @@ -0,0 +1,128 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2014 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Dart for logic blocks. + * @author q.neutron@gmail.com (Quynh Neutron) + */ +'use strict'; + +goog.provide('Blockly.Dart.logic'); + +goog.require('Blockly.Dart'); + + +Blockly.Dart['controls_if'] = function(block) { + // If/elseif/else condition. + var n = 0; + var code = '', branchCode, conditionCode; + do { + conditionCode = Blockly.Dart.valueToCode(block, 'IF' + n, + Blockly.Dart.ORDER_NONE) || 'false'; + branchCode = Blockly.Dart.statementToCode(block, 'DO' + n); + code += (n > 0 ? 'else ' : '') + + 'if (' + conditionCode + ') {\n' + branchCode + '}'; + + ++n; + } while (block.getInput('IF' + n)); + + if (block.getInput('ELSE')) { + branchCode = Blockly.Dart.statementToCode(block, 'ELSE'); + code += ' else {\n' + branchCode + '}'; + } + return code + '\n'; +}; + +Blockly.Dart['controls_ifelse'] = Blockly.Dart['controls_if']; + +Blockly.Dart['logic_compare'] = function(block) { + // Comparison operator. + var OPERATORS = { + 'EQ': '==', + 'NEQ': '!=', + 'LT': '<', + 'LTE': '<=', + 'GT': '>', + 'GTE': '>=' + }; + var operator = OPERATORS[block.getFieldValue('OP')]; + var order = (operator == '==' || operator == '!=') ? + Blockly.Dart.ORDER_EQUALITY : Blockly.Dart.ORDER_RELATIONAL; + var argument0 = Blockly.Dart.valueToCode(block, 'A', order) || '0'; + var argument1 = Blockly.Dart.valueToCode(block, 'B', order) || '0'; + var code = argument0 + ' ' + operator + ' ' + argument1; + return [code, order]; +}; + +Blockly.Dart['logic_operation'] = function(block) { + // Operations 'and', 'or'. + var operator = (block.getFieldValue('OP') == 'AND') ? '&&' : '||'; + var order = (operator == '&&') ? Blockly.Dart.ORDER_LOGICAL_AND : + Blockly.Dart.ORDER_LOGICAL_OR; + var argument0 = Blockly.Dart.valueToCode(block, 'A', order); + var argument1 = Blockly.Dart.valueToCode(block, 'B', order); + if (!argument0 && !argument1) { + // If there are no arguments, then the return value is false. + argument0 = 'false'; + argument1 = 'false'; + } else { + // Single missing arguments have no effect on the return value. + var defaultArgument = (operator == '&&') ? 'true' : 'false'; + if (!argument0) { + argument0 = defaultArgument; + } + if (!argument1) { + argument1 = defaultArgument; + } + } + var code = argument0 + ' ' + operator + ' ' + argument1; + return [code, order]; +}; + +Blockly.Dart['logic_negate'] = function(block) { + // Negation. + var order = Blockly.Dart.ORDER_UNARY_PREFIX; + var argument0 = Blockly.Dart.valueToCode(block, 'BOOL', order) || 'true'; + var code = '!' + argument0; + return [code, order]; +}; + +Blockly.Dart['logic_boolean'] = function(block) { + // Boolean values true and false. + var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'true' : 'false'; + return [code, Blockly.Dart.ORDER_ATOMIC]; +}; + +Blockly.Dart['logic_null'] = function(block) { + // Null data type. + return ['null', Blockly.Dart.ORDER_ATOMIC]; +}; + +Blockly.Dart['logic_ternary'] = function(block) { + // Ternary operator. + var value_if = Blockly.Dart.valueToCode(block, 'IF', + Blockly.Dart.ORDER_CONDITIONAL) || 'false'; + var value_then = Blockly.Dart.valueToCode(block, 'THEN', + Blockly.Dart.ORDER_CONDITIONAL) || 'null'; + var value_else = Blockly.Dart.valueToCode(block, 'ELSE', + Blockly.Dart.ORDER_CONDITIONAL) || 'null'; + var code = value_if + ' ? ' + value_then + ' : ' + value_else; + return [code, Blockly.Dart.ORDER_CONDITIONAL]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/dart/loops.js b/src/opsoro/server/static/js/blockly/generators/dart/loops.js new file mode 100644 index 0000000..0dd7c0c --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/dart/loops.js @@ -0,0 +1,163 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2014 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Dart for loop blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Dart.loops'); + +goog.require('Blockly.Dart'); + + +Blockly.Dart['controls_repeat_ext'] = function(block) { + // Repeat n times. + if (block.getField('TIMES')) { + // Internal number. + var repeats = String(Number(block.getFieldValue('TIMES'))); + } else { + // External number. + var repeats = Blockly.Dart.valueToCode(block, 'TIMES', + Blockly.Dart.ORDER_ASSIGNMENT) || '0'; + } + var branch = Blockly.Dart.statementToCode(block, 'DO'); + branch = Blockly.Dart.addLoopTrap(branch, block.id); + var code = ''; + var loopVar = Blockly.Dart.variableDB_.getDistinctName( + 'count', Blockly.Variables.NAME_TYPE); + var endVar = repeats; + if (!repeats.match(/^\w+$/) && !Blockly.isNumber(repeats)) { + var endVar = Blockly.Dart.variableDB_.getDistinctName( + 'repeat_end', Blockly.Variables.NAME_TYPE); + code += 'var ' + endVar + ' = ' + repeats + ';\n'; + } + code += 'for (int ' + loopVar + ' = 0; ' + + loopVar + ' < ' + endVar + '; ' + + loopVar + '++) {\n' + + branch + '}\n'; + return code; +}; + +Blockly.Dart['controls_repeat'] = Blockly.Dart['controls_repeat_ext']; + +Blockly.Dart['controls_whileUntil'] = function(block) { + // Do while/until loop. + var until = block.getFieldValue('MODE') == 'UNTIL'; + var argument0 = Blockly.Dart.valueToCode(block, 'BOOL', + until ? Blockly.Dart.ORDER_UNARY_PREFIX : + Blockly.Dart.ORDER_NONE) || 'false'; + var branch = Blockly.Dart.statementToCode(block, 'DO'); + branch = Blockly.Dart.addLoopTrap(branch, block.id); + if (until) { + argument0 = '!' + argument0; + } + return 'while (' + argument0 + ') {\n' + branch + '}\n'; +}; + +Blockly.Dart['controls_for'] = function(block) { + // For loop. + var variable0 = Blockly.Dart.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + var argument0 = Blockly.Dart.valueToCode(block, 'FROM', + Blockly.Dart.ORDER_ASSIGNMENT) || '0'; + var argument1 = Blockly.Dart.valueToCode(block, 'TO', + Blockly.Dart.ORDER_ASSIGNMENT) || '0'; + var increment = Blockly.Dart.valueToCode(block, 'BY', + Blockly.Dart.ORDER_ASSIGNMENT) || '1'; + var branch = Blockly.Dart.statementToCode(block, 'DO'); + branch = Blockly.Dart.addLoopTrap(branch, block.id); + var code; + if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && + Blockly.isNumber(increment)) { + // All arguments are simple numbers. + var up = parseFloat(argument0) <= parseFloat(argument1); + code = 'for (' + variable0 + ' = ' + argument0 + '; ' + + variable0 + (up ? ' <= ' : ' >= ') + argument1 + '; ' + + variable0; + var step = Math.abs(parseFloat(increment)); + if (step == 1) { + code += up ? '++' : '--'; + } else { + code += (up ? ' += ' : ' -= ') + step; + } + code += ') {\n' + branch + '}\n'; + } else { + code = ''; + // Cache non-trivial values to variables to prevent repeated look-ups. + var startVar = argument0; + if (!argument0.match(/^\w+$/) && !Blockly.isNumber(argument0)) { + var startVar = Blockly.Dart.variableDB_.getDistinctName( + variable0 + '_start', Blockly.Variables.NAME_TYPE); + code += 'var ' + startVar + ' = ' + argument0 + ';\n'; + } + var endVar = argument1; + if (!argument1.match(/^\w+$/) && !Blockly.isNumber(argument1)) { + var endVar = Blockly.Dart.variableDB_.getDistinctName( + variable0 + '_end', Blockly.Variables.NAME_TYPE); + code += 'var ' + endVar + ' = ' + argument1 + ';\n'; + } + // Determine loop direction at start, in case one of the bounds + // changes during loop execution. + var incVar = Blockly.Dart.variableDB_.getDistinctName( + variable0 + '_inc', Blockly.Variables.NAME_TYPE); + code += 'num ' + incVar + ' = '; + if (Blockly.isNumber(increment)) { + code += Math.abs(increment) + ';\n'; + } else { + code += '(' + increment + ').abs();\n'; + } + code += 'if (' + startVar + ' > ' + endVar + ') {\n'; + code += Blockly.Dart.INDENT + incVar + ' = -' + incVar + ';\n'; + code += '}\n'; + code += 'for (' + variable0 + ' = ' + startVar + '; ' + + incVar + ' >= 0 ? ' + + variable0 + ' <= ' + endVar + ' : ' + + variable0 + ' >= ' + endVar + '; ' + + variable0 + ' += ' + incVar + ') {\n' + + branch + '}\n'; + } + return code; +}; + +Blockly.Dart['controls_forEach'] = function(block) { + // For each loop. + var variable0 = Blockly.Dart.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + var argument0 = Blockly.Dart.valueToCode(block, 'LIST', + Blockly.Dart.ORDER_ASSIGNMENT) || '[]'; + var branch = Blockly.Dart.statementToCode(block, 'DO'); + branch = Blockly.Dart.addLoopTrap(branch, block.id); + var code = 'for (var ' + variable0 + ' in ' + argument0 + ') {\n' + + branch + '}\n'; + return code; +}; + +Blockly.Dart['controls_flow_statements'] = function(block) { + // Flow statements: continue, break. + switch (block.getFieldValue('FLOW')) { + case 'BREAK': + return 'break;\n'; + case 'CONTINUE': + return 'continue;\n'; + } + throw 'Unknown flow statement.'; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/dart/math.js b/src/opsoro/server/static/js/blockly/generators/dart/math.js new file mode 100644 index 0000000..867822b --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/dart/math.js @@ -0,0 +1,487 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2014 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Dart for math blocks. + * @author q.neutron@gmail.com (Quynh Neutron) + */ +'use strict'; + +goog.provide('Blockly.Dart.math'); + +goog.require('Blockly.Dart'); + + +Blockly.Dart.addReservedWords('Math'); + +Blockly.Dart['math_number'] = function(block) { + // Numeric value. + var code = parseFloat(block.getFieldValue('NUM')); + var order; + if (code == Infinity) { + code = 'double.INFINITY'; + order = Blockly.Dart.ORDER_UNARY_POSTFIX; + } else if (code == -Infinity) { + code = '-double.INFINITY'; + order = Blockly.Dart.ORDER_UNARY_PREFIX; + } else { + // -4.abs() returns -4 in Dart due to strange order of operation choices. + // -4 is actually an operator and a number. Reflect this in the order. + order = code < 0 ? + Blockly.Dart.ORDER_UNARY_PREFIX : Blockly.Dart.ORDER_ATOMIC; + } + return [code, order]; +}; + +Blockly.Dart['math_arithmetic'] = function(block) { + // Basic arithmetic operators, and power. + var OPERATORS = { + 'ADD': [' + ', Blockly.Dart.ORDER_ADDITIVE], + 'MINUS': [' - ', Blockly.Dart.ORDER_ADDITIVE], + 'MULTIPLY': [' * ', Blockly.Dart.ORDER_MULTIPLICATIVE], + 'DIVIDE': [' / ', Blockly.Dart.ORDER_MULTIPLICATIVE], + 'POWER': [null, Blockly.Dart.ORDER_NONE] // Handle power separately. + }; + var tuple = OPERATORS[block.getFieldValue('OP')]; + var operator = tuple[0]; + var order = tuple[1]; + var argument0 = Blockly.Dart.valueToCode(block, 'A', order) || '0'; + var argument1 = Blockly.Dart.valueToCode(block, 'B', order) || '0'; + var code; + // Power in Dart requires a special case since it has no operator. + if (!operator) { + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + code = 'Math.pow(' + argument0 + ', ' + argument1 + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } + code = argument0 + operator + argument1; + return [code, order]; +}; + +Blockly.Dart['math_single'] = function(block) { + // Math operators with single operand. + var operator = block.getFieldValue('OP'); + var code; + var arg; + if (operator == 'NEG') { + // Negation is a special case given its different operator precedence. + arg = Blockly.Dart.valueToCode(block, 'NUM', + Blockly.Dart.ORDER_UNARY_PREFIX) || '0'; + if (arg[0] == '-') { + // --3 is not legal in Dart. + arg = ' ' + arg; + } + code = '-' + arg; + return [code, Blockly.Dart.ORDER_UNARY_PREFIX]; + } + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + if (operator == 'ABS' || operator.substring(0, 5) == 'ROUND') { + arg = Blockly.Dart.valueToCode(block, 'NUM', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '0'; + } else if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') { + arg = Blockly.Dart.valueToCode(block, 'NUM', + Blockly.Dart.ORDER_MULTIPLICATIVE) || '0'; + } else { + arg = Blockly.Dart.valueToCode(block, 'NUM', + Blockly.Dart.ORDER_NONE) || '0'; + } + // First, handle cases which generate values that don't need parentheses + // wrapping the code. + switch (operator) { + case 'ABS': + code = arg + '.abs()'; + break; + case 'ROOT': + code = 'Math.sqrt(' + arg + ')'; + break; + case 'LN': + code = 'Math.log(' + arg + ')'; + break; + case 'EXP': + code = 'Math.exp(' + arg + ')'; + break; + case 'POW10': + code = 'Math.pow(10,' + arg + ')'; + break; + case 'ROUND': + code = arg + '.round()'; + break; + case 'ROUNDUP': + code = arg + '.ceil()'; + break; + case 'ROUNDDOWN': + code = arg + '.floor()'; + break; + case 'SIN': + code = 'Math.sin(' + arg + ' / 180 * Math.PI)'; + break; + case 'COS': + code = 'Math.cos(' + arg + ' / 180 * Math.PI)'; + break; + case 'TAN': + code = 'Math.tan(' + arg + ' / 180 * Math.PI)'; + break; + } + if (code) { + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } + // Second, handle cases which generate values that may need parentheses + // wrapping the code. + switch (operator) { + case 'LOG10': + code = 'Math.log(' + arg + ') / Math.log(10)'; + break; + case 'ASIN': + code = 'Math.asin(' + arg + ') / Math.PI * 180'; + break; + case 'ACOS': + code = 'Math.acos(' + arg + ') / Math.PI * 180'; + break; + case 'ATAN': + code = 'Math.atan(' + arg + ') / Math.PI * 180'; + break; + default: + throw 'Unknown math operator: ' + operator; + } + return [code, Blockly.Dart.ORDER_MULTIPLICATIVE]; +}; + +Blockly.Dart['math_constant'] = function(block) { + // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. + var CONSTANTS = { + 'PI': ['Math.PI', Blockly.Dart.ORDER_UNARY_POSTFIX], + 'E': ['Math.E', Blockly.Dart.ORDER_UNARY_POSTFIX], + 'GOLDEN_RATIO': + ['(1 + Math.sqrt(5)) / 2', Blockly.Dart.ORDER_MULTIPLICATIVE], + 'SQRT2': ['Math.SQRT2', Blockly.Dart.ORDER_UNARY_POSTFIX], + 'SQRT1_2': ['Math.SQRT1_2', Blockly.Dart.ORDER_UNARY_POSTFIX], + 'INFINITY': ['double.INFINITY', Blockly.Dart.ORDER_ATOMIC] + }; + var constant = block.getFieldValue('CONSTANT'); + if (constant != 'INFINITY') { + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + } + return CONSTANTS[constant]; +}; + +Blockly.Dart['math_number_property'] = function(block) { + // Check if a number is even, odd, prime, whole, positive, or negative + // or if it is divisible by certain number. Returns true or false. + var number_to_check = Blockly.Dart.valueToCode(block, 'NUMBER_TO_CHECK', + Blockly.Dart.ORDER_MULTIPLICATIVE); + if (!number_to_check) { + return ['false', Blockly.Python.ORDER_ATOMIC]; + } + var dropdown_property = block.getFieldValue('PROPERTY'); + var code; + if (dropdown_property == 'PRIME') { + // Prime is a special case as it is not a one-liner test. + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + var functionName = Blockly.Dart.provideFunction_( + 'math_isPrime', + ['bool ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '(n) {', + ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods', + ' if (n == 2 || n == 3) {', + ' return true;', + ' }', + ' // False if n is null, negative, is 1, or not whole.', + ' // And false if n is divisible by 2 or 3.', + ' if (n == null || n <= 1 || n % 1 != 0 || n % 2 == 0 ||' + + ' n % 3 == 0) {', + ' return false;', + ' }', + ' // Check all the numbers of form 6k +/- 1, up to sqrt(n).', + ' for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {', + ' if (n % (x - 1) == 0 || n % (x + 1) == 0) {', + ' return false;', + ' }', + ' }', + ' return true;', + '}']); + code = functionName + '(' + number_to_check + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } + switch (dropdown_property) { + case 'EVEN': + code = number_to_check + ' % 2 == 0'; + break; + case 'ODD': + code = number_to_check + ' % 2 == 1'; + break; + case 'WHOLE': + code = number_to_check + ' % 1 == 0'; + break; + case 'POSITIVE': + code = number_to_check + ' > 0'; + break; + case 'NEGATIVE': + code = number_to_check + ' < 0'; + break; + case 'DIVISIBLE_BY': + var divisor = Blockly.Dart.valueToCode(block, 'DIVISOR', + Blockly.Dart.ORDER_MULTIPLICATIVE); + if (!divisor) { + return ['false', Blockly.Python.ORDER_ATOMIC]; + } + code = number_to_check + ' % ' + divisor + ' == 0'; + break; + } + return [code, Blockly.Dart.ORDER_EQUALITY]; +}; + +Blockly.Dart['math_change'] = function(block) { + // Add to a variable in place. + var argument0 = Blockly.Dart.valueToCode(block, 'DELTA', + Blockly.Dart.ORDER_ADDITIVE) || '0'; + var varName = Blockly.Dart.variableDB_.getName(block.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + return varName + ' = (' + varName + ' is num ? ' + varName + ' : 0) + ' + + argument0 + ';\n'; +}; + +// Rounding functions have a single operand. +Blockly.Dart['math_round'] = Blockly.Dart['math_single']; +// Trigonometry functions have a single operand. +Blockly.Dart['math_trig'] = Blockly.Dart['math_single']; + +Blockly.Dart['math_on_list'] = function(block) { + // Math functions for lists. + var func = block.getFieldValue('OP'); + var list = Blockly.Dart.valueToCode(block, 'LIST', + Blockly.Dart.ORDER_NONE) || '[]'; + var code; + switch (func) { + case 'SUM': + var functionName = Blockly.Dart.provideFunction_( + 'math_sum', + ['num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List myList) {', + ' num sumVal = 0;', + ' myList.forEach((num entry) {sumVal += entry;});', + ' return sumVal;', + '}']); + code = functionName + '(' + list + ')'; + break; + case 'MIN': + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + var functionName = Blockly.Dart.provideFunction_( + 'math_min', + ['num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List myList) {', + ' if (myList.isEmpty) return null;', + ' num minVal = myList[0];', + ' myList.forEach((num entry) ' + + '{minVal = Math.min(minVal, entry);});', + ' return minVal;', + '}']); + code = functionName + '(' + list + ')'; + break; + case 'MAX': + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + var functionName = Blockly.Dart.provideFunction_( + 'math_max', + ['num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List myList) {', + ' if (myList.isEmpty) return null;', + ' num maxVal = myList[0];', + ' myList.forEach((num entry) ' + + '{maxVal = Math.max(maxVal, entry);});', + ' return maxVal;', + '}']); + code = functionName + '(' + list + ')'; + break; + case 'AVERAGE': + // This operation exclude null and values that are not int or float: + // math_mean([null,null,"aString",1,9]) == 5.0. + var functionName = Blockly.Dart.provideFunction_( + 'math_mean', + ['num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List myList) {', + ' // First filter list for numbers only.', + ' List localList = new List.from(myList);', + ' localList.removeWhere((a) => a is! num);', + ' if (localList.isEmpty) return null;', + ' num sumVal = 0;', + ' localList.forEach((num entry) {sumVal += entry;});', + ' return sumVal / localList.length;', + '}']); + code = functionName + '(' + list + ')'; + break; + case 'MEDIAN': + var functionName = Blockly.Dart.provideFunction_( + 'math_median', + ['num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List myList) {', + ' // First filter list for numbers only, then sort, ' + + 'then return middle value', + ' // or the average of two middle values if list has an ' + + 'even number of elements.', + ' List localList = new List.from(myList);', + ' localList.removeWhere((a) => a is! num);', + ' if (localList.isEmpty) return null;', + ' localList.sort((a, b) => (a - b));', + ' int index = localList.length ~/ 2;', + ' if (localList.length % 2 == 1) {', + ' return localList[index];', + ' } else {', + ' return (localList[index - 1] + localList[index]) / 2;', + ' }', + '}']); + code = functionName + '(' + list + ')'; + break; + case 'MODE': + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + // As a list of numbers can contain more than one mode, + // the returned result is provided as an array. + // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]. + var functionName = Blockly.Dart.provideFunction_( + 'math_modes', + ['List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List values) {', + ' List modes = [];', + ' List counts = [];', + ' int maxCount = 0;', + ' for (int i = 0; i < values.length; i++) {', + ' var value = values[i];', + ' bool found = false;', + ' int thisCount;', + ' for (int j = 0; j < counts.length; j++) {', + ' if (counts[j][0] == value) {', + ' thisCount = ++counts[j][1];', + ' found = true;', + ' break;', + ' }', + ' }', + ' if (!found) {', + ' counts.add([value, 1]);', + ' thisCount = 1;', + ' }', + ' maxCount = Math.max(thisCount, maxCount);', + ' }', + ' for (int j = 0; j < counts.length; j++) {', + ' if (counts[j][1] == maxCount) {', + ' modes.add(counts[j][0]);', + ' }', + ' }', + ' return modes;', + '}']); + code = functionName + '(' + list + ')'; + break; + case 'STD_DEV': + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + var functionName = Blockly.Dart.provideFunction_( + 'math_standard_deviation', + ['num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List myList) {', + ' // First filter list for numbers only.', + ' List numbers = new List.from(myList);', + ' numbers.removeWhere((a) => a is! num);', + ' if (numbers.isEmpty) return null;', + ' num n = numbers.length;', + ' num sum = 0;', + ' numbers.forEach((x) => sum += x);', + ' num mean = sum / n;', + ' num sumSquare = 0;', + ' numbers.forEach((x) => sumSquare += ' + + 'Math.pow(x - mean, 2));', + ' return Math.sqrt(sumSquare / n);', + '}']); + code = functionName + '(' + list + ')'; + break; + case 'RANDOM': + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + var functionName = Blockly.Dart.provideFunction_( + 'math_random_item', + ['dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List myList) {', + ' int x = new Math.Random().nextInt(myList.length);', + ' return myList[x];', + '}']); + code = functionName + '(' + list + ')'; + break; + default: + throw 'Unknown operator: ' + func; + } + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['math_modulo'] = function(block) { + // Remainder computation. + var argument0 = Blockly.Dart.valueToCode(block, 'DIVIDEND', + Blockly.Dart.ORDER_MULTIPLICATIVE) || '0'; + var argument1 = Blockly.Dart.valueToCode(block, 'DIVISOR', + Blockly.Dart.ORDER_MULTIPLICATIVE) || '0'; + var code = argument0 + ' % ' + argument1; + return [code, Blockly.Dart.ORDER_MULTIPLICATIVE]; +}; + +Blockly.Dart['math_constrain'] = function(block) { + // Constrain a number between two limits. + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + var argument0 = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_NONE) || '0'; + var argument1 = Blockly.Dart.valueToCode(block, 'LOW', + Blockly.Dart.ORDER_NONE) || '0'; + var argument2 = Blockly.Dart.valueToCode(block, 'HIGH', + Blockly.Dart.ORDER_NONE) || 'double.INFINITY'; + var code = 'Math.min(Math.max(' + argument0 + ', ' + argument1 + '), ' + + argument2 + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['math_random_int'] = function(block) { + // Random integer between [X] and [Y]. + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + var argument0 = Blockly.Dart.valueToCode(block, 'FROM', + Blockly.Dart.ORDER_NONE) || '0'; + var argument1 = Blockly.Dart.valueToCode(block, 'TO', + Blockly.Dart.ORDER_NONE) || '0'; + var functionName = Blockly.Dart.provideFunction_( + 'math_random_int', + ['int ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '(num a, num b) {', + ' if (a > b) {', + ' // Swap a and b to ensure a is smaller.', + ' num c = a;', + ' a = b;', + ' b = c;', + ' }', + ' return new Math.Random().nextInt(b - a + 1) + a;', + '}']); + var code = functionName + '(' + argument0 + ', ' + argument1 + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['math_random_float'] = function(block) { + // Random fraction between 0 and 1. + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + return ['new Math.Random().nextDouble()', Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/dart/procedures.js b/src/opsoro/server/static/js/blockly/generators/dart/procedures.js new file mode 100644 index 0000000..ad2550c --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/dart/procedures.js @@ -0,0 +1,109 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2014 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Dart for procedure blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Dart.procedures'); + +goog.require('Blockly.Dart'); + + +Blockly.Dart['procedures_defreturn'] = function(block) { + // Define a procedure with a return value. + var funcName = Blockly.Dart.variableDB_.getName(block.getFieldValue('NAME'), + Blockly.Procedures.NAME_TYPE); + var branch = Blockly.Dart.statementToCode(block, 'STACK'); + if (Blockly.Dart.STATEMENT_PREFIX) { + branch = Blockly.Dart.prefixLines( + Blockly.Dart.STATEMENT_PREFIX.replace(/%1/g, + '\'' + block.id + '\''), Blockly.Dart.INDENT) + branch; + } + if (Blockly.Dart.INFINITE_LOOP_TRAP) { + branch = Blockly.Dart.INFINITE_LOOP_TRAP.replace(/%1/g, + '\'' + block.id + '\'') + branch; + } + var returnValue = Blockly.Dart.valueToCode(block, 'RETURN', + Blockly.Dart.ORDER_NONE) || ''; + if (returnValue) { + returnValue = ' return ' + returnValue + ';\n'; + } + var returnType = returnValue ? 'dynamic' : 'void'; + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.Dart.variableDB_.getName(block.arguments_[i], + Blockly.Variables.NAME_TYPE); + } + var code = returnType + ' ' + funcName + '(' + args.join(', ') + ') {\n' + + branch + returnValue + '}'; + code = Blockly.Dart.scrub_(block, code); + // Add % so as not to collide with helper functions in definitions list. + Blockly.Dart.definitions_['%' + funcName] = code; + return null; +}; + +// Defining a procedure without a return value uses the same generator as +// a procedure with a return value. +Blockly.Dart['procedures_defnoreturn'] = Blockly.Dart['procedures_defreturn']; + +Blockly.Dart['procedures_callreturn'] = function(block) { + // Call a procedure with a return value. + var funcName = Blockly.Dart.variableDB_.getName(block.getFieldValue('NAME'), + Blockly.Procedures.NAME_TYPE); + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.Dart.valueToCode(block, 'ARG' + i, + Blockly.Dart.ORDER_NONE) || 'null'; + } + var code = funcName + '(' + args.join(', ') + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['procedures_callnoreturn'] = function(block) { + // Call a procedure with no return value. + var funcName = Blockly.Dart.variableDB_.getName(block.getFieldValue('NAME'), + Blockly.Procedures.NAME_TYPE); + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.Dart.valueToCode(block, 'ARG' + i, + Blockly.Dart.ORDER_NONE) || 'null'; + } + var code = funcName + '(' + args.join(', ') + ');\n'; + return code; +}; + +Blockly.Dart['procedures_ifreturn'] = function(block) { + // Conditionally return value from a procedure. + var condition = Blockly.Dart.valueToCode(block, 'CONDITION', + Blockly.Dart.ORDER_NONE) || 'false'; + var code = 'if (' + condition + ') {\n'; + if (block.hasReturnValue_) { + var value = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_NONE) || 'null'; + code += ' return ' + value + ';\n'; + } else { + code += ' return;\n'; + } + code += '}\n'; + return code; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/dart/text.js b/src/opsoro/server/static/js/blockly/generators/dart/text.js new file mode 100644 index 0000000..94c60f7 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/dart/text.js @@ -0,0 +1,347 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2014 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Dart for text blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Dart.texts'); + +goog.require('Blockly.Dart'); + + +Blockly.Dart.addReservedWords('Html,Math'); + +Blockly.Dart['text'] = function(block) { + // Text value. + var code = Blockly.Dart.quote_(block.getFieldValue('TEXT')); + return [code, Blockly.Dart.ORDER_ATOMIC]; +}; + +Blockly.Dart['text_join'] = function(block) { + // Create a string made up of any number of elements of any type. + switch (block.itemCount_) { + case 0: + return ['\'\'', Blockly.Dart.ORDER_ATOMIC]; + case 1: + var element = Blockly.Dart.valueToCode(block, 'ADD0', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + var code = element + '.toString()'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + default: + var elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.Dart.valueToCode(block, 'ADD' + i, + Blockly.Dart.ORDER_NONE) || '\'\''; + } + var code = '[' + elements.join(',') + '].join()'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } +}; + +Blockly.Dart['text_append'] = function(block) { + // Append to a variable in place. + var varName = Blockly.Dart.variableDB_.getName(block.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + var value = Blockly.Dart.valueToCode(block, 'TEXT', + Blockly.Dart.ORDER_NONE) || '\'\''; + return varName + ' = [' + varName + ', ' + value + '].join();\n'; +}; + +Blockly.Dart['text_length'] = function(block) { + // String or array length. + var text = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + return [text + '.length', Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['text_isEmpty'] = function(block) { + // Is the string null or array empty? + var text = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + return [text + '.isEmpty', Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['text_indexOf'] = function(block) { + // Search the text for a substring. + var operator = block.getFieldValue('END') == 'FIRST' ? + 'indexOf' : 'lastIndexOf'; + var substring = Blockly.Dart.valueToCode(block, 'FIND', + Blockly.Dart.ORDER_NONE) || '\'\''; + var text = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + var code = text + '.' + operator + '(' + substring + ')'; + if (block.workspace.options.oneBasedIndex) { + return [code + ' + 1', Blockly.Dart.ORDER_ADDITIVE]; + } + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['text_charAt'] = function(block) { + // Get letter at index. + // Note: Until January 2013 this block did not have the WHERE input. + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var text = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + switch (where) { + case 'FIRST': + var code = text + '[0]'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + case 'FROM_START': + var at = Blockly.Dart.getAdjusted(block, 'AT'); + var code = text + '[' + at + ']'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + case 'LAST': + at = 1; + // Fall through. + case 'FROM_END': + var at = Blockly.Dart.getAdjusted(block, 'AT', 1); + var functionName = Blockly.Dart.provideFunction_( + 'text_get_from_end', + ['String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(String text, num x) {', + ' return text[text.length - x];', + '}']); + code = functionName + '(' + text + ', ' + at + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + case 'RANDOM': + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + var functionName = Blockly.Dart.provideFunction_( + 'text_random_letter', + ['String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(String text) {', + ' int x = new Math.Random().nextInt(text.length);', + ' return text[x];', + '}']); + code = functionName + '(' + text + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } + throw 'Unhandled option (text_charAt).'; +}; + +Blockly.Dart['text_getSubstring'] = function(block) { + // Get substring. + var text = Blockly.Dart.valueToCode(block, 'STRING', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + if (where1 == 'FIRST' && where2 == 'LAST') { + var code = text; + } else if (text.match(/^'?\w+'?$/) || + (where1 != 'FROM_END' && where2 == 'FROM_START')) { + // If the text is a variable or literal or doesn't require a call for + // length, don't generate a helper function. + switch (where1) { + case 'FROM_START': + var at1 = Blockly.Dart.getAdjusted(block, 'AT1'); + break; + case 'FROM_END': + var at1 = Blockly.Dart.getAdjusted(block, 'AT1', 1, false, + Blockly.Dart.ORDER_ADDITIVE); + at1 = text + '.length - ' + at1; + break; + case 'FIRST': + var at1 = '0'; + break; + default: + throw 'Unhandled option (text_getSubstring).'; + } + switch (where2) { + case 'FROM_START': + var at2 = Blockly.Dart.getAdjusted(block, 'AT2', 1); + break; + case 'FROM_END': + var at2 = Blockly.Dart.getAdjusted(block, 'AT2', 0, false, + Blockly.Dart.ORDER_ADDITIVE); + at2 = text + '.length - ' + at2; + break; + case 'LAST': + break; + default: + throw 'Unhandled option (text_getSubstring).'; + } + if (where2 == 'LAST') { + var code = text + '.substring(' + at1 + ')'; + } else { + var code = text + '.substring(' + at1 + ', ' + at2 + ')'; + } + } else { + var at1 = Blockly.Dart.getAdjusted(block, 'AT1'); + var at2 = Blockly.Dart.getAdjusted(block, 'AT2'); + var functionName = Blockly.Dart.provideFunction_( + 'text_get_substring', + ['List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(text, where1, at1, where2, at2) {', + ' int getAt(where, at) {', + ' if (where == \'FROM_END\') {', + ' at = text.length - 1 - at;', + ' } else if (where == \'FIRST\') {', + ' at = 0;', + ' } else if (where == \'LAST\') {', + ' at = text.length - 1;', + ' } else if (where != \'FROM_START\') {', + ' throw \'Unhandled option (text_getSubstring).\';', + ' }', + ' return at;', + ' }', + ' at1 = getAt(where1, at1);', + ' at2 = getAt(where2, at2) + 1;', + ' return text.substring(at1, at2);', + '}']); + var code = functionName + '(' + text + ', \'' + + where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; + } + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['text_changeCase'] = function(block) { + // Change capitalization. + var OPERATORS = { + 'UPPERCASE': '.toUpperCase()', + 'LOWERCASE': '.toLowerCase()', + 'TITLECASE': null + }; + var operator = OPERATORS[block.getFieldValue('CASE')]; + var textOrder = operator ? Blockly.Dart.ORDER_UNARY_POSTFIX : + Blockly.Dart.ORDER_NONE; + var text = Blockly.Dart.valueToCode(block, 'TEXT', textOrder) || '\'\''; + if (operator) { + // Upper and lower case are functions built into Dart. + var code = text + operator; + } else { + // Title case is not a native Dart function. Define one. + var functionName = Blockly.Dart.provideFunction_( + 'text_toTitleCase', + ['String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(String str) {', + ' RegExp exp = new RegExp(r\'\\b\');', + ' List list = str.split(exp);', + ' final title = new StringBuffer();', + ' for (String part in list) {', + ' if (part.length > 0) {', + ' title.write(part[0].toUpperCase());', + ' if (part.length > 0) {', + ' title.write(part.substring(1).toLowerCase());', + ' }', + ' }', + ' }', + ' return title.toString();', + '}']); + var code = functionName + '(' + text + ')'; + } + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['text_trim'] = function(block) { + // Trim spaces. + var OPERATORS = { + 'LEFT': '.replaceFirst(new RegExp(r\'^\\s+\'), \'\')', + 'RIGHT': '.replaceFirst(new RegExp(r\'\\s+$\'), \'\')', + 'BOTH': '.trim()' + }; + var operator = OPERATORS[block.getFieldValue('MODE')]; + var text = Blockly.Dart.valueToCode(block, 'TEXT', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + return [text + operator, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['text_print'] = function(block) { + // Print statement. + var msg = Blockly.Dart.valueToCode(block, 'TEXT', + Blockly.Dart.ORDER_NONE) || '\'\''; + return 'print(' + msg + ');\n'; +}; + +Blockly.Dart['text_prompt_ext'] = function(block) { + // Prompt function. + Blockly.Dart.definitions_['import_dart_html'] = + 'import \'dart:html\' as Html;'; + if (block.getField('TEXT')) { + // Internal message. + var msg = Blockly.Dart.quote_(block.getFieldValue('TEXT')); + } else { + // External message. + var msg = Blockly.Dart.valueToCode(block, 'TEXT', + Blockly.Dart.ORDER_NONE) || '\'\''; + } + var code = 'Html.window.prompt(' + msg + ', \'\')'; + var toNumber = block.getFieldValue('TYPE') == 'NUMBER'; + if (toNumber) { + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + code = 'Math.parseDouble(' + code + ')'; + } + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['text_prompt'] = Blockly.Dart['text_prompt_ext']; + +Blockly.Dart['text_count'] = function(block) { + var text = Blockly.Dart.valueToCode(block, 'TEXT', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + var sub = Blockly.Dart.valueToCode(block, 'SUB', + Blockly.Dart.ORDER_NONE) || '\'\''; + // Substring count is not a native Dart function. Define one. + var functionName = Blockly.Dart.provideFunction_( + 'text_count', + ['int ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(String haystack, String needle) {', + ' if (needle.length == 0) {', + ' return haystack.length + 1;', + ' }', + ' int index = 0;', + ' int count = 0;', + ' while (index != -1) {', + ' index = haystack.indexOf(needle, index);', + ' if (index != -1) {', + ' count++;', + ' index += needle.length;', + ' }', + ' }', + ' return count;', + '}']); + var code = functionName + '(' + text + ', ' + sub + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['text_replace'] = function(block) { + var text = Blockly.Dart.valueToCode(block, 'TEXT', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + var from = Blockly.Dart.valueToCode(block, 'FROM', + Blockly.Dart.ORDER_NONE) || '\'\''; + var to = Blockly.Dart.valueToCode(block, 'TO', + Blockly.Dart.ORDER_NONE) || '\'\''; + var code = text + '.replaceAll(' + from + ', ' + to + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['text_reverse'] = function(block) { + // There isn't a sensible way to do this in Dart. See: + // http://stackoverflow.com/a/21613700/3529104 + // Implementing something is possibly better than not implementing anything? + var text = Blockly.Dart.valueToCode(block, 'TEXT', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + var code = 'new String.fromCharCodes(' + text + '.runes.toList().reversed)'; + // XXX What should the operator precedence be for a `new`? + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/dart/variables.js b/src/opsoro/server/static/js/blockly/generators/dart/variables.js similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/generators/dart/variables.js rename to src/opsoro/server/static/js/blockly/generators/dart/variables.js diff --git a/src/opsoro/server/static/js/blockly/generators/javascript.js b/src/opsoro/server/static/js/blockly/generators/javascript.js new file mode 100644 index 0000000..2090f43 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/javascript.js @@ -0,0 +1,317 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Helper functions for generating JavaScript for blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.JavaScript'); + +goog.require('Blockly.Generator'); + + +/** + * JavaScript code generator. + * @type {!Blockly.Generator} + */ +Blockly.JavaScript = new Blockly.Generator('JavaScript'); + +/** + * List of illegal variable names. + * This is not intended to be a security feature. Blockly is 100% client-side, + * so bypassing this list is trivial. This is intended to prevent users from + * accidentally clobbering a built-in object or function. + * @private + */ +Blockly.JavaScript.addReservedWords( + 'Blockly,' + // In case JS is evaled in the current window. + // https://developer.mozilla.org/en/JavaScript/Reference/Reserved_Words + 'break,case,catch,continue,debugger,default,delete,do,else,finally,for,function,if,in,instanceof,new,return,switch,this,throw,try,typeof,var,void,while,with,' + + 'class,enum,export,extends,import,super,implements,interface,let,package,private,protected,public,static,yield,' + + 'const,null,true,false,' + + // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects + 'Array,ArrayBuffer,Boolean,Date,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Error,eval,EvalError,Float32Array,Float64Array,Function,Infinity,Int16Array,Int32Array,Int8Array,isFinite,isNaN,Iterator,JSON,Math,NaN,Number,Object,parseFloat,parseInt,RangeError,ReferenceError,RegExp,StopIteration,String,SyntaxError,TypeError,Uint16Array,Uint32Array,Uint8Array,Uint8ClampedArray,undefined,uneval,URIError,' + + // https://developer.mozilla.org/en/DOM/window + 'applicationCache,closed,Components,content,_content,controllers,crypto,defaultStatus,dialogArguments,directories,document,frameElement,frames,fullScreen,globalStorage,history,innerHeight,innerWidth,length,location,locationbar,localStorage,menubar,messageManager,mozAnimationStartTime,mozInnerScreenX,mozInnerScreenY,mozPaintCount,name,navigator,opener,outerHeight,outerWidth,pageXOffset,pageYOffset,parent,performance,personalbar,pkcs11,returnValue,screen,screenX,screenY,scrollbars,scrollMaxX,scrollMaxY,scrollX,scrollY,self,sessionStorage,sidebar,status,statusbar,toolbar,top,URL,window,' + + 'addEventListener,alert,atob,back,blur,btoa,captureEvents,clearImmediate,clearInterval,clearTimeout,close,confirm,disableExternalCapture,dispatchEvent,dump,enableExternalCapture,escape,find,focus,forward,GeckoActiveXObject,getAttention,getAttentionWithCycleCount,getComputedStyle,getSelection,home,matchMedia,maximize,minimize,moveBy,moveTo,mozRequestAnimationFrame,open,openDialog,postMessage,print,prompt,QueryInterface,releaseEvents,removeEventListener,resizeBy,resizeTo,restore,routeEvent,scroll,scrollBy,scrollByLines,scrollByPages,scrollTo,setCursor,setImmediate,setInterval,setResizable,setTimeout,showModalDialog,sizeToContent,stop,unescape,updateCommands,XPCNativeWrapper,XPCSafeJSObjectWrapper,' + + 'onabort,onbeforeunload,onblur,onchange,onclick,onclose,oncontextmenu,ondevicemotion,ondeviceorientation,ondragdrop,onerror,onfocus,onhashchange,onkeydown,onkeypress,onkeyup,onload,onmousedown,onmousemove,onmouseout,onmouseover,onmouseup,onmozbeforepaint,onpaint,onpopstate,onreset,onresize,onscroll,onselect,onsubmit,onunload,onpageshow,onpagehide,' + + 'Image,Option,Worker,' + + // https://developer.mozilla.org/en/Gecko_DOM_Reference + 'Event,Range,File,FileReader,Blob,BlobBuilder,' + + 'Attr,CDATASection,CharacterData,Comment,console,DocumentFragment,DocumentType,DomConfiguration,DOMError,DOMErrorHandler,DOMException,DOMImplementation,DOMImplementationList,DOMImplementationRegistry,DOMImplementationSource,DOMLocator,DOMObject,DOMString,DOMStringList,DOMTimeStamp,DOMUserData,Entity,EntityReference,MediaQueryList,MediaQueryListListener,NameList,NamedNodeMap,Node,NodeFilter,NodeIterator,NodeList,Notation,Plugin,PluginArray,ProcessingInstruction,SharedWorker,Text,TimeRanges,Treewalker,TypeInfo,UserDataHandler,Worker,WorkerGlobalScope,' + + 'HTMLDocument,HTMLElement,HTMLAnchorElement,HTMLAppletElement,HTMLAudioElement,HTMLAreaElement,HTMLBaseElement,HTMLBaseFontElement,HTMLBodyElement,HTMLBRElement,HTMLButtonElement,HTMLCanvasElement,HTMLDirectoryElement,HTMLDivElement,HTMLDListElement,HTMLEmbedElement,HTMLFieldSetElement,HTMLFontElement,HTMLFormElement,HTMLFrameElement,HTMLFrameSetElement,HTMLHeadElement,HTMLHeadingElement,HTMLHtmlElement,HTMLHRElement,HTMLIFrameElement,HTMLImageElement,HTMLInputElement,HTMLKeygenElement,HTMLLabelElement,HTMLLIElement,HTMLLinkElement,HTMLMapElement,HTMLMenuElement,HTMLMetaElement,HTMLModElement,HTMLObjectElement,HTMLOListElement,HTMLOptGroupElement,HTMLOptionElement,HTMLOutputElement,HTMLParagraphElement,HTMLParamElement,HTMLPreElement,HTMLQuoteElement,HTMLScriptElement,HTMLSelectElement,HTMLSourceElement,HTMLSpanElement,HTMLStyleElement,HTMLTableElement,HTMLTableCaptionElement,HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement,HTMLTableColElement,HTMLTableRowElement,HTMLTableSectionElement,HTMLTextAreaElement,HTMLTimeElement,HTMLTitleElement,HTMLTrackElement,HTMLUListElement,HTMLUnknownElement,HTMLVideoElement,' + + 'HTMLCanvasElement,CanvasRenderingContext2D,CanvasGradient,CanvasPattern,TextMetrics,ImageData,CanvasPixelArray,HTMLAudioElement,HTMLVideoElement,NotifyAudioAvailableEvent,HTMLCollection,HTMLAllCollection,HTMLFormControlsCollection,HTMLOptionsCollection,HTMLPropertiesCollection,DOMTokenList,DOMSettableTokenList,DOMStringMap,RadioNodeList,' + + 'SVGDocument,SVGElement,SVGAElement,SVGAltGlyphElement,SVGAltGlyphDefElement,SVGAltGlyphItemElement,SVGAnimationElement,SVGAnimateElement,SVGAnimateColorElement,SVGAnimateMotionElement,SVGAnimateTransformElement,SVGSetElement,SVGCircleElement,SVGClipPathElement,SVGColorProfileElement,SVGCursorElement,SVGDefsElement,SVGDescElement,SVGEllipseElement,SVGFilterElement,SVGFilterPrimitiveStandardAttributes,SVGFEBlendElement,SVGFEColorMatrixElement,SVGFEComponentTransferElement,SVGFECompositeElement,SVGFEConvolveMatrixElement,SVGFEDiffuseLightingElement,SVGFEDisplacementMapElement,SVGFEDistantLightElement,SVGFEFloodElement,SVGFEGaussianBlurElement,SVGFEImageElement,SVGFEMergeElement,SVGFEMergeNodeElement,SVGFEMorphologyElement,SVGFEOffsetElement,SVGFEPointLightElement,SVGFESpecularLightingElement,SVGFESpotLightElement,SVGFETileElement,SVGFETurbulenceElement,SVGComponentTransferFunctionElement,SVGFEFuncRElement,SVGFEFuncGElement,SVGFEFuncBElement,SVGFEFuncAElement,SVGFontElement,SVGFontFaceElement,SVGFontFaceFormatElement,SVGFontFaceNameElement,SVGFontFaceSrcElement,SVGFontFaceUriElement,SVGForeignObjectElement,SVGGElement,SVGGlyphElement,SVGGlyphRefElement,SVGGradientElement,SVGLinearGradientElement,SVGRadialGradientElement,SVGHKernElement,SVGImageElement,SVGLineElement,SVGMarkerElement,SVGMaskElement,SVGMetadataElement,SVGMissingGlyphElement,SVGMPathElement,SVGPathElement,SVGPatternElement,SVGPolylineElement,SVGPolygonElement,SVGRectElement,SVGScriptElement,SVGStopElement,SVGStyleElement,SVGSVGElement,SVGSwitchElement,SVGSymbolElement,SVGTextElement,SVGTextPathElement,SVGTitleElement,SVGTRefElement,SVGTSpanElement,SVGUseElement,SVGViewElement,SVGVKernElement,' + + 'SVGAngle,SVGColor,SVGICCColor,SVGElementInstance,SVGElementInstanceList,SVGLength,SVGLengthList,SVGMatrix,SVGNumber,SVGNumberList,SVGPaint,SVGPoint,SVGPointList,SVGPreserveAspectRatio,SVGRect,SVGStringList,SVGTransform,SVGTransformList,' + + 'SVGAnimatedAngle,SVGAnimatedBoolean,SVGAnimatedEnumeration,SVGAnimatedInteger,SVGAnimatedLength,SVGAnimatedLengthList,SVGAnimatedNumber,SVGAnimatedNumberList,SVGAnimatedPreserveAspectRatio,SVGAnimatedRect,SVGAnimatedString,SVGAnimatedTransformList,' + + 'SVGPathSegList,SVGPathSeg,SVGPathSegArcAbs,SVGPathSegArcRel,SVGPathSegClosePath,SVGPathSegCurvetoCubicAbs,SVGPathSegCurvetoCubicRel,SVGPathSegCurvetoCubicSmoothAbs,SVGPathSegCurvetoCubicSmoothRel,SVGPathSegCurvetoQuadraticAbs,SVGPathSegCurvetoQuadraticRel,SVGPathSegCurvetoQuadraticSmoothAbs,SVGPathSegCurvetoQuadraticSmoothRel,SVGPathSegLinetoAbs,SVGPathSegLinetoHorizontalAbs,SVGPathSegLinetoHorizontalRel,SVGPathSegLinetoRel,SVGPathSegLinetoVerticalAbs,SVGPathSegLinetoVerticalRel,SVGPathSegMovetoAbs,SVGPathSegMovetoRel,ElementTimeControl,TimeEvent,SVGAnimatedPathData,' + + 'SVGAnimatedPoints,SVGColorProfileRule,SVGCSSRule,SVGExternalResourcesRequired,SVGFitToViewBox,SVGLangSpace,SVGLocatable,SVGRenderingIntent,SVGStylable,SVGTests,SVGTextContentElement,SVGTextPositioningElement,SVGTransformable,SVGUnitTypes,SVGURIReference,SVGViewSpec,SVGZoomAndPan'); + +/** + * Order of operation ENUMs. + * https://developer.mozilla.org/en/JavaScript/Reference/Operators/Operator_Precedence + */ +Blockly.JavaScript.ORDER_ATOMIC = 0; // 0 "" ... +Blockly.JavaScript.ORDER_NEW = 1.1; // new +Blockly.JavaScript.ORDER_MEMBER = 1.2; // . [] +Blockly.JavaScript.ORDER_FUNCTION_CALL = 2; // () +Blockly.JavaScript.ORDER_INCREMENT = 3; // ++ +Blockly.JavaScript.ORDER_DECREMENT = 3; // -- +Blockly.JavaScript.ORDER_BITWISE_NOT = 4.1; // ~ +Blockly.JavaScript.ORDER_UNARY_PLUS = 4.2; // + +Blockly.JavaScript.ORDER_UNARY_NEGATION = 4.3; // - +Blockly.JavaScript.ORDER_LOGICAL_NOT = 4.4; // ! +Blockly.JavaScript.ORDER_TYPEOF = 4.5; // typeof +Blockly.JavaScript.ORDER_VOID = 4.6; // void +Blockly.JavaScript.ORDER_DELETE = 4.7; // delete +Blockly.JavaScript.ORDER_DIVISION = 5.1; // / +Blockly.JavaScript.ORDER_MULTIPLICATION = 5.2; // * +Blockly.JavaScript.ORDER_MODULUS = 5.3; // % +Blockly.JavaScript.ORDER_SUBTRACTION = 6.1; // - +Blockly.JavaScript.ORDER_ADDITION = 6.2; // + +Blockly.JavaScript.ORDER_BITWISE_SHIFT = 7; // << >> >>> +Blockly.JavaScript.ORDER_RELATIONAL = 8; // < <= > >= +Blockly.JavaScript.ORDER_IN = 8; // in +Blockly.JavaScript.ORDER_INSTANCEOF = 8; // instanceof +Blockly.JavaScript.ORDER_EQUALITY = 9; // == != === !== +Blockly.JavaScript.ORDER_BITWISE_AND = 10; // & +Blockly.JavaScript.ORDER_BITWISE_XOR = 11; // ^ +Blockly.JavaScript.ORDER_BITWISE_OR = 12; // | +Blockly.JavaScript.ORDER_LOGICAL_AND = 13; // && +Blockly.JavaScript.ORDER_LOGICAL_OR = 14; // || +Blockly.JavaScript.ORDER_CONDITIONAL = 15; // ?: +Blockly.JavaScript.ORDER_ASSIGNMENT = 16; // = += -= *= /= %= <<= >>= ... +Blockly.JavaScript.ORDER_COMMA = 17; // , +Blockly.JavaScript.ORDER_NONE = 99; // (...) + +/** + * List of outer-inner pairings that do NOT require parentheses. + * @type {!Array.>} + */ +Blockly.JavaScript.ORDER_OVERRIDES = [ + // (foo()).bar -> foo().bar + // (foo())[0] -> foo()[0] + [Blockly.JavaScript.ORDER_FUNCTION_CALL, Blockly.JavaScript.ORDER_MEMBER], + // (foo())() -> foo()() + [Blockly.JavaScript.ORDER_FUNCTION_CALL, Blockly.JavaScript.ORDER_FUNCTION_CALL], + // (foo.bar).baz -> foo.bar.baz + // (foo.bar)[0] -> foo.bar[0] + // (foo[0]).bar -> foo[0].bar + // (foo[0])[1] -> foo[0][1] + [Blockly.JavaScript.ORDER_MEMBER, Blockly.JavaScript.ORDER_MEMBER], + // (foo.bar)() -> foo.bar() + // (foo[0])() -> foo[0]() + [Blockly.JavaScript.ORDER_MEMBER, Blockly.JavaScript.ORDER_FUNCTION_CALL], + + // !(!foo) -> !!foo + [Blockly.JavaScript.ORDER_LOGICAL_NOT, Blockly.JavaScript.ORDER_LOGICAL_NOT], + // a * (b * c) -> a * b * c + [Blockly.JavaScript.ORDER_MULTIPLICATION, Blockly.JavaScript.ORDER_MULTIPLICATION], + // a + (b + c) -> a + b + c + [Blockly.JavaScript.ORDER_ADDITION, Blockly.JavaScript.ORDER_ADDITION], + // a && (b && c) -> a && b && c + [Blockly.JavaScript.ORDER_LOGICAL_AND, Blockly.JavaScript.ORDER_LOGICAL_AND], + // a || (b || c) -> a || b || c + [Blockly.JavaScript.ORDER_LOGICAL_OR, Blockly.JavaScript.ORDER_LOGICAL_OR] +]; + +/** + * Initialise the database of variable names. + * @param {!Blockly.Workspace} workspace Workspace to generate code from. + */ +Blockly.JavaScript.init = function(workspace) { + // Create a dictionary of definitions to be printed before the code. + Blockly.JavaScript.definitions_ = Object.create(null); + // Create a dictionary mapping desired function names in definitions_ + // to actual function names (to avoid collisions with user functions). + Blockly.JavaScript.functionNames_ = Object.create(null); + + if (!Blockly.JavaScript.variableDB_) { + Blockly.JavaScript.variableDB_ = + new Blockly.Names(Blockly.JavaScript.RESERVED_WORDS_); + } else { + Blockly.JavaScript.variableDB_.reset(); + } + + var defvars = []; + var variables = workspace.variableList; + if (variables.length) { + for (var i = 0; i < variables.length; i++) { + defvars[i] = Blockly.JavaScript.variableDB_.getName(variables[i], + Blockly.Variables.NAME_TYPE); + } + Blockly.JavaScript.definitions_['variables'] = + 'var ' + defvars.join(', ') + ';'; + } +}; + +/** + * Prepend the generated code with the variable definitions. + * @param {string} code Generated code. + * @return {string} Completed code. + */ +Blockly.JavaScript.finish = function(code) { + // Convert the definitions dictionary into a list. + var definitions = []; + for (var name in Blockly.JavaScript.definitions_) { + definitions.push(Blockly.JavaScript.definitions_[name]); + } + // Clean up temporary data. + delete Blockly.JavaScript.definitions_; + delete Blockly.JavaScript.functionNames_; + Blockly.JavaScript.variableDB_.reset(); + return definitions.join('\n\n') + '\n\n\n' + code; +}; + +/** + * Naked values are top-level blocks with outputs that aren't plugged into + * anything. A trailing semicolon is needed to make this legal. + * @param {string} line Line of generated code. + * @return {string} Legal line of code. + */ +Blockly.JavaScript.scrubNakedValue = function(line) { + return line + ';\n'; +}; + +/** + * Encode a string as a properly escaped JavaScript string, complete with + * quotes. + * @param {string} string Text to encode. + * @return {string} JavaScript string. + * @private + */ +Blockly.JavaScript.quote_ = function(string) { + // Can't use goog.string.quote since Google's style guide recommends + // JS string literals use single quotes. + string = string.replace(/\\/g, '\\\\') + .replace(/\n/g, '\\\n') + .replace(/'/g, '\\\''); + return '\'' + string + '\''; +}; + +/** + * Common tasks for generating JavaScript from blocks. + * Handles comments for the specified block and any connected value blocks. + * Calls any statements following this block. + * @param {!Blockly.Block} block The current block. + * @param {string} code The JavaScript code created for this block. + * @return {string} JavaScript code with comments and subsequent blocks added. + * @private + */ +Blockly.JavaScript.scrub_ = function(block, code) { + var commentCode = ''; + // Only collect comments for blocks that aren't inline. + if (!block.outputConnection || !block.outputConnection.targetConnection) { + // Collect comment for this block. + var comment = block.getCommentText(); + comment = Blockly.utils.wrap(comment, Blockly.JavaScript.COMMENT_WRAP - 3); + if (comment) { + if (block.getProcedureDef) { + // Use a comment block for function comments. + commentCode += '/**\n' + + Blockly.JavaScript.prefixLines(comment + '\n', ' * ') + + ' */\n'; + } else { + commentCode += Blockly.JavaScript.prefixLines(comment + '\n', '// '); + } + } + // Collect comments for all value arguments. + // Don't collect comments for nested statements. + for (var i = 0; i < block.inputList.length; i++) { + if (block.inputList[i].type == Blockly.INPUT_VALUE) { + var childBlock = block.inputList[i].connection.targetBlock(); + if (childBlock) { + var comment = Blockly.JavaScript.allNestedComments(childBlock); + if (comment) { + commentCode += Blockly.JavaScript.prefixLines(comment, '// '); + } + } + } + } + } + var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); + var nextCode = Blockly.JavaScript.blockToCode(nextBlock); + return commentCode + code + nextCode; +}; + +/** + * Gets a property and adjusts the value while taking into account indexing. + * @param {!Blockly.Block} block The block. + * @param {string} atId The property ID of the element to get. + * @param {number=} opt_delta Value to add. + * @param {boolean=} opt_negate Whether to negate the value. + * @param {number=} opt_order The highest order acting on this value. + * @return {string|number} + */ +Blockly.JavaScript.getAdjusted = function(block, atId, opt_delta, opt_negate, + opt_order) { + var delta = opt_delta || 0; + var order = opt_order || Blockly.JavaScript.ORDER_NONE; + if (block.workspace.options.oneBasedIndex) { + delta--; + } + var defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0'; + if (delta > 0) { + var at = Blockly.JavaScript.valueToCode(block, atId, + Blockly.JavaScript.ORDER_ADDITION) || defaultAtIndex; + } else if (delta < 0) { + var at = Blockly.JavaScript.valueToCode(block, atId, + Blockly.JavaScript.ORDER_SUBTRACTION) || defaultAtIndex; + } else if (opt_negate) { + var at = Blockly.JavaScript.valueToCode(block, atId, + Blockly.JavaScript.ORDER_UNARY_NEGATION) || defaultAtIndex; + } else { + var at = Blockly.JavaScript.valueToCode(block, atId, order) || + defaultAtIndex; + } + + if (Blockly.isNumber(at)) { + // If the index is a naked number, adjust it right now. + at = parseFloat(at) + delta; + if (opt_negate) { + at = -at; + } + } else { + // If the index is dynamic, adjust it in code. + if (delta > 0) { + at = at + ' + ' + delta; + var innerOrder = Blockly.JavaScript.ORDER_ADDITION; + } else if (delta < 0) { + at = at + ' - ' + -delta; + var innerOrder = Blockly.JavaScript.ORDER_SUBTRACTION; + } + if (opt_negate) { + if (delta) { + at = '-(' + at + ')'; + } else { + at = '-' + at; + } + var innerOrder = Blockly.JavaScript.ORDER_UNARY_NEGATION; + } + innerOrder = Math.floor(innerOrder); + order = Math.floor(order); + if (innerOrder && order >= innerOrder) { + at = '(' + at + ')'; + } + } + return at; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/javascript/colour.js b/src/opsoro/server/static/js/blockly/generators/javascript/colour.js new file mode 100644 index 0000000..21b372e --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/javascript/colour.js @@ -0,0 +1,103 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating JavaScript for colour blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.JavaScript.colour'); + +goog.require('Blockly.JavaScript'); + + +Blockly.JavaScript['colour_picker'] = function(block) { + // Colour picker. + var code = '\'' + block.getFieldValue('COLOUR') + '\''; + return [code, Blockly.JavaScript.ORDER_ATOMIC]; +}; + +Blockly.JavaScript['colour_random'] = function(block) { + // Generate a random colour. + var functionName = Blockly.JavaScript.provideFunction_( + 'colourRandom', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '() {', + ' var num = Math.floor(Math.random() * Math.pow(2, 24));', + ' return \'#\' + (\'00000\' + num.toString(16)).substr(-6);', + '}']); + var code = functionName + '()'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['colour_rgb'] = function(block) { + // Compose a colour from RGB components expressed as percentages. + var red = Blockly.JavaScript.valueToCode(block, 'RED', + Blockly.JavaScript.ORDER_COMMA) || 0; + var green = Blockly.JavaScript.valueToCode(block, 'GREEN', + Blockly.JavaScript.ORDER_COMMA) || 0; + var blue = Blockly.JavaScript.valueToCode(block, 'BLUE', + Blockly.JavaScript.ORDER_COMMA) || 0; + var functionName = Blockly.JavaScript.provideFunction_( + 'colourRgb', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(r, g, b) {', + ' r = Math.max(Math.min(Number(r), 100), 0) * 2.55;', + ' g = Math.max(Math.min(Number(g), 100), 0) * 2.55;', + ' b = Math.max(Math.min(Number(b), 100), 0) * 2.55;', + ' r = (\'0\' + (Math.round(r) || 0).toString(16)).slice(-2);', + ' g = (\'0\' + (Math.round(g) || 0).toString(16)).slice(-2);', + ' b = (\'0\' + (Math.round(b) || 0).toString(16)).slice(-2);', + ' return \'#\' + r + g + b;', + '}']); + var code = functionName + '(' + red + ', ' + green + ', ' + blue + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['colour_blend'] = function(block) { + // Blend two colours together. + var c1 = Blockly.JavaScript.valueToCode(block, 'COLOUR1', + Blockly.JavaScript.ORDER_COMMA) || '\'#000000\''; + var c2 = Blockly.JavaScript.valueToCode(block, 'COLOUR2', + Blockly.JavaScript.ORDER_COMMA) || '\'#000000\''; + var ratio = Blockly.JavaScript.valueToCode(block, 'RATIO', + Blockly.JavaScript.ORDER_COMMA) || 0.5; + var functionName = Blockly.JavaScript.provideFunction_( + 'colourBlend', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(c1, c2, ratio) {', + ' ratio = Math.max(Math.min(Number(ratio), 1), 0);', + ' var r1 = parseInt(c1.substring(1, 3), 16);', + ' var g1 = parseInt(c1.substring(3, 5), 16);', + ' var b1 = parseInt(c1.substring(5, 7), 16);', + ' var r2 = parseInt(c2.substring(1, 3), 16);', + ' var g2 = parseInt(c2.substring(3, 5), 16);', + ' var b2 = parseInt(c2.substring(5, 7), 16);', + ' var r = Math.round(r1 * (1 - ratio) + r2 * ratio);', + ' var g = Math.round(g1 * (1 - ratio) + g2 * ratio);', + ' var b = Math.round(b1 * (1 - ratio) + b2 * ratio);', + ' r = (\'0\' + (r || 0).toString(16)).slice(-2);', + ' g = (\'0\' + (g || 0).toString(16)).slice(-2);', + ' b = (\'0\' + (b || 0).toString(16)).slice(-2);', + ' return \'#\' + r + g + b;', + '}']); + var code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/javascript/lists.js b/src/opsoro/server/static/js/blockly/generators/javascript/lists.js new file mode 100644 index 0000000..d907595 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/javascript/lists.js @@ -0,0 +1,402 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating JavaScript for list blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.JavaScript.lists'); + +goog.require('Blockly.JavaScript'); + + +Blockly.JavaScript['lists_create_empty'] = function(block) { + // Create an empty list. + return ['[]', Blockly.JavaScript.ORDER_ATOMIC]; +}; + +Blockly.JavaScript['lists_create_with'] = function(block) { + // Create a list with any number of elements of any type. + var elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.JavaScript.valueToCode(block, 'ADD' + i, + Blockly.JavaScript.ORDER_COMMA) || 'null'; + } + var code = '[' + elements.join(', ') + ']'; + return [code, Blockly.JavaScript.ORDER_ATOMIC]; +}; + +Blockly.JavaScript['lists_repeat'] = function(block) { + // Create a list with one element repeated. + var functionName = Blockly.JavaScript.provideFunction_( + 'listsRepeat', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(value, n) {', + ' var array = [];', + ' for (var i = 0; i < n; i++) {', + ' array[i] = value;', + ' }', + ' return array;', + '}']); + var element = Blockly.JavaScript.valueToCode(block, 'ITEM', + Blockly.JavaScript.ORDER_COMMA) || 'null'; + var repeatCount = Blockly.JavaScript.valueToCode(block, 'NUM', + Blockly.JavaScript.ORDER_COMMA) || '0'; + var code = functionName + '(' + element + ', ' + repeatCount + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['lists_length'] = function(block) { + // String or array length. + var list = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_MEMBER) || '[]'; + return [list + '.length', Blockly.JavaScript.ORDER_MEMBER]; +}; + +Blockly.JavaScript['lists_isEmpty'] = function(block) { + // Is the string null or array empty? + var list = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_MEMBER) || '[]'; + return ['!' + list + '.length', Blockly.JavaScript.ORDER_LOGICAL_NOT]; +}; + +Blockly.JavaScript['lists_indexOf'] = function(block) { + // Find an item in the list. + var operator = block.getFieldValue('END') == 'FIRST' ? + 'indexOf' : 'lastIndexOf'; + var item = Blockly.JavaScript.valueToCode(block, 'FIND', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var list = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_MEMBER) || '[]'; + var code = list + '.' + operator + '(' + item + ')'; + if (block.workspace.options.oneBasedIndex) { + return [code + ' + 1', Blockly.JavaScript.ORDER_ADDITION]; + } + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['lists_getIndex'] = function(block) { + // Get element at index. + // Note: Until January 2013 this block did not have MODE or WHERE inputs. + var mode = block.getFieldValue('MODE') || 'GET'; + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var listOrder = (where == 'RANDOM') ? Blockly.JavaScript.ORDER_COMMA : + Blockly.JavaScript.ORDER_MEMBER; + var list = Blockly.JavaScript.valueToCode(block, 'VALUE', listOrder) || '[]'; + + switch (where) { + case ('FIRST'): + if (mode == 'GET') { + var code = list + '[0]'; + return [code, Blockly.JavaScript.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.shift()'; + return [code, Blockly.JavaScript.ORDER_MEMBER]; + } else if (mode == 'REMOVE') { + return list + '.shift();\n'; + } + break; + case ('LAST'): + if (mode == 'GET') { + var code = list + '.slice(-1)[0]'; + return [code, Blockly.JavaScript.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.pop()'; + return [code, Blockly.JavaScript.ORDER_MEMBER]; + } else if (mode == 'REMOVE') { + return list + '.pop();\n'; + } + break; + case ('FROM_START'): + var at = Blockly.JavaScript.getAdjusted(block, 'AT'); + if (mode == 'GET') { + var code = list + '[' + at + ']'; + return [code, Blockly.JavaScript.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.splice(' + at + ', 1)[0]'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return list + '.splice(' + at + ', 1);\n'; + } + break; + case ('FROM_END'): + var at = Blockly.JavaScript.getAdjusted(block, 'AT', 1, true); + if (mode == 'GET') { + var code = list + '.slice(' + at + ')[0]'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.splice(' + at + ', 1)[0]'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return list + '.splice(' + at + ', 1);'; + } + break; + case ('RANDOM'): + var functionName = Blockly.JavaScript.provideFunction_( + 'listsGetRandomItem', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(list, remove) {', + ' var x = Math.floor(Math.random() * list.length);', + ' if (remove) {', + ' return list.splice(x, 1)[0];', + ' } else {', + ' return list[x];', + ' }', + '}']); + code = functionName + '(' + list + ', ' + (mode != 'GET') + ')'; + if (mode == 'GET' || mode == 'GET_REMOVE') { + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return code + ';\n'; + } + break; + } + throw 'Unhandled combination (lists_getIndex).'; +}; + +Blockly.JavaScript['lists_setIndex'] = function(block) { + // Set element at index. + // Note: Until February 2013 this block did not have MODE or WHERE inputs. + var list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_MEMBER) || '[]'; + var mode = block.getFieldValue('MODE') || 'GET'; + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var value = Blockly.JavaScript.valueToCode(block, 'TO', + Blockly.JavaScript.ORDER_ASSIGNMENT) || 'null'; + // Cache non-trivial values to variables to prevent repeated look-ups. + // Closure, which accesses and modifies 'list'. + function cacheList() { + if (list.match(/^\w+$/)) { + return ''; + } + var listVar = Blockly.JavaScript.variableDB_.getDistinctName( + 'tmpList', Blockly.Variables.NAME_TYPE); + var code = 'var ' + listVar + ' = ' + list + ';\n'; + list = listVar; + return code; + } + switch (where) { + case ('FIRST'): + if (mode == 'SET') { + return list + '[0] = ' + value + ';\n'; + } else if (mode == 'INSERT') { + return list + '.unshift(' + value + ');\n'; + } + break; + case ('LAST'): + if (mode == 'SET') { + var code = cacheList(); + code += list + '[' + list + '.length - 1] = ' + value + ';\n'; + return code; + } else if (mode == 'INSERT') { + return list + '.push(' + value + ');\n'; + } + break; + case ('FROM_START'): + var at = Blockly.JavaScript.getAdjusted(block, 'AT'); + if (mode == 'SET') { + return list + '[' + at + '] = ' + value + ';\n'; + } else if (mode == 'INSERT') { + return list + '.splice(' + at + ', 0, ' + value + ');\n'; + } + break; + case ('FROM_END'): + var at = Blockly.JavaScript.getAdjusted(block, 'AT', 1, false, + Blockly.JavaScript.ORDER_SUBTRACTION); + var code = cacheList(); + if (mode == 'SET') { + code += list + '[' + list + '.length - ' + at + '] = ' + value + ';\n'; + return code; + } else if (mode == 'INSERT') { + code += list + '.splice(' + list + '.length - ' + at + ', 0, ' + value + + ');\n'; + return code; + } + break; + case ('RANDOM'): + var code = cacheList(); + var xVar = Blockly.JavaScript.variableDB_.getDistinctName( + 'tmpX', Blockly.Variables.NAME_TYPE); + code += 'var ' + xVar + ' = Math.floor(Math.random() * ' + list + + '.length);\n'; + if (mode == 'SET') { + code += list + '[' + xVar + '] = ' + value + ';\n'; + return code; + } else if (mode == 'INSERT') { + code += list + '.splice(' + xVar + ', 0, ' + value + ');\n'; + return code; + } + break; + } + throw 'Unhandled combination (lists_setIndex).'; +}; + +/** + * Returns an expression calculating the index into a list. + * @private + * @param {string} listName Name of the list, used to calculate length. + * @param {string} where The method of indexing, selected by dropdown in Blockly + * @param {string=} opt_at The optional offset when indexing from start/end. + * @return {string} Index expression. + */ +Blockly.JavaScript.lists.getIndex_ = function(listName, where, opt_at) { + if (where == 'FIRST') { + return '0'; + } else if (where == 'FROM_END') { + return listName + '.length - 1 - ' + opt_at; + } else if (where == 'LAST') { + return listName + '.length - 1'; + } else { + return opt_at; + } +}; + +Blockly.JavaScript['lists_getSublist'] = function(block) { + // Get sublist. + var list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_MEMBER) || '[]'; + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + if (where1 == 'FIRST' && where2 == 'LAST') { + var code = list + '.slice(0)'; + } else if (list.match(/^\w+$/) || + (where1 != 'FROM_END' && where2 == 'FROM_START')) { + // If the list is a variable or doesn't require a call for length, don't + // generate a helper function. + switch (where1) { + case 'FROM_START': + var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1'); + break; + case 'FROM_END': + var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1', 1, false, + Blockly.JavaScript.ORDER_SUBTRACTION); + at1 = list + '.length - ' + at1; + break; + case 'FIRST': + var at1 = '0'; + break; + default: + throw 'Unhandled option (lists_getSublist).'; + } + switch (where2) { + case 'FROM_START': + var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2', 1); + break; + case 'FROM_END': + var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2', 0, false, + Blockly.JavaScript.ORDER_SUBTRACTION); + at2 = list + '.length - ' + at2; + break; + case 'LAST': + var at2 = list + '.length'; + break; + default: + throw 'Unhandled option (lists_getSublist).'; + } + code = list + '.slice(' + at1 + ', ' + at2 + ')'; + } else { + var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1'); + var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2'); + var getIndex_ = Blockly.JavaScript.lists.getIndex_; + var wherePascalCase = {'FIRST': 'First', 'LAST': 'Last', + 'FROM_START': 'FromStart', 'FROM_END': 'FromEnd'}; + var functionName = Blockly.JavaScript.provideFunction_( + 'subsequence' + wherePascalCase[where1] + wherePascalCase[where2], + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(sequence' + + // The value for 'FROM_END' and'FROM_START' depends on `at` so + // we add it as a parameter. + ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', at1' : '') + + ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', at2' : '') + + ') {', + ' var start = ' + getIndex_('sequence', where1, 'at1') + ';', + ' var end = ' + getIndex_('sequence', where2, 'at2') + ' + 1;', + ' return sequence.slice(start, end);', + '}']); + var code = functionName + '(' + list + + // The value for 'FROM_END' and 'FROM_START' depends on `at` so we + // pass it. + ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', ' + at1 : '') + + ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', ' + at2 : '') + + ')'; + } + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['lists_sort'] = function(block) { + // Block for sorting a list. + var list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_FUNCTION_CALL) || '[]'; + var direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1; + var type = block.getFieldValue('TYPE'); + var getCompareFunctionName = Blockly.JavaScript.provideFunction_( + 'listsGetSortCompare', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(type, direction) {', + ' var compareFuncs = {', + ' "NUMERIC": function(a, b) {', + ' return parseFloat(a) - parseFloat(b); },', + ' "TEXT": function(a, b) {', + ' return a.toString() > b.toString() ? 1 : -1; },', + ' "IGNORE_CASE": function(a, b) {', + ' return a.toString().toLowerCase() > ' + + 'b.toString().toLowerCase() ? 1 : -1; },', + ' };', + ' var compare = compareFuncs[type];', + ' return function(a, b) { return compare(a, b) * direction; }', + '}']); + return [list + '.slice().sort(' + + getCompareFunctionName + '("' + type + '", ' + direction + '))', + Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['lists_split'] = function(block) { + // Block for splitting text into a list, or joining a list into text. + var input = Blockly.JavaScript.valueToCode(block, 'INPUT', + Blockly.JavaScript.ORDER_MEMBER); + var delimiter = Blockly.JavaScript.valueToCode(block, 'DELIM', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var mode = block.getFieldValue('MODE'); + if (mode == 'SPLIT') { + if (!input) { + input = '\'\''; + } + var functionName = 'split'; + } else if (mode == 'JOIN') { + if (!input) { + input = '[]'; + } + var functionName = 'join'; + } else { + throw 'Unknown mode: ' + mode; + } + var code = input + '.' + functionName + '(' + delimiter + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['lists_reverse'] = function(block) { + // Block for reversing a list. + var list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_FUNCTION_CALL) || '[]'; + var code = list + '.slice().reverse()'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/javascript/logic.js b/src/opsoro/server/static/js/blockly/generators/javascript/logic.js new file mode 100644 index 0000000..1c4d4b6 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/javascript/logic.js @@ -0,0 +1,129 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating JavaScript for logic blocks. + * @author q.neutron@gmail.com (Quynh Neutron) + */ +'use strict'; + +goog.provide('Blockly.JavaScript.logic'); + +goog.require('Blockly.JavaScript'); + + +Blockly.JavaScript['controls_if'] = function(block) { + // If/elseif/else condition. + var n = 0; + var code = '', branchCode, conditionCode; + do { + conditionCode = Blockly.JavaScript.valueToCode(block, 'IF' + n, + Blockly.JavaScript.ORDER_NONE) || 'false'; + branchCode = Blockly.JavaScript.statementToCode(block, 'DO' + n); + code += (n > 0 ? ' else ' : '') + + 'if (' + conditionCode + ') {\n' + branchCode + '}'; + + ++n; + } while (block.getInput('IF' + n)); + + if (block.getInput('ELSE')) { + branchCode = Blockly.JavaScript.statementToCode(block, 'ELSE'); + code += ' else {\n' + branchCode + '}'; + } + return code + '\n'; +}; + +Blockly.JavaScript['controls_ifelse'] = Blockly.JavaScript['controls_if']; + +Blockly.JavaScript['logic_compare'] = function(block) { + // Comparison operator. + var OPERATORS = { + 'EQ': '==', + 'NEQ': '!=', + 'LT': '<', + 'LTE': '<=', + 'GT': '>', + 'GTE': '>=' + }; + var operator = OPERATORS[block.getFieldValue('OP')]; + var order = (operator == '==' || operator == '!=') ? + Blockly.JavaScript.ORDER_EQUALITY : Blockly.JavaScript.ORDER_RELATIONAL; + var argument0 = Blockly.JavaScript.valueToCode(block, 'A', order) || '0'; + var argument1 = Blockly.JavaScript.valueToCode(block, 'B', order) || '0'; + var code = argument0 + ' ' + operator + ' ' + argument1; + return [code, order]; +}; + +Blockly.JavaScript['logic_operation'] = function(block) { + // Operations 'and', 'or'. + var operator = (block.getFieldValue('OP') == 'AND') ? '&&' : '||'; + var order = (operator == '&&') ? Blockly.JavaScript.ORDER_LOGICAL_AND : + Blockly.JavaScript.ORDER_LOGICAL_OR; + var argument0 = Blockly.JavaScript.valueToCode(block, 'A', order); + var argument1 = Blockly.JavaScript.valueToCode(block, 'B', order); + if (!argument0 && !argument1) { + // If there are no arguments, then the return value is false. + argument0 = 'false'; + argument1 = 'false'; + } else { + // Single missing arguments have no effect on the return value. + var defaultArgument = (operator == '&&') ? 'true' : 'false'; + if (!argument0) { + argument0 = defaultArgument; + } + if (!argument1) { + argument1 = defaultArgument; + } + } + var code = argument0 + ' ' + operator + ' ' + argument1; + return [code, order]; +}; + +Blockly.JavaScript['logic_negate'] = function(block) { + // Negation. + var order = Blockly.JavaScript.ORDER_LOGICAL_NOT; + var argument0 = Blockly.JavaScript.valueToCode(block, 'BOOL', order) || + 'true'; + var code = '!' + argument0; + return [code, order]; +}; + +Blockly.JavaScript['logic_boolean'] = function(block) { + // Boolean values true and false. + var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'true' : 'false'; + return [code, Blockly.JavaScript.ORDER_ATOMIC]; +}; + +Blockly.JavaScript['logic_null'] = function(block) { + // Null data type. + return ['null', Blockly.JavaScript.ORDER_ATOMIC]; +}; + +Blockly.JavaScript['logic_ternary'] = function(block) { + // Ternary operator. + var value_if = Blockly.JavaScript.valueToCode(block, 'IF', + Blockly.JavaScript.ORDER_CONDITIONAL) || 'false'; + var value_then = Blockly.JavaScript.valueToCode(block, 'THEN', + Blockly.JavaScript.ORDER_CONDITIONAL) || 'null'; + var value_else = Blockly.JavaScript.valueToCode(block, 'ELSE', + Blockly.JavaScript.ORDER_CONDITIONAL) || 'null'; + var code = value_if + ' ? ' + value_then + ' : ' + value_else; + return [code, Blockly.JavaScript.ORDER_CONDITIONAL]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/javascript/loops.js b/src/opsoro/server/static/js/blockly/generators/javascript/loops.js new file mode 100644 index 0000000..1a2ade5 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/javascript/loops.js @@ -0,0 +1,175 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating JavaScript for loop blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.JavaScript.loops'); + +goog.require('Blockly.JavaScript'); + + +Blockly.JavaScript['controls_repeat_ext'] = function(block) { + // Repeat n times. + if (block.getField('TIMES')) { + // Internal number. + var repeats = String(Number(block.getFieldValue('TIMES'))); + } else { + // External number. + var repeats = Blockly.JavaScript.valueToCode(block, 'TIMES', + Blockly.JavaScript.ORDER_ASSIGNMENT) || '0'; + } + var branch = Blockly.JavaScript.statementToCode(block, 'DO'); + branch = Blockly.JavaScript.addLoopTrap(branch, block.id); + var code = ''; + var loopVar = Blockly.JavaScript.variableDB_.getDistinctName( + 'count', Blockly.Variables.NAME_TYPE); + var endVar = repeats; + if (!repeats.match(/^\w+$/) && !Blockly.isNumber(repeats)) { + var endVar = Blockly.JavaScript.variableDB_.getDistinctName( + 'repeat_end', Blockly.Variables.NAME_TYPE); + code += 'var ' + endVar + ' = ' + repeats + ';\n'; + } + code += 'for (var ' + loopVar + ' = 0; ' + + loopVar + ' < ' + endVar + '; ' + + loopVar + '++) {\n' + + branch + '}\n'; + return code; +}; + +Blockly.JavaScript['controls_repeat'] = + Blockly.JavaScript['controls_repeat_ext']; + +Blockly.JavaScript['controls_whileUntil'] = function(block) { + // Do while/until loop. + var until = block.getFieldValue('MODE') == 'UNTIL'; + var argument0 = Blockly.JavaScript.valueToCode(block, 'BOOL', + until ? Blockly.JavaScript.ORDER_LOGICAL_NOT : + Blockly.JavaScript.ORDER_NONE) || 'false'; + var branch = Blockly.JavaScript.statementToCode(block, 'DO'); + branch = Blockly.JavaScript.addLoopTrap(branch, block.id); + if (until) { + argument0 = '!' + argument0; + } + return 'while (' + argument0 + ') {\n' + branch + '}\n'; +}; + +Blockly.JavaScript['controls_for'] = function(block) { + // For loop. + var variable0 = Blockly.JavaScript.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + var argument0 = Blockly.JavaScript.valueToCode(block, 'FROM', + Blockly.JavaScript.ORDER_ASSIGNMENT) || '0'; + var argument1 = Blockly.JavaScript.valueToCode(block, 'TO', + Blockly.JavaScript.ORDER_ASSIGNMENT) || '0'; + var increment = Blockly.JavaScript.valueToCode(block, 'BY', + Blockly.JavaScript.ORDER_ASSIGNMENT) || '1'; + var branch = Blockly.JavaScript.statementToCode(block, 'DO'); + branch = Blockly.JavaScript.addLoopTrap(branch, block.id); + var code; + if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && + Blockly.isNumber(increment)) { + // All arguments are simple numbers. + var up = parseFloat(argument0) <= parseFloat(argument1); + code = 'for (' + variable0 + ' = ' + argument0 + '; ' + + variable0 + (up ? ' <= ' : ' >= ') + argument1 + '; ' + + variable0; + var step = Math.abs(parseFloat(increment)); + if (step == 1) { + code += up ? '++' : '--'; + } else { + code += (up ? ' += ' : ' -= ') + step; + } + code += ') {\n' + branch + '}\n'; + } else { + code = ''; + // Cache non-trivial values to variables to prevent repeated look-ups. + var startVar = argument0; + if (!argument0.match(/^\w+$/) && !Blockly.isNumber(argument0)) { + startVar = Blockly.JavaScript.variableDB_.getDistinctName( + variable0 + '_start', Blockly.Variables.NAME_TYPE); + code += 'var ' + startVar + ' = ' + argument0 + ';\n'; + } + var endVar = argument1; + if (!argument1.match(/^\w+$/) && !Blockly.isNumber(argument1)) { + var endVar = Blockly.JavaScript.variableDB_.getDistinctName( + variable0 + '_end', Blockly.Variables.NAME_TYPE); + code += 'var ' + endVar + ' = ' + argument1 + ';\n'; + } + // Determine loop direction at start, in case one of the bounds + // changes during loop execution. + var incVar = Blockly.JavaScript.variableDB_.getDistinctName( + variable0 + '_inc', Blockly.Variables.NAME_TYPE); + code += 'var ' + incVar + ' = '; + if (Blockly.isNumber(increment)) { + code += Math.abs(increment) + ';\n'; + } else { + code += 'Math.abs(' + increment + ');\n'; + } + code += 'if (' + startVar + ' > ' + endVar + ') {\n'; + code += Blockly.JavaScript.INDENT + incVar + ' = -' + incVar + ';\n'; + code += '}\n'; + code += 'for (' + variable0 + ' = ' + startVar + '; ' + + incVar + ' >= 0 ? ' + + variable0 + ' <= ' + endVar + ' : ' + + variable0 + ' >= ' + endVar + '; ' + + variable0 + ' += ' + incVar + ') {\n' + + branch + '}\n'; + } + return code; +}; + +Blockly.JavaScript['controls_forEach'] = function(block) { + // For each loop. + var variable0 = Blockly.JavaScript.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + var argument0 = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_ASSIGNMENT) || '[]'; + var branch = Blockly.JavaScript.statementToCode(block, 'DO'); + branch = Blockly.JavaScript.addLoopTrap(branch, block.id); + var code = ''; + // Cache non-trivial values to variables to prevent repeated look-ups. + var listVar = argument0; + if (!argument0.match(/^\w+$/)) { + listVar = Blockly.JavaScript.variableDB_.getDistinctName( + variable0 + '_list', Blockly.Variables.NAME_TYPE); + code += 'var ' + listVar + ' = ' + argument0 + ';\n'; + } + var indexVar = Blockly.JavaScript.variableDB_.getDistinctName( + variable0 + '_index', Blockly.Variables.NAME_TYPE); + branch = Blockly.JavaScript.INDENT + variable0 + ' = ' + + listVar + '[' + indexVar + '];\n' + branch; + code += 'for (var ' + indexVar + ' in ' + listVar + ') {\n' + branch + '}\n'; + return code; +}; + +Blockly.JavaScript['controls_flow_statements'] = function(block) { + // Flow statements: continue, break. + switch (block.getFieldValue('FLOW')) { + case 'BREAK': + return 'break;\n'; + case 'CONTINUE': + return 'continue;\n'; + } + throw 'Unknown flow statement.'; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/javascript/math.js b/src/opsoro/server/static/js/blockly/generators/javascript/math.js new file mode 100644 index 0000000..a31b943 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/javascript/math.js @@ -0,0 +1,411 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating JavaScript for math blocks. + * @author q.neutron@gmail.com (Quynh Neutron) + */ +'use strict'; + +goog.provide('Blockly.JavaScript.math'); + +goog.require('Blockly.JavaScript'); + + +Blockly.JavaScript['math_number'] = function(block) { + // Numeric value. + var code = parseFloat(block.getFieldValue('NUM')); + return [code, Blockly.JavaScript.ORDER_ATOMIC]; +}; + +Blockly.JavaScript['math_arithmetic'] = function(block) { + // Basic arithmetic operators, and power. + var OPERATORS = { + 'ADD': [' + ', Blockly.JavaScript.ORDER_ADDITION], + 'MINUS': [' - ', Blockly.JavaScript.ORDER_SUBTRACTION], + 'MULTIPLY': [' * ', Blockly.JavaScript.ORDER_MULTIPLICATION], + 'DIVIDE': [' / ', Blockly.JavaScript.ORDER_DIVISION], + 'POWER': [null, Blockly.JavaScript.ORDER_COMMA] // Handle power separately. + }; + var tuple = OPERATORS[block.getFieldValue('OP')]; + var operator = tuple[0]; + var order = tuple[1]; + var argument0 = Blockly.JavaScript.valueToCode(block, 'A', order) || '0'; + var argument1 = Blockly.JavaScript.valueToCode(block, 'B', order) || '0'; + var code; + // Power in JavaScript requires a special case since it has no operator. + if (!operator) { + code = 'Math.pow(' + argument0 + ', ' + argument1 + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } + code = argument0 + operator + argument1; + return [code, order]; +}; + +Blockly.JavaScript['math_single'] = function(block) { + // Math operators with single operand. + var operator = block.getFieldValue('OP'); + var code; + var arg; + if (operator == 'NEG') { + // Negation is a special case given its different operator precedence. + arg = Blockly.JavaScript.valueToCode(block, 'NUM', + Blockly.JavaScript.ORDER_UNARY_NEGATION) || '0'; + if (arg[0] == '-') { + // --3 is not legal in JS. + arg = ' ' + arg; + } + code = '-' + arg; + return [code, Blockly.JavaScript.ORDER_UNARY_NEGATION]; + } + if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') { + arg = Blockly.JavaScript.valueToCode(block, 'NUM', + Blockly.JavaScript.ORDER_DIVISION) || '0'; + } else { + arg = Blockly.JavaScript.valueToCode(block, 'NUM', + Blockly.JavaScript.ORDER_NONE) || '0'; + } + // First, handle cases which generate values that don't need parentheses + // wrapping the code. + switch (operator) { + case 'ABS': + code = 'Math.abs(' + arg + ')'; + break; + case 'ROOT': + code = 'Math.sqrt(' + arg + ')'; + break; + case 'LN': + code = 'Math.log(' + arg + ')'; + break; + case 'EXP': + code = 'Math.exp(' + arg + ')'; + break; + case 'POW10': + code = 'Math.pow(10,' + arg + ')'; + break; + case 'ROUND': + code = 'Math.round(' + arg + ')'; + break; + case 'ROUNDUP': + code = 'Math.ceil(' + arg + ')'; + break; + case 'ROUNDDOWN': + code = 'Math.floor(' + arg + ')'; + break; + case 'SIN': + code = 'Math.sin(' + arg + ' / 180 * Math.PI)'; + break; + case 'COS': + code = 'Math.cos(' + arg + ' / 180 * Math.PI)'; + break; + case 'TAN': + code = 'Math.tan(' + arg + ' / 180 * Math.PI)'; + break; + } + if (code) { + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } + // Second, handle cases which generate values that may need parentheses + // wrapping the code. + switch (operator) { + case 'LOG10': + code = 'Math.log(' + arg + ') / Math.log(10)'; + break; + case 'ASIN': + code = 'Math.asin(' + arg + ') / Math.PI * 180'; + break; + case 'ACOS': + code = 'Math.acos(' + arg + ') / Math.PI * 180'; + break; + case 'ATAN': + code = 'Math.atan(' + arg + ') / Math.PI * 180'; + break; + default: + throw 'Unknown math operator: ' + operator; + } + return [code, Blockly.JavaScript.ORDER_DIVISION]; +}; + +Blockly.JavaScript['math_constant'] = function(block) { + // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. + var CONSTANTS = { + 'PI': ['Math.PI', Blockly.JavaScript.ORDER_MEMBER], + 'E': ['Math.E', Blockly.JavaScript.ORDER_MEMBER], + 'GOLDEN_RATIO': + ['(1 + Math.sqrt(5)) / 2', Blockly.JavaScript.ORDER_DIVISION], + 'SQRT2': ['Math.SQRT2', Blockly.JavaScript.ORDER_MEMBER], + 'SQRT1_2': ['Math.SQRT1_2', Blockly.JavaScript.ORDER_MEMBER], + 'INFINITY': ['Infinity', Blockly.JavaScript.ORDER_ATOMIC] + }; + return CONSTANTS[block.getFieldValue('CONSTANT')]; +}; + +Blockly.JavaScript['math_number_property'] = function(block) { + // Check if a number is even, odd, prime, whole, positive, or negative + // or if it is divisible by certain number. Returns true or false. + var number_to_check = Blockly.JavaScript.valueToCode(block, 'NUMBER_TO_CHECK', + Blockly.JavaScript.ORDER_MODULUS) || '0'; + var dropdown_property = block.getFieldValue('PROPERTY'); + var code; + if (dropdown_property == 'PRIME') { + // Prime is a special case as it is not a one-liner test. + var functionName = Blockly.JavaScript.provideFunction_( + 'mathIsPrime', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '(n) {', + ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods', + ' if (n == 2 || n == 3) {', + ' return true;', + ' }', + ' // False if n is NaN, negative, is 1, or not whole.', + ' // And false if n is divisible by 2 or 3.', + ' if (isNaN(n) || n <= 1 || n % 1 != 0 || n % 2 == 0 ||' + + ' n % 3 == 0) {', + ' return false;', + ' }', + ' // Check all the numbers of form 6k +/- 1, up to sqrt(n).', + ' for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {', + ' if (n % (x - 1) == 0 || n % (x + 1) == 0) {', + ' return false;', + ' }', + ' }', + ' return true;', + '}']); + code = functionName + '(' + number_to_check + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } + switch (dropdown_property) { + case 'EVEN': + code = number_to_check + ' % 2 == 0'; + break; + case 'ODD': + code = number_to_check + ' % 2 == 1'; + break; + case 'WHOLE': + code = number_to_check + ' % 1 == 0'; + break; + case 'POSITIVE': + code = number_to_check + ' > 0'; + break; + case 'NEGATIVE': + code = number_to_check + ' < 0'; + break; + case 'DIVISIBLE_BY': + var divisor = Blockly.JavaScript.valueToCode(block, 'DIVISOR', + Blockly.JavaScript.ORDER_MODULUS) || '0'; + code = number_to_check + ' % ' + divisor + ' == 0'; + break; + } + return [code, Blockly.JavaScript.ORDER_EQUALITY]; +}; + +Blockly.JavaScript['math_change'] = function(block) { + // Add to a variable in place. + var argument0 = Blockly.JavaScript.valueToCode(block, 'DELTA', + Blockly.JavaScript.ORDER_ADDITION) || '0'; + var varName = Blockly.JavaScript.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + return varName + ' = (typeof ' + varName + ' == \'number\' ? ' + varName + + ' : 0) + ' + argument0 + ';\n'; +}; + +// Rounding functions have a single operand. +Blockly.JavaScript['math_round'] = Blockly.JavaScript['math_single']; +// Trigonometry functions have a single operand. +Blockly.JavaScript['math_trig'] = Blockly.JavaScript['math_single']; + +Blockly.JavaScript['math_on_list'] = function(block) { + // Math functions for lists. + var func = block.getFieldValue('OP'); + var list, code; + switch (func) { + case 'SUM': + list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_MEMBER) || '[]'; + code = list + '.reduce(function(x, y) {return x + y;})'; + break; + case 'MIN': + list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_COMMA) || '[]'; + code = 'Math.min.apply(null, ' + list + ')'; + break; + case 'MAX': + list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_COMMA) || '[]'; + code = 'Math.max.apply(null, ' + list + ')'; + break; + case 'AVERAGE': + // mathMean([null,null,1,3]) == 2.0. + var functionName = Blockly.JavaScript.provideFunction_( + 'mathMean', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(myList) {', + ' return myList.reduce(function(x, y) {return x + y;}) / ' + + 'myList.length;', + '}']); + list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_NONE) || '[]'; + code = functionName + '(' + list + ')'; + break; + case 'MEDIAN': + // mathMedian([null,null,1,3]) == 2.0. + var functionName = Blockly.JavaScript.provideFunction_( + 'mathMedian', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(myList) {', + ' var localList = myList.filter(function (x) ' + + '{return typeof x == \'number\';});', + ' if (!localList.length) return null;', + ' localList.sort(function(a, b) {return b - a;});', + ' if (localList.length % 2 == 0) {', + ' return (localList[localList.length / 2 - 1] + ' + + 'localList[localList.length / 2]) / 2;', + ' } else {', + ' return localList[(localList.length - 1) / 2];', + ' }', + '}']); + list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_NONE) || '[]'; + code = functionName + '(' + list + ')'; + break; + case 'MODE': + // As a list of numbers can contain more than one mode, + // the returned result is provided as an array. + // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]. + var functionName = Blockly.JavaScript.provideFunction_( + 'mathModes', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(values) {', + ' var modes = [];', + ' var counts = [];', + ' var maxCount = 0;', + ' for (var i = 0; i < values.length; i++) {', + ' var value = values[i];', + ' var found = false;', + ' var thisCount;', + ' for (var j = 0; j < counts.length; j++) {', + ' if (counts[j][0] === value) {', + ' thisCount = ++counts[j][1];', + ' found = true;', + ' break;', + ' }', + ' }', + ' if (!found) {', + ' counts.push([value, 1]);', + ' thisCount = 1;', + ' }', + ' maxCount = Math.max(thisCount, maxCount);', + ' }', + ' for (var j = 0; j < counts.length; j++) {', + ' if (counts[j][1] == maxCount) {', + ' modes.push(counts[j][0]);', + ' }', + ' }', + ' return modes;', + '}']); + list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_NONE) || '[]'; + code = functionName + '(' + list + ')'; + break; + case 'STD_DEV': + var functionName = Blockly.JavaScript.provideFunction_( + 'mathStandardDeviation', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(numbers) {', + ' var n = numbers.length;', + ' if (!n) return null;', + ' var mean = numbers.reduce(function(x, y) {return x + y;}) / n;', + ' var variance = 0;', + ' for (var j = 0; j < n; j++) {', + ' variance += Math.pow(numbers[j] - mean, 2);', + ' }', + ' variance = variance / n;', + ' return Math.sqrt(variance);', + '}']); + list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_NONE) || '[]'; + code = functionName + '(' + list + ')'; + break; + case 'RANDOM': + var functionName = Blockly.JavaScript.provideFunction_( + 'mathRandomList', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(list) {', + ' var x = Math.floor(Math.random() * list.length);', + ' return list[x];', + '}']); + list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_NONE) || '[]'; + code = functionName + '(' + list + ')'; + break; + default: + throw 'Unknown operator: ' + func; + } + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['math_modulo'] = function(block) { + // Remainder computation. + var argument0 = Blockly.JavaScript.valueToCode(block, 'DIVIDEND', + Blockly.JavaScript.ORDER_MODULUS) || '0'; + var argument1 = Blockly.JavaScript.valueToCode(block, 'DIVISOR', + Blockly.JavaScript.ORDER_MODULUS) || '0'; + var code = argument0 + ' % ' + argument1; + return [code, Blockly.JavaScript.ORDER_MODULUS]; +}; + +Blockly.JavaScript['math_constrain'] = function(block) { + // Constrain a number between two limits. + var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_COMMA) || '0'; + var argument1 = Blockly.JavaScript.valueToCode(block, 'LOW', + Blockly.JavaScript.ORDER_COMMA) || '0'; + var argument2 = Blockly.JavaScript.valueToCode(block, 'HIGH', + Blockly.JavaScript.ORDER_COMMA) || 'Infinity'; + var code = 'Math.min(Math.max(' + argument0 + ', ' + argument1 + '), ' + + argument2 + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['math_random_int'] = function(block) { + // Random integer between [X] and [Y]. + var argument0 = Blockly.JavaScript.valueToCode(block, 'FROM', + Blockly.JavaScript.ORDER_COMMA) || '0'; + var argument1 = Blockly.JavaScript.valueToCode(block, 'TO', + Blockly.JavaScript.ORDER_COMMA) || '0'; + var functionName = Blockly.JavaScript.provideFunction_( + 'mathRandomInt', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(a, b) {', + ' if (a > b) {', + ' // Swap a and b to ensure a is smaller.', + ' var c = a;', + ' a = b;', + ' b = c;', + ' }', + ' return Math.floor(Math.random() * (b - a + 1) + a);', + '}']); + var code = functionName + '(' + argument0 + ', ' + argument1 + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['math_random_float'] = function(block) { + // Random fraction between 0 and 1. + return ['Math.random()', Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/javascript/procedures.js b/src/opsoro/server/static/js/blockly/generators/javascript/procedures.js new file mode 100644 index 0000000..04845f9 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/javascript/procedures.js @@ -0,0 +1,109 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating JavaScript for procedure blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.JavaScript.procedures'); + +goog.require('Blockly.JavaScript'); + + +Blockly.JavaScript['procedures_defreturn'] = function(block) { + // Define a procedure with a return value. + var funcName = Blockly.JavaScript.variableDB_.getName( + block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); + var branch = Blockly.JavaScript.statementToCode(block, 'STACK'); + if (Blockly.JavaScript.STATEMENT_PREFIX) { + branch = Blockly.JavaScript.prefixLines( + Blockly.JavaScript.STATEMENT_PREFIX.replace(/%1/g, + '\'' + block.id + '\''), Blockly.JavaScript.INDENT) + branch; + } + if (Blockly.JavaScript.INFINITE_LOOP_TRAP) { + branch = Blockly.JavaScript.INFINITE_LOOP_TRAP.replace(/%1/g, + '\'' + block.id + '\'') + branch; + } + var returnValue = Blockly.JavaScript.valueToCode(block, 'RETURN', + Blockly.JavaScript.ORDER_NONE) || ''; + if (returnValue) { + returnValue = ' return ' + returnValue + ';\n'; + } + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.JavaScript.variableDB_.getName(block.arguments_[i], + Blockly.Variables.NAME_TYPE); + } + var code = 'function ' + funcName + '(' + args.join(', ') + ') {\n' + + branch + returnValue + '}'; + code = Blockly.JavaScript.scrub_(block, code); + // Add % so as not to collide with helper functions in definitions list. + Blockly.JavaScript.definitions_['%' + funcName] = code; + return null; +}; + +// Defining a procedure without a return value uses the same generator as +// a procedure with a return value. +Blockly.JavaScript['procedures_defnoreturn'] = + Blockly.JavaScript['procedures_defreturn']; + +Blockly.JavaScript['procedures_callreturn'] = function(block) { + // Call a procedure with a return value. + var funcName = Blockly.JavaScript.variableDB_.getName( + block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.JavaScript.valueToCode(block, 'ARG' + i, + Blockly.JavaScript.ORDER_COMMA) || 'null'; + } + var code = funcName + '(' + args.join(', ') + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['procedures_callnoreturn'] = function(block) { + // Call a procedure with no return value. + var funcName = Blockly.JavaScript.variableDB_.getName( + block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.JavaScript.valueToCode(block, 'ARG' + i, + Blockly.JavaScript.ORDER_COMMA) || 'null'; + } + var code = funcName + '(' + args.join(', ') + ');\n'; + return code; +}; + +Blockly.JavaScript['procedures_ifreturn'] = function(block) { + // Conditionally return value from a procedure. + var condition = Blockly.JavaScript.valueToCode(block, 'CONDITION', + Blockly.JavaScript.ORDER_NONE) || 'false'; + var code = 'if (' + condition + ') {\n'; + if (block.hasReturnValue_) { + var value = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_NONE) || 'null'; + code += ' return ' + value + ';\n'; + } else { + code += ' return;\n'; + } + code += '}\n'; + return code; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/javascript/text.js b/src/opsoro/server/static/js/blockly/generators/javascript/text.js new file mode 100644 index 0000000..9e2a375 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/javascript/text.js @@ -0,0 +1,352 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating JavaScript for text blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.JavaScript.texts'); + +goog.require('Blockly.JavaScript'); + + +Blockly.JavaScript['text'] = function(block) { + // Text value. + var code = Blockly.JavaScript.quote_(block.getFieldValue('TEXT')); + return [code, Blockly.JavaScript.ORDER_ATOMIC]; +}; + +Blockly.JavaScript['text_join'] = function(block) { + // Create a string made up of any number of elements of any type. + switch (block.itemCount_) { + case 0: + return ['\'\'', Blockly.JavaScript.ORDER_ATOMIC]; + case 1: + var element = Blockly.JavaScript.valueToCode(block, 'ADD0', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var code = 'String(' + element + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + case 2: + var element0 = Blockly.JavaScript.valueToCode(block, 'ADD0', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var element1 = Blockly.JavaScript.valueToCode(block, 'ADD1', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var code = 'String(' + element0 + ') + String(' + element1 + ')'; + return [code, Blockly.JavaScript.ORDER_ADDITION]; + default: + var elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.JavaScript.valueToCode(block, 'ADD' + i, + Blockly.JavaScript.ORDER_COMMA) || '\'\''; + } + var code = '[' + elements.join(',') + '].join(\'\')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } +}; + +Blockly.JavaScript['text_append'] = function(block) { + // Append to a variable in place. + var varName = Blockly.JavaScript.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + var value = Blockly.JavaScript.valueToCode(block, 'TEXT', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + return varName + ' = String(' + varName + ') + String(' + value + ');\n'; +}; + +Blockly.JavaScript['text_length'] = function(block) { + // String or array length. + var text = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_FUNCTION_CALL) || '\'\''; + return [text + '.length', Blockly.JavaScript.ORDER_MEMBER]; +}; + +Blockly.JavaScript['text_isEmpty'] = function(block) { + // Is the string null or array empty? + var text = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_MEMBER) || '\'\''; + return ['!' + text + '.length', Blockly.JavaScript.ORDER_LOGICAL_NOT]; +}; + +Blockly.JavaScript['text_indexOf'] = function(block) { + // Search the text for a substring. + var operator = block.getFieldValue('END') == 'FIRST' ? + 'indexOf' : 'lastIndexOf'; + var substring = Blockly.JavaScript.valueToCode(block, 'FIND', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var text = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_MEMBER) || '\'\''; + var code = text + '.' + operator + '(' + substring + ')'; + // Adjust index if using one-based indices. + if (block.workspace.options.oneBasedIndex) { + return [code + ' + 1', Blockly.JavaScript.ORDER_ADDITION]; + } + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['text_charAt'] = function(block) { + // Get letter at index. + // Note: Until January 2013 this block did not have the WHERE input. + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var textOrder = (where == 'RANDOM') ? Blockly.JavaScript.ORDER_NONE : + Blockly.JavaScript.ORDER_MEMBER; + var text = Blockly.JavaScript.valueToCode(block, 'VALUE', + textOrder) || '\'\''; + switch (where) { + case 'FIRST': + var code = text + '.charAt(0)'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + case 'LAST': + var code = text + '.slice(-1)'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + case 'FROM_START': + var at = Blockly.JavaScript.getAdjusted(block, 'AT'); + // Adjust index if using one-based indices. + var code = text + '.charAt(' + at + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + case 'FROM_END': + var at = Blockly.JavaScript.getAdjusted(block, 'AT', 1, true); + var code = text + '.slice(' + at + ').charAt(0)'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + case 'RANDOM': + var functionName = Blockly.JavaScript.provideFunction_( + 'textRandomLetter', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(text) {', + ' var x = Math.floor(Math.random() * text.length);', + ' return text[x];', + '}']); + var code = functionName + '(' + text + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } + throw 'Unhandled option (text_charAt).'; +}; + +/** + * Returns an expression calculating the index into a string. + * @private + * @param {string} stringName Name of the string, used to calculate length. + * @param {string} where The method of indexing, selected by dropdown in Blockly + * @param {string=} opt_at The optional offset when indexing from start/end. + * @return {string} Index expression. + */ +Blockly.JavaScript.text.getIndex_ = function(stringName, where, opt_at) { + if (where == 'FIRST') { + return '0'; + } else if (where == 'FROM_END') { + return stringName + '.length - 1 - ' + opt_at; + } else if (where == 'LAST') { + return stringName + '.length - 1'; + } else { + return opt_at; + } +}; + +Blockly.JavaScript['text_getSubstring'] = function(block) { + // Get substring. + var text = Blockly.JavaScript.valueToCode(block, 'STRING', + Blockly.JavaScript.ORDER_FUNCTION_CALL) || '\'\''; + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + if (where1 == 'FIRST' && where2 == 'LAST') { + var code = text; + } else if (text.match(/^'?\w+'?$/) || + (where1 != 'FROM_END' && where1 != 'LAST' && + where2 != 'FROM_END' && where2 != 'LAST')) { + // If the text is a variable or literal or doesn't require a call for + // length, don't generate a helper function. + switch (where1) { + case 'FROM_START': + var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1'); + break; + case 'FROM_END': + var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1', 1, false, + Blockly.JavaScript.ORDER_SUBTRACTION); + at1 = text + '.length - ' + at1; + break; + case 'FIRST': + var at1 = '0'; + break; + default: + throw 'Unhandled option (text_getSubstring).'; + } + switch (where2) { + case 'FROM_START': + var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2', 1); + break; + case 'FROM_END': + var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2', 0, false, + Blockly.JavaScript.ORDER_SUBTRACTION); + at2 = text + '.length - ' + at2; + break; + case 'LAST': + var at2 = text + '.length'; + break; + default: + throw 'Unhandled option (text_getSubstring).'; + } + code = text + '.slice(' + at1 + ', ' + at2 + ')'; + } else { + var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1'); + var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2'); + var getIndex_ = Blockly.JavaScript.text.getIndex_; + var wherePascalCase = {'FIRST': 'First', 'LAST': 'Last', + 'FROM_START': 'FromStart', 'FROM_END': 'FromEnd'}; + var functionName = Blockly.JavaScript.provideFunction_( + 'subsequence' + wherePascalCase[where1] + wherePascalCase[where2], + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(sequence' + + // The value for 'FROM_END' and'FROM_START' depends on `at` so + // we add it as a parameter. + ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', at1' : '') + + ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', at2' : '') + + ') {', + ' var start = ' + getIndex_('sequence', where1, 'at1') + ';', + ' var end = ' + getIndex_('sequence', where2, 'at2') + ' + 1;', + ' return sequence.slice(start, end);', + '}']); + var code = functionName + '(' + text + + // The value for 'FROM_END' and 'FROM_START' depends on `at` so we + // pass it. + ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', ' + at1 : '') + + ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', ' + at2 : '') + + ')'; + } + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['text_changeCase'] = function(block) { + // Change capitalization. + var OPERATORS = { + 'UPPERCASE': '.toUpperCase()', + 'LOWERCASE': '.toLowerCase()', + 'TITLECASE': null + }; + var operator = OPERATORS[block.getFieldValue('CASE')]; + var textOrder = operator ? Blockly.JavaScript.ORDER_MEMBER : + Blockly.JavaScript.ORDER_NONE; + var text = Blockly.JavaScript.valueToCode(block, 'TEXT', + textOrder) || '\'\''; + if (operator) { + // Upper and lower case are functions built into JavaScript. + var code = text + operator; + } else { + // Title case is not a native JavaScript function. Define one. + var functionName = Blockly.JavaScript.provideFunction_( + 'textToTitleCase', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(str) {', + ' return str.replace(/\\S+/g,', + ' function(txt) {return txt[0].toUpperCase() + ' + + 'txt.substring(1).toLowerCase();});', + '}']); + var code = functionName + '(' + text + ')'; + } + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['text_trim'] = function(block) { + // Trim spaces. + var OPERATORS = { + 'LEFT': ".replace(/^[\\s\\xa0]+/, '')", + 'RIGHT': ".replace(/[\\s\\xa0]+$/, '')", + 'BOTH': '.trim()' + }; + var operator = OPERATORS[block.getFieldValue('MODE')]; + var text = Blockly.JavaScript.valueToCode(block, 'TEXT', + Blockly.JavaScript.ORDER_MEMBER) || '\'\''; + return [text + operator, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['text_print'] = function(block) { + // Print statement. + var msg = Blockly.JavaScript.valueToCode(block, 'TEXT', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + return 'window.alert(' + msg + ');\n'; +}; + +Blockly.JavaScript['text_prompt_ext'] = function(block) { + // Prompt function. + if (block.getField('TEXT')) { + // Internal message. + var msg = Blockly.JavaScript.quote_(block.getFieldValue('TEXT')); + } else { + // External message. + var msg = Blockly.JavaScript.valueToCode(block, 'TEXT', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + } + var code = 'window.prompt(' + msg + ')'; + var toNumber = block.getFieldValue('TYPE') == 'NUMBER'; + if (toNumber) { + code = 'parseFloat(' + code + ')'; + } + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['text_prompt'] = Blockly.JavaScript['text_prompt_ext']; + +Blockly.JavaScript['text_count'] = function(block) { + var text = Blockly.JavaScript.valueToCode(block, 'TEXT', + Blockly.JavaScript.ORDER_MEMBER) || '\'\''; + var sub = Blockly.JavaScript.valueToCode(block, 'SUB', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var functionName = Blockly.JavaScript.provideFunction_( + 'textCount', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(haystack, needle) {', + ' if (needle.length === 0) {', + ' return haystack.length + 1;', + ' } else {', + ' return haystack.split(needle).length - 1;', + ' }', + '}']); + var code = functionName + '(' + text + ', ' + sub + ')'; + return [code, Blockly.JavaScript.ORDER_SUBTRACTION]; +}; + +Blockly.JavaScript['text_replace'] = function(block) { + var text = Blockly.JavaScript.valueToCode(block, 'TEXT', + Blockly.JavaScript.ORDER_MEMBER) || '\'\''; + var from = Blockly.JavaScript.valueToCode(block, 'FROM', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var to = Blockly.JavaScript.valueToCode(block, 'TO', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + // The regex escaping code below is taken from the implementation of + // goog.string.regExpEscape. + var functionName = Blockly.JavaScript.provideFunction_( + 'textReplace', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(haystack, needle, replacement) {', + ' needle = ' + + 'needle.replace(/([-()\\[\\]{}+?*.$\\^|,:# <= >= ~= == +Blockly.Lua.ORDER_AND = 8; // and +Blockly.Lua.ORDER_OR = 9; // or +Blockly.Lua.ORDER_NONE = 99; + +/** + * Note: Lua is not supporting zero-indexing since the language itself is + * one-indexed, so the generator does not repoct the oneBasedIndex configuration + * option used for lists and text. + */ + +/** + * Initialise the database of variable names. + * @param {!Blockly.Workspace} workspace Workspace to generate code from. + */ +Blockly.Lua.init = function(workspace) { + // Create a dictionary of definitions to be printed before the code. + Blockly.Lua.definitions_ = Object.create(null); + // Create a dictionary mapping desired function names in definitions_ + // to actual function names (to avoid collisions with user functions). + Blockly.Lua.functionNames_ = Object.create(null); + + if (!Blockly.Lua.variableDB_) { + Blockly.Lua.variableDB_ = + new Blockly.Names(Blockly.Lua.RESERVED_WORDS_); + } else { + Blockly.Lua.variableDB_.reset(); + } +}; + +/** + * Prepend the generated code with the variable definitions. + * @param {string} code Generated code. + * @return {string} Completed code. + */ +Blockly.Lua.finish = function(code) { + // Convert the definitions dictionary into a list. + var definitions = []; + for (var name in Blockly.Lua.definitions_) { + definitions.push(Blockly.Lua.definitions_[name]); + } + // Clean up temporary data. + delete Blockly.Lua.definitions_; + delete Blockly.Lua.functionNames_; + Blockly.Lua.variableDB_.reset(); + return definitions.join('\n\n') + '\n\n\n' + code; +}; + +/** + * Naked values are top-level blocks with outputs that aren't plugged into + * anything. In Lua, an expression is not a legal statement, so we must assign + * the value to the (conventionally ignored) _. + * http://lua-users.org/wiki/ExpressionsAsStatements + * @param {string} line Line of generated code. + * @return {string} Legal line of code. + */ +Blockly.Lua.scrubNakedValue = function(line) { + return 'local _ = ' + line + '\n'; +}; + +/** + * Encode a string as a properly escaped Lua string, complete with + * quotes. + * @param {string} string Text to encode. + * @return {string} Lua string. + * @private + */ +Blockly.Lua.quote_ = function(string) { + string = string.replace(/\\/g, '\\\\') + .replace(/\n/g, '\\\n') + .replace(/'/g, '\\\''); + return '\'' + string + '\''; +}; + +/** + * Common tasks for generating Lua from blocks. + * Handles comments for the specified block and any connected value blocks. + * Calls any statements following this block. + * @param {!Blockly.Block} block The current block. + * @param {string} code The Lua code created for this block. + * @return {string} Lua code with comments and subsequent blocks added. + * @private + */ +Blockly.Lua.scrub_ = function(block, code) { + var commentCode = ''; + // Only collect comments for blocks that aren't inline. + if (!block.outputConnection || !block.outputConnection.targetConnection) { + // Collect comment for this block. + var comment = block.getCommentText(); + comment = Blockly.utils.wrap(comment, Blockly.Lua.COMMENT_WRAP - 3); + if (comment) { + commentCode += Blockly.Lua.prefixLines(comment, '-- ') + '\n'; + } + // Collect comments for all value arguments. + // Don't collect comments for nested statements. + for (var i = 0; i < block.inputList.length; i++) { + if (block.inputList[i].type == Blockly.INPUT_VALUE) { + var childBlock = block.inputList[i].connection.targetBlock(); + if (childBlock) { + comment = Blockly.Lua.allNestedComments(childBlock); + if (comment) { + commentCode += Blockly.Lua.prefixLines(comment, '-- '); + } + } + } + } + } + var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); + var nextCode = Blockly.Lua.blockToCode(nextBlock); + return commentCode + code + nextCode; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/lua/colour.js b/src/opsoro/server/static/js/blockly/generators/lua/colour.js new file mode 100644 index 0000000..9175a9d --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/lua/colour.js @@ -0,0 +1,90 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for colour blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.colour'); + +goog.require('Blockly.Lua'); + + +Blockly.Lua['colour_picker'] = function(block) { + // Colour picker. + var code = '\'' + block.getFieldValue('COLOUR') + '\''; + return [code, Blockly.Lua.ORDER_ATOMIC]; +}; + +Blockly.Lua['colour_random'] = function(block) { + // Generate a random colour. + var code = 'string.format("#%06x", math.random(0, 2^24 - 1))'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['colour_rgb'] = function(block) { + // Compose a colour from RGB components expressed as percentages. + var functionName = Blockly.Lua.provideFunction_( + 'colour_rgb', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(r, g, b)', + ' r = math.floor(math.min(100, math.max(0, r)) * 2.55 + .5)', + ' g = math.floor(math.min(100, math.max(0, g)) * 2.55 + .5)', + ' b = math.floor(math.min(100, math.max(0, b)) * 2.55 + .5)', + ' return string.format("#%02x%02x%02x", r, g, b)', + 'end']); + var r = Blockly.Lua.valueToCode(block, 'RED', + Blockly.Lua.ORDER_NONE) || 0; + var g = Blockly.Lua.valueToCode(block, 'GREEN', + Blockly.Lua.ORDER_NONE) || 0; + var b = Blockly.Lua.valueToCode(block, 'BLUE', + Blockly.Lua.ORDER_NONE) || 0; + var code = functionName + '(' + r + ', ' + g + ', ' + b + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['colour_blend'] = function(block) { + // Blend two colours together. + var functionName = Blockly.Lua.provideFunction_( + 'colour_blend', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(colour1, colour2, ratio)', + ' local r1 = tonumber(string.sub(colour1, 2, 3), 16)', + ' local r2 = tonumber(string.sub(colour2, 2, 3), 16)', + ' local g1 = tonumber(string.sub(colour1, 4, 5), 16)', + ' local g2 = tonumber(string.sub(colour2, 4, 5), 16)', + ' local b1 = tonumber(string.sub(colour1, 6, 7), 16)', + ' local b2 = tonumber(string.sub(colour2, 6, 7), 16)', + ' local ratio = math.min(1, math.max(0, ratio))', + ' local r = math.floor(r1 * (1 - ratio) + r2 * ratio + .5)', + ' local g = math.floor(g1 * (1 - ratio) + g2 * ratio + .5)', + ' local b = math.floor(b1 * (1 - ratio) + b2 * ratio + .5)', + ' return string.format("#%02x%02x%02x", r, g, b)', + 'end']); + var colour1 = Blockly.Lua.valueToCode(block, 'COLOUR1', + Blockly.Lua.ORDER_NONE) || '\'#000000\''; + var colour2 = Blockly.Lua.valueToCode(block, 'COLOUR2', + Blockly.Lua.ORDER_NONE) || '\'#000000\''; + var ratio = Blockly.Lua.valueToCode(block, 'RATIO', + Blockly.Lua.ORDER_NONE) || 0; + var code = functionName + '(' + colour1 + ', ' + colour2 + ', ' + ratio + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/lua/lists.js b/src/opsoro/server/static/js/blockly/generators/lua/lists.js new file mode 100644 index 0000000..6b9fe00 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/lua/lists.js @@ -0,0 +1,382 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for list blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.lists'); + +goog.require('Blockly.Lua'); + + +Blockly.Lua['lists_create_empty'] = function(block) { + // Create an empty list. + return ['{}', Blockly.Lua.ORDER_ATOMIC]; +}; + +Blockly.Lua['lists_create_with'] = function(block) { + // Create a list with any number of elements of any type. + var elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.Lua.valueToCode(block, 'ADD' + i, + Blockly.Lua.ORDER_NONE) || 'None'; + } + var code = '{' + elements.join(', ') + '}'; + return [code, Blockly.Lua.ORDER_ATOMIC]; +}; + +Blockly.Lua['lists_repeat'] = function(block) { + // Create a list with one element repeated. + var functionName = Blockly.Lua.provideFunction_( + 'create_list_repeated', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(item, count)', + ' local t = {}', + ' for i = 1, count do', + ' table.insert(t, item)', + ' end', + ' return t', + 'end']); + var element = Blockly.Lua.valueToCode(block, 'ITEM', + Blockly.Lua.ORDER_NONE) || 'None'; + var repeatCount = Blockly.Lua.valueToCode(block, 'NUM', + Blockly.Lua.ORDER_NONE) || '0'; + var code = functionName + '(' + element + ', ' + repeatCount + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['lists_length'] = function(block) { + // String or array length. + var list = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_UNARY) || '{}'; + return ['#' + list, Blockly.Lua.ORDER_UNARY]; +}; + +Blockly.Lua['lists_isEmpty'] = function(block) { + // Is the string null or array empty? + var list = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_UNARY) || '{}'; + var code = '#' + list + ' == 0'; + return [code, Blockly.Lua.ORDER_RELATIONAL]; +}; + +Blockly.Lua['lists_indexOf'] = function(block) { + // Find an item in the list. + var item = Blockly.Lua.valueToCode(block, 'FIND', + Blockly.Lua.ORDER_NONE) || '\'\''; + var list = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_NONE) || '{}'; + if (block.getFieldValue('END') == 'FIRST') { + var functionName = Blockly.Lua.provideFunction_( + 'first_index', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t, elem)', + ' for k, v in ipairs(t) do', + ' if v == elem then', + ' return k', + ' end', + ' end', + ' return 0', + 'end']); + } else { + var functionName = Blockly.Lua.provideFunction_( + 'last_index', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t, elem)', + ' for i = #t, 1, -1 do', + ' if t[i] == elem then', + ' return i', + ' end', + ' end', + ' return 0', + 'end']); + } + var code = functionName + '(' + list + ', ' + item + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +/** + * Returns an expression calculating the index into a list. + * @private + * @param {string} listName Name of the list, used to calculate length. + * @param {string} where The method of indexing, selected by dropdown in Blockly + * @param {string=} opt_at The optional offset when indexing from start/end. + * @return {string} Index expression. + */ +Blockly.Lua.lists.getIndex_ = function(listName, where, opt_at) { + if (where == 'FIRST') { + return '1'; + } else if (where == 'FROM_END') { + return '#' + listName + ' + 1 - ' + opt_at; + } else if (where == 'LAST') { + return '#' + listName; + } else if (where == 'RANDOM') { + return 'math.random(#' + listName + ')'; + } else { + return opt_at; + } +}; + +Blockly.Lua['lists_getIndex'] = function(block) { + // Get element at index. + // Note: Until January 2013 this block did not have MODE or WHERE inputs. + var mode = block.getFieldValue('MODE') || 'GET'; + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var list = Blockly.Lua.valueToCode(block, 'VALUE', Blockly.Lua.ORDER_HIGH) || + '{}'; + var getIndex_ = Blockly.Lua.lists.getIndex_; + + // If `list` would be evaluated more than once (which is the case for LAST, + // FROM_END, and RANDOM) and is non-trivial, make sure to access it only once. + if ((where == 'LAST' || where == 'FROM_END' || where == 'RANDOM') && + !list.match(/^\w+$/)) { + // `list` is an expression, so we may not evaluate it more than once. + if (mode == 'REMOVE') { + // We can use multiple statements. + var atOrder = (where == 'FROM_END') ? Blockly.Lua.ORDER_ADDITIVE : + Blockly.Lua.ORDER_NONE; + var at = Blockly.Lua.valueToCode(block, 'AT', atOrder) || '1'; + var listVar = Blockly.Lua.variableDB_.getDistinctName( + 'tmp_list', Blockly.Variables.NAME_TYPE); + at = getIndex_(listVar, where, at); + var code = listVar + ' = ' + list + '\n' + + 'table.remove(' + listVar + ', ' + at + ')\n'; + return code; + } else { + // We need to create a procedure to avoid reevaluating values. + var at = Blockly.Lua.valueToCode(block, 'AT', Blockly.Lua.ORDER_NONE) || + '1'; + if (mode == 'GET') { + var functionName = Blockly.Lua.provideFunction_( + 'list_get_' + where.toLowerCase(), + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t' + + // The value for 'FROM_END' and'FROM_START' depends on `at` so + // we add it as a parameter. + ((where == 'FROM_END' || where == 'FROM_START') ? + ', at)' : ')'), + ' return t[' + getIndex_('t', where, 'at') + ']', + 'end']); + } else { // mode == 'GET_REMOVE' + var functionName = Blockly.Lua.provideFunction_( + 'list_remove_' + where.toLowerCase(), + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t' + + // The value for 'FROM_END' and'FROM_START' depends on `at` so + // we add it as a parameter. + ((where == 'FROM_END' || where == 'FROM_START') ? + ', at)' : ')'), + ' return table.remove(t, ' + getIndex_('t', where, 'at') + ')', + 'end']); + } + var code = functionName + '(' + list + + // The value for 'FROM_END' and 'FROM_START' depends on `at` so we + // pass it. + ((where == 'FROM_END' || where == 'FROM_START') ? ', ' + at : '') + + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; + } + } else { + // Either `list` is a simple variable, or we only need to refer to `list` + // once. + var atOrder = (mode == 'GET' && where == 'FROM_END') ? + Blockly.Lua.ORDER_ADDITIVE : Blockly.Lua.ORDER_NONE; + var at = Blockly.Lua.valueToCode(block, 'AT', atOrder) || '1'; + at = getIndex_(list, where, at); + if (mode == 'GET') { + var code = list + '[' + at + ']'; + return [code, Blockly.Lua.ORDER_HIGH]; + } else { + var code = 'table.remove(' + list + ', ' + at + ')'; + if (mode == 'GET_REMOVE') { + return [code, Blockly.Lua.ORDER_HIGH]; + } else { // `mode` == 'REMOVE' + return code + '\n'; + } + } + } +}; + +Blockly.Lua['lists_setIndex'] = function(block) { + // Set element at index. + // Note: Until February 2013 this block did not have MODE or WHERE inputs. + var list = Blockly.Lua.valueToCode(block, 'LIST', + Blockly.Lua.ORDER_HIGH) || '{}'; + var mode = block.getFieldValue('MODE') || 'SET'; + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var at = Blockly.Lua.valueToCode(block, 'AT', + Blockly.Lua.ORDER_ADDITIVE) || '1'; + var value = Blockly.Lua.valueToCode(block, 'TO', + Blockly.Lua.ORDER_NONE) || 'None'; + var getIndex_ = Blockly.Lua.lists.getIndex_; + + var code = ''; + // If `list` would be evaluated more than once (which is the case for LAST, + // FROM_END, and RANDOM) and is non-trivial, make sure to access it only once. + if ((where == 'LAST' || where == 'FROM_END' || where == 'RANDOM') && + !list.match(/^\w+$/)) { + // `list` is an expression, so we may not evaluate it more than once. + // We can use multiple statements. + var listVar = Blockly.Lua.variableDB_.getDistinctName( + 'tmp_list', Blockly.Variables.NAME_TYPE); + code = listVar + ' = ' + list + '\n'; + list = listVar; + } + if (mode == 'SET') { + code += list + '[' + getIndex_(list, where, at) + '] = ' + value; + } else { // `mode` == 'INSERT' + // LAST is a special case, because we want to insert + // *after* not *before*, the existing last element. + code += 'table.insert(' + list + ', ' + + (getIndex_(list, where, at) + (where == 'LAST' ? ' + 1' : '')) + + ', ' + value + ')'; + } + return code + '\n'; +}; + +Blockly.Lua['lists_getSublist'] = function(block) { + // Get sublist. + var list = Blockly.Lua.valueToCode(block, 'LIST', + Blockly.Lua.ORDER_NONE) || '{}'; + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + var at1 = Blockly.Lua.valueToCode(block, 'AT1', + Blockly.Lua.ORDER_NONE) || '1'; + var at2 = Blockly.Lua.valueToCode(block, 'AT2', + Blockly.Lua.ORDER_NONE) || '1'; + var getIndex_ = Blockly.Lua.lists.getIndex_; + + var functionName = Blockly.Lua.provideFunction_( + 'list_sublist_' + where1.toLowerCase() + '_' + where2.toLowerCase(), + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(source' + + // The value for 'FROM_END' and'FROM_START' depends on `at` so + // we add it as a parameter. + ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', at1' : '') + + ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', at2' : '') + + ')', + ' local t = {}', + ' local start = ' + getIndex_('source', where1, 'at1'), + ' local finish = ' + getIndex_('source', where2, 'at2'), + ' for i = start, finish do', + ' table.insert(t, source[i])', + ' end', + ' return t', + 'end']); + var code = functionName + '(' + list + + // The value for 'FROM_END' and 'FROM_START' depends on `at` so we + // pass it. + ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', ' + at1 : '') + + ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', ' + at2 : '') + + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['lists_sort'] = function(block) { + // Block for sorting a list. + var list = Blockly.Lua.valueToCode( + block, 'LIST', Blockly.Lua.ORDER_NONE) || '{}'; + var direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1; + var type = block.getFieldValue('TYPE'); + + var functionName = Blockly.Lua.provideFunction_( + 'list_sort', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(list, typev, direction)', + ' local t = {}', + ' for n,v in pairs(list) do table.insert(t, v) end', // Shallow-copy. + ' local compareFuncs = {', + ' NUMERIC = function(a, b)', + ' return (tonumber(tostring(a)) or 0)', + ' < (tonumber(tostring(b)) or 0) end,', + ' TEXT = function(a, b)', + ' return tostring(a) < tostring(b) end,', + ' IGNORE_CASE = function(a, b)', + ' return string.lower(tostring(a)) < string.lower(tostring(b)) end', + ' }', + ' local compareTemp = compareFuncs[typev]', + ' local compare = compareTemp', + ' if direction == -1', + ' then compare = function(a, b) return compareTemp(b, a) end', + ' end', + ' table.sort(t, compare)', + ' return t', + 'end']); + + var code = functionName + + '(' + list + ',"' + type + '", ' + direction + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['lists_split'] = function(block) { + // Block for splitting text into a list, or joining a list into text. + var input = Blockly.Lua.valueToCode(block, 'INPUT', + Blockly.Lua.ORDER_NONE); + var delimiter = Blockly.Lua.valueToCode(block, 'DELIM', + Blockly.Lua.ORDER_NONE) || '\'\''; + var mode = block.getFieldValue('MODE'); + var functionName; + if (mode == 'SPLIT') { + if (!input) { + input = '\'\''; + } + functionName = Blockly.Lua.provideFunction_( + 'list_string_split', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(input, delim)', + ' local t = {}', + ' local pos = 1', + ' while true do', + ' next_delim = string.find(input, delim, pos)', + ' if next_delim == nil then', + ' table.insert(t, string.sub(input, pos))', + ' break', + ' else', + ' table.insert(t, string.sub(input, pos, next_delim-1))', + ' pos = next_delim + #delim', + ' end', + ' end', + ' return t', + 'end']); + } else if (mode == 'JOIN') { + if (!input) { + input = '{}'; + } + functionName = 'table.concat'; + } else { + throw 'Unknown mode: ' + mode; + } + var code = functionName + '(' + input + ', ' + delimiter + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['lists_reverse'] = function(block) { + // Block for reversing a list. + var list = Blockly.Lua.valueToCode(block, 'LIST', + Blockly.Lua.ORDER_NONE) || '{}'; + var functionName = Blockly.Lua.provideFunction_( + 'list_reverse', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(input)', + ' local reversed = {}', + ' for i = #input, 1, -1 do', + ' table.insert(reversed, input[i])', + ' end', + ' return reversed', + 'end']); + var code = 'list_reverse(' + list + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/lua/logic.js b/src/opsoro/server/static/js/blockly/generators/lua/logic.js new file mode 100644 index 0000000..033c52e --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/lua/logic.js @@ -0,0 +1,128 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for logic blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.logic'); + +goog.require('Blockly.Lua'); + + +Blockly.Lua['controls_if'] = function(block) { + // If/elseif/else condition. + var n = 0; + var code = '', branchCode, conditionCode; + do { + conditionCode = Blockly.Lua.valueToCode(block, 'IF' + n, + Blockly.Lua.ORDER_NONE) || 'false'; + branchCode = Blockly.Lua.statementToCode(block, 'DO' + n); + code += (n > 0 ? 'else' : '') + + 'if ' + conditionCode + ' then\n' + branchCode; + + ++n; + } while (block.getInput('IF' + n)); + + if (block.getInput('ELSE')) { + branchCode = Blockly.Lua.statementToCode(block, 'ELSE'); + code += 'else\n' + branchCode; + } + return code + 'end\n'; +}; + +Blockly.Lua['controls_ifelse'] = Blockly.Lua['controls_if']; + +Blockly.Lua['logic_compare'] = function(block) { + // Comparison operator. + var OPERATORS = { + 'EQ': '==', + 'NEQ': '~=', + 'LT': '<', + 'LTE': '<=', + 'GT': '>', + 'GTE': '>=' + }; + var operator = OPERATORS[block.getFieldValue('OP')]; + var argument0 = Blockly.Lua.valueToCode(block, 'A', + Blockly.Lua.ORDER_RELATIONAL) || '0'; + var argument1 = Blockly.Lua.valueToCode(block, 'B', + Blockly.Lua.ORDER_RELATIONAL) || '0'; + var code = argument0 + ' ' + operator + ' ' + argument1; + return [code, Blockly.Lua.ORDER_RELATIONAL]; +}; + +Blockly.Lua['logic_operation'] = function(block) { + // Operations 'and', 'or'. + var operator = (block.getFieldValue('OP') == 'AND') ? 'and' : 'or'; + var order = (operator == 'and') ? Blockly.Lua.ORDER_AND : + Blockly.Lua.ORDER_OR; + var argument0 = Blockly.Lua.valueToCode(block, 'A', order); + var argument1 = Blockly.Lua.valueToCode(block, 'B', order); + if (!argument0 && !argument1) { + // If there are no arguments, then the return value is false. + argument0 = 'false'; + argument1 = 'false'; + } else { + // Single missing arguments have no effect on the return value. + var defaultArgument = (operator == 'and') ? 'true' : 'false'; + if (!argument0) { + argument0 = defaultArgument; + } + if (!argument1) { + argument1 = defaultArgument; + } + } + var code = argument0 + ' ' + operator + ' ' + argument1; + return [code, order]; +}; + +Blockly.Lua['logic_negate'] = function(block) { + // Negation. + var argument0 = Blockly.Lua.valueToCode(block, 'BOOL', + Blockly.Lua.ORDER_UNARY) || 'true'; + var code = 'not ' + argument0; + return [code, Blockly.Lua.ORDER_UNARY]; +}; + +Blockly.Lua['logic_boolean'] = function(block) { + // Boolean values true and false. + var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'true' : 'false'; + return [code, Blockly.Lua.ORDER_ATOMIC]; +}; + +Blockly.Lua['logic_null'] = function(block) { + // Null data type. + return ['nil', Blockly.Lua.ORDER_ATOMIC]; +}; + +Blockly.Lua['logic_ternary'] = function(block) { + // Ternary operator. + var value_if = Blockly.Lua.valueToCode(block, 'IF', + Blockly.Lua.ORDER_AND) || 'false'; + var value_then = Blockly.Lua.valueToCode(block, 'THEN', + Blockly.Lua.ORDER_AND) || 'nil'; + var value_else = Blockly.Lua.valueToCode(block, 'ELSE', + Blockly.Lua.ORDER_OR) || 'nil'; + var code = value_if + ' and ' + value_then + ' or ' + value_else; + return [code, Blockly.Lua.ORDER_OR]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/lua/loops.js b/src/opsoro/server/static/js/blockly/generators/lua/loops.js new file mode 100644 index 0000000..785398f --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/lua/loops.js @@ -0,0 +1,166 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for loop blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.loops'); + +goog.require('Blockly.Lua'); + + +/** + * This is the text used to implement a
        continue
        . + * It is also used to recognise
        continue
        s in generated code so that + * the appropriate label can be put at the end of the loop body. + * @const {string} + */ +Blockly.Lua.CONTINUE_STATEMENT = 'goto continue\n'; + +/** + * If the loop body contains a "goto continue" statement, add a continue label + * to the loop body. Slightly inefficient, as continue labels will be generated + * in all outer loops, but this is safer than duplicating the logic of + * blockToCode. + * + * @param {string} branch Generated code of the loop body + * @return {string} Generated label or '' if unnecessary + */ +Blockly.Lua.addContinueLabel = function(branch) { + if (branch.indexOf(Blockly.Lua.CONTINUE_STATEMENT) > -1) { + return branch + Blockly.Lua.INDENT + '::continue::\n'; + } else { + return branch; + } +}; + +Blockly.Lua['controls_repeat'] = function(block) { + // Repeat n times (internal number). + var repeats = parseInt(block.getFieldValue('TIMES'), 10); + var branch = Blockly.Lua.statementToCode(block, 'DO') || ''; + branch = Blockly.Lua.addContinueLabel(branch); + var loopVar = Blockly.Lua.variableDB_.getDistinctName( + 'count', Blockly.Variables.NAME_TYPE); + var code = 'for ' + loopVar + ' = 1, ' + repeats + ' do\n' + branch + 'end\n'; + return code; +}; + +Blockly.Lua['controls_repeat_ext'] = function(block) { + // Repeat n times (external number). + var repeats = Blockly.Lua.valueToCode(block, 'TIMES', + Blockly.Lua.ORDER_NONE) || '0'; + if (Blockly.isNumber(repeats)) { + repeats = parseInt(repeats, 10); + } else { + repeats = 'math.floor(' + repeats + ')'; + } + var branch = Blockly.Lua.statementToCode(block, 'DO') || '\n'; + branch = Blockly.Lua.addContinueLabel(branch); + var loopVar = Blockly.Lua.variableDB_.getDistinctName( + 'count', Blockly.Variables.NAME_TYPE); + var code = 'for ' + loopVar + ' = 1, ' + repeats + ' do\n' + + branch + 'end\n'; + return code; +}; + +Blockly.Lua['controls_whileUntil'] = function(block) { + // Do while/until loop. + var until = block.getFieldValue('MODE') == 'UNTIL'; + var argument0 = Blockly.Lua.valueToCode(block, 'BOOL', + until ? Blockly.Lua.ORDER_UNARY : + Blockly.Lua.ORDER_NONE) || 'false'; + var branch = Blockly.Lua.statementToCode(block, 'DO') || '\n'; + branch = Blockly.Lua.addLoopTrap(branch, block.id); + branch = Blockly.Lua.addContinueLabel(branch); + if (until) { + argument0 = 'not ' + argument0; + } + return 'while ' + argument0 + ' do\n' + branch + 'end\n'; +}; + +Blockly.Lua['controls_for'] = function(block) { + // For loop. + var variable0 = Blockly.Lua.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + var startVar = Blockly.Lua.valueToCode(block, 'FROM', + Blockly.Lua.ORDER_NONE) || '0'; + var endVar = Blockly.Lua.valueToCode(block, 'TO', + Blockly.Lua.ORDER_NONE) || '0'; + var increment = Blockly.Lua.valueToCode(block, 'BY', + Blockly.Lua.ORDER_NONE) || '1'; + var branch = Blockly.Lua.statementToCode(block, 'DO') || '\n'; + branch = Blockly.Lua.addLoopTrap(branch, block.id); + branch = Blockly.Lua.addContinueLabel(branch); + var code = ''; + var incValue; + if (Blockly.isNumber(startVar) && Blockly.isNumber(endVar) && + Blockly.isNumber(increment)) { + // All arguments are simple numbers. + var up = parseFloat(startVar) <= parseFloat(endVar); + var step = Math.abs(parseFloat(increment)); + incValue = (up ? '' : '-') + step; + } else { + code = ''; + // Determine loop direction at start, in case one of the bounds + // changes during loop execution. + incValue = Blockly.Lua.variableDB_.getDistinctName( + variable0 + '_inc', Blockly.Variables.NAME_TYPE); + code += incValue + ' = '; + if (Blockly.isNumber(increment)) { + code += Math.abs(increment) + '\n'; + } else { + code += 'math.abs(' + increment + ')\n'; + } + code += 'if (' + startVar + ') > (' + endVar + ') then\n'; + code += Blockly.Lua.INDENT + incValue + ' = -' + incValue + '\n'; + code += 'end\n'; + } + code += 'for ' + variable0 + ' = ' + startVar + ', ' + endVar + + ', ' + incValue; + code += ' do\n' + branch + 'end\n'; + return code; +}; + +Blockly.Lua['controls_forEach'] = function(block) { + // For each loop. + var variable0 = Blockly.Lua.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + var argument0 = Blockly.Lua.valueToCode(block, 'LIST', + Blockly.Lua.ORDER_NONE) || '{}'; + var branch = Blockly.Lua.statementToCode(block, 'DO') || '\n'; + branch = Blockly.Lua.addContinueLabel(branch); + var code = 'for _, ' + variable0 + ' in ipairs(' + argument0 + ') do \n' + + branch + 'end\n'; + return code; +}; + +Blockly.Lua['controls_flow_statements'] = function(block) { + // Flow statements: continue, break. + switch (block.getFieldValue('FLOW')) { + case 'BREAK': + return 'break\n'; + case 'CONTINUE': + return Blockly.Lua.CONTINUE_STATEMENT; + } + throw 'Unknown flow statement.'; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/lua/math.js b/src/opsoro/server/static/js/blockly/generators/lua/math.js new file mode 100644 index 0000000..c104bfc --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/lua/math.js @@ -0,0 +1,425 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for math blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.math'); + +goog.require('Blockly.Lua'); + + +Blockly.Lua['math_number'] = function(block) { + // Numeric value. + var code = parseFloat(block.getFieldValue('NUM')); + var order = code < 0 ? Blockly.Lua.ORDER_UNARY : + Blockly.Lua.ORDER_ATOMIC; + return [code, order]; +}; + +Blockly.Lua['math_arithmetic'] = function(block) { + // Basic arithmetic operators, and power. + var OPERATORS = { + ADD: [' + ', Blockly.Lua.ORDER_ADDITIVE], + MINUS: [' - ', Blockly.Lua.ORDER_ADDITIVE], + MULTIPLY: [' * ', Blockly.Lua.ORDER_MULTIPLICATIVE], + DIVIDE: [' / ', Blockly.Lua.ORDER_MULTIPLICATIVE], + POWER: [' ^ ', Blockly.Lua.ORDER_EXPONENTIATION] + }; + var tuple = OPERATORS[block.getFieldValue('OP')]; + var operator = tuple[0]; + var order = tuple[1]; + var argument0 = Blockly.Lua.valueToCode(block, 'A', order) || '0'; + var argument1 = Blockly.Lua.valueToCode(block, 'B', order) || '0'; + var code = argument0 + operator + argument1; + return [code, order]; +}; + +Blockly.Lua['math_single'] = function(block) { + // Math operators with single operand. + var operator = block.getFieldValue('OP'); + var code; + var arg; + if (operator == 'NEG') { + // Negation is a special case given its different operator precedence. + arg = Blockly.Lua.valueToCode(block, 'NUM', + Blockly.Lua.ORDER_UNARY) || '0'; + return ['-' + arg, Blockly.Lua.ORDER_UNARY]; + } + if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') { + arg = Blockly.Lua.valueToCode(block, 'NUM', + Blockly.Lua.ORDER_MULTIPLICATIVE) || '0'; + } else { + arg = Blockly.Lua.valueToCode(block, 'NUM', + Blockly.Lua.ORDER_NONE) || '0'; + } + switch (operator) { + case 'ABS': + code = 'math.abs(' + arg + ')'; + break; + case 'ROOT': + code = 'math.sqrt(' + arg + ')'; + break; + case 'LN': + code = 'math.log(' + arg + ')'; + break; + case 'LOG10': + code = 'math.log10(' + arg + ')'; + break; + case 'EXP': + code = 'math.exp(' + arg + ')'; + break; + case 'POW10': + code = 'math.pow(10,' + arg + ')'; + break; + case 'ROUND': + // This rounds up. Blockly does not specify rounding direction. + code = 'math.floor(' + arg + ' + .5)'; + break; + case 'ROUNDUP': + code = 'math.ceil(' + arg + ')'; + break; + case 'ROUNDDOWN': + code = 'math.floor(' + arg + ')'; + break; + case 'SIN': + code = 'math.sin(math.rad(' + arg + '))'; + break; + case 'COS': + code = 'math.cos(math.rad(' + arg + '))'; + break; + case 'TAN': + code = 'math.tan(math.rad(' + arg + '))'; + break; + case 'ASIN': + code = 'math.deg(math.asin(' + arg + '))'; + break; + case 'ACOS': + code = 'math.deg(math.acos(' + arg + '))'; + break; + case 'ATAN': + code = 'math.deg(math.atan(' + arg + '))'; + break; + default: + throw 'Unknown math operator: ' + operator; + } + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['math_constant'] = function(block) { + // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. + var CONSTANTS = { + PI: ['math.pi', Blockly.Lua.ORDER_HIGH], + E: ['math.exp(1)', Blockly.Lua.ORDER_HIGH], + GOLDEN_RATIO: ['(1 + math.sqrt(5)) / 2', Blockly.Lua.ORDER_MULTIPLICATIVE], + SQRT2: ['math.sqrt(2)', Blockly.Lua.ORDER_HIGH], + SQRT1_2: ['math.sqrt(1 / 2)', Blockly.Lua.ORDER_HIGH], + INFINITY: ['math.huge', Blockly.Lua.ORDER_HIGH] + }; + return CONSTANTS[block.getFieldValue('CONSTANT')]; +}; + +Blockly.Lua['math_number_property'] = function(block) { + // Check if a number is even, odd, prime, whole, positive, or negative + // or if it is divisible by certain number. Returns true or false. + var number_to_check = Blockly.Lua.valueToCode(block, 'NUMBER_TO_CHECK', + Blockly.Lua.ORDER_MULTIPLICATIVE) || '0'; + var dropdown_property = block.getFieldValue('PROPERTY'); + var code; + if (dropdown_property == 'PRIME') { + // Prime is a special case as it is not a one-liner test. + var functionName = Blockly.Lua.provideFunction_( + 'math_isPrime', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(n)', + ' -- https://en.wikipedia.org/wiki/Primality_test#Naive_methods', + ' if n == 2 or n == 3 then', + ' return true', + ' end', + ' -- False if n is NaN, negative, is 1, or not whole.', + ' -- And false if n is divisible by 2 or 3.', + ' if not(n > 1) or n % 1 ~= 0 or n % 2 == 0 or n % 3 == 0 then', + ' return false', + ' end', + ' -- Check all the numbers of form 6k +/- 1, up to sqrt(n).', + ' for x = 6, math.sqrt(n) + 1.5, 6 do', + ' if n % (x - 1) == 0 or n % (x + 1) == 0 then', + ' return false', + ' end', + ' end', + ' return true', + 'end']); + code = functionName + '(' + number_to_check + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; + } + switch (dropdown_property) { + case 'EVEN': + code = number_to_check + ' % 2 == 0'; + break; + case 'ODD': + code = number_to_check + ' % 2 == 1'; + break; + case 'WHOLE': + code = number_to_check + ' % 1 == 0'; + break; + case 'POSITIVE': + code = number_to_check + ' > 0'; + break; + case 'NEGATIVE': + code = number_to_check + ' < 0'; + break; + case 'DIVISIBLE_BY': + var divisor = Blockly.Lua.valueToCode(block, 'DIVISOR', + Blockly.Lua.ORDER_MULTIPLICATIVE); + // If 'divisor' is some code that evals to 0, Lua will produce a nan. + // Let's produce nil if we can determine this at compile-time. + if (!divisor || divisor == '0') { + return ['nil', Blockly.Lua.ORDER_ATOMIC]; + } + // The normal trick to implement ?: with and/or doesn't work here: + // divisor == 0 and nil or number_to_check % divisor == 0 + // because nil is false, so allow a runtime failure. :-( + code = number_to_check + ' % ' + divisor + ' == 0'; + break; + } + return [code, Blockly.Lua.ORDER_RELATIONAL]; +}; + +Blockly.Lua['math_change'] = function(block) { + // Add to a variable in place. + var argument0 = Blockly.Lua.valueToCode(block, 'DELTA', + Blockly.Lua.ORDER_ADDITIVE) || '0'; + var varName = Blockly.Lua.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + return varName + ' = ' + varName + ' + ' + argument0 + '\n'; +}; + +// Rounding functions have a single operand. +Blockly.Lua['math_round'] = Blockly.Lua['math_single']; +// Trigonometry functions have a single operand. +Blockly.Lua['math_trig'] = Blockly.Lua['math_single']; + +Blockly.Lua['math_on_list'] = function(block) { + // Math functions for lists. + var func = block.getFieldValue('OP'); + var list = Blockly.Lua.valueToCode(block, 'LIST', + Blockly.Lua.ORDER_NONE) || '{}'; + var functionName; + + // Functions needed in more than one case. + function provideSum() { + return Blockly.Lua.provideFunction_( + 'math_sum', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' local result = 0', + ' for _, v in ipairs(t) do', + ' result = result + v', + ' end', + ' return result', + 'end']); + } + + switch (func) { + case 'SUM': + functionName = provideSum(); + break; + + case 'MIN': + // Returns 0 for the empty list. + functionName = Blockly.Lua.provideFunction_( + 'math_min', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' if #t == 0 then', + ' return 0', + ' end', + ' local result = math.huge', + ' for _, v in ipairs(t) do', + ' if v < result then', + ' result = v', + ' end', + ' end', + ' return result', + 'end']); + break; + + case 'AVERAGE': + // Returns 0 for the empty list. + functionName = Blockly.Lua.provideFunction_( + 'math_average', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' if #t == 0 then', + ' return 0', + ' end', + ' return ' + provideSum() + '(t) / #t', + 'end']); + break; + + case 'MAX': + // Returns 0 for the empty list. + functionName = Blockly.Lua.provideFunction_( + 'math_max', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' if #t == 0 then', + ' return 0', + ' end', + ' local result = -math.huge', + ' for _, v in ipairs(t) do', + ' if v > result then', + ' result = v', + ' end', + ' end', + ' return result', + 'end']); + break; + + case 'MEDIAN': + functionName = Blockly.Lua.provideFunction_( + 'math_median', + // This operation excludes non-numbers. + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' -- Source: http://lua-users.org/wiki/SimpleStats', + ' if #t == 0 then', + ' return 0', + ' end', + ' local temp={}', + ' for _, v in ipairs(t) do', + ' if type(v) == "number" then', + ' table.insert(temp, v)', + ' end', + ' end', + ' table.sort(temp)', + ' if #temp % 2 == 0 then', + ' return (temp[#temp/2] + temp[(#temp/2)+1]) / 2', + ' else', + ' return temp[math.ceil(#temp/2)]', + ' end', + 'end']); + break; + + case 'MODE': + functionName = Blockly.Lua.provideFunction_( + 'math_modes', + // As a list of numbers can contain more than one mode, + // the returned result is provided as an array. + // The Lua version includes non-numbers. + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' -- Source: http://lua-users.org/wiki/SimpleStats', + ' local counts={}', + ' for _, v in ipairs(t) do', + ' if counts[v] == nil then', + ' counts[v] = 1', + ' else', + ' counts[v] = counts[v] + 1', + ' end', + ' end', + ' local biggestCount = 0', + ' for _, v in pairs(counts) do', + ' if v > biggestCount then', + ' biggestCount = v', + ' end', + ' end', + ' local temp={}', + ' for k, v in pairs(counts) do', + ' if v == biggestCount then', + ' table.insert(temp, k)', + ' end', + ' end', + ' return temp', + 'end']); + break; + + case 'STD_DEV': + functionName = Blockly.Lua.provideFunction_( + 'math_standard_deviation', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' local m', + ' local vm', + ' local total = 0', + ' local count = 0', + ' local result', + ' m = #t == 0 and 0 or ' + provideSum() + '(t) / #t', + ' for _, v in ipairs(t) do', + " if type(v) == 'number' then", + ' vm = v - m', + ' total = total + (vm * vm)', + ' count = count + 1', + ' end', + ' end', + ' result = math.sqrt(total / (count-1))', + ' return result', + 'end']); + break; + + case 'RANDOM': + functionName = Blockly.Lua.provideFunction_( + 'math_random_list', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' if #t == 0 then', + ' return nil', + ' end', + ' return t[math.random(#t)]', + 'end']); + break; + + default: + throw 'Unknown operator: ' + func; + } + return [functionName + '(' + list + ')', Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['math_modulo'] = function(block) { + // Remainder computation. + var argument0 = Blockly.Lua.valueToCode(block, 'DIVIDEND', + Blockly.Lua.ORDER_MULTIPLICATIVE) || '0'; + var argument1 = Blockly.Lua.valueToCode(block, 'DIVISOR', + Blockly.Lua.ORDER_MULTIPLICATIVE) || '0'; + var code = argument0 + ' % ' + argument1; + return [code, Blockly.Lua.ORDER_MULTIPLICATIVE]; +}; + +Blockly.Lua['math_constrain'] = function(block) { + // Constrain a number between two limits. + var argument0 = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_NONE) || '0'; + var argument1 = Blockly.Lua.valueToCode(block, 'LOW', + Blockly.Lua.ORDER_NONE) || '-math.huge'; + var argument2 = Blockly.Lua.valueToCode(block, 'HIGH', + Blockly.Lua.ORDER_NONE) || 'math.huge'; + var code = 'math.min(math.max(' + argument0 + ', ' + argument1 + '), ' + + argument2 + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['math_random_int'] = function(block) { + // Random integer between [X] and [Y]. + var argument0 = Blockly.Lua.valueToCode(block, 'FROM', + Blockly.Lua.ORDER_NONE) || '0'; + var argument1 = Blockly.Lua.valueToCode(block, 'TO', + Blockly.Lua.ORDER_NONE) || '0'; + var code = 'math.random(' + argument0 + ', ' + argument1 + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['math_random_float'] = function(block) { + // Random fraction between 0 and 1. + return ['math.random()', Blockly.Lua.ORDER_HIGH]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/lua/procedures.js b/src/opsoro/server/static/js/blockly/generators/lua/procedures.js new file mode 100644 index 0000000..b6d6cdd --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/lua/procedures.js @@ -0,0 +1,111 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for procedure blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.procedures'); + +goog.require('Blockly.Lua'); + + +Blockly.Lua['procedures_defreturn'] = function(block) { + // Define a procedure with a return value. + var funcName = Blockly.Lua.variableDB_.getName( + block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); + var branch = Blockly.Lua.statementToCode(block, 'STACK'); + if (Blockly.Lua.STATEMENT_PREFIX) { + branch = Blockly.Lua.prefixLines( + Blockly.Lua.STATEMENT_PREFIX.replace(/%1/g, + '\'' + block.id + '\''), Blockly.Lua.INDENT) + branch; + } + if (Blockly.Lua.INFINITE_LOOP_TRAP) { + branch = Blockly.Lua.INFINITE_LOOP_TRAP.replace(/%1/g, + '\'' + block.id + '\'') + branch; + } + var returnValue = Blockly.Lua.valueToCode(block, 'RETURN', + Blockly.Lua.ORDER_NONE) || ''; + if (returnValue) { + returnValue = ' return ' + returnValue + '\n'; + } else if (!branch) { + branch = ''; + } + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.Lua.variableDB_.getName(block.arguments_[i], + Blockly.Variables.NAME_TYPE); + } + var code = 'function ' + funcName + '(' + args.join(', ') + ')\n' + + branch + returnValue + 'end\n'; + code = Blockly.Lua.scrub_(block, code); + // Add % so as not to collide with helper functions in definitions list. + Blockly.Lua.definitions_['%' + funcName] = code; + return null; +}; + +// Defining a procedure without a return value uses the same generator as +// a procedure with a return value. +Blockly.Lua['procedures_defnoreturn'] = + Blockly.Lua['procedures_defreturn']; + +Blockly.Lua['procedures_callreturn'] = function(block) { + // Call a procedure with a return value. + var funcName = Blockly.Lua.variableDB_.getName( + block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.Lua.valueToCode(block, 'ARG' + i, + Blockly.Lua.ORDER_NONE) || 'nil'; + } + var code = funcName + '(' + args.join(', ') + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['procedures_callnoreturn'] = function(block) { + // Call a procedure with no return value. + var funcName = Blockly.Lua.variableDB_.getName( + block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.Lua.valueToCode(block, 'ARG' + i, + Blockly.Lua.ORDER_NONE) || 'nil'; + } + var code = funcName + '(' + args.join(', ') + ')\n'; + return code; +}; + +Blockly.Lua['procedures_ifreturn'] = function(block) { + // Conditionally return value from a procedure. + var condition = Blockly.Lua.valueToCode(block, 'CONDITION', + Blockly.Lua.ORDER_NONE) || 'false'; + var code = 'if ' + condition + ' then\n'; + if (block.hasReturnValue_) { + var value = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_NONE) || 'nil'; + code += ' return ' + value + '\n'; + } else { + code += ' return\n'; + } + code += 'end\n'; + return code; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/lua/text.js b/src/opsoro/server/static/js/blockly/generators/lua/text.js new file mode 100644 index 0000000..8a2ac91 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/lua/text.js @@ -0,0 +1,361 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for text blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.texts'); + +goog.require('Blockly.Lua'); + + +Blockly.Lua['text'] = function(block) { + // Text value. + var code = Blockly.Lua.quote_(block.getFieldValue('TEXT')); + return [code, Blockly.Lua.ORDER_ATOMIC]; +}; + +Blockly.Lua['text_join'] = function(block) { + // Create a string made up of any number of elements of any type. + if (block.itemCount_ == 0) { + return ['\'\'', Blockly.Lua.ORDER_ATOMIC]; + } else if (block.itemCount_ == 1) { + var element = Blockly.Lua.valueToCode(block, 'ADD0', + Blockly.Lua.ORDER_NONE) || '\'\''; + var code = 'tostring(' + element + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; + } else if (block.itemCount_ == 2) { + var element0 = Blockly.Lua.valueToCode(block, 'ADD0', + Blockly.Lua.ORDER_CONCATENATION) || '\'\''; + var element1 = Blockly.Lua.valueToCode(block, 'ADD1', + Blockly.Lua.ORDER_CONCATENATION) || '\'\''; + var code = element0 + ' .. ' + element1; + return [code, Blockly.Lua.ORDER_CONCATENATION]; + } else { + var elements = []; + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.Lua.valueToCode(block, 'ADD' + i, + Blockly.Lua.ORDER_NONE) || '\'\''; + } + var code = 'table.concat({' + elements.join(', ') + '})'; + return [code, Blockly.Lua.ORDER_HIGH]; + } +}; + +Blockly.Lua['text_append'] = function(block) { + // Append to a variable in place. + var varName = Blockly.Lua.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + var value = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_CONCATENATION) || '\'\''; + return varName + ' = ' + varName + ' .. ' + value + '\n'; +}; + +Blockly.Lua['text_length'] = function(block) { + // String or array length. + var text = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_UNARY) || '\'\''; + return ['#' + text, Blockly.Lua.ORDER_UNARY]; +}; + +Blockly.Lua['text_isEmpty'] = function(block) { + // Is the string null or array empty? + var text = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_UNARY) || '\'\''; + return ['#' + text + ' == 0', Blockly.Lua.ORDER_RELATIONAL]; +}; + +Blockly.Lua['text_indexOf'] = function(block) { + // Search the text for a substring. + var substring = Blockly.Lua.valueToCode(block, 'FIND', + Blockly.Lua.ORDER_NONE) || '\'\''; + var text = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_NONE) || '\'\''; + if (block.getFieldValue('END') == 'FIRST') { + var functionName = Blockly.Lua.provideFunction_( + 'firstIndexOf', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(str, substr) ', + ' local i = string.find(str, substr, 1, true)', + ' if i == nil then', + ' return 0', + ' else', + ' return i', + ' end', + 'end']); + } else { + var functionName = Blockly.Lua.provideFunction_( + 'lastIndexOf', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(str, substr)', + ' local i = string.find(string.reverse(str), ' + + 'string.reverse(substr), 1, true)', + ' if i then', + ' return #str + 2 - i - #substr', + ' end', + ' return 0', + 'end']); + } + var code = functionName + '(' + text + ', ' + substring + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_charAt'] = function(block) { + // Get letter at index. + // Note: Until January 2013 this block did not have the WHERE input. + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var atOrder = (where == 'FROM_END') ? Blockly.Lua.ORDER_UNARY : + Blockly.Lua.ORDER_NONE; + var at = Blockly.Lua.valueToCode(block, 'AT', atOrder) || '1'; + var text = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_NONE) || '\'\''; + var code; + if (where == 'RANDOM') { + var functionName = Blockly.Lua.provideFunction_( + 'text_random_letter', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(str)', + ' local index = math.random(string.len(str))', + ' return string.sub(str, index, index)', + 'end']); + code = functionName + '(' + text + ')'; + } else { + if (where == 'FIRST') { + var start = '1'; + } else if (where == 'LAST') { + var start = '-1'; + } else { + if (where == 'FROM_START') { + var start = at; + } else if (where == 'FROM_END') { + var start = '-' + at; + } else { + throw 'Unhandled option (text_charAt).'; + } + } + if (start.match(/^-?\w*$/)) { + code = 'string.sub(' + text + ', ' + start + ', ' + start + ')'; + } else { + // use function to avoid reevaluation + var functionName = Blockly.Lua.provideFunction_( + 'text_char_at', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(str, index)', + ' return string.sub(str, index, index)', + 'end']); + code = functionName + '(' + text + ', ' + start + ')'; + } + } + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_getSubstring'] = function(block) { + // Get substring. + var text = Blockly.Lua.valueToCode(block, 'STRING', + Blockly.Lua.ORDER_NONE) || '\'\''; + + // Get start index. + var where1 = block.getFieldValue('WHERE1'); + var at1Order = (where1 == 'FROM_END') ? Blockly.Lua.ORDER_UNARY : + Blockly.Lua.ORDER_NONE; + var at1 = Blockly.Lua.valueToCode(block, 'AT1', at1Order) || '1'; + if (where1 == 'FIRST') { + var start = 1; + } else if (where1 == 'FROM_START') { + var start = at1; + } else if (where1 == 'FROM_END') { + var start = '-' + at1; + } else { + throw 'Unhandled option (text_getSubstring)'; + } + + // Get end index. + var where2 = block.getFieldValue('WHERE2'); + var at2Order = (where2 == 'FROM_END') ? Blockly.Lua.ORDER_UNARY : + Blockly.Lua.ORDER_NONE; + var at2 = Blockly.Lua.valueToCode(block, 'AT2', at2Order) || '1'; + if (where2 == 'LAST') { + var end = -1; + } else if (where2 == 'FROM_START') { + var end = at2; + } else if (where2 == 'FROM_END') { + var end = '-' + at2; + } else { + throw 'Unhandled option (text_getSubstring)'; + } + var code = 'string.sub(' + text + ', ' + start + ', ' + end + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_changeCase'] = function(block) { + // Change capitalization. + var operator = block.getFieldValue('CASE'); + var text = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_NONE) || '\'\''; + if (operator == 'UPPERCASE') { + var functionName = 'string.upper'; + } else if (operator == 'LOWERCASE') { + var functionName = 'string.lower'; + } else if (operator == 'TITLECASE') { + var functionName = Blockly.Lua.provideFunction_( + 'text_titlecase', + // There are shorter versions at + // http://lua-users.org/wiki/SciteTitleCase + // that do not preserve whitespace. + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(str)', + ' local buf = {}', + ' local inWord = false', + ' for i = 1, #str do', + ' local c = string.sub(str, i, i)', + ' if inWord then', + ' table.insert(buf, string.lower(c))', + ' if string.find(c, "%s") then', + ' inWord = false', + ' end', + ' else', + ' table.insert(buf, string.upper(c))', + ' inWord = true', + ' end', + ' end', + ' return table.concat(buf)', + 'end']); + } + var code = functionName + '(' + text + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_trim'] = function(block) { + // Trim spaces. + var OPERATORS = { + LEFT: '^%s*(,-)', + RIGHT: '(.-)%s*$', + BOTH: '^%s*(.-)%s*$' + }; + var operator = OPERATORS[block.getFieldValue('MODE')]; + var text = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_NONE) || '\'\''; + var code = 'string.gsub(' + text + ', "' + operator + '", "%1")'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_print'] = function(block) { + // Print statement. + var msg = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_NONE) || '\'\''; + return 'print(' + msg + ')\n'; +}; + +Blockly.Lua['text_prompt_ext'] = function(block) { + // Prompt function. + if (block.getField('TEXT')) { + // Internal message. + var msg = Blockly.Lua.quote_(block.getFieldValue('TEXT')); + } else { + // External message. + var msg = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_NONE) || '\'\''; + } + + var functionName = Blockly.Lua.provideFunction_( + 'text_prompt', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(msg)', + ' io.write(msg)', + ' io.flush()', + ' return io.read()', + 'end']); + var code = functionName + '(' + msg + ')'; + + var toNumber = block.getFieldValue('TYPE') == 'NUMBER'; + if (toNumber) { + code = 'tonumber(' + code + ', 10)'; + } + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_prompt'] = Blockly.Lua['text_prompt_ext']; + +Blockly.Lua['text_count'] = function(block) { + var text = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_NONE) || '\'\''; + var sub = Blockly.Lua.valueToCode(block, 'SUB', + Blockly.Lua.ORDER_NONE) || '\'\''; + var functionName = Blockly.Lua.provideFunction_( + 'text_count', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(haystack, needle)', + ' if #needle == 0 then', + ' return #haystack + 1', + ' end', + ' local i = 1', + ' local count = 0', + ' while true do', + ' i = string.find(haystack, needle, i, true)', + ' if i == nil then', + ' break', + ' end', + ' count = count + 1', + ' i = i + #needle', + ' end', + ' return count', + 'end', + ]); + var code = functionName + '(' + text + ', ' + sub + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_replace'] = function(block) { + var text = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_NONE) || '\'\''; + var from = Blockly.Lua.valueToCode(block, 'FROM', + Blockly.Lua.ORDER_NONE) || '\'\''; + var to = Blockly.Lua.valueToCode(block, 'TO', + Blockly.Lua.ORDER_NONE) || '\'\''; + var functionName = Blockly.Lua.provideFunction_( + 'text_replace', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(haystack, needle, replacement)', + ' local buf = {}', + ' local i = 1', + ' while i <= #haystack do', + ' if string.sub(haystack, i, i + #needle - 1) == needle then', + ' for j = 1, #replacement do', + ' table.insert(buf, string.sub(replacement, j, j))', + ' end', + ' i = i + #needle', + ' else', + ' table.insert(buf, string.sub(haystack, i, i))', + ' i = i + 1', + ' end', + ' end', + ' return table.concat(buf)', + 'end', + ]); + var code = functionName + '(' + text + ', ' + from + ', ' + to + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_reverse'] = function(block) { + var text = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_HIGH) || '\'\''; + var code = 'string.reverse(' + text + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/lua/variables.js b/src/opsoro/server/static/js/blockly/generators/lua/variables.js new file mode 100644 index 0000000..10b53d1 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/lua/variables.js @@ -0,0 +1,46 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2016 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for variable blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.variables'); + +goog.require('Blockly.Lua'); + + +Blockly.Lua['variables_get'] = function(block) { + // Variable getter. + var code = Blockly.Lua.variableDB_.getName(block.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + return [code, Blockly.Lua.ORDER_ATOMIC]; +}; + +Blockly.Lua['variables_set'] = function(block) { + // Variable setter. + var argument0 = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_NONE) || '0'; + var varName = Blockly.Lua.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + return varName + ' = ' + argument0 + '\n'; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/php.js b/src/opsoro/server/static/js/blockly/generators/php.js new file mode 100644 index 0000000..3a54d7d --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/php.js @@ -0,0 +1,302 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2015 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Helper functions for generating PHP for blocks. + * @author daarond@gmail.com (Daaron Dwyer) + */ +'use strict'; + +goog.provide('Blockly.PHP'); + +goog.require('Blockly.Generator'); + + +/** + * PHP code generator. + * @type {!Blockly.Generator} + */ +Blockly.PHP = new Blockly.Generator('PHP'); + +/** + * List of illegal variable names. + * This is not intended to be a security feature. Blockly is 100% client-side, + * so bypassing this list is trivial. This is intended to prevent users from + * accidentally clobbering a built-in object or function. + * @private + */ +Blockly.PHP.addReservedWords( + // http://php.net/manual/en/reserved.keywords.php + '__halt_compiler,abstract,and,array,as,break,callable,case,catch,class,' + + 'clone,const,continue,declare,default,die,do,echo,else,elseif,empty,' + + 'enddeclare,endfor,endforeach,endif,endswitch,endwhile,eval,exit,extends,' + + 'final,for,foreach,function,global,goto,if,implements,include,' + + 'include_once,instanceof,insteadof,interface,isset,list,namespace,new,or,' + + 'print,private,protected,public,require,require_once,return,static,' + + 'switch,throw,trait,try,unset,use,var,while,xor,' + + // http://php.net/manual/en/reserved.constants.php + 'PHP_VERSION,PHP_MAJOR_VERSION,PHP_MINOR_VERSION,PHP_RELEASE_VERSION,' + + 'PHP_VERSION_ID,PHP_EXTRA_VERSION,PHP_ZTS,PHP_DEBUG,PHP_MAXPATHLEN,' + + 'PHP_OS,PHP_SAPI,PHP_EOL,PHP_INT_MAX,PHP_INT_SIZE,DEFAULT_INCLUDE_PATH,' + + 'PEAR_INSTALL_DIR,PEAR_EXTENSION_DIR,PHP_EXTENSION_DIR,PHP_PREFIX,' + + 'PHP_BINDIR,PHP_BINARY,PHP_MANDIR,PHP_LIBDIR,PHP_DATADIR,PHP_SYSCONFDIR,' + + 'PHP_LOCALSTATEDIR,PHP_CONFIG_FILE_PATH,PHP_CONFIG_FILE_SCAN_DIR,' + + 'PHP_SHLIB_SUFFIX,E_ERROR,E_WARNING,E_PARSE,E_NOTICE,E_CORE_ERROR,' + + 'E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,E_USER_ERROR,' + + 'E_USER_WARNING,E_USER_NOTICE,E_DEPRECATED,E_USER_DEPRECATED,E_ALL,' + + 'E_STRICT,__COMPILER_HALT_OFFSET__,TRUE,FALSE,NULL,__CLASS__,__DIR__,' + + '__FILE__,__FUNCTION__,__LINE__,__METHOD__,__NAMESPACE__,__TRAIT__' +); + +/** + * Order of operation ENUMs. + * http://php.net/manual/en/language.operators.precedence.php + */ +Blockly.PHP.ORDER_ATOMIC = 0; // 0 "" ... +Blockly.PHP.ORDER_CLONE = 1; // clone +Blockly.PHP.ORDER_NEW = 1; // new +Blockly.PHP.ORDER_MEMBER = 2.1; // [] +Blockly.PHP.ORDER_FUNCTION_CALL = 2.2; // () +Blockly.PHP.ORDER_POWER = 3; // ** +Blockly.PHP.ORDER_INCREMENT = 4; // ++ +Blockly.PHP.ORDER_DECREMENT = 4; // -- +Blockly.PHP.ORDER_BITWISE_NOT = 4; // ~ +Blockly.PHP.ORDER_CAST = 4; // (int) (float) (string) (array) ... +Blockly.PHP.ORDER_SUPPRESS_ERROR = 4; // @ +Blockly.PHP.ORDER_INSTANCEOF = 5; // instanceof +Blockly.PHP.ORDER_LOGICAL_NOT = 6; // ! +Blockly.PHP.ORDER_UNARY_PLUS = 7.1; // + +Blockly.PHP.ORDER_UNARY_NEGATION = 7.2; // - +Blockly.PHP.ORDER_MULTIPLICATION = 8.1; // * +Blockly.PHP.ORDER_DIVISION = 8.2; // / +Blockly.PHP.ORDER_MODULUS = 8.3; // % +Blockly.PHP.ORDER_ADDITION = 9.1; // + +Blockly.PHP.ORDER_SUBTRACTION = 9.2; // - +Blockly.PHP.ORDER_STRING_CONCAT = 9.3; // . +Blockly.PHP.ORDER_BITWISE_SHIFT = 10; // << >> +Blockly.PHP.ORDER_RELATIONAL = 11; // < <= > >= +Blockly.PHP.ORDER_EQUALITY = 12; // == != === !== <> <=> +Blockly.PHP.ORDER_REFERENCE = 13; // & +Blockly.PHP.ORDER_BITWISE_AND = 13; // & +Blockly.PHP.ORDER_BITWISE_XOR = 14; // ^ +Blockly.PHP.ORDER_BITWISE_OR = 15; // | +Blockly.PHP.ORDER_LOGICAL_AND = 16; // && +Blockly.PHP.ORDER_LOGICAL_OR = 17; // || +Blockly.PHP.ORDER_IF_NULL = 18; // ?? +Blockly.PHP.ORDER_CONDITIONAL = 19; // ?: +Blockly.PHP.ORDER_ASSIGNMENT = 20; // = += -= *= /= %= <<= >>= ... +Blockly.PHP.ORDER_LOGICAL_AND_WEAK = 21; // and +Blockly.PHP.ORDER_LOGICAL_XOR = 22; // xor +Blockly.PHP.ORDER_LOGICAL_OR_WEAK = 23; // or +Blockly.PHP.ORDER_COMMA = 24; // , +Blockly.PHP.ORDER_NONE = 99; // (...) + +/** + * List of outer-inner pairings that do NOT require parentheses. + * @type {!Array.>} + */ +Blockly.PHP.ORDER_OVERRIDES = [ + // (foo()).bar() -> foo().bar() + // (foo())[0] -> foo()[0] + [Blockly.PHP.ORDER_MEMBER, Blockly.PHP.ORDER_FUNCTION_CALL], + // (foo[0])[1] -> foo[0][1] + // (foo.bar).baz -> foo.bar.baz + [Blockly.PHP.ORDER_MEMBER, Blockly.PHP.ORDER_MEMBER], + // !(!foo) -> !!foo + [Blockly.PHP.ORDER_LOGICAL_NOT, Blockly.PHP.ORDER_LOGICAL_NOT], + // a * (b * c) -> a * b * c + [Blockly.PHP.ORDER_MULTIPLICATION, Blockly.PHP.ORDER_MULTIPLICATION], + // a + (b + c) -> a + b + c + [Blockly.PHP.ORDER_ADDITION, Blockly.PHP.ORDER_ADDITION], + // a && (b && c) -> a && b && c + [Blockly.PHP.ORDER_LOGICAL_AND, Blockly.PHP.ORDER_LOGICAL_AND], + // a || (b || c) -> a || b || c + [Blockly.PHP.ORDER_LOGICAL_OR, Blockly.PHP.ORDER_LOGICAL_OR] +]; + +/** + * Initialise the database of variable names. + * @param {!Blockly.Workspace} workspace Workspace to generate code from. + */ +Blockly.PHP.init = function(workspace) { + // Create a dictionary of definitions to be printed before the code. + Blockly.PHP.definitions_ = Object.create(null); + // Create a dictionary mapping desired function names in definitions_ + // to actual function names (to avoid collisions with user functions). + Blockly.PHP.functionNames_ = Object.create(null); + + if (!Blockly.PHP.variableDB_) { + Blockly.PHP.variableDB_ = + new Blockly.Names(Blockly.PHP.RESERVED_WORDS_, '$'); + } else { + Blockly.PHP.variableDB_.reset(); + } + + var defvars = []; + var variables = Blockly.Variables.allVariables(workspace); + for (var i = 0; i < variables.length; i++) { + defvars[i] = Blockly.PHP.variableDB_.getName(variables[i], + Blockly.Variables.NAME_TYPE) + ';'; + } + Blockly.PHP.definitions_['variables'] = defvars.join('\n'); +}; + +/** + * Prepend the generated code with the variable definitions. + * @param {string} code Generated code. + * @return {string} Completed code. + */ +Blockly.PHP.finish = function(code) { + // Convert the definitions dictionary into a list. + var definitions = []; + for (var name in Blockly.PHP.definitions_) { + definitions.push(Blockly.PHP.definitions_[name]); + } + // Clean up temporary data. + delete Blockly.PHP.definitions_; + delete Blockly.PHP.functionNames_; + Blockly.PHP.variableDB_.reset(); + return definitions.join('\n\n') + '\n\n\n' + code; +}; + +/** + * Naked values are top-level blocks with outputs that aren't plugged into + * anything. A trailing semicolon is needed to make this legal. + * @param {string} line Line of generated code. + * @return {string} Legal line of code. + */ +Blockly.PHP.scrubNakedValue = function(line) { + return line + ';\n'; +}; + +/** + * Encode a string as a properly escaped PHP string, complete with + * quotes. + * @param {string} string Text to encode. + * @return {string} PHP string. + * @private + */ +Blockly.PHP.quote_ = function(string) { + string = string.replace(/\\/g, '\\\\') + .replace(/\n/g, '\\\n') + .replace(/'/g, '\\\''); + return '\'' + string + '\''; +}; + +/** + * Common tasks for generating PHP from blocks. + * Handles comments for the specified block and any connected value blocks. + * Calls any statements following this block. + * @param {!Blockly.Block} block The current block. + * @param {string} code The PHP code created for this block. + * @return {string} PHP code with comments and subsequent blocks added. + * @private + */ +Blockly.PHP.scrub_ = function(block, code) { + var commentCode = ''; + // Only collect comments for blocks that aren't inline. + if (!block.outputConnection || !block.outputConnection.targetConnection) { + // Collect comment for this block. + var comment = block.getCommentText(); + comment = Blockly.utils.wrap(comment, Blockly.PHP.COMMENT_WRAP - 3); + if (comment) { + commentCode += Blockly.PHP.prefixLines(comment, '// ') + '\n'; + } + // Collect comments for all value arguments. + // Don't collect comments for nested statements. + for (var i = 0; i < block.inputList.length; i++) { + if (block.inputList[i].type == Blockly.INPUT_VALUE) { + var childBlock = block.inputList[i].connection.targetBlock(); + if (childBlock) { + var comment = Blockly.PHP.allNestedComments(childBlock); + if (comment) { + commentCode += Blockly.PHP.prefixLines(comment, '// '); + } + } + } + } + } + var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); + var nextCode = Blockly.PHP.blockToCode(nextBlock); + return commentCode + code + nextCode; +}; + +/** + * Gets a property and adjusts the value while taking into account indexing. + * @param {!Blockly.Block} block The block. + * @param {string} atId The property ID of the element to get. + * @param {number=} opt_delta Value to add. + * @param {boolean=} opt_negate Whether to negate the value. + * @param {number=} opt_order The highest order acting on this value. + * @return {string|number} + */ +Blockly.PHP.getAdjusted = function(block, atId, opt_delta, opt_negate, + opt_order) { + var delta = opt_delta || 0; + var order = opt_order || Blockly.PHP.ORDER_NONE; + if (block.workspace.options.oneBasedIndex) { + delta--; + } + var defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0'; + if (delta > 0) { + var at = Blockly.PHP.valueToCode(block, atId, + Blockly.PHP.ORDER_ADDITION) || defaultAtIndex; + } else if (delta < 0) { + var at = Blockly.PHP.valueToCode(block, atId, + Blockly.PHP.ORDER_SUBTRACTION) || defaultAtIndex; + } else if (opt_negate) { + var at = Blockly.PHP.valueToCode(block, atId, + Blockly.PHP.ORDER_UNARY_NEGATION) || defaultAtIndex; + } else { + var at = Blockly.PHP.valueToCode(block, atId, order) || + defaultAtIndex; + } + + if (Blockly.isNumber(at)) { + // If the index is a naked number, adjust it right now. + at = parseFloat(at) + delta; + if (opt_negate) { + at = -at; + } + } else { + // If the index is dynamic, adjust it in code. + if (delta > 0) { + at = at + ' + ' + delta; + var innerOrder = Blockly.PHP.ORDER_ADDITION; + } else if (delta < 0) { + at = at + ' - ' + -delta; + var innerOrder = Blockly.PHP.ORDER_SUBTRACTION; + } + if (opt_negate) { + if (delta) { + at = '-(' + at + ')'; + } else { + at = '-' + at; + } + var innerOrder = Blockly.PHP.ORDER_UNARY_NEGATION; + } + innerOrder = Math.floor(innerOrder); + order = Math.floor(order); + if (innerOrder && order >= innerOrder) { + at = '(' + at + ')'; + } + } + return at; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/php/colour.js b/src/opsoro/server/static/js/blockly/generators/php/colour.js new file mode 100644 index 0000000..e73c17a --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/php/colour.js @@ -0,0 +1,105 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2015 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating PHP for colour blocks. + * @author daarond@gmail.com (Daaron Dwyer) + */ +'use strict'; + +goog.provide('Blockly.PHP.colour'); + +goog.require('Blockly.PHP'); + + +Blockly.PHP['colour_picker'] = function(block) { + // Colour picker. + var code = '\'' + block.getFieldValue('COLOUR') + '\''; + return [code, Blockly.PHP.ORDER_ATOMIC]; +}; + +Blockly.PHP['colour_random'] = function(block) { + // Generate a random colour. + var functionName = Blockly.PHP.provideFunction_( + 'colour_random', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '() {', + ' return \'#\' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), ' + + '6, \'0\', STR_PAD_LEFT);', + '}']); + var code = functionName + '()'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['colour_rgb'] = function(block) { + // Compose a colour from RGB components expressed as percentages. + var red = Blockly.PHP.valueToCode(block, 'RED', + Blockly.PHP.ORDER_COMMA) || 0; + var green = Blockly.PHP.valueToCode(block, 'GREEN', + Blockly.PHP.ORDER_COMMA) || 0; + var blue = Blockly.PHP.valueToCode(block, 'BLUE', + Blockly.PHP.ORDER_COMMA) || 0; + var functionName = Blockly.PHP.provideFunction_( + 'colour_rgb', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($r, $g, $b) {', + ' $r = round(max(min($r, 100), 0) * 2.55);', + ' $g = round(max(min($g, 100), 0) * 2.55);', + ' $b = round(max(min($b, 100), 0) * 2.55);', + ' $hex = \'#\';', + ' $hex .= str_pad(dechex($r), 2, \'0\', STR_PAD_LEFT);', + ' $hex .= str_pad(dechex($g), 2, \'0\', STR_PAD_LEFT);', + ' $hex .= str_pad(dechex($b), 2, \'0\', STR_PAD_LEFT);', + ' return $hex;', + '}']); + var code = functionName + '(' + red + ', ' + green + ', ' + blue + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['colour_blend'] = function(block) { + // Blend two colours together. + var c1 = Blockly.PHP.valueToCode(block, 'COLOUR1', + Blockly.PHP.ORDER_COMMA) || '\'#000000\''; + var c2 = Blockly.PHP.valueToCode(block, 'COLOUR2', + Blockly.PHP.ORDER_COMMA) || '\'#000000\''; + var ratio = Blockly.PHP.valueToCode(block, 'RATIO', + Blockly.PHP.ORDER_COMMA) || 0.5; + var functionName = Blockly.PHP.provideFunction_( + 'colour_blend', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($c1, $c2, $ratio) {', + ' $ratio = max(min($ratio, 1), 0);', + ' $r1 = hexdec(substr($c1, 1, 2));', + ' $g1 = hexdec(substr($c1, 3, 2));', + ' $b1 = hexdec(substr($c1, 5, 2));', + ' $r2 = hexdec(substr($c2, 1, 2));', + ' $g2 = hexdec(substr($c2, 3, 2));', + ' $b2 = hexdec(substr($c2, 5, 2));', + ' $r = round($r1 * (1 - $ratio) + $r2 * $ratio);', + ' $g = round($g1 * (1 - $ratio) + $g2 * $ratio);', + ' $b = round($b1 * (1 - $ratio) + $b2 * $ratio);', + ' $hex = \'#\';', + ' $hex .= str_pad(dechex($r), 2, \'0\', STR_PAD_LEFT);', + ' $hex .= str_pad(dechex($g), 2, \'0\', STR_PAD_LEFT);', + ' $hex .= str_pad(dechex($b), 2, \'0\', STR_PAD_LEFT);', + ' return $hex;', + '}']); + var code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/php/lists.js b/src/opsoro/server/static/js/blockly/generators/php/lists.js new file mode 100644 index 0000000..3fd2616 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/php/lists.js @@ -0,0 +1,512 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2015 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating PHP for list blocks. + * @author daarond@gmail.com (Daaron Dwyer) + */ + +/* + * Lists in PHP are known to break when non-variables are passed into blocks + * that require a list. PHP, unlike other languages, passes arrays as reference + * value instead of value so we are unable to support it to the extent we can + * for the other languages. + * For example, a ternary operator with two arrays will return the array by + * value and that cannot be passed into any of the built-in array functions for + * PHP (because only variables can be passed by reference). + * ex: end(true ? list1 : list2) + */ +'use strict'; + +goog.provide('Blockly.PHP.lists'); + +goog.require('Blockly.PHP'); + + +Blockly.PHP['lists_create_empty'] = function(block) { + // Create an empty list. + return ['array()', Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['lists_create_with'] = function(block) { + // Create a list with any number of elements of any type. + var code = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + code[i] = Blockly.PHP.valueToCode(block, 'ADD' + i, + Blockly.PHP.ORDER_COMMA) || 'null'; + } + code = 'array(' + code.join(', ') + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['lists_repeat'] = function(block) { + // Create a list with one element repeated. + var functionName = Blockly.PHP.provideFunction_( + 'lists_repeat', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($value, $count) {', + ' $array = array();', + ' for ($index = 0; $index < $count; $index++) {', + ' $array[] = $value;', + ' }', + ' return $array;', + '}']); + var element = Blockly.PHP.valueToCode(block, 'ITEM', + Blockly.PHP.ORDER_COMMA) || 'null'; + var repeatCount = Blockly.PHP.valueToCode(block, 'NUM', + Blockly.PHP.ORDER_COMMA) || '0'; + var code = functionName + '(' + element + ', ' + repeatCount + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['lists_length'] = function(block) { + // String or array length. + var functionName = Blockly.PHP.provideFunction_( + 'length', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($value) {', + ' if (is_string($value)) {', + ' return strlen($value);', + ' } else {', + ' return count($value);', + ' }', + '}']); + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || '\'\''; + return [functionName + '(' + list + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['lists_isEmpty'] = function(block) { + // Is the string null or array empty? + var argument0 = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_FUNCTION_CALL) || 'array()'; + return ['empty(' + argument0 + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['lists_indexOf'] = function(block) { + // Find an item in the list. + var argument0 = Blockly.PHP.valueToCode(block, 'FIND', + Blockly.PHP.ORDER_NONE) || '\'\''; + var argument1 = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_MEMBER) || '[]'; + if (block.workspace.options.oneBasedIndex) { + var errorIndex = ' 0'; + var indexAdjustment = ' + 1'; + } else { + var errorIndex = ' -1'; + var indexAdjustment = ''; + } + if (block.getFieldValue('END') == 'FIRST') { + // indexOf + var functionName = Blockly.PHP.provideFunction_( + 'indexOf', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($haystack, $needle) {', + ' for ($index = 0; $index < count($haystack); $index++) {', + ' if ($haystack[$index] == $needle) return $index' + + indexAdjustment + ';', + ' }', + ' return ' + errorIndex + ';', + '}']); + } else { + // lastIndexOf + var functionName = Blockly.PHP.provideFunction_( + 'lastIndexOf', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($haystack, $needle) {', + ' $last = ' + errorIndex + ';', + ' for ($index = 0; $index < count($haystack); $index++) {', + ' if ($haystack[$index] == $needle) $last = $index' + + indexAdjustment + ';', + ' }', + ' return $last;', + '}']); + } + + var code = functionName + '(' + argument1 + ', ' + argument0 + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['lists_getIndex'] = function(block) { + // Get element at index. + var mode = block.getFieldValue('MODE') || 'GET'; + var where = block.getFieldValue('WHERE') || 'FROM_START'; + switch (where) { + case 'FIRST': + if (mode == 'GET') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_MEMBER) || 'array()'; + var code = list + '[0]'; + return [code, Blockly.PHP.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'array()'; + var code = 'array_shift(' + list + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'array()'; + return 'array_shift(' + list + ');\n'; + } + break; + case 'LAST': + if (mode == 'GET') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'array()'; + var code = 'end(' + list + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'GET_REMOVE') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'array()'; + var code = 'array_pop(' + list + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'array()'; + return 'array_pop(' + list + ');\n'; + } + break; + case 'FROM_START': + var at = Blockly.PHP.getAdjusted(block, 'AT'); + if (mode == 'GET') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_MEMBER) || 'array()'; + var code = list + '[' + at + ']'; + return [code, Blockly.PHP.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_COMMA) || 'array()'; + var code = 'array_splice(' + list + ', ' + at + ', 1)[0]'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_COMMA) || 'array()'; + return 'array_splice(' + list + ', ' + at + ', 1);\n'; + } + break; + case 'FROM_END': + if (mode == 'GET') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_COMMA) || 'array()'; + var at = Blockly.PHP.getAdjusted(block, 'AT', 1, true); + var code = 'array_slice(' + list + ', ' + at + ', 1)[0]'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'array()'; + var at = Blockly.PHP.getAdjusted(block, 'AT', 1, false, + Blockly.PHP.ORDER_SUBTRACTION); + code = 'array_splice(' + list + + ', count(' + list + ') - ' + at + ', 1)[0]'; + if (mode == 'GET_REMOVE') { + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return code + ';\n'; + } + } + break; + case 'RANDOM': + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'array()'; + if (mode == 'GET') { + var functionName = Blockly.PHP.provideFunction_( + 'lists_get_random_item', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($list) {', + ' return $list[rand(0,count($list)-1)];', + '}']); + code = functionName + '(' + list + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'GET_REMOVE') { + var functionName = Blockly.PHP.provideFunction_( + 'lists_get_remove_random_item', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '(&$list) {', + ' $x = rand(0,count($list)-1);', + ' unset($list[$x]);', + ' return array_values($list);', + '}']); + code = functionName + '(' + list + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + var functionName = Blockly.PHP.provideFunction_( + 'lists_remove_random_item', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '(&$list) {', + ' unset($list[rand(0,count($list)-1)]);', + '}']); + return functionName + '(' + list + ');\n'; + } + break; + } + throw 'Unhandled combination (lists_getIndex).'; +}; + +Blockly.PHP['lists_setIndex'] = function(block) { + // Set element at index. + // Note: Until February 2013 this block did not have MODE or WHERE inputs. + var mode = block.getFieldValue('MODE') || 'GET'; + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var value = Blockly.PHP.valueToCode(block, 'TO', + Blockly.PHP.ORDER_ASSIGNMENT) || 'null'; + // Cache non-trivial values to variables to prevent repeated look-ups. + // Closure, which accesses and modifies 'list'. + function cacheList() { + if (list.match(/^\$\w+$/)) { + return ''; + } + var listVar = Blockly.PHP.variableDB_.getDistinctName( + 'tmp_list', Blockly.Variables.NAME_TYPE); + var code = listVar + ' = &' + list + ';\n'; + list = listVar; + return code; + } + switch (where) { + case 'FIRST': + if (mode == 'SET') { + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_MEMBER) || 'array()'; + return list + '[0] = ' + value + ';\n'; + } else if (mode == 'INSERT') { + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_COMMA) || 'array()'; + return 'array_unshift(' + list + ', ' + value + ');\n'; + } + break; + case 'LAST': + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_COMMA) || 'array()'; + if (mode == 'SET') { + var functionName = Blockly.PHP.provideFunction_( + 'lists_set_last_item', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '(&$list, $value) {', + ' $list[count($list) - 1] = $value;', + '}']); + return functionName + '(' + list + ', ' + value + ');\n'; + } else if (mode == 'INSERT') { + return 'array_push(' + list + ', ' + value + ');\n'; + } + break; + case 'FROM_START': + var at = Blockly.PHP.getAdjusted(block, 'AT'); + if (mode == 'SET') { + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_MEMBER) || 'array()'; + return list + '[' + at + '] = ' + value + ';\n'; + } else if (mode == 'INSERT') { + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_COMMA) || 'array()'; + return 'array_splice(' + list + ', ' + at + ', 0, ' + value + ');\n'; + } + break; + case 'FROM_END': + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_COMMA) || 'array()'; + var at = Blockly.PHP.getAdjusted(block, 'AT', 1); + if (mode == 'SET') { + var functionName = Blockly.PHP.provideFunction_( + 'lists_set_from_end', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '(&$list, $at, $value) {', + ' $list[count($list) - $at] = $value;', + '}']); + return functionName + '(' + list + ', ' + at + ', ' + value + ');\n'; + } else if (mode == 'INSERT') { + var functionName = Blockly.PHP.provideFunction_( + 'lists_insert_from_end', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '(&$list, $at, $value) {', + ' return array_splice($list, count($list) - $at, 0, $value);', + '}']); + return functionName + '(' + list + ', ' + at + ', ' + value + ');\n'; + } + break; + case 'RANDOM': + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_REFERENCE) || 'array()'; + var code = cacheList(); + var xVar = Blockly.PHP.variableDB_.getDistinctName( + 'tmp_x', Blockly.Variables.NAME_TYPE); + code += xVar + ' = rand(0, count(' + list + ')-1);\n'; + if (mode == 'SET') { + code += list + '[' + xVar + '] = ' + value + ';\n'; + return code; + } else if (mode == 'INSERT') { + code += 'array_splice(' + list + ', ' + xVar + ', 0, ' + value + + ');\n'; + return code; + } + break; + } + throw 'Unhandled combination (lists_setIndex).'; +}; + +Blockly.PHP['lists_getSublist'] = function(block) { + // Get sublist. + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_COMMA) || 'array()'; + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + if (where1 == 'FIRST' && where2 == 'LAST') { + var code = list; + } else if (list.match(/^\$\w+$/) || + (where1 != 'FROM_END' && where2 == 'FROM_START')) { + // If the list is a simple value or doesn't require a call for length, don't + // generate a helper function. + switch (where1) { + case 'FROM_START': + var at1 = Blockly.PHP.getAdjusted(block, 'AT1'); + break; + case 'FROM_END': + var at1 = Blockly.PHP.getAdjusted(block, 'AT1', 1, false, + Blockly.PHP.ORDER_SUBTRACTION); + at1 = 'count(' + list + ') - ' + at1; + break; + case 'FIRST': + var at1 = '0'; + break; + default: + throw 'Unhandled option (lists_getSublist).'; + } + switch (where2) { + case 'FROM_START': + var at2 = Blockly.PHP.getAdjusted(block, 'AT2', 0, false, + Blockly.PHP.ORDER_SUBTRACTION); + var length = at2 + ' - '; + if (Blockly.isNumber(String(at1)) || String(at1).match(/^\(.+\)$/)) { + length += at1; + } else { + length += '(' + at1 + ')'; + } + length += ' + 1'; + break; + case 'FROM_END': + var at2 = Blockly.PHP.getAdjusted(block, 'AT2', 0, false, + Blockly.PHP.ORDER_SUBTRACTION); + var length = 'count(' + list + ') - ' + at2 + ' - '; + if (Blockly.isNumber(String(at1)) || String(at1).match(/^\(.+\)$/)) { + length += at1; + } else { + length += '(' + at1 + ')'; + } + break; + case 'LAST': + var length = 'count(' + list + ') - '; + if (Blockly.isNumber(String(at1)) || String(at1).match(/^\(.+\)$/)) { + length += at1; + } else { + length += '(' + at1 + ')'; + } + break; + default: + throw 'Unhandled option (lists_getSublist).'; + } + code = 'array_slice(' + list + ', ' + at1 + ', ' + length + ')'; + } else { + var at1 = Blockly.PHP.getAdjusted(block, 'AT1'); + var at2 = Blockly.PHP.getAdjusted(block, 'AT2'); + var functionName = Blockly.PHP.provideFunction_( + 'lists_get_sublist', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($list, $where1, $at1, $where2, $at2) {', + ' if ($where1 == \'FROM_END\') {', + ' $at1 = count($list) - 1 - $at1;', + ' } else if ($where1 == \'FIRST\') {', + ' $at1 = 0;', + ' } else if ($where1 != \'FROM_START\'){', + ' throw new Exception(\'Unhandled option (lists_get_sublist).\');', + ' }', + ' $length = 0;', + ' if ($where2 == \'FROM_START\') {', + ' $length = $at2 - $at1 + 1;', + ' } else if ($where2 == \'FROM_END\') {', + ' $length = count($list) - $at1 - $at2;', + ' } else if ($where2 == \'LAST\') {', + ' $length = count($list) - $at1;', + ' } else {', + ' throw new Exception(\'Unhandled option (lists_get_sublist).\');', + ' }', + ' return array_slice($list, $at1, $length);', + '}']); + var code = functionName + '(' + list + ', \'' + + where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; + } + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['lists_sort'] = function(block) { + // Block for sorting a list. + var listCode = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_COMMA) || 'array()'; + var direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1; + var type = block.getFieldValue('TYPE'); + var functionName = Blockly.PHP.provideFunction_( + 'lists_sort', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($list, $type, $direction) {', + ' $sortCmpFuncs = array(', + ' "NUMERIC" => "strnatcasecmp",', + ' "TEXT" => "strcmp",', + ' "IGNORE_CASE" => "strcasecmp"', + ' );', + ' $sortCmp = $sortCmpFuncs[$type];', + ' $list2 = $list;', // Clone list. + ' usort($list2, $sortCmp);', + ' if ($direction == -1) {', + ' $list2 = array_reverse($list2);', + ' }', + ' return $list2;', + '}']); + var sortCode = functionName + + '(' + listCode + ', "' + type + '", ' + direction + ')'; + return [sortCode, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['lists_split'] = function(block) { + // Block for splitting text into a list, or joining a list into text. + var value_input = Blockly.PHP.valueToCode(block, 'INPUT', + Blockly.PHP.ORDER_COMMA); + var value_delim = Blockly.PHP.valueToCode(block, 'DELIM', + Blockly.PHP.ORDER_COMMA) || '\'\''; + var mode = block.getFieldValue('MODE'); + if (mode == 'SPLIT') { + if (!value_input) { + value_input = '\'\''; + } + var functionName = 'explode'; + } else if (mode == 'JOIN') { + if (!value_input) { + value_input = 'array()'; + } + var functionName = 'implode'; + } else { + throw 'Unknown mode: ' + mode; + } + var code = functionName + '(' + value_delim + ', ' + value_input + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['lists_reverse'] = function(block) { + // Block for reversing a list. + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_COMMA) || '[]'; + var code = 'array_reverse(' + list + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/php/logic.js b/src/opsoro/server/static/js/blockly/generators/php/logic.js new file mode 100644 index 0000000..475d2f7 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/php/logic.js @@ -0,0 +1,129 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2015 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating PHP for logic blocks. + * @author daarond@gmail.com (Daaron Dwyer) + */ +'use strict'; + +goog.provide('Blockly.PHP.logic'); + +goog.require('Blockly.PHP'); + + +Blockly.PHP['controls_if'] = function(block) { + // If/elseif/else condition. + var n = 0; + var code = '', branchCode, conditionCode; + do { + conditionCode = Blockly.PHP.valueToCode(block, 'IF' + n, + Blockly.PHP.ORDER_NONE) || 'false'; + branchCode = Blockly.PHP.statementToCode(block, 'DO' + n); + code += (n > 0 ? ' else ' : '') + + 'if (' + conditionCode + ') {\n' + branchCode + '}'; + + ++n; + } while (block.getInput('IF' + n)); + + if (block.getInput('ELSE')) { + branchCode = Blockly.PHP.statementToCode(block, 'ELSE'); + code += ' else {\n' + branchCode + '}'; + } + return code + '\n'; +}; + +Blockly.PHP['controls_ifelse'] = Blockly.PHP['controls_if']; + +Blockly.PHP['logic_compare'] = function(block) { + // Comparison operator. + var OPERATORS = { + 'EQ': '==', + 'NEQ': '!=', + 'LT': '<', + 'LTE': '<=', + 'GT': '>', + 'GTE': '>=' + }; + var operator = OPERATORS[block.getFieldValue('OP')]; + var order = (operator == '==' || operator == '!=') ? + Blockly.PHP.ORDER_EQUALITY : Blockly.PHP.ORDER_RELATIONAL; + var argument0 = Blockly.PHP.valueToCode(block, 'A', order) || '0'; + var argument1 = Blockly.PHP.valueToCode(block, 'B', order) || '0'; + var code = argument0 + ' ' + operator + ' ' + argument1; + return [code, order]; +}; + +Blockly.PHP['logic_operation'] = function(block) { + // Operations 'and', 'or'. + var operator = (block.getFieldValue('OP') == 'AND') ? '&&' : '||'; + var order = (operator == '&&') ? Blockly.PHP.ORDER_LOGICAL_AND : + Blockly.PHP.ORDER_LOGICAL_OR; + var argument0 = Blockly.PHP.valueToCode(block, 'A', order); + var argument1 = Blockly.PHP.valueToCode(block, 'B', order); + if (!argument0 && !argument1) { + // If there are no arguments, then the return value is false. + argument0 = 'false'; + argument1 = 'false'; + } else { + // Single missing arguments have no effect on the return value. + var defaultArgument = (operator == '&&') ? 'true' : 'false'; + if (!argument0) { + argument0 = defaultArgument; + } + if (!argument1) { + argument1 = defaultArgument; + } + } + var code = argument0 + ' ' + operator + ' ' + argument1; + return [code, order]; +}; + +Blockly.PHP['logic_negate'] = function(block) { + // Negation. + var order = Blockly.PHP.ORDER_LOGICAL_NOT; + var argument0 = Blockly.PHP.valueToCode(block, 'BOOL', order) || + 'true'; + var code = '!' + argument0; + return [code, order]; +}; + +Blockly.PHP['logic_boolean'] = function(block) { + // Boolean values true and false. + var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'true' : 'false'; + return [code, Blockly.PHP.ORDER_ATOMIC]; +}; + +Blockly.PHP['logic_null'] = function(block) { + // Null data type. + return ['null', Blockly.PHP.ORDER_ATOMIC]; +}; + +Blockly.PHP['logic_ternary'] = function(block) { + // Ternary operator. + var value_if = Blockly.PHP.valueToCode(block, 'IF', + Blockly.PHP.ORDER_CONDITIONAL) || 'false'; + var value_then = Blockly.PHP.valueToCode(block, 'THEN', + Blockly.PHP.ORDER_CONDITIONAL) || 'null'; + var value_else = Blockly.PHP.valueToCode(block, 'ELSE', + Blockly.PHP.ORDER_CONDITIONAL) || 'null'; + var code = value_if + ' ? ' + value_then + ' : ' + value_else; + return [code, Blockly.PHP.ORDER_CONDITIONAL]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/php/loops.js b/src/opsoro/server/static/js/blockly/generators/php/loops.js new file mode 100644 index 0000000..f306b10 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/php/loops.js @@ -0,0 +1,164 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2015 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating PHP for loop blocks. + * @author daarond@gmail.com (Daaron Dwyer) + */ +'use strict'; + +goog.provide('Blockly.PHP.loops'); + +goog.require('Blockly.PHP'); + + +Blockly.PHP['controls_repeat_ext'] = function(block) { + // Repeat n times. + if (block.getField('TIMES')) { + // Internal number. + var repeats = String(Number(block.getFieldValue('TIMES'))); + } else { + // External number. + var repeats = Blockly.PHP.valueToCode(block, 'TIMES', + Blockly.PHP.ORDER_ASSIGNMENT) || '0'; + } + var branch = Blockly.PHP.statementToCode(block, 'DO'); + branch = Blockly.PHP.addLoopTrap(branch, block.id); + var code = ''; + var loopVar = Blockly.PHP.variableDB_.getDistinctName( + 'count', Blockly.Variables.NAME_TYPE); + var endVar = repeats; + if (!repeats.match(/^\w+$/) && !Blockly.isNumber(repeats)) { + var endVar = Blockly.PHP.variableDB_.getDistinctName( + 'repeat_end', Blockly.Variables.NAME_TYPE); + code += endVar + ' = ' + repeats + ';\n'; + } + code += 'for (' + loopVar + ' = 0; ' + + loopVar + ' < ' + endVar + '; ' + + loopVar + '++) {\n' + + branch + '}\n'; + return code; +}; + +Blockly.PHP['controls_repeat'] = Blockly.PHP['controls_repeat_ext']; + +Blockly.PHP['controls_whileUntil'] = function(block) { + // Do while/until loop. + var until = block.getFieldValue('MODE') == 'UNTIL'; + var argument0 = Blockly.PHP.valueToCode(block, 'BOOL', + until ? Blockly.PHP.ORDER_LOGICAL_NOT : + Blockly.PHP.ORDER_NONE) || 'false'; + var branch = Blockly.PHP.statementToCode(block, 'DO'); + branch = Blockly.PHP.addLoopTrap(branch, block.id); + if (until) { + argument0 = '!' + argument0; + } + return 'while (' + argument0 + ') {\n' + branch + '}\n'; +}; + +Blockly.PHP['controls_for'] = function(block) { + // For loop. + var variable0 = Blockly.PHP.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + var argument0 = Blockly.PHP.valueToCode(block, 'FROM', + Blockly.PHP.ORDER_ASSIGNMENT) || '0'; + var argument1 = Blockly.PHP.valueToCode(block, 'TO', + Blockly.PHP.ORDER_ASSIGNMENT) || '0'; + var increment = Blockly.PHP.valueToCode(block, 'BY', + Blockly.PHP.ORDER_ASSIGNMENT) || '1'; + var branch = Blockly.PHP.statementToCode(block, 'DO'); + branch = Blockly.PHP.addLoopTrap(branch, block.id); + var code; + if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && + Blockly.isNumber(increment)) { + // All arguments are simple numbers. + var up = parseFloat(argument0) <= parseFloat(argument1); + code = 'for (' + variable0 + ' = ' + argument0 + '; ' + + variable0 + (up ? ' <= ' : ' >= ') + argument1 + '; ' + + variable0; + var step = Math.abs(parseFloat(increment)); + if (step == 1) { + code += up ? '++' : '--'; + } else { + code += (up ? ' += ' : ' -= ') + step; + } + code += ') {\n' + branch + '}\n'; + } else { + code = ''; + // Cache non-trivial values to variables to prevent repeated look-ups. + var startVar = argument0; + if (!argument0.match(/^\w+$/) && !Blockly.isNumber(argument0)) { + startVar = Blockly.PHP.variableDB_.getDistinctName( + variable0 + '_start', Blockly.Variables.NAME_TYPE); + code += startVar + ' = ' + argument0 + ';\n'; + } + var endVar = argument1; + if (!argument1.match(/^\w+$/) && !Blockly.isNumber(argument1)) { + var endVar = Blockly.PHP.variableDB_.getDistinctName( + variable0 + '_end', Blockly.Variables.NAME_TYPE); + code += endVar + ' = ' + argument1 + ';\n'; + } + // Determine loop direction at start, in case one of the bounds + // changes during loop execution. + var incVar = Blockly.PHP.variableDB_.getDistinctName( + variable0 + '_inc', Blockly.Variables.NAME_TYPE); + code += incVar + ' = '; + if (Blockly.isNumber(increment)) { + code += Math.abs(increment) + ';\n'; + } else { + code += 'abs(' + increment + ');\n'; + } + code += 'if (' + startVar + ' > ' + endVar + ') {\n'; + code += Blockly.PHP.INDENT + incVar + ' = -' + incVar + ';\n'; + code += '}\n'; + code += 'for (' + variable0 + ' = ' + startVar + '; ' + + incVar + ' >= 0 ? ' + + variable0 + ' <= ' + endVar + ' : ' + + variable0 + ' >= ' + endVar + '; ' + + variable0 + ' += ' + incVar + ') {\n' + + branch + '}\n'; + } + return code; +}; + +Blockly.PHP['controls_forEach'] = function(block) { + // For each loop. + var variable0 = Blockly.PHP.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + var argument0 = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_ASSIGNMENT) || '[]'; + var branch = Blockly.PHP.statementToCode(block, 'DO'); + branch = Blockly.PHP.addLoopTrap(branch, block.id); + var code = ''; + code += 'foreach (' + argument0 + ' as ' + variable0 + + ') {\n' + branch + '}\n'; + return code; +}; + +Blockly.PHP['controls_flow_statements'] = function(block) { + // Flow statements: continue, break. + switch (block.getFieldValue('FLOW')) { + case 'BREAK': + return 'break;\n'; + case 'CONTINUE': + return 'continue;\n'; + } + throw 'Unknown flow statement.'; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/php/math.js b/src/opsoro/server/static/js/blockly/generators/php/math.js new file mode 100644 index 0000000..7789ba8 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/php/math.js @@ -0,0 +1,372 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2015 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating PHP for math blocks. + * @author daarond@gmail.com (Daaron Dwyer) + */ +'use strict'; + +goog.provide('Blockly.PHP.math'); + +goog.require('Blockly.PHP'); + + +Blockly.PHP['math_number'] = function(block) { + // Numeric value. + var code = parseFloat(block.getFieldValue('NUM')); + if (code == Infinity) { + code = 'INF'; + } else if (code == -Infinity) { + code = '-INF'; + } + return [code, Blockly.PHP.ORDER_ATOMIC]; +}; + +Blockly.PHP['math_arithmetic'] = function(block) { + // Basic arithmetic operators, and power. + var OPERATORS = { + 'ADD': [' + ', Blockly.PHP.ORDER_ADDITION], + 'MINUS': [' - ', Blockly.PHP.ORDER_SUBTRACTION], + 'MULTIPLY': [' * ', Blockly.PHP.ORDER_MULTIPLICATION], + 'DIVIDE': [' / ', Blockly.PHP.ORDER_DIVISION], + 'POWER': [' ** ', Blockly.PHP.ORDER_POWER] + }; + var tuple = OPERATORS[block.getFieldValue('OP')]; + var operator = tuple[0]; + var order = tuple[1]; + var argument0 = Blockly.PHP.valueToCode(block, 'A', order) || '0'; + var argument1 = Blockly.PHP.valueToCode(block, 'B', order) || '0'; + var code = argument0 + operator + argument1; + return [code, order]; +}; + +Blockly.PHP['math_single'] = function(block) { + // Math operators with single operand. + var operator = block.getFieldValue('OP'); + var code; + var arg; + if (operator == 'NEG') { + // Negation is a special case given its different operator precedence. + arg = Blockly.PHP.valueToCode(block, 'NUM', + Blockly.PHP.ORDER_UNARY_NEGATION) || '0'; + if (arg[0] == '-') { + // --3 is not legal in JS. + arg = ' ' + arg; + } + code = '-' + arg; + return [code, Blockly.PHP.ORDER_UNARY_NEGATION]; + } + if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') { + arg = Blockly.PHP.valueToCode(block, 'NUM', + Blockly.PHP.ORDER_DIVISION) || '0'; + } else { + arg = Blockly.PHP.valueToCode(block, 'NUM', + Blockly.PHP.ORDER_NONE) || '0'; + } + // First, handle cases which generate values that don't need parentheses + // wrapping the code. + switch (operator) { + case 'ABS': + code = 'abs(' + arg + ')'; + break; + case 'ROOT': + code = 'sqrt(' + arg + ')'; + break; + case 'LN': + code = 'log(' + arg + ')'; + break; + case 'EXP': + code = 'exp(' + arg + ')'; + break; + case 'POW10': + code = 'pow(10,' + arg + ')'; + break; + case 'ROUND': + code = 'round(' + arg + ')'; + break; + case 'ROUNDUP': + code = 'ceil(' + arg + ')'; + break; + case 'ROUNDDOWN': + code = 'floor(' + arg + ')'; + break; + case 'SIN': + code = 'sin(' + arg + ' / 180 * pi())'; + break; + case 'COS': + code = 'cos(' + arg + ' / 180 * pi())'; + break; + case 'TAN': + code = 'tan(' + arg + ' / 180 * pi())'; + break; + } + if (code) { + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } + // Second, handle cases which generate values that may need parentheses + // wrapping the code. + switch (operator) { + case 'LOG10': + code = 'log(' + arg + ') / log(10)'; + break; + case 'ASIN': + code = 'asin(' + arg + ') / pi() * 180'; + break; + case 'ACOS': + code = 'acos(' + arg + ') / pi() * 180'; + break; + case 'ATAN': + code = 'atan(' + arg + ') / pi() * 180'; + break; + default: + throw 'Unknown math operator: ' + operator; + } + return [code, Blockly.PHP.ORDER_DIVISION]; +}; + +Blockly.PHP['math_constant'] = function(block) { + // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. + var CONSTANTS = { + 'PI': ['M_PI', Blockly.PHP.ORDER_ATOMIC], + 'E': ['M_E', Blockly.PHP.ORDER_ATOMIC], + 'GOLDEN_RATIO': ['(1 + sqrt(5)) / 2', Blockly.PHP.ORDER_DIVISION], + 'SQRT2': ['M_SQRT2', Blockly.PHP.ORDER_ATOMIC], + 'SQRT1_2': ['M_SQRT1_2', Blockly.PHP.ORDER_ATOMIC], + 'INFINITY': ['INF', Blockly.PHP.ORDER_ATOMIC] + }; + return CONSTANTS[block.getFieldValue('CONSTANT')]; +}; + +Blockly.PHP['math_number_property'] = function(block) { + // Check if a number is even, odd, prime, whole, positive, or negative + // or if it is divisible by certain number. Returns true or false. + var number_to_check = Blockly.PHP.valueToCode(block, 'NUMBER_TO_CHECK', + Blockly.PHP.ORDER_MODULUS) || '0'; + var dropdown_property = block.getFieldValue('PROPERTY'); + var code; + if (dropdown_property == 'PRIME') { + // Prime is a special case as it is not a one-liner test. + var functionName = Blockly.PHP.provideFunction_( + 'math_isPrime', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($n) {', + ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods', + ' if ($n == 2 || $n == 3) {', + ' return true;', + ' }', + ' // False if n is NaN, negative, is 1, or not whole.', + ' // And false if n is divisible by 2 or 3.', + ' if (!is_numeric($n) || $n <= 1 || $n % 1 != 0 || $n % 2 == 0 ||' + + ' $n % 3 == 0) {', + ' return false;', + ' }', + ' // Check all the numbers of form 6k +/- 1, up to sqrt(n).', + ' for ($x = 6; $x <= sqrt($n) + 1; $x += 6) {', + ' if ($n % ($x - 1) == 0 || $n % ($x + 1) == 0) {', + ' return false;', + ' }', + ' }', + ' return true;', + '}']); + code = functionName + '(' + number_to_check + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } + switch (dropdown_property) { + case 'EVEN': + code = number_to_check + ' % 2 == 0'; + break; + case 'ODD': + code = number_to_check + ' % 2 == 1'; + break; + case 'WHOLE': + code = 'is_int(' + number_to_check + ')'; + break; + case 'POSITIVE': + code = number_to_check + ' > 0'; + break; + case 'NEGATIVE': + code = number_to_check + ' < 0'; + break; + case 'DIVISIBLE_BY': + var divisor = Blockly.PHP.valueToCode(block, 'DIVISOR', + Blockly.PHP.ORDER_MODULUS) || '0'; + code = number_to_check + ' % ' + divisor + ' == 0'; + break; + } + return [code, Blockly.PHP.ORDER_EQUALITY]; +}; + +Blockly.PHP['math_change'] = function(block) { + // Add to a variable in place. + var argument0 = Blockly.PHP.valueToCode(block, 'DELTA', + Blockly.PHP.ORDER_ADDITION) || '0'; + var varName = Blockly.PHP.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + return varName + ' += ' + argument0 + ';\n'; +}; + +// Rounding functions have a single operand. +Blockly.PHP['math_round'] = Blockly.PHP['math_single']; +// Trigonometry functions have a single operand. +Blockly.PHP['math_trig'] = Blockly.PHP['math_single']; + +Blockly.PHP['math_on_list'] = function(block) { + // Math functions for lists. + var func = block.getFieldValue('OP'); + var list, code; + switch (func) { + case 'SUM': + list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_FUNCTION_CALL) || 'array()'; + code = 'array_sum(' + list + ')'; + break; + case 'MIN': + list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_FUNCTION_CALL) || 'array()'; + code = 'min(' + list + ')'; + break; + case 'MAX': + list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_FUNCTION_CALL) || 'array()'; + code = 'max(' + list + ')'; + break; + case 'AVERAGE': + var functionName = Blockly.PHP.provideFunction_( + 'math_mean', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($myList) {', + ' return array_sum($myList) / count($myList);', + '}']); + list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_NONE) || 'array()'; + code = functionName + '(' + list + ')'; + break; + case 'MEDIAN': + var functionName = Blockly.PHP.provideFunction_( + 'math_median', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($arr) {', + ' sort($arr,SORT_NUMERIC);', + ' return (count($arr) % 2) ? $arr[floor(count($arr)/2)] : ', + ' ($arr[floor(count($arr)/2)] + $arr[floor(count($arr)/2)' + + ' - 1]) / 2;', + '}']); + list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_NONE) || '[]'; + code = functionName + '(' + list + ')'; + break; + case 'MODE': + // As a list of numbers can contain more than one mode, + // the returned result is provided as an array. + // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]. + var functionName = Blockly.PHP.provideFunction_( + 'math_modes', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($values) {', + ' if (empty($values)) return array();', + ' $counts = array_count_values($values);', + ' arsort($counts); // Sort counts in descending order', + ' $modes = array_keys($counts, current($counts), true);', + ' return $modes;', + '}']); + list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_NONE) || '[]'; + code = functionName + '(' + list + ')'; + break; + case 'STD_DEV': + var functionName = Blockly.PHP.provideFunction_( + 'math_standard_deviation', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($numbers) {', + ' $n = count($numbers);', + ' if (!$n) return null;', + ' $mean = array_sum($numbers) / count($numbers);', + ' foreach($numbers as $key => $num) $devs[$key] = ' + + 'pow($num - $mean, 2);', + ' return sqrt(array_sum($devs) / (count($devs) - 1));', + '}']); + list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_NONE) || '[]'; + code = functionName + '(' + list + ')'; + break; + case 'RANDOM': + var functionName = Blockly.PHP.provideFunction_( + 'math_random_list', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($list) {', + ' $x = rand(0, count($list)-1);', + ' return $list[$x];', + '}']); + list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_NONE) || '[]'; + code = functionName + '(' + list + ')'; + break; + default: + throw 'Unknown operator: ' + func; + } + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['math_modulo'] = function(block) { + // Remainder computation. + var argument0 = Blockly.PHP.valueToCode(block, 'DIVIDEND', + Blockly.PHP.ORDER_MODULUS) || '0'; + var argument1 = Blockly.PHP.valueToCode(block, 'DIVISOR', + Blockly.PHP.ORDER_MODULUS) || '0'; + var code = argument0 + ' % ' + argument1; + return [code, Blockly.PHP.ORDER_MODULUS]; +}; + +Blockly.PHP['math_constrain'] = function(block) { + // Constrain a number between two limits. + var argument0 = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_COMMA) || '0'; + var argument1 = Blockly.PHP.valueToCode(block, 'LOW', + Blockly.PHP.ORDER_COMMA) || '0'; + var argument2 = Blockly.PHP.valueToCode(block, 'HIGH', + Blockly.PHP.ORDER_COMMA) || 'Infinity'; + var code = 'min(max(' + argument0 + ', ' + argument1 + '), ' + + argument2 + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['math_random_int'] = function(block) { + // Random integer between [X] and [Y]. + var argument0 = Blockly.PHP.valueToCode(block, 'FROM', + Blockly.PHP.ORDER_COMMA) || '0'; + var argument1 = Blockly.PHP.valueToCode(block, 'TO', + Blockly.PHP.ORDER_COMMA) || '0'; + var functionName = Blockly.PHP.provideFunction_( + 'math_random_int', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($a, $b) {', + ' if ($a > $b) {', + ' return rand($b, $a);', + ' }', + ' return rand($a, $b);', + '}']); + var code = functionName + '(' + argument0 + ', ' + argument1 + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['math_random_float'] = function(block) { + // Random fraction between 0 and 1. + return ['(float)rand()/(float)getrandmax()', Blockly.PHP.ORDER_FUNCTION_CALL]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/php/procedures.js b/src/opsoro/server/static/js/blockly/generators/php/procedures.js new file mode 100644 index 0000000..537b973 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/php/procedures.js @@ -0,0 +1,119 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2015 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating PHP for procedure blocks. + * @author daarond@gmail.com (Daaron Dwyer) + */ +'use strict'; + +goog.provide('Blockly.PHP.procedures'); + +goog.require('Blockly.PHP'); + +Blockly.PHP['procedures_defreturn'] = function(block) { + // Define a procedure with a return value. + // First, add a 'global' statement for every variable that is not shadowed by + // a local parameter. + var globals = []; + for (var i = 0, varName; varName = block.workspace.variableList[i]; i++) { + if (block.arguments_.indexOf(varName) == -1) { + globals.push(Blockly.PHP.variableDB_.getName(varName, + Blockly.Variables.NAME_TYPE)); + } + } + globals = globals.length ? ' global ' + globals.join(', ') + ';\n' : ''; + + var funcName = Blockly.PHP.variableDB_.getName( + block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); + var branch = Blockly.PHP.statementToCode(block, 'STACK'); + if (Blockly.PHP.STATEMENT_PREFIX) { + branch = Blockly.PHP.prefixLines( + Blockly.PHP.STATEMENT_PREFIX.replace(/%1/g, + '\'' + block.id + '\''), Blockly.PHP.INDENT) + branch; + } + if (Blockly.PHP.INFINITE_LOOP_TRAP) { + branch = Blockly.PHP.INFINITE_LOOP_TRAP.replace(/%1/g, + '\'' + block.id + '\'') + branch; + } + var returnValue = Blockly.PHP.valueToCode(block, 'RETURN', + Blockly.PHP.ORDER_NONE) || ''; + if (returnValue) { + returnValue = ' return ' + returnValue + ';\n'; + } + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.PHP.variableDB_.getName(block.arguments_[i], + Blockly.Variables.NAME_TYPE); + } + var code = 'function ' + funcName + '(' + args.join(', ') + ') {\n' + + globals + branch + returnValue + '}'; + code = Blockly.PHP.scrub_(block, code); + // Add % so as not to collide with helper functions in definitions list. + Blockly.PHP.definitions_['%' + funcName] = code; + return null; +}; + +// Defining a procedure without a return value uses the same generator as +// a procedure with a return value. +Blockly.PHP['procedures_defnoreturn'] = + Blockly.PHP['procedures_defreturn']; + +Blockly.PHP['procedures_callreturn'] = function(block) { + // Call a procedure with a return value. + var funcName = Blockly.PHP.variableDB_.getName( + block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.PHP.valueToCode(block, 'ARG' + i, + Blockly.PHP.ORDER_COMMA) || 'null'; + } + var code = funcName + '(' + args.join(', ') + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['procedures_callnoreturn'] = function(block) { + // Call a procedure with no return value. + var funcName = Blockly.PHP.variableDB_.getName( + block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.PHP.valueToCode(block, 'ARG' + i, + Blockly.PHP.ORDER_COMMA) || 'null'; + } + var code = funcName + '(' + args.join(', ') + ');\n'; + return code; +}; + +Blockly.PHP['procedures_ifreturn'] = function(block) { + // Conditionally return value from a procedure. + var condition = Blockly.PHP.valueToCode(block, 'CONDITION', + Blockly.PHP.ORDER_NONE) || 'false'; + var code = 'if (' + condition + ') {\n'; + if (block.hasReturnValue_) { + var value = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'null'; + code += ' return ' + value + ';\n'; + } else { + code += ' return;\n'; + } + code += '}\n'; + return code; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/php/text.js b/src/opsoro/server/static/js/blockly/generators/php/text.js new file mode 100644 index 0000000..7903d31 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/php/text.js @@ -0,0 +1,279 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2015 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating PHP for text blocks. + * @author daarond@gmail.com (Daaron Dwyer) + */ +'use strict'; + +goog.provide('Blockly.PHP.texts'); + +goog.require('Blockly.PHP'); + + +Blockly.PHP['text'] = function(block) { + // Text value. + var code = Blockly.PHP.quote_(block.getFieldValue('TEXT')); + return [code, Blockly.PHP.ORDER_ATOMIC]; +}; + +Blockly.PHP['text_join'] = function(block) { + // Create a string made up of any number of elements of any type. + if (block.itemCount_ == 0) { + return ['\'\'', Blockly.PHP.ORDER_ATOMIC]; + } else if (block.itemCount_ == 1) { + var element = Blockly.PHP.valueToCode(block, 'ADD0', + Blockly.PHP.ORDER_NONE) || '\'\''; + var code = element; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (block.itemCount_ == 2) { + var element0 = Blockly.PHP.valueToCode(block, 'ADD0', + Blockly.PHP.ORDER_NONE) || '\'\''; + var element1 = Blockly.PHP.valueToCode(block, 'ADD1', + Blockly.PHP.ORDER_NONE) || '\'\''; + var code = element0 + ' . ' + element1; + return [code, Blockly.PHP.ORDER_ADDITION]; + } else { + var elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.PHP.valueToCode(block, 'ADD' + i, + Blockly.PHP.ORDER_COMMA) || '\'\''; + } + var code = 'implode(\'\', array(' + elements.join(',') + '))'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } +}; + +Blockly.PHP['text_append'] = function(block) { + // Append to a variable in place. + var varName = Blockly.PHP.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + var value = Blockly.PHP.valueToCode(block, 'TEXT', + Blockly.PHP.ORDER_ASSIGNMENT) || '\'\''; + return varName + ' .= ' + value + ';\n'; +}; + +Blockly.PHP['text_length'] = function(block) { + // String or array length. + var functionName = Blockly.PHP.provideFunction_( + 'length', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($value) {', + ' if (is_string($value)) {', + ' return strlen($value);', + ' } else {', + ' return count($value);', + ' }', + '}']); + var text = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || '\'\''; + return [functionName + '(' + text + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['text_isEmpty'] = function(block) { + // Is the string null or array empty? + var text = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || '\'\''; + return ['empty(' + text + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['text_indexOf'] = function(block) { + // Search the text for a substring. + var operator = block.getFieldValue('END') == 'FIRST' ? + 'strpos' : 'strrpos'; + var substring = Blockly.PHP.valueToCode(block, 'FIND', + Blockly.PHP.ORDER_NONE) || '\'\''; + var text = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || '\'\''; + if (block.workspace.options.oneBasedIndex) { + var errorIndex = ' 0'; + var indexAdjustment = ' + 1'; + } else { + var errorIndex = ' -1'; + var indexAdjustment = ''; + } + var functionName = Blockly.PHP.provideFunction_( + block.getFieldValue('END') == 'FIRST' ? + 'text_indexOf' : 'text_lastIndexOf', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($text, $search) {', + ' $pos = ' + operator + '($text, $search);', + ' return $pos === false ? ' + errorIndex + ' : $pos' + + indexAdjustment + ';', + '}']); + var code = functionName + '(' + text + ', ' + substring + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['text_charAt'] = function(block) { + // Get letter at index. + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var textOrder = (where == 'RANDOM') ? Blockly.PHP.ORDER_NONE : + Blockly.PHP.ORDER_COMMA; + var text = Blockly.PHP.valueToCode(block, 'VALUE', textOrder) || '\'\''; + switch (where) { + case 'FIRST': + var code = 'substr(' + text + ', 0, 1)'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + case 'LAST': + var code = 'substr(' + text + ', -1)'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + case 'FROM_START': + var at = Blockly.PHP.getAdjusted(block, 'AT'); + var code = 'substr(' + text + ', ' + at + ', 1)'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + case 'FROM_END': + var at = Blockly.PHP.getAdjusted(block, 'AT', 1, true); + var code = 'substr(' + text + ', ' + at + ', 1)'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + case 'RANDOM': + var functionName = Blockly.PHP.provideFunction_( + 'text_random_letter', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($text) {', + ' return $text[rand(0, strlen($text) - 1)];', + '}']); + code = functionName + '(' + text + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } + throw 'Unhandled option (text_charAt).'; +}; + +Blockly.PHP['text_getSubstring'] = function(block) { + // Get substring. + var text = Blockly.PHP.valueToCode(block, 'STRING', + Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + if (where1 == 'FIRST' && where2 == 'LAST') { + var code = text; + } else { + var at1 = Blockly.PHP.getAdjusted(block, 'AT1'); + var at2 = Blockly.PHP.getAdjusted(block, 'AT2'); + var functionName = Blockly.PHP.provideFunction_( + 'text_get_substring', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($text, $where1, $at1, $where2, $at2) {', + ' if ($where1 == \'FROM_END\') {', + ' $at1 = strlen($text) - 1 - $at1;', + ' } else if ($where1 == \'FIRST\') {', + ' $at1 = 0;', + ' } else if ($where1 != \'FROM_START\'){', + ' throw new Exception(\'Unhandled option (text_get_substring).\');', + ' }', + ' $length = 0;', + ' if ($where2 == \'FROM_START\') {', + ' $length = $at2 - $at1 + 1;', + ' } else if ($where2 == \'FROM_END\') {', + ' $length = strlen($text) - $at1 - $at2;', + ' } else if ($where2 == \'LAST\') {', + ' $length = strlen($text) - $at1;', + ' } else {', + ' throw new Exception(\'Unhandled option (text_get_substring).\');', + ' }', + ' return substr($text, $at1, $length);', + '}']); + var code = functionName + '(' + text + ', \'' + + where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; + } + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['text_changeCase'] = function(block) { + // Change capitalization. + var text = Blockly.PHP.valueToCode(block, 'TEXT', + Blockly.PHP.ORDER_NONE) || '\'\''; + if (block.getFieldValue('CASE') == 'UPPERCASE') { + var code = 'strtoupper(' + text + ')'; + } else if (block.getFieldValue('CASE') == 'LOWERCASE') { + var code = 'strtolower(' + text + ')'; + } else if (block.getFieldValue('CASE') == 'TITLECASE') { + var code = 'ucwords(strtolower(' + text + '))'; + } + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['text_trim'] = function(block) { + // Trim spaces. + var OPERATORS = { + 'LEFT': 'ltrim', + 'RIGHT': 'rtrim', + 'BOTH': 'trim' + }; + var operator = OPERATORS[block.getFieldValue('MODE')]; + var text = Blockly.PHP.valueToCode(block, 'TEXT', + Blockly.PHP.ORDER_NONE) || '\'\''; + return [operator + '(' + text + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['text_print'] = function(block) { + // Print statement. + var msg = Blockly.PHP.valueToCode(block, 'TEXT', + Blockly.PHP.ORDER_NONE) || '\'\''; + return 'print(' + msg + ');\n'; +}; + +Blockly.PHP['text_prompt_ext'] = function(block) { + // Prompt function. + if (block.getField('TEXT')) { + // Internal message. + var msg = Blockly.PHP.quote_(block.getFieldValue('TEXT')); + } else { + // External message. + var msg = Blockly.PHP.valueToCode(block, 'TEXT', + Blockly.PHP.ORDER_NONE) || '\'\''; + } + var code = 'readline(' + msg + ')'; + var toNumber = block.getFieldValue('TYPE') == 'NUMBER'; + if (toNumber) { + code = 'floatval(' + code + ')'; + } + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['text_prompt'] = Blockly.PHP['text_prompt_ext']; + +Blockly.PHP['text_count'] = function(block) { + var text = Blockly.PHP.valueToCode(block, 'TEXT', + Blockly.PHP.ORDER_MEMBER) || '\'\''; + var sub = Blockly.PHP.valueToCode(block, 'SUB', + Blockly.PHP.ORDER_NONE) || '\'\''; + var code = 'strlen(' + sub + ') === 0' + + ' ? strlen(' + text + ') + 1' + + ' : substr_count(' + text + ', ' + sub + ')'; + return [code, Blockly.PHP.ORDER_CONDITIONAL]; +}; + +Blockly.PHP['text_replace'] = function(block) { + var text = Blockly.PHP.valueToCode(block, 'TEXT', + Blockly.PHP.ORDER_MEMBER) || '\'\''; + var from = Blockly.PHP.valueToCode(block, 'FROM', + Blockly.PHP.ORDER_NONE) || '\'\''; + var to = Blockly.PHP.valueToCode(block, 'TO', + Blockly.PHP.ORDER_NONE) || '\'\''; + var code = 'str_replace(' + from + ', ' + to + ', ' + text + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['text_reverse'] = function(block) { + var text = Blockly.PHP.valueToCode(block, 'TEXT', + Blockly.PHP.ORDER_MEMBER) || '\'\''; + var code = 'strrev(' + text + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/php/variables.js b/src/opsoro/server/static/js/blockly/generators/php/variables.js new file mode 100644 index 0000000..466774b --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/php/variables.js @@ -0,0 +1,46 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2015 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating PHP for variable blocks. + * @author daarond@gmail.com (Daaron Dwyer) + */ +'use strict'; + +goog.provide('Blockly.PHP.variables'); + +goog.require('Blockly.PHP'); + + +Blockly.PHP['variables_get'] = function(block) { + // Variable getter. + var code = Blockly.PHP.variableDB_.getName(block.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + return [code, Blockly.PHP.ORDER_ATOMIC]; +}; + +Blockly.PHP['variables_set'] = function(block) { + // Variable setter. + var argument0 = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_ASSIGNMENT) || '0'; + var varName = Blockly.PHP.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + return varName + ' = ' + argument0 + ';\n'; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/python.js b/src/opsoro/server/static/js/blockly/generators/python.js new file mode 100644 index 0000000..82cc9bb --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/python.js @@ -0,0 +1,313 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Helper functions for generating Python for blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Python'); + +goog.require('Blockly.Generator'); + + +/** + * Python code generator. + * @type {!Blockly.Generator} + */ +Blockly.Python = new Blockly.Generator('Python'); + +/** + * List of illegal variable names. + * This is not intended to be a security feature. Blockly is 100% client-side, + * so bypassing this list is trivial. This is intended to prevent users from + * accidentally clobbering a built-in object or function. + * @private + */ +Blockly.Python.addReservedWords( + // import keyword + // print(','.join(sorted(keyword.kwlist))) + // https://docs.python.org/3/reference/lexical_analysis.html#keywords + // https://docs.python.org/2/reference/lexical_analysis.html#keywords + 'False,None,True,and,as,assert,break,class,continue,def,del,elif,else,' + + 'except,exec,finally,for,from,global,if,import,in,is,lambda,nonlocal,not,' + + 'or,pass,print,raise,return,try,while,with,yield,' + + // https://docs.python.org/3/library/constants.html + // https://docs.python.org/2/library/constants.html + 'NotImplemented,Ellipsis,__debug__,quit,exit,copyright,license,credits,' + + // >>> print(','.join(sorted(dir(__builtins__)))) + // https://docs.python.org/3/library/functions.html + // https://docs.python.org/2/library/functions.html + 'ArithmeticError,AssertionError,AttributeError,BaseException,' + + 'BlockingIOError,BrokenPipeError,BufferError,BytesWarning,' + + 'ChildProcessError,ConnectionAbortedError,ConnectionError,' + + 'ConnectionRefusedError,ConnectionResetError,DeprecationWarning,EOFError,' + + 'Ellipsis,EnvironmentError,Exception,FileExistsError,FileNotFoundError,' + + 'FloatingPointError,FutureWarning,GeneratorExit,IOError,ImportError,' + + 'ImportWarning,IndentationError,IndexError,InterruptedError,' + + 'IsADirectoryError,KeyError,KeyboardInterrupt,LookupError,MemoryError,' + + 'ModuleNotFoundError,NameError,NotADirectoryError,NotImplemented,' + + 'NotImplementedError,OSError,OverflowError,PendingDeprecationWarning,' + + 'PermissionError,ProcessLookupError,RecursionError,ReferenceError,' + + 'ResourceWarning,RuntimeError,RuntimeWarning,StandardError,' + + 'StopAsyncIteration,StopIteration,SyntaxError,SyntaxWarning,SystemError,' + + 'SystemExit,TabError,TimeoutError,TypeError,UnboundLocalError,' + + 'UnicodeDecodeError,UnicodeEncodeError,UnicodeError,' + + 'UnicodeTranslateError,UnicodeWarning,UserWarning,ValueError,Warning,' + + 'ZeroDivisionError,_,__build_class__,__debug__,__doc__,__import__,' + + '__loader__,__name__,__package__,__spec__,abs,all,any,apply,ascii,' + + 'basestring,bin,bool,buffer,bytearray,bytes,callable,chr,classmethod,cmp,' + + 'coerce,compile,complex,copyright,credits,delattr,dict,dir,divmod,' + + 'enumerate,eval,exec,execfile,exit,file,filter,float,format,frozenset,' + + 'getattr,globals,hasattr,hash,help,hex,id,input,int,intern,isinstance,' + + 'issubclass,iter,len,license,list,locals,long,map,max,memoryview,min,' + + 'next,object,oct,open,ord,pow,print,property,quit,range,raw_input,reduce,' + + 'reload,repr,reversed,round,set,setattr,slice,sorted,staticmethod,str,' + + 'sum,super,tuple,type,unichr,unicode,vars,xrange,zip' +); + +/** + * Order of operation ENUMs. + * http://docs.python.org/reference/expressions.html#summary + */ +Blockly.Python.ORDER_ATOMIC = 0; // 0 "" ... +Blockly.Python.ORDER_COLLECTION = 1; // tuples, lists, dictionaries +Blockly.Python.ORDER_STRING_CONVERSION = 1; // `expression...` +Blockly.Python.ORDER_MEMBER = 2.1; // . [] +Blockly.Python.ORDER_FUNCTION_CALL = 2.2; // () +Blockly.Python.ORDER_EXPONENTIATION = 3; // ** +Blockly.Python.ORDER_UNARY_SIGN = 4; // + - +Blockly.Python.ORDER_BITWISE_NOT = 4; // ~ +Blockly.Python.ORDER_MULTIPLICATIVE = 5; // * / // % +Blockly.Python.ORDER_ADDITIVE = 6; // + - +Blockly.Python.ORDER_BITWISE_SHIFT = 7; // << >> +Blockly.Python.ORDER_BITWISE_AND = 8; // & +Blockly.Python.ORDER_BITWISE_XOR = 9; // ^ +Blockly.Python.ORDER_BITWISE_OR = 10; // | +Blockly.Python.ORDER_RELATIONAL = 11; // in, not in, is, is not, + // <, <=, >, >=, <>, !=, == +Blockly.Python.ORDER_LOGICAL_NOT = 12; // not +Blockly.Python.ORDER_LOGICAL_AND = 13; // and +Blockly.Python.ORDER_LOGICAL_OR = 14; // or +Blockly.Python.ORDER_CONDITIONAL = 15; // if else +Blockly.Python.ORDER_LAMBDA = 16; // lambda +Blockly.Python.ORDER_NONE = 99; // (...) + +/** + * List of outer-inner pairings that do NOT require parentheses. + * @type {!Array.>} + */ +Blockly.Python.ORDER_OVERRIDES = [ + // (foo()).bar -> foo().bar + // (foo())[0] -> foo()[0] + [Blockly.Python.ORDER_FUNCTION_CALL, Blockly.Python.ORDER_MEMBER], + // (foo())() -> foo()() + [Blockly.Python.ORDER_FUNCTION_CALL, Blockly.Python.ORDER_FUNCTION_CALL], + // (foo.bar).baz -> foo.bar.baz + // (foo.bar)[0] -> foo.bar[0] + // (foo[0]).bar -> foo[0].bar + // (foo[0])[1] -> foo[0][1] + [Blockly.Python.ORDER_MEMBER, Blockly.Python.ORDER_MEMBER], + // (foo.bar)() -> foo.bar() + // (foo[0])() -> foo[0]() + [Blockly.Python.ORDER_MEMBER, Blockly.Python.ORDER_FUNCTION_CALL], + + // not (not foo) -> not not foo + [Blockly.Python.ORDER_LOGICAL_NOT, Blockly.Python.ORDER_LOGICAL_NOT], + // a and (b and c) -> a and b and c + [Blockly.Python.ORDER_LOGICAL_AND, Blockly.Python.ORDER_LOGICAL_AND], + // a or (b or c) -> a or b or c + [Blockly.Python.ORDER_LOGICAL_OR, Blockly.Python.ORDER_LOGICAL_OR] +]; + +/** + * Initialise the database of variable names. + * @param {!Blockly.Workspace} workspace Workspace to generate code from. + */ +Blockly.Python.init = function(workspace) { + /** + * Empty loops or conditionals are not allowed in Python. + */ + Blockly.Python.PASS = this.INDENT + 'pass\n'; + // Create a dictionary of definitions to be printed before the code. + Blockly.Python.definitions_ = Object.create(null); + // Create a dictionary mapping desired function names in definitions_ + // to actual function names (to avoid collisions with user functions). + Blockly.Python.functionNames_ = Object.create(null); + + if (!Blockly.Python.variableDB_) { + Blockly.Python.variableDB_ = + new Blockly.Names(Blockly.Python.RESERVED_WORDS_); + } else { + Blockly.Python.variableDB_.reset(); + } + + var defvars = []; + var variables = workspace.variableList; + for (var i = 0; i < variables.length; i++) { + defvars[i] = Blockly.Python.variableDB_.getName(variables[i], + Blockly.Variables.NAME_TYPE) + ' = None'; + } + Blockly.Python.definitions_['variables'] = defvars.join('\n'); +}; + +/** + * Prepend the generated code with the variable definitions. + * @param {string} code Generated code. + * @return {string} Completed code. + */ +Blockly.Python.finish = function(code) { + // Convert the definitions dictionary into a list. + var imports = []; + var definitions = []; + for (var name in Blockly.Python.definitions_) { + var def = Blockly.Python.definitions_[name]; + if (def.match(/^(from\s+\S+\s+)?import\s+\S+/)) { + imports.push(def); + } else { + definitions.push(def); + } + } + // Clean up temporary data. + delete Blockly.Python.definitions_; + delete Blockly.Python.functionNames_; + Blockly.Python.variableDB_.reset(); + var allDefs = imports.join('\n') + '\n\n' + definitions.join('\n\n'); + return allDefs.replace(/\n\n+/g, '\n\n').replace(/\n*$/, '\n\n\n') + code; +}; + +/** + * Naked values are top-level blocks with outputs that aren't plugged into + * anything. + * @param {string} line Line of generated code. + * @return {string} Legal line of code. + */ +Blockly.Python.scrubNakedValue = function(line) { + return line + '\n'; +}; + +/** + * Encode a string as a properly escaped Python string, complete with quotes. + * @param {string} string Text to encode. + * @return {string} Python string. + * @private + */ +Blockly.Python.quote_ = function(string) { + // Can't use goog.string.quote since % must also be escaped. + string = string.replace(/\\/g, '\\\\') + .replace(/\n/g, '\\\n') + .replace(/\%/g, '\\%'); + + // Follow the CPython behaviour of repr() for a non-byte string. + var quote = '\''; + if (string.indexOf('\'') !== -1) { + if (string.indexOf('"') === -1) { + quote = '"'; + } else { + string = string.replace(/'/g, '\\\''); + } + }; + return quote + string + quote; +}; + +/** + * Common tasks for generating Python from blocks. + * Handles comments for the specified block and any connected value blocks. + * Calls any statements following this block. + * @param {!Blockly.Block} block The current block. + * @param {string} code The Python code created for this block. + * @return {string} Python code with comments and subsequent blocks added. + * @private + */ +Blockly.Python.scrub_ = function(block, code) { + var commentCode = ''; + // Only collect comments for blocks that aren't inline. + if (!block.outputConnection || !block.outputConnection.targetConnection) { + // Collect comment for this block. + var comment = block.getCommentText(); + comment = Blockly.utils.wrap(comment, Blockly.Python.COMMENT_WRAP - 3); + if (comment) { + if (block.getProcedureDef) { + // Use a comment block for function comments. + commentCode += '"""' + comment + '\n"""\n'; + } else { + commentCode += Blockly.Python.prefixLines(comment + '\n', '# '); + } + } + // Collect comments for all value arguments. + // Don't collect comments for nested statements. + for (var i = 0; i < block.inputList.length; i++) { + if (block.inputList[i].type == Blockly.INPUT_VALUE) { + var childBlock = block.inputList[i].connection.targetBlock(); + if (childBlock) { + var comment = Blockly.Python.allNestedComments(childBlock); + if (comment) { + commentCode += Blockly.Python.prefixLines(comment, '# '); + } + } + } + } + } + var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); + var nextCode = Blockly.Python.blockToCode(nextBlock); + return commentCode + code + nextCode; +}; + +/** + * Gets a property and adjusts the value, taking into account indexing, and + * casts to an integer. + * @param {!Blockly.Block} block The block. + * @param {string} atId The property ID of the element to get. + * @param {number=} opt_delta Value to add. + * @param {boolean=} opt_negate Whether to negate the value. + * @return {string|number} + */ +Blockly.Python.getAdjustedInt = function(block, atId, opt_delta, opt_negate) { + var delta = opt_delta || 0; + if (block.workspace.options.oneBasedIndex) { + delta--; + } + var defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0'; + var atOrder = delta ? Blockly.Python.ORDER_ADDITIVE : + Blockly.Python.ORDER_NONE; + var at = Blockly.Python.valueToCode(block, atId, atOrder) || defaultAtIndex; + + if (Blockly.isNumber(at)) { + // If the index is a naked number, adjust it right now. + at = parseInt(at, 10) + delta; + if (opt_negate) { + at = -at; + } + } else { + // If the index is dynamic, adjust it in code. + if (delta > 0) { + at = 'int(' + at + ' + ' + delta + ')'; + } else if (delta < 0) { + at = 'int(' + at + ' - ' + -delta + ')'; + } else { + at = 'int(' + at + ')'; + } + if (opt_negate) { + at = '-' + at; + } + } + return at; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/python/colour.js b/src/opsoro/server/static/js/blockly/generators/python/colour.js new file mode 100644 index 0000000..68666a8 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/python/colour.js @@ -0,0 +1,86 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Python for colour blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Python.colour'); + +goog.require('Blockly.Python'); + + +Blockly.Python['colour_picker'] = function(block) { + // Colour picker. + var code = '\'' + block.getFieldValue('COLOUR') + '\''; + return [code, Blockly.Python.ORDER_ATOMIC]; +}; + +Blockly.Python['colour_random'] = function(block) { + // Generate a random colour. + Blockly.Python.definitions_['import_random'] = 'import random'; + var code = '\'#%06x\' % random.randint(0, 2**24 - 1)'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['colour_rgb'] = function(block) { + // Compose a colour from RGB components expressed as percentages. + var functionName = Blockly.Python.provideFunction_( + 'colour_rgb', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(r, g, b):', + ' r = round(min(100, max(0, r)) * 2.55)', + ' g = round(min(100, max(0, g)) * 2.55)', + ' b = round(min(100, max(0, b)) * 2.55)', + ' return \'#%02x%02x%02x\' % (r, g, b)']); + var r = Blockly.Python.valueToCode(block, 'RED', + Blockly.Python.ORDER_NONE) || 0; + var g = Blockly.Python.valueToCode(block, 'GREEN', + Blockly.Python.ORDER_NONE) || 0; + var b = Blockly.Python.valueToCode(block, 'BLUE', + Blockly.Python.ORDER_NONE) || 0; + var code = functionName + '(' + r + ', ' + g + ', ' + b + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['colour_blend'] = function(block) { + // Blend two colours together. + var functionName = Blockly.Python.provideFunction_( + 'colour_blend', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + + '(colour1, colour2, ratio):', + ' r1, r2 = int(colour1[1:3], 16), int(colour2[1:3], 16)', + ' g1, g2 = int(colour1[3:5], 16), int(colour2[3:5], 16)', + ' b1, b2 = int(colour1[5:7], 16), int(colour2[5:7], 16)', + ' ratio = min(1, max(0, ratio))', + ' r = round(r1 * (1 - ratio) + r2 * ratio)', + ' g = round(g1 * (1 - ratio) + g2 * ratio)', + ' b = round(b1 * (1 - ratio) + b2 * ratio)', + ' return \'#%02x%02x%02x\' % (r, g, b)']); + var colour1 = Blockly.Python.valueToCode(block, 'COLOUR1', + Blockly.Python.ORDER_NONE) || '\'#000000\''; + var colour2 = Blockly.Python.valueToCode(block, 'COLOUR2', + Blockly.Python.ORDER_NONE) || '\'#000000\''; + var ratio = Blockly.Python.valueToCode(block, 'RATIO', + Blockly.Python.ORDER_NONE) || 0; + var code = functionName + '(' + colour1 + ', ' + colour2 + ', ' + ratio + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/python/lists.js b/src/opsoro/server/static/js/blockly/generators/python/lists.js new file mode 100644 index 0000000..3d29acf --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/python/lists.js @@ -0,0 +1,363 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Python for list blocks. + * @author q.neutron@gmail.com (Quynh Neutron) + */ +'use strict'; + +goog.provide('Blockly.Python.lists'); + +goog.require('Blockly.Python'); + + +Blockly.Python['lists_create_empty'] = function(block) { + // Create an empty list. + return ['[]', Blockly.Python.ORDER_ATOMIC]; +}; + +Blockly.Python['lists_create_with'] = function(block) { + // Create a list with any number of elements of any type. + var elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.Python.valueToCode(block, 'ADD' + i, + Blockly.Python.ORDER_NONE) || 'None'; + } + var code = '[' + elements.join(', ') + ']'; + return [code, Blockly.Python.ORDER_ATOMIC]; +}; + +Blockly.Python['lists_repeat'] = function(block) { + // Create a list with one element repeated. + var item = Blockly.Python.valueToCode(block, 'ITEM', + Blockly.Python.ORDER_NONE) || 'None'; + var times = Blockly.Python.valueToCode(block, 'NUM', + Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; + var code = '[' + item + '] * ' + times; + return [code, Blockly.Python.ORDER_MULTIPLICATIVE]; +}; + +Blockly.Python['lists_length'] = function(block) { + // String or array length. + var list = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_NONE) || '[]'; + return ['len(' + list + ')', Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['lists_isEmpty'] = function(block) { + // Is the string null or array empty? + var list = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_NONE) || '[]'; + var code = 'not len(' + list + ')'; + return [code, Blockly.Python.ORDER_LOGICAL_NOT]; +}; + +Blockly.Python['lists_indexOf'] = function(block) { + // Find an item in the list. + var item = Blockly.Python.valueToCode(block, 'FIND', + Blockly.Python.ORDER_NONE) || '[]'; + var list = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_NONE) || '\'\''; + if (block.workspace.options.oneBasedIndex) { + var errorIndex = ' 0'; + var firstIndexAdjustment = ' + 1'; + var lastIndexAdjustment = ''; + } else { + var errorIndex = ' -1'; + var firstIndexAdjustment = ''; + var lastIndexAdjustment = ' - 1'; + } + if (block.getFieldValue('END') == 'FIRST') { + var functionName = Blockly.Python.provideFunction_( + 'first_index', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + + '(my_list, elem):', + ' try: index = my_list.index(elem)' + firstIndexAdjustment, + ' except: index =' + errorIndex, + ' return index']); + var code = functionName + '(' + list + ', ' + item + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } + var functionName = Blockly.Python.provideFunction_( + 'last_index', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(my_list, elem):', + ' try: index = len(my_list) - my_list[::-1].index(elem)' + + lastIndexAdjustment, + ' except: index =' + errorIndex, + ' return index']); + var code = functionName + '(' + list + ', ' + item + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['lists_getIndex'] = function(block) { + // Get element at index. + // Note: Until January 2013 this block did not have MODE or WHERE inputs. + var mode = block.getFieldValue('MODE') || 'GET'; + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var listOrder = (where == 'RANDOM') ? Blockly.Python.ORDER_NONE : + Blockly.Python.ORDER_MEMBER; + var list = Blockly.Python.valueToCode(block, 'VALUE', listOrder) || '[]'; + + switch (where) { + case 'FIRST': + if (mode == 'GET') { + var code = list + '[0]'; + return [code, Blockly.Python.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.pop(0)'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return list + '.pop(0)\n'; + } + break; + case 'LAST': + if (mode == 'GET') { + var code = list + '[-1]'; + return [code, Blockly.Python.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.pop()'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return list + '.pop()\n'; + } + break; + case 'FROM_START': + var at = Blockly.Python.getAdjustedInt(block, 'AT'); + if (mode == 'GET') { + var code = list + '[' + at + ']'; + return [code, Blockly.Python.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.pop(' + at + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return list + '.pop(' + at + ')\n'; + } + break; + case'FROM_END': + var at = Blockly.Python.getAdjustedInt(block, 'AT', 1, true); + if (mode == 'GET') { + var code = list + '[' + at + ']'; + return [code, Blockly.Python.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.pop(' + at + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return list + '.pop(' + at + ')\n'; + } + break; + case 'RANDOM': + Blockly.Python.definitions_['import_random'] = 'import random'; + if (mode == 'GET') { + code = 'random.choice(' + list + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } else { + var functionName = Blockly.Python.provideFunction_( + 'lists_remove_random_item', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList):', + ' x = int(random.random() * len(myList))', + ' return myList.pop(x)']); + code = functionName + '(' + list + ')'; + if (mode == 'GET_REMOVE') { + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return code + '\n'; + } + } + break; + } + throw 'Unhandled combination (lists_getIndex).'; +}; + +Blockly.Python['lists_setIndex'] = function(block) { + // Set element at index. + // Note: Until February 2013 this block did not have MODE or WHERE inputs. + var list = Blockly.Python.valueToCode(block, 'LIST', + Blockly.Python.ORDER_MEMBER) || '[]'; + var mode = block.getFieldValue('MODE') || 'GET'; + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var value = Blockly.Python.valueToCode(block, 'TO', + Blockly.Python.ORDER_NONE) || 'None'; + // Cache non-trivial values to variables to prevent repeated look-ups. + // Closure, which accesses and modifies 'list'. + function cacheList() { + if (list.match(/^\w+$/)) { + return ''; + } + var listVar = Blockly.Python.variableDB_.getDistinctName( + 'tmp_list', Blockly.Variables.NAME_TYPE); + var code = listVar + ' = ' + list + '\n'; + list = listVar; + return code; + } + + switch (where) { + case 'FIRST': + if (mode == 'SET') { + return list + '[0] = ' + value + '\n'; + } else if (mode == 'INSERT') { + return list + '.insert(0, ' + value + ')\n'; + } + break; + case 'LAST': + if (mode == 'SET') { + return list + '[-1] = ' + value + '\n'; + } else if (mode == 'INSERT') { + return list + '.append(' + value + ')\n'; + } + break; + case 'FROM_START': + var at = Blockly.Python.getAdjustedInt(block, 'AT'); + if (mode == 'SET') { + return list + '[' + at + '] = ' + value + '\n'; + } else if (mode == 'INSERT') { + return list + '.insert(' + at + ', ' + value + ')\n'; + } + break; + case 'FROM_END': + var at = Blockly.Python.getAdjustedInt(block, 'AT', 1, true); + if (mode == 'SET') { + return list + '[' + at + '] = ' + value + '\n'; + } else if (mode == 'INSERT') { + return list + '.insert(' + at + ', ' + value + ')\n'; + } + break; + case 'RANDOM': + Blockly.Python.definitions_['import_random'] = 'import random'; + var code = cacheList(); + var xVar = Blockly.Python.variableDB_.getDistinctName( + 'tmp_x', Blockly.Variables.NAME_TYPE); + code += xVar + ' = int(random.random() * len(' + list + '))\n'; + if (mode == 'SET') { + code += list + '[' + xVar + '] = ' + value + '\n'; + return code; + } else if (mode == 'INSERT') { + code += list + '.insert(' + xVar + ', ' + value + ')\n'; + return code; + } + break; + } + throw 'Unhandled combination (lists_setIndex).'; +}; + +Blockly.Python['lists_getSublist'] = function(block) { + // Get sublist. + var list = Blockly.Python.valueToCode(block, 'LIST', + Blockly.Python.ORDER_MEMBER) || '[]'; + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + switch (where1) { + case 'FROM_START': + var at1 = Blockly.Python.getAdjustedInt(block, 'AT1'); + if (at1 == '0') { + at1 = ''; + } + break; + case 'FROM_END': + var at1 = Blockly.Python.getAdjustedInt(block, 'AT1', 1, true); + break; + case 'FIRST': + var at1 = ''; + break; + default: + throw 'Unhandled option (lists_getSublist)'; + } + switch (where2) { + case 'FROM_START': + var at2 = Blockly.Python.getAdjustedInt(block, 'AT2', 1); + break; + case 'FROM_END': + var at2 = Blockly.Python.getAdjustedInt(block, 'AT2', 0, true); + // Ensure that if the result calculated is 0 that sub-sequence will + // include all elements as expected. + if (!Blockly.isNumber(String(at2))) { + Blockly.Python.definitions_['import_sys'] = 'import sys'; + at2 += ' or sys.maxsize'; + } else if (at2 == '0') { + at2 = ''; + } + break; + case 'LAST': + var at2 = ''; + break; + default: + throw 'Unhandled option (lists_getSublist)'; + } + var code = list + '[' + at1 + ' : ' + at2 + ']'; + return [code, Blockly.Python.ORDER_MEMBER]; +}; + +Blockly.Python['lists_sort'] = function(block) { + // Block for sorting a list. + var list = (Blockly.Python.valueToCode(block, 'LIST', + Blockly.Python.ORDER_NONE) || '[]'); + var type = block.getFieldValue('TYPE'); + var reverse = block.getFieldValue('DIRECTION') === '1' ? 'False' : 'True'; + var sortFunctionName = Blockly.Python.provideFunction_('lists_sort', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + + '(my_list, type, reverse):', + ' def try_float(s):', + ' try:', + ' return float(s)', + ' except:', + ' return 0', + ' key_funcs = {', + ' "NUMERIC": try_float,', + ' "TEXT": str,', + ' "IGNORE_CASE": lambda s: str(s).lower()', + ' }', + ' key_func = key_funcs[type]', + ' list_cpy = list(my_list)', // Clone the list. + ' return sorted(list_cpy, key=key_func, reverse=reverse)' + ]); + + var code = sortFunctionName + + '(' + list + ', "' + type + '", ' + reverse + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['lists_split'] = function(block) { + // Block for splitting text into a list, or joining a list into text. + var mode = block.getFieldValue('MODE'); + if (mode == 'SPLIT') { + var value_input = Blockly.Python.valueToCode(block, 'INPUT', + Blockly.Python.ORDER_MEMBER) || '\'\''; + var value_delim = Blockly.Python.valueToCode(block, 'DELIM', + Blockly.Python.ORDER_NONE); + var code = value_input + '.split(' + value_delim + ')'; + } else if (mode == 'JOIN') { + var value_input = Blockly.Python.valueToCode(block, 'INPUT', + Blockly.Python.ORDER_NONE) || '[]'; + var value_delim = Blockly.Python.valueToCode(block, 'DELIM', + Blockly.Python.ORDER_MEMBER) || '\'\''; + var code = value_delim + '.join(' + value_input + ')'; + } else { + throw 'Unknown mode: ' + mode; + } + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['lists_reverse'] = function(block) { + // Block for reversing a list. + var list = Blockly.Python.valueToCode(block, 'LIST', + Blockly.Python.ORDER_NONE) || '[]'; + var code = 'list(reversed(' + list + '))'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/python/logic.js b/src/opsoro/server/static/js/blockly/generators/python/logic.js new file mode 100644 index 0000000..fe03648 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/python/logic.js @@ -0,0 +1,128 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Python for logic blocks. + * @author q.neutron@gmail.com (Quynh Neutron) + */ +'use strict'; + +goog.provide('Blockly.Python.logic'); + +goog.require('Blockly.Python'); + + +Blockly.Python['controls_if'] = function(block) { + // If/elseif/else condition. + var n = 0; + var code = '', branchCode, conditionCode; + do { + conditionCode = Blockly.Python.valueToCode(block, 'IF' + n, + Blockly.Python.ORDER_NONE) || 'False'; + branchCode = Blockly.Python.statementToCode(block, 'DO' + n) || + Blockly.Python.PASS; + code += (n == 0 ? 'if ' : 'elif ' ) + conditionCode + ':\n' + branchCode; + + ++n; + } while (block.getInput('IF' + n)); + + if (block.getInput('ELSE')) { + branchCode = Blockly.Python.statementToCode(block, 'ELSE') || + Blockly.Python.PASS; + code += 'else:\n' + branchCode; + } + return code; +}; + +Blockly.Python['controls_ifelse'] = Blockly.Python['controls_if']; + +Blockly.Python['logic_compare'] = function(block) { + // Comparison operator. + var OPERATORS = { + 'EQ': '==', + 'NEQ': '!=', + 'LT': '<', + 'LTE': '<=', + 'GT': '>', + 'GTE': '>=' + }; + var operator = OPERATORS[block.getFieldValue('OP')]; + var order = Blockly.Python.ORDER_RELATIONAL; + var argument0 = Blockly.Python.valueToCode(block, 'A', order) || '0'; + var argument1 = Blockly.Python.valueToCode(block, 'B', order) || '0'; + var code = argument0 + ' ' + operator + ' ' + argument1; + return [code, order]; +}; + +Blockly.Python['logic_operation'] = function(block) { + // Operations 'and', 'or'. + var operator = (block.getFieldValue('OP') == 'AND') ? 'and' : 'or'; + var order = (operator == 'and') ? Blockly.Python.ORDER_LOGICAL_AND : + Blockly.Python.ORDER_LOGICAL_OR; + var argument0 = Blockly.Python.valueToCode(block, 'A', order); + var argument1 = Blockly.Python.valueToCode(block, 'B', order); + if (!argument0 && !argument1) { + // If there are no arguments, then the return value is false. + argument0 = 'False'; + argument1 = 'False'; + } else { + // Single missing arguments have no effect on the return value. + var defaultArgument = (operator == 'and') ? 'True' : 'False'; + if (!argument0) { + argument0 = defaultArgument; + } + if (!argument1) { + argument1 = defaultArgument; + } + } + var code = argument0 + ' ' + operator + ' ' + argument1; + return [code, order]; +}; + +Blockly.Python['logic_negate'] = function(block) { + // Negation. + var argument0 = Blockly.Python.valueToCode(block, 'BOOL', + Blockly.Python.ORDER_LOGICAL_NOT) || 'True'; + var code = 'not ' + argument0; + return [code, Blockly.Python.ORDER_LOGICAL_NOT]; +}; + +Blockly.Python['logic_boolean'] = function(block) { + // Boolean values true and false. + var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'True' : 'False'; + return [code, Blockly.Python.ORDER_ATOMIC]; +}; + +Blockly.Python['logic_null'] = function(block) { + // Null data type. + return ['None', Blockly.Python.ORDER_ATOMIC]; +}; + +Blockly.Python['logic_ternary'] = function(block) { + // Ternary operator. + var value_if = Blockly.Python.valueToCode(block, 'IF', + Blockly.Python.ORDER_CONDITIONAL) || 'False'; + var value_then = Blockly.Python.valueToCode(block, 'THEN', + Blockly.Python.ORDER_CONDITIONAL) || 'None'; + var value_else = Blockly.Python.valueToCode(block, 'ELSE', + Blockly.Python.ORDER_CONDITIONAL) || 'None'; + var code = value_then + ' if ' + value_if + ' else ' + value_else; + return [code, Blockly.Python.ORDER_CONDITIONAL]; +}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/python/loops.js b/src/opsoro/server/static/js/blockly/generators/python/loops.js similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/generators/python/loops.js rename to src/opsoro/server/static/js/blockly/generators/python/loops.js diff --git a/src/opsoro/server/static/js/blockly/generators/python/math.js b/src/opsoro/server/static/js/blockly/generators/python/math.js new file mode 100644 index 0000000..a2595e0 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/python/math.js @@ -0,0 +1,388 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Python for math blocks. + * @author q.neutron@gmail.com (Quynh Neutron) + */ +'use strict'; + +goog.provide('Blockly.Python.math'); + +goog.require('Blockly.Python'); + + +// If any new block imports any library, add that library name here. +Blockly.Python.addReservedWords('math,random,Number'); + +Blockly.Python['math_number'] = function(block) { + // Numeric value. + var code = parseFloat(block.getFieldValue('NUM')); + var order; + if (code == Infinity) { + code = 'float("inf")'; + order = Blockly.Python.ORDER_FUNCTION_CALL; + } else if (code == -Infinity) { + code = '-float("inf")'; + order = Blockly.Python.ORDER_UNARY_SIGN; + } else { + order = code < 0 ? Blockly.Python.ORDER_UNARY_SIGN : + Blockly.Python.ORDER_ATOMIC; + } + return [code, order]; +}; + +Blockly.Python['math_arithmetic'] = function(block) { + // Basic arithmetic operators, and power. + var OPERATORS = { + 'ADD': [' + ', Blockly.Python.ORDER_ADDITIVE], + 'MINUS': [' - ', Blockly.Python.ORDER_ADDITIVE], + 'MULTIPLY': [' * ', Blockly.Python.ORDER_MULTIPLICATIVE], + 'DIVIDE': [' / ', Blockly.Python.ORDER_MULTIPLICATIVE], + 'POWER': [' ** ', Blockly.Python.ORDER_EXPONENTIATION] + }; + var tuple = OPERATORS[block.getFieldValue('OP')]; + var operator = tuple[0]; + var order = tuple[1]; + var argument0 = Blockly.Python.valueToCode(block, 'A', order) || '0'; + var argument1 = Blockly.Python.valueToCode(block, 'B', order) || '0'; + var code = argument0 + operator + argument1; + return [code, order]; + // In case of 'DIVIDE', division between integers returns different results + // in Python 2 and 3. However, is not an issue since Blockly does not + // guarantee identical results in all languages. To do otherwise would + // require every operator to be wrapped in a function call. This would kill + // legibility of the generated code. +}; + +Blockly.Python['math_single'] = function(block) { + // Math operators with single operand. + var operator = block.getFieldValue('OP'); + var code; + var arg; + if (operator == 'NEG') { + // Negation is a special case given its different operator precedence. + var code = Blockly.Python.valueToCode(block, 'NUM', + Blockly.Python.ORDER_UNARY_SIGN) || '0'; + return ['-' + code, Blockly.Python.ORDER_UNARY_SIGN]; + } + Blockly.Python.definitions_['import_math'] = 'import math'; + if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') { + arg = Blockly.Python.valueToCode(block, 'NUM', + Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; + } else { + arg = Blockly.Python.valueToCode(block, 'NUM', + Blockly.Python.ORDER_NONE) || '0'; + } + // First, handle cases which generate values that don't need parentheses + // wrapping the code. + switch (operator) { + case 'ABS': + code = 'math.fabs(' + arg + ')'; + break; + case 'ROOT': + code = 'math.sqrt(' + arg + ')'; + break; + case 'LN': + code = 'math.log(' + arg + ')'; + break; + case 'LOG10': + code = 'math.log10(' + arg + ')'; + break; + case 'EXP': + code = 'math.exp(' + arg + ')'; + break; + case 'POW10': + code = 'math.pow(10,' + arg + ')'; + break; + case 'ROUND': + code = 'round(' + arg + ')'; + break; + case 'ROUNDUP': + code = 'math.ceil(' + arg + ')'; + break; + case 'ROUNDDOWN': + code = 'math.floor(' + arg + ')'; + break; + case 'SIN': + code = 'math.sin(' + arg + ' / 180.0 * math.pi)'; + break; + case 'COS': + code = 'math.cos(' + arg + ' / 180.0 * math.pi)'; + break; + case 'TAN': + code = 'math.tan(' + arg + ' / 180.0 * math.pi)'; + break; + } + if (code) { + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } + // Second, handle cases which generate values that may need parentheses + // wrapping the code. + switch (operator) { + case 'ASIN': + code = 'math.asin(' + arg + ') / math.pi * 180'; + break; + case 'ACOS': + code = 'math.acos(' + arg + ') / math.pi * 180'; + break; + case 'ATAN': + code = 'math.atan(' + arg + ') / math.pi * 180'; + break; + default: + throw 'Unknown math operator: ' + operator; + } + return [code, Blockly.Python.ORDER_MULTIPLICATIVE]; +}; + +Blockly.Python['math_constant'] = function(block) { + // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. + var CONSTANTS = { + 'PI': ['math.pi', Blockly.Python.ORDER_MEMBER], + 'E': ['math.e', Blockly.Python.ORDER_MEMBER], + 'GOLDEN_RATIO': ['(1 + math.sqrt(5)) / 2', + Blockly.Python.ORDER_MULTIPLICATIVE], + 'SQRT2': ['math.sqrt(2)', Blockly.Python.ORDER_MEMBER], + 'SQRT1_2': ['math.sqrt(1.0 / 2)', Blockly.Python.ORDER_MEMBER], + 'INFINITY': ['float(\'inf\')', Blockly.Python.ORDER_ATOMIC] + }; + var constant = block.getFieldValue('CONSTANT'); + if (constant != 'INFINITY') { + Blockly.Python.definitions_['import_math'] = 'import math'; + } + return CONSTANTS[constant]; +}; + +Blockly.Python['math_number_property'] = function(block) { + // Check if a number is even, odd, prime, whole, positive, or negative + // or if it is divisible by certain number. Returns true or false. + var number_to_check = Blockly.Python.valueToCode(block, 'NUMBER_TO_CHECK', + Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; + var dropdown_property = block.getFieldValue('PROPERTY'); + var code; + if (dropdown_property == 'PRIME') { + Blockly.Python.definitions_['import_math'] = 'import math'; + Blockly.Python.definitions_['from_numbers_import_Number'] = + 'from numbers import Number'; + var functionName = Blockly.Python.provideFunction_( + 'math_isPrime', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(n):', + ' # https://en.wikipedia.org/wiki/Primality_test#Naive_methods', + ' # If n is not a number but a string, try parsing it.', + ' if not isinstance(n, Number):', + ' try:', + ' n = float(n)', + ' except:', + ' return False', + ' if n == 2 or n == 3:', + ' return True', + ' # False if n is negative, is 1, or not whole,' + + ' or if n is divisible by 2 or 3.', + ' if n <= 1 or n % 1 != 0 or n % 2 == 0 or n % 3 == 0:', + ' return False', + ' # Check all the numbers of form 6k +/- 1, up to sqrt(n).', + ' for x in range(6, int(math.sqrt(n)) + 2, 6):', + ' if n % (x - 1) == 0 or n % (x + 1) == 0:', + ' return False', + ' return True']); + code = functionName + '(' + number_to_check + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } + switch (dropdown_property) { + case 'EVEN': + code = number_to_check + ' % 2 == 0'; + break; + case 'ODD': + code = number_to_check + ' % 2 == 1'; + break; + case 'WHOLE': + code = number_to_check + ' % 1 == 0'; + break; + case 'POSITIVE': + code = number_to_check + ' > 0'; + break; + case 'NEGATIVE': + code = number_to_check + ' < 0'; + break; + case 'DIVISIBLE_BY': + var divisor = Blockly.Python.valueToCode(block, 'DIVISOR', + Blockly.Python.ORDER_MULTIPLICATIVE); + // If 'divisor' is some code that evals to 0, Python will raise an error. + if (!divisor || divisor == '0') { + return ['False', Blockly.Python.ORDER_ATOMIC]; + } + code = number_to_check + ' % ' + divisor + ' == 0'; + break; + } + return [code, Blockly.Python.ORDER_RELATIONAL]; +}; + +Blockly.Python['math_change'] = function(block) { + // Add to a variable in place. + Blockly.Python.definitions_['from_numbers_import_Number'] = + 'from numbers import Number'; + var argument0 = Blockly.Python.valueToCode(block, 'DELTA', + Blockly.Python.ORDER_ADDITIVE) || '0'; + var varName = Blockly.Python.variableDB_.getName(block.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + return varName + ' = (' + varName + ' if isinstance(' + varName + + ', Number) else 0) + ' + argument0 + '\n'; +}; + +// Rounding functions have a single operand. +Blockly.Python['math_round'] = Blockly.Python['math_single']; +// Trigonometry functions have a single operand. +Blockly.Python['math_trig'] = Blockly.Python['math_single']; + +Blockly.Python['math_on_list'] = function(block) { + // Math functions for lists. + var func = block.getFieldValue('OP'); + var list = Blockly.Python.valueToCode(block, 'LIST', + Blockly.Python.ORDER_NONE) || '[]'; + var code; + switch (func) { + case 'SUM': + code = 'sum(' + list + ')'; + break; + case 'MIN': + code = 'min(' + list + ')'; + break; + case 'MAX': + code = 'max(' + list + ')'; + break; + case 'AVERAGE': + Blockly.Python.definitions_['from_numbers_import_Number'] = + 'from numbers import Number'; + var functionName = Blockly.Python.provideFunction_( + 'math_mean', + // This operation excludes null and values that aren't int or float:', + // math_mean([null, null, "aString", 1, 9]) == 5.0.', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList):', + ' localList = [e for e in myList if isinstance(e, Number)]', + ' if not localList: return', + ' return float(sum(localList)) / len(localList)']); + code = functionName + '(' + list + ')'; + break; + case 'MEDIAN': + Blockly.Python.definitions_['from_numbers_import_Number'] = + 'from numbers import Number'; + var functionName = Blockly.Python.provideFunction_( + 'math_median', + // This operation excludes null values: + // math_median([null, null, 1, 3]) == 2.0. + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList):', + ' localList = sorted([e for e in myList if isinstance(e, Number)])', + ' if not localList: return', + ' if len(localList) % 2 == 0:', + ' return (localList[len(localList) // 2 - 1] + ' + + 'localList[len(localList) // 2]) / 2.0', + ' else:', + ' return localList[(len(localList) - 1) // 2]']); + code = functionName + '(' + list + ')'; + break; + case 'MODE': + var functionName = Blockly.Python.provideFunction_( + 'math_modes', + // As a list of numbers can contain more than one mode, + // the returned result is provided as an array. + // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]. + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(some_list):', + ' modes = []', + ' # Using a lists of [item, count] to keep count rather than dict', + ' # to avoid "unhashable" errors when the counted item is ' + + 'itself a list or dict.', + ' counts = []', + ' maxCount = 1', + ' for item in some_list:', + ' found = False', + ' for count in counts:', + ' if count[0] == item:', + ' count[1] += 1', + ' maxCount = max(maxCount, count[1])', + ' found = True', + ' if not found:', + ' counts.append([item, 1])', + ' for counted_item, item_count in counts:', + ' if item_count == maxCount:', + ' modes.append(counted_item)', + ' return modes']); + code = functionName + '(' + list + ')'; + break; + case 'STD_DEV': + Blockly.Python.definitions_['import_math'] = 'import math'; + var functionName = Blockly.Python.provideFunction_( + 'math_standard_deviation', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(numbers):', + ' n = len(numbers)', + ' if n == 0: return', + ' mean = float(sum(numbers)) / n', + ' variance = sum((x - mean) ** 2 for x in numbers) / n', + ' return math.sqrt(variance)']); + code = functionName + '(' + list + ')'; + break; + case 'RANDOM': + Blockly.Python.definitions_['import_random'] = 'import random'; + code = 'random.choice(' + list + ')'; + break; + default: + throw 'Unknown operator: ' + func; + } + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['math_modulo'] = function(block) { + // Remainder computation. + var argument0 = Blockly.Python.valueToCode(block, 'DIVIDEND', + Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; + var argument1 = Blockly.Python.valueToCode(block, 'DIVISOR', + Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; + var code = argument0 + ' % ' + argument1; + return [code, Blockly.Python.ORDER_MULTIPLICATIVE]; +}; + +Blockly.Python['math_constrain'] = function(block) { + // Constrain a number between two limits. + var argument0 = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_NONE) || '0'; + var argument1 = Blockly.Python.valueToCode(block, 'LOW', + Blockly.Python.ORDER_NONE) || '0'; + var argument2 = Blockly.Python.valueToCode(block, 'HIGH', + Blockly.Python.ORDER_NONE) || 'float(\'inf\')'; + var code = 'min(max(' + argument0 + ', ' + argument1 + '), ' + + argument2 + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['math_random_int'] = function(block) { + // Random integer between [X] and [Y]. + Blockly.Python.definitions_['import_random'] = 'import random'; + var argument0 = Blockly.Python.valueToCode(block, 'FROM', + Blockly.Python.ORDER_NONE) || '0'; + var argument1 = Blockly.Python.valueToCode(block, 'TO', + Blockly.Python.ORDER_NONE) || '0'; + var code = 'random.randint(' + argument0 + ', ' + argument1 + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['math_random_float'] = function(block) { + // Random fraction between 0 and 1. + Blockly.Python.definitions_['import_random'] = 'import random'; + return ['random.random()', Blockly.Python.ORDER_FUNCTION_CALL]; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/python/procedures.js b/src/opsoro/server/static/js/blockly/generators/python/procedures.js new file mode 100644 index 0000000..6af1448 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/python/procedures.js @@ -0,0 +1,120 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Python for procedure blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Python.procedures'); + +goog.require('Blockly.Python'); + + +Blockly.Python['procedures_defreturn'] = function(block) { + // Define a procedure with a return value. + // First, add a 'global' statement for every variable that is not shadowed by + // a local parameter. + var globals = []; + for (var i = 0, varName; varName = block.workspace.variableList[i]; i++) { + if (block.arguments_.indexOf(varName) == -1) { + globals.push(Blockly.Python.variableDB_.getName(varName, + Blockly.Variables.NAME_TYPE)); + } + } + globals = globals.length ? ' global ' + globals.join(', ') + '\n' : ''; + var funcName = Blockly.Python.variableDB_.getName(block.getFieldValue('NAME'), + Blockly.Procedures.NAME_TYPE); + var branch = Blockly.Python.statementToCode(block, 'STACK'); + if (Blockly.Python.STATEMENT_PREFIX) { + branch = Blockly.Python.prefixLines( + Blockly.Python.STATEMENT_PREFIX.replace(/%1/g, + '\'' + block.id + '\''), Blockly.Python.INDENT) + branch; + } + if (Blockly.Python.INFINITE_LOOP_TRAP) { + branch = Blockly.Python.INFINITE_LOOP_TRAP.replace(/%1/g, + '"' + block.id + '"') + branch; + } + var returnValue = Blockly.Python.valueToCode(block, 'RETURN', + Blockly.Python.ORDER_NONE) || ''; + if (returnValue) { + returnValue = ' return ' + returnValue + '\n'; + } else if (!branch) { + branch = Blockly.Python.PASS; + } + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.Python.variableDB_.getName(block.arguments_[i], + Blockly.Variables.NAME_TYPE); + } + var code = 'def ' + funcName + '(' + args.join(', ') + '):\n' + + globals + branch + returnValue; + code = Blockly.Python.scrub_(block, code); + // Add % so as not to collide with helper functions in definitions list. + Blockly.Python.definitions_['%' + funcName] = code; + return null; +}; + +// Defining a procedure without a return value uses the same generator as +// a procedure with a return value. +Blockly.Python['procedures_defnoreturn'] = + Blockly.Python['procedures_defreturn']; + +Blockly.Python['procedures_callreturn'] = function(block) { + // Call a procedure with a return value. + var funcName = Blockly.Python.variableDB_.getName(block.getFieldValue('NAME'), + Blockly.Procedures.NAME_TYPE); + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.Python.valueToCode(block, 'ARG' + i, + Blockly.Python.ORDER_NONE) || 'None'; + } + var code = funcName + '(' + args.join(', ') + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['procedures_callnoreturn'] = function(block) { + // Call a procedure with no return value. + var funcName = Blockly.Python.variableDB_.getName(block.getFieldValue('NAME'), + Blockly.Procedures.NAME_TYPE); + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.Python.valueToCode(block, 'ARG' + i, + Blockly.Python.ORDER_NONE) || 'None'; + } + var code = funcName + '(' + args.join(', ') + ')\n'; + return code; +}; + +Blockly.Python['procedures_ifreturn'] = function(block) { + // Conditionally return value from a procedure. + var condition = Blockly.Python.valueToCode(block, 'CONDITION', + Blockly.Python.ORDER_NONE) || 'False'; + var code = 'if ' + condition + ':\n'; + if (block.hasReturnValue_) { + var value = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_NONE) || 'None'; + code += ' return ' + value + '\n'; + } else { + code += ' return\n'; + } + return code; +}; diff --git a/src/opsoro/server/static/js/blockly/generators/python/text.js b/src/opsoro/server/static/js/blockly/generators/python/text.js new file mode 100644 index 0000000..0fefc77 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/generators/python/text.js @@ -0,0 +1,280 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Python for text blocks. + * @author q.neutron@gmail.com (Quynh Neutron) + */ +'use strict'; + +goog.provide('Blockly.Python.texts'); + +goog.require('Blockly.Python'); + + +Blockly.Python['text'] = function(block) { + // Text value. + var code = Blockly.Python.quote_(block.getFieldValue('TEXT')); + return [code, Blockly.Python.ORDER_ATOMIC]; +}; + +Blockly.Python['text_join'] = function(block) { + // Create a string made up of any number of elements of any type. + //Should we allow joining by '-' or ',' or any other characters? + switch (block.itemCount_) { + case 0: + return ['\'\'', Blockly.Python.ORDER_ATOMIC]; + break; + case 1: + var element = Blockly.Python.valueToCode(block, 'ADD0', + Blockly.Python.ORDER_NONE) || '\'\''; + var code = 'str(' + element + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + break; + case 2: + var element0 = Blockly.Python.valueToCode(block, 'ADD0', + Blockly.Python.ORDER_NONE) || '\'\''; + var element1 = Blockly.Python.valueToCode(block, 'ADD1', + Blockly.Python.ORDER_NONE) || '\'\''; + var code = 'str(' + element0 + ') + str(' + element1 + ')'; + return [code, Blockly.Python.ORDER_ADDITIVE]; + break; + default: + var elements = []; + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.Python.valueToCode(block, 'ADD' + i, + Blockly.Python.ORDER_NONE) || '\'\''; + } + var tempVar = Blockly.Python.variableDB_.getDistinctName('x', + Blockly.Variables.NAME_TYPE); + var code = '\'\'.join([str(' + tempVar + ') for ' + tempVar + ' in [' + + elements.join(', ') + ']])'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } +}; + +Blockly.Python['text_append'] = function(block) { + // Append to a variable in place. + var varName = Blockly.Python.variableDB_.getName(block.getFieldValue('VAR'), + Blockly.Variables.NAME_TYPE); + var value = Blockly.Python.valueToCode(block, 'TEXT', + Blockly.Python.ORDER_NONE) || '\'\''; + return varName + ' = str(' + varName + ') + str(' + value + ')\n'; +}; + +Blockly.Python['text_length'] = function(block) { + // Is the string null or array empty? + var text = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_NONE) || '\'\''; + return ['len(' + text + ')', Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['text_isEmpty'] = function(block) { + // Is the string null or array empty? + var text = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_NONE) || '\'\''; + var code = 'not len(' + text + ')'; + return [code, Blockly.Python.ORDER_LOGICAL_NOT]; +}; + +Blockly.Python['text_indexOf'] = function(block) { + // Search the text for a substring. + // Should we allow for non-case sensitive??? + var operator = block.getFieldValue('END') == 'FIRST' ? 'find' : 'rfind'; + var substring = Blockly.Python.valueToCode(block, 'FIND', + Blockly.Python.ORDER_NONE) || '\'\''; + var text = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_MEMBER) || '\'\''; + var code = text + '.' + operator + '(' + substring + ')'; + if (block.workspace.options.oneBasedIndex) { + return [code + ' + 1', Blockly.Python.ORDER_ADDITIVE]; + } + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['text_charAt'] = function(block) { + // Get letter at index. + // Note: Until January 2013 this block did not have the WHERE input. + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var text = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_MEMBER) || '\'\''; + switch (where) { + case 'FIRST': + var code = text + '[0]'; + return [code, Blockly.Python.ORDER_MEMBER]; + case 'LAST': + var code = text + '[-1]'; + return [code, Blockly.Python.ORDER_MEMBER]; + case 'FROM_START': + var at = Blockly.Python.getAdjustedInt(block, 'AT'); + var code = text + '[' + at + ']'; + return [code, Blockly.Python.ORDER_MEMBER]; + case 'FROM_END': + var at = Blockly.Python.getAdjustedInt(block, 'AT', 1, true); + var code = text + '[' + at + ']'; + return [code, Blockly.Python.ORDER_MEMBER]; + case 'RANDOM': + Blockly.Python.definitions_['import_random'] = 'import random'; + var functionName = Blockly.Python.provideFunction_( + 'text_random_letter', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(text):', + ' x = int(random.random() * len(text))', + ' return text[x];']); + code = functionName + '(' + text + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } + throw 'Unhandled option (text_charAt).'; +}; + +Blockly.Python['text_getSubstring'] = function(block) { + // Get substring. + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + var text = Blockly.Python.valueToCode(block, 'STRING', + Blockly.Python.ORDER_MEMBER) || '\'\''; + switch (where1) { + case 'FROM_START': + var at1 = Blockly.Python.getAdjustedInt(block, 'AT1'); + if (at1 == '0') { + at1 = ''; + } + break; + case 'FROM_END': + var at1 = Blockly.Python.getAdjustedInt(block, 'AT1', 1, true); + break; + case 'FIRST': + var at1 = ''; + break; + default: + throw 'Unhandled option (text_getSubstring)'; + } + switch (where2) { + case 'FROM_START': + var at2 = Blockly.Python.getAdjustedInt(block, 'AT2', 1); + break; + case 'FROM_END': + var at2 = Blockly.Python.getAdjustedInt(block, 'AT2', 0, true); + // Ensure that if the result calculated is 0 that sub-sequence will + // include all elements as expected. + if (!Blockly.isNumber(String(at2))) { + Blockly.Python.definitions_['import_sys'] = 'import sys'; + at2 += ' or sys.maxsize'; + } else if (at2 == '0') { + at2 = ''; + } + break; + case 'LAST': + var at2 = ''; + break; + default: + throw 'Unhandled option (text_getSubstring)'; + } + var code = text + '[' + at1 + ' : ' + at2 + ']'; + return [code, Blockly.Python.ORDER_MEMBER]; +}; + +Blockly.Python['text_changeCase'] = function(block) { + // Change capitalization. + var OPERATORS = { + 'UPPERCASE': '.upper()', + 'LOWERCASE': '.lower()', + 'TITLECASE': '.title()' + }; + var operator = OPERATORS[block.getFieldValue('CASE')]; + var text = Blockly.Python.valueToCode(block, 'TEXT', + Blockly.Python.ORDER_MEMBER) || '\'\''; + var code = text + operator; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['text_trim'] = function(block) { + // Trim spaces. + var OPERATORS = { + 'LEFT': '.lstrip()', + 'RIGHT': '.rstrip()', + 'BOTH': '.strip()' + }; + var operator = OPERATORS[block.getFieldValue('MODE')]; + var text = Blockly.Python.valueToCode(block, 'TEXT', + Blockly.Python.ORDER_MEMBER) || '\'\''; + var code = text + operator; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['text_print'] = function(block) { + // Print statement. + var msg = Blockly.Python.valueToCode(block, 'TEXT', + Blockly.Python.ORDER_NONE) || '\'\''; + return 'print(' + msg + ')\n'; +}; + +Blockly.Python['text_prompt_ext'] = function(block) { + // Prompt function. + var functionName = Blockly.Python.provideFunction_( + 'text_prompt', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(msg):', + ' try:', + ' return raw_input(msg)', + ' except NameError:', + ' return input(msg)']); + if (block.getField('TEXT')) { + // Internal message. + var msg = Blockly.Python.quote_(block.getFieldValue('TEXT')); + } else { + // External message. + var msg = Blockly.Python.valueToCode(block, 'TEXT', + Blockly.Python.ORDER_NONE) || '\'\''; + } + var code = functionName + '(' + msg + ')'; + var toNumber = block.getFieldValue('TYPE') == 'NUMBER'; + if (toNumber) { + code = 'float(' + code + ')'; + } + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['text_prompt'] = Blockly.Python['text_prompt_ext']; + +Blockly.Python['text_count'] = function(block) { + var text = Blockly.Python.valueToCode(block, 'TEXT', + Blockly.Python.ORDER_MEMBER) || '\'\''; + var sub = Blockly.Python.valueToCode(block, 'SUB', + Blockly.Python.ORDER_NONE) || '\'\''; + var code = text + '.count(' + sub + ')'; + return [code, Blockly.Python.ORDER_MEMBER]; +}; + +Blockly.Python['text_replace'] = function(block) { + var text = Blockly.Python.valueToCode(block, 'TEXT', + Blockly.Python.ORDER_MEMBER) || '\'\''; + var from = Blockly.Python.valueToCode(block, 'FROM', + Blockly.Python.ORDER_NONE) || '\'\''; + var to = Blockly.Python.valueToCode(block, 'TO', + Blockly.Python.ORDER_NONE) || '\'\''; + var code = text + '.replace(' + from + ', ' + to + ')'; + return [code, Blockly.Python.ORDER_MEMBER]; +}; + +Blockly.Python['text_reverse'] = function(block) { + var text = Blockly.Python.valueToCode(block, 'TEXT', + Blockly.Python.ORDER_MEMBER) || '\'\''; + var code = text + '[::-1]'; + return [code, Blockly.Python.ORDER_MEMBER]; +}; diff --git a/src/opsoro/apps/visual_programming/static/blockly/generators/python/variables.js b/src/opsoro/server/static/js/blockly/generators/python/variables.js similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/generators/python/variables.js rename to src/opsoro/server/static/js/blockly/generators/python/variables.js diff --git a/src/opsoro/apps/visual_programming/static/blockly/i18n/common.py b/src/opsoro/server/static/js/blockly/i18n/common.py similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/i18n/common.py rename to src/opsoro/server/static/js/blockly/i18n/common.py diff --git a/src/opsoro/apps/visual_programming/static/blockly/i18n/create_messages.py b/src/opsoro/server/static/js/blockly/i18n/create_messages.py similarity index 87% rename from src/opsoro/apps/visual_programming/static/blockly/i18n/create_messages.py rename to src/opsoro/server/static/js/blockly/i18n/create_messages.py index d32814f..1010b05 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/i18n/create_messages.py +++ b/src/opsoro/server/static/js/blockly/i18n/create_messages.py @@ -35,6 +35,15 @@ def string_is_ascii(s): except UnicodeEncodeError: return False +def load_constants(filename): + """Read in constants file, which must be output in every language.""" + constant_defs = read_json_file(filename); + constants_text = '\n' + for key in constant_defs: + value = constant_defs[key] + value = value.replace('"', '\\"') + constants_text += '\nBlockly.Msg.{0} = \"{1}\";'.format(key, value) + return constants_text def main(): """Generate .js files defining Blockly core and language messages.""" @@ -49,6 +58,9 @@ def main(): parser.add_argument('--source_synonym_file', default=os.path.join('json', 'synonyms.json'), help='Path to .json file with synonym definitions') + parser.add_argument('--source_constants_file', + default=os.path.join('json', 'constants.json'), + help='Path to .json file with constant definitions') parser.add_argument('--output_dir', default='js/', help='relative directory for output files') parser.add_argument('--key_file', default='keys.json', @@ -78,11 +90,14 @@ def main(): synonym_text = '\n'.join(['Blockly.Msg.{0} = Blockly.Msg.{1};'.format( key, synonym_defs[key]) for key in synonym_defs]) + # Read in constants file, which must be output in every language. + constants_text = load_constants(os.path.join(os.curdir, args.source_constants_file)) + # Create each output file. for arg_file in args.files: (_, filename) = os.path.split(arg_file) target_lang = filename[:filename.index('.')] - if target_lang not in ('qqq', 'keys', 'synonyms'): + if target_lang not in ('qqq', 'keys', 'synonyms', 'constants'): target_defs = read_json_file(os.path.join(os.curdir, arg_file)) # Verify that keys are 'ascii' @@ -140,6 +155,7 @@ def main(): filename, ', '.join(synonym_keys))) outfile.write(synonym_text) + outfile.write(constants_text) if not args.quiet: print('Created {0}.'.format(outname)) diff --git a/src/opsoro/apps/visual_programming/static/blockly/i18n/dedup_json.py b/src/opsoro/server/static/js/blockly/i18n/dedup_json.py similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/i18n/dedup_json.py rename to src/opsoro/server/static/js/blockly/i18n/dedup_json.py diff --git a/src/opsoro/apps/visual_programming/static/blockly/i18n/js_to_json.py b/src/opsoro/server/static/js/blockly/i18n/js_to_json.py similarity index 82% rename from src/opsoro/apps/visual_programming/static/blockly/i18n/js_to_json.py rename to src/opsoro/server/static/js/blockly/i18n/js_to_json.py index 197dc43..54190b8 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/i18n/js_to_json.py +++ b/src/opsoro/server/static/js/blockly/i18n/js_to_json.py @@ -53,6 +53,9 @@ _INPUT_SYN_PATTERN = re.compile( """Blockly.Msg.(\w*)\s*=\s*Blockly.Msg.(\w*);""") +_CONSTANT_DESCRIPTION_PATTERN = re.compile( + """{{Notranslate}}""", re.IGNORECASE) + def main(): # Set up argument parser. parser = argparse.ArgumentParser(description='Create translation files.') @@ -75,6 +78,7 @@ def main(): # Read and parse input file. results = [] synonyms = {} + constants = {} # Values that are constant across all languages. description = '' infile = codecs.open(args.input_file, 'r', 'utf-8') for line in infile: @@ -86,14 +90,19 @@ def main(): else: match = _INPUT_DEF_PATTERN.match(line) if match: - result = {} - result['meaning'] = match.group(1) - result['source'] = match.group(2) + key = match.group(1) + value = match.group(2) if not description: print('Warning: No description for ' + result['meaning']) - result['description'] = description + if (description and _CONSTANT_DESCRIPTION_PATTERN.search(description)): + constants[key] = value + else: + result = {} + result['meaning'] = key + result['source'] = value + result['description'] = description + results.append(result) description = '' - results.append(result) else: match = _INPUT_SYN_PATTERN.match(line) if match: @@ -115,6 +124,13 @@ def main(): print("Wrote {0} synonym pairs to {1}.".format( len(synonyms), synonym_file_name)) + # Create constants.json + constants_file_name = os.path.join(os.curdir, args.output_dir, 'constants.json') + with open(constants_file_name, 'w') as outfile: + json.dump(constants, outfile) + if not args.quiet: + print("Wrote {0} constant pairs to {1}.".format( + len(constants), synonym_file_name)) if __name__ == '__main__': main() diff --git a/src/opsoro/apps/visual_programming/static/blockly/i18n/json_to_js.py b/src/opsoro/server/static/js/blockly/i18n/json_to_js.py similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/i18n/json_to_js.py rename to src/opsoro/server/static/js/blockly/i18n/json_to_js.py diff --git a/src/opsoro/apps/visual_programming/static/blockly/i18n/tests.py b/src/opsoro/server/static/js/blockly/i18n/tests.py similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/i18n/tests.py rename to src/opsoro/server/static/js/blockly/i18n/tests.py diff --git a/src/opsoro/apps/visual_programming/static/blockly/i18n/xliff_to_json.py b/src/opsoro/server/static/js/blockly/i18n/xliff_to_json.py similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/i18n/xliff_to_json.py rename to src/opsoro/server/static/js/blockly/i18n/xliff_to_json.py diff --git a/src/opsoro/server/static/js/blockly/javascript_compressed.js b/src/opsoro/server/static/js/blockly/javascript_compressed.js new file mode 100644 index 0000000..a2fca91 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/javascript_compressed.js @@ -0,0 +1,94 @@ +// Do not edit this file; automatically generated by build.py. +'use strict'; + + +// Copyright 2012 Google Inc. Apache License 2.0 +Blockly.JavaScript=new Blockly.Generator("JavaScript");Blockly.JavaScript.addReservedWords("Blockly,break,case,catch,continue,debugger,default,delete,do,else,finally,for,function,if,in,instanceof,new,return,switch,this,throw,try,typeof,var,void,while,with,class,enum,export,extends,import,super,implements,interface,let,package,private,protected,public,static,yield,const,null,true,false,Array,ArrayBuffer,Boolean,Date,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Error,eval,EvalError,Float32Array,Float64Array,Function,Infinity,Int16Array,Int32Array,Int8Array,isFinite,isNaN,Iterator,JSON,Math,NaN,Number,Object,parseFloat,parseInt,RangeError,ReferenceError,RegExp,StopIteration,String,SyntaxError,TypeError,Uint16Array,Uint32Array,Uint8Array,Uint8ClampedArray,undefined,uneval,URIError,applicationCache,closed,Components,content,_content,controllers,crypto,defaultStatus,dialogArguments,directories,document,frameElement,frames,fullScreen,globalStorage,history,innerHeight,innerWidth,length,location,locationbar,localStorage,menubar,messageManager,mozAnimationStartTime,mozInnerScreenX,mozInnerScreenY,mozPaintCount,name,navigator,opener,outerHeight,outerWidth,pageXOffset,pageYOffset,parent,performance,personalbar,pkcs11,returnValue,screen,screenX,screenY,scrollbars,scrollMaxX,scrollMaxY,scrollX,scrollY,self,sessionStorage,sidebar,status,statusbar,toolbar,top,URL,window,addEventListener,alert,atob,back,blur,btoa,captureEvents,clearImmediate,clearInterval,clearTimeout,close,confirm,disableExternalCapture,dispatchEvent,dump,enableExternalCapture,escape,find,focus,forward,GeckoActiveXObject,getAttention,getAttentionWithCycleCount,getComputedStyle,getSelection,home,matchMedia,maximize,minimize,moveBy,moveTo,mozRequestAnimationFrame,open,openDialog,postMessage,print,prompt,QueryInterface,releaseEvents,removeEventListener,resizeBy,resizeTo,restore,routeEvent,scroll,scrollBy,scrollByLines,scrollByPages,scrollTo,setCursor,setImmediate,setInterval,setResizable,setTimeout,showModalDialog,sizeToContent,stop,unescape,updateCommands,XPCNativeWrapper,XPCSafeJSObjectWrapper,onabort,onbeforeunload,onblur,onchange,onclick,onclose,oncontextmenu,ondevicemotion,ondeviceorientation,ondragdrop,onerror,onfocus,onhashchange,onkeydown,onkeypress,onkeyup,onload,onmousedown,onmousemove,onmouseout,onmouseover,onmouseup,onmozbeforepaint,onpaint,onpopstate,onreset,onresize,onscroll,onselect,onsubmit,onunload,onpageshow,onpagehide,Image,Option,Worker,Event,Range,File,FileReader,Blob,BlobBuilder,Attr,CDATASection,CharacterData,Comment,console,DocumentFragment,DocumentType,DomConfiguration,DOMError,DOMErrorHandler,DOMException,DOMImplementation,DOMImplementationList,DOMImplementationRegistry,DOMImplementationSource,DOMLocator,DOMObject,DOMString,DOMStringList,DOMTimeStamp,DOMUserData,Entity,EntityReference,MediaQueryList,MediaQueryListListener,NameList,NamedNodeMap,Node,NodeFilter,NodeIterator,NodeList,Notation,Plugin,PluginArray,ProcessingInstruction,SharedWorker,Text,TimeRanges,Treewalker,TypeInfo,UserDataHandler,Worker,WorkerGlobalScope,HTMLDocument,HTMLElement,HTMLAnchorElement,HTMLAppletElement,HTMLAudioElement,HTMLAreaElement,HTMLBaseElement,HTMLBaseFontElement,HTMLBodyElement,HTMLBRElement,HTMLButtonElement,HTMLCanvasElement,HTMLDirectoryElement,HTMLDivElement,HTMLDListElement,HTMLEmbedElement,HTMLFieldSetElement,HTMLFontElement,HTMLFormElement,HTMLFrameElement,HTMLFrameSetElement,HTMLHeadElement,HTMLHeadingElement,HTMLHtmlElement,HTMLHRElement,HTMLIFrameElement,HTMLImageElement,HTMLInputElement,HTMLKeygenElement,HTMLLabelElement,HTMLLIElement,HTMLLinkElement,HTMLMapElement,HTMLMenuElement,HTMLMetaElement,HTMLModElement,HTMLObjectElement,HTMLOListElement,HTMLOptGroupElement,HTMLOptionElement,HTMLOutputElement,HTMLParagraphElement,HTMLParamElement,HTMLPreElement,HTMLQuoteElement,HTMLScriptElement,HTMLSelectElement,HTMLSourceElement,HTMLSpanElement,HTMLStyleElement,HTMLTableElement,HTMLTableCaptionElement,HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement,HTMLTableColElement,HTMLTableRowElement,HTMLTableSectionElement,HTMLTextAreaElement,HTMLTimeElement,HTMLTitleElement,HTMLTrackElement,HTMLUListElement,HTMLUnknownElement,HTMLVideoElement,HTMLCanvasElement,CanvasRenderingContext2D,CanvasGradient,CanvasPattern,TextMetrics,ImageData,CanvasPixelArray,HTMLAudioElement,HTMLVideoElement,NotifyAudioAvailableEvent,HTMLCollection,HTMLAllCollection,HTMLFormControlsCollection,HTMLOptionsCollection,HTMLPropertiesCollection,DOMTokenList,DOMSettableTokenList,DOMStringMap,RadioNodeList,SVGDocument,SVGElement,SVGAElement,SVGAltGlyphElement,SVGAltGlyphDefElement,SVGAltGlyphItemElement,SVGAnimationElement,SVGAnimateElement,SVGAnimateColorElement,SVGAnimateMotionElement,SVGAnimateTransformElement,SVGSetElement,SVGCircleElement,SVGClipPathElement,SVGColorProfileElement,SVGCursorElement,SVGDefsElement,SVGDescElement,SVGEllipseElement,SVGFilterElement,SVGFilterPrimitiveStandardAttributes,SVGFEBlendElement,SVGFEColorMatrixElement,SVGFEComponentTransferElement,SVGFECompositeElement,SVGFEConvolveMatrixElement,SVGFEDiffuseLightingElement,SVGFEDisplacementMapElement,SVGFEDistantLightElement,SVGFEFloodElement,SVGFEGaussianBlurElement,SVGFEImageElement,SVGFEMergeElement,SVGFEMergeNodeElement,SVGFEMorphologyElement,SVGFEOffsetElement,SVGFEPointLightElement,SVGFESpecularLightingElement,SVGFESpotLightElement,SVGFETileElement,SVGFETurbulenceElement,SVGComponentTransferFunctionElement,SVGFEFuncRElement,SVGFEFuncGElement,SVGFEFuncBElement,SVGFEFuncAElement,SVGFontElement,SVGFontFaceElement,SVGFontFaceFormatElement,SVGFontFaceNameElement,SVGFontFaceSrcElement,SVGFontFaceUriElement,SVGForeignObjectElement,SVGGElement,SVGGlyphElement,SVGGlyphRefElement,SVGGradientElement,SVGLinearGradientElement,SVGRadialGradientElement,SVGHKernElement,SVGImageElement,SVGLineElement,SVGMarkerElement,SVGMaskElement,SVGMetadataElement,SVGMissingGlyphElement,SVGMPathElement,SVGPathElement,SVGPatternElement,SVGPolylineElement,SVGPolygonElement,SVGRectElement,SVGScriptElement,SVGStopElement,SVGStyleElement,SVGSVGElement,SVGSwitchElement,SVGSymbolElement,SVGTextElement,SVGTextPathElement,SVGTitleElement,SVGTRefElement,SVGTSpanElement,SVGUseElement,SVGViewElement,SVGVKernElement,SVGAngle,SVGColor,SVGICCColor,SVGElementInstance,SVGElementInstanceList,SVGLength,SVGLengthList,SVGMatrix,SVGNumber,SVGNumberList,SVGPaint,SVGPoint,SVGPointList,SVGPreserveAspectRatio,SVGRect,SVGStringList,SVGTransform,SVGTransformList,SVGAnimatedAngle,SVGAnimatedBoolean,SVGAnimatedEnumeration,SVGAnimatedInteger,SVGAnimatedLength,SVGAnimatedLengthList,SVGAnimatedNumber,SVGAnimatedNumberList,SVGAnimatedPreserveAspectRatio,SVGAnimatedRect,SVGAnimatedString,SVGAnimatedTransformList,SVGPathSegList,SVGPathSeg,SVGPathSegArcAbs,SVGPathSegArcRel,SVGPathSegClosePath,SVGPathSegCurvetoCubicAbs,SVGPathSegCurvetoCubicRel,SVGPathSegCurvetoCubicSmoothAbs,SVGPathSegCurvetoCubicSmoothRel,SVGPathSegCurvetoQuadraticAbs,SVGPathSegCurvetoQuadraticRel,SVGPathSegCurvetoQuadraticSmoothAbs,SVGPathSegCurvetoQuadraticSmoothRel,SVGPathSegLinetoAbs,SVGPathSegLinetoHorizontalAbs,SVGPathSegLinetoHorizontalRel,SVGPathSegLinetoRel,SVGPathSegLinetoVerticalAbs,SVGPathSegLinetoVerticalRel,SVGPathSegMovetoAbs,SVGPathSegMovetoRel,ElementTimeControl,TimeEvent,SVGAnimatedPathData,SVGAnimatedPoints,SVGColorProfileRule,SVGCSSRule,SVGExternalResourcesRequired,SVGFitToViewBox,SVGLangSpace,SVGLocatable,SVGRenderingIntent,SVGStylable,SVGTests,SVGTextContentElement,SVGTextPositioningElement,SVGTransformable,SVGUnitTypes,SVGURIReference,SVGViewSpec,SVGZoomAndPan"); +Blockly.JavaScript.ORDER_ATOMIC=0;Blockly.JavaScript.ORDER_NEW=1.1;Blockly.JavaScript.ORDER_MEMBER=1.2;Blockly.JavaScript.ORDER_FUNCTION_CALL=2;Blockly.JavaScript.ORDER_INCREMENT=3;Blockly.JavaScript.ORDER_DECREMENT=3;Blockly.JavaScript.ORDER_BITWISE_NOT=4.1;Blockly.JavaScript.ORDER_UNARY_PLUS=4.2;Blockly.JavaScript.ORDER_UNARY_NEGATION=4.3;Blockly.JavaScript.ORDER_LOGICAL_NOT=4.4;Blockly.JavaScript.ORDER_TYPEOF=4.5;Blockly.JavaScript.ORDER_VOID=4.6;Blockly.JavaScript.ORDER_DELETE=4.7; +Blockly.JavaScript.ORDER_DIVISION=5.1;Blockly.JavaScript.ORDER_MULTIPLICATION=5.2;Blockly.JavaScript.ORDER_MODULUS=5.3;Blockly.JavaScript.ORDER_SUBTRACTION=6.1;Blockly.JavaScript.ORDER_ADDITION=6.2;Blockly.JavaScript.ORDER_BITWISE_SHIFT=7;Blockly.JavaScript.ORDER_RELATIONAL=8;Blockly.JavaScript.ORDER_IN=8;Blockly.JavaScript.ORDER_INSTANCEOF=8;Blockly.JavaScript.ORDER_EQUALITY=9;Blockly.JavaScript.ORDER_BITWISE_AND=10;Blockly.JavaScript.ORDER_BITWISE_XOR=11;Blockly.JavaScript.ORDER_BITWISE_OR=12; +Blockly.JavaScript.ORDER_LOGICAL_AND=13;Blockly.JavaScript.ORDER_LOGICAL_OR=14;Blockly.JavaScript.ORDER_CONDITIONAL=15;Blockly.JavaScript.ORDER_ASSIGNMENT=16;Blockly.JavaScript.ORDER_COMMA=17;Blockly.JavaScript.ORDER_NONE=99; +Blockly.JavaScript.ORDER_OVERRIDES=[[Blockly.JavaScript.ORDER_FUNCTION_CALL,Blockly.JavaScript.ORDER_MEMBER],[Blockly.JavaScript.ORDER_FUNCTION_CALL,Blockly.JavaScript.ORDER_FUNCTION_CALL],[Blockly.JavaScript.ORDER_MEMBER,Blockly.JavaScript.ORDER_MEMBER],[Blockly.JavaScript.ORDER_MEMBER,Blockly.JavaScript.ORDER_FUNCTION_CALL],[Blockly.JavaScript.ORDER_LOGICAL_NOT,Blockly.JavaScript.ORDER_LOGICAL_NOT],[Blockly.JavaScript.ORDER_MULTIPLICATION,Blockly.JavaScript.ORDER_MULTIPLICATION],[Blockly.JavaScript.ORDER_ADDITION, +Blockly.JavaScript.ORDER_ADDITION],[Blockly.JavaScript.ORDER_LOGICAL_AND,Blockly.JavaScript.ORDER_LOGICAL_AND],[Blockly.JavaScript.ORDER_LOGICAL_OR,Blockly.JavaScript.ORDER_LOGICAL_OR]]; +Blockly.JavaScript.init=function(a){Blockly.JavaScript.definitions_=Object.create(null);Blockly.JavaScript.functionNames_=Object.create(null);Blockly.JavaScript.variableDB_?Blockly.JavaScript.variableDB_.reset():Blockly.JavaScript.variableDB_=new Blockly.Names(Blockly.JavaScript.RESERVED_WORDS_);var b=[];a=a.variableList;if(a.length){for(var c=0;cc?Blockly.JavaScript.valueToCode(a,b,Blockly.JavaScript.ORDER_SUBTRACTION)||f:d?Blockly.JavaScript.valueToCode(a,b,Blockly.JavaScript.ORDER_UNARY_NEGATION)||f:Blockly.JavaScript.valueToCode(a,b,e)||f;if(Blockly.isNumber(a))a=parseFloat(a)+c, +d&&(a=-a);else{if(0c&&(a=a+" - "+-c,g=Blockly.JavaScript.ORDER_SUBTRACTION);d&&(a=c?"-("+a+")":"-"+a,g=Blockly.JavaScript.ORDER_UNARY_NEGATION);g=Math.floor(g);e=Math.floor(e);g&&e>=g&&(a="("+a+")")}return a};Blockly.JavaScript.lists={};Blockly.JavaScript.lists_create_empty=function(a){return["[]",Blockly.JavaScript.ORDER_ATOMIC]};Blockly.JavaScript.lists_create_with=function(a){for(var b=Array(a.itemCount_),c=0;c b.toString() ? 1 : -1; },", +' "IGNORE_CASE": function(a, b) {'," return a.toString().toLowerCase() > b.toString().toLowerCase() ? 1 : -1; },"," };"," var compare = compareFuncs[type];"," return function(a, b) { return compare(a, b) * direction; }","}"]);return[b+".slice().sort("+d+'("'+a+'", '+c+"))",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; +Blockly.JavaScript.lists_split=function(a){var b=Blockly.JavaScript.valueToCode(a,"INPUT",Blockly.JavaScript.ORDER_MEMBER),c=Blockly.JavaScript.valueToCode(a,"DELIM",Blockly.JavaScript.ORDER_NONE)||"''";a=a.getFieldValue("MODE");if("SPLIT"==a)b||(b="''"),a="split";else if("JOIN"==a)b||(b="[]"),a="join";else throw"Unknown mode: "+a;return[b+"."+a+"("+c+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; +Blockly.JavaScript.lists_reverse=function(a){return[(Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_FUNCTION_CALL)||"[]")+".slice().reverse()",Blockly.JavaScript.ORDER_FUNCTION_CALL]};Blockly.JavaScript.math={};Blockly.JavaScript.math_number=function(a){return[parseFloat(a.getFieldValue("NUM")),Blockly.JavaScript.ORDER_ATOMIC]}; +Blockly.JavaScript.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.JavaScript.ORDER_ADDITION],MINUS:[" - ",Blockly.JavaScript.ORDER_SUBTRACTION],MULTIPLY:[" * ",Blockly.JavaScript.ORDER_MULTIPLICATION],DIVIDE:[" / ",Blockly.JavaScript.ORDER_DIVISION],POWER:[null,Blockly.JavaScript.ORDER_COMMA]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.JavaScript.valueToCode(a,"A",b)||"0";a=Blockly.JavaScript.valueToCode(a,"B",b)||"0";return c?[d+c+a,b]:["Math.pow("+d+", "+a+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; +Blockly.JavaScript.math_single=function(a){var b=a.getFieldValue("OP"),c;if("NEG"==b)return a=Blockly.JavaScript.valueToCode(a,"NUM",Blockly.JavaScript.ORDER_UNARY_NEGATION)||"0","-"==a[0]&&(a=" "+a),["-"+a,Blockly.JavaScript.ORDER_UNARY_NEGATION];a="SIN"==b||"COS"==b||"TAN"==b?Blockly.JavaScript.valueToCode(a,"NUM",Blockly.JavaScript.ORDER_DIVISION)||"0":Blockly.JavaScript.valueToCode(a,"NUM",Blockly.JavaScript.ORDER_NONE)||"0";switch(b){case "ABS":c="Math.abs("+a+")";break;case "ROOT":c="Math.sqrt("+ +a+")";break;case "LN":c="Math.log("+a+")";break;case "EXP":c="Math.exp("+a+")";break;case "POW10":c="Math.pow(10,"+a+")";break;case "ROUND":c="Math.round("+a+")";break;case "ROUNDUP":c="Math.ceil("+a+")";break;case "ROUNDDOWN":c="Math.floor("+a+")";break;case "SIN":c="Math.sin("+a+" / 180 * Math.PI)";break;case "COS":c="Math.cos("+a+" / 180 * Math.PI)";break;case "TAN":c="Math.tan("+a+" / 180 * Math.PI)"}if(c)return[c,Blockly.JavaScript.ORDER_FUNCTION_CALL];switch(b){case "LOG10":c="Math.log("+a+ +") / Math.log(10)";break;case "ASIN":c="Math.asin("+a+") / Math.PI * 180";break;case "ACOS":c="Math.acos("+a+") / Math.PI * 180";break;case "ATAN":c="Math.atan("+a+") / Math.PI * 180";break;default:throw"Unknown math operator: "+b;}return[c,Blockly.JavaScript.ORDER_DIVISION]}; +Blockly.JavaScript.math_constant=function(a){return{PI:["Math.PI",Blockly.JavaScript.ORDER_MEMBER],E:["Math.E",Blockly.JavaScript.ORDER_MEMBER],GOLDEN_RATIO:["(1 + Math.sqrt(5)) / 2",Blockly.JavaScript.ORDER_DIVISION],SQRT2:["Math.SQRT2",Blockly.JavaScript.ORDER_MEMBER],SQRT1_2:["Math.SQRT1_2",Blockly.JavaScript.ORDER_MEMBER],INFINITY:["Infinity",Blockly.JavaScript.ORDER_ATOMIC]}[a.getFieldValue("CONSTANT")]}; +Blockly.JavaScript.math_number_property=function(a){var b=Blockly.JavaScript.valueToCode(a,"NUMBER_TO_CHECK",Blockly.JavaScript.ORDER_MODULUS)||"0",c=a.getFieldValue("PROPERTY"),d;if("PRIME"==c)return[Blockly.JavaScript.provideFunction_("mathIsPrime",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(n) {"," // https://en.wikipedia.org/wiki/Primality_test#Naive_methods"," if (n == 2 || n == 3) {"," return true;"," }"," // False if n is NaN, negative, is 1, or not whole."," // And false if n is divisible by 2 or 3.", +" if (isNaN(n) || n <= 1 || n % 1 != 0 || n % 2 == 0 || n % 3 == 0) {"," return false;"," }"," // Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {"," if (n % (x - 1) == 0 || n % (x + 1) == 0) {"," return false;"," }"," }"," return true;","}"])+"("+b+")",Blockly.JavaScript.ORDER_FUNCTION_CALL];switch(c){case "EVEN":d=b+" % 2 == 0";break;case "ODD":d=b+" % 2 == 1";break;case "WHOLE":d=b+" % 1 == 0";break;case "POSITIVE":d= +b+" > 0";break;case "NEGATIVE":d=b+" < 0";break;case "DIVISIBLE_BY":a=Blockly.JavaScript.valueToCode(a,"DIVISOR",Blockly.JavaScript.ORDER_MODULUS)||"0",d=b+" % "+a+" == 0"}return[d,Blockly.JavaScript.ORDER_EQUALITY]};Blockly.JavaScript.math_change=function(a){var b=Blockly.JavaScript.valueToCode(a,"DELTA",Blockly.JavaScript.ORDER_ADDITION)||"0";a=Blockly.JavaScript.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);return a+" = (typeof "+a+" == 'number' ? "+a+" : 0) + "+b+";\n"}; +Blockly.JavaScript.math_round=Blockly.JavaScript.math_single;Blockly.JavaScript.math_trig=Blockly.JavaScript.math_single; +Blockly.JavaScript.math_on_list=function(a){var b=a.getFieldValue("OP");switch(b){case "SUM":a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_MEMBER)||"[]";a+=".reduce(function(x, y) {return x + y;})";break;case "MIN":a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_COMMA)||"[]";a="Math.min.apply(null, "+a+")";break;case "MAX":a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_COMMA)||"[]";a="Math.max.apply(null, "+a+")";break;case "AVERAGE":b=Blockly.JavaScript.provideFunction_("mathMean", +["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(myList) {"," return myList.reduce(function(x, y) {return x + y;}) / myList.length;","}"]);a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "MEDIAN":b=Blockly.JavaScript.provideFunction_("mathMedian",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(myList) {"," var localList = myList.filter(function (x) {return typeof x == 'number';});"," if (!localList.length) return null;", +" localList.sort(function(a, b) {return b - a;});"," if (localList.length % 2 == 0) {"," return (localList[localList.length / 2 - 1] + localList[localList.length / 2]) / 2;"," } else {"," return localList[(localList.length - 1) / 2];"," }","}"]);a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "MODE":b=Blockly.JavaScript.provideFunction_("mathModes",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(values) {"," var modes = [];", +" var counts = [];"," var maxCount = 0;"," for (var i = 0; i < values.length; i++) {"," var value = values[i];"," var found = false;"," var thisCount;"," for (var j = 0; j < counts.length; j++) {"," if (counts[j][0] === value) {"," thisCount = ++counts[j][1];"," found = true;"," break;"," }"," }"," if (!found) {"," counts.push([value, 1]);"," thisCount = 1;"," }"," maxCount = Math.max(thisCount, maxCount);"," }"," for (var j = 0; j < counts.length; j++) {", +" if (counts[j][1] == maxCount) {"," modes.push(counts[j][0]);"," }"," }"," return modes;","}"]);a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "STD_DEV":b=Blockly.JavaScript.provideFunction_("mathStandardDeviation",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(numbers) {"," var n = numbers.length;"," if (!n) return null;"," var mean = numbers.reduce(function(x, y) {return x + y;}) / n;"," var variance = 0;", +" for (var j = 0; j < n; j++) {"," variance += Math.pow(numbers[j] - mean, 2);"," }"," variance = variance / n;"," return Math.sqrt(variance);","}"]);a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "RANDOM":b=Blockly.JavaScript.provideFunction_("mathRandomList",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(list) {"," var x = Math.floor(Math.random() * list.length);"," return list[x];","}"]);a=Blockly.JavaScript.valueToCode(a, +"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;default:throw"Unknown operator: "+b;}return[a,Blockly.JavaScript.ORDER_FUNCTION_CALL]};Blockly.JavaScript.math_modulo=function(a){var b=Blockly.JavaScript.valueToCode(a,"DIVIDEND",Blockly.JavaScript.ORDER_MODULUS)||"0";a=Blockly.JavaScript.valueToCode(a,"DIVISOR",Blockly.JavaScript.ORDER_MODULUS)||"0";return[b+" % "+a,Blockly.JavaScript.ORDER_MODULUS]}; +Blockly.JavaScript.math_constrain=function(a){var b=Blockly.JavaScript.valueToCode(a,"VALUE",Blockly.JavaScript.ORDER_COMMA)||"0",c=Blockly.JavaScript.valueToCode(a,"LOW",Blockly.JavaScript.ORDER_COMMA)||"0";a=Blockly.JavaScript.valueToCode(a,"HIGH",Blockly.JavaScript.ORDER_COMMA)||"Infinity";return["Math.min(Math.max("+b+", "+c+"), "+a+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; +Blockly.JavaScript.math_random_int=function(a){var b=Blockly.JavaScript.valueToCode(a,"FROM",Blockly.JavaScript.ORDER_COMMA)||"0";a=Blockly.JavaScript.valueToCode(a,"TO",Blockly.JavaScript.ORDER_COMMA)||"0";return[Blockly.JavaScript.provideFunction_("mathRandomInt",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(a, b) {"," if (a > b) {"," // Swap a and b to ensure a is smaller."," var c = a;"," a = b;"," b = c;"," }"," return Math.floor(Math.random() * (b - a + 1) + a);", +"}"])+"("+b+", "+a+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]};Blockly.JavaScript.math_random_float=function(a){return["Math.random()",Blockly.JavaScript.ORDER_FUNCTION_CALL]};Blockly.JavaScript.variables={};Blockly.JavaScript.variables_get=function(a){return[Blockly.JavaScript.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),Blockly.JavaScript.ORDER_ATOMIC]};Blockly.JavaScript.variables_set=function(a){var b=Blockly.JavaScript.valueToCode(a,"VALUE",Blockly.JavaScript.ORDER_ASSIGNMENT)||"0";return Blockly.JavaScript.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE)+" = "+b+";\n"};Blockly.JavaScript.colour={};Blockly.JavaScript.colour_picker=function(a){return["'"+a.getFieldValue("COLOUR")+"'",Blockly.JavaScript.ORDER_ATOMIC]};Blockly.JavaScript.colour_random=function(a){return[Blockly.JavaScript.provideFunction_("colourRandom",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"() {"," var num = Math.floor(Math.random() * Math.pow(2, 24));"," return '#' + ('00000' + num.toString(16)).substr(-6);","}"])+"()",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; +Blockly.JavaScript.colour_rgb=function(a){var b=Blockly.JavaScript.valueToCode(a,"RED",Blockly.JavaScript.ORDER_COMMA)||0,c=Blockly.JavaScript.valueToCode(a,"GREEN",Blockly.JavaScript.ORDER_COMMA)||0;a=Blockly.JavaScript.valueToCode(a,"BLUE",Blockly.JavaScript.ORDER_COMMA)||0;return[Blockly.JavaScript.provideFunction_("colourRgb",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(r, g, b) {"," r = Math.max(Math.min(Number(r), 100), 0) * 2.55;"," g = Math.max(Math.min(Number(g), 100), 0) * 2.55;", +" b = Math.max(Math.min(Number(b), 100), 0) * 2.55;"," r = ('0' + (Math.round(r) || 0).toString(16)).slice(-2);"," g = ('0' + (Math.round(g) || 0).toString(16)).slice(-2);"," b = ('0' + (Math.round(b) || 0).toString(16)).slice(-2);"," return '#' + r + g + b;","}"])+"("+b+", "+c+", "+a+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; +Blockly.JavaScript.colour_blend=function(a){var b=Blockly.JavaScript.valueToCode(a,"COLOUR1",Blockly.JavaScript.ORDER_COMMA)||"'#000000'",c=Blockly.JavaScript.valueToCode(a,"COLOUR2",Blockly.JavaScript.ORDER_COMMA)||"'#000000'";a=Blockly.JavaScript.valueToCode(a,"RATIO",Blockly.JavaScript.ORDER_COMMA)||.5;return[Blockly.JavaScript.provideFunction_("colourBlend",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(c1, c2, ratio) {"," ratio = Math.max(Math.min(Number(ratio), 1), 0);"," var r1 = parseInt(c1.substring(1, 3), 16);", +" var g1 = parseInt(c1.substring(3, 5), 16);"," var b1 = parseInt(c1.substring(5, 7), 16);"," var r2 = parseInt(c2.substring(1, 3), 16);"," var g2 = parseInt(c2.substring(3, 5), 16);"," var b2 = parseInt(c2.substring(5, 7), 16);"," var r = Math.round(r1 * (1 - ratio) + r2 * ratio);"," var g = Math.round(g1 * (1 - ratio) + g2 * ratio);"," var b = Math.round(b1 * (1 - ratio) + b2 * ratio);"," r = ('0' + (r || 0).toString(16)).slice(-2);"," g = ('0' + (g || 0).toString(16)).slice(-2);"," b = ('0' + (b || 0).toString(16)).slice(-2);", +" return '#' + r + g + b;","}"])+"("+b+", "+c+", "+a+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]};Blockly.JavaScript.procedures={}; +Blockly.JavaScript.procedures_defreturn=function(a){var b=Blockly.JavaScript.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE),c=Blockly.JavaScript.statementToCode(a,"STACK");Blockly.JavaScript.STATEMENT_PREFIX&&(c=Blockly.JavaScript.prefixLines(Blockly.JavaScript.STATEMENT_PREFIX.replace(/%1/g,"'"+a.id+"'"),Blockly.JavaScript.INDENT)+c);Blockly.JavaScript.INFINITE_LOOP_TRAP&&(c=Blockly.JavaScript.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+a.id+"'")+c);var d=Blockly.JavaScript.valueToCode(a, +"RETURN",Blockly.JavaScript.ORDER_NONE)||"";d&&(d=" return "+d+";\n");for(var e=[],f=0;f= ")+d+"; "+b;b=Math.abs(parseFloat(e));a=(1==b?a+(g?"++":"--"):a+((g?" += ":" -= ")+b))+(") {\n"+f+"}\n")}else a="",g=c,c.match(/^\w+$/)||Blockly.isNumber(c)||(g=Blockly.JavaScript.variableDB_.getDistinctName(b+"_start",Blockly.Variables.NAME_TYPE),a+="var "+g+" = "+c+";\n"),c=d,d.match(/^\w+$/)||Blockly.isNumber(d)||(c=Blockly.JavaScript.variableDB_.getDistinctName(b+"_end",Blockly.Variables.NAME_TYPE), +a+="var "+c+" = "+d+";\n"),d=Blockly.JavaScript.variableDB_.getDistinctName(b+"_inc",Blockly.Variables.NAME_TYPE),a+="var "+d+" = ",a=Blockly.isNumber(e)?a+(Math.abs(e)+";\n"):a+("Math.abs("+e+");\n"),a=a+("if ("+g+" > "+c+") {\n")+(Blockly.JavaScript.INDENT+d+" = -"+d+";\n"),a+="}\n",a+="for ("+b+" = "+g+"; "+d+" >= 0 ? "+b+" <= "+c+" : "+b+" >= "+c+"; "+b+" += "+d+") {\n"+f+"}\n";return a}; +Blockly.JavaScript.controls_forEach=function(a){var b=Blockly.JavaScript.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_ASSIGNMENT)||"[]",d=Blockly.JavaScript.statementToCode(a,"DO"),d=Blockly.JavaScript.addLoopTrap(d,a.id);a="";var e=c;c.match(/^\w+$/)||(e=Blockly.JavaScript.variableDB_.getDistinctName(b+"_list",Blockly.Variables.NAME_TYPE),a+="var "+e+" = "+c+";\n");c=Blockly.JavaScript.variableDB_.getDistinctName(b+ +"_index",Blockly.Variables.NAME_TYPE);d=Blockly.JavaScript.INDENT+b+" = "+e+"["+c+"];\n"+d;return a+("for (var "+c+" in "+e+") {\n"+d+"}\n")};Blockly.JavaScript.controls_flow_statements=function(a){switch(a.getFieldValue("FLOW")){case "BREAK":return"break;\n";case "CONTINUE":return"continue;\n"}throw"Unknown flow statement.";};Blockly.JavaScript.logic={};Blockly.JavaScript.controls_if=function(a){var b=0,c="",d,e;do e=Blockly.JavaScript.valueToCode(a,"IF"+b,Blockly.JavaScript.ORDER_NONE)||"false",d=Blockly.JavaScript.statementToCode(a,"DO"+b),c+=(0",GTE:">="}[a.getFieldValue("OP")],c="=="==b||"!="==b?Blockly.JavaScript.ORDER_EQUALITY:Blockly.JavaScript.ORDER_RELATIONAL,d=Blockly.JavaScript.valueToCode(a,"A",c)||"0";a=Blockly.JavaScript.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; +Blockly.JavaScript.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"&&":"||",c="&&"==b?Blockly.JavaScript.ORDER_LOGICAL_AND:Blockly.JavaScript.ORDER_LOGICAL_OR,d=Blockly.JavaScript.valueToCode(a,"A",c);a=Blockly.JavaScript.valueToCode(a,"B",c);if(d||a){var e="&&"==b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]}; +Blockly.JavaScript.logic_negate=function(a){var b=Blockly.JavaScript.ORDER_LOGICAL_NOT;return["!"+(Blockly.JavaScript.valueToCode(a,"BOOL",b)||"true"),b]};Blockly.JavaScript.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"true":"false",Blockly.JavaScript.ORDER_ATOMIC]};Blockly.JavaScript.logic_null=function(a){return["null",Blockly.JavaScript.ORDER_ATOMIC]}; +Blockly.JavaScript.logic_ternary=function(a){var b=Blockly.JavaScript.valueToCode(a,"IF",Blockly.JavaScript.ORDER_CONDITIONAL)||"false",c=Blockly.JavaScript.valueToCode(a,"THEN",Blockly.JavaScript.ORDER_CONDITIONAL)||"null";a=Blockly.JavaScript.valueToCode(a,"ELSE",Blockly.JavaScript.ORDER_CONDITIONAL)||"null";return[b+" ? "+c+" : "+a,Blockly.JavaScript.ORDER_CONDITIONAL]}; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/lua_compressed.js b/src/opsoro/server/static/js/blockly/lua_compressed.js new file mode 100644 index 0000000..9f3a918 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/lua_compressed.js @@ -0,0 +1,79 @@ +// Do not edit this file; automatically generated by build.py. +'use strict'; + + +// Copyright 2016 Google Inc. Apache License 2.0 +Blockly.Lua=new Blockly.Generator("Lua");Blockly.Lua.addReservedWords("_,__inext,assert,bit,colors,colours,coroutine,disk,dofile,error,fs,fetfenv,getmetatable,gps,help,io,ipairs,keys,loadfile,loadstring,math,native,next,os,paintutils,pairs,parallel,pcall,peripheral,print,printError,rawequal,rawget,rawset,read,rednet,redstone,rs,select,setfenv,setmetatable,sleep,string,table,term,textutils,tonumber,tostring,turtle,type,unpack,vector,write,xpcall,_VERSION,__indext,HTTP,and,break,do,else,elseif,end,false,for,function,if,in,local,nil,not,or,repeat,return,then,true,until,while,add,sub,mul,div,mod,pow,unm,concat,len,eq,lt,le,index,newindex,call,assert,collectgarbage,dofile,error,_G,getmetatable,inpairs,load,loadfile,next,pairs,pcall,print,rawequal,rawget,rawlen,rawset,select,setmetatable,tonumber,tostring,type,_VERSION,xpcall,require,package,string,table,math,bit32,io,file,os,debug"); +Blockly.Lua.ORDER_ATOMIC=0;Blockly.Lua.ORDER_HIGH=1;Blockly.Lua.ORDER_EXPONENTIATION=2;Blockly.Lua.ORDER_UNARY=3;Blockly.Lua.ORDER_MULTIPLICATIVE=4;Blockly.Lua.ORDER_ADDITIVE=5;Blockly.Lua.ORDER_CONCATENATION=6;Blockly.Lua.ORDER_RELATIONAL=7;Blockly.Lua.ORDER_AND=8;Blockly.Lua.ORDER_OR=9;Blockly.Lua.ORDER_NONE=99; +Blockly.Lua.init=function(a){Blockly.Lua.definitions_=Object.create(null);Blockly.Lua.functionNames_=Object.create(null);Blockly.Lua.variableDB_?Blockly.Lua.variableDB_.reset():Blockly.Lua.variableDB_=new Blockly.Names(Blockly.Lua.RESERVED_WORDS_)};Blockly.Lua.finish=function(a){var b=[],c;for(c in Blockly.Lua.definitions_)b.push(Blockly.Lua.definitions_[c]);delete Blockly.Lua.definitions_;delete Blockly.Lua.functionNames_;Blockly.Lua.variableDB_.reset();return b.join("\n\n")+"\n\n\n"+a}; +Blockly.Lua.scrubNakedValue=function(a){return"local _ = "+a+"\n"};Blockly.Lua.quote_=function(a){a=a.replace(/\\/g,"\\\\").replace(/\n/g,"\\\n").replace(/'/g,"\\'");return"'"+a+"'"}; +Blockly.Lua.scrub_=function(a,b){var c="";if(!a.outputConnection||!a.outputConnection.targetConnection){var d=a.getCommentText();(d=Blockly.utils.wrap(d,Blockly.Lua.COMMENT_WRAP-3))&&(c+=Blockly.Lua.prefixLines(d,"-- ")+"\n");for(var e=0;ea?Blockly.Lua.ORDER_UNARY:Blockly.Lua.ORDER_ATOMIC]}; +Blockly.Lua.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.Lua.ORDER_ADDITIVE],MINUS:[" - ",Blockly.Lua.ORDER_ADDITIVE],MULTIPLY:[" * ",Blockly.Lua.ORDER_MULTIPLICATIVE],DIVIDE:[" / ",Blockly.Lua.ORDER_MULTIPLICATIVE],POWER:[" ^ ",Blockly.Lua.ORDER_EXPONENTIATION]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.Lua.valueToCode(a,"A",b)||"0";a=Blockly.Lua.valueToCode(a,"B",b)||"0";return[d+c+a,b]}; +Blockly.Lua.math_single=function(a){var b=a.getFieldValue("OP");if("NEG"==b)return a=Blockly.Lua.valueToCode(a,"NUM",Blockly.Lua.ORDER_UNARY)||"0",["-"+a,Blockly.Lua.ORDER_UNARY];a="SIN"==b||"COS"==b||"TAN"==b?Blockly.Lua.valueToCode(a,"NUM",Blockly.Lua.ORDER_MULTIPLICATIVE)||"0":Blockly.Lua.valueToCode(a,"NUM",Blockly.Lua.ORDER_NONE)||"0";switch(b){case "ABS":b="math.abs("+a+")";break;case "ROOT":b="math.sqrt("+a+")";break;case "LN":b="math.log("+a+")";break;case "LOG10":b="math.log10("+a+")";break; +case "EXP":b="math.exp("+a+")";break;case "POW10":b="math.pow(10,"+a+")";break;case "ROUND":b="math.floor("+a+" + .5)";break;case "ROUNDUP":b="math.ceil("+a+")";break;case "ROUNDDOWN":b="math.floor("+a+")";break;case "SIN":b="math.sin(math.rad("+a+"))";break;case "COS":b="math.cos(math.rad("+a+"))";break;case "TAN":b="math.tan(math.rad("+a+"))";break;case "ASIN":b="math.deg(math.asin("+a+"))";break;case "ACOS":b="math.deg(math.acos("+a+"))";break;case "ATAN":b="math.deg(math.atan("+a+"))";break;default:throw"Unknown math operator: "+ +b;}return[b,Blockly.Lua.ORDER_HIGH]};Blockly.Lua.math_constant=function(a){return{PI:["math.pi",Blockly.Lua.ORDER_HIGH],E:["math.exp(1)",Blockly.Lua.ORDER_HIGH],GOLDEN_RATIO:["(1 + math.sqrt(5)) / 2",Blockly.Lua.ORDER_MULTIPLICATIVE],SQRT2:["math.sqrt(2)",Blockly.Lua.ORDER_HIGH],SQRT1_2:["math.sqrt(1 / 2)",Blockly.Lua.ORDER_HIGH],INFINITY:["math.huge",Blockly.Lua.ORDER_HIGH]}[a.getFieldValue("CONSTANT")]}; +Blockly.Lua.math_number_property=function(a){var b=Blockly.Lua.valueToCode(a,"NUMBER_TO_CHECK",Blockly.Lua.ORDER_MULTIPLICATIVE)||"0",c=a.getFieldValue("PROPERTY"),d;if("PRIME"==c)return[Blockly.Lua.provideFunction_("math_isPrime",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(n)"," -- https://en.wikipedia.org/wiki/Primality_test#Naive_methods"," if n == 2 or n == 3 then"," return true"," end"," -- False if n is NaN, negative, is 1, or not whole."," -- And false if n is divisible by 2 or 3.", +" if not(n > 1) or n % 1 ~= 0 or n % 2 == 0 or n % 3 == 0 then"," return false"," end"," -- Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for x = 6, math.sqrt(n) + 1.5, 6 do"," if n % (x - 1) == 0 or n % (x + 1) == 0 then"," return false"," end"," end"," return true","end"])+"("+b+")",Blockly.Lua.ORDER_HIGH];switch(c){case "EVEN":d=b+" % 2 == 0";break;case "ODD":d=b+" % 2 == 1";break;case "WHOLE":d=b+" % 1 == 0";break;case "POSITIVE":d=b+" > 0";break;case "NEGATIVE":d= +b+" < 0";break;case "DIVISIBLE_BY":a=Blockly.Lua.valueToCode(a,"DIVISOR",Blockly.Lua.ORDER_MULTIPLICATIVE);if(!a||"0"==a)return["nil",Blockly.Lua.ORDER_ATOMIC];d=b+" % "+a+" == 0"}return[d,Blockly.Lua.ORDER_RELATIONAL]};Blockly.Lua.math_change=function(a){var b=Blockly.Lua.valueToCode(a,"DELTA",Blockly.Lua.ORDER_ADDITIVE)||"0";a=Blockly.Lua.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);return a+" = "+a+" + "+b+"\n"};Blockly.Lua.math_round=Blockly.Lua.math_single; +Blockly.Lua.math_trig=Blockly.Lua.math_single; +Blockly.Lua.math_on_list=function(a){function b(){return Blockly.Lua.provideFunction_("math_sum",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," local result = 0"," for _, v in ipairs(t) do"," result = result + v"," end"," return result","end"])}var c=a.getFieldValue("OP");a=Blockly.Lua.valueToCode(a,"LIST",Blockly.Lua.ORDER_NONE)||"{}";switch(c){case "SUM":c=b();break;case "MIN":c=Blockly.Lua.provideFunction_("math_min",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)", +" if #t == 0 then"," return 0"," end"," local result = math.huge"," for _, v in ipairs(t) do"," if v < result then"," result = v"," end"," end"," return result","end"]);break;case "AVERAGE":c=Blockly.Lua.provideFunction_("math_average",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," if #t == 0 then"," return 0"," end"," return "+b()+"(t) / #t","end"]);break;case "MAX":c=Blockly.Lua.provideFunction_("math_max",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+ +"(t)"," if #t == 0 then"," return 0"," end"," local result = -math.huge"," for _, v in ipairs(t) do"," if v > result then"," result = v"," end"," end"," return result","end"]);break;case "MEDIAN":c=Blockly.Lua.provideFunction_("math_median",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," -- Source: http://lua-users.org/wiki/SimpleStats"," if #t == 0 then"," return 0"," end"," local temp={}"," for _, v in ipairs(t) do",' if type(v) == "number" then'," table.insert(temp, v)", +" end"," end"," table.sort(temp)"," if #temp % 2 == 0 then"," return (temp[#temp/2] + temp[(#temp/2)+1]) / 2"," else"," return temp[math.ceil(#temp/2)]"," end","end"]);break;case "MODE":c=Blockly.Lua.provideFunction_("math_modes",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," -- Source: http://lua-users.org/wiki/SimpleStats"," local counts={}"," for _, v in ipairs(t) do"," if counts[v] == nil then"," counts[v] = 1"," else"," counts[v] = counts[v] + 1", +" end"," end"," local biggestCount = 0"," for _, v in pairs(counts) do"," if v > biggestCount then"," biggestCount = v"," end"," end"," local temp={}"," for k, v in pairs(counts) do"," if v == biggestCount then"," table.insert(temp, k)"," end"," end"," return temp","end"]);break;case "STD_DEV":c=Blockly.Lua.provideFunction_("math_standard_deviation",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," local m"," local vm"," local total = 0"," local count = 0", +" local result"," m = #t == 0 and 0 or "+b()+"(t) / #t"," for _, v in ipairs(t) do"," if type(v) == 'number' then"," vm = v - m"," total = total + (vm * vm)"," count = count + 1"," end"," end"," result = math.sqrt(total / (count-1))"," return result","end"]);break;case "RANDOM":c=Blockly.Lua.provideFunction_("math_random_list",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," if #t == 0 then"," return nil"," end"," return t[math.random(#t)]","end"]);break; +default:throw"Unknown operator: "+c;}return[c+"("+a+")",Blockly.Lua.ORDER_HIGH]};Blockly.Lua.math_modulo=function(a){var b=Blockly.Lua.valueToCode(a,"DIVIDEND",Blockly.Lua.ORDER_MULTIPLICATIVE)||"0";a=Blockly.Lua.valueToCode(a,"DIVISOR",Blockly.Lua.ORDER_MULTIPLICATIVE)||"0";return[b+" % "+a,Blockly.Lua.ORDER_MULTIPLICATIVE]}; +Blockly.Lua.math_constrain=function(a){var b=Blockly.Lua.valueToCode(a,"VALUE",Blockly.Lua.ORDER_NONE)||"0",c=Blockly.Lua.valueToCode(a,"LOW",Blockly.Lua.ORDER_NONE)||"-math.huge";a=Blockly.Lua.valueToCode(a,"HIGH",Blockly.Lua.ORDER_NONE)||"math.huge";return["math.min(math.max("+b+", "+c+"), "+a+")",Blockly.Lua.ORDER_HIGH]}; +Blockly.Lua.math_random_int=function(a){var b=Blockly.Lua.valueToCode(a,"FROM",Blockly.Lua.ORDER_NONE)||"0";a=Blockly.Lua.valueToCode(a,"TO",Blockly.Lua.ORDER_NONE)||"0";return["math.random("+b+", "+a+")",Blockly.Lua.ORDER_HIGH]};Blockly.Lua.math_random_float=function(a){return["math.random()",Blockly.Lua.ORDER_HIGH]};Blockly.Lua.variables={};Blockly.Lua.variables_get=function(a){return[Blockly.Lua.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),Blockly.Lua.ORDER_ATOMIC]};Blockly.Lua.variables_set=function(a){var b=Blockly.Lua.valueToCode(a,"VALUE",Blockly.Lua.ORDER_NONE)||"0";return Blockly.Lua.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE)+" = "+b+"\n"};Blockly.Lua.colour={};Blockly.Lua.colour_picker=function(a){return["'"+a.getFieldValue("COLOUR")+"'",Blockly.Lua.ORDER_ATOMIC]};Blockly.Lua.colour_random=function(a){return['string.format("#%06x", math.random(0, 2^24 - 1))',Blockly.Lua.ORDER_HIGH]}; +Blockly.Lua.colour_rgb=function(a){var b=Blockly.Lua.provideFunction_("colour_rgb",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(r, g, b)"," r = math.floor(math.min(100, math.max(0, r)) * 2.55 + .5)"," g = math.floor(math.min(100, math.max(0, g)) * 2.55 + .5)"," b = math.floor(math.min(100, math.max(0, b)) * 2.55 + .5)",' return string.format("#%02x%02x%02x", r, g, b)',"end"]),c=Blockly.Lua.valueToCode(a,"RED",Blockly.Lua.ORDER_NONE)||0,d=Blockly.Lua.valueToCode(a,"GREEN",Blockly.Lua.ORDER_NONE)|| +0;a=Blockly.Lua.valueToCode(a,"BLUE",Blockly.Lua.ORDER_NONE)||0;return[b+"("+c+", "+d+", "+a+")",Blockly.Lua.ORDER_HIGH]}; +Blockly.Lua.colour_blend=function(a){var b=Blockly.Lua.provideFunction_("colour_blend",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(colour1, colour2, ratio)"," local r1 = tonumber(string.sub(colour1, 2, 3), 16)"," local r2 = tonumber(string.sub(colour2, 2, 3), 16)"," local g1 = tonumber(string.sub(colour1, 4, 5), 16)"," local g2 = tonumber(string.sub(colour2, 4, 5), 16)"," local b1 = tonumber(string.sub(colour1, 6, 7), 16)"," local b2 = tonumber(string.sub(colour2, 6, 7), 16)"," local ratio = math.min(1, math.max(0, ratio))", +" local r = math.floor(r1 * (1 - ratio) + r2 * ratio + .5)"," local g = math.floor(g1 * (1 - ratio) + g2 * ratio + .5)"," local b = math.floor(b1 * (1 - ratio) + b2 * ratio + .5)",' return string.format("#%02x%02x%02x", r, g, b)',"end"]),c=Blockly.Lua.valueToCode(a,"COLOUR1",Blockly.Lua.ORDER_NONE)||"'#000000'",d=Blockly.Lua.valueToCode(a,"COLOUR2",Blockly.Lua.ORDER_NONE)||"'#000000'";a=Blockly.Lua.valueToCode(a,"RATIO",Blockly.Lua.ORDER_NONE)||0;return[b+"("+c+", "+d+", "+a+")",Blockly.Lua.ORDER_HIGH]};Blockly.Lua.procedures={}; +Blockly.Lua.procedures_defreturn=function(a){var b=Blockly.Lua.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE),c=Blockly.Lua.statementToCode(a,"STACK");Blockly.Lua.STATEMENT_PREFIX&&(c=Blockly.Lua.prefixLines(Blockly.Lua.STATEMENT_PREFIX.replace(/%1/g,"'"+a.id+"'"),Blockly.Lua.INDENT)+c);Blockly.Lua.INFINITE_LOOP_TRAP&&(c=Blockly.Lua.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+a.id+"'")+c);var d=Blockly.Lua.valueToCode(a,"RETURN",Blockly.Lua.ORDER_NONE)||"";d?d=" return "+d+"\n": +c||(c="");for(var e=[],f=0;f ("+d+") then\n")+(Blockly.Lua.INDENT+g+" = -"+g+"\n"),a+="end\n");return a+("for "+b+" = "+c+", "+d+", "+g)+(" do\n"+f+"end\n")}; +Blockly.Lua.controls_forEach=function(a){var b=Blockly.Lua.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.Lua.valueToCode(a,"LIST",Blockly.Lua.ORDER_NONE)||"{}";a=Blockly.Lua.statementToCode(a,"DO")||"\n";a=Blockly.Lua.addContinueLabel(a);return"for _, "+b+" in ipairs("+c+") do \n"+a+"end\n"}; +Blockly.Lua.controls_flow_statements=function(a){switch(a.getFieldValue("FLOW")){case "BREAK":return"break\n";case "CONTINUE":return Blockly.Lua.CONTINUE_STATEMENT}throw"Unknown flow statement.";};Blockly.Lua.logic={};Blockly.Lua.controls_if=function(a){var b=0,c="",d,e;do e=Blockly.Lua.valueToCode(a,"IF"+b,Blockly.Lua.ORDER_NONE)||"false",d=Blockly.Lua.statementToCode(a,"DO"+b),c+=(0",GTE:">="}[a.getFieldValue("OP")],c=Blockly.Lua.valueToCode(a,"A",Blockly.Lua.ORDER_RELATIONAL)||"0";a=Blockly.Lua.valueToCode(a,"B",Blockly.Lua.ORDER_RELATIONAL)||"0";return[c+" "+b+" "+a,Blockly.Lua.ORDER_RELATIONAL]}; +Blockly.Lua.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"and":"or",c="and"==b?Blockly.Lua.ORDER_AND:Blockly.Lua.ORDER_OR,d=Blockly.Lua.valueToCode(a,"A",c);a=Blockly.Lua.valueToCode(a,"B",c);if(d||a){var e="and"==b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]};Blockly.Lua.logic_negate=function(a){return["not "+(Blockly.Lua.valueToCode(a,"BOOL",Blockly.Lua.ORDER_UNARY)||"true"),Blockly.Lua.ORDER_UNARY]}; +Blockly.Lua.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"true":"false",Blockly.Lua.ORDER_ATOMIC]};Blockly.Lua.logic_null=function(a){return["nil",Blockly.Lua.ORDER_ATOMIC]};Blockly.Lua.logic_ternary=function(a){var b=Blockly.Lua.valueToCode(a,"IF",Blockly.Lua.ORDER_AND)||"false",c=Blockly.Lua.valueToCode(a,"THEN",Blockly.Lua.ORDER_AND)||"nil";a=Blockly.Lua.valueToCode(a,"ELSE",Blockly.Lua.ORDER_OR)||"nil";return[b+" and "+c+" or "+a,Blockly.Lua.ORDER_OR]}; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/1x1.gif b/src/opsoro/server/static/js/blockly/media/1x1.gif similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/1x1.gif rename to src/opsoro/server/static/js/blockly/media/1x1.gif diff --git a/src/opsoro/server/static/js/blockly/media/click.mp3 b/src/opsoro/server/static/js/blockly/media/click.mp3 new file mode 100644 index 0000000..4534b0d Binary files /dev/null and b/src/opsoro/server/static/js/blockly/media/click.mp3 differ diff --git a/src/opsoro/server/static/js/blockly/media/click.ogg b/src/opsoro/server/static/js/blockly/media/click.ogg new file mode 100644 index 0000000..e8ae42a Binary files /dev/null and b/src/opsoro/server/static/js/blockly/media/click.ogg differ diff --git a/src/opsoro/server/static/js/blockly/media/click.wav b/src/opsoro/server/static/js/blockly/media/click.wav new file mode 100644 index 0000000..41a50cd Binary files /dev/null and b/src/opsoro/server/static/js/blockly/media/click.wav differ diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/delete.mp3 b/src/opsoro/server/static/js/blockly/media/delete.mp3 similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/delete.mp3 rename to src/opsoro/server/static/js/blockly/media/delete.mp3 diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/delete.ogg b/src/opsoro/server/static/js/blockly/media/delete.ogg similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/delete.ogg rename to src/opsoro/server/static/js/blockly/media/delete.ogg diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/delete.wav b/src/opsoro/server/static/js/blockly/media/delete.wav similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/delete.wav rename to src/opsoro/server/static/js/blockly/media/delete.wav diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/disconnect.mp3 b/src/opsoro/server/static/js/blockly/media/disconnect.mp3 similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/disconnect.mp3 rename to src/opsoro/server/static/js/blockly/media/disconnect.mp3 diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/disconnect.ogg b/src/opsoro/server/static/js/blockly/media/disconnect.ogg similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/disconnect.ogg rename to src/opsoro/server/static/js/blockly/media/disconnect.ogg diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/disconnect.wav b/src/opsoro/server/static/js/blockly/media/disconnect.wav similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/disconnect.wav rename to src/opsoro/server/static/js/blockly/media/disconnect.wav diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/handclosed.cur b/src/opsoro/server/static/js/blockly/media/handclosed.cur similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/handclosed.cur rename to src/opsoro/server/static/js/blockly/media/handclosed.cur diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/handdelete.cur b/src/opsoro/server/static/js/blockly/media/handdelete.cur similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/handdelete.cur rename to src/opsoro/server/static/js/blockly/media/handdelete.cur diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/handopen.cur b/src/opsoro/server/static/js/blockly/media/handopen.cur similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/handopen.cur rename to src/opsoro/server/static/js/blockly/media/handopen.cur diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/quote0.png b/src/opsoro/server/static/js/blockly/media/quote0.png similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/quote0.png rename to src/opsoro/server/static/js/blockly/media/quote0.png diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/quote1.png b/src/opsoro/server/static/js/blockly/media/quote1.png similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/quote1.png rename to src/opsoro/server/static/js/blockly/media/quote1.png diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/sprites.png b/src/opsoro/server/static/js/blockly/media/sprites.png similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/sprites.png rename to src/opsoro/server/static/js/blockly/media/sprites.png diff --git a/src/opsoro/apps/visual_programming/static/blockly/media/sprites.svg b/src/opsoro/server/static/js/blockly/media/sprites.svg similarity index 100% rename from src/opsoro/apps/visual_programming/static/blockly/media/sprites.svg rename to src/opsoro/server/static/js/blockly/media/sprites.svg diff --git a/src/opsoro/server/static/js/blockly/msg/js/ar.js b/src/opsoro/server/static/js/blockly/msg/js/ar.js new file mode 100644 index 0000000..5c04dca --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/ar.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.ar'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "اضافة تعليق"; +Blockly.Msg.CHANGE_VALUE_TITLE = "تغيير قيمة:"; +Blockly.Msg.CLEAN_UP = "مجموعات التنظيف"; +Blockly.Msg.COLLAPSE_ALL = "إخفاء القطع"; +Blockly.Msg.COLLAPSE_BLOCK = "إخفاء القطعة"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "اللون 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "اللون 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "نسبة"; +Blockly.Msg.COLOUR_BLEND_TITLE = "دمج"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "دمج لونين ببعضهما البعض بنسبة (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ar.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "اختر لون من اللوحة."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "لون عشوائي"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "اختر لون بشكل عشوائي."; +Blockly.Msg.COLOUR_RGB_BLUE = "أزرق"; +Blockly.Msg.COLOUR_RGB_GREEN = "أخضر"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "أحمر"; +Blockly.Msg.COLOUR_RGB_TITLE = "لون مع"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "إنشئ لون بالكمية المحددة من الأحمر, الأخضر والأزرق. بحيث يجب تكون كافة القيم بين 0 و 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "اخرج من الحلقة"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "استمر ابتداءا من التكرار التالي من الحلقة"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "اخرج من الحلقة الحالية."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "تخط ما تبقى من هذه الحلقة، واستمر ابتداءا من التكرار التالي."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "تحذير: يمكن استخدام هذه القطعة فقط داخل حلقة."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "لكل عنصر %1 في قائمة %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "لكل عنصر في قائمة ما، عين المتغير '%1' لهذا الغنصر، ومن ثم نفذ بعض الأوامر."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "عد بـ %1 من %2 إلى %3 بمعدل %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "اجعل المتغير %1 يأخذ القيم من رقم البداية الى رقم النهاية، وقم بالعد داخل المجال المحدد، وطبق أوامر القطع المحددة."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "إضف شرطا إلى القطعة الشرطية \"إذا\"."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "أضف شرط \"نهاية، إجمع\" إلى القطعة الشرطية \"إذا\"."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "أضف, إزل, أو أعد ترتيب المقاطع لإعادة تكوين القطعة الشرطية \"إذا\"."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "والا"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "وإﻻ إذا"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "إذا"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "إذا كانت قيمة ما تساوي صحيح, إذن قم بتنفيذ أمر ما."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "إذا كانت قيمة ما تساوي \"صحيح\"، إذن قم بتنفيذ أول قطعة من الأوامر. والا ،قم بتنفيذ القطعة الثانية من الأوامر."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "إذا كانت القيمة الأولى تساوي \"صحيح\", إذن قم بتنفيذ القطعة الأولى من الأوامر. والا, إذا كانت القيمة الثانية تساوي \"صحيح\", قم بتنفيذ القطعة الثانية من الأوامر."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "إذا كانت القيمة الأولى تساوي \"صحيح\", إذن قم بتنفيذ القطعة الأولى من الأوامر. والا , إذا كانت القيمة الثانية تساوي \"صحيح\", قم بتنفيذ القطعة الثانية من الأوامر. إذا لم تكن هناك أي قيمة تساوي صحيح, قم بتنفيذ آخر قطعة من الأوامر."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "نفّذ"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "كرر %1 مرات"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "نفّذ بعض الأوامر عدة مرات."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "اكرّر حتى"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "اكرّر طالما"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "بما ان القيمة خاطئة, نفّذ بعض الأوامر."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "بما ان القيمة صحيحة, نفّذ بعض الأوامر."; +Blockly.Msg.DELETE_ALL_BLOCKS = "حذف كل مناعات %1؟"; +Blockly.Msg.DELETE_BLOCK = "إحذف القطعة"; +Blockly.Msg.DELETE_VARIABLE = "حذف المتغير %1"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "حذف%1 1 استخدامات المتغير '%2'؟"; +Blockly.Msg.DELETE_X_BLOCKS = "إحذف قطع %1"; +Blockly.Msg.DISABLE_BLOCK = "عطّل القطعة"; +Blockly.Msg.DUPLICATE_BLOCK = "ادمج"; +Blockly.Msg.ENABLE_BLOCK = "أعد تفعيل القطعة"; +Blockly.Msg.EXPAND_ALL = "وسٌّع القطع"; +Blockly.Msg.EXPAND_BLOCK = "وسٌّع القطعة"; +Blockly.Msg.EXTERNAL_INPUTS = "ادخال خارجي"; +Blockly.Msg.HELP = "مساعدة"; +Blockly.Msg.INLINE_INPUTS = "ادخال خطي"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "إنشئ قائمة فارغة"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "تقوم بإرجاع قائمة، طولها 0, لا تحتوي على أية سجلات البيانات"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "قائمة"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "أضف, إزل, أو أعد ترتيب المقاطع لإعادة تكوين القطعة قائمة القطع التالية."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "أتشئ قائمة مع"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "أضف عنصرا إلى القائمة."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "أنشيء قائمة من أي عدد من العناصر."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "أول"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# من نهاية"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "احصل على"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "احصل على و ازل"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "أخير"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "عشوائي"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "ازل"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "يرجع العنصر الأول في قائمة ما."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "يقوم بإرجاع العنصر في الموضع المحدد في قائمة ما."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "يرجع العنصر الأخير في قائمة ما."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "يرجع عنصرا عشوائيا في قائمة."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "يزيل ويرجع العنصر الأول في قائمة."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "يزيل ويقوم بإرجاع العنصر في الموضع المحدد في قائمة ما."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "يزيل ويرجع العنصر الأخير في قائمة ما."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "يزيل و يرجع عنصرا عشوائيا في قائمة ما."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "يزيل العنصر الأول في قائمة ما."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "يزيل العنصر الموجود في الموضع المحدد في قائمة ما."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "يزيل العنصر الأخير في قائمة ما."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "يزيل عنصرا عشوائيا في قائمة ما."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "إلى # من نهاية"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "إلى #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "إلى الأخير"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "احصل على قائمة فرعية من الأول"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "احصل على قائمة فرعية من # من نهاية"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "احصل على قائمة فرعية من #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "يقوم بإنشاء نسخة من الجزء المحدد من قائمة ما."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 هو العنصر الأخير."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 هو العنصر الأول."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "ابحث على على التواجد الأول للعنصر"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "ابحث على التواجد الأخير للعنصر"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "تقوم بإرجاع مؤشر التواجد الأول/الأخير في القائمة. تقوم بإرجاع %1 إذا لم يتم العثور على النص."; +Blockly.Msg.LISTS_INLIST = "في قائمة"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 فارغ"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "يرجع \"صحيح\" إذا كانت القائمة فارغة."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "الطول من %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "تقوم بإرجاع طول قائمة."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "إنشئ قائمة مع العنصر %1 %2 مرات"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "انشئ قائمة تتألف من القيمة المعطاة متكررة لعدد محدد من المرات."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "مثل"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "أدخل في"; +Blockly.Msg.LISTS_SET_INDEX_SET = "تعيين"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "يقوم بإدراج هذا العنصر في بداية قائمة."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "يقوم بإدخال العنصر في الموضع المحدد في قائمة ما."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "ألصق هذا العنصر بنهاية قائمة."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "ادخل العنصر عشوائياً في القائمة."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "يحدد العنصر الأول في قائمة."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "يحدد العنصر في الموضع المحدد في قائمة ما."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "يحدد العنصر الأخير في قائمة."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "يحدد عنصرا عشوائيا في قائمة."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "تصاعديا"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "تنازليا"; +Blockly.Msg.LISTS_SORT_TITLE = "رتب %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "فرز نسخة من القائمة."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "أبجديا، وتجاهل الحالة"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "رقمي"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "أبجديًا"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "إعداد قائمة من النصوص"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "إعداد نص من القائمة"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "ضم قائمة النصوص في نص واحد، مفصولة بواسطة محدد."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "تقسيم النص إلى قائمة من النصوص، وكسر في كل محدد"; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "مع محدد"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "خاطئ"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "يرجع صحيح أو خاطئ."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "صحيح"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "يرجع صحيح إذا كان كلا المدخلات مساوية بعضها البعض."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "يرجع صحيح إذا كان الإدخال الأول أكبر من الإدخال الثاني."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "يرجع صحيح إذا كان الإدخال الأول أكبر من أو يساوي الإدخال الثاني."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "يرجع صحيح إذا كان الإدخال الأول أصغر من الإدخال الثاني."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "يرجع صحيح إذا كان الإدخال الأول أصغر من أو يساوي الإدخال الثاني."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "يرجع صحيح إذا كانت كلا المدخلات غير مساوية لبعضها البعض."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "ليس من %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "يرجع صحيح إذا كان الإدخال خاطئ . يرجع خاطئ إذا كان الإدخال صحيح."; +Blockly.Msg.LOGIC_NULL = "ملغى"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "ترجع ملغى."; +Blockly.Msg.LOGIC_OPERATION_AND = "و"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "أو"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "ترجع صحيح إذا كان كلا المٌدخلات صحيح."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "ترجع صحيح إذا كان واحد على الأقل من المدخلات صحيح."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "اختبار"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "إذا كانت العبارة خاطئة"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "إذا كانت العبارة صحيحة"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "تحقق الشرط في 'الاختبار'. إذا كان الشرط صحيح، يقوم بإرجاع قيمة 'اذا كانت العبارة صحيحة'؛ خلاف ذلك يرجع قيمة 'اذا كانت العبارة خاطئة'."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "يرجع مجموع الرقمين."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "يرجع حاصل قسمة الرقمين."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "يرجع الفرق بين الرقمين."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "يرجع حاصل ضرب الرقمين."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "يرجع الرقم الأول مرفوع إلى تربيع الرقم الثاني."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "غير %1 بـ %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "إضف رقم إلى متغير '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "ير جع واحد من الثوابت الشائعة : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "تقيد %1 منخفض %2 مرتفع %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "تقييد العددليكون بين الحدود المحددة (ضمناً)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "قابل للقسمة"; +Blockly.Msg.MATH_IS_EVEN = "هو زوجي"; +Blockly.Msg.MATH_IS_NEGATIVE = "هو سالب"; +Blockly.Msg.MATH_IS_ODD = "هو فرذي"; +Blockly.Msg.MATH_IS_POSITIVE = "هو موجب"; +Blockly.Msg.MATH_IS_PRIME = "هو أولي"; +Blockly.Msg.MATH_IS_TOOLTIP = "تحقق إذا كان عدد ما زوجيا، فرذيا, أوليا، صحيحا،موجبا أو سالبا، أو إذا كان قابلا للقسمة على عدد معين. يرجع صحيح أو خاطئ."; +Blockly.Msg.MATH_IS_WHOLE = "هو صحيح"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "باقي %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "يرجع الباقي من قسمة الرقمين."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "عدد ما."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "متوسط القائمة"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "الحد الأقصى لقائمة"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "متوسط القائمة"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "الحد الأدنى من قائمة"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "منوال القائمة"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "عنصر عشوائي من القائمة"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "الانحراف المعياري للقائمة"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "مجموع القائمة"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "يرجع المعدل (الوسط الحسابي) للقيم الرقمية في القائمة."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "يرجع أكبر عدد في القائمة."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "يرجع وسيط العدد في القائمة."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "يرجع أصغر رقم في القائمة."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "يرجع قائمة من العنصر أو العناصر الأكثر شيوعاً في القائمة."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "يرجع عنصر عشوائي من القائمة."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "يرجع الانحراف المعياري للقائمة."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "يرجع مجموع كافة الأرقام الموجودة في القائمة."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "كسر عشوائي"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "يرجع جزء عشوائي بين 0.0 (ضمنياً) و 1.0 (خارجيا)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = " عدد صحيح عشوائي من %1 إلى %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "يرجع عدد صحيح عشوائي بين حدين محددين, ضمنيا."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "تقريب"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "تقريب إلى اصغر عدد صحيح"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "تقريب الى اكبر عدد صحيح"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "تقريب الى اكبر عدد صحيح أو الى اصغر عدد صحيح."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "مطلق"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "الجذر التربيعي"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "يرجع القيمة المطلقة لرقم."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "يرجع e الذي هو الاس المرفوع للرقم."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "يرجع اللوغاريتم الطبيعي لرقم."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "يرجع لوغاريتم عدد معين للاساس 10."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "يرجع عدد سالب."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "يرجع مضروب الرقم 10 في نفسه ."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "يرجع الجذر التربيعي للرقم."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "acos"; +Blockly.Msg.MATH_TRIG_ASIN = "asin"; +Blockly.Msg.MATH_TRIG_ATAN = "atan"; +Blockly.Msg.MATH_TRIG_COS = "جيب تمام"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg.MATH_TRIG_SIN = "جيب"; +Blockly.Msg.MATH_TRIG_TAN = "ظل"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "يرجع قوس جيب التمام لرقم."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "يرجع قوس الجيب للرقم."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "يرجع قوس الظل للرقم."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "يرجع جيب التمام لدرجة (لا زواية نصف قطرية)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "يرجع جيب التمام لدرجة (لا زواية نصف قطرية)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "يرجع الظل لدرجة (لا دائرة نصف قطرية)."; +Blockly.Msg.NEW_VARIABLE = "إنشاء متغير..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "اسم المتغير الجديد:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "اسمح بالبيانات"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "مع:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "تشغيل الدالة المعرفة من قبل المستخدم '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "تشغيل الدالة المعرفة من قبل المستخدم %1 واستخدام مخرجاتها."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "مع:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "إنشئ '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "صف هذه الوظيفة..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "القيام بشيء ما"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "إلى"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "انشئ دالة بدون مخرجات ."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "يرجع"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "انشئ دالة مع المخرجات."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "تحذير: هذه الدالة تحتوي على معلمات مكررة."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "تسليط الضوء على تعريف الدالة"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "إذا كانت القيمة صحيحة ، اذان قم بارجاع القيمة الثانية."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "تحذير:هذه القطعة تستخدم فقط داخل تعريف دالة."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "اسم الإدخال:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "أضف مدخلا إلى الوظيفة."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "المدخلات"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "إضافة أو إزالة أو إعادة ترتيب المدخلات لهذه المهمة."; +Blockly.Msg.REDO = "إعادة"; +Blockly.Msg.REMOVE_COMMENT = "ازل التعليق"; +Blockly.Msg.RENAME_VARIABLE = "إعادة تسمية المتغير..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "إعادة تسمية كافة المتغيرات '%1' إلى:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "إلصق نص"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "إلى"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "إلصق جزءا من النص إلى متغير '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "الى حروف صغيرة"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "الى حروف العنوان"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "الى حروف كبيرة"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "يرجع نسخة من النص في حالة مختلفة."; +Blockly.Msg.TEXT_CHARAT_FIRST = "احصل على الحرف الأول"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "الحصول على الحرف # من نهاية"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "الحصول على الحرف #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "في النص"; +Blockly.Msg.TEXT_CHARAT_LAST = "احصل على آخر حرف"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "الحصول على حرف عشوائي"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "يرجع حرف ما في الموضع المحدد."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "إضف عنصر إلى النص."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "الانضمام إلى"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "أضف, إحذف, أو أعد ترتيب المقاطع لإعادة تكوين النص من القطع التالية."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "إلى حرف # من نهاية"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "إلى حرف #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "إلى آخر حرف"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "في النص"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "الحصول على سلسلة فرعية من الحرف الأول"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "الحصول على سلسلة حروف فرعية من الحرف # من نهاية"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "الحصول على سلسلة حروف فرعية من الحرف #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "يرجع جزء معين من النص."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "في النص"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "ابحث عن التواجد الأول للنص"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "ابحث عن التواجد الأخير للنص"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "تقوم بإرجاع مؤشر التواجد الأول/الأخير للنص الأول في النص الثاني. تقوم بإرجاع %1 إذا لم يتم العثور على النص."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 فارغ"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "يرجع \"صحيح\" إذا كان النص المقدم فارغ."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "انشئ نص مع"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "أنشئ جزء من النص بالصاق أي عدد من العناصر ببعضها البعض."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "طول %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "تقوم بإرجاع عدد الاحرف (بما في ذلك الفراغات) في النص المقدم."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "اطبع %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "اطبع النص المحدد أو العدد أو قيمة أخرى."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "انتظر ادخال المستخذم لرقم ما."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "انتظر ادخال المستخدم لنص ما."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "انتظر ادخال المستخدم لرقم ما مع اظهار رسالة"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "انتظر ادخال المستخدم لنص ما مع اظهار رسالة"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "حرف أو كلمة أو سطر من النص."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "إزالة الفراغات من كلا الجانبين"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "إزالة الفراغات من الجانب الأيسر من"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "إزالة الفراغات من الجانب الأيمن من"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "يرجع نسخة من النص مع حذف من أحد أو كلا الفراغات من أطرافه."; +Blockly.Msg.TODAY = "اليوم"; +Blockly.Msg.UNDO = "رجوع"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "البند"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "انشئ 'التعيين %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "يرجع قيمة هذا المتغير."; +Blockly.Msg.VARIABLES_SET = "تعيين %1 إلى %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "انشئ 'احصل على %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "تعيين هذا المتغير لتكون مساوية للقيمة المدخلة."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "المتغير '%1' موجود بالفعل"; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/az.js b/src/opsoro/server/static/js/blockly/msg/js/az.js similarity index 86% rename from src/opsoro/apps/visual_programming/static/blockly/msg/js/az.js rename to src/opsoro/server/static/js/blockly/msg/js/az.js index 9a2c458..a47bd92 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/az.js +++ b/src/opsoro/server/static/js/blockly/msg/js/az.js @@ -7,10 +7,8 @@ goog.provide('Blockly.Msg.az'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "Şərh əlavə et"; -Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated Blockly.Msg.CHANGE_VALUE_TITLE = "Qiyməti dəyiş:"; -Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!"; // untranslated -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "Blokları təmizlə"; Blockly.Msg.COLLAPSE_ALL = "Blokları yığ"; Blockly.Msg.COLLAPSE_BLOCK = "Bloku yığ"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "rəng 1"; @@ -19,7 +17,7 @@ Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/" Blockly.Msg.COLOUR_BLEND_RATIO = "nisbət"; Blockly.Msg.COLOUR_BLEND_TITLE = "qarışdır"; Blockly.Msg.COLOUR_BLEND_TOOLTIP = "İki rəngi verilmiş nisbətdə (0,0 - 1,0) qarışdırır."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; // untranslated +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://az.wikipedia.org/wiki/Rəng"; Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Palitradan bir rəng seçin."; Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated Blockly.Msg.COLOUR_RANDOM_TITLE = "təsadüfi rəng"; @@ -28,7 +26,7 @@ Blockly.Msg.COLOUR_RGB_BLUE = "mavi"; Blockly.Msg.COLOUR_RGB_GREEN = "yaşıl"; Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; Blockly.Msg.COLOUR_RGB_RED = "qırmızı"; -Blockly.Msg.COLOUR_RGB_TITLE = "rəngin komponentləri:"; +Blockly.Msg.COLOUR_RGB_TITLE = "rənglə"; Blockly.Msg.COLOUR_RGB_TOOLTIP = "Qırmızı, yaşıl və mavinin göstərilən miqdarı ilə bir rəng düzəlt. Bütün qiymətlər 0 ilə 100 arasında olmalıdır."; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "dövrdən çıx"; @@ -53,7 +51,7 @@ Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Əgər qiymət doğrudursa, onda bəzi əmr Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Əgər qiymət doğrudursa, onda birinci əmrlər blokunu yerinə yetir. Əks halda isə ikinci əmrlər blokunu yerinə yetir."; Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Əgər birinci qiymət doğrudursa, onda birinci əmrlər blokunu yerinə yetir. Əks halda əgər ikinci qiymət doğrudursa, onda ikinci əmrlər blokunu yerinə yetir."; Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Əgər birinci qiymət doğrudursa, onda birinci əmrlər blokunu yerinə yetir. Əks halda əgər ikinci qiymət doğrudursa, onda ikinci əmrlər blokunu yerinə yetir. Əgər qiymətlərdən heç biri doğru deyilsə, onda axırıncı əmrlər blokunu yerinə yetir."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; // untranslated +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://az.wikipedia.org/wiki/For_loop"; Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "icra et"; Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1 dəfə təkrar et"; Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Bəzi əmrləri bir neçə dəfə yerinə yetir."; @@ -62,7 +60,10 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "təkrar et, ta ki"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "təkrar et, hələ ki"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Hələ ki, qiymət \"yalan\"dır, bəzi əmrləri yerinə yetir."; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Hələ ki, qiymət \"doğru\"dur, bəzi əmrləri yerinə yetir."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Bütün %1 blok silinsin?"; Blockly.Msg.DELETE_BLOCK = "Bloku sil"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated Blockly.Msg.DELETE_X_BLOCKS = "%1 bloku sil"; Blockly.Msg.DISABLE_BLOCK = "Bloku söndür"; Blockly.Msg.DUPLICATE_BLOCK = "Dublikat"; @@ -91,18 +92,15 @@ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "təsadüfi"; Blockly.Msg.LISTS_GET_INDEX_REMOVE = "yığışdır"; Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Siyahının ilk elementini qaytarır."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Siyahıdan təyin olunmuş indeksli elementi qaytarır. #1 son elementdir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Siyahıdan təyin olunmuş indeksli elementi qaytarır. #1 ilk elementdir."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Siyahıdan təyin olunmuş indeksli elementi qaytarır."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Siyahının son elementini qaytarır."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Siyahıdan hər hansı təsadüfi elementi qaytarır."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Siyahıdan ilk elementi silir və qaytarır."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Siyahıdan təyin olunmuş indeksli elementi silir və qaytarır. #1 son elementdir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Siyahıdan təyin olunmuş indeksli elementi silir və qaytarır. #1 ilk elementdir."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Siyahıdan təyin olunmuş indeksli elementi silir və qaytarır."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Siyahıdan son elementi silir və qaytarır."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Siyahıdan təsadufi elementi silir və qaytarır."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Siyahıdan ilk elementi silir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Siyahıdan təyin olunmuş indeksli elementi silir. #1 son elementdir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Siyahıdan təyin olunmuş indeksli elementi silir. #1 ilk elementdir."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Siyahıdan təyin olunmuş indeksli elementi silir."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Siyahıdan son elementi silir."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Siyahıdan təsadüfi bir elementi silir."; Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "sondan # nömrəliyə"; @@ -114,10 +112,12 @@ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "# sonuncudan alt-siyahını alı Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "# - dən alt-siyahını alın"; Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Siyahının təyin olunmuş hissəsinin surətini yaradın."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 son elementdir."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 ilk elementdir."; Blockly.Msg.LISTS_INDEX_OF_FIRST = "Element ilə ilk rastlaşma indeksini müəyyən edin"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "Element ilə son rastlaşma indeksini müəyyən edin"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Siyahıda element ilə ilk/son rastlaşma indeksini qaytarır. Əgər tekst siyahıda tapılmazsa, 0 qaytarılır."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Siyahıda element ilə ilk/son rastlaşma indeksini qaytarır. Əgər tekst siyahıda tapılmazsa, %1 qaytarılır."; Blockly.Msg.LISTS_INLIST = "siyahıda"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 boşdur"; @@ -128,31 +128,40 @@ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Siyahının uzunluğunu verir."; Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_REPEAT_TITLE = "%1 elementinin %2 dəfə təkrarlandığı siyahı düzəlt"; Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Təyin olunmuş elementin/qiymətin təyin olunmuş sayda təkrarlandığı siyahını yaradır."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "Kimi"; Blockly.Msg.LISTS_SET_INDEX_INSERT = "daxil et"; Blockly.Msg.LISTS_SET_INDEX_SET = "təyin et"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Elementi siyahının əvvəlinə daxil edir."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Elementi siyahıda göstərilən yerə daxil edir. #1 axırıncı elementdir."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Elementi siyahıda göstərilən yerə daxil edir. #1 birinci elementdir."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Elementi siyahıda göstərilən yerə daxil edir."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Elementi siyahının sonuna artırır."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Elementi siyahıda təsadüfi seçilmiş bir yerə atır."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Siyahıda birinci elementi təyin edir."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Siyahının göstərilən yerdəki elementini təyin edir. #1 axırıncı elementdir."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Siyahının göstərilən yerdəki elementini təyin edir. #1 birinci elementdir."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Siyahının göstərilən yerdəki elementini təyin edir."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Siyahının sonuncu elementini təyin edir."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Siyahının təsadüfi seçilmiş bir elementini təyin edir."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "yalan"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "səhf"; Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "\"doğru\" və ya \"yalan\" cavanını qaytarır."; +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "\"doğru\" və ya \"səhf\" cavanını qaytarır."; Blockly.Msg.LOGIC_BOOLEAN_TRUE = "doğru"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://az.wikipedia.org/wiki/bərabərsizlik_(riyazi)"; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Girişlər bir birinə bərabərdirsə \"doğru\" cavabını qaytarır."; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Birinci giriş ikincidən böyükdürsə \"doğru\" cavabını qaytarır."; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Birinci giriş ikincidən böyük və ya bərarbərdirsə \"doğru\" cavabını qaytarır."; @@ -161,7 +170,7 @@ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Birinci giriş ikincidən kiçik və ya Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Girişlər bərabər deyillərsə \"doğru\" cavabını qaytarır."; Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg.LOGIC_NEGATE_TITLE = "%1 deyil"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Giriş \"yalan\"-dursa \"doğru\" cavabını qaytarır. Giriş \"doğru\"-dursa \"yalan\" cavabını qaytarır."; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Giriş \"yalan\"-dursa \"doğru\" cavabını qaytarır. Giriş \"doğru\"-dursa \"səhf\" cavabını qaytarır."; Blockly.Msg.LOGIC_NULL = "boş"; Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg.LOGIC_NULL_TOOLTIP = "Boş cavab qaytarır."; @@ -172,7 +181,7 @@ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Hər iki giriş \"doğru\"-dursa \"do Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Girişlərdən heç olmasa biri \"doğru\"-dursa \"doğru\" cavabını qaytarır."; Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "əgər yalandırsa"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "əgər səhfdirsə"; Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "əgər doğrudursa"; Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "'Yoxla' əmrindəki şərtə nəzər yetirin. Əgər şərt \"doğru\"-dursa \"əgər doğru\", əks halda isə \"əgər yalan\" cavabını qaytarır."; Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; @@ -185,9 +194,9 @@ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Birinci ədədin ikinci ədəd dər Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg.MATH_CHANGE_TITLE = "dəyiş: %1 buna: %2"; Blockly.Msg.MATH_CHANGE_TOOLTIP = "'%1' dəyişəninin üzərinə bir ədəd artır."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://az.wikipedia.org/wiki/Riyazi_sabitlər"; Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Ümumi sabitlərdən birini qaytarır π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), və ya ∞ (sonsuzluq)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "%1 üçün ən aşağı %2, ən yuxarı %3 olmağı tələb et"; Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Bir ədədin verilmiş iki ədəd arasında olmasını tələb edir (sərhədlər də daxil olmaqla)."; Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; @@ -203,7 +212,7 @@ Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operatio Blockly.Msg.MATH_MODULO_TITLE = "%1 ÷ %2 bölməsinin qalığı"; Blockly.Msg.MATH_MODULO_TOOLTIP = "İki ədədin nisbətindən alınan qalığı qaytarır."; Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://az.wikipedia.org/wiki/Ədəd"; Blockly.Msg.MATH_NUMBER_TOOLTIP = "Ədəd."; Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "siyahının ədədi ortası"; @@ -234,7 +243,7 @@ Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "yuvarlaqlaşdır"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "aşağı yuvarlaqlaşdır"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "yuxarı yuvarlaqlaşdır"; Blockly.Msg.MATH_ROUND_TOOLTIP = "Ədədi aşağı və ya yuxari yuvarlaqşdır."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; // untranslated +Blockly.Msg.MATH_SINGLE_HELPURL = "https://az.wikipedia.org/wiki/Kvadrat_kökləri"; Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "modul"; Blockly.Msg.MATH_SINGLE_OP_ROOT = "kvadrat kök"; Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Ədədin modulunu qaytarır."; @@ -249,7 +258,7 @@ Blockly.Msg.MATH_TRIG_ACOS = "arccos"; Blockly.Msg.MATH_TRIG_ASIN = "arcsin"; Blockly.Msg.MATH_TRIG_ATAN = "arctan"; Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://az.wikipedia.org/wiki/Triqonometrik_funksiyalar"; Blockly.Msg.MATH_TRIG_SIN = "sin"; Blockly.Msg.MATH_TRIG_TAN = "tg"; Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Ədədin arccosinusunu qaytarır."; @@ -258,35 +267,36 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Ədədin arctanqensini qaytarır."; Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Dərəcənin kosinusunu qaytarır (radianın yox)."; Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Dərəcənin sinusunu qaytar (radianın yox)."; Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Dərəcənin tangensini qaytar (radianın yox)."; -Blockly.Msg.ME = "Me"; // untranslated Blockly.Msg.NEW_VARIABLE = "Yeni dəyişən..."; Blockly.Msg.NEW_VARIABLE_TITLE = "Yeni dəyişənin adı:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "ilə:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Yaradılmış '%1' funksiyasını çalışdır."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Yaradılmış '%1' funksiyasını çalışdır və nəticəni istifadə et."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "ilə:"; Blockly.Msg.PROCEDURES_CREATE_DO = "'%1' yarat"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "hansısa əməliyyat"; Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "icra et:"; Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Nəticəsi olmayan funksiya yaradır."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "qaytar"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Nəticəsi olan funksiya yaradır."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Xəbərdarlıq: Bu funksiyanın təkrar olunmuş parametrləri var."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Funksiyanın təyinatını vurğula"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Əgər bir dəyər \"doğru\"-dursa onda ikinci dəyəri qaytar."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Xəbərdarlıq: Bu blok ancaq bir funksiyanın təyinatı daxilində işlədilə bilər."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Giriş adı:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "girişlər"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Şərhi sil"; Blockly.Msg.RENAME_VARIABLE = "Dəyişənin adını dəyiş..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Bütün '%1' dəyişənlərinin adını buna dəyiş:"; @@ -308,6 +318,9 @@ Blockly.Msg.TEXT_CHARAT_LAST = "axırıncı hərfi götür"; Blockly.Msg.TEXT_CHARAT_RANDOM = "təsadüfi hərf götür"; Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Göstərilən mövqedəki hərfi qaytarır."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Mətnə bir element əlavə et."; Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "birləşdir"; Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Bu mətn blokunu yenidən konfigurasiya etmək üçün bölmələri əlavə edin, silin və ya yerlərini dəyişin."; @@ -326,7 +339,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "mətndə"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "Bu mətn ilə ilk rastlaşmanı tap:"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "Bu mətn ilə son rastlaşmanı tap:"; Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Birinci mətnin ikinci mətndə ilk/son rastlaşma indeksini qaytarır. Əgər rastlaşma baş verməzsə, 0 qaytarır."; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Birinci mətnin ikinci mətndə ilk/son rastlaşma indeksini qaytarır. Əgər rastlaşma baş verməzsə, %1 qaytarır."; Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 boşdur"; Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Verilmiş mətn boşdursa, doğru qiymətini qaytarır."; @@ -344,6 +357,12 @@ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "İstifadəçiyə ədəd daxil etməsi Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "İstifadəçiyə mətn daxil etməsi üçün sorğu/tələb göndərin."; Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "İstifadəçiyə ədəd daxil etməsi üçün sorğunu/tələbi ismarıc kimi göndərin"; Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "İstifadəçiyə mətn daxil etməsi üçün sorğunu/tələbi ismarıc ilə göndərin"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg.TEXT_TEXT_TOOLTIP = "Mətndəki hərf, söz və ya sətir."; Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated @@ -351,7 +370,8 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "Boşluqları hər iki tərəfdən pozun"; Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "Boşluqlari yalnız sol tərəfdən pozun"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "Boşluqları yalnız sağ tərəfdən pozun"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Mətnin hər iki və ya yalnız bir tərəfdən olan boşluqları pozulmuş surətini qaytarın."; -Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.TODAY = "Bugün"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "'%1 - i təyin et' - i yarat"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated @@ -360,13 +380,13 @@ Blockly.Msg.VARIABLES_SET = "%1 - i bu qiymət ilə təyin et: %2"; Blockly.Msg.VARIABLES_SET_CREATE_GET = "'%1 - i götür' - ü yarat"; Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "Bu dəyişəni daxil edilmiş qiymətə bərabər edir."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; @@ -374,9 +394,19 @@ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/ba.js b/src/opsoro/server/static/js/blockly/msg/js/ba.js new file mode 100644 index 0000000..70720b9 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/ba.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.ba'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Фекер өҫтәргә"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Мәғәнәне үҙгәртегеҙ:"; +Blockly.Msg.CLEAN_UP = "Блоктарҙы таҙартырға"; +Blockly.Msg.COLLAPSE_ALL = "Блоктарҙы төрөргә"; +Blockly.Msg.COLLAPSE_BLOCK = "Блокты төрөргә"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "1-се төҫ"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "2-се төҫ"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "1-се төҫтөң өлөшө"; +Blockly.Msg.COLOUR_BLEND_TITLE = "ҡатнаштырырға"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Ике төҫтө бирелгән нисбәттә болғата (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Төҫ"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Палитранан төҫ һайлағыҙ."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "осраҡлы төҫ"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Төҫтө осраҡлылыҡ буйынса һайлай."; +Blockly.Msg.COLOUR_RGB_BLUE = "зәңгәр"; +Blockly.Msg.COLOUR_RGB_GREEN = "йәшелдән"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "ҡыҙылдан"; +Blockly.Msg.COLOUR_RGB_TITLE = "ошонан төҫ"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Бирелгән нисбәттәрҙә ҡыҙылдан, йәшелдән һәм зәңгәрҙән төҫ барлыҡҡа килә. Бөтә мәғәнәләр 0 менән 100 араһында булырға тейеш."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "циклдан сығырға"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "циклдың киләһе аҙымына күсергә"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Был циклды өҙә."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Циклдың ҡалдығын төшөрөп ҡалдыра һәм киләһе аҙымға күсә."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Иҫкәртеү: был блок цикл эсендә генә ҡулланыла ала."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "һәр элемент өсөн %1 исемлектә %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Исемлектәге һәр элемент өсөн үҙгәреүсәнгә элементтың '%1' мәғәнәһен бирә һәм күрһәтелгән командаларҙы үтәй."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "count with %1 from %2 to %3 by %4"; // untranslated +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Үҙгәреүсәнгә башынан аҙағына тиклем тәғәйен аҙым менән %1 мәғәнәне бирә һәм күрһәтелгән командаларҙы үтәй."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "\"Әгәр\" блогына шарт өҫтәй"; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Бер шарт та дөрөҫ булмаған осраҡҡа йомғаҡлау ярҙамсы блогын өҫтәргә."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "\"Әгәр\" блогын ҡабаттан төҙөү өсөн киҫәктәрҙе өҫтәгеҙ, юйҙырығыҙ, урындарын алмаштырығыҙ."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "юғиһә"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "юғиһә, әгәр"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "әгәр"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Мәғәнә дөрөҫ булғанда, командаларҙы үтәй."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Шарт дөрөҫ булғанда, командаларҙың беренсе блогын үтәй. Улай булмаһа, командаларҙың икенсе блогы үтәлә."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Беренсе шарт дөрөҫ булһа, командаларҙың беренсе блогын үтәй. Икенсе шарт дөрөҫ булһа, командаларҙың икенсе блогын үтәй."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Беренсе шарт дөрөҫ булһа, командаларҙың беренсе блогын үтәй. Әгәр икенсе шарт дөрөҫ булһа, командаларҙың икенсе блогын үтәй. Бер шарт та дөрөҫ булмаһа, команда блоктарының һуңғыһын үтәй."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/Цикл_(программалау)"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "үтәргә"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = " %1 тапҡыр ҡабатларға"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Командаларҙы бер нисә тапҡыр үтәй."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ҡабатларға, әлегә юҡ"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ҡабатларға, әлегә"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Мәғәнә ялған булғанда, командаларҙы ҡабатлай."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Мәғәнә дөрөҫ булғанда, командаларҙы ҡабатлай."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Бөтә %1 блоктарҙы юйырғамы?"; +Blockly.Msg.DELETE_BLOCK = "Блокты юйҙырырға"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = " %1 блокты юйҙырырға"; +Blockly.Msg.DISABLE_BLOCK = "Блокты һүндерергә"; +Blockly.Msg.DUPLICATE_BLOCK = "Күсереп алырға"; +Blockly.Msg.ENABLE_BLOCK = "Блокты тоҡандырырға"; +Blockly.Msg.EXPAND_ALL = "Блоктарҙы йәйергә"; +Blockly.Msg.EXPAND_BLOCK = "Блокты йәйергә"; +Blockly.Msg.EXTERNAL_INPUTS = "Тышҡы өҫтәлмә"; +Blockly.Msg.HELP = "Ярҙам"; +Blockly.Msg.INLINE_INPUTS = "Эске өҫтәлмә"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "create empty list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "исемлек"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "менән исемлек төҙөргә"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Add an item to the list."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_FIRST = "беренсе"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# аҙағынан"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "алырға"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "алырға һәм юйырға"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "аҙаҡҡы"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "осраҡлы"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "юйырға"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returns the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Removes and returns the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Removes the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "to # from end"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "to #"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "to last"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "get sub-list from first"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 is the last item."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 is the first item."; // untranslated +Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated +Blockly.Msg.LISTS_INLIST = "исемлеккә"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 буш"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty."; // untranslated +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "оҙонлоғо %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; // untranslated +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "кеүек"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "өҫтәп ҡуйырға"; +Blockly.Msg.LISTS_SET_INDEX_SET = "йыйылма"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserts the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sets the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "ялған"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Дөрөҫ йәки ялғанды ҡайтара."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "дөрөҫ"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(математика)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Өҫтәмәләр тигеҙ булһа, дөрөҫ мәғәнәһен кире ҡайтара."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Беренсе өҫтәмә икенсеһенән ҙурыраҡ булһа, дөрөҫ мәғәнәһен кире ҡайтара."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Беренсе өҫтәмә икенсеһенән бәләкәйерәк йә уға тиң булһа, дөрөҫ мәғәнәһен кире ҡайтара."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Беренсе өҫтәмә икенсеһенән бәләкәйерәк булһа, дөрөҫ мәғәнәһен кире ҡайтара."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Беренсе өҫтәмә икенсеһенән бәләкәйерәк йә уға тиң булһа, дөрөҫ мәғәнәһен кире ҡайтара."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Өҫтәмәләр тигеҙ булмаһа, дөрөҫ мәғәнәһен кире ҡайтара."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "%1 түгел"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Өҫтәлмә ялған булһа, дөрөҫ аңлатманы ҡайтара. Өҫтәлмә дөрөҫ булһа, ялған аңлатманы ҡайтара."; +Blockly.Msg.LOGIC_NULL = "нуль"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Нулде ҡайтара."; +Blockly.Msg.LOGIC_OPERATION_AND = "һәм"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "йәки"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Әгәр ҙә ике өҫтәлмә лә тап килһә, дөрөҫ аңлатманы кире ҡайтара."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Өҫтәлмәләрҙең береһе генә дөрөҫ булһа, дөрөҫ аңлатманы ҡайтара."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "тест"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "әгәр ялған булһа"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "әгәр дөрөҫ булһа"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Һайлау шартын тикшерә. Әгәр ул дөрөҫ булһа, беренсе мәғәнәне, хата булһа, икенсе мәғәнәне ҡайтара."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ba.wikipedia.org/wiki/Арифметика"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Ике һандың суммаһын ҡайтара."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Ике һандың бүлендеген ҡайтара."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Ике һандың айырмаһын ҡайтара."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Ике һандың ҡабатландығын ҡайтара."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Дәрәжәгә күтәрелгән икенсе һандан тәүгеһенә ҡайтара."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://ba.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "%1 тан %2 ҡа арттырырға"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Үҙгәреүсән һанға өҫтәй '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://ba.wikipedia.org/wiki/Математик_константа"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Таралған константаның береһен күрһәтә: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) йәки ∞ (сикһеҙлек)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "сикләргә %1 аҫтан %2 өҫтән %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Һанды аҫтан һәм өҫтән сикләй (сиктәгеләрен индереп)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "бүленә"; +Blockly.Msg.MATH_IS_EVEN = "тағы"; +Blockly.Msg.MATH_IS_NEGATIVE = "тиҫкәре"; +Blockly.Msg.MATH_IS_ODD = "сәйер"; +Blockly.Msg.MATH_IS_POSITIVE = "ыңғай"; +Blockly.Msg.MATH_IS_PRIME = "ябай"; +Blockly.Msg.MATH_IS_TOOLTIP = "Һандың йоп, таҡ, ябай, бөтөн, ыңғай, кире йәки билдәле һанға ҡарата ниндәй булыуын тикшерә. Дөрөҫ йә ялған мәғәнәһен күрһәтә."; +Blockly.Msg.MATH_IS_WHOLE = "бөтөн"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://ba.wikipedia.org/wiki/Ҡалдыҡ_менән_бүлеү"; +Blockly.Msg.MATH_MODULO_TITLE = "ҡалдыҡ %1 : %2 араһында"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Ике һанды бүлеү ҡалдығын күрһәтә."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://ba.wikipedia.org/wiki/Һан"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Рәт."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "исемлектең уртаса арифметик дәүмәле"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "исемлектәге иң ҙуры"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "исемлек медианаһы"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "Исемлектәге иң бәләкәйе"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "исемлек модалары"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "исемлектең осраҡлы элементы"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "исемлекте стандарт кире ҡағыу"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "исемлек суммаһы"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Исемлектең уртаса арифметик дәүмәле күрһәтә."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Исемлектең иң ҙур һанын күрһәтә."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Исемлек медианаһын күрһәтә."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Исемлектәге иң бәләкәй һанды күрһәтә."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Исемлектең иң күп осраған элементтарын күрһәтә."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Исемлектең осраҡлы элементын күрһәтә."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Исемлекте стандарт кире ҡағыуҙы күрһәтә."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Исемлектәрҙәге һандар суммаһын күрһәтә."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://ba.wikipedia.org/wiki/Ялған осраҡлы_һандар_генераторы"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "0 (үҙен дә индереп) һәм 1 араһындағы осраҡлы һан"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://ba.wikipedia.org/wiki/Ялған осраҡлы_һандар_генераторы"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "%1-ҙән %2-гә тиклем осраҡлы бөтөн һан"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Ике бирелгән һан араһындағы (үҙҙәрен дә индереп) осраҡлы һанды күрһәтә."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://ba.wikipedia.org/wiki/Т=Түңәрәкләү"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "түңәрәк"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "бәләкәйгә тиклем түңәрәкләргә"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "ҙурына тиклем түңәрәкләргә"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Һанды ҙурына йә бәләкәйенә тиклем түңәрәкләргә."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://ba.wikipedia.org/wiki/Квадрат_тамыр"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "абсолют"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "квадрат тамыр"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Һандың модулен ҡайтара."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Күрһәтелгән дәрәжәлә ҡайтара."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Һандың натураль логаритмын ҡайтара."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Һандың унынсы логаритмын ҡайтара."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Кире һанды ҡайтара."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Күрһәтелгән 10-сы дәрәжәлә ҡайтара."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Һандың квадрат тамырын ҡайтара."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://ba..wikipedia.org/wiki/Тригонометрик_функциялар"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Арккосинусты градустарҙа күрһәтә."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Арксинусты градустарҙа күрһәтә."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Арктангенсты градустарҙа күрһәтә."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Мөйөштөң косинусын градустарҙа ҡайтара."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Мөйөштөң синусын градустарҙа ҡайтара."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Мөйөштөң тангенсын градустарҙа күрһәтә."; +Blockly.Msg.NEW_VARIABLE = "Яңы үҙгәреүсән..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Яңы үҙгәреүсәндең исеме:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "with:"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "with:"; // untranslated +Blockly.Msg.PROCEDURES_CREATE_DO = "'%1' төҙөргә"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "do something"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "to"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "кире ҡайтарыу"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; // untranslated +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; // untranslated +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "инеү исеме:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "инеү"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "документтарҙы үҙгәртергә"; +Blockly.Msg.REMOVE_COMMENT = "Аңлатмаларҙы юйырға"; +Blockly.Msg.RENAME_VARIABLE = "Үҙгәреүсәндең исемен алмаштырырға..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Бөтә '%1' үҙгәреүсәндәрҙең исемен ошолай алмаштырырға:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "текст өҫтәргә"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "to"; // untranslated +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Үҙгәреүсән «%1»-гә текст өҫтәргә."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "to lower case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "to UPPER CASE"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg.TEXT_CHARAT_FIRST = "тәүге хәрефте алырға"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "№ хәрефен аҙаҡтан алырға"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "хат алырға #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "текста"; +Blockly.Msg.TEXT_CHARAT_LAST = "һуңғы хәрефте алырға"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "осраҡлы хәрефте алырға"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Текстҡа элемент өҫтәү."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "ҡушылығыҙ"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "# хатҡа"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "һуңғы хәрефкә тиклем"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "текста"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; // untranslated +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "текстҡа"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "текстың тәүге инеүен табырға"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "Текстың һуңғы инеүен табырға"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 буш"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "текст төҙөргә"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Элементтарҙың теләһә күпме һанын берләштереп текст фрагментын булдыра."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "оҙонлоғо %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Бирелгән текстағы символдар һанын (буш урындар менән бергә) кире ҡайтара."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "%1 баҫтырырға"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; // untranslated +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Текстың хәрефе, һүҙе йәки юлы."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "trim spaces from both sides of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated +Blockly.Msg.TODAY = "Бөгөн"; +Blockly.Msg.UNDO = "Кире алырға"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "элемент"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; // untranslated +Blockly.Msg.VARIABLES_SET = "set %1 to %2"; // untranslated +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/bcc.js b/src/opsoro/server/static/js/blockly/msg/js/bcc.js similarity index 89% rename from src/opsoro/apps/visual_programming/static/blockly/msg/js/bcc.js rename to src/opsoro/server/static/js/blockly/msg/js/bcc.js index ac8dad1..38ba2d6 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/bcc.js +++ b/src/opsoro/server/static/js/blockly/msg/js/bcc.js @@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.bcc'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "افزودن نظر"; -Blockly.Msg.AUTH = "لطفا این اپلیکیشن را ثبت کنید و آثارتان را فعال کنید تا ذخیره شود و اجازهٔ اشتراک‌گذاری توسط شما داده شود."; Blockly.Msg.CHANGE_VALUE_TITLE = "تغییر مقدار:"; -Blockly.Msg.CHAT = "با همکارتان با نوشتن در این کادر چت کنید!"; Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated Blockly.Msg.COLLAPSE_ALL = "فروپاشی بلوک‌ها"; Blockly.Msg.COLLAPSE_BLOCK = "فروپاشی بلوک"; @@ -62,7 +60,10 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "تکرار تا"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "تکرار در حالی که"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "تا زمانی که یک مقدار ناصحیح است، چند عبارت را انجام بده."; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "تا زمانی که یک مقدار صحیح است، چند عبارت را انجام بده."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated Blockly.Msg.DELETE_BLOCK = "حذف بلوک"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated Blockly.Msg.DELETE_X_BLOCKS = "حذف بلوک‌های %1"; Blockly.Msg.DISABLE_BLOCK = "غیرفعال‌سازی بلوک"; Blockly.Msg.DUPLICATE_BLOCK = "تکراری"; @@ -91,18 +92,15 @@ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "تصادفی"; Blockly.Msg.LISTS_GET_INDEX_REMOVE = "حذف‌کردن"; Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "اولین مورد یک فهرست را بر می‌گرداند."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "موردی در محل مشخص در فهرست بر می‌گرداند. #1 آخرین مورد است."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "موردی در محل مشخص‌شده بر می‌گرداند. #1 اولین مورد است."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "موردی در محل مشخص‌شده بر می‌گرداند."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "آخرین مورد در یک فهرست را بر می‌گرداند."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "یک مورد تصادفی در یک فهرست بر می‌گرداند."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "اولین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند. #1 آخرین مورد است."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند. #1 اولین مورد است."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "آخرین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "مورد تصادفی‌ای را در فهرست حذف و بر می‌گرداند."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "اولین مورد را در یک فهرست حذف می‌کند."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند. #1 آخرین مورد است."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند. #1 اولین مورد است."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "آخرین مورد را در یک فهرست حذف می‌کند."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "یک مورد تصادفی را یک فهرست حذف می‌کند."; Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "به # از انتها"; @@ -114,10 +112,12 @@ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "گرفتن زیرمجموعه‌ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "گرفتن زیرمجموعه‌ای از #"; Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "کپی از قسمت مشخص‌شدهٔ لیست درست می‌کند."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 آخرین مورد است."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 اولین مورد است."; Blockly.Msg.LISTS_INDEX_OF_FIRST = "آخرین رخداد متن را بیاب"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "یافتن آخرین رخ‌داد مورد"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. ۰ بر می‌گرداند اگر متن موجود نبود."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. %1 بر می‌گرداند اگر متن موجود نبود."; Blockly.Msg.LISTS_INLIST = "در فهرست"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 خالی است"; @@ -128,20 +128,29 @@ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "طول یک فهرست را برمی‌گر Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_REPEAT_TITLE = "فهرستی با %1 تکرارشده به اندازهٔ %2 می‌سازد"; Blockly.Msg.LISTS_REPEAT_TOOLTIP = "فهرستی شامل مقادیر داده‌شدهٔ تکرار شده عدد مشخص‌شده می‌سازد."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "به‌عنوان"; Blockly.Msg.LISTS_SET_INDEX_INSERT = "درج در"; Blockly.Msg.LISTS_SET_INDEX_SET = "مجموعه"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "موردی به ته فهرست اضافه می‌کند."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند. #1 آخرین مورد است."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند. #1 اولین مورد است."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "موردی به ته فهرست الحاق می‌کند."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "مورد را به صورت تصادفی در یک فهرست می‌افزاید."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "اولین مورد در یک فهرست را تعیین می‌کند."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 آخرین مورد است."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 اولین مورد است."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "مورد مشخص‌شده در یک فهرست را قرار می‌دهد."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "آخرین مورد در یک فهرست را تعیین می‌کند."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "یک مورد تصادفی در یک فهرست را تعیین می‌کند."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -187,7 +196,7 @@ Blockly.Msg.MATH_CHANGE_TITLE = "تغییر %1 با %2"; Blockly.Msg.MATH_CHANGE_TOOLTIP = "افزودن یک عدد به متغیر '%1'."; Blockly.Msg.MATH_CONSTANT_HELPURL = "https://fa.wikipedia.org/wiki/%D8%AB%D8%A7%D8%A8%D8%AA_%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C"; Blockly.Msg.MATH_CONSTANT_TOOLTIP = "یکی از مقادیر مشترک را برمی‌گرداند: π (۳٫۱۴۱…)، e (۲٫۷۱۸...)، φ (۱٫۶۱۸)، sqrt(۲) (۱٫۴۱۴)، sqrt(۱/۲) (۰٫۷۰۷...) و یا ∞ (بی‌نهایت)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "محدودکردن %1 پایین %2 بالا %3"; Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "محدودکردن یک عدد بین محدودیت‌های مشخص‌شده (بسته)."; Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated @@ -258,35 +267,36 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "بازگرداندن آرک‌تانژان Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "بازگرداندن کسینوس درجه (نه رادیان)."; Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "بازگرداندن سینوس درجه (نه رادیان)."; Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "بازگرداندن تانژانت یک درجه (نه رادیان)."; -Blockly.Msg.ME = "من"; Blockly.Msg.NEW_VARIABLE = "متغیر تازه..."; Blockly.Msg.NEW_VARIABLE_TITLE = "نام متغیر تازه:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "اجازه اظهارات"; Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "با:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29"; Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "اجرای تابع تعریف‌شده توسط کاربر «%1»."; Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29"; Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "اجرای تابع تعریف‌شده توسط کاربر «%1» و استفاده از خروجی آن."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "با:"; Blockly.Msg.PROCEDURES_CREATE_DO = "ساختن «%1»"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "انجام چیزی"; Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "به"; Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "تابعی می‌سازد بدون هیچ خروجی."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "بازگشت"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "تابعی با یک خروجی می‌سازد."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "اخطار: این تابعی پارامتر تکراری دارد."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "برجسته‌سازی تعریف تابع"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "اگر یک مقدار صحیح است، مقدار دوم را برگردان."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "اخطار: این بلوک احتمالاً فقط داخل یک تابع استفاده می‌شود."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "نام ورودی:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "اضافه کردن ورودی به تابع."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "ورودی‌ها"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "افزودن، حذف یا دوباره مرتب‌کردن ورودی این تابع."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "حذف نظر"; Blockly.Msg.RENAME_VARIABLE = "تغییر نام متغیر..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "تغییر نام همهٔ متغیرهای «%1» به:"; @@ -308,6 +318,9 @@ Blockly.Msg.TEXT_CHARAT_LAST = "گرفتن آخرین حرف"; Blockly.Msg.TEXT_CHARAT_RANDOM = "گرفتن حرف تصادفی"; Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated Blockly.Msg.TEXT_CHARAT_TOOLTIP = "حرفی در موقعیت مشخص‌شده بر می‌گرداند."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "افزودن یک مورد به متن."; Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "عضویت"; Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "اضافه، حذف یا ترتیب‌سازی قسمت‌ها برای تنظیم مجدد این بلوک اگر مسدود است."; @@ -326,7 +339,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "در متن"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "اولین رخداد متن را بیاب"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "آخرین رخداد متن را بیاب"; Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد ۰ باز می‌گرداند."; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد %1 باز می‌گرداند."; Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 خالی است"; Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "اضافه‌کردن صحیح اگر متن فراهم‌شده خالی است."; @@ -344,6 +357,12 @@ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "اعلان برای کاربر با ی Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "اعلان برای کاربر برای یک متن."; Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "اعلان برای عدد با پیام"; Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "اعلان برای متن با پیام"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated Blockly.Msg.TEXT_TEXT_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B1%D8%B4%D8%AA%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29"; Blockly.Msg.TEXT_TEXT_TOOLTIP = "یک حرف، کلمه یا خطی از متن."; Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated @@ -352,6 +371,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "تراشیدن فاصله‌ها از ط Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "تراشیدن فاصله‌ها از طرف چپ"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "کپی از متن با فاصله‌های حذف‌شده از یک یا هر دو پایان باز می‌گرداند."; Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "مورد"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "درست‌کردن «تنظیم %1»"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated @@ -360,13 +380,13 @@ Blockly.Msg.VARIABLES_SET = "مجموعه %1 به %2"; Blockly.Msg.VARIABLES_SET_CREATE_GET = "درست‌کردن «تنظیم %1»"; Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "متغیر برابر با خروجی را مشخص می‌کند."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; @@ -374,9 +394,19 @@ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/be-tarask.js b/src/opsoro/server/static/js/blockly/msg/js/be-tarask.js new file mode 100644 index 0000000..0e70cce --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/be-tarask.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.be.tarask'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Дадаць камэнтар"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Зьмяніць значэньне:"; +Blockly.Msg.CLEAN_UP = "Ачысьціць блёкі"; +Blockly.Msg.COLLAPSE_ALL = "Згарнуць блёкі"; +Blockly.Msg.COLLAPSE_BLOCK = "Згарнуць блёк"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "колер 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "колер 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "дзеля"; +Blockly.Msg.COLOUR_BLEND_TITLE = "зьмяшаць"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Зьмешвае два колеры ў дадзенай прапорцыі (0.0 — 1.0)"; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://be-x-old.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D0%B5%D1%80"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Абярыце колер з палітры."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "выпадковы колер"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Абраць выпадковы колер."; +Blockly.Msg.COLOUR_RGB_BLUE = "сіняга"; +Blockly.Msg.COLOUR_RGB_GREEN = "зялёнага"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "чырвонага"; +Blockly.Msg.COLOUR_RGB_TITLE = "колер з"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Стварыць колер з абранымі прапорцыямі чырвонага, зялёнага і сіняга. Усе значэньні павінны быць ад 0 да 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "перарваць цыкль"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "працягнуць з наступнага кроку цыклю"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Спыніць гэты цыкль."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Прапусьціць рэшту цыклю і перайсьці да наступнага кроку."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Увага: гэты блёк можа быць выкарыстаны толькі ў цыклі."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "для кожнага элемэнта %1 у сьпісе %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Для кожнага элемэнту сьпісу прысвойвае зьменнай '%1' ягонае значэньне і выконвае пэўныя апэрацыі."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "лічыць з %1 ад %2 да %3 па %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Прысвойвае зьменнай \"%1\" значэньні ад пачатковага да канчатковага значэньня, улічваючы зададзены крок, і выконвае абраныя блёкі."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Дадаць умову да блёку «калі»."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Дадаць заключную ўмову для ўсіх астатніх варыянтаў блёку «калі»."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Дадаць, выдаліць ці пераставіць сэкцыі для пераканфігураваньня гэтага блёку «калі»."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "інакш"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "інакш, калі"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "калі"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Калі значэньне ісьціна, выканаць пэўныя апэрацыі."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Калі значэньне ісьціна, выканаць першы блёк апэрацыяў, інакш выканаць другі блёк."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Калі першае значэньне ісьціна, выканаць першы блёк апэрацыяў. Інакш, калі другое значэньне ісьціна, выканаць другі блёк апэрацыяў."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Калі першае значэньне ісьціна, выканаць першы блёк апэрацыяў. Інакш, калі другое значэньне ісьціна, выканаць другі блёк апэрацыяў. Калі ніводнае з значэньняў не сапраўднае, выканаць апошні блёк апэрацыяў."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "выканаць"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "паўтарыць %1 раз(ы)"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Выконвае апэрацыі некалькі разоў."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "паўтараць, пакуль не"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "паўтараць, пакуль"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Пакуль значэньне хлусьня, выконваць пэўныя апэрацыі."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Пакуль значэньне ісьціна, выконваць пэўныя апэрацыі."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Выдаліць усе блёкі %1?"; +Blockly.Msg.DELETE_BLOCK = "Выдаліць блёк"; +Blockly.Msg.DELETE_VARIABLE = "Выдаліць зьменную «%1»"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Выдаліць %1 выкарыстаньняў зьменнай «%2»?"; +Blockly.Msg.DELETE_X_BLOCKS = "Выдаліць %1 блёкі"; +Blockly.Msg.DISABLE_BLOCK = "Адключыць блёк"; +Blockly.Msg.DUPLICATE_BLOCK = "Капіяваць"; +Blockly.Msg.ENABLE_BLOCK = "Уключыць блёк"; +Blockly.Msg.EXPAND_ALL = "Разгарнуць блёкі"; +Blockly.Msg.EXPAND_BLOCK = "Разгарнуць блёк"; +Blockly.Msg.EXTERNAL_INPUTS = "Зьнешнія ўваходы"; +Blockly.Msg.HELP = "Дапамога"; +Blockly.Msg.INLINE_INPUTS = "Унутраныя ўваходы"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "стварыць пусты сьпіс"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Вяртае сьпіс даўжынёй 0, які ня ўтрымлівае запісаў зьвестак"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "сьпіс"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Дадаць, выдаліць ці пераставіць сэкцыі для пераканфігураваньня гэтага блёку."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "стварыць сьпіс з"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Дадаць элемэнт да сьпісу."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Ставарае сьпіс зь любой колькасьцю элемэнтаў."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "першы"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "№ з канца"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "атрымаць"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "атрымаць і выдаліць"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "апошні"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "выпадковы"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "выдаліць"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Вяртае першы элемэнт у сьпісе."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Вяртае элемэнт у пазначанай пазыцыі ў сьпісе."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Вяртае апошні элемэнт у сьпісе."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Вяртае выпадковы элемэнт у сьпісе."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Выдаляе і вяртае першы элемэнт у сьпісе."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Выдаляе і вяртае элемэнт у пазначанай пазыцыі ў сьпісе."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Выдаляе і вяртае апошні элемэнт у сьпісе."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Выдаляе і вяртае выпадковы элемэнт у сьпісе."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Выдаляе першы элемэнт у сьпісе."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Выдаляе элемэнт у пазначанай пазыцыі ў сьпісе."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Выдаляе апошні элемэнт у сьпісе."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Выдаляе выпадковы элемэнт у сьпісе."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "па № з канца"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "да #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "да апошняга"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "атрымаць падсьпіс зь першага"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "атрымаць падсьпіс з № з канца"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "атрымаць падсьпіс з №"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Стварае копію пазначанай часткі сьпісу."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "№%1 — апошні элемэнт."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "№%1 — першы элемэнт."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "знайсьці першае ўваходжаньне элемэнту"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "знайсьці апошняе ўваходжаньне элемэнту"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Вяртае індэкс першага/апошняга ўваходжаньня элемэнту ў сьпіс. Вяртае %1, калі элемэнт ня знойдзены."; +Blockly.Msg.LISTS_INLIST = "у сьпісе"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 пусты"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Вяртае значэньне ісьціна, калі сьпіс пусты."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "даўжыня %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Вяртае даўжыню сьпісу."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "стварыць сьпіс з элемэнту %1, які паўтараецца %2 разоў"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Стварае сьпіс, які ўтрымлівае пададзеную колькасьць копіяў элемэнту."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "як"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "уставіць у"; +Blockly.Msg.LISTS_SET_INDEX_SET = "усталяваць"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Устаўляе элемэнт у пачатак сьпісу."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Устаўляе элемэнт у пазначанай пазыцыі ў сьпісе."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Дадае элемэнт у канец сьпісу."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Выпадковым чынам устаўляе элемэнт у сьпіс."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Задае першы элемэнт у сьпісе."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Задае элемэнт у пазначанай пазыцыі ў сьпісе."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Задае апошні элемэнт у сьпісе."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Задае выпадковы элемэнт у сьпісе."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "па павелічэньні"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "па зьмяншэньні"; +Blockly.Msg.LISTS_SORT_TITLE = "сартаваць %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Сартаваць копію сьпісу."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "паводле альфабэту, ігнараваць рэгістар"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "як лікі"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "паводле альфабэту"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "стварыць сьпіс з тэксту"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "стварыць тэкст са сьпісу"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Аб’ядноўвае сьпіс тэкстаў у адзін тэкст па падзяляльніках."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Падзяліць тэкст у сьпіс тэкстаў, па падзяляльніках."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "з падзяляльнікам"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "хлусьня"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Вяртае «ісьціна» ці «хлусьня»."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "ісьціна"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://be-x-old.wikipedia.org/wiki/%D0%9D%D1%8F%D1%80%D0%BE%D1%9E%D0%BD%D0%B0%D1%81%D1%8C%D1%86%D1%8C"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Вяртае «ісьціна», калі абодва ўводы роўныя."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Вяртае «ісьціна», калі першы ўвод большы за другі."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Вяртае «ісьціна», калі першы ўвод большы ці роўны другому."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Вяртае «ісьціна», калі першы ўвод меншы за другі."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Вяртае «ісьціна», калі першы ўвод меншы ці роўны другому."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Вяртае «ісьціна», калі абодва ўводы ня роўныя."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "не %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Вяртае «ісьціна», калі ўвод непраўдзівы. Вяртае «хлусьня», калі ўвод праўдзівы."; +Blockly.Msg.LOGIC_NULL = "нічога"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Вяртае нічога."; +Blockly.Msg.LOGIC_OPERATION_AND = "і"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "ці"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Вяртае «ісьціна», калі абодва ўводы праўдзівыя."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Вяртае «ісьціна», калі прынамсі адзін з уводаў праўдзівы."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "тэст"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "калі хлусьня"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "калі ісьціна"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Праверыць умову ў 'тэст'. Калі ўмова праўдзівая, будзе вернутае значэньне «калі ісьціна»; інакш будзе вернутае «калі хлусьня»."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://be-x-old.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%82%D0%BC%D1%8D%D1%82%D1%8B%D0%BA%D0%B0"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Вяртае суму двух лікаў."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Вяртае дзель двух лікаў."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Вяртае рознасьць двух лікаў."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Вяртае здабытак двух лікаў."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Вяртае першы лік у ступені другога ліку."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "зьмяніць %1 на %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Дадае лічбу да зьменнай '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://be-x-old.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D1%8D%D0%BC%D0%B0%D1%82%D1%8B%D1%87%D0%BD%D0%B0%D1%8F_%D0%BA%D0%B0%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82%D0%B0"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Вяртае адну з агульных канстантаў: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0,707...) або ∞ (бясконцасьць)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "абмежаваць %1 зьнізу %2 зьверху %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Абмяжоўвае колькасьць ніжняй і верхняй межамі (уключна)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "дзяліць на"; +Blockly.Msg.MATH_IS_EVEN = "парная"; +Blockly.Msg.MATH_IS_NEGATIVE = "адмоўная"; +Blockly.Msg.MATH_IS_ODD = "няпарная"; +Blockly.Msg.MATH_IS_POSITIVE = "станоўчая"; +Blockly.Msg.MATH_IS_PRIME = "простая"; +Blockly.Msg.MATH_IS_TOOLTIP = "Правярае, ці зьяўляецца лік парным, няпарным, простым, станоўчым, адмоўным, ці ён дзеліцца на пэўны лік без астатку. Вяртае значэньне ісьціна або няпраўда."; +Blockly.Msg.MATH_IS_WHOLE = "цэлая"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "рэшта дзяленьня %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Вяртае рэшту дзяленьня двух лікаў."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://be-x-old.wikipedia.org/wiki/%D0%9B%D1%96%D0%BA"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Лік."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "сярэдняя ў сьпісе"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "мінімальная ў сьпісе"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "мэдыяна сьпісу"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "мінімальная ў сьпісе"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "рэжымы сьпісу"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "выпадковы элемэнт сьпісу"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "стандартнае адхіленьне сьпісу"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "Сума сьпісу"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Вяртае сярэднеарытмэтычнае значэньне лікавых значэньняў у сьпісе."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Вяртае найменшы лік у сьпісе."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Вяртае мэдыяну сьпісу."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Вяртае найменшы лік у сьпісе."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Вяртае сьпіс самых распаўсюджаных элемэнтаў у сьпісе."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Вяртае выпадковы элемэнт сьпісу."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Вяртае стандартнае адхіленьне сьпісу."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Вяртае суму ўсіх лікаў у сьпісе."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "выпадковая дроб"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Вяртае выпадковую дроб у дыяпазоне ад 0,0 (уключна) да 1,0."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "выпадковая цэлая з %1 для %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Вяртае выпадковы цэлы лік паміж двума зададзенымі абмежаваньнямі ўключна."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "акругліць"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "акругліць да меншага"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "акругліць да большага"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Акругленьне ліку да большага ці меншага."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://be-x-old.wikipedia.org/wiki/%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D1%8B_%D0%BA%D0%BE%D1%80%D0%B0%D0%BD%D1%8C"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "модуль"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "квадратны корань"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Вяртае модуль ліку."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Вяртае e ў ступені ліку."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Вяртае натуральны лягарытм ліку."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Вяртае дзесятковы лягарытм ліку."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Вяртае супрацьлеглы лік."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Вяртае 10 у ступені ліку."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Вяртае квадратны корань ліку."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://be-x-old.wikipedia.org/wiki/%D0%A2%D1%80%D1%8B%D0%B3%D0%B0%D0%BD%D0%B0%D0%BC%D1%8D%D1%82%D1%80%D1%8B%D1%8F#.D0.A2.D1.80.D1.8B.D0.B3.D0.B0.D0.BD.D0.B0.D0.BC.D1.8D.D1.82.D1.80.D1.8B.D1.87.D0.BD.D1.8B.D1.8F_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.8B.D1.96"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Вяртае арккосынус ліку."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Вяртае арксынус ліку."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Вяртае арктангэнс ліку."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Вяртае косынус кута ў градусах."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Вяртае сынус кута ў градусах."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Вяртае тангэнс кута ў градусах."; +Blockly.Msg.NEW_VARIABLE = "Стварыць зьменную…"; +Blockly.Msg.NEW_VARIABLE_TITLE = "Імя новай зьменнай:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "дазволіць зацьвярджэньне"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "з:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Запусьціць функцыю вызначаную карыстальнікам '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Запусьціць функцыю вызначаную карыстальнікам '%1' і выкарыстаць яе вынік."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "з:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Стварыць '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Апішыце гэтую функцыю…"; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "зрабіць што-небудзь"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "да"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Стварае функцыю бяз выніку."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "вярнуць"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Стварае функцыю з вынікам."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Увага: гэтая функцыя мае парамэтры-дублікаты."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Падсьвяціць вызначэньне функцыі"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Калі значэньне ісьціна, вярнуць другое значэньне."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Папярэджаньне: гэты блёк можа выкарыстоўвацца толькі ў вызначанай функцыі."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "назва парамэтру:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Дадаць уваходныя парамэтры ў функцыю."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "парамэтры"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Дадаць, выдаліць ці запісаць чаргу ўваходных парамэтраў для гэтай функцыі."; +Blockly.Msg.REDO = "Паўтарыць"; +Blockly.Msg.REMOVE_COMMENT = "Выдаліць камэнтар"; +Blockly.Msg.RENAME_VARIABLE = "Перайменаваць зьменную…"; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Перайменаваць усе назвы зьменных '%1' на:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "дадаць тэкст"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "да"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Дадаць які-небудзь тэкст да зьменнай '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "да ніжняга рэгістру"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "Вялікія Першыя Літары"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "да ВЕРХНЯГА РЭГІСТРУ"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Вярнуць копію тэксту зь іншай велічынёй літар."; +Blockly.Msg.TEXT_CHARAT_FIRST = "узяць першую літару"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "узяць літару № з канца"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "узяць літару №"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "у тэксьце"; +Blockly.Msg.TEXT_CHARAT_LAST = "узяць апошнюю літару"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "узяць выпадковую літару"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Вяртае літару ў пазначанай пазыцыі."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Дадаць элемэнт да тэксту."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "далучыць"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Дадайце, выдаліце ці зьмяніце парадак разьдзелаў для перадачы тэкставага блёку."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "да літары № з канца"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "да літары №"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "да апошняй літары"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "у тэксьце"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "атрымаць падрадок зь першай літары"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "узяць падрадок зь літары № з канца"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "узяць падрадок зь літары №"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Вяртае пазначаную частку тэксту."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "у тэксьце"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "знайсьці першае ўваходжаньне тэксту"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "знайсьці апошняе ўваходжаньне тэксту"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Вяртае індэкс першага/апошняга ўваходжаньня першага тэксту ў другі тэкст. Вяртае %1, калі тэкст ня знойдзены."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 пусты"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Вяртае значэньне ісьціна, калі тэкст пусты."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "стварыць тэкст з"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Стварае фрагмэнт тэксту аб’яднаньнем любой колькасьці элемэнтаў."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "даўжыня %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Вяртае колькасьць літараў (у тым ліку прабелы) у пададзеным тэксьце."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "друкаваць %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Надрукаваць пазначаны тэкст, лічбу ці іншыя сымбалі."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Запытаць у карыстальніка лічбу."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Запытаць у карыстальніка тэкст."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "запытаць лічбу з падказкай"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "запытаць тэкст з падказкай"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Літара, слова ці радок тэксту."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "абрэзаць прабелы з абодвух бакоў"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "абрэзаць прабелы зь левага боку"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "абрэзаць прабелы з правага боку"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Вяртае копію тэксту з прабеламі, выдаленымі ад аднаго ці абодвух бакоў."; +Blockly.Msg.TODAY = "Сёньня"; +Blockly.Msg.UNDO = "Скасаваць"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "аб’ект"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Стварыць блёк «усталяваць %1»"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Вяртае значэньне гэтай зьменнай."; +Blockly.Msg.VARIABLES_SET = "усталяваць %1 да %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Стварыць блёк «атрымаць %1»"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Надаць гэтай зьменнай значэньне ўстаўкі."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Зьменная з назвай «%1» ужо існуе."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/bg.js b/src/opsoro/server/static/js/blockly/msg/js/bg.js similarity index 85% rename from src/opsoro/apps/visual_programming/static/blockly/msg/js/bg.js rename to src/opsoro/server/static/js/blockly/msg/js/bg.js index b619bd9..7f6b524 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/bg.js +++ b/src/opsoro/server/static/js/blockly/msg/js/bg.js @@ -7,10 +7,8 @@ goog.provide('Blockly.Msg.bg'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "Добави коментар"; -Blockly.Msg.AUTH = "Позволи на приложението да записва и споделя работата ти."; Blockly.Msg.CHANGE_VALUE_TITLE = "Промени стойността:"; -Blockly.Msg.CHAT = "Говори с колега, като пишеш в това поле!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "Премахни блокове"; Blockly.Msg.COLLAPSE_ALL = "Скрий блокове"; Blockly.Msg.COLLAPSE_BLOCK = "Скрий блок"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "цвят 1"; @@ -62,7 +60,10 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "повтаряй докато" Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "повтаряй докато е вярно, че"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Докато стойността е лъжа, изпълнявай командите."; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Докато стойността е истина, изпълнявай командите."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Изтриване на всички 1% блокове?"; Blockly.Msg.DELETE_BLOCK = "Изтрий блок"; +Blockly.Msg.DELETE_VARIABLE = "Изтриване на променливата \"%1\""; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Изтриване на %1 използване на променлива '%2'?"; Blockly.Msg.DELETE_X_BLOCKS = "Изтрий %1 блока"; Blockly.Msg.DISABLE_BLOCK = "Деактивирай блок"; Blockly.Msg.DUPLICATE_BLOCK = "Копирай"; @@ -91,18 +92,15 @@ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "произволен"; Blockly.Msg.LISTS_GET_INDEX_REMOVE = "премахни"; Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Връща първия елемент в списък."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Връща елемента на определената позиция в списък. #1 е последният елемент."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Връща елемента на определената позиция в списък. #1 е първият елемент."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Връща елемента на определената позиция в списък."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Връща последния елемент в списък."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Връща случаен елемент от списъка."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Премахва и връща първия елемент в списък."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Премахва и връща елемента на определена позиция в списък. #1 е последният елемент."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Премахва и връща елемента на определена позиция в списък. #1 е последният елемент."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Премахва и връща елемента на определена позиция в списък."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Премахва и връща последния елемент в списък."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Премахва и връща случаен елемент в списък."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Премахва първия елемент в списък."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Премахва елемент на определена позиция в списък. #1 е последният елемент."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Премахва елемент на определена позиция в списък. #1 е първият елемент."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Премахва елемент на определена позиция в списък."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Премахва последния елемент в списък."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Премахва случаен елемент от списък."; Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "до № открая"; @@ -114,40 +112,51 @@ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "вземи подсписък о Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "вземи подсписък от №"; Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Копира част от списък."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 е последният елемент."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 е първият елемент."; Blockly.Msg.LISTS_INDEX_OF_FIRST = "намери първата поява на елемента"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "намери последната поява на елемента"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Връща индекса на първото/последното появяване на елемента в списъка. Връща 0, ако елементът не е намерен."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Връща индекса на първото/последното появяване на елемента в списъка. Връща %1 ако елементът не е намерен."; Blockly.Msg.LISTS_INLIST = "в списъка"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 е празен"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Връща истина, ако списъкът е празен."; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Връща стойност вярно, ако списъкът е празен."; Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated Blockly.Msg.LISTS_LENGTH_TITLE = "дължината на %1"; Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Връща дължината на списък."; Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_REPEAT_TITLE = "създай списък от %1 повторен %2 пъти"; Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Създава списък, състоящ се от определен брой копия на елемента."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "следното"; Blockly.Msg.LISTS_SET_INDEX_INSERT = "вмъкни на позиция"; Blockly.Msg.LISTS_SET_INDEX_SET = "промени"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Вмъква елемент в началото на списъка."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Вмъква елемент на определена позиция в списък. №1 е последният елемент."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Вмъква елемент на определена позиция в списък. №1 е първият елемент."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Вмъква елемент на определена позиция в списък."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Добави елемент в края на списък."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Вмъква елемент на произволно място в списък."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Променя първия елемент в списък."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Променя елемента на определена позиция в списък. #1 е последният елемент."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Променя елемента на определена позиция в списък. #1 е първият елемент."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Променя елемента на определена позиция в списък."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Променя последния елемент в списък."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Променя случаен елемент от списък."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "възходящо"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "низходящо"; +Blockly.Msg.LISTS_SORT_TITLE = "Сортирай по %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Подреди копие на списъка."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "по азбучен ред, без отчитане на малки и главни букви"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "в числов ред"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "по азбучен ред"; Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Направи списък от текст"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "направи текст от списък"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Събира списък от текстове в един текст, раделени с разделител."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Разделя текст в списък на текстове, по всеки разделител."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "с разделител"; Blockly.Msg.LOGIC_BOOLEAN_FALSE = "невярно"; Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Връща вярно или невярно."; @@ -174,7 +183,7 @@ Blockly.Msg.LOGIC_TERNARY_CONDITION = "тест"; Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "Ако е невярно"; Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "Ако е вярно"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Провери исловието в \"тест\". Ако условието е истина, върни \"ако е истина\" стойността, иначе върни \"ако е лъжа\" стойността."; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Провери условието в \"тест\". Ако условието е истина, върни стойността \"ако е вярно\", иначе върни стойността \"ако е невярно\"."; Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://bg.wikipedia.org/wiki/Аритметика"; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Върни сумата на двете числа."; @@ -187,7 +196,7 @@ Blockly.Msg.MATH_CHANGE_TITLE = "промени %1 на %2"; Blockly.Msg.MATH_CHANGE_TOOLTIP = "Добави число към променлива '%1'."; Blockly.Msg.MATH_CONSTANT_HELPURL = "http://bg.wikipedia.org/wiki/Константа"; Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Връща една от често срещаните константи: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) или ∞ (безкрайност)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "ограничи %1 между %2 и %3"; Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Ограничи число да бъде в определените граници (включително)."; Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated @@ -197,7 +206,7 @@ Blockly.Msg.MATH_IS_NEGATIVE = "е отрицателно"; Blockly.Msg.MATH_IS_ODD = "е нечетно"; Blockly.Msg.MATH_IS_POSITIVE = "е положително"; Blockly.Msg.MATH_IS_PRIME = "е просто"; -Blockly.Msg.MATH_IS_TOOLTIP = "Проверете дали дадено число е четно, нечетно, просто, цяло, положително, отрицателно или дали се дели на друго число. Връща истина или лъжа."; +Blockly.Msg.MATH_IS_TOOLTIP = "Проверете дали дадено число е четно, нечетно, просто, цяло, положително, отрицателно или дали се дели на друго число. Връща вярно или невярно."; Blockly.Msg.MATH_IS_WHOLE = "е цяло"; Blockly.Msg.MATH_MODULO_HELPURL = "http://bg.wikipedia.org/wiki/Остатък"; Blockly.Msg.MATH_MODULO_TITLE = "остатъка от делението на %1 на %2"; @@ -210,10 +219,10 @@ Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "средната стойност н Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "най-голямата стойност в списъка"; Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "медианата на списък"; Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "най-малката стойност в списъка"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "мода на списъка"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "режими на списъка"; Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "случаен елемент от списъка"; Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "стандартно отклонение на списък"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "сумираай списъка"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "сумирай списъка"; Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Върни средната стойност (аритметичното средно) на числата в списъка."; Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Върни най-голямото число в списъка."; Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Върни медианата в списъка."; @@ -258,42 +267,43 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Върни аркустангенс от Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Върни косинус от ъгъл в градуси (не в радиани)"; Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Върни синус от ъгъл в градуси (не в радиани)"; Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Върни тангенс от ъгъл в градуси (не в радиани)"; -Blockly.Msg.ME = "Аз"; -Blockly.Msg.NEW_VARIABLE = "Нова променлива..."; +Blockly.Msg.NEW_VARIABLE = "Създаване на променлива..."; Blockly.Msg.NEW_VARIABLE_TITLE = "Ново име на променливата:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "позволи операциите"; Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "със:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://bg.wikipedia.org/wiki/Подпрограма"; Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Изпълни дефинирана от потребителя функция \"%1\"."; Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://bg.wikipedia.org/wiki/Подпрограма"; Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Изпълни дефинирана от потребителя функция \"%1\" и използвай резултата."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "със:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Създай '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Опишете тази функция..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "направиш"; Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "за да"; Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Създава функция, която не връща резултат."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "върни"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Създава функция, която връща резултат."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Предупреждение: Тази функция има дублиращи се параметри."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Покажи дефиницията на функцията"; -Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Ако стойността е истина, върни втората стойност."; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Ако стойността е вярна, върни втората стойност."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Предупреждение: Този блок може да се използва само във функция."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "име на параметър"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Добавяне на параметър към функцията."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "вход"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Добави, премахни или пренареди входните параметри за тази функция."; +Blockly.Msg.REDO = "Повторение"; Blockly.Msg.REMOVE_COMMENT = "Премахни коментар"; Blockly.Msg.RENAME_VARIABLE = "Преименувай променливата..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Преименувай всички '%1' променливи на:"; Blockly.Msg.TEXT_APPEND_APPENDTEXT = "добави текста"; Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg.TEXT_APPEND_TO = "към"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "Добави текста към променливата \"%1\"."; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Добави текст към променливата \"%1\"."; Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "с малки букви"; Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "с Главна Буква На Всяка Дума"; @@ -303,11 +313,14 @@ Blockly.Msg.TEXT_CHARAT_FIRST = "вземи първата буква"; Blockly.Msg.TEXT_CHARAT_FROM_END = "вземи поредна буква от края"; Blockly.Msg.TEXT_CHARAT_FROM_START = "вземи поредна буква"; Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "От текста"; +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "от текста"; Blockly.Msg.TEXT_CHARAT_LAST = "вземи последната буква"; Blockly.Msg.TEXT_CHARAT_RANDOM = "вземи произволна буква"; Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Връща буквата в определена позиция."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "пресмята броя на %1 в %2"; +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Добави елемент към текста."; Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "свържи"; Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Добави, премахни или пренареди частите, за да промениш този текстов блок."; @@ -315,7 +328,7 @@ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "со буква № (броено Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "до буква №"; Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "со последната буква."; Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "В текста"; +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "в текста"; Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "вземи текста от първата буква"; Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "вземи текста от буква № (броено отзад-напред)"; Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "вземи текста от буква №"; @@ -326,10 +339,10 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "в текста"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "намери първата поява на текста"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "намери последната поява на текста"; Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Връща индекса на първото/последното срещане на първия текст във втория текст. Връща 0, ако текстът не е намерен."; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Връща индекса на първото/последното срещане на първия текст във втория текст. Връща %1, ако текстът не е намерен."; Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 е празен"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Връща истина, ако текста е празен."; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Връща вярно, ако текста е празен."; Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "създай текст с"; Blockly.Msg.TEXT_JOIN_TOOLTIP = "Създай текст като съчетаеш няколко елемента."; @@ -344,6 +357,12 @@ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Питай потребителя за Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Питай потребителя за текст."; Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "питай за число със съобщение"; Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "питай за текст със съобщение"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "замяна на %1 с %2 в %3"; +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated Blockly.Msg.TEXT_TEXT_HELPURL = "https://bg.wikipedia.org/wiki/Низ"; Blockly.Msg.TEXT_TEXT_TOOLTIP = "Буква, дума или ред"; Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated @@ -351,7 +370,8 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "премахни интервалите Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "премахни интервалите отляво"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "премахни интервалите отдясно"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Върни копие на текста с пемахнати интервали от диния или двата края."; -Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.TODAY = "Днес"; +Blockly.Msg.UNDO = "Отмяна"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "елемент"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Създай \"промени стойността на %1\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated @@ -360,13 +380,13 @@ Blockly.Msg.VARIABLES_SET = "нека %1 бъде %2"; Blockly.Msg.VARIABLES_SET_CREATE_GET = "Създай \"вземи стойността на %1\""; Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "Задава тази променлива да бъде равен на входа."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Променлива с име '%1' вече съществува."; Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; @@ -374,9 +394,19 @@ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/bn.js b/src/opsoro/server/static/js/blockly/msg/js/bn.js similarity index 87% rename from src/opsoro/apps/visual_programming/static/blockly/msg/js/bn.js rename to src/opsoro/server/static/js/blockly/msg/js/bn.js index 482424b..f1e7654 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/bn.js +++ b/src/opsoro/server/static/js/blockly/msg/js/bn.js @@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.bn'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "মন্তব্য যোগ করুন"; -Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated Blockly.Msg.CHANGE_VALUE_TITLE = "মান পরিবর্তন করুন:"; -Blockly.Msg.CHAT = "এই বাক্সে লিখার মাধ্যমে আপনার সহযোগীর সাথে আলাপ করুন!"; Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated Blockly.Msg.COLLAPSE_ALL = "Collapse Blocks"; // untranslated Blockly.Msg.COLLAPSE_BLOCK = "Collapse Block"; // untranslated @@ -62,7 +60,10 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repeat until"; // untranslate Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repeat while"; // untranslated Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "While a value is false, then do some statements."; // untranslated Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "While a value is true, then do some statements."; // untranslated +Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated Blockly.Msg.DELETE_BLOCK = "ব্লকটি মুছে ফেল"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated Blockly.Msg.DELETE_X_BLOCKS = "%1 ব্লক অপসারণ কর"; Blockly.Msg.DISABLE_BLOCK = "ব্লকটি বিকল কর"; Blockly.Msg.DUPLICATE_BLOCK = "প্রতিলিপি"; @@ -79,30 +80,27 @@ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "তালিকা"; Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "create list with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "তালিকায় একটি পদ যোগ কর"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "তালিকায় একটি পদ যোগ করুন।"; Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "যেকোন সংখ্যক পদ নিয়ে একটি তালিকা তৈরি করুন।"; Blockly.Msg.LISTS_GET_INDEX_FIRST = "প্রথম"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# from end"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# শেষ থেকে"; Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "get"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "get and remove"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "নিন"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "নিন ও সরান"; Blockly.Msg.LISTS_GET_INDEX_LAST = "শেষ"; Blockly.Msg.LISTS_GET_INDEX_RANDOM = "এলোমেলো"; Blockly.Msg.LISTS_GET_INDEX_REMOVE = "অপসারণ"; Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "তালিকার প্রথম পদটি পাঠাবে।"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returns the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returns the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "তালিকার শেষ পদটি পাঠাবে।"; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "এলোমেলোভাবে তালিকার যেকোন একটি পদ পাঠাবে।"; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "অপসারণ করুন এবং তালিকার প্রথম পদটি পাঠান।"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Removes and returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Removes and returns the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Removes and returns the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "অপসারণ করুন এবং তালিকার শেষ পদটি পাঠান।"; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "অপসারণ করুন এবং তালিকার এলোমেলো একটি পদ পাঠান।"; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "তালিকার প্রথম পদটি অপসারণ করা হয়েছে।"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Removes the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Removes the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Removes the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "তালিকার শেষ পদটি অপসারণ করা হয়েছে।"; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "তালিকা থেকে এলোমেলো একটি পদ অপসারণ করা হয়েছে।"; Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "to # from end"; // untranslated @@ -114,34 +112,45 @@ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated -Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 is the last item."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 is the first item."; // untranslated +Blockly.Msg.LISTS_INDEX_OF_FIRST = "আইটেমের প্রথম সংঘটন খুঁজুন"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "আইটেমের শেষ সংঘটন খুঁজুন"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated Blockly.Msg.LISTS_INLIST = "তালিকার মধ্যে"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 খালি"; Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "পাঠাবে সত্য যদি তালিকাটি খালি হয়।"; Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "%1-এর দৈর্ঘ্য"; Blockly.Msg.LISTS_LENGTH_TOOLTIP = "একটি তালিকার দৈর্ঘ্য পাঠাবে।"; Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "একটি তালিকার একটি অনুলিপি উল্টান"; Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "as"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INSERT = "insert at"; // untranslated Blockly.Msg.LISTS_SET_INDEX_SET = "set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserts the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserts the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserts the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sets the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "লিখা থেকে তালিকা তৈরি করুন"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "তালিকা থেকে লিখা তৈরি করুন"; @@ -162,9 +171,9 @@ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "পাঠাবে সত্য যদ Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg.LOGIC_NEGATE_TITLE = "%1 নয়"; Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "পাঠাবে সত্য যদি ইনপুট মিথ্যা হয়। পাঠাবে মিথ্যা যদি ইনপুট সত্য হয়।"; -Blockly.Msg.LOGIC_NULL = "নুল"; +Blockly.Msg.LOGIC_NULL = "কিছু না"; Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "পাঠাবে নাল।"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "কিছু ফেরত দিবে না।"; Blockly.Msg.LOGIC_OPERATION_AND = "এবং"; Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated Blockly.Msg.LOGIC_OPERATION_OR = "অথবা"; @@ -183,11 +192,11 @@ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "পাঠাবে দুটি স Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "পাঠাবে দুটি সংখ্যার গুণফল।"; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; // untranslated Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated -Blockly.Msg.MATH_CHANGE_TITLE = "পরিবর্তন %1 দ্বারা %2"; +Blockly.Msg.MATH_CHANGE_TITLE = "%2 দ্বারা %1 পরিবর্তন"; Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; // untranslated Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated @@ -258,35 +267,36 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // u Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated -Blockly.Msg.ME = "আমাকে"; -Blockly.Msg.NEW_VARIABLE = "নতুন চলক..."; +Blockly.Msg.NEW_VARIABLE = "চলক তৈরি করুন..."; Blockly.Msg.NEW_VARIABLE_TITLE = "নতুন চলকের নাম:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "with:"; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "with:"; // untranslated Blockly.Msg.PROCEDURES_CREATE_DO = "Create '%1'"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "do something"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "এতে"; Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "আউটপুট ছাড়া একটি ক্রিয়া তৈরি করুন।"; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "পাঠাবে"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "আউটপুট সহ একটি ক্রিয়া তৈরি করুন।"; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; // untranslated Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "ক্রিয়ার সংজ্ঞা উজ্জল করুন"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "যদি মান সত্য হয় তাহলে দ্বিতীয় মান পাঠাবে।"; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "ইনপুটের নাম:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "ক্রিয়াতে একটি ইনপুট যোগ করুন।"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "পুনরায় করুন"; Blockly.Msg.REMOVE_COMMENT = "মন্তব্য সরাও"; Blockly.Msg.RENAME_VARIABLE = "চলকের নাম পরিবর্তন..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Rename all '%1' variables to:"; // untranslated @@ -308,8 +318,11 @@ Blockly.Msg.TEXT_CHARAT_LAST = "get last letter"; // untranslated Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; // untranslated Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "লেখাটিতে একটি পদ যোগ করুন।"; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "সংযোগ কর"; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "যোগ"; Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #"; // untranslated @@ -326,7 +339,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; // untranslated Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 খালি"; Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "পাঠাবে সত্য যদি সরবরাহকৃত লেখাটি খালি হয়।"; @@ -334,16 +347,22 @@ Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#tex Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "create text with"; // untranslated Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "%1-এর দৈর্ঘ্য"; Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; // untranslated Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "প্রিন্ট %1"; +Blockly.Msg.TEXT_PRINT_TITLE = "%1 মুদ্রণ করুন"; Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; // untranslated Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "%1 উল্টান"; +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg.TEXT_TEXT_TOOLTIP = "একটি অক্ষর, শব্দ অথবা বাক্য।"; Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated @@ -352,21 +371,22 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "বামপাশ থেকে খাল Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "ডানপাশ থেকে খালি অংশ ছাটাই"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated Blockly.Msg.TODAY = "আজ"; +Blockly.Msg.UNDO = "পূর্বাবস্থা"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "পদ"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; // untranslated Blockly.Msg.VARIABLES_SET = "set %1 to %2"; // untranslated -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated +Blockly.Msg.VARIABLES_SET_CREATE_GET = "'%1 নিন' তৈরি করুন"; Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; @@ -374,9 +394,19 @@ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/br.js b/src/opsoro/server/static/js/blockly/msg/js/br.js new file mode 100644 index 0000000..eaa1e1a --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/br.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.br'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Ouzhpennañ un evezhiadenn"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Kemmañ an dalvoudenn :"; +Blockly.Msg.CLEAN_UP = "Naetaat ar bloc'hoù"; +Blockly.Msg.COLLAPSE_ALL = "Bihanaat ar bloc'hoù"; +Blockly.Msg.COLLAPSE_BLOCK = "Bihanaat ar bloc'h"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "liv 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "liv 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "feur"; +Blockly.Msg.COLOUR_BLEND_TITLE = "meskañ"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "a gemmesk daou liv gant ur feur roet(0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "http://br.wikipedia.org/wiki/Liv"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Dibab ul liv diwar al livaoueg."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "liv dargouezhek"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Tennañ ul liv d'ar sord"; +Blockly.Msg.COLOUR_RGB_BLUE = "glas"; +Blockly.Msg.COLOUR_RGB_GREEN = "gwer"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "ruz"; +Blockly.Msg.COLOUR_RGB_TITLE = "liv gant"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Krouiñ ul liv gant ar c'hementad spisaet a ruz, a wer hag a c'hlas. Etre 0 ha 100 e tle bezañ an holl dalvoudoù."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "Mont e-maez an adlañsañ"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "Kenderc'hel gant iteradur nevez ar rodell"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Mont e-maez ar boukl engronnus."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Lammat ar rest eus ar rodell, ha kenderc'hel gant an iteradur war-lerc'h."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Diwallit : ne c'hall ar bloc'h-mañ bezañ implijet nemet e-barzh ur boukl."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "evit pep elfenn %1 er roll %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Evit pep elfenn en ur roll, reiñ talvoud an elfenn d'an argemmenn '%1', ha seveniñ urzhioù zo da c'houde."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "kontañ gant %1 eus %2 da %3 dre %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Ober e doare ma kemero an argemmenn \"%1\" an talvoudennoù adalek niverenn an deroù betek niverenn an dibenn, en ur inkremantiñ an esaouenn, ha seveniñ an urzhioù spisaet."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Ouzhpennañ un amplegad d'ar bloc'h ma."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Ouzhpennañ un amplegad dibenn lak-pep-tra d'ar bloc'h ma."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Ouzhpennañ, lemel pe adurzhiañ ar rannoù evit kefluniañ ar bloc'h ma."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "a-hend-all"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "mod all ma"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "ma"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Ma vez gwir un dalvoudenn, seveniñ urzhioù zo neuze."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Ma vez gwir un dalvoudenn, seveniñ ar c'henañ bloc'had urzhioù neuze. Anez seveniñ an eil bloc'had urzhioù."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Ma vez gwir an dalvoudenn gentañ, seveniñ ar c'hentañ bloc'had urzhioù neuze. Anez ma vez gwir an eil talvoudenn, seveniñ an eil bloc'had urzhioù."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Ma vez gwir an dalvoudenn gentañ, seveniñ ar c'hentañ bloc'had. Anez, ma vez gwir an eil talvoudenn, seveniñ an eil bloc'had urzhioù. Ma ne vez gwir talvoudenn ebet, seveniñ ar bloc'had diwezhañ a urzhioù."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "ober"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "adober %1 gwech"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Seveniñ urzhioù zo meur a wech"; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "adober betek"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "adober keit ha ma"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Keit ha ma vez faos un dalvoudenn,seveniñ urzhioù zo neuze."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Keit ha ma vez gwir un dalvoudenn, seveniñ urzhioù zo neuze."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Diverkañ an holl vloc'hoù %1 ?"; +Blockly.Msg.DELETE_BLOCK = "Dilemel ar bloc'h"; +Blockly.Msg.DELETE_VARIABLE = "Lemel an argemm '%1'"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Lemel %1 implij eus an argemm '%2' ?"; +Blockly.Msg.DELETE_X_BLOCKS = "Dilemel %1 bloc'h"; +Blockly.Msg.DISABLE_BLOCK = "Diweredekaat ar bloc'h"; +Blockly.Msg.DUPLICATE_BLOCK = "Eiladuriñ"; +Blockly.Msg.ENABLE_BLOCK = "Gweredekaat ar bloc'h"; +Blockly.Msg.EXPAND_ALL = "Astenn ar bloc'hoù"; +Blockly.Msg.EXPAND_BLOCK = "Astenn ar bloc'h"; +Blockly.Msg.EXTERNAL_INPUTS = "Monedoù diavaez"; +Blockly.Msg.HELP = "Skoazell"; +Blockly.Msg.INLINE_INPUTS = "Monedoù enlinenn"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "krouiñ ur roll goullo"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Distreiñ ul listenn, 0 a hirder, n'eus enrolladenn ebet enni"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "roll"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Ouzhpennañ, lemel pe adurzhiañ ar rannoù evit kefluniañ ar bloc'h listenn-mañ."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "krouiñ ur roll gant"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Ouzhpennañ un elfenn d'ar roll"; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Krouiñ ur roll gant un niver bennak a elfennoù."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "kentañ"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# adalek ar fin"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "tapout"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "tapout ha lemel"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "diwezhañ"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "dre zegouezh"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "lemel"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Distreiñ an elfenn gentañ en ul listenn."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Distreiñ an elfenn el lec'h meneget en ul listenn."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Distreiñ un elfenn diwezhañ en ul listenn."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Distreiñ un elfenn dre zegouezh en ul listenn."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Lemel ha distreiñ a ra an elfenn gentañ en ul listenn."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Lemel ha distreiñ a ra an elfenn el lec'h meneget en ul listenn."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Lemel ha distreiñ a ra an elfenn diwezhañ en ul listenn."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Lemel ha distreiñ a ra an elfenn dre zegouezh en ul listenn."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Lemel a ra an elfenn gentañ en ul listenn."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Lemel a ra an elfenn el lec'h meneget en ul listenn."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Distreiñ a ra an elfenn diwezhañ en ul listenn."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Lemel a ra un elfenn dre zegouezh en ul listenn."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "betek # adalek an dibenn"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "da #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "betek ar fin"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "Kaout an islistenn adalek an deroù"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "Kaout an islistenn adalek # adalek an dibenn"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "Kaout an islistenn adalek #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Krouiñ un eilad eus lodenn spisaet ul listenn."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 eo an elfenn gentañ."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 eo an elfenn gentañ."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "kavout reveziadenn gentañ un elfenn"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "kavout reveziadenn diwezhañ un elfenn"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus an elfenn en ul listenn. Distreiñ %1 ma n'eo ket kavet an destenn."; +Blockly.Msg.LISTS_INLIST = "el listenn"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 zo goullo"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Distreiñ gwir m'eo goullo al listenn."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "hirder %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Distreiñ hirder ul listenn."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "Krouiñ ul listenn gant an elfenn %1 arreet div wech"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Krouiñ ul listenn a c'hoarvez eus an dalvoudenn roet arreet an niver a wech meneget"; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "eilpennañ %1"; +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Eilpennañ un eilskrid eus ur roll."; +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "evel"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "ensoc'hañ evel"; +Blockly.Msg.LISTS_SET_INDEX_SET = "termenañ"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Ensoc'hañ a ra an elfenn e deroù ul listenn."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Ensoc'hañ a ra an elfenn el lec'h meneget en ul listenn."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Ouzhpennañ a ra an elfenn e fin al listenn."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Ensoc'hañ a ra an elfenn dre zegouezh en ul listenn."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Termenañ a ra an elfenn gentañ en ul listenn."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Termenañ a ra an elfenn el lec'h meneget en ul listenn."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Termenañ a ra an elfenn diwezhañ en ul listenn."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Termenañ a ra un elfenn dre zegouezh en ul listenn."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "war gresk"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "war zigresk"; +Blockly.Msg.LISTS_SORT_TITLE = "Rummañ%1,%2,%3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Rummañ un eilenn eus ar roll"; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "Dre urzh al lizherenneg, hep derc'hel kont eus an direnneg"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "niverel"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "Dre urzh al lizherenneg"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Krouiñ ul listenn diwar an destenn"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "Krouiñ un destenn diwar al listenn"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Bodañ ul listennad testennoù en ul listenn hepken, o tispartiañ anezho gant un dispartier."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Troc'hañ un destenn en ul listennad testennoù, o troc'hañ e pep dispartier."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "gant an dispartier"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "gaou"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Distreiñ pe gwir pe faos"; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "gwir"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Distreiñ gwir m'eo par an daou voned."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Distreiñ gwir m'eo brasoc'h ar moned kentañ eget an eil."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Distreiñ gwir m'eo brasoc'h ar moned kentañ eget an eil pe par dezhañ."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Distreiñ gwir m'eo bihanoc'h ar moned kentañ eget an eil."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Distreiñ gwir m'eo bihanoc'h ar moned kentañ eget an eil pe m'eo par dezhañ."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Distreiñ gwir ma n'eo ket par an daou voned."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "nann %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Distreiñ gwir m'eo faos ar moned. Distreiñ faos m'eo gwir ar moned."; +Blockly.Msg.LOGIC_NULL = "Null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Distreiñ null."; +Blockly.Msg.LOGIC_OPERATION_AND = "ha(g)"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "pe"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Distreiñ gwir m'eo gwir an da daou voned."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Distreiñ gwir m'eo gwir unan eus an daou voned da nebeutañ."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "amprouad"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "m'eo gaou"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "m'eo gwir"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Gwiriañ an amplegad e 'prouad'. M'eo gwir an amplegad, distreiñ an dalvoudenn 'm'eo gwir'; anez distreiñ ar moned 'm'eo faos'."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://br.wikipedia.org/wiki/Aritmetik"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Distreiñ sammad daou niver."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Distreiñ rannad daou niver."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Distreiñ diforc'h daou niver"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Distreiñ liesad daou niver."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Distreiñ an niver kentañ lakaet dindan gallouter an eil niver."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "kemmañ %1 gant %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Ouzhpennañ un niver d'an argemm '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Distreiñ unan eus digemmennoù red : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (anvevenn)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "destrizhañ %1 etre %2 ha %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Destrizhañ un niver da vezañ etre ar bevennoù spisaet (enlakaet)"; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "a zo rannadus dre"; +Blockly.Msg.MATH_IS_EVEN = "zo par"; +Blockly.Msg.MATH_IS_NEGATIVE = "a zo negativel"; +Blockly.Msg.MATH_IS_ODD = "zo ampar"; +Blockly.Msg.MATH_IS_POSITIVE = "a zo pozitivel"; +Blockly.Msg.MATH_IS_PRIME = "zo kentañ"; +Blockly.Msg.MATH_IS_TOOLTIP = "Gwiriañ m'eo par, anpar, kentañ, muiel, leiel un niverenn pe ma c'haller rannañ anezhi dre un niver roet zo. Distreiñ gwir pe faos."; +Blockly.Msg.MATH_IS_WHOLE = "zo anterin"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "rest eus %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Distreiñ dilerc'h rannadur an div niver"; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://br.wikipedia.org/wiki/Niver"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un niver."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "Keitat al listenn"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "Uc'hegenn al listenn"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "Kreizad al listenn"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "Izegenn al listenn"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modoù stankañ el listenn"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "Elfennn eus al listenn tennet d'ar sord"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "forc'had standart eus al listenn"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "Sammad al listenn"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Distreiñ keitad (niveroniel) an talvoudennoù niverel el listenn."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Distreiñ an niver brasañ el listenn."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Distreiñ an niver kreiz el listenn"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Distreiñ an niver bihanañ el listenn"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Distreiñ ul listennad elfennoù stankoc'h el listenn."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Distreiñ un elfenn zargouezhek el listenn"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Distreiñ forc'had standart al listenn."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Distreiñ sammad an holl niveroù zo el listenn."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "Rann dargouezhek"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Distreiñ ur rann dargouezhek etre 0.0 (enkaelat) hag 1.0 (ezkaelat)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "anterin dargouezhek etre %1 ha %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Distreiñ un anterin dargouezhek etre an div vevenn spisaet, endalc'het."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "Rontaat"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "Rontaat dindan"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "Rontaat a-us"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Rontaat un niver dindan pe a-us"; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://br.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "dizave"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "gwrizienn garrez"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Distreiñ talvoud dizave un niver."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Distreiñ galloudad un niver."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Distreiñ logaritm naturel un niver"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Distreiñ logaritm diazez 10 un niver"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Distreiñ enebad un niver"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Distreiñ 10 da c'halloudad un niver."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Distreiñ gwrizienn garrez un niver"; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://br.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Distreiñ ark kosinuz un niver"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Distreiñ ark sinuz un niver"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Distreiñ ark tangent un niver"; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Distreiñ kosinuz ur c'horn (ket e radianoù)"; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Distreiñ sinuz ur c'horn (ket e radianoù)"; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Distreiñ tangent ur c'horn (ket e radianoù)."; +Blockly.Msg.NEW_VARIABLE = "Krouiñ un argemm nevez..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Anv an argemmenn nevez :"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "aotren an disklêriadurioù"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "gant :"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Seveniñ an arc'hwel '%1' termenet gant an implijer."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Seveniñ an arc'hwel '%1' termenet gant an implijer hag implijout e zisoc'h."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "gant :"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Krouiñ '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Deskrivañ an arc'hwel-mañ..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "ober un dra bennak"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "da"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Krouiñ un arc'hwel hep mont er-maez."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "distreiñ"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Kouiñ un arc'hwel gant ur mont er-maez"; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Diwallit : an arc'hwel-mañ en deus arventennoù eiladet."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Dreislinennañ termenadur an arc'hwel"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Ma'z eo gwir un dalvoudenn, distreiñ un eil talvoudenn neuze."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Diwallit : Gallout a rafe ar bloc'h bezañ implijet e termenadur un arc'hwel hepken."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Anv ar moned"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Ouzhpennañ ur moned d'an arc'hwel."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Monedoù"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Ouzhpennañ, lemel, pe adkempenn monedoù an arc'hwel-mañ."; +Blockly.Msg.REDO = "Adober"; +Blockly.Msg.REMOVE_COMMENT = "Lemel an evezhiadenn kuit"; +Blockly.Msg.RENAME_VARIABLE = "Adenvel an argemmenn..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Adenvel an holl argemmennoù '%1' e :"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "ouzhpennañ an destenn"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "da"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Ouzhpennañ testenn d'an argemmenn'%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "e lizherennoù bihan"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "Gant Ur Bennlizherenn E Deroù Pep Ger"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "e PENNLIZHERENNOÙ"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Distreiñ un eilenn eus an eilenn en un direnneg all"; +Blockly.Msg.TEXT_CHARAT_FIRST = "tapout al lizherenn gentañ"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "Kaout al lizherenn # adalek an dibenn."; +Blockly.Msg.TEXT_CHARAT_FROM_START = "Kaout al lizherenn #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "en destenn"; +Blockly.Msg.TEXT_CHARAT_LAST = "tapout al lizherenn ziwezhañ"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "Kaout ul lizherenn dre zegouezh"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Distreiñ al lizherenn d'al lec'h spisaet."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "niver %1 war %2"; +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Kontañ pet gwech e c'hoarvez un destenn bennak en un destenn bennak all."; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Ouzhpennañ un elfenn d'an destenn."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "stagañ"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Ouzhpennañ, lemel pe adurzhiañ ar rannoù evit kefluniañ ar bloc'h testenn-mañ."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "Betek al lizherenn # adalek an dibenn."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "betek al lizherenn #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "d'al lizherenn diwezhañ"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "en destenn"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "Kaout an ischadenn adalek al lizherenn gentañ"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "Kaout an ischadenn adalek al lizherenn # betek an dibenn"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "Kaout an ischadenn adalek al lizherenn #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Distreiñ un tamm spisaet eus an destenn."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "en destenn"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "kavout reveziadenn gentañ an destenn"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "kavout reveziadenn diwezhañ an destenn"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus ar chadenn gentañ en eil chadenn. Distreiñ %1 ma n'eo ket kavet ar chadenn."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 zo goullo"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Adkas gwir m'eo goullo an destenn roet."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "krouiñ un destenn gant"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Krouit un tamm testenn en ur gevelstrollañ un niver bennak a elfennoù"; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "hirder %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Distreiñ an niver a lizherennoù(en ur gontañ an esaouennoù e-barzh) en destenn roet."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "moullañ %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Moullañ an destenn, an niverenn pe un dalvoudenn spisaet all"; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Goulenn un niver gant an implijer."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Goulenn un destenn gant an implijer."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "pedadenn evit un niver gant ur c'hemennad"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "pedadenn evit un destenn gant ur c'hemennad"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "erlec'hiañ %1 gant %2 e %3"; +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Erlec'hiañ holl reveziadennoù un destenn bennak gant un destenn all."; +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "eilpennañ %1"; +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Eilpennañ urzh an arouezennoù en destenn."; +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Ul lizherenn, ur ger pe ul linennad testenn."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "Lemel an esaouennoù en daou du"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "Lemel an esaouennoù eus an tu kleiz"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "Lemel an esaouennoù eus an tu dehou"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Distreiñ un eilenn eus an destenn gant an esaouennoù lamet eus un tu pe eus an daou du"; +Blockly.Msg.TODAY = "Hiziv"; +Blockly.Msg.UNDO = "Dizober"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "elfenn"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Krouiñ 'termenañ %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Distreiñ talvoud an argemm-mañ."; +Blockly.Msg.VARIABLES_SET = "termenañ %1 da %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Krouiñ 'kaout %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Termenañ a ra argemm-mañ evit ma vo par da dalvoudenn ar moned."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Un argemm anvet '%1' zo anezhañ dija."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/ca.js b/src/opsoro/server/static/js/blockly/msg/js/ca.js new file mode 100644 index 0000000..76be6b0 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/ca.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.ca'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Afegeix un comentari"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Canvia valor:"; +Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.COLLAPSE_ALL = "Contraure blocs"; +Blockly.Msg.COLLAPSE_BLOCK = "Contraure bloc"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "color 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "color 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "proporció"; +Blockly.Msg.COLOUR_BLEND_TITLE = "barreja"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Barreja dos colors amb una proporció donada (0,0 - 1,0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ca.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Escolliu un color de la paleta."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "color aleatori"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Escolliu un color a l'atzar."; +Blockly.Msg.COLOUR_RGB_BLUE = "blau"; +Blockly.Msg.COLOUR_RGB_GREEN = "verd"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "vermell"; +Blockly.Msg.COLOUR_RGB_TITLE = "color amb"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Crear un color amb les quantitats especificades de vermell, verd i blau. Tots els valors han de ser entre 0 i 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "sortir del bucle"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continuar amb la següent iteració del bucle"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Sortir del bucle interior."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Ometre la resta d'aquest bucle, i continuar amb la següent iteració."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Advertència: Aquest bloc només es pot utilitzar dins d'un bucle."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "per a cada element %1 en la llista %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Per a cada element en la llista, desar l'element dins la variable '%1', i llavors executar unes sentències."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "comptar amb %1 des de %2 fins a %3 en increments de %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Fer que la variable \"%1\" prengui els valors des del nombre inicial fins al nombre final, incrementant a cada pas l'interval indicat, i executar els blocs especificats."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Afegeix una condició al bloc 'si'."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Afegeix una condició final, que recull qualsevol altra possibilitat, al bloc 'si'."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Afegeix, esborra o reordena seccions per reconfigurar aquest bloc 'si'."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "si no"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "si no, si"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "si"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Si un valor és cert, llavors executar unes sentències."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Si un valor és cert, llavors executar el primer bloc de sentències. En cas contrari, executar el segon bloc de sentències."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Si el primer valor és cert, llavors executar el primer bloc de sentències. En cas contrari, si el segon valor és cert, executar el segon bloc de sentències."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Si el primer valor és cert, llavors executar el primer bloc de sentències. En cas contrari, si el segon valor és cert, executar el segon bloc de sentències. Si cap dels valors és cert, executar l'últim bloc de sentències."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://ca.wikipedia.org/wiki/Bucle_For"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "fer"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "repetir %1 vegades"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Executar unes sentències diverses vegades."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repetir fins que"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repetir mentre"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Mentre un valor sigui fals, llavors executar unes sentències."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Mentre un valor sigui cert, llavors executar unes sentències."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Esborrar els %1 blocs?"; +Blockly.Msg.DELETE_BLOCK = "Esborra bloc"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "Esborra %1 blocs"; +Blockly.Msg.DISABLE_BLOCK = "Desactiva bloc"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplica"; +Blockly.Msg.ENABLE_BLOCK = "Activa bloc"; +Blockly.Msg.EXPAND_ALL = "Expandir blocs"; +Blockly.Msg.EXPAND_BLOCK = "Expandir bloc"; +Blockly.Msg.EXTERNAL_INPUTS = "Entrades externes"; +Blockly.Msg.HELP = "Ajuda"; +Blockly.Msg.INLINE_INPUTS = "Entrades en línia"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "crear llista buida"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Retorna una llista, de longitud 0, que no conté cap dada."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "llista"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Afegeix, esborra o reordena seccions per reconfigurar aquest bloc de llista."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "crear llista amb"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Afegeix un element a la llista."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Crea una llista amb qualsevol nombre d'elements."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "primer"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "núm.# des del final"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "recupera"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "recupera i esborra"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "últim"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "a l'atzar"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "esborra"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Retorna el primer element d'una llista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Retorna l'element de la posició especificada a la llista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Retorna l'últim element d'una llista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Retorna un element a l'atzar d'una llista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Esborra i retorna el primer element d'una llista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Esborra i retorna l'element de la posició especificada de la llista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Esborra i retorna l'últim element d'una llista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Esborra i retorna un element a l'atzar d'una llista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Esborra el primer element d'una llista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Esborra l'element de la posició especificada de la llista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Esborra l'últim element d'una llista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Esborra un element a l'atzar d'una llista."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "fins # des del final"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "fins #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "fins l'últim"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "recupera sub-llista des del principi"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "recupera sub-llista des de # des del final"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "recupera sub-llista des de #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crea una còpia de la part especificada d'una llista."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 és l'últim element."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 és el primer element."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "buscar primera aparició d'un element"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "buscar última aparició d'un element"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna l'índex de la primera/última aparició d'un element a la llista. Retorna %1 si no s'hi troba el text."; +Blockly.Msg.LISTS_INLIST = "en la llista"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 és buida"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Retorna cert si la llista és buida."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "longitud de %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Retorna la longitud d'una llista."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "crea llista amb element %1 repetit %2 vegades"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Crea una llista formada pel valor donat, repetit tantes vegades com s'indiqui."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "com"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "insereix a"; +Blockly.Msg.LISTS_SET_INDEX_SET = "modifica"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Insereix l'element al principi d'una llista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Insereix l'element a la posició especificada d'una llista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Afegeix l'element al final d'una llista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Insereix l'element en una posició a l'atzar d'una llista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Modifica el primer element d'una llista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Modifica l'element de la posició especificada d'una llista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Modifica l'últim element d'una llista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Modifica un element a l'atzar d'una llista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "fals"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Retorna o bé cert o bé fals."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "cert"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://ca.wikipedia.org/wiki/Inequaci%C3%B3"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Retorna cert si totes dues entrades són iguals."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Retorna cert si la primera entrada és més gran que la segona entrada."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Retorna cert si la primera entrada és més gran o igual a la segona entrada."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Retorna cert si la primera entrada és més petita que la segona entrada."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Retorna cert si la primera entra és més petita o igual a la segona entrada."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Retorna cert si totes dues entrades són diferents."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "no %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Retorna cert si l'entrada és falsa. Retorna fals si l'entrada és certa."; +Blockly.Msg.LOGIC_NULL = "nul"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Retorna nul."; +Blockly.Msg.LOGIC_OPERATION_AND = "i"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "o"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Retorna cer si totes dues entrades són certes."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Retorna cert si almenys una de les entrades és certa."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "condició"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "si és fals"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "si és cert"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Comprova la condició de 'condició'. Si la condició és certa, retorna el valor 'si és cert'; en cas contrari, retorna el valor 'si és fals'."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ca.wikipedia.org/wiki/Aritm%C3%A8tica"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Retorna la suma dels dos nombres."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Retorna el quocient dels dos nombres."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Retorna la diferència entre els dos nombres."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Retorna el producte del dos nombres."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Retorna el primer nombre elevat a la potència indicada pel segon nombre."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://ca.wikipedia.org/wiki/Suma"; +Blockly.Msg.MATH_CHANGE_TITLE = "canvia %1 per %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Afegeix un nombre a la variable '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://ca.wikipedia.org/wiki/Constant_matem%C3%A0tica"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Retorna una de les constants més habituals: π (3,141…), e (2,718…), φ (1,618…), sqrt(2) (1,414…), sqrt(½) (0,707…), o ∞ (infinit)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "limitar %1 entre %2 i %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Limita un nombre perquè estigui entre els límits especificats (inclosos)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "és divisible per"; +Blockly.Msg.MATH_IS_EVEN = "és parell"; +Blockly.Msg.MATH_IS_NEGATIVE = "és negatiu"; +Blockly.Msg.MATH_IS_ODD = "és senar"; +Blockly.Msg.MATH_IS_POSITIVE = "és positiu"; +Blockly.Msg.MATH_IS_PRIME = "és primer"; +Blockly.Msg.MATH_IS_TOOLTIP = "Comprova si un nombre és parell, senar, enter, positium negatiu, o si és divisible per un cert nombre. Retorna cert o fals."; +Blockly.Msg.MATH_IS_WHOLE = "és enter"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://ca.wikipedia.org/wiki/Residu_%28aritm%C3%A8tica%29"; +Blockly.Msg.MATH_MODULO_TITLE = "residu de %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Retorna el residu de dividir els dos nombres."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://ca.wikipedia.org/wiki/Nombre"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un nombre."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "mitjana de llista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "màxim de llista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana de llista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "mínim de llista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "moda de llista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "element aleatori de llista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "desviació estàndard de llista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "suma de llista"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Retorna la mitjana (mitjana aritmètica) dels valors numèrics de la llista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Retorna el nombre més gran de la llista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Retorna la mediana de la llista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Retorna el nombre més petit de la llista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Retorna una llista dels elements que apareixen més vegades a la llista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Retorna un element aleatori de la lllista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Retorna la desviació estàndard de la llista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Retorna la suma de tots els nombres de la llista."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://ca.wikipedia.org/wiki/Generaci%C3%B3_de_nombres_aleatoris"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "fracció aleatòria"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Retorna una fracció aleatòria entre 0,0 (inclòs) i 1,0 (exclòs)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://ca.wikipedia.org/wiki/Generaci%C3%B3_de_nombres_aleatoris"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "nombre aleatori entre %1 i %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Retorna un nombre aleatori entre els dos límits especificats, inclosos."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://ca.wikipedia.org/wiki/Arrodoniment"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arrodonir"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arrodonir cap avall"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arrodonir cap amunt"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Arrodonir un nombre cap amunt o cap avall."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://ca.wikipedia.org/wiki/Arrel_quadrada"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolut"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "arrel quadrada"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Retorna el valor absolut d'un nombre."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Retorna ''e'' elevat a la potència del nombre indicat."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Retorna el logaritme natural d'un nombre."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Retorna el logaritme en base 10 d'un nombre."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Retorna l'oposat d'un nombre."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Retorna 10 elevat a la potència del nombre indicat."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Retorna l'arrel quadrada d'un nombre."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://ca.wikipedia.org/wiki/Funci%C3%B3_trigonom%C3%A8trica"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Retorna l'arccosinus d'un nombre."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Retorna l'arcsinus d'un nombre."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Retorna l'arctangent d'un nombre."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Retorna el cosinus d'un grau (no radiant)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Retorna el sinus d'un grau (no radiant)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Retorna la tangent d'un grau (no radiant)."; +Blockly.Msg.NEW_VARIABLE = "Nova variable..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nou nom de variable:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "permetre declaracions"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "amb:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://ca.wikipedia.org/wiki/Procediment_%28Programació%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Executa la funció definida per usuari '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://ca.wikipedia.org/wiki/Procediment_%28Programació%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Executa la funció definida per l'usuari '%1' i utilitza la seva sortida."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "amb:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Crear '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "fes alguna cosa"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "a"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crea una funció sense sortida."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "retorna"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crea una funció amb una sortida."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Advertència: Aquesta funció té paràmetres duplicats."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Iluminar la definició de la funció"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Si el valor és cert, llavors retorna un segon valor."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Advertència: Aquest bloc només es pot utilitzar dins de la definició d'una funció."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nom d'entrada:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Afegir una entrada per la funció."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entrades"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Afegir, eliminar o canviar l'ordre de les entrades per aquesta funció."; +Blockly.Msg.REDO = "Redo"; // untranslated +Blockly.Msg.REMOVE_COMMENT = "Elimina el comentari"; +Blockly.Msg.RENAME_VARIABLE = "Reanomena variable..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Reanomena totes les variables '%1' a:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "afegir text"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "a"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Afegir un text a la variable '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "a minúscules"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "a Text De Títol"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "a MAJÚSCULES"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Retorna una còpia del text amb diferents majúscules/minúscules."; +Blockly.Msg.TEXT_CHARAT_FIRST = "recupera la primera lletra"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "recupera la lletra núm.# des del final"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "recupera la lletra núm.#"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "en el text"; +Blockly.Msg.TEXT_CHARAT_LAST = "recupera l'última lletra"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "recupera una lletra a l'atzar"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Recupera la lletra de la posició especificada."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Afegeix un element al text."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "unir"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Afegeix, esborrar o reordenar seccions per reconfigurar aquest bloc de text."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "fins a la lletra núm.# des del final"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "fins a la lletra núm.#"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "fins a l'última lletra"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "en el text"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "recupera subcadena des de la primera lletra"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "recupera subcadena des de la lletra núm.# des del final"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "recupera subcadena des de la lletra núm.#"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Recupera una part especificada del text."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "en el text"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "trobar la primera aparició del text"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "trobar l'última aparició del text"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna l'índex de la primera/última aparició del primer text dins el segon. Retorna %1 si no es troba el text."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 està buit"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Retorna cert si el text proporcionat està buit."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "crear text amb"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Crea un tros de text per unió de qualsevol nombre d'elements."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "llargària de %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Retorna el nombre de lletres (espais inclosos) en el text proporcionat."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "imprimir %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Imprimir el text, el nombre o altre valor especificat."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Demana que l'usuari introdueixi un nombre."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Demana que l'usuari introdueixi un text."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "demanar un nombre amb el missatge"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "demanar text amb el missatge"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://ca.wikipedia.org/wiki/Cadena_%28inform%C3%A0tica%29"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Una lletra, paraula o línia de text."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "retalla espais de tots dos extrems de"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "retalla espais de l'esquerra de"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "retalla espais de la dreta de"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Retorna una còpia del text on s'han esborrat els espais d'un o dels dos extrems."; +Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.UNDO = "Undo"; // untranslated +Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crea 'modifica %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Retorna el valor d'aquesta variable."; +Blockly.Msg.VARIABLES_SET = "modifica %1 a %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Crear 'recupera %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Modifica aquesta variable al valor introduït."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/cs.js b/src/opsoro/server/static/js/blockly/msg/js/cs.js new file mode 100644 index 0000000..d147d5c --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/cs.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.cs'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Přidat komentář"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Změnit hodnotu:"; +Blockly.Msg.CLEAN_UP = "Uspořádat bloky"; +Blockly.Msg.COLLAPSE_ALL = "Sbalit bloky"; +Blockly.Msg.COLLAPSE_BLOCK = "Sbalit blok"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "barva 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "barva 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "poměr"; +Blockly.Msg.COLOUR_BLEND_TITLE = "smíchat"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Smíchá dvě barvy v daném poměru (0.0–1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://cs.wikipedia.org/wiki/Barva"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Vyberte barvu z palety."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "náhodná barva"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Zvolte barvu náhodně."; +Blockly.Msg.COLOUR_RGB_BLUE = "modrá"; +Blockly.Msg.COLOUR_RGB_GREEN = "zelená"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "červená"; +Blockly.Msg.COLOUR_RGB_TITLE = "obarvěte barvou"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Vytvoř barvu se zadaným množstvím červené, zelené a modré. Všechny hodnoty musí být mezi 0 a 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "vyskočit ze smyčky"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "pokračuj dalším opakováním smyčky"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Vyskoč z vnitřní smyčky."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Přeskoč zbytek této smyčky a pokračuj dalším opakováním."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Upozornění: Tento blok může být použit pouze uvnitř smyčky."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "pro každou položku %1 v seznamu %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Pro každou položku v seznamu nastavte do proměnné '%1' danou položku a proveďte nějaké operace."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "počítat s %1 od %2 do %3 po %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Nechá proměnnou '%1' nabývat hodnot od počátečního do koncového čísla po daném přírůstku a provádí s ní příslušné bloky."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Přidat podmínku do \"pokud\" bloku."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Přidej konečnou podmínku zahrnující ostatní případy do bloku \"pokud\"."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Přidej, odstraň či uspořádej sekce k přenastavení tohoto bloku \"pokud\"."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "jinak"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "nebo pokud"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "pokud"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Je-li hodnota pravda, proveď určité příkazy."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Je-li hodnota pravda, proveď první blok příkazů. V opačném případě proveď druhý blok příkazů."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Je-li první hodnota pravdivá, proveď první blok příkazů. V opačném případě, je-li pravdivá druhá hodnota, proveď druhý blok příkazů."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Je-li první hodnota pravda, proveď první blok příkazů. Je-li druhá hodnota pravda, proveď druhý blok příkazů. Pokud žádná hodnota není pravda, proveď poslední blok příkazů."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://cs.wikipedia.org/wiki/Cyklus_pro"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "dělej"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "opakuj %1 krát"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Proveď určité příkazy několikrát."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "opakovat dokud"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "opakovat když"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Dokud je hodnota nepravdivá, prováděj určité příkazy."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Dokud je hodnota pravdivá, prováděj určité příkazy."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Smazat všech %1 bloků?"; +Blockly.Msg.DELETE_BLOCK = "Smazat blok"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "Smazat %1 bloků"; +Blockly.Msg.DISABLE_BLOCK = "Deaktivovat blok"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplikovat"; +Blockly.Msg.ENABLE_BLOCK = "Povolit blok"; +Blockly.Msg.EXPAND_ALL = "Rozbalit bloky"; +Blockly.Msg.EXPAND_BLOCK = "Rozbalit blok"; +Blockly.Msg.EXTERNAL_INPUTS = "vnější vstupy"; +Blockly.Msg.HELP = "Nápověda"; +Blockly.Msg.INLINE_INPUTS = "Vložené vstupy"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "vytvořit prázdný seznam"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Vrátí seznam nulové délky, který neobsahuje žádné datové záznamy"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "seznam"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Přidat, odebrat nebo změnit pořadí oddílů tohoto seznamu bloku."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "vytvořit seznam s"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Přidat položku do seznamu."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Vytvoř seznam s libovolným počtem položek."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "první"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# od konce"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "získat"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "získat a odstranit"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "poslední"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "náhodné"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "odstranit"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Vrátí první položku v seznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Získá položku z určené pozice v seznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Vrátí poslední položku v seznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Vrátí náhodnou položku ze seznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Odstraní a vrátí první položku v seznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Odstraní a získá položku z určené pozice v seznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Odstraní a vrátí poslední položku v seznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Odstraní a vrátí náhodnou položku v seznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Odstraní první položku v seznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Odebere položku na konkrétním místě v seznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Odstraní poslední položku v seznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Odstraní náhodou položku v seznamu."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "do # od konce"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "do #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "jako poslední"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "získat podseznam od první položky"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "získat podseznam od # od konce"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "získat podseznam od #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Vytvoří kopii určené části seznamu."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 je poslední položka."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 je první položka."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "najít první výskyt položky"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "najít poslední výskyt položky"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Vrací index prvního/posledního výskytu položky v seznamu. Vrací %1, pokud položka nebyla nalezena."; +Blockly.Msg.LISTS_INLIST = "v seznamu"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 je prázdné"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Vrátí hodnotu pravda, pokud je seznam prázdný."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "délka %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Vrací počet položek v seznamu."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "vytvoř seznam s položkou %1 opakovanou %1 krát"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Vytváří seznam obsahující danou hodnotu n-krát."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "jako"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "vložit na"; +Blockly.Msg.LISTS_SET_INDEX_SET = "nastavit"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Vložit položku na začátek seznamu."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Vloží položku na určenou pozici v seznamu."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Připojí položku na konec seznamu."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Připojí položku náhodně do seznamu."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Nastaví první položku v seznamu."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Nastaví položku na konkrétní místo v seznamu."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Nastaví poslední položku v seznamu."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Nastaví náhodnou položku v seznamu."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "vzestupně"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "sestupně"; +Blockly.Msg.LISTS_SORT_TITLE = "seřadit %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Seřadit kopii seznamu."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "abecedně, na velikosti písmen nezáleží"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "číselné"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "abecedně"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "udělat z textu seznam"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "udělat ze seznamu text"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Spojit seznam textů do jednoho textu, rozdělaného oddělovači."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Rozdělit text do seznamu textů, lámání na oddělovačích."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "s oddělovačem"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "nepravda"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Vrací pravda nebo nepravda."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "pravda"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://cs.wikipedia.org/wiki/Nerovnost_(matematika)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Vrátí hodnotu pravda, pokud se oba vstupy rovnají jeden druhému."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Navrátí hodnotu pravda, pokud první vstup je větší než druhý vstup."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Navrátí hodnotu pravda, pokud je první vstup větší a nebo rovný druhému vstupu."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Navrátí hodnotu pravda, pokud je první vstup menší než druhý vstup."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Navrátí hodnotu pravda, pokud je první vstup menší a nebo rovný druhému vstupu."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Vrátí hodnotu pravda, pokud se oba vstupy nerovnají sobě navzájem."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "ne %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Navrátí hodnotu pravda, pokud je vstup nepravda. Navrátí hodnotu nepravda, pokud je vstup pravda."; +Blockly.Msg.LOGIC_NULL = "prázdný"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Vrátí prázdnou hodnotu"; +Blockly.Msg.LOGIC_OPERATION_AND = "a"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "nebo"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Vrátí hodnotu pravda, pokud oba dva vstupy jsou pravdivé."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Vrátí hodnotu pravda, pokud alespoň jeden ze vstupů má hodnotu pravda."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://cs.wikipedia.org/wiki/Ternární operátor (programování)"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "pokud nepravda"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "pokud pravda"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Zkontroluje podmínku v \"testu\". Když je podmínka pravda, vrátí hodnotu \"pokud pravda\"; v opačném případě vrátí hodnotu \"pokud nepravda\"."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://cs.wikipedia.org/wiki/Aritmetika"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Vrátí součet dvou čísel."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Vrátí podíl dvou čísel."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Vrátí rozdíl dvou čísel."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Vrátí součin dvou čísel."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Vrátí první číslo umocněné na druhé číslo."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "zaměň %1 za %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Přičti číslo k proměnné '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Vraťte jednu z následujících konstant: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (nekonečno)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "omez %1 na rozmezí od %2 do %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Omezí číslo tak, aby bylo ve stanovených mezích (včetně)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "je dělitelné číslem"; +Blockly.Msg.MATH_IS_EVEN = "je sudé"; +Blockly.Msg.MATH_IS_NEGATIVE = "je záporné"; +Blockly.Msg.MATH_IS_ODD = "je liché"; +Blockly.Msg.MATH_IS_POSITIVE = "je kladné"; +Blockly.Msg.MATH_IS_PRIME = "je prvočíslo"; +Blockly.Msg.MATH_IS_TOOLTIP = "Kontrola, zda je číslo sudé, liché, prvočíslo, celé, kladné, záporné nebo zda je dělitelné daným číslem. Vrací pravdu nebo nepravdu."; +Blockly.Msg.MATH_IS_WHOLE = "je celé"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://cs.wikipedia.org/wiki/Modul%C3%A1rn%C3%AD_aritmetika"; +Blockly.Msg.MATH_MODULO_TITLE = "zbytek po dělení %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Vrátí zbytek po dělení dvou čísel."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://cs.wikipedia.org/wiki/Číslo"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Číslo."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "průměr v seznamu"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "největší v seznamu"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "medián v seznamu"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "nejmenší v seznamu"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "nejčastější ze seznamu"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "náhodná položka seznamu"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "směrodatná odchylka ze seznamu"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "suma seznamu"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Vrátí průměr (aritmetický průměr) číselných hodnot v seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Vrátí největší číslo v seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Vrátí medián seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Vrátí nejmenší číslo v seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Vrátí seznam nejčastějších položek seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Vrátí náhodnou položku ze seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Vrátí směrodatnou odchylku seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Vrátí součet všech čísel v seznamu."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://cs.wikipedia.org/wiki/Gener%C3%A1tor_n%C3%A1hodn%C3%BDch_%C4%8D%C3%ADsel"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "náhodné číslo mezi 0 (včetně) do 1"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Vrátí náhodné číslo mezi 0,0 (včetně) až 1,0"; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://cs.wikipedia.org/wiki/Gener%C3%A1tor_n%C3%A1hodn%C3%BDch_%C4%8D%C3%ADsel"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "náhodné celé číslo od %1 do %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Vrací náhodné celé číslo mezi dvěma určenými mezemi, včetně mezních hodnot."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "zaokrouhlit"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "zaokrouhlit dolů"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "zaokrouhlit nahoru"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Zaokrouhlit číslo nahoru nebo dolů."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://cs.wikipedia.org/wiki/Druhá_odmocnina"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolutní hodnota"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "druhá odmocnina"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Vrátí absolutní hodnotu čísla."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Vrátí mocninu čísla e."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Vrátí přirozený logaritmus čísla."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Vrátí desítkový logaritmus čísla."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Vrátí zápornou hodnotu čísla."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Vrátí mocninu čísla 10."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Vrátí druhou odmocninu čísla."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "acos"; +Blockly.Msg.MATH_TRIG_ASIN = "arcsin"; +Blockly.Msg.MATH_TRIG_ATAN = "arctan"; +Blockly.Msg.MATH_TRIG_COS = "cos"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; +Blockly.Msg.MATH_TRIG_TAN = "tan"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Vrátí arkus kosinus čísla."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Vrátí arkus sinus čísla."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Vrátí arkus tangens čísla."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Vrátí kosinus úhlu ve stupních."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Vrátí sinus úhlu ve stupních."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Vrátí tangens úhlu ve stupních."; +Blockly.Msg.NEW_VARIABLE = "Nová proměnná..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nový název proměnné:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "povolit příkazy"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "s:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://cs.wikipedia.org/wiki/Funkce_(programov%C3%A1n%C3%AD)"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Spustí uživatelem definovanou funkci '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://cs.wikipedia.org/wiki/Funkce_(programov%C3%A1n%C3%AD)"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Spustí uživatelem definovanou funkci '%1' a použije její výstup."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "s:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Vytvořit '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Popište tuto funkci..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://cs.wikipedia.org/w/index.php?title=Funkce_(programování)"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "proveď něco"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "k provedení"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Vytvořit funkci bez výstupu."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://cs.wikipedia.org/w/index.php?title=Funkce_(programování)"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "navrátit"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Vytvořit funkci s výstupem."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Upozornění: Tato funkce má duplicitní parametry."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Zvýraznit definici funkce"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Je-li hodnota pravda, pak vrátí druhou hodnotu."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Varování: Tento blok může být použit pouze uvnitř definici funkce."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "vstupní jméno:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Přidat vstupy do funkce."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "vstupy"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Přidat, odebrat nebo změnit pořadí vstupů této funkce."; +Blockly.Msg.REDO = "Znovu"; +Blockly.Msg.REMOVE_COMMENT = "Odstranit komentář"; +Blockly.Msg.RENAME_VARIABLE = "Přejmenovat proměnnou..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Přejmenuj všech '%1' proměnných na:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "přidat text"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "do"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Přidá určitý text k proměnné '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "na malá písmena"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "na Počáteční Velká Písmena"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "na VELKÁ PÍSMENA"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Vrátí kopii textu s jinou velikostí písmen."; +Blockly.Msg.TEXT_CHARAT_FIRST = "získat první písmeno"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "získat # písmeno od konce"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "získat písmeno #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "v textu"; +Blockly.Msg.TEXT_CHARAT_LAST = "získat poslední písmeno"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "získat náhodné písmeno"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Získat písmeno na konkrétní pozici."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Přidat položku do textu."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "spojit"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Přidat, odebrat nebo změnit pořadí oddílů tohoto textového bloku."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "do # písmene od konce"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "do písmene #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "do posledního písmene"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "v textu"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "získat podřetězec od prvního písmene"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "získat podřetězec od písmene # od konce"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "získat podřetězec od písmene #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Získat zadanou část textu."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "v textu"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "najít první výskyt textu"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "najít poslední výskyt textu"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Vrátí index prvního/posledního výskytu prvního textu v druhém textu. Pokud text není nalezen, vypíše %1."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 je prázdný"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Vrátí pravda pokud je zadaný text prázdný."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "vytvořit text s"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Vytvoří kousek textu spojením libovolného počtu položek."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "délka %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Vrátí počet písmen (včetně mezer) v zadaném textu."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "tisk %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Tisk zadaného textu, čísla nebo jiné hodnoty."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Výzva pro uživatele k zadání čísla."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Výzva pro uživatele k zadání nějakého textu."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "výzva k zadání čísla se zprávou"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "výzva k zadání textu se zprávou"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://cs.wikipedia.org/wiki/Textov%C3%BD_%C5%99et%C4%9Bzec"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Písmeno, slovo nebo řádek textu."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "odstranit mezery z obou stran"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "odstranit mezery z levé strany"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "odstranit mezery z pravé strany"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Vrátí kopii textu s odstraněnými mezerami z jednoho nebo obou konců."; +Blockly.Msg.TODAY = "Dnes"; +Blockly.Msg.UNDO = "Zpět"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "položka"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Vytvořit \"nastavit %1\""; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Vrátí hodnotu této proměnné."; +Blockly.Msg.VARIABLES_SET = "nastavit %1 na %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Vytvořit \"získat %1\""; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Nastaví tuto proměnnou, aby se rovnala vstupu."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/da.js b/src/opsoro/server/static/js/blockly/msg/js/da.js new file mode 100644 index 0000000..fa45353 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/da.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.da'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Tilføj kommentar"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Skift værdi:"; +Blockly.Msg.CLEAN_UP = "Ryd op i blokke"; +Blockly.Msg.COLLAPSE_ALL = "Fold blokkene sammen"; +Blockly.Msg.COLLAPSE_BLOCK = "Fold blokken sammen"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "farve 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "farve 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "i forholdet"; +Blockly.Msg.COLOUR_BLEND_TITLE = "bland"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blander to farver sammen i et bestemt forhold (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://da.wikipedia.org/wiki/Farve"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Vælg en farve fra paletten."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "tilfældig farve"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Vælg en tilfældig farve."; +Blockly.Msg.COLOUR_RGB_BLUE = "blå"; +Blockly.Msg.COLOUR_RGB_GREEN = "grøn"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "rød"; +Blockly.Msg.COLOUR_RGB_TITLE = "farve med"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Lav en farve med den angivne mængde af rød, grøn og blå. Alle værdier skal være mellem 0 og 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "bryd ud af løkken"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "fortsæt med den næste gentagelse i løkken"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Bryd ud af den omgivende løkke."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Spring resten af denne løkke over, og fortsæt med den næste gentagelse."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Advarsel: Denne blok kan kun bruges i en løkke."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "for hvert element %1 i listen %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For hvert element i en liste, sæt variablen '%1' til elementet, og udfør derefter nogle kommandoer."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "tæl med %1 fra %2 til %3 med %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Få variablen \"%1\" til at have værdierne fra startværdien til slutværdien, mens der tælles med det angivne interval, og udfør de angivne blokke."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Tilføj en betingelse til denne \"hvis\" blok."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Tilføj en sidste fang-alt betingelse, til denne \"hvis\" blok."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Tilføj, fjern eller byt om på rækkefølgen af delene for at konfigurere denne \"hvis\" blok."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "ellers"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "ellers hvis"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "hvis"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Hvis en værdi er sand, så udfør nogle kommandoer."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Hvis en værdi er sand, så udfør den første blok af kommandoer. Ellers udfør den anden blok af kommandoer."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Hvis den første værdi er sand, så udfør den første blok af kommandoer. Ellers, hvis den anden værdi er sand, så udfør den anden blok af kommandoer."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Hvis den første værdi er sand, så udfør den første blok af kommandoer. Ellers, hvis den anden værdi er sand, så udfør den anden blok af kommandoer. Hvis ingen af værdierne er sande, så udfør den sidste blok af kommandoer."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://da.wikipedia.org/wiki/For-l%C3%B8kke"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "udfør"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "gentag %1 gange"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Udfør nogle kommandoer flere gange."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "gentag indtil"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "gentag sålænge"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Udfør nogle kommandoer, sålænge en værdi er falsk."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Udfør nogle kommandoer, sålænge en værdi er sand."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Slet alle %1 blokke?"; +Blockly.Msg.DELETE_BLOCK = "Slet blok"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "Slet %1 blokke"; +Blockly.Msg.DISABLE_BLOCK = "Deaktivér blok"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplikér"; +Blockly.Msg.ENABLE_BLOCK = "Aktivér blok"; +Blockly.Msg.EXPAND_ALL = "Fold blokkene ud"; +Blockly.Msg.EXPAND_BLOCK = "Fold blokken ud"; +Blockly.Msg.EXTERNAL_INPUTS = "Udvendige inputs"; +Blockly.Msg.HELP = "Hjælp"; +Blockly.Msg.INLINE_INPUTS = "Indlejrede inputs"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "opret en tom liste"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returnerer en liste af længde 0, som ikke indeholder nogen data"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "liste"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Tilføj, fjern eller byt om på rækkefølgen af delene for at konfigurere denne blok."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "opret liste med"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Føj et element til listen."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Opret en liste med et vilkårligt antal elementer."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "første"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# fra slutningen"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "hent"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "hent og fjern"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "sidste"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "tilfældig"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "fjern"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returnerer det første element i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returnerer elementet på den angivne position på en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returnerer den sidste element i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returnerer et tilfældigt element i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Fjerner og returnerer det første element i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Fjerner og returnerer elementet på den angivne position på en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Fjerner og returnerer det sidste element i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Fjerner og returnerer et tilfældigt element i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Fjerner det første element i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Fjerner elementet på den angivne position på en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Fjerner sidste element i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Fjerner et tilfældigt element i en liste."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "til # fra slutningen"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "til #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "til sidste"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "hent underliste fra første"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "hent underliste fra # fra slutningen"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "hent underliste fra #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Opretter en kopi af den angivne del af en liste."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 er det sidste element."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 er det første element."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "find første forekomst af elementet"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "find sidste forekomst af elementet"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returnerer indeks for første/sidste forekomst af elementet i listen. Returnerer %1, hvis elementet ikke kan findes."; +Blockly.Msg.LISTS_INLIST = "i listen"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 er tom"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returnerer sand, hvis listen er tom."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "længden af %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returnerer længden af en liste."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "opret liste med elementet %1 gentaget %2 gange"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Opretter en liste bestående af den givne værdi gentaget et bestemt antal gange."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "som"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "indsæt ved"; +Blockly.Msg.LISTS_SET_INDEX_SET = "sæt"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Indsætter elementet i starten af en liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Indsætter elementet på den angivne position i en liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Føj elementet til slutningen af en liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Indsætter elementet tilfældigt i en liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sætter det første element i en liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sætter elementet på den angivne position i en liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sætter det sidste element i en liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sætter et tilfældigt element i en liste."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "stigende"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "faldende"; +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "nummerorden"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabetisk"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "lav tekst til liste"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "lav liste til tekst"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Saml en liste af tekster til én tekst, der er adskilt af et skilletegn."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Bryd tekst op i en liste af tekster med brud ved hvert skilletegn."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "med skilletegn"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falsk"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returnerer enten sand eller falsk."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "sand"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://da.wikipedia.org/wiki/Ulighed_(matematik)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Returnere sand, hvis begge inputs er lig med hinanden."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Returnere sand, hvis det første input er større end det andet input."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Returnere sand, hvis det første input er større end eller lig med det andet input."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Returnere sand, hvis det første input er mindre end det andet input."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Returnere sand, hvis det første input er mindre end eller lig med det andet input."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Returnere sand, hvis begge inputs ikke er lig med hinanden."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "ikke %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returnerer sand, hvis input er falsk. Returnerer falsk, hvis input er sandt."; +Blockly.Msg.LOGIC_NULL = "null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returnerer null."; +Blockly.Msg.LOGIC_OPERATION_AND = "og"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "eller"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Returnere sand, hvis begge inputs er sande."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Returnere sand, hvis mindst et af inputtene er sande."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "hvis falsk"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "hvis sand"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Kontrollér betingelsen i 'test'. Hvis betingelsen er sand, returnér \"hvis sand\" værdien; ellers returnér \"hvis falsk\" værdien."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://da.wikipedia.org/wiki/Aritmetik"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Returnere summen af de to tal."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Returnere kvotienten af de to tal."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Returnere forskellen mellem de to tal."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Returnere produktet af de to tal."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Returnere det første tal opløftet til potensen af det andet tal."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "skift %1 med %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Læg et tal til variablen '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://da.wikipedia.org/wiki/Matematisk_konstant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Returnere en af de ofte brugte konstanter: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(2) (1.414…), sqrt(½) (0.707…) eller ∞ (uendeligt)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "begræns %1 til mellem %2 og %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Begræns et tal til at være mellem de angivne grænser (inklusiv)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = ":"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "er deleligt med"; +Blockly.Msg.MATH_IS_EVEN = "er lige"; +Blockly.Msg.MATH_IS_NEGATIVE = "er negativt"; +Blockly.Msg.MATH_IS_ODD = "er ulige"; +Blockly.Msg.MATH_IS_POSITIVE = "er positivt"; +Blockly.Msg.MATH_IS_PRIME = "er et primtal"; +Blockly.Msg.MATH_IS_TOOLTIP = "Kontrollere, om et tal er lige, ulige, primtal, helt, positivt, negativt, eller om det er deleligt med bestemt tal. Returnere sandt eller falskt."; +Blockly.Msg.MATH_IS_WHOLE = "er helt"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://da.wikipedia.org/wiki/Modulo"; +Blockly.Msg.MATH_MODULO_TITLE = "resten af %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Returner resten fra at dividere de to tal."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://da.wikipedia.org/wiki/Tal"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Et tal."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "gennemsnit af listen"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "største tal i listen"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "listens median"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "mindste tal i listen"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "listens typetal"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "tilfældigt element fra listen"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standardafvigelsen for listen"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "summen af listen"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Returner gennemsnittet (middelværdien) af de numeriske værdier i listen."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Returner det største tal i listen."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Returner listens median."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Returner det mindste tal i listen."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Returner en liste over de mest almindelige elementer på listen."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Returner et tilfældigt element fra listen."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Returner standardafvigelsen for listen."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Returner summen af alle tal i listen."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://da.wikipedia.org/wiki/Tilfældighedsgenerator"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "tilfældigt decimaltal (mellem 0 og 1)"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Returner et tilfældigt decimaltal mellem 0,0 (inklusiv) og 1,0 (eksklusiv)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://da.wikipedia.org/wiki/Tilfældighedsgenerator"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "tilfældigt heltal mellem %1 og %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Returner et tilfældigt heltal mellem de to angivne grænser (inklusiv)."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://da.wikipedia.org/wiki/Afrunding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "afrund"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "rund ned"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "rund op"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Runde et tal op eller ned."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://da.wikipedia.org/wiki/Kvadratrod"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolut"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "kvadratrod"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Returnere den absolutte værdi af et tal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Returnere e til potensen af et tal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Returnere den naturlige logaritme af et tal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Returnere 10-talslogaritmen af et tal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Returnere negationen af et tal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Returnere 10 til potensen af et tal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Returnere kvadratroden af et tal."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://da.wikipedia.org/wiki/Trigonometrisk_funktion"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Returnere arcus cosinus af et tal."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Returnere arcus sinus af et tal."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Returnere arcus tangens af et tal."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Returnere cosinus af en vinkel (i grader)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Returnere sinus af en vinkel (i grader)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Returnere tangens af en vinkel (i grader)."; +Blockly.Msg.NEW_VARIABLE = "Ny variabel..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Navn til den nye variabel:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "tillad erklæringer"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "med:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://da.wikipedia.org/wiki/Funktion_%28programmering%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Kør den brugerdefinerede funktion '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://da.wikipedia.org/wiki/Funktion_%28programmering%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Kør den brugerdefinerede funktion '%1' og brug dens returværdi."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "med:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Opret '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Beskriv denne funktion..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "gøre noget"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "for at"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Opretter en funktion der ikke har nogen returværdi."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "returnér"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Opretter en funktion der har en returværdi."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Advarsel: Denne funktion har dublerede parametre."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Markér funktionsdefinitionen"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Hvis en værdi er sand, så returnér en anden værdi."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Advarsel: Denne blok kan kun anvendes inden for en funktionsdefinition."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "parameternavn:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Tilføj en parameter til funktionen."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "parametre"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Tilføje, fjerne eller ændre rækkefølgen af parametre til denne funktion."; +Blockly.Msg.REDO = "Redo"; // untranslated +Blockly.Msg.REMOVE_COMMENT = "Fjern kommentar"; +Blockly.Msg.RENAME_VARIABLE = "Omdøb variabel..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Omdøb alle '%1' variabler til:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "tilføj tekst"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "til"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Tilføj noget tekst til variablen '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "til små bogstaver"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "til Stort Begyndelsesbogstav"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "til STORE BOGSTAVER"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Returner en kopi af teksten hvor bogstaverne enten er udelukkende store eller små, eller hvor første bogstav i hvert ord er stort."; +Blockly.Msg.TEXT_CHARAT_FIRST = "hent første bogstav"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "hent bogstav # fra slutningen"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "hent bogstav #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "i teksten"; +Blockly.Msg.TEXT_CHARAT_LAST = "hent sidste bogstav"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "hent tilfældigt bogstav"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returnerer bogstavet på den angivne placering."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Føj et element til teksten."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "sammenføj"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Tilføj, fjern eller byt om på rækkefølgen af delene for at konfigurere denne tekstblok."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "til bogstav # fra slutningen"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "til bogstav #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "til sidste bogstav"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "i teksten"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "hent delstreng fra første bogstav"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "hent delstreng fra bogstav # fra slutningen"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "hent delstreng fra bogstav #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returnerer den angivne del af teksten."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "i teksten"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find første forekomst af teksten"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find sidste forekomst af teksten"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returnerer indeks for første/sidste forekomst af første tekst i den anden tekst. Returnerer %1, hvis teksten ikke kan findes."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 er tom"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returnerer sand, hvis den angivne tekst er tom."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "lav en tekst med"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Lav et stykke tekst ved at sætte et antal elementer sammen."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "længden af %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returnerer antallet af bogstaver (herunder mellemrum) i den angivne tekst."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "skriv %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Skriv den angivne tekst, tal eller anden værdi."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Spørg brugeren efter et tal"; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Spørg brugeren efter en tekst"; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "spørg efter et tal med meddelelsen"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "spørg efter tekst med meddelelsen"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://da.wikipedia.org/wiki/Tekststreng"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "En bogstav, et ord eller en linje med tekst."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "fjern mellemrum fra begge sider af"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "fjern mellemrum fra venstre side af"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "fjern mellemrum fra højre side af"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Returner en kopi af teksten med mellemrum fjernet fra den ene eller begge sider."; +Blockly.Msg.TODAY = "I dag"; +Blockly.Msg.UNDO = "Undo"; // untranslated +Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Opret 'sæt %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returnerer værdien af denne variabel."; +Blockly.Msg.VARIABLES_SET = "sæt %1 til %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Opret 'hent %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sætter denne variabel til at være lig med input."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/de.js b/src/opsoro/server/static/js/blockly/msg/js/de.js new file mode 100644 index 0000000..75c4cca --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/de.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.de'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Kommentar hinzufügen"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Wert ändern:"; +Blockly.Msg.CLEAN_UP = "Bausteine aufräumen"; +Blockly.Msg.COLLAPSE_ALL = "Alle Bausteine zusammenfalten"; +Blockly.Msg.COLLAPSE_BLOCK = "Baustein zusammenfalten"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "Farbe 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "und Farbe 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "im Verhältnis"; +Blockly.Msg.COLOUR_BLEND_TITLE = "mische"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Vermischt 2 Farben mit konfigurierbarem Farbverhältnis (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://de.wikipedia.org/wiki/Farbe"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Erzeugt eine Farbe aus der Palette."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "zufällige Farbe"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Erzeugt eine Farbe nach dem Zufallsprinzip."; +Blockly.Msg.COLOUR_RGB_BLUE = "blau"; +Blockly.Msg.COLOUR_RGB_GREEN = "grün"; +Blockly.Msg.COLOUR_RGB_HELPURL = "https://de.wikipedia.org/wiki/RGB-Farbraum"; +Blockly.Msg.COLOUR_RGB_RED = "rot"; +Blockly.Msg.COLOUR_RGB_TITLE = "Farbe aus"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Erzeugt eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 100 liegen."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://de.wikipedia.org/wiki/Kontrollstruktur"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "die Schleife abbrechen"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "sofort mit nächstem Schleifendurchlauf fortfahren"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Die umgebende Schleife beenden."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Diese Anweisung abbrechen und mit dem nächsten Schleifendurchlauf fortfahren."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warnung: Dieser Baustein kann nur in einer Schleife verwendet werden."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://de.wikipedia.org/wiki/For-Schleife"; +Blockly.Msg.CONTROLS_FOREACH_TITLE = "für jeden Wert %1 aus der Liste %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Führt eine Anweisung für jeden Wert in der Liste aus und setzt dabei die Variable \"%1\" auf den aktuellen Listenwert."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://de.wikipedia.org/wiki/For-Schleife"; +Blockly.Msg.CONTROLS_FOR_TITLE = "zähle %1 von %2 bis %3 in Schritten von %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Zählt die Variable \"%1\" von einem Startwert bis zu einem Endwert und führt für jeden Wert eine Anweisung aus."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Eine weitere Bedingung hinzufügen."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Eine sonst-Bedingung hinzufügen. Führt eine Anweisung aus, falls keine Bedingung zutrifft."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Hinzufügen, entfernen oder sortieren von Sektionen"; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "sonst"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "sonst falls"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "falls"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Führt eine Anweisung aus, falls eine Bedingung wahr ist."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Führt die erste Anweisung aus, falls eine Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Führt die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Führe die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist. Führt die dritte Anweisung aus, falls keine der beiden Bedingungen wahr ist"; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://de.wikipedia.org/wiki/For-Schleife"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "mache"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "wiederhole %1 mal:"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Eine Anweisung mehrfach ausführen."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://de.wikipedia.org/wiki/Schleife_%28Programmierung%29"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "wiederhole bis"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "wiederhole solange"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Führt Anweisungen aus solange die Bedingung unwahr ist."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Führt Anweisungen aus solange die Bedingung wahr ist."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Alle %1 Bausteine löschen?"; +Blockly.Msg.DELETE_BLOCK = "Baustein löschen"; +Blockly.Msg.DELETE_VARIABLE = "Die Variable „%1“ löschen"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "%1 Verwendungen der Variable „%2“ löschen?"; +Blockly.Msg.DELETE_X_BLOCKS = "%1 Bausteine löschen"; +Blockly.Msg.DISABLE_BLOCK = "Baustein deaktivieren"; +Blockly.Msg.DUPLICATE_BLOCK = "Kopieren"; +Blockly.Msg.ENABLE_BLOCK = "Baustein aktivieren"; +Blockly.Msg.EXPAND_ALL = "Alle Bausteine entfalten"; +Blockly.Msg.EXPAND_BLOCK = "Baustein entfalten"; +Blockly.Msg.EXTERNAL_INPUTS = "externe Eingänge"; +Blockly.Msg.HELP = "Hilfe"; +Blockly.Msg.INLINE_INPUTS = "interne Eingänge"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "erzeuge eine leere Liste"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Erzeugt eine leere Liste ohne Inhalt."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "Liste"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Hinzufügen, entfernen und sortieren von Elementen."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "erzeuge Liste mit"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Ein Element zur Liste hinzufügen."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Erzeugt eine Liste aus den angegebenen Elementen."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "erstes"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "von hinten"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = ""; +Blockly.Msg.LISTS_GET_INDEX_GET = "nimm"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "nimm und entferne"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "letztes"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "zufälliges"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "entferne"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = "Element"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Extrahiert das erste Element aus der Liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Extrahiert das Element an der angegebenen Position in der Liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Extrahiert das letzte Element aus der Liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Extrahiert ein zufälliges Element aus der Liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Extrahiert und entfernt das erste Element aus der Liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Extrahiert und entfernt das Element an der angegebenen Position aus der Liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Extrahiert und entfernt das letzte Element aus der Liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Extrahiert und entfernt ein zufälliges Element aus der Liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Entfernt das erste Element aus der Liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Entfernt das Element an der angegebenen Position aus der Liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Entfernt das letzte Element aus der Liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Entfernt ein zufälliges Element aus der Liste."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "bis von hinten"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "bis"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "bis letztes"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "nimm Teilliste ab erstes"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "nimm Teilliste ab von hinten"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "nimm Teilliste ab"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "Element"; +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Erstellt eine Kopie mit dem angegebenen Abschnitt der Liste."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 ist das letzte Element."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 ist das erste Element."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "suche erstes Auftreten von"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg.LISTS_INDEX_OF_LAST = "suche letztes Auftreten von"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Sucht die Position (Index) eines Elementes in der Liste. Gibt %1 zurück, falls kein Element gefunden wurde."; +Blockly.Msg.LISTS_INLIST = "in der Liste"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ist leer"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Ist wahr, falls die Liste leer ist."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "Länge von %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Die Anzahl von Elementen in der Liste."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg.LISTS_REPEAT_TITLE = "erzeuge Liste mit %2 mal dem Element %1​"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Erzeugt eine Liste mit einer variablen Anzahl von Elementen"; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "kehre %1 um"; +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Kehre eine Kopie einer Liste um."; +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "ein"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "füge als"; +Blockly.Msg.LISTS_SET_INDEX_SET = "setze für"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Fügt das Element an den Anfang der Liste an."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Fügt das Element an der angegebenen Position in die Liste ein."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Fügt das Element ans Ende der Liste an."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Fügt das Element zufällig in die Liste ein."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Setzt das erste Element in der Liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Setzt das Element an der angegebenen Position in der Liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Setzt das letzte Element in die Liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setzt ein zufälliges Element in der Liste."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "aufsteigend"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "absteigend"; +Blockly.Msg.LISTS_SORT_TITLE = "%1 %2 %3 sortieren"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Eine Kopie einer Liste sortieren."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetisch, Großschreibung ignorieren"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numerisch"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetisch"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Liste aus Text erstellen"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "Text aus Liste erstellen"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Liste mit Texten in einen Text vereinen, getrennt durch ein Trennzeichen."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Text in eine Liste mit Texten aufteilen, unterbrochen bei jedem Trennzeichen."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "mit Trennzeichen"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "unwahr"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Ist entweder wahr oder unwahr"; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "wahr"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Ist wahr, falls beide Werte gleich sind."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Ist wahr, falls der erste Wert größer als der zweite Wert ist."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Ist wahr, falls der erste Wert größer als oder gleich groß wie der zweite Wert ist."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Ist wahr, falls der erste Wert kleiner als der zweite Wert ist."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Ist wahr, falls der erste Wert kleiner als oder gleich groß wie der zweite Wert ist."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Ist wahr, falls beide Werte unterschiedlich sind."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "nicht %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Ist wahr, falls der Eingabewert unwahr ist. Ist unwahr, falls der Eingabewert wahr ist."; +Blockly.Msg.LOGIC_NULL = "null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://de.wikipedia.org/wiki/Nullwert"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Ist \"null\"."; +Blockly.Msg.LOGIC_OPERATION_AND = "und"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "oder"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Ist wahr, falls beide Werte wahr sind."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Ist wahr, falls einer der beiden Werte wahr ist."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "prüfe"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://de.wikipedia.org/wiki/%3F:#Auswahloperator"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "falls unwahr"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "falls wahr"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Überprüft eine Bedingung \"prüfe\". Falls die Bedingung wahr ist, wird der \"falls wahr\" Wert zurückgegeben, andernfalls der \"falls unwahr\" Wert"; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://de.wikipedia.org/wiki/Grundrechenart"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Ist die Summe zweier Zahlen."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Ist der Quotient zweier Zahlen."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Ist die Differenz zweier Zahlen."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Ist das Produkt zweier Zahlen."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Ist die erste Zahl potenziert mit der zweiten Zahl."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://de.wikipedia.org/wiki/Inkrement_und_Dekrement"; +Blockly.Msg.MATH_CHANGE_TITLE = "erhöhe %1 um %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Addiert eine Zahl zu \"%1\"."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://de.wikipedia.org/wiki/Mathematische_Konstante"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Mathematische Konstanten wie: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) oder ∞ (unendlich)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "begrenze %1 zwischen %2 und %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Begrenzt eine Zahl auf den Wertebereich zwischen zwei anderen Zahlen (inklusiv)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "ist teilbar durch"; +Blockly.Msg.MATH_IS_EVEN = "ist gerade"; +Blockly.Msg.MATH_IS_NEGATIVE = "ist negativ"; +Blockly.Msg.MATH_IS_ODD = "ist ungerade"; +Blockly.Msg.MATH_IS_POSITIVE = "ist positiv"; +Blockly.Msg.MATH_IS_PRIME = "ist eine Primzahl"; +Blockly.Msg.MATH_IS_TOOLTIP = "Überprüft ob eine Zahl gerade, ungerade, eine Primzahl, ganzzahlig, positiv, negativ oder durch eine zweite Zahl teilbar ist. Gibt wahr oder unwahr zurück."; +Blockly.Msg.MATH_IS_WHOLE = "ist eine ganze Zahl"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://de.wikipedia.org/wiki/Modulo"; +Blockly.Msg.MATH_MODULO_TITLE = "Rest von %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Der Rest nach einer Division."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://de.wikipedia.org/wiki/Zahl"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Eine Zahl."; +Blockly.Msg.MATH_ONLIST_HELPURL = "http://www.sysplus.ch/einstieg.php?links=menu&seite=4125&grad=Crash&prog=Excel"; +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "Mittelwert der Liste"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "Maximalwert der Liste"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "Median der Liste"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "Minimalwert der Liste"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "am häufigsten in der Liste"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "Zufallswert aus der Liste"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "Standardabweichung der Liste"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "Summe über die Liste"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Ist der Durchschnittswert aller Zahlen in einer Liste."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Ist die größte Zahl in einer Liste."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Ist der Median aller Zahlen in einer Liste."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Ist die kleinste Zahl in einer Liste."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Findet die Werte mit dem häufigstem Vorkommen in der Liste."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Gibt einen zufälligen Wert aus der Liste zurück."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Ist die Standardabweichung aller Werte in der Liste."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Ist die Summe aller Zahlen in einer Liste."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://de.wikipedia.org/wiki/Zufallszahlen"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "Zufallszahl (0.0 - 1.0)"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Erzeugt eine Zufallszahl zwischen 0.0 (inklusiv) und 1.0 (exklusiv)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://de.wikipedia.org/wiki/Zufallszahlen"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "ganzzahlige Zufallszahl zwischen %1 und %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Erzeugt eine ganzzahlige Zufallszahl zwischen zwei Zahlen (inklusiv)."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://de.wikipedia.org/wiki/Runden"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "runde"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "runde ab"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "runde auf"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Eine Zahl auf- oder abrunden."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://de.wikipedia.org/wiki/Quadratwurzel"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "Betrag"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "Quadratwurzel"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Ist der Betrag einer Zahl."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Ist Wert der Exponentialfunktion einer Zahl."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Ist der natürliche Logarithmus einer Zahl."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Ist der dekadische Logarithmus einer Zahl."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Negiert eine Zahl."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Rechnet 10 hoch eine Zahl."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Ist die Quadratwurzel einer Zahl."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://de.wikipedia.org/wiki/Trigonometrie"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Ist der Arkuskosinus des Eingabewertes."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Ist der Arkussinus des Eingabewertes."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Ist der Arkustangens des Eingabewertes."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Ist der Kosinus des Winkels."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Ist der Sinus des Winkels."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Ist der Tangens des Winkels."; +Blockly.Msg.NEW_VARIABLE = "Variable erstellen …"; +Blockly.Msg.NEW_VARIABLE_TITLE = "Name der neuen Variable:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "."; +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "Anweisungen erlauben"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "mit:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://de.wikipedia.org/wiki/Unterprogramm"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Rufe einen Funktionsblock ohne Rückgabewert auf."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://de.wikipedia.org/wiki/Unterprogramm"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Rufe einen Funktionsblock mit Rückgabewert auf."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "mit:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Erzeuge \"Aufruf %1\""; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Beschreibe diese Funktion …"; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "etwas tun"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = ""; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Ein Funktionsblock ohne Rückgabewert."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "gib zurück"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Ein Funktionsblock mit Rückgabewert."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warnung: Dieser Funktionsblock hat zwei gleich benannte Parameter."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Markiere Funktionsblock"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Gibt den zweiten Wert zurück und verlässt die Funktion, falls der erste Wert wahr ist."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warnung: Dieser Block darf nur innerhalb eines Funktionsblocks genutzt werden."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Variable:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Eine Eingabe zur Funktion hinzufügen."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Parameter"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Die Eingaben zu dieser Funktion hinzufügen, entfernen oder neu anordnen."; +Blockly.Msg.REDO = "Wiederholen"; +Blockly.Msg.REMOVE_COMMENT = "Kommentar entfernen"; +Blockly.Msg.RENAME_VARIABLE = "Variable umbenennen …"; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Alle \"%1\" Variablen umbenennen in:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "Text anhängen"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "an"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Text an die Variable \"%1\" anhängen."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "wandel um in kleinbuchstaben"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "wandel um in Substantive"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "wandel um in GROSSBUCHSTABEN"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Wandelt Schreibweise von Texten um, in Großbuchstaben, Kleinbuchstaben oder den ersten Buchstaben jedes Wortes groß und die anderen klein."; +Blockly.Msg.TEXT_CHARAT_FIRST = "nimm ersten"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "nimm von hinten"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "nimm"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "vom Text"; +Blockly.Msg.TEXT_CHARAT_LAST = "nimm letzten"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "nimm zufälligen"; +Blockly.Msg.TEXT_CHARAT_TAIL = "Buchstaben"; +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Extrahiert einen Buchstaben von einer bestimmten Position."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "zähle %1 in %2"; +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Zähle, wie oft ein Text innerhalb eines anderen Textes vorkommt."; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Ein Element zum Text hinzufügen."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "verbinden"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Hinzufügen, entfernen und sortieren von Elementen."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "bis von hinten"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "bis"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "bis letzter"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "im Text"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "nimm Teil ab erster"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "nimm Teil ab von hinten"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "nimm Teil ab"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = "Buchstabe"; +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Gibt den angegebenen Textabschnitt zurück."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "im Text"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "suche erstes Auftreten des Begriffs"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "suche letztes Auftreten des Begriffs"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs zurück oder %1 falls der Suchbegriff nicht gefunden wurde."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ist leer"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Ist wahr, falls der Text keine Zeichen enthält ist."; +Blockly.Msg.TEXT_JOIN_HELPURL = ""; +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "erstelle Text aus"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Erstellt einen Text durch das Verbinden von mehreren Textelementen."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "Länge von %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Die Anzahl von Zeichen in einem Text (inkl. Leerzeichen)."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "gib aus %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Gibt den Text aus."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Fragt den Benutzer nach einer Zahl."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Fragt den Benutzer nach einem Text."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "frage nach Zahl mit Hinweis"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "frage nach Text mit Hinweis"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "ersetze %1 durch %2 in %3"; +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Ersetze alle Vorkommen eines Textes innerhalb eines anderen Textes."; +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "kehre %1 um"; +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Kehre die Reihenfolge der Zeichen im Text um."; +Blockly.Msg.TEXT_TEXT_HELPURL = "https://de.wikipedia.org/wiki/Zeichenkette"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Ein Buchstabe, Text oder Satz."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "entferne Leerzeichen vom Anfang und vom Ende (links und rechts)"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "entferne Leerzeichen vom Anfang (links)"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "entferne Leerzeichen vom Ende (rechts)"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Entfernt Leerzeichen vom Anfang und / oder Ende eines Textes."; +Blockly.Msg.TODAY = "Heute"; +Blockly.Msg.UNDO = "Rückgängig"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "etwas"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Erzeuge \"Schreibe %1\""; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29"; +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Gibt den Wert der Variable zurück."; +Blockly.Msg.VARIABLES_SET = "setze %1 auf %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Erzeuge \"Lese %1\""; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29"; +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Setzt den Wert einer Variable."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Eine Variable namens „%1“ ist bereits vorhanden."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/diq.js b/src/opsoro/server/static/js/blockly/msg/js/diq.js new file mode 100644 index 0000000..3436ca8 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/diq.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.diq'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Tefsir cı ke"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Erci bıvurne:"; +Blockly.Msg.CLEAN_UP = "Blokan pak ke"; +Blockly.Msg.COLLAPSE_ALL = "Blokan teng ke"; +Blockly.Msg.COLLAPSE_BLOCK = "Bloki teng ke"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "reng 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "reng 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "nısbet"; +Blockly.Msg.COLOUR_BLEND_TITLE = "tewde"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://diq.wikipedia.org/wiki/Reng"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Şıma palet ra yew reng weçinê."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "rengo rastameye"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Tesadufi yu ren bıweçin"; +Blockly.Msg.COLOUR_RGB_BLUE = "kewe"; +Blockly.Msg.COLOUR_RGB_GREEN = "kıho"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "sur"; +Blockly.Msg.COLOUR_RGB_TITLE = "komponentên rengan"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Şıma renganê sûr, aşıl u kohoy ra rengê do spesifik vırazê. Gani ê pêro 0 u 100 miyan de bıbê."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "Çerxen ra vec"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "Gama bin da çerxeni ra dewam ke"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Öujtewada çerxeni ra bıvıci"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the rest of this loop, and continue with the next iteration."; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Diqat: No bloke şeno teyna yew çerxiyayış miyan de bıgırweyo."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "Lista %2 de her item %1 rê"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Yew lista de her item rê, varyansê '%1' itemi rê vırazê, u dıma tayê akerdışi (beyani) bıdê"; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "count with %1 from %2 to %3 by %4"; // untranslated +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; // untranslated +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Bloq da if'i rê yu şert dekerê de."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block."; // untranslated +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Add, remove, or reorder sections to reconfigure this if block."; // untranslated +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "çıniyose"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "niyose"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "se"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Eger yew vaye raşto, o taw şıma tayê akerdışi kerê."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "bıke"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1 fıni tekrar ke"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Şıma tayêna reyi akerdışi kerê."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "hend tekrar ke"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "Tekrar kerdış de"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Yew erc xırabo se tay beyanati bıd"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Yew erc raşto se yu beyanat bıd."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Pêro %1 bloki besteriyê?"; +Blockly.Msg.DELETE_BLOCK = "Bloki bestere"; +Blockly.Msg.DELETE_VARIABLE = "Şıma vırnaoğê '%1'i besterê"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "%1 ke vırnayışê '%2'i gırweneno, besteriyo?"; +Blockly.Msg.DELETE_X_BLOCKS = "%1 blokan bestere"; +Blockly.Msg.DISABLE_BLOCK = "Çengi devre ra vec"; +Blockly.Msg.DUPLICATE_BLOCK = "Zewnc"; +Blockly.Msg.ENABLE_BLOCK = "Bloki feal ke"; +Blockly.Msg.EXPAND_ALL = "Blokan hera ke"; +Blockly.Msg.EXPAND_BLOCK = "Bloki hera ke"; +Blockly.Msg.EXTERNAL_INPUTS = "Cıkewtışê xarıciy"; +Blockly.Msg.HELP = "Peşti"; +Blockly.Msg.INLINE_INPUTS = "Cıkerdışê xomiyani"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "lista venge vıraze"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "liste"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "Liste ya vıraz"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Yew nesne dekerê lista miyan"; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_FIRST = "verên"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# peyniye ra"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "bıgê"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "Bıgi u wedarne"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "peyên"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "raştameye"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "wedare"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returns the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Removes and returns the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Removes the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "Peyni # ra hetana"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "#'ya"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "Hetana pey"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "get sub-list from first"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 objeyo peyên o"; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 objeyo sıfteyên o"; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "Sıfte bıyayena cay obcey bıvin"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated +Blockly.Msg.LISTS_INLIST = "lista de"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 vengo"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Eger kı lista venga se raşt keno çerğ"; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Derganiya yu lister dano."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "zey"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "De fi"; +Blockly.Msg.LISTS_SET_INDEX_SET = "ca ke"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserts the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sets the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "zeydıyen"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "Kemeyen"; +Blockly.Msg.LISTS_SORT_TITLE = "Kılm %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "Amoriyal"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "Alfabetik"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "Hududoxi ya"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "ğelet"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Raşt yana çep erc dano"; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "raşt"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Return true if both inputs equal each other."; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Return true if the first input is greater than the second input."; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Return true if the first input is greater than or equal to the second input."; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Return true if the first input is smaller than the second input."; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Return true if the first input is smaller than or equal to the second input."; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Return true if both inputs are not equal to each other."; // untranslated +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "%1 niyo"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returns true if the input is false. Returns false if the input is true."; // untranslated +Blockly.Msg.LOGIC_NULL = "veng"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Veng çarneno ra."; +Blockly.Msg.LOGIC_OPERATION_AND = "û"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "ya zi"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Eger her dı cıkewtışi zi raştê, şıma ageyrê."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true."; // untranslated +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "eke ğeleto"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "eke raşto"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Şerta'test'i test keno. Eger ke şert raşta se erca 'raşt'i çarneno, çepo se erca 'çep' çarneno."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Aritmetik"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Return the sum of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Return the difference of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Return the product of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "%2, keno %1 vurneno"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; // untranslated +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Heryen sabitan ra yewi çerx ke:π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (bêsonp)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "Leteyêno"; +Blockly.Msg.MATH_IS_EVEN = "zewnco"; +Blockly.Msg.MATH_IS_NEGATIVE = "negatifo"; +Blockly.Msg.MATH_IS_ODD = "kıto"; +Blockly.Msg.MATH_IS_POSITIVE = "pozitifo"; +Blockly.Msg.MATH_IS_PRIME = "bıngehên"; +Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated +Blockly.Msg.MATH_IS_WHOLE = "tamo"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "%1 ÷ %2 ra menden"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Dı amoran ra amora menden çerx ke"; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://diq.wikipedia.org/wiki/Numre"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Yew numre."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "Averacê lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "Tewr gırdê lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "Wertey lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "Tewr qıcê lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "listey modi"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "Raştamaye objeya lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standard deviation of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "koma liste"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Return the average (arithmetic mean) of the numeric values in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Return the largest number in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Return the median number in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Return the smallest number in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Return a list of the most common item(s) in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Liste ra raştamaye yew elementi çerx ke"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Return the sum of all the numbers in the list."; // untranslated +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "Raştamaye nimande amor"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "random integer from %1 to %2"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; // untranslated +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "gılor ke"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "Loğê cêri ke"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "Loğê cori ke"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Yu amorer loğê cêri yana cori ke"; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "mutlaq"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "karekok"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Ena amorer nêravêrde deyne çerx ke."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Return the square root of a number."; // untranslated +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated +Blockly.Msg.NEW_VARIABLE = "Vuriyayeyo bıvıraz..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Namey vuriyayeyê newi:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "Çıyan rê mısafe bıd"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "ebe:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "ebe:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "'%1' vıraze"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Nê fonksiyoni beyan ke..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "Çıyê bık"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "rê"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Yew fonksiyono çap nêdate vırazeno"; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "peyser biya"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Yew fonksiyono çap daye vırazeno"; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; // untranslated +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "namey cıkewtışi:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "cıkewtışi"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Newe ke"; +Blockly.Msg.REMOVE_COMMENT = "Tefsiri Wedare"; +Blockly.Msg.RENAME_VARIABLE = "Vuriyayey fına name ke..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Pêro vırnayışê '%1' reyna name ke:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "Metin dek"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "rê"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; // untranslated +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "Herfanê werdiyana"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "Ser herf gırd"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "HERFANÊ GIRDANA"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg.TEXT_CHARAT_FIRST = "Herfa sıfti bıgi"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "# ra tepya herfan bıgi"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "Herfa # bıgi"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "metın de"; +Blockly.Msg.TEXT_CHARAT_LAST = "Herfa peyên bıgi"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "Raştamaye yu herf bıgi"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Şınasnaye pozisyon de yu herfer çerğ keno"; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "gıre de"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "metın de"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "# ra substring gêno"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Tay letey metini çerğ keno"; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "metın de"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 vengo"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "ya metin vıraz"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; // untranslated +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "print %1"; // untranslated +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; // untranslated +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Yu herfa, satır yana çekuya metini"; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "trim spaces from both sides of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated +Blockly.Msg.TODAY = "Ewro"; +Blockly.Msg.UNDO = "Peyser biya"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "unsur"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; // untranslated +Blockly.Msg.VARIABLES_SET = "set %1 to %2"; // untranslated +Blockly.Msg.VARIABLES_SET_CREATE_GET = "'get %1' vıraz"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Yew vırnayış be namey '%1' xora est."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/el.js b/src/opsoro/server/static/js/blockly/msg/js/el.js new file mode 100644 index 0000000..ac4f459 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/el.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.el'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Πρόσθεσε Το Σχόλιο"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Άλλαξε την τιμή:"; +Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.COLLAPSE_ALL = "Σύμπτυξτε Όλα Τα Μπλοκ"; +Blockly.Msg.COLLAPSE_BLOCK = "Σύμπτυξε Το Μπλοκ"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "χρώμα 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "χρώμα 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "αναλογία"; +Blockly.Msg.COLOUR_BLEND_TITLE = "μείγμα"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Συνδυάζει δύο χρώματα μαζί με μια δεδομένη αναλογία (0.0 - 1,0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://el.wikipedia.org/wiki/%CE%A7%CF%81%CF%8E%CE%BC%CE%B1"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Επιτρέπει επιλογή χρώματος από την παλέτα."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "τυχαίο χρώμα"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Επιλέγει χρώμα τυχαία."; +Blockly.Msg.COLOUR_RGB_BLUE = "μπλε"; +Blockly.Msg.COLOUR_RGB_GREEN = "πράσινο"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "κόκκινο"; +Blockly.Msg.COLOUR_RGB_TITLE = "χρώμα με"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Δημιουργεί χρώμα με το συγκεκριμένο ποσό του κόκκινου, πράσινου και μπλε που ορίζεις. Όλες οι τιμές πρέπει να είναι μεταξύ 0 και 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "φεύγει από το μπλοκ επαναλήψεως"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "συνέχισε με την επόμενη επανάληψη του μπλοκ επαναλήψεως"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Ξεφεύγει (βγαίνει έξω) από την επανάληψη."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Παραλείπει το υπόλοιπο τμήμα αυτού του μπλοκ επαναλήψεως, και συνεχίζει με την επόμενη επανάληψη."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Προειδοποίηση: Αυτό το μπλοκ μπορεί να χρησιμοποιηθεί μόνο μέσα σε μια επανάληψη."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "για κάθε στοιχείο %1 στη λίστα %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Για κάθε στοιχείο σε μια λίστα, ορίζει τη μεταβλητή «%1» στο στοιχείο και, στη συνέχεια, εκτελεί κάποιες εντολές."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "Blockly"; +Blockly.Msg.CONTROLS_FOR_TITLE = "μέτρησε με %1 από το %2 έως το %3 ανά %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Η μεταβλητή «%1» παίρνει τιμές ξεκινώντας από τον αριθμό έναρξης μέχρι τον αριθμό τέλους αυξάνοντας κάθε φορά με το καθορισμένο βήμα και εκτελώντας το καθορισμένο μπλοκ."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Πρόσθετει μια κατάσταση/συνθήκη στο μπλοκ «εάν»."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Προσθέτει μια τελική κατάσταση/συνθήκη, που πιάνει όλες τις άλλες περιπτώσεις, στο μπλοκ «εάν»."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Προσθέτει, αφαιρεί ή αναδιατάσσει τα τμήματα για να αναδιαμορφώσει αυτό το μπλοκ «εάν»."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "αλλιώς"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "εναλλακτικά εάν"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "εάν"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Αν μια τιμή είναι αληθής, τότε εκτελεί κάποιες εντολές."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Αν μια τιμή είναι αληθής, τότε εκτελεί το πρώτο τμήμα εντολών. Διαφορετικά, εκτελεί το δεύτερο τμήμα εντολών."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Αν η πρώτη τιμή είναι αληθής, τότε εκτελεί το πρώτο τμήμα εντολών. Διαφορετικά, αν η δεύτερη τιμή είναι αληθής, εκτελεί το δεύτερο μπλοκ εντολών."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Αν η πρώτη τιμή είναι αληθής, τότε εκτελεί το πρώτο τμήμα εντολών. Διαφορετικά, αν η δεύτερη τιμή είναι αληθής, εκτελεί το δεύτερο τμήμα εντολών. Αν καμία από τις τιμές δεν είναι αληθής, εκτελεί το τελευταίο τμήμα εντολών."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "κάνε"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "επανάλαβε %1 φορές"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Εκτελεί κάποιες εντολές αρκετές φορές."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "επανάλαβε μέχρι"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "επανάλαβε ενώ"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Ενόσω μια τιμή είναι ψευδής, τότε εκτελεί κάποιες εντολές."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Ενόσω μια τιμή είναι αληθής, τότε εκτελεί κάποιες εντολές."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Να διαγραφούν και τα %1 μπλοκ?"; +Blockly.Msg.DELETE_BLOCK = "Διέγραψε Το Μπλοκ"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "Διέγραψε %1 Μπλοκ"; +Blockly.Msg.DISABLE_BLOCK = "Απενεργοποίησε Το Μπλοκ"; +Blockly.Msg.DUPLICATE_BLOCK = "Διπλότυπο"; +Blockly.Msg.ENABLE_BLOCK = "Ενεργοποίησε Το Μπλοκ"; +Blockly.Msg.EXPAND_ALL = "Επέκτεινε Όλα Τα Μπλοκ"; +Blockly.Msg.EXPAND_BLOCK = "Επέκτεινε Το Μπλοκ"; +Blockly.Msg.EXTERNAL_INPUTS = "Εξωτερικές Είσοδοι"; +Blockly.Msg.HELP = "Βοήθεια"; +Blockly.Msg.INLINE_INPUTS = "Εσωτερικές Είσοδοι"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "δημιούργησε κενή λίστα"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Επιστρέφει μια λίστα, με μήκος 0, η οποία δεν περιέχει εγγραφές δεδομένων"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "λίστα"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Προσθέτει, αφαιρεί ή αναδιατάσσει τα τμήματα για να αναδιαμορφώσει αυτό το μπλοκ λίστας."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "δημιούργησε λίστα με"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Προσθέτει αντικείμενο στη λίστα."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Δημιουργεί λίστα με οποιονδήποτε αριθμό αντικειμένων."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "πρώτο"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# από το τέλος"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "πάρε"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "πάρε και αφαίρεσε"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "τελευταίο"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "τυχαίο"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "αφαίρεσε"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Επιστρέφει το πρώτο στοιχείο σε μια λίστα."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Επιστρέφει το τελευταίο στοιχείο σε μια λίστα."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Επιστρέφει ένα τυχαίο στοιχείο σε μια λίστα."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Καταργεί και επιστρέφει το πρώτο στοιχείο σε μια λίστα."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Καταργεί και επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Καταργεί και επιστρέφει το τελευταίο στοιχείο σε μια λίστα."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Καταργεί και επιστρέφει ένα τυχαίο στοιχείο σε μια λίστα."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Καταργεί το πρώτο στοιχείο σε μια λίστα."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Καταργεί το στοιχείο στην καθορισμένη θέση σε μια λίστα."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Καταργεί το τελευταίο στοιχείο σε μια λίστα."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Καταργεί ένα τυχαίο στοιχείο σε μια λίστα."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "έως # από το τέλος"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "έως #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "έως το τελευταίο"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "Blockly"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "πάρε υπολίστα από την αρχή"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "πάρε υπολίστα από # από το τέλος"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "πάρε υπολίστα από #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Δημιουργεί ένα αντίγραφο του καθορισμένου τμήματος μιας λίστας."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "Το %1 είναι το τελευταίο στοιχείο."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "Το %1 είναι το πρώτο στοιχείο."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "βρες την πρώτη εμφάνιση του στοιχείου"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "Blockly"; +Blockly.Msg.LISTS_INDEX_OF_LAST = "βρες την τελευταία εμφάνιση του στοιχείου"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του στοιχείου στη λίστα. Επιστρέφει τιμή %1, αν το στοιχείο δεν βρεθεί."; +Blockly.Msg.LISTS_INLIST = "στη λίστα"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "το %1 είναι κενό"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Επιστρέφει αληθής αν η λίστα είναι κενή."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "Blockly"; +Blockly.Msg.LISTS_LENGTH_TITLE = "το μήκος του %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Επιστρέφει το μήκος μιας λίστας."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "Blockly"; +Blockly.Msg.LISTS_REPEAT_TITLE = "δημιούργησε λίστα με το στοιχείο %1 να επαναλαμβάνεται %2 φορές"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Δημιουργεί μια λίστα που αποτελείται από την δεδομένη τιμή που επαναλαμβάνεται για συγκεκριμένο αριθμό επαναλήψεων."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "σε"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "είσαγε στο"; +Blockly.Msg.LISTS_SET_INDEX_SET = "όρισε"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Εισάγει το στοιχείο στην αρχή μιας λίστας."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Εισάγει το στοιχείο στην καθορισμένη θέση σε μια λίστα."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Αναθέτει το στοιχείο στο τέλος μιας λίστας."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Εισάγει το στοιχείο τυχαία σε μια λίστα."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Ορίζει το πρώτο στοιχείο σε μια λίστα."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Ορίζει το στοιχείο στην καθορισμένη θέση σε μια λίστα."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Ορίζει το τελευταίο στοιχείο σε μια λίστα."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Ορίζει ένα τυχαίο στοιχείο σε μια λίστα."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "Αύξουσα"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "Φθίνουσα"; +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "αριθμητικό"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "Αλφαβητικά"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "κάνετε λίστα από το κείμενο"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "κάνετε κείμενο από τη λίστα"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Ενώστε μια λίστα κειμένων σε ένα κείμενο, που χωρίζονται από ένα διαχωριστικό."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Διαίρεση του κειμένου σε μια λίστα κειμένων, με σπάσιμο σε κάθε διαχωριστικό."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "με διαχωριστικό"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "ψευδής"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Επιστρέφει είτε αληθής είτε ψευδής."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "αληθής"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Επιστρέφει αληθής αν και οι δύο είσοδοι είναι ίσες μεταξύ τους."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μεγαλύτερη από τη δεύτερη είσοδο."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μικρότερη ή ίση με τη δεύτερη είσοδο."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μικρότερη από τη δεύτερη είσοδο."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μικρότερη από ή ίση με τη δεύτερη είσοδο."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Επιστρέφει αληθής αν και οι δύο είσοδοι δεν είναι ίσες μεταξύ τους."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "όχι %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Επιστρέφει αληθής αν η είσοδος είναι ψευδής. Επιστρέφει ψευδής αν η είσοδος είναι αληθής."; +Blockly.Msg.LOGIC_NULL = "κενό"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Επιστρέφει κενό."; +Blockly.Msg.LOGIC_OPERATION_AND = "και"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "ή"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Επιστρέφει αληθής αν και οι δύο είσοδοι είναι αληθής."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Επιστρέφει αληθής αν τουλάχιστον μια από τις εισόδους είναι αληθής."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "έλεγχος"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "εάν είναι ψευδής"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "εάν είναι αληθής"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Ελέγχει την κατάσταση/συνθήκη στον «έλεγχο». Αν η κατάσταση/συνθήκη είναι αληθής, επιστρέφει την τιμή «εάν αληθής», διαφορετικά επιστρέφει την τιμή «εάν ψευδής»."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://el.wikipedia.org/wiki/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CE%B7%CF%84%CE%B9%CE%BA%CE%AE"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Επιστρέφει το άθροισμα των δύο αριθμών."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Επιστρέφει το πηλίκο των δύο αριθμών."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Επιστρέφει τη διαφορά των δύο αριθμών."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Επιστρέφει το γινόμενο των δύο αριθμών."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Επιστρέφει τον πρώτο αριθμό υψωμένο στη δύναμη του δεύτερου αριθμού."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://el.wikipedia.org/wiki/%CE%A0%CF%81%CF%8C%CF%83%CE%B8%CE%B5%CF%83%CE%B7"; +Blockly.Msg.MATH_CHANGE_TITLE = "άλλαξε %1 από %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Προσθέτει έναν αριθμό στη μεταβλητή «%1»."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Επιστρέφει μία από τις κοινές σταθερές: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...), ή ∞ (άπειρο)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "περιόρισε %1 χαμηλή %2 υψηλή %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Περιορίζει έναν αριθμό μεταξύ των προβλεπόμενων ορίων (χωρίς αποκλεισμούς)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "είναι διαιρετός από το"; +Blockly.Msg.MATH_IS_EVEN = "είναι άρτιος"; +Blockly.Msg.MATH_IS_NEGATIVE = "είναι αρνητικός"; +Blockly.Msg.MATH_IS_ODD = "είναι περιττός"; +Blockly.Msg.MATH_IS_POSITIVE = "είναι θετικός"; +Blockly.Msg.MATH_IS_PRIME = "είναι πρώτος"; +Blockly.Msg.MATH_IS_TOOLTIP = "Ελέγχει αν ένας αριθμός είναι άρτιος, περιττός, πρώτος, ακέραιος, θετικός, αρνητικός, ή αν είναι διαιρετός από έναν ορισμένο αριθμό. Επιστρέφει αληθής ή ψευδής."; +Blockly.Msg.MATH_IS_WHOLE = "είναι ακέραιος"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "υπόλοιπο της %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Επιστρέφει το υπόλοιπο της διαίρεσης των δύο αριθμών."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://el.wikipedia.org/wiki/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8C%CF%82"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Ένας αριθμός."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "μέσος όρος λίστας"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "μεγαλύτερος λίστας"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "διάμεσος λίστας"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "μικρότερος λίστας"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "μορφές λίστας"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "τυχαίο στοιχείο λίστας"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "τυπική απόκλιση λίστας"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "άθροισμα λίστας"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Επιστρέφει τον αριθμητικό μέσο όρο από τις αριθμητικές τιμές στη λίστα."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Επιστρέφει τον μεγαλύτερο αριθμό στη λίστα."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Επιστρέφει τον διάμεσο της λίστας."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Επιστρέφει τον μικρότερο αριθμό στη λίστα."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Επιστρέφει μια λίστα με τα πιο κοινά στοιχεία στη λίστα."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Επιστρέφει ένα τυχαίο στοιχείο από τη λίστα."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Επιστρέφει την τυπική απόκλιση της λίστας."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Επιστρέφει το άθροισμα όλων των αριθμών στη λίστα."; +Blockly.Msg.MATH_POWER_SYMBOL = "^ ύψωση σε δύναμη"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://el.wikipedia.org/wiki/%CE%93%CE%B5%CE%BD%CE%BD%CE%AE%CF%84%CF%81%CE%B9%CE%B1_%CE%A4%CF%85%CF%87%CE%B1%CE%AF%CF%89%CE%BD_%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8E%CE%BD"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "τυχαίο κλάσμα"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Επιστρέψει ένα τυχαία κλάσμα μεταξύ 0,0 (κλειστό) και 1,0 (ανοικτό)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "τυχαίος ακέραιος από το %1 έως το %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Επιστρέφει έναν τυχαίο ακέραιο αριθμό μεταξύ δύο συγκεκριμένων ορίων (εντός - συμπεριλαμβανομένων και των ακραίων τιμών)."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "στρογγυλοποίησε"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "στρογγυλοποίησε προς τα κάτω"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "στρογγυλοποίησε προς τα πάνω"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Στρογγυλοποιεί έναν αριθμό προς τα πάνω ή προς τα κάτω."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://el.wikipedia.org/wiki/%CE%A4%CE%B5%CF%84%CF%81%CE%B1%CE%B3%CF%89%CE%BD%CE%B9%CE%BA%CE%AE_%CF%81%CE%AF%CE%B6%CE%B1"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "απόλυτη"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "τετραγωνική ρίζα"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Επιστρέφει την απόλυτη τιμή ενός αριθμού."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Επιστρέφει το e υψωμένο στη δύναμη ενός αριθμού."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Επιστρέφει τον νεπέρειο λογάριθμο ενός αριθμού."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Επιστρέφει τον λογάριθμο με βάση το 10 ενός αριθμού."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Επιστρέφει την αρνητική ενός αριθμού."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Επιστρέφει το 10 υψωμένο στη δύναμη ενός αριθμού."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Επιστρέφει την τετραγωνική ρίζα ενός αριθμού."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "acos"; +Blockly.Msg.MATH_TRIG_ASIN = "asin"; +Blockly.Msg.MATH_TRIG_ATAN = "atan"; +Blockly.Msg.MATH_TRIG_COS = "συν"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://el.wikipedia.org/wiki/%CE%A4%CF%81%CE%B9%CE%B3%CF%89%CE%BD%CE%BF%CE%BC%CE%B5%CF%84%CF%81%CE%B9%CE%BA%CE%AE_%CF%83%CF%85%CE%BD%CE%AC%CF%81%CF%84%CE%B7%CF%83%CE%B7"; +Blockly.Msg.MATH_TRIG_SIN = "ημ"; +Blockly.Msg.MATH_TRIG_TAN = "εφ"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Επιστρέφει το τόξο συνημίτονου ενός αριθμού."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Επιστρέφει το τόξο ημίτονου ενός αριθμού."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Επιστρέφει το τόξο εφαπτομένης ενός αριθμού."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Επιστρέφει το συνημίτονο ενός βαθμού (όχι ακτινίου)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Επιστρέφει το ημίτονο ενός βαθμού (όχι ακτινίου)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Επιστρέφει την εφαπτομένη ενός βαθμού (όχι ακτινίου)."; +Blockly.Msg.NEW_VARIABLE = "Νέα μεταβλητή..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Νέο όνομα μεταβλητής:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "να επιτρέπονται οι δηλώσεις"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "με:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://el.wikipedia.org/wiki/%CE%94%CE%B9%CE%B1%CE%B4%CE%B9%CE%BA%CE%B1%CF%83%CE%AF%CE%B1_%28%CF%85%CF%80%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CF%83%CF%84%CE%AD%CF%82%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Εκτελεί την ορισμένη από τον χρήστη συνάρτηση «%1»."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://el.wikipedia.org/wiki/%CE%94%CE%B9%CE%B1%CE%B4%CE%B9%CE%BA%CE%B1%CF%83%CE%AF%CE%B1_%28%CF%85%CF%80%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CF%83%CF%84%CE%AD%CF%82%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Εκτελεί την ορισμένη από τον χρήστη συνάρτηση «%1» και χρησιμοποίησε την έξοδό της."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "με:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Δημιούργησε «%1»"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "κάνε κάτι"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "στο"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Δημιουργεί μια συνάρτηση χωρίς έξοδο."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "επέστρεψε"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Δημιουργεί μια συνάρτηση με μια έξοδο."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Προειδοποίηση: Αυτή η συνάρτηση έχει διπλότυπες παραμέτρους."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Επισημάνετε τον ορισμό συνάρτησης"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Αν μια τιμή είναι αληθής, τότε επιστρέφει τη δεύτερη τιμή."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Προειδοποίηση: Αυτό το μπλοκ μπορεί να χρησιμοποιηθεί μόνο στον ορισμό μιας συνάρτησης."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "όνομα εισόδου:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Πρόσθεσε μια είσοδος στη συνάρτηση"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "είσοδοι"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Προσθέτει, αφαιρεί ή αναδιατάσσει εισόδους σε αυτήν τη λειτουργία"; +Blockly.Msg.REDO = "Ακύρωση αναίρεσης"; +Blockly.Msg.REMOVE_COMMENT = "Αφαίρεσε Το Σχόλιο"; +Blockly.Msg.RENAME_VARIABLE = "Μετονόμασε τη μεταβλητή..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Μετονόμασε όλες τις μεταβλητές «%1» σε:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "ανάθεσε κείμενο"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "έως"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Αναθέτει κείμενο στη μεταβλητή «%1»."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "σε πεζά"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "σε Λέξεις Με Πρώτα Κεφαλαία"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "σε ΚΕΦΑΛΑΙΑ"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Επιστρέφει ένα αντίγραφο του κειμένου σε διαφορετική μορφή γραμμάτων."; +Blockly.Msg.TEXT_CHARAT_FIRST = "πάρε το πρώτο γράμμα"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "πάρε το γράμμα # από το τέλος"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "πάρε το γράμμα #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "στο κείμενο"; +Blockly.Msg.TEXT_CHARAT_LAST = "πάρε το τελευταίο γράμμα"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "πάρε τυχαίο γράμμα"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Επιστρέφει το γράμμα στην καθορισμένη θέση."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Προσθέτει ένα στοιχείο στο κείμενο."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "ένωσε"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Προσθέτει, αφαιρεί ή αναδιατάσσει τους τομείς για να αναδιαμορφώσει αυτό το μπλοκ κειμένου."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "μέχρι το # γράμμα από το τέλος"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "μέχρι το # γράμμα"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "μέχρι το τελευταίο γράμμα"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "στο κείμενο"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "πάρε τη δευτερεύουσα συμβολοσειρά από το πρώτο γράμμα"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "πάρε τη δευτερεύουσα συμβολοσειρά από το # γράμμα από το τέλος"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "πάρε τη δευτερεύουσα συμβολοσειρά από το # γράμμα"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Επιστρέφει ένα συγκεκριμένο τμήμα του κειμένου."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "στο κείμενο"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "βρες την πρώτη εμφάνιση του κειμένου"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "βρες την τελευταία εμφάνιση του κειμένου"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του πρώτου κειμένου στο δεύτερο κείμενο. Επιστρέφει τιμή %1, αν δε βρει το κείμενο."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "το %1 είναι κενό"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Επιστρέφει αληθής αν το παρεχόμενο κείμενο είναι κενό."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "δημιούργησε κείμενο με"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Δημιουργεί ένα κομμάτι κειμένου ενώνοντας έναν απεριόριστο αριθμό αντικειμένων."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "το μήκος του %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Επιστρέφει το πλήθος των γραμμάτων (συμπεριλαμβανομένων και των κενών διαστημάτων) στο παρεχόμενο κείμενο."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "εκτύπωσε %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Εκτυπώνει το καθορισμένο κείμενο, αριθμό ή άλλη τιμή."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Δημιουργεί προτροπή για τον χρήστη για να δώσει ένα αριθμό."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Δημιουργεί προτροπή για το χρήστη για να δώσει κάποιο κείμενο."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "πρότρεψε με μήνυμα για να δοθεί αριθμός"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "πρότρεψε με μήνυμα για να δοθεί κείμενο"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://el.wikipedia.org/wiki/%CE%A3%CF%85%CE%BC%CE%B2%CE%BF%CE%BB%CE%BF%CF%83%CE%B5%CE%B9%CF%81%CE%AC"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Ένα γράμμα, μια λέξη ή μια γραμμή κειμένου."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "περίκοψε τα κενά και από τις δυο πλευρές του"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "περίκοψε τα κενά από την αριστερή πλευρά του"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "περίκοψε τα κενά από την δεξιά πλευρά του"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Επιστρέφει ένα αντίγραφο του κειμένου με αφαιρεμένα τα κενά από το ένα ή και τα δύο άκρα."; +Blockly.Msg.TODAY = "Σήμερα"; +Blockly.Msg.UNDO = "Αναίρεση"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "αντικείμενο"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Δημιούργησε «όρισε %1»"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Επιστρέφει την τιμή αυτής της μεταβλητής."; +Blockly.Msg.VARIABLES_SET = "όρισε %1 μέχρι το %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Δημιούργησε «πάρε %1»"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Ορίζει αυτή τη μεταβλητή να είναι ίση με την είσοδο."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/en-gb.js b/src/opsoro/server/static/js/blockly/msg/js/en-gb.js new file mode 100644 index 0000000..7f02b7a --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/en-gb.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.en.gb'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Add Comment"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Change value:"; +Blockly.Msg.CLEAN_UP = "Clean up Blocks"; +Blockly.Msg.COLLAPSE_ALL = "Collapse Blocks"; +Blockly.Msg.COLLAPSE_BLOCK = "Collapse Block"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "colour 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "colour 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "ratio"; +Blockly.Msg.COLOUR_BLEND_TITLE = "blend"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blends two colours together with a given ratio (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Colour"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Choose a colour from the palette."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "random colour"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Choose a colour at random."; +Blockly.Msg.COLOUR_RGB_BLUE = "blue"; +Blockly.Msg.COLOUR_RGB_GREEN = "green"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "red"; +Blockly.Msg.COLOUR_RGB_TITLE = "colour with"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "break out of loop"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continue with next iteration of loop"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Break out of the containing loop."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the rest of this loop, and continue with the next iteration."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warning: This block may only be used within a loop."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "for each item %1 in list %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For each item in a list, set the variable '%1' to the item, and then do some statements."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "count with %1 from %2 to %3 by %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Add, remove, or reorder sections to reconfigure this if block."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "else"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "else if"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "if"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "If a value is true, then do some statements."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "do"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "repeat %1 times"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Do some statements several times."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repeat until"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repeat while"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "While a value is false, then do some statements."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "While a value is true, then do some statements."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; +Blockly.Msg.DELETE_BLOCK = "Delete Block"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "Delete %1 Blocks"; +Blockly.Msg.DISABLE_BLOCK = "Disable Block"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplicate"; +Blockly.Msg.ENABLE_BLOCK = "Enable Block"; +Blockly.Msg.EXPAND_ALL = "Expand Blocks"; +Blockly.Msg.EXPAND_BLOCK = "Expand Block"; +Blockly.Msg.EXTERNAL_INPUTS = "External Inputs"; +Blockly.Msg.HELP = "Help"; +Blockly.Msg.INLINE_INPUTS = "Inline Inputs"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "create empty list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "list"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "create list with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Add an item to the list."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_FIRST = "first"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# from end"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "get"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "get and remove"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_LAST = "last"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "random"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "remove"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returns the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Removes and returns the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Removes the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "to # from end"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "to #"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "to last"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "get sub-list from first"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 is the last item."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 is the first item."; // untranslated +Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated +Blockly.Msg.LISTS_INLIST = "in list"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty."; // untranslated +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; // untranslated +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "as"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INSERT = "insert at"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_SET = "set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserts the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sets the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descendente"; +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "false"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returns either true or false."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "true"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Return true if both inputs equal each other."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Return true if the first input is greater than the second input."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Return true if the first input is greater than or equal to the second input."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Return true if the first input is smaller than the second input."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Return true if the first input is smaller than or equal to the second input."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Return true if both inputs are not equal to each other."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "not %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returns true if the input is false. Returns false if the input is true."; +Blockly.Msg.LOGIC_NULL = "null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returns null."; +Blockly.Msg.LOGIC_OPERATION_AND = "and"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "or"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Return true if both inputs are true."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "if false"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "if true"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Return the sum of the two numbers."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Return the difference of the two numbers."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Return the product of the two numbers."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "change %1 by %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "is divisible by"; +Blockly.Msg.MATH_IS_EVEN = "is even"; +Blockly.Msg.MATH_IS_NEGATIVE = "is negative"; +Blockly.Msg.MATH_IS_ODD = "is odd"; +Blockly.Msg.MATH_IS_POSITIVE = "is positive"; +Blockly.Msg.MATH_IS_PRIME = "is prime"; +Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; +Blockly.Msg.MATH_IS_WHOLE = "is whole"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated +Blockly.Msg.MATH_MODULO_TITLE = "remainder of %1 ÷ %2"; // untranslated +Blockly.Msg.MATH_MODULO_TOOLTIP = "Return the remainder from dividing the two numbers."; // untranslated +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "A number."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "average of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "max of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "median of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "min of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modes of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "random item of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standard deviation of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "sum of list"; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Return the average (arithmetic mean) of the numeric values in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Return the largest number in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Return the median number in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Return the smallest number in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Return a list of the most common item(s) in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Return a random element from the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Return the sum of all the numbers in the list."; // untranslated +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "random fraction"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_TITLE = "random integer from %1 to %2"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; // untranslated +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "round"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "round down"; // untranslated +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "round up"; // untranslated +Blockly.Msg.MATH_ROUND_TOOLTIP = "Round a number up or down."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolute"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "square root"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Return the natural logarithm of a number."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Return the base 10 logarithm of a number."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Return the negation of a number."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Return the square root of a number."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; +Blockly.Msg.NEW_VARIABLE = "New variable..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "New variable name:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "with:"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "with:"; // untranslated +Blockly.Msg.PROCEDURES_CREATE_DO = "Create '%1'"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "do something"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "to"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "return"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; // untranslated +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; // untranslated +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; // untranslated +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; +Blockly.Msg.REMOVE_COMMENT = "Remove Comment"; +Blockly.Msg.RENAME_VARIABLE = "Rename variable..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Rename all '%1' variables to:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "append text"; // untranslated +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "to"; // untranslated +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; // untranslated +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "to lower case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "to UPPER CASE"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg.TEXT_CHARAT_FIRST = "get first letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_FROM_END = "get letter # from end"; // untranslated +Blockly.Msg.TEXT_CHARAT_FROM_START = "get letter #"; // untranslated +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in text"; // untranslated +Blockly.Msg.TEXT_CHARAT_LAST = "get last letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "join"; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; // untranslated +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "create text with"; // untranslated +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; // untranslated +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "print %1"; // untranslated +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; // untranslated +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated +Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; // untranslated +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "trim spaces from both sides of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated +Blockly.Msg.TODAY = "Today"; +Blockly.Msg.UNDO = "Undo"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; // untranslated +Blockly.Msg.VARIABLES_SET = "set %1 to %2"; // untranslated +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/en.js b/src/opsoro/server/static/js/blockly/msg/js/en.js new file mode 100644 index 0000000..d75b37a --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/en.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.en'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Add Comment"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Change value:"; +Blockly.Msg.CLEAN_UP = "Clean up Blocks"; +Blockly.Msg.COLLAPSE_ALL = "Collapse Blocks"; +Blockly.Msg.COLLAPSE_BLOCK = "Collapse Block"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "colour 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "colour 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "ratio"; +Blockly.Msg.COLOUR_BLEND_TITLE = "blend"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blends two colours together with a given ratio (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Choose a colour from the palette."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; +Blockly.Msg.COLOUR_RANDOM_TITLE = "random colour"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Choose a colour at random."; +Blockly.Msg.COLOUR_RGB_BLUE = "blue"; +Blockly.Msg.COLOUR_RGB_GREEN = "green"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "red"; +Blockly.Msg.COLOUR_RGB_TITLE = "colour with"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "break out of loop"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continue with next iteration of loop"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Break out of the containing loop."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the rest of this loop, and continue with the next iteration."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warning: This block may only be used within a loop."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; +Blockly.Msg.CONTROLS_FOREACH_TITLE = "for each item %1 in list %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For each item in a list, set the variable '%1' to the item, and then do some statements."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; +Blockly.Msg.CONTROLS_FOR_TITLE = "count with %1 from %2 to %3 by %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Add, remove, or reorder sections to reconfigure this if block."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "else"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "else if"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "if"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "If a value is true, then do some statements."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "do"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "repeat %1 times"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Do some statements several times."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repeat until"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repeat while"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "While a value is false, then do some statements."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "While a value is true, then do some statements."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; +Blockly.Msg.DELETE_BLOCK = "Delete Block"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; +Blockly.Msg.DELETE_X_BLOCKS = "Delete %1 Blocks"; +Blockly.Msg.DISABLE_BLOCK = "Disable Block"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplicate"; +Blockly.Msg.ENABLE_BLOCK = "Enable Block"; +Blockly.Msg.EXPAND_ALL = "Expand Blocks"; +Blockly.Msg.EXPAND_BLOCK = "Expand Block"; +Blockly.Msg.EXTERNAL_INPUTS = "External Inputs"; +Blockly.Msg.HELP = "Help"; +Blockly.Msg.INLINE_INPUTS = "Inline Inputs"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "create empty list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "list"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "create list with"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Add an item to the list."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "first"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# from end"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "get"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "get and remove"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "last"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "random"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "remove"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returns the item at the specified position in a list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Removes and returns the item at the specified position in a list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Removes the item at the specified position in a list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "to # from end"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "to #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "to last"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "get sub-list from first"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 is the last item."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 is the first item."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; +Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; +Blockly.Msg.LISTS_INLIST = "in list"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; +Blockly.Msg.LISTS_LENGTH_TITLE = "length of %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "as"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "insert at"; +Blockly.Msg.LISTS_SET_INDEX_SET = "set"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserts the item at the specified position in a list."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sets the item at the specified position in a list."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "false"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returns either true or false."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "true"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Return true if both inputs equal each other."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Return true if the first input is greater than the second input."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Return true if the first input is greater than or equal to the second input."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Return true if the first input is smaller than the second input."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Return true if the first input is smaller than or equal to the second input."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Return true if both inputs are not equal to each other."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg.LOGIC_NEGATE_TITLE = "not %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returns true if the input is false. Returns false if the input is true."; +Blockly.Msg.LOGIC_NULL = "null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returns null."; +Blockly.Msg.LOGIC_OPERATION_AND = "and"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; +Blockly.Msg.LOGIC_OPERATION_OR = "or"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Return true if both inputs are true."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "if false"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "if true"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Return the sum of the two numbers."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Return the difference of the two numbers."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Return the product of the two numbers."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "change %1 by %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; +Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "is divisible by"; +Blockly.Msg.MATH_IS_EVEN = "is even"; +Blockly.Msg.MATH_IS_NEGATIVE = "is negative"; +Blockly.Msg.MATH_IS_ODD = "is odd"; +Blockly.Msg.MATH_IS_POSITIVE = "is positive"; +Blockly.Msg.MATH_IS_PRIME = "is prime"; +Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; +Blockly.Msg.MATH_IS_WHOLE = "is whole"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "remainder of %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Return the remainder from dividing the two numbers."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "A number."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "average of list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "max of list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "median of list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "min of list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modes of list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "random item of list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standard deviation of list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "sum of list"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Return the average (arithmetic mean) of the numeric values in the list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Return the largest number in the list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Return the median number in the list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Return the smallest number in the list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Return a list of the most common item(s) in the list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Return a random element from the list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Return the sum of all the numbers in the list."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "random fraction"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "random integer from %1 to %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "round"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "round down"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "round up"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Round a number up or down."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolute"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "square root"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Return the natural logarithm of a number."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Return the base 10 logarithm of a number."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Return the negation of a number."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Return the square root of a number."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "acos"; +Blockly.Msg.MATH_TRIG_ASIN = "asin"; +Blockly.Msg.MATH_TRIG_ATAN = "atan"; +Blockly.Msg.MATH_TRIG_COS = "cos"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; +Blockly.Msg.MATH_TRIG_TAN = "tan"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; +Blockly.Msg.NEW_VARIABLE = "Create variable..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "New variable name:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "with:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "with:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Create '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "do something"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "to"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "return"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; +Blockly.Msg.REDO = "Redo"; +Blockly.Msg.REMOVE_COMMENT = "Remove Comment"; +Blockly.Msg.RENAME_VARIABLE = "Rename variable..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Rename all '%1' variables to:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "append text"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg.TEXT_APPEND_TO = "to"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "to lower case"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "to UPPER CASE"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; +Blockly.Msg.TEXT_CHARAT_FIRST = "get first letter"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "get letter # from end"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "get letter #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in text"; +Blockly.Msg.TEXT_CHARAT_LAST = "get last letter"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "join"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in text"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "create text with"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg.TEXT_LENGTH_TITLE = "length of %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg.TEXT_PRINT_TITLE = "print %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "trim spaces from both sides of"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; +Blockly.Msg.TODAY = "Today"; +Blockly.Msg.UNDO = "Undo"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; +Blockly.Msg.VARIABLES_SET = "set %1 to %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/eo.js b/src/opsoro/server/static/js/blockly/msg/js/eo.js new file mode 100644 index 0000000..be7b47f --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/eo.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.eo'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Aldoni komenton"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Ŝangi valoron:"; +Blockly.Msg.CLEAN_UP = "Purigi blokojn"; +Blockly.Msg.COLLAPSE_ALL = "Faldi blokojn"; +Blockly.Msg.COLLAPSE_BLOCK = "Faldi blokon"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "koloro 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "koloro 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "proporcio"; +Blockly.Msg.COLOUR_BLEND_TITLE = "blend"; // untranslated +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://eo.wikipedia.org/wiki/Koloro"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Elekti koloron el la paletro."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "hazarda koloro"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Elekti hazardan koloron."; +Blockly.Msg.COLOUR_RGB_BLUE = "blua"; +Blockly.Msg.COLOUR_RGB_GREEN = "verda"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "ruĝa"; +Blockly.Msg.COLOUR_RGB_TITLE = "kolorigi per"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "eliri el la ciklo"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "daŭrigi je la venonta ripeto de la ciklo"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Eliri el la enhava ciklo."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Pretersalti la ceteron de tiu ĉi ciklo kaj daŭrigi je la venonta ripeto."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Averto: tiu ĉi bloko uzeblas nur ene de ciklo."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "por ĉiu elemento %1 en la listo %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For each item in a list, set the variable '%1' to the item, and then do some statements."; // untranslated +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "count with %1 from %2 to %3 by %4"; // untranslated +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; // untranslated +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Aldoni kondiĉon al la bloko 'se'"; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Aldoni 'aliokaze' kondiĉon al la 'se' bloko."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Add, remove, or reorder sections to reconfigure this if block."; // untranslated +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "alie"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "alie se"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "se"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Plenumi ordonojn se la valoro estas vero."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Plenumi la unuan blokon de ordonoj se la valoro estas vero, se ne, la duan."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; // untranslated +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "fari"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "ripeti %1 fojojn"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Plenumi kelkajn ordonojn plurfoje."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ripeti ĝis"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ripeti dum"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Plenumi ordonojn dum valoro egalas malvero."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Plenumi ordonojn dum la valoro egalas vero."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Ĉu forigi ĉiujn %1 blokojn?"; +Blockly.Msg.DELETE_BLOCK = "Forigi blokon"; +Blockly.Msg.DELETE_VARIABLE = "Forigi la varianton '%1'"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Ĉu forigi %1 uzojn de la varianto '%2'?"; +Blockly.Msg.DELETE_X_BLOCKS = "Forigi %1 blokojn"; +Blockly.Msg.DISABLE_BLOCK = "Malŝalti blokon"; +Blockly.Msg.DUPLICATE_BLOCK = "Duobligi"; +Blockly.Msg.ENABLE_BLOCK = "Ŝalti blokon"; +Blockly.Msg.EXPAND_ALL = "Malfaldi blokojn"; +Blockly.Msg.EXPAND_BLOCK = "Malfaldi blokon"; +Blockly.Msg.EXTERNAL_INPUTS = "Eksteraj eniroj"; +Blockly.Msg.HELP = "Helpo"; +Blockly.Msg.INLINE_INPUTS = "Entekstaj eniroj"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "krei malplenan liston"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Listo, de longo 0, sen datumaj registroj, estos liverita."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "listo"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Aldoni, forigi aŭ oridigi sekciojn por reagordi tiun ĉi blokon de listo."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "krei liston kun"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Aldoni elementon al la listo."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Krei liston kun ajna nombro de elementoj."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "unuan"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "#el la fino"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "akiri"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "akiri kaj forigi"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "lastan"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "hazardan"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "forigi"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "La unua elemento en la listo esto liverita."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "La elemento en la specifita pozicio en la listo estos liverita."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "La lasta elemento en la listo estos liverita."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Hazarda elemento en la listo estos liverita."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "La unua elemento en la listo estos liverita kaj forigita."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "La elemento en la specifita pozicio de la listo estos liverita kaj forigita."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "La lasta elemento en la listo estos liverita kaj forigita."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Hazarda elemento en la listo estos liverita kaj forigita."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "La unua elemento en la listo estos forigita."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "La elemento en la specifita pozicio en la listo estos forigita."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "La lasta elemento en la listo estos forigita."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Hazarda elemento en la listo estos forigita."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "to # from end"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "to #"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "to last"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "get sub-list from first"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 estas la lasta elemento."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 estas la unua elemento."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "trovi la unuan aperon de elemento"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "trovi la lastan aperon de elemento"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "La indekso de la unua/lasta apero de la elemento en la listo estos liverita. %1 estos liverita se la elemento ne estas trovita."; +Blockly.Msg.LISTS_INLIST = "en la listo"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 malplenas"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Vero estos liverita, se la listo malplenas."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "longo de %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "La longo de listo estos liverita."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "krei liston kun elemento %1 ripetita %2 fojojn"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Listo kun la specifita nombro de elementoj, kiuj havos la donitan valoron, estos kreita."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "kiel"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "enmeti je"; +Blockly.Msg.LISTS_SET_INDEX_SET = "difini"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserts the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sets the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falsa"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "La rezulto egalas ĉu vero, ĉu malvero."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "vera"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://eo.wikipedia.org/wiki/Neegala%C4%B5o_(pli_granda,_malpli_granda)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Vero estos liverita, se la du eniroj egalas."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Vero estos liverita, se la unua eniro estas pli granda ol la dua."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Vero estos liverita, se la unua eniro estas pli granda aŭ egala al la dua."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Vero estos liverita, se la unua eniro estas pli eta ol la dua."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Vero estos liverita, se la unua eniro estas pli eta aŭ egala al la dua."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Vero estos liverita, se la du eniroj ne egalas."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "maligi %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Se la eniro egalas vero, la rezulto egalas malvero. Se la eniro egalas malvero, la rezulto egalas vero."; +Blockly.Msg.LOGIC_NULL = "null"; // untranslated +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returns null."; // untranslated +Blockly.Msg.LOGIC_OPERATION_AND = "kaj"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "aŭ"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Vero estos liverita, se la du eniroj egalas veron."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Vero estos liverita, se almenaŭ unu el la eniroj egalas veron."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "testi"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "se estas malvero"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "se estas vero"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Kontroli la kondiĉon en 'testo'. Se la kondiĉo egalas veron, liveri la valoron 'se estas vero', aliokaze liveri la valoron 'se estas malvero'."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://eo.wikipedia.org/wiki/Aritmetiko"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "La sumo de la du nombroj estos liverita."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "La kvociento de la du nombroj estos liverita."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "La diferenco inter la du nombroj estos liverita."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "La produto de la du numeroj estos liverita."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg.MATH_CHANGE_TITLE = "change %1 by %2"; // untranslated +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Aldoni nombro al varianto '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://eo.wikipedia.org/wiki/Matematika_konstanto"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "limigi %1 inter %2 kaj %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "La nombro estos limigita tiel ke ĝi egalas la limojn aŭ troviĝas inter ili."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "estas dividebla de"; +Blockly.Msg.MATH_IS_EVEN = "estas para"; +Blockly.Msg.MATH_IS_NEGATIVE = "estas negativa"; +Blockly.Msg.MATH_IS_ODD = "estas nepara"; +Blockly.Msg.MATH_IS_POSITIVE = "estas pozitiva"; +Blockly.Msg.MATH_IS_PRIME = "estas primo"; +Blockly.Msg.MATH_IS_TOOLTIP = "Vero aŭ malvero estos liverita, depende de la rezulto de kontrolo, ĉu nombro estas para, nepara, pozitiva, negativa, aŭ dividebla de iu nombro."; +Blockly.Msg.MATH_IS_WHOLE = "estas entjero"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://eo.wikipedia.org/wiki/Resto"; +Blockly.Msg.MATH_MODULO_TITLE = "resto de %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "La resto de la divido de du nombroj estos liverita."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://eo.wikipedia.org/wiki/Nombro"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Nombro."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "listmezumo"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "listmaksimumo"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "median of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "listminimumo"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "reĝimoj de listo"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "hazarda elemento el la listo"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "Norma devio de la listo"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "sumo de listo"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "La aritmetika meznombro de la numeroj en la listo estos liverita."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "La plej granda numero en la listo estos redonita."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Return the median number in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "La plej eta nombro en la listo estos redonita."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Return a list of the most common item(s) in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Elemento el la listo estos hazarde liverita."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "La norma devio de la listo estos liverita."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "La sumo de ĉiuj nombro en la listo estos liverita."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "random fraction"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "hazarda entjero inter %1 kaj %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Nombro estos hazarde liverita, tiel ke ĝi egalas la limojn aŭ troviĝas inter ili."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "rondigi"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "rondigi malsupren"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "Rondigi supren"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Rondigi nombroj, supren aŭ malsupren."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://eo.wikipedia.org/wiki/Kvadrata_radiko"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absoluta"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "kvadrata radiko"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "La absoluta valoro de nombro estos liverita."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "La rezulto de la potenco de e je la nombro."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "La natura logaritmo de nombro estos liverita."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "La dekbaza logaritmo de numero estos liverita."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "La negativigo de numero estos liverita."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "La kvadrata radiko de nombro estos liverita."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://eo.wikipedia.org/wiki/Trigonometria_funkcio"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "La sinusarko de nombro estos liverita."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "La targentarko de nombro estos liverita."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated +Blockly.Msg.NEW_VARIABLE = "Nova varianto..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nova nomo de varianto:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "with:"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "with:"; // untranslated +Blockly.Msg.PROCEDURES_CREATE_DO = "Krei '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "do something"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "to"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "return"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; // untranslated +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; // untranslated +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; // untranslated +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Refari"; +Blockly.Msg.REMOVE_COMMENT = "Forigi komenton"; +Blockly.Msg.RENAME_VARIABLE = "Renomi varianton..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Renomi ĉiujn '%1' variantojn kiel:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "aldoni tekston"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "to"; // untranslated +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; // untranslated +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "to lower case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "to UPPER CASE"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg.TEXT_CHARAT_FIRST = "get first letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_FROM_END = "get letter # from end"; // untranslated +Blockly.Msg.TEXT_CHARAT_FROM_START = "get letter #"; // untranslated +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "en la teksto"; +Blockly.Msg.TEXT_CHARAT_LAST = "get last letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "join"; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "en la teksto"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; // untranslated +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "en la teksto"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 malplenas"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "create text with"; // untranslated +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "longo de %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; // untranslated +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "presi %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Presi la specifitan tekston, nombron aŭ alian valoron."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Peti nombron al uzanto."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Peti tekston al uzanto."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated +Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; // untranslated +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "trim spaces from both sides of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "forigi spacojn el la dekstra flanko de"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated +Blockly.Msg.TODAY = "Hodiaŭ"; +Blockly.Msg.UNDO = "Malfari"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "elemento"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; // untranslated +Blockly.Msg.VARIABLES_SET = "set %1 to %2"; // untranslated +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Jam ekzistas varianto kun la nomo '%1'."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/es.js b/src/opsoro/server/static/js/blockly/msg/js/es.js new file mode 100644 index 0000000..0e8917e --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/es.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.es'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Añadir comentario"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Cambiar el valor:"; +Blockly.Msg.CLEAN_UP = "Limpiar los bloques"; +Blockly.Msg.COLLAPSE_ALL = "Contraer bloques"; +Blockly.Msg.COLLAPSE_BLOCK = "Contraer bloque"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "color 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "color 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "proporción"; +Blockly.Msg.COLOUR_BLEND_TITLE = "combinar"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Combina dos colores con una proporción determinada (0,0–1,0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://es.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Elige un color de la paleta."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "color aleatorio"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Elige un color al azar."; +Blockly.Msg.COLOUR_RGB_BLUE = "azul"; +Blockly.Msg.COLOUR_RGB_GREEN = "verde"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "rojo"; +Blockly.Msg.COLOUR_RGB_TITLE = "colorear con"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Crea un color con cantidades específicas de rojo, verde y azul. Todos los valores deben encontrarse entre 0 y 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "romper el bucle"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continuar con la siguiente iteración del bucle"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Romper el bucle que lo contiene."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Saltar el resto de este bucle, y continuar con la siguiente iteración."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "ADVERTENCIA: Este bloque puede usarse sólo dentro de un bucle."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://es.wikipedia.org/wiki/Foreach"; +Blockly.Msg.CONTROLS_FOREACH_TITLE = "para cada elemento %1 en la lista %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Para cada elemento en una lista, establecer la variable '%1' al elemento y luego hacer algunas declaraciones."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "contar con %1 desde %2 hasta %3 de a %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Hacer que la variable \"%1\" tome los valores desde el número de inicio hasta el número final, contando con el intervalo especificado, y hacer los bloques especificados."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Agregar una condición a este bloque."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Agregar una condición general final a este bloque."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Agregar, eliminar o reordenar las secciones para reconfigurar este bloque."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "sino"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "sino si"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "si"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Si un valor es verdadero, entonces hacer algunas declaraciones."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Si un valor es verdadero, entonces hacer el primer bloque de declaraciones. De lo contrario, hacer el segundo bloque de declaraciones."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Si el primer valor es verdadero, entonces hacer el primer bloque de declaraciones. De lo contrario, si el segundo valor es verdadero, hacer el segundo bloque de declaraciones."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Si el primer valor es verdadero, entonces hacer el primer bloque de declaraciones. De lo contrario, si el segundo valor es verdadero, hacer el segundo bloque de declaraciones. Si ninguno de los valores son verdaderos, hacer el último bloque de declaraciones."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://es.wikipedia.org/wiki/Bucle_for"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "hacer"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "repetir %1 veces"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Hacer algunas declaraciones varias veces."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repetir hasta"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repetir mientras"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Mientras un valor sea falso, entonces hacer algunas declaraciones."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Mientras un valor sea verdadero, entonces hacer algunas declaraciones."; +Blockly.Msg.DELETE_ALL_BLOCKS = "¿Eliminar todos los %1 bloques?"; +Blockly.Msg.DELETE_BLOCK = "Eliminar bloque"; +Blockly.Msg.DELETE_VARIABLE = "Borrar la variable \"%1\""; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "¿Borrar %1 usos de la variable \"%2\"?"; +Blockly.Msg.DELETE_X_BLOCKS = "Eliminar %1 bloques"; +Blockly.Msg.DISABLE_BLOCK = "Desactivar bloque"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplicar"; +Blockly.Msg.ENABLE_BLOCK = "Activar bloque"; +Blockly.Msg.EXPAND_ALL = "Expandir bloques"; +Blockly.Msg.EXPAND_BLOCK = "Expandir bloque"; +Blockly.Msg.EXTERNAL_INPUTS = "Entradas externas"; +Blockly.Msg.HELP = "Ayuda"; +Blockly.Msg.INLINE_INPUTS = "Entradas en línea"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "crear lista vacía"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Devuelve una lista, de longitud 0, sin ningún dato"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Agregar, eliminar o reorganizar las secciones para reconfigurar este bloque de lista."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "crear lista con"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Agregar un elemento a la lista."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Crear una lista con cualquier número de elementos."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "primero"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# del final"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "obtener"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "obtener y eliminar"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "último"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aleatorio"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "eliminar"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Devuelve el primer elemento de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Devuelve el elemento en la posición especificada en una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Devuelve el último elemento de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Devuelve un elemento aleatorio en una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Elimina y devuelve el primer elemento de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Elimina y devuelve el elemento en la posición especificada en una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Elimina y devuelve el último elemento de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Elimina y devuelve un elemento aleatorio en una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Elimina el primer elemento de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Elimina el elemento en la posición especificada en una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Elimina el último elemento de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Elimina un elemento aleatorio en una lista."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "hasta # del final"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "hasta #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "hasta el último"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "obtener sublista desde el primero"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "obtener sublista desde # del final"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "obtener sublista desde #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crea una copia de la parte especificada de una lista."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 es el último elemento."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 es el primer elemento."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "encontrar la primera aparición del elemento"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "encontrar la última aparición del elemento"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Devuelve el índice de la primera/última aparición del elemento en la lista. Devuelve %1 si el elemento no se encuentra."; +Blockly.Msg.LISTS_INLIST = "en la lista"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 está vacía"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Devuelve verdadero si la lista está vacía."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "longitud de %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Devuelve la longitud de una lista."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "crear lista con el elemento %1 repetido %2 veces"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Crea una lista que consta de un valor dado repetido el número de veces especificado."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "revertir %1"; +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "como"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "insertar en"; +Blockly.Msg.LISTS_SET_INDEX_SET = "establecer"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserta el elemento al inicio de una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserta el elemento en la posición especificada en una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Añade el elemento al final de una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserta el elemento aleatoriamente en una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Establece el primer elemento de una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Establece el elemento en la posición especificada en una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Establece el último elemento de una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Establece un elemento aleatorio en una lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascendente"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descendente"; +Blockly.Msg.LISTS_SORT_TITLE = "orden %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Ordenar una copia de una lista."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alfabético, ignorar mayúscula/minúscula"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numérico"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabético"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "hacer lista a partir de texto"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "hacer texto a partir de lista"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Unir una lista de textos en un solo texto, separado por un delimitador."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Dividir el texto en una lista de textos, separando en cada delimitador."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "con delimitador"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falso"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Devuelve verdadero o falso."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "verdadero"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://es.wikipedia.org/wiki/Desigualdad_matemática"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Devuelve verdadero si ambas entradas son iguales."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Devuelve verdadero si la primera entrada es mayor que la segunda entrada."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Devuelve verdadero si la primera entrada es mayor o igual a la segunda entrada."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Devuelve verdadero si la primera entrada es menor que la segunda entrada."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Devuelve verdadero si la primera entrada es menor que o igual a la segunda entrada."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Devuelve verdadero si ambas entradas son distintas."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "no %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Devuelve verdadero si la entrada es falsa. Devuelve falso si la entrada es verdadera."; +Blockly.Msg.LOGIC_NULL = "nulo"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Devuelve nulo."; +Blockly.Msg.LOGIC_OPERATION_AND = "y"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "o"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Devuelve verdadero si ambas entradas son verdaderas."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Devuelve verdadero si al menos una de las entradas es verdadera."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "prueba"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "si es falso"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "si es verdadero"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Comprueba la condición en \"prueba\". Si la condición es verdadera, devuelve el valor \"si es verdadero\"; de lo contrario, devuelve el valor \"si es falso\"."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://es.wikipedia.org/wiki/Aritmética"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Devuelve la suma de ambos números."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Devuelve el cociente de ambos números."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Devuelve la diferencia de ambos números."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Devuelve el producto de ambos números."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Devuelve el primer número elevado a la potencia del segundo."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "añadir %2 a %1"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Añadir un número a la variable «%1»."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://es.wikipedia.org/wiki/Anexo:Constantes_matemáticas"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Devuelve una de las constantes comunes: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) o ∞ (infinito)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "limitar %1 entre %2 y %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Limitar un número entre los límites especificados (inclusive)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "es divisible por"; +Blockly.Msg.MATH_IS_EVEN = "es par"; +Blockly.Msg.MATH_IS_NEGATIVE = "es negativo"; +Blockly.Msg.MATH_IS_ODD = "es impar"; +Blockly.Msg.MATH_IS_POSITIVE = "es positivo"; +Blockly.Msg.MATH_IS_PRIME = "es primo"; +Blockly.Msg.MATH_IS_TOOLTIP = "Comprueba si un número es par, impar, primo, entero, positivo, negativo, o si es divisible por un número determinado. Devuelve verdadero o falso."; +Blockly.Msg.MATH_IS_WHOLE = "es entero"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "resto de %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Devuelve el resto al dividir los dos números."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://es.wikipedia.org/wiki/Número"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un número."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "promedio de la lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "máximo de la lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana de la lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "mínimo de la lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modas de la lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "elemento aleatorio de la lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "desviación estándar de la lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "suma de la lista"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Devuelve el promedio (media aritmética) de los valores numéricos en la lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Devuelve el número más grande en la lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Devuelve la mediana en la lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Devuelve el número más pequeño en la lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Devuelve una lista de los elementos más comunes en la lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Devuelve un elemento aleatorio de la lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Devuelve la desviación estándar de la lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Devuelve la suma de todos los números en la lista."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://es.wikipedia.org/wiki/Generador_de_números_aleatorios"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "fracción aleatoria"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Devuelve una fracción aleatoria entre 0,0 (ambos inclusive) y 1.0 (exclusivo)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://es.wikipedia.org/wiki/Generador_de_números_aleatorios"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "entero aleatorio de %1 a %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Devuelve un entero aleatorio entre los dos límites especificados, inclusive."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://es.wikipedia.org/wiki/Redondeo"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "redondear"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "redondear hacia abajo"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "redondear hacia arriba"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Redondear un número hacia arriba o hacia abajo."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://es.wikipedia.org/wiki/Ra%C3%ADz_cuadrada"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absoluto"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "raíz cuadrada"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Devuelve el valor absoluto de un número."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Devuelve e a la potencia de un número."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Devuelve el logaritmo natural de un número."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Devuelve el logaritmo base 10 de un número."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Devuelve la negación de un número."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Devuelve 10 a la potencia de un número."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Devuelve la raíz cuadrada de un número."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://es.wikipedia.org/wiki/Función_trigonométrica"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Devuelve el arcocoseno de un número."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Devuelve el arcoseno de un número."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Devuelve el arcotangente de un número."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Devuelve el coseno de un grado (no radián)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Devuelve el seno de un grado (no radián)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Devuelve la tangente de un grado (no radián)."; +Blockly.Msg.NEW_VARIABLE = "Crear variable…"; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nombre de variable nueva:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "permitir declaraciones"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "con:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://es.wikipedia.org/wiki/Subrutina"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Ejecuta la función definida por el usuario '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://es.wikipedia.org/wiki/Subrutina"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Ejecuta la función definida por el usuario '%1' y usa su salida."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "con:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Crear '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe esta función..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "hacer algo"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "para"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crea una función sin salida."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "devuelve"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crea una función con una salida."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Advertencia: Esta función tiene parámetros duplicados."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Destacar definición de la función"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Si un valor es verdadero, entonces devuelve un segundo valor."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Advertencia: Este bloque solo puede ser utilizado dentro de la definición de una función."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nombre de entrada:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Añadir una entrada a la función."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entradas"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Añadir, eliminar o reordenar entradas para esta función."; +Blockly.Msg.REDO = "Rehacer"; +Blockly.Msg.REMOVE_COMMENT = "Eliminar comentario"; +Blockly.Msg.RENAME_VARIABLE = "Renombrar la variable…"; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Renombrar todas las variables «%1» a:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "añadir texto"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "a"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Añadir texto a la variable '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "a minúsculas"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "a Mayúsculas Cada Palabra"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "a MAYÚSCULAS"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Devuelve una copia del texto en un caso diferente."; +Blockly.Msg.TEXT_CHARAT_FIRST = "obtener la primera letra"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "obtener la letra # del final"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "obtener la letra #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "en el texto"; +Blockly.Msg.TEXT_CHARAT_LAST = "obtener la última letra"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "obtener letra aleatoria"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Devuelve la letra en la posición especificada."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Agregar un elemento al texto."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "unir"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Agregar, eliminar o reordenar las secciones para reconfigurar este bloque de texto."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "hasta la letra # del final"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "hasta la letra #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "hasta la última letra"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "en el texto"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "obtener subcadena desde la primera letra"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "obtener subcadena desde la letra # del final"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "obtener subcadena desde la letra #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Devuelve una porción determinada del texto."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "en el texto"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "encontrar la primera aparición del texto"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "encontrar la última aparición del texto"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Devuelve el índice de la primera/última aparición del primer texto en el segundo texto. Devuelve %1 si el texto no se encuentra."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 está vacío"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Devuelve verdadero si el texto proporcionado está vacío."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "crear texto con"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Crear un fragmento de texto al unir cualquier número de elementos."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "longitud de %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Devuelve el número de letras (incluyendo espacios) en el texto proporcionado."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "imprimir %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Imprimir el texto, número u otro valor especificado."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Solicitar al usuario un número."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Solicitar al usuario un texto."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "solicitar número con el mensaje"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "solicitar texto con el mensaje"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "reemplaza %1 con %2 en %3"; +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "revertir %1"; +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Invierte el orden de los caracteres en el texto."; +Blockly.Msg.TEXT_TEXT_HELPURL = "https://es.wikipedia.org/wiki/Cadena_de_caracteres"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Una letra, palabra o línea de texto."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "quitar espacios de ambos lados de"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "quitar espacios iniciales de"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "quitar espacios finales de"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Devuelve una copia del texto sin los espacios de uno o ambos extremos."; +Blockly.Msg.TODAY = "Hoy"; +Blockly.Msg.UNDO = "Deshacer"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "elemento"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crear 'establecer %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Devuelve el valor de esta variable."; +Blockly.Msg.VARIABLES_SET = "establecer %1 a %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Crear 'obtener %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Establece esta variable para que sea igual a la entrada."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Ya existe una variable llamada \"%1\"."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/et.js b/src/opsoro/server/static/js/blockly/msg/js/et.js new file mode 100644 index 0000000..e5c03b5 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/et.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.et'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Lisa kommentaar"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Muuda väärtust:"; +Blockly.Msg.CLEAN_UP = "Korista plokid kokku"; +Blockly.Msg.COLLAPSE_ALL = "Tõmba plokid kokku"; +Blockly.Msg.COLLAPSE_BLOCK = "Tõmba plokk kokku"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "1. värvist"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "2. värvist"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "suhtega"; +Blockly.Msg.COLOUR_BLEND_TITLE = "segu"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Segab kaks värvi määratud suhtega (0.0 - 1.0) kokku."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Valitud värv paletist."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "juhuslik värv"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Juhuslikult valitud värv."; +Blockly.Msg.COLOUR_RGB_BLUE = "sinisest"; +Blockly.Msg.COLOUR_RGB_GREEN = "rohelisest"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "punasest"; +Blockly.Msg.COLOUR_RGB_TITLE = "segu"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Tekitab värvi määratud hulgast punasest, rohelisest ja sinisest. Kõik väärtused peavad olema 0 ja 100 vahel."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "välju kordusest"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "katkesta see kordus ja liigu järgmisele"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Väljub kordusest ja liigub edasi korduse järel oleva koodi käivitamisele."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Katkestab korduses oleva koodi käivitamise ja käivitab järgmise korduse."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Hoiatus: Seda plokki saab kasutada ainult korduse sees."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "iga elemendiga %1 loendis %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Iga elemendiga loendis anna muutujale '%1' elemendi väärtus ja kõivita plokis olevad käsud."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "loendus muutujaga %1 alates %2 kuni %3, %4 kaupa"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Annab muutujale '%1' väärtused ühest numbrist teiseni, muutes seda intervalli kaupa ja käivitab igal muudatusel ploki sees oleva koodi."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Lisab „kui“ plokile tingimuse."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Lisab „kui“ plokile lõpliku tingimuseta koodiploki."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Selle „kui“ ploki muutmine sektsioonide lisamise, eemaldamise ja järjestamisega."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "vastasel juhul"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "vastasel juhul, kui"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "kui"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Kui avaldis on tõene, käivita ploki sees olevad käsud."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Kui avaldis on tõene, käivita käsud esimesest plokist. Vastasel juhul käivita käsud teisest plokist."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Kui esimene avaldis on tõene, käivita käsud esimesest plokist. Vastasel juhul, kui teine avaldis on tõene, käivita käsud teisest plokist."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Kui esimene avaldis on tõene, käivita käsud esimesest plokist. Vastasel juhul, kui teine avaldis on tõene, käivita käsud teisest plokist. Kui ükski avaldistest pole tõene, käivita käsud viimasest plokist."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "käivita"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1 korda"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Plokis olevate käskude käivitamine määratud arv kordi."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "seni kuni pole"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "seni kuni on"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Plokis olevaid käske korratakse seni kui avaldis pole tõene."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Plokis olevaid käske korratakse seni kui avaldis on tõene."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Kas kustutada kõik %1 plokki?"; +Blockly.Msg.DELETE_BLOCK = "Kustuta plokk"; +Blockly.Msg.DELETE_VARIABLE = "Kustuta muutuja '%1'"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Kas kustutada %1 kohas kasutatav muutuja '%2'?"; +Blockly.Msg.DELETE_X_BLOCKS = "Kustuta %1 plokki"; +Blockly.Msg.DISABLE_BLOCK = "Keela ploki kasutamine"; +Blockly.Msg.DUPLICATE_BLOCK = "Tekita duplikaat"; +Blockly.Msg.ENABLE_BLOCK = "Luba ploki kasutamine"; +Blockly.Msg.EXPAND_ALL = "Laota plokid laiali"; +Blockly.Msg.EXPAND_BLOCK = "Laota plokk laiali"; +Blockly.Msg.EXTERNAL_INPUTS = "Sisendid ploki taga"; +Blockly.Msg.HELP = "Abi"; +Blockly.Msg.INLINE_INPUTS = "Sisendid ploki sees"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "tühi loend"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Tagastab loendi, mille pikkus on 0 ja milles pole ühtegi elementi."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "loend"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Loendiploki elementide lisamine, eemaldamine või järjestuse muutmine."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "uus loend"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Elemendi lisamine loendisse."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Tekitab mistahes arvust elementidest loendi."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "esimene element"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "element # (lõpust)"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "element #"; +Blockly.Msg.LISTS_GET_INDEX_GET = "võetud"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "võetud ja eemaldatud"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "viimane element"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "juhuslik element"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "eemalda"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Tagastab loendi esimese elemendi."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Tagastab loendis määratud asukohal oleva elemendi."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Tagastab loendi viimase elemendi."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Tagastab loendi juhusliku elemendi."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Tagastab ja eemaldab loendist esimese elemendi."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Tagastab ja eemaldab loendist määratud asukohal oleva elemendi."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Tagastab ja eemaldab loendist viimase elemendi."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Tagastab ja eemaldab loendist juhusliku elemendi."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Eemaldab loendist esimese elemendi."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Eemaldab loendist määratud asukohal oleva elemendi."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Eemaldab loendist viimase elemendi."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Eemaldab loendist juhusliku elemendi."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "elemendini # (lõpust)"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "elemendini #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "lõpuni"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "alamloend algusest"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "alamloend elemendist # (lõpust)"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "alamloend elemendist #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Tekitab loendi määratud osast koopia."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "Viimane element on %1."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "Esimene element on %1."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "esimene leitud"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "viimase leitud"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Tagastab esimese/viimase loendist leitud objekti asukoha (objekti järjekorranumbri loendis). Kui objekti ei leita, tagastab %1."; +Blockly.Msg.LISTS_INLIST = "loendis"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 on tühi"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Tagastab „tõene“ kui loend on tühi."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "%1 pikkus"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Tagastab loendi pikkuse."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "loend pikkusega %2 elemendist %1"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Tekitab uue loendi, millesse lisatakse ühte elementi pikkusega määratud arv kordi."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = ", väärtus"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "lisa asukohale"; +Blockly.Msg.LISTS_SET_INDEX_SET = "asenda"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Lisab loendi algusesse uue elemendi."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Lisab määratud asukohale loendis uue elemendi."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Lisab loendi lõppu uue elemendi."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Lisab juhuslikule kohale loendis uue elemendi."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Asendab loendis esimese elemendi."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Asendab loendis määratud kohal oleva elemendi."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Asendab loendis viimase elemendi."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Asendab loendis juhusliku elemendi."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "kasvavalt"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "kahanevalt"; +Blockly.Msg.LISTS_SORT_TITLE = "%1 %2 sorteeritud %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Loendi koopia sorteerimine."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "tähestiku järgi (tähesuurust eirates)"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "arvväärtuste järgi"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "tähestiku järgi"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "loend, tekitatud tekstist"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "tekst, tekitatud loendist"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Ühendab tekstide loendis olevad tükid üheks tekstiks, asetades tükkide vahele eraldaja."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Tükeldab teksti eraldajade kohalt ja asetab tükid tekstide loendisse."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "eraldajaga"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "väär"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Tagastab tõeväärtuse – kas „tõene“ või „väär“."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "tõene"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Tagastab „tõene“, kui avaldiste väärtused on võrdsed."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Tagastab „tõene“, kui esimese avaldise väärtus on suurem kui teise väärtus."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Tagastab „tõene“, kui esimese avaldise väärtus on suurem või võrdne teise väärtusega."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Tagastab „tõene“, kui esimese avaldise väärtus on väiksem kui teise väärtus."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Tagastab „tõene“, kui esimese avaldise väärtus on väiksem või võrdne teise väärtusega."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Tagastab „tõene“, kui avaldiste väärtused pole võrdsed."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "pole %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Tagastab „tõene“, kui avaldis on väär. Tagastab „väär“, kui avaldis on tõene."; +Blockly.Msg.LOGIC_NULL = "null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Tagastab nulli."; +Blockly.Msg.LOGIC_OPERATION_AND = "ja"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "või"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Tagastab „tõene“, kui mõlemad avaldised on tõesed."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Tagastab „tõene“, kui vähemalt üks avaldistest on tõene."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "tingimus"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "kui väär"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "kui tõene"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Kui tingimuse väärtus on tõene, tagastab „kui tõene“ väärtuse, vastasel juhul „kui väär“ väärtuse."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://et.wikipedia.org/wiki/Aritmeetika"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Tagastab kahe arvu summa."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Tagastab kahe arvu jagatise."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Tagastab kahe arvu vahe."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Tagastab kahe arvu korrutise."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Tagastab esimese arvu teise arvu astmes."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "muuda %1 %2 võrra"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Lisab arvu muutujale '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Tagastab ühe konstantidest: π (3,141…), e (2,718…), φ (1.618…), √2) (1,414…), √½ (0,707…), või ∞ (infinity)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "%1 piirang %2 ja %3 vahele"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Piirab arvu väärtuse toodud piiridesse (piirarvud kaasa arvatud)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "jagub arvuga"; +Blockly.Msg.MATH_IS_EVEN = "on paarisarv"; +Blockly.Msg.MATH_IS_NEGATIVE = "on negatiivne arv"; +Blockly.Msg.MATH_IS_ODD = "on paaritu arv"; +Blockly.Msg.MATH_IS_POSITIVE = "on positiivne arv"; +Blockly.Msg.MATH_IS_PRIME = "on algarv"; +Blockly.Msg.MATH_IS_TOOLTIP = "Kontrollib kas arv on paarisarv, paaritu arv, algarv, täisarv, positiivne, negatiivne või jagub kindla arvuga. Tagastab „tõene“ või „väär“."; +Blockly.Msg.MATH_IS_WHOLE = "on täisarv"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "%1 ÷ %2 jääk"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Tagastab esimese numbri teisega jagamisel tekkiva jäägi."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://et.wikipedia.org/wiki/Arv"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Arv."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "loendi keskmine"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "loendi maksimum"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "loendi mediaan"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "loendi miinimum"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "loendi moodid"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "juhuslik element loendist"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "loendi standardhälve"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "loendi summa"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Tagastab loendis olevate arvväärtuste aritmeetilise keskmise."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Tagastab suurima loendis oleva arvu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Return the median number in the list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Tagastab väikseima loendis oleva arvu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Tagastab loendi kõige sagedamini esinevate loendi liikmetega."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Tagastab juhusliku elemendi loendist."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Tagastab loendi standardhälbe."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Tagastab kõigi loendis olevate arvude summa."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "juhuslik murdosa"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Tagastab juhusliku murdosa 0.0 (kaasa arvatud) and 1.0 (välja arvatud) vahel."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "juhuslik täisarv %1 ja %2 vahel"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Tagastab juhusliku täisarvu toodud piiride vahel (piirarvud kaasa arvatud)."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "ümarda"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "ümarda alla"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "ümarda üles"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Ümardab arvu üles või alla."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://et.wikipedia.org/wiki/Ruutjuur"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absoluutväärtus"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "ruutjuur"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Tagastab arvu absoluutväärtuse."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Tagasta e arvu astmes."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Tagastab arvu naturaallogaritmi."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Tagastab arvu kümnendlogaritm."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Tagastab arvu vastandväärtuse."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Tagastab 10 arvu astmes."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Tagastab arvu ruutjuure."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://et.wikipedia.org/wiki/Trigonomeetrilised_funktsioonid"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Tagastab arvu arkuskoosiinuse."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Tagastab arvu arkussiinuse."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Tagastab arvu arkustangensi."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Tagastab arvu (kraadid) kosiinuse."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Tagastab arvu (kraadid) siinuse."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Tagastab arvu (kraadid) tangensi."; +Blockly.Msg.NEW_VARIABLE = "Uus muutuja ..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Uue muutuja nimi:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "kood plokis"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "sisenditega:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Käivitab kasutaja defineeritud funktsiooni '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "sisenditega:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Tekita '%1' plokk"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Funktsiooni kirjeldus ..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "teeme midagi"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "funktsioon"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Tekitab funktsiooni, mis ei tagasta midagi."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "tagasta"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Tekitab funktsiooni, mis tagastab midagi."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Hoiatus: Sel funktsioonil on mitu sama nimega sisendit."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Tõsta funktsiooni definitsioon esile"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Kui väärtus on tõene, tagastatakse teine väärtus."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Hoiatus: Seda plokki saab kasutada ainult funktsiooni definitsioonis."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "sisend nimega:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Lisab funktsioonile sisendi."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "sisendid"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Funktsiooni sisendite lisamine, eemaldamine või järjestuse muutmine."; +Blockly.Msg.REDO = "Tee uuesti"; +Blockly.Msg.REMOVE_COMMENT = "Eemalda kommentaar"; +Blockly.Msg.RENAME_VARIABLE = "Nimeta muutuja ümber ..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Muutuja „%1“ uus nimi:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "lõppu tekst"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "lisa muutuja"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Lisab teksti muutuja „%1“ väärtuse lõppu."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "väikeste tähtedega"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "Suurte Esitähtedega"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "SUURTE TÄHTEDEGA"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Tagastab muudetud tähesuurusega teksti koopia."; +Blockly.Msg.TEXT_CHARAT_FIRST = "esimene sümbol"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "lõpust sümbol #"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "sümbol #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "tekstist"; +Blockly.Msg.TEXT_CHARAT_LAST = "viimane sümbol"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "juhuslik sümbol"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Tagastab tekstis määratud asukohal oleva sümboli."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Objekti lisamine tekstile."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "ühenda"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Tekstiploki muutmine sektsioonide lisamise, eemaldamise või järjestuse muutmisega."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "kuni (lõpust) sümbolini #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "kuni sümbolini #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "kuni viimase sümbolini"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "tekstist"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "alates esimesest sümbolist"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "alates (lõpust) sümbolist #"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "alates sümbolist #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Tagastab määratud tüki tekstist."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "tekstist"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "esimese leitud tekstitüki"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "viimase leitud tekstitüki"; +Blockly.Msg.TEXT_INDEXOF_TAIL = "asukoht"; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Tagastab esimesest tekstist esimese/viimase leitud teise teksti asukoha (indeksi). Kui teksti ei leita, tagastab %1."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 on tühi"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Tagastab „tõene“, kui tekstis pole ühtegi sümbolit."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "tekita tekst"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Tekitab teksti ühendades mistahes arvu elemente."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "%1 pikkus"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Tagastab sümbolite aru (ka tühikud) toodud tekstis."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "trüki %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Trükib määratud teksti, numbri või mõne muu objekti väärtuse."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Küsib kasutajalt teadet näidates mingit arvu."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Küsib kasutajalt teadet näidates mingit teksti."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "kasutajalt küsitud arv teatega"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "kasutajalt küsitud tekst teatega"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Täht, sõna või rida teksti."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "mõlemalt poolt eemaldatud tühikutega"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "algusest eemaldatud tühikutega"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "lõpust eemaldatud tühikutega"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Tagastab koopia tekstist, millel on tühikud ühelt või mõlemalt poolt eemaldatud."; +Blockly.Msg.TODAY = "Täna"; +Blockly.Msg.UNDO = "Võta tagasi"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "objekt"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Tekita 'määra „%1“ väärtuseks' plokk"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Tagastab selle muutuja väärtuse."; +Blockly.Msg.VARIABLES_SET = "määra %1 väärtuseks %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Tekita '„%1“ väärtus' plokk"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Määrab selle muutuja väärtuse võrdseks sisendi väärtusega."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "'%1'-nimeline muutuja on juba olemas."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/fa.js b/src/opsoro/server/static/js/blockly/msg/js/fa.js new file mode 100644 index 0000000..301bba8 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/fa.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.fa'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "افزودن نظر"; +Blockly.Msg.CHANGE_VALUE_TITLE = "تغییر مقدار:"; +Blockly.Msg.CLEAN_UP = "تمیز کردن بلوک‌ها"; +Blockly.Msg.COLLAPSE_ALL = "فروپاشی بلوک‌ها"; +Blockly.Msg.COLLAPSE_BLOCK = "فروپاشی بلوک"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "رنگ ۱"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "رنگ ۲"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "نسبت"; +Blockly.Msg.COLOUR_BLEND_TITLE = "مخلوط"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "دو رنگ را با نسبت مشخص‌شده مخلوط می‌کند (۰٫۰ - ۱٫۰)"; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B1%D9%86%DA%AF"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "انتخاب یک رنگ از تخته‌رنگ."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "رنگ تصادفی"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "انتخاب یک رنگ به شکل تصادفی."; +Blockly.Msg.COLOUR_RGB_BLUE = "آبی"; +Blockly.Msg.COLOUR_RGB_GREEN = "سبز"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "قرمز"; +Blockly.Msg.COLOUR_RGB_TITLE = "رنگ با"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "ساخت یک رنگ با مقدار مشخص‌شده‌ای از قرمز، سبز و آبی. همهٔ مقادیر باید بین ۰ تا ۱۰۰ باشند."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "شکستن حلقه"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "ادامه با تکرار بعدی حلقه"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "شکستن حلقهٔ شامل."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "پریدن از بقیهٔ حلقه و ادامه با تکرار بعدی."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "اخطار: این بلوک ممکن است فقط داخل یک حلقه استفاده شود."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "برای هر مورد %1 در فهرست %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "برای هر مورد در این فهرست، تنظیم متغیر «%1» به مورد و انجام تعدادی عبارت."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "با تعداد %1 از %2 به %3 با گام‌های %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "متغیر %1 را در مقادیر شروع‌شده از عدد انتهای به عدد انتهایی را دارد، با فواصل مشخص‌شده می‌شمارد و این بلوک مشخص‌شده را انجام می‌دهد."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "افزودن یک شرط به بلوک اگر."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "اضافه کردن نهایی، گرفتن همهٔ شرایط به بلوک اگر."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "افزودن، حذف یا بازمرتب‌سازی قسمت‌ها برای پیکربندی دوبارهٔ این بلوک اگر."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "آنگاه"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "اگر آنگاه"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "اگر"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "اگر یک مقدار صحیح است، سپس چند عبارت را انجام بده."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "اگر یک مقدار صحیح است، اول بلوک اول عبارات را انجام بده. در غیر این صورت بلوک دوم عبارات انجام بده."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "اگر مقدار اول صحیح بود، از آن بلوک اول عبارات را انجام بده. در غیر این صورت، اگر مقدار دوم صحیح است، بلوک دوم عبارات را انجام بده."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "اگر مقدار اول درست است، بلوک اول عبارات را انجام بده. در غیر این صورت، اگر مقدار دوم درست باشد بلوک دوم عبارات را انجام بده. اگر هیچ از مقادیر درست نبود، آخرین بلوک عبارات را انجام بده."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://fa.wikipedia.org/wiki/%D8%AD%D9%84%D9%82%D9%87_%D9%81%D9%88%D8%B1"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "انحام"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1 بار تکرار"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "انجام چند عبارت چندین بار."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "تکرار تا زمانی که"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "تکرار در حالی که"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "تا زمانی که یک مقدار ناصحیح است، چند عبارت را انجام بده."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "تا زمانی که یک مقدار صحیح است، چند عبارت را انجام بده."; +Blockly.Msg.DELETE_ALL_BLOCKS = "حذف همهٔ بلاک‌های %1؟"; +Blockly.Msg.DELETE_BLOCK = "حذف بلوک"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "حذف بلوک‌های %1"; +Blockly.Msg.DISABLE_BLOCK = "غیرفعال‌سازی بلوک"; +Blockly.Msg.DUPLICATE_BLOCK = "تکراری"; +Blockly.Msg.ENABLE_BLOCK = "فعال‌سازی بلوک"; +Blockly.Msg.EXPAND_ALL = "گسترش بلوک‌ها"; +Blockly.Msg.EXPAND_BLOCK = "گسترش بلوک"; +Blockly.Msg.EXTERNAL_INPUTS = "ورودی‌های خارجی"; +Blockly.Msg.HELP = "راهنما"; +Blockly.Msg.INLINE_INPUTS = "ورودی‌های درون خطی"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "ایجاد فهرست خالی"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "فهرستی با طول صفر شامل هیچ رکورد داده‌ای بر می‌گرداند."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "فهرست"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "اضافه کردن، حذف کردن یا ترتیب‌سازی مجدد بخش‌ها این بلوک فهرستی."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "ایجاد فهرست با"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "اضافه کردن یک مورد به فهرست."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "فهرستی از هر عددی از موارد می‌سازد."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "اولین"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# از انتها"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "گرفتن"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "گرفتن و حذف‌کردن"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "آخرین"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "تصادفی"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "حذف‌کردن"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "اولین مورد یک فهرست را بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "موردی در محل مشخص‌شده بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "آخرین مورد در یک فهرست را بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "یک مورد تصادفی در یک فهرست بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "اولین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "آخرین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "مورد تصادفی‌ای را در فهرست حذف و بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "اولین مورد را در یک فهرست حذف می‌کند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "آخرین مورد را در یک فهرست حذف می‌کند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "یک مورد تصادفی را یک فهرست حذف می‌کند."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "به # از انتها"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "به #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "به آخرین"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "گرفتن زیرمجموعه‌ای از ابتدا"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "گرفتن زیرمجموعه‌ای از # از انتها"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "گرفتن زیرمجموعه‌ای از #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "کپی از قسمت مشخص‌شدهٔ لیست درست می‌کند."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 آخرین مورد است."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 اولین مورد است."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "یافتن اولین رخ‌داد مورد"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "یافتن آخرین رخ‌داد مورد"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. %1 بر می‌گرداند اگر آیتم موجود نبود."; +Blockly.Msg.LISTS_INLIST = "در فهرست"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 خالی است"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "اگر فهرست خالی است مقدار صجیج بر می‌گرداند."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "طول %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "طول یک فهرست را برمی‌گرداند."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "فهرستی با %1 تکرارشده به اندازهٔ %2 می‌سازد"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "فهرستی شامل مقادیر داده‌شدهٔ تکرار شده عدد مشخص‌شده می‌سازد."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "به عنوان"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "درج در"; +Blockly.Msg.LISTS_SET_INDEX_SET = "مجموعه"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "موردی به ته فهرست اضافه می‌کند."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "موردی به ته فهرست الحاق می‌کند."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "مورد را به صورت تصادفی در یک فهرست می‌افزاید."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "اولین مورد در یک فهرست را تعیین می‌کند."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "مورد مشخص‌شده در یک فهرست را قرار می‌دهد."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "آخرین مورد در یک فهرست را تعیین می‌کند."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "یک مورد تصادفی در یک فهرست را تعیین می‌کند."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "صعودی"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "نزولی"; +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "حروفی ، رد کردن مورد"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "عددی"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "حروفی ، الفبایی"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "ایجاد فهرست از متن"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "ایجاد متن از فهرست"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "همراه جداساز"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "ناصحیح"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "بازگرداندن یکی از صحیح یا ناصحیح."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "صحیح"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://fa.wikipedia.org/wiki/%D9%86%D8%A7%D8%A8%D8%B1%D8%A7%D8%A8%D8%B1%DB%8C"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "بازگشت صحیح اگر هر دو ورودی با یکدیگر برابر باشد."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "بازگرداندن صحیح اگر ورودی اول بزرگتر از ورودی دوم باشد."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "بازگرداندن صحیح اگر ورودی اول بزرگتر یا مساوی یا ورودی دوم باشد."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "بازگرداندن صحیح اگر ورودی اول کوچکتر از ورودی دوم باشد."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "بازگرداندن صحیح اگر ورودی اول کوچکتر یا مساوی با ورودی دوم باشد."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "برگرداندن صحیح اگر هر دو ورودی با یکدیگر برابر نباشند."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "نه %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "صجیج باز می‌گرداند اگر ورودی نا صحیح باشند. ناصحیح بازمی‌گرداند اگر ورودی صحیح باشد."; +Blockly.Msg.LOGIC_NULL = "تهی"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "تهی بازمی‌گرداند."; +Blockly.Msg.LOGIC_OPERATION_AND = "و"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "یا"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "بازگرداندن صحیح اگر هر دو ورودی صحیح باشد."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "بازگرداندن صحیح اگر یکی از دو ورودی صحیح باشد."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "آزمایش"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "اگر ناصحیح"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "اگر صحیح"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "بررسی وضعیت در «آزمایش». اگر وضعیت صحیح باشد، مقدار «اگر صحیح» را بر می‌گرداند در غیر اینصورت مقدار «اگر ناصحیح» را."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://fa.wikipedia.org/wiki/%D8%AD%D8%B3%D8%A7%D8%A8"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "بازگرداندن مقدار جمع دو عدد."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "بازگرداندن باقی‌ماندهٔ دو عدد."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "بازگرداندن تفاوت دو عدد."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "بازگرداندن حاصلضرب دو عدد."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "بازگرداندن اولین عددی که از توان عدد دوم حاصل شده باشد."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://fa.wikipedia.org/wiki/%D8%A7%D8%B5%D8%B7%D9%84%D8%A7%D8%AD_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%E2%80%8C%D9%86%D9%88%DB%8C%D8%B3%DB%8C#.D8.A7.D9.81.D8.B2.D8.A7.DB.8C.D8.B4_.D8.B4.D9.85.D8.A7.D8.B1.D9.86.D8.AF.D9.87"; +Blockly.Msg.MATH_CHANGE_TITLE = "تغییر %1 با %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "افزودن یک عدد به متغیر '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://fa.wikipedia.org/wiki/%D8%AB%D8%A7%D8%A8%D8%AA_%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "یکی از مقادیر مشترک را برمی‌گرداند: π (۳٫۱۴۱…)، e (۲٫۷۱۸...)، φ (۱٫۶۱۸)، sqrt(۲) (۱٫۴۱۴)، sqrt(۱/۲) (۰٫۷۰۷...) و یا ∞ (بی‌نهایت)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "محدودکردن %1 پایین %2 بالا %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "محدودکردن یک عدد بین محدودیت‌های مشخص‌شده (بسته)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "تقسیم شده بر"; +Blockly.Msg.MATH_IS_EVEN = "زوج است"; +Blockly.Msg.MATH_IS_NEGATIVE = "منفی است"; +Blockly.Msg.MATH_IS_ODD = "فرد است"; +Blockly.Msg.MATH_IS_POSITIVE = "مثبت است"; +Blockly.Msg.MATH_IS_PRIME = "عدد اول است"; +Blockly.Msg.MATH_IS_TOOLTIP = "بررسی می‌کند که آیا یک عدد زوج، فرد، اول، کامل، مثبت، منفی یا بخش‌پذیر عدد خاصی باشد را بررسی می‌کند. درست یا نادرست باز می‌گرداند."; +Blockly.Msg.MATH_IS_WHOLE = "کامل است"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B9%D9%85%D9%84%DB%8C%D8%A7%D8%AA_%D9%BE%DB%8C%D9%85%D8%A7%D9%86%D9%87"; +Blockly.Msg.MATH_MODULO_TITLE = "باقی‌ماندهٔ %1 + %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "باقی‌ماندهٔ تقسیم دو عدد را بر می‌گرداند."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B9%D8%AF%D8%AF"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "یک عدد."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "میانگین فهرست"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "بزرگ‌ترین فهرست"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "میانهٔ فهرست"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "کوچکترین فهرست"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "مد فهرست"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "مورد تصادفی از فهرست"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "انحراف معیار فهرست"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "جمع فهرست"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "میانگین (میانگین ریاضی) مقادیر عددی فهرست را بر می‌گرداند."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "بزرگ‌ترین عدد در فهرست را باز می‌گرداند."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "میانهٔ عدد در فهرست را بر می‌گرداند."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "کوچک‌ترین عدد در فهرست را باز می‌گرداند."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "شایع‌ترین قلم(های) در فهرست را بر می‌گرداند."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "موردی تصادفی از فهرست را بر می‌گرداند."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "انحراف معیار فهرست را بر می‌گرداند."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "جمع همهٔ عددهای فهرست را باز می‌گرداند."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://fa.wikipedia.org/wiki/%D8%AA%D9%88%D9%84%DB%8C%D8%AF_%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF_%D8%AA%D8%B5%D8%A7%D8%AF%D9%81%DB%8C"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "کسر تصادفی"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "بازگرداندن کسری تصادفی بین ۰٫۰ (بسته) تا ۱٫۰ (باز)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://fa.wikipedia.org/wiki/%D8%AA%D9%88%D9%84%DB%8C%D8%AF_%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF_%D8%AA%D8%B5%D8%A7%D8%AF%D9%81%DB%8C"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "عدد صحیح تصادفی بین %1 تا %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "یک عدد تصادفی بین دو مقدار مشخص‌شده به صورت بسته باز می‌گرداند."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "گردکردن"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "گرد به پایین"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "گرد به بالا"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "گردکردن یک عدد به بالا یا پایین."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B1%DB%8C%D8%B4%D9%87_%D8%AF%D9%88%D9%85"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "مطلق"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "ریشهٔ دوم"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "قدر مطلق یک عدد را بازمی‌گرداند."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "بازگرداندن توان e یک عدد."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "لوگاریتم طبیعی یک عدد را باز می‌گرداند."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "بازگرداندن لگاریتم بر پایهٔ ۱۰ یک عدد."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "منفی‌شدهٔ یک عدد را باز می‌گرداند."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "بازگرداندن توان ۱۰ یک عدد."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "ریشهٔ دوم یک عدد را باز می‌گرداند."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://fa.wikipedia.org/wiki/%D8%AA%D8%A7%D8%A8%D8%B9%E2%80%8C%D9%87%D8%A7%DB%8C_%D9%85%D8%AB%D9%84%D8%AB%D8%A7%D8%AA%DB%8C"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "بازگرداندن آرک‌کسینوس درجه (نه رادیان)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "بازگرداندن آرک‌سینوس درجه (نه رادیان)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "بازگرداندن آرک‌تانژانت درجه (نه رادیان)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "بازگرداندن کسینوس درجه (نه رادیان)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "بازگرداندن سینوس درجه (نه رادیان)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "بازگرداندن تانژانت یک درجه (نه رادیان)."; +Blockly.Msg.NEW_VARIABLE = "متغیر تازه..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "نام متغیر تازه:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "اجازه اظهارات"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "با:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "اجرای تابع تعریف‌شده توسط کاربر «%1»."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "اجرای تابع تعریف‌شده توسط کاربر «%1» و استفاده از خروجی آن."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "با:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "ساختن «%1»"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "توصیف این عملکرد..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "انجام چیزی"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "به"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "تابعی می‌سازد بدون هیچ خروجی."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "بازگشت"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "تابعی با یک خروجی می‌سازد."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "اخطار: این تابعی پارامتر تکراری دارد."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "برجسته‌سازی تعریف تابع"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "اگر یک مقدار صحیح است، مقدار دوم را برگردان."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "اخطار: این بلوک احتمالاً فقط داخل یک تابع استفاده می‌شود."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "نام ورودی:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "اضافه کردن ورودی به تابع."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "ورودی‌ها"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "افزودن، حذف یا دوباره مرتب‌کردن ورودی این تابع."; +Blockly.Msg.REDO = "واگردانی"; +Blockly.Msg.REMOVE_COMMENT = "حذف نظر"; +Blockly.Msg.RENAME_VARIABLE = "تغییر نام متغیر..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "تغییر نام همهٔ متغیرهای «%1» به:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "الحاق متن"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "به"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "الحاق متنی به متغیر «%1»."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "به حروف کوچک"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "به حروف بزرگ عنوان"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "به حروف بزرگ"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "بازگرداندن کپی متن در حالتی متفاوت."; +Blockly.Msg.TEXT_CHARAT_FIRST = "گرفتن اولین حرف"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "گرفتن حرف # از آخر"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "گرفتن حرف #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "در متن"; +Blockly.Msg.TEXT_CHARAT_LAST = "گرفتن آخرین حرف"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "گرفتن حرف تصادفی"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "حرفی در موقعیت مشخص‌شده بر می‌گرداند."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "افزودن یک مورد به متن."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "عضویت"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "اضافه کردن، حذف یا مرتب‌سازی بحش‌ها برای تنظیم مجدد این بلوک متنی."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "به حرف # از انتها"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "به حرف #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "به آخرین حرف"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "در متن"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "گرفتن زیرمتن از اولین حرف"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "گرفتن زیرمتن از حرف # به انتها"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "گرفتن زیرمتن از حرف #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "قسمت مشخصی‌شده‌ای از متن را بر می‌گرداند."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "در متن"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "اولین رخداد متن را بیاب"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "آخرین رخداد متن را بیاب"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد %1 باز می‌گرداند."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 خالی است"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "اضافه کردن صحیح اگر متن فراهم‌شده خالی است."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "ایجاد متن با"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "یک تکه‌ای از متن را با چسپاندن همهٔ تعداد از موارد ایجاد می‌کند."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "طول %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "بازگرداندن عددی از حروف (شامل فاصله‌ها) در متن فراهم‌شده."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "چاپ %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "چاپ متن، عدد یا هر مقدار دیگر مشخص‌شده."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "اعلان برای کاربر با یک عدد."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "اعلان برای کاربر برای یک متن."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "اعلان برای عدد با پیام"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "اعلان برای متن با پیام"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://fa.wikipedia.org/wiki/%D8%B1%D8%B4%D8%AA%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "یک حرف، کلمه یا خطی از متن."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "تراشیدن فاصله‌ها از هر دو طرف"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "تراشیدن فاصله‌ها از طرف چپ"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "تراشیدن فاصله‌ها از طرف چپ"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "کپی از متن با فاصله‌های حذف‌شده از یک یا هر دو پایان باز می‌گرداند."; +Blockly.Msg.TODAY = "امروز"; +Blockly.Msg.UNDO = "واگردانی"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "مورد"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "درست‌کردن «تنظیم %1»"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "مقدار این متغیر را بر می‌گرداند."; +Blockly.Msg.VARIABLES_SET = "مجموعه %1 به %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "درست‌کردن «گرفتن %1»"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "متغیر برابر با خروجی را مشخص می‌کند."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/fi.js b/src/opsoro/server/static/js/blockly/msg/js/fi.js similarity index 87% rename from src/opsoro/apps/visual_programming/static/blockly/msg/js/fi.js rename to src/opsoro/server/static/js/blockly/msg/js/fi.js index 7dfe326..3d81581 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/fi.js +++ b/src/opsoro/server/static/js/blockly/msg/js/fi.js @@ -7,10 +7,8 @@ goog.provide('Blockly.Msg.fi'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "Lisää kommentti"; -Blockly.Msg.AUTH = "Valtuuta tämä ohjelma jotta voit tallettaa työsi ja jakaa sen."; Blockly.Msg.CHANGE_VALUE_TITLE = "Muuta arvoa:"; -Blockly.Msg.CHAT = "Keskustele yhteistyökumppanisi kanssa tässä laatikossa!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "Siivoa lohkot"; Blockly.Msg.COLLAPSE_ALL = "Sulje lohkot"; Blockly.Msg.COLLAPSE_BLOCK = "Sulje lohko"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "väri 1"; @@ -62,7 +60,10 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "toista kunnes"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "toista niin kauan kuin"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Niin kauan kuin arvo on epätosi, suorita joukko lausekkeita."; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Niin kauan kuin arvo on tosi, suorita joukko lausekkeita."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Poistetaanko kaikki %1 lohkoa?"; Blockly.Msg.DELETE_BLOCK = "Poista lohko"; +Blockly.Msg.DELETE_VARIABLE = "Poista muuttuja '%1'"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Poistetaanko %1 käyttöä muuttujalta '%2'?"; Blockly.Msg.DELETE_X_BLOCKS = "Poista %1 lohkoa"; Blockly.Msg.DISABLE_BLOCK = "Passivoi lohko"; Blockly.Msg.DUPLICATE_BLOCK = "Kopioi"; @@ -91,18 +92,15 @@ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "satunnainen"; Blockly.Msg.LISTS_GET_INDEX_REMOVE = "poista"; Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Palauta ensimmäinen kohde listalta."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Palauta kohde annetusta kohdasta listaa. Numero 1 tarkoittaa listan viimeistä kohdetta."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Palauta kohde annetusta kohdasta listaa. Numero 1 tarkoittaa listan ensimmäistä kohdetta."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Palauta kohde annetusta kohdasta listaa."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Palauttaa listan viimeisen kohteen."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Palauttaa satunnaisen kohteen listalta."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Poistaa ja palauttaa ensimmäisen kohteen listalta."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Poistaa ja palauttaa kohteen annetusta kohden listaa. Nro 1 on ensimmäinen kohde."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Poistaa ja palauttaa kohteen annetusta kohden listaa. Nro 1 on ensimmäinen kohde."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Poistaa ja palauttaa kohteen listan annetusta kohdasta."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Poistaa ja palauttaa viimeisen kohteen listalta."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Poistaa ja palauttaa satunnaisen kohteen listalta."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Poistaa ensimmäisen kohteen listalta."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Poistaa kohteen listalta annetusta kohtaa. Nro 1 on viimeinen kohde."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Poistaa kohteen listalta annetusta kohtaa. Nro 1 on ensimmäinen kohde."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Poistaa kohteen listalta annetusta kohtaa."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Poistaa viimeisen kohteen listalta."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Poistaa satunnaisen kohteen listalta."; Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "päättyen kohtaan (lopusta laskien)"; @@ -114,10 +112,12 @@ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "hae osalista alkaen kohdasta (lo Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "hae osalista alkaen kohdasta"; Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Luo kopio määrätystä kohden listaa."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "Numero %1 tarkoittaa listan viimeistä kohdetta."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "Numero %1 tarkoittaa listan ensimmäistä kohdetta."; Blockly.Msg.LISTS_INDEX_OF_FIRST = "etsi ensimmäinen esiintymä kohteelle"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "etsi viimeinen esiintymä kohteelle"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Palauttaa kohteen ensimmäisen/viimeisen esiintymän kohdan. Palauttaa 0 jos tekstiä ei löydy."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Palauttaa kohteen ensimmäisen/viimeisen esiintymän kohdan listassa. Palauttaa %1 jos kohdetta ei löydy."; Blockly.Msg.LISTS_INLIST = "listassa"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 on tyhjä"; @@ -128,24 +128,33 @@ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Palauttaa listan pituuden."; Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_REPEAT_TITLE = "luo lista, jossa kohde %1 toistuu %2 kertaa"; Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Luo listan, jossa annettu arvo toistuu määrätyn monta kertaa."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "kohteeksi"; Blockly.Msg.LISTS_SET_INDEX_INSERT = "lisää kohtaan"; Blockly.Msg.LISTS_SET_INDEX_SET = "aseta"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Lisää kohteen listan kärkeen."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Lisää kohteen annettuun kohtaan listaa. Nro 1 on listan häntä."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Lisää kohteen listan annettuun kohtaan. Nro 1 on listan kärki."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Lisää kohteen annettuun kohtaan listassa."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Lisää kohteen listan loppuun."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Lisää kohteen satunnaiseen kohtaan listassa."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Asettaa listan ensimmäisen kohteen."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Asettaa listan määrätyssä kohtaa olevan kohteen. Nro 1 on listan loppu."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Asettaa kohteen määrättyyn kohtaa listassa. Nro 1 on listan alku."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Asettaa kohteen annettuun kohtaan listassa."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Asettaa listan viimeisen kohteen."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Asettaa satunnaisen kohteen listassa."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "nouseva"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "laskeva"; +Blockly.Msg.LISTS_SORT_TITLE = "lajittele %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Lajittele kopio luettelosta."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "aakkosjärjestyksessä, ohita kapitaalit"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeerinen"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "aakkosjärjestys"; Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "tee listasta tekstiä"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "tee tekstistä lista"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "tee lista tekstistä"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "tee listasta teksti"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Yhdistä luettelon tekstit yhdeksi tekstiksi, erotettuina välimerkillä."; Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Jaa teksti osiin erotinmerkin perusteella ja järjestä osat listaksi."; Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "erottimen kanssa"; Blockly.Msg.LOGIC_BOOLEAN_FALSE = "epätosi"; @@ -170,7 +179,7 @@ Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Lo Blockly.Msg.LOGIC_OPERATION_OR = "tai"; Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Palauttaa tosi, jos kummatkin syötteet ovat tosia."; Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Palauttaa tosi, jos ainakin yksi syötteistä on tosi."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "ehto"; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "testi"; Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "jos epätosi"; Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "jos tosi"; @@ -187,7 +196,7 @@ Blockly.Msg.MATH_CHANGE_TITLE = "muuta %1 arvolla %2"; Blockly.Msg.MATH_CHANGE_TOOLTIP = "Lisää arvo muuttujaan '%1'."; Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Palauttaa jonkin seuraavista vakioista: π (3.141…), e (2.718…), φ (1.618…), neliöjuuri(2) (1.414…), neliöjuuri(½) (0.707…), or ∞ (ääretön)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "rajoita %1 vähintään %2 enintään %3"; Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Rajoittaa arvon annetulle suljetulle välille."; Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; @@ -258,35 +267,36 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Palauttaa luvun arkustangentin."; Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Palauttaa asteluvun (ei radiaanin) kosinin."; Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Palauttaa asteluvun (ei radiaanin) sinin."; Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Palauttaa asteluvun (ei radiaanin) tangentin."; -Blockly.Msg.ME = "Minä"; -Blockly.Msg.NEW_VARIABLE = "Uusi muuttuja..."; +Blockly.Msg.NEW_VARIABLE = "Luo muuttuja..."; Blockly.Msg.NEW_VARIABLE_TITLE = "Uuden muuttujan nimi:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "salli kommentit"; Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "parametrit:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://fi.wikipedia.org/wiki/Aliohjelma"; Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Suorittaa käyttäjän määrittelemä funktio '%1'."; Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://fi.wikipedia.org/wiki/Aliohjelma"; Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Suorittaa käyttäjän määrittelemän funktion '%1' ja käyttää sen tuotosta."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "parametrit:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Luo '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Kuvaile tämä funktio..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "tee jotain"; Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "tehdäksesi"; Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Luo funktio, jolla ei ole tuotosta."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "palauta"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Luo funktio, jolla ei ole tuotosta."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Varoitus: tällä funktiolla on sama parametri useamman kerran."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Korosta funktion määritelmä"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Jos arvo on tosi, palauta toinen arvo."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Varoitus: tätä lohkoa voi käyttää vain funktion määrityksessä."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "syötteen nimi:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Lisää sisääntulon funktioon."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "syötteet"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Lisää, poista tai järjestele uudelleen tämän toiminnon tulot."; +Blockly.Msg.REDO = "Tee uudelleen"; Blockly.Msg.REMOVE_COMMENT = "Poista kommentti"; Blockly.Msg.RENAME_VARIABLE = "Nimeä uudelleen muuttuja..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Nimeä uudelleen kaikki '%1' muuttujaa:"; @@ -308,6 +318,9 @@ Blockly.Msg.TEXT_CHARAT_LAST = "hae viimeinen kirjain"; Blockly.Msg.TEXT_CHARAT_RANDOM = "hae satunnainen kirjain"; Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Palauttaa annetussa kohdassa olevan kirjaimen."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Lisää kohteen tekstiin."; Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "liitä"; Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Lisää, poista tai uudelleen järjestä osioita tässä lohkossa."; @@ -326,7 +339,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "tekstistä"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "etsi ensimmäinen esiintymä merkkijonolle"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "etsi viimeinen esiintymä merkkijonolle"; Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Palauttaa ensin annetun tekstin ensimmäisen/viimeisen esiintymän osoitteen toisessa tekstissä. Palauttaa osoitteen 0 jos tekstiä ei löytynyt."; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Palauttaa ensin annetun tekstin ensimmäisen/viimeisen esiintymän osoitteen toisessa tekstissä. Palauttaa osoitteen %1 jos tekstiä ei löytynyt."; Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 on tyhjä"; Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Palauttaa tosi, jos annettu teksti on tyhjä."; @@ -338,12 +351,18 @@ Blockly.Msg.TEXT_LENGTH_TITLE = "%1:n pituus"; Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Palauttaa annetussa tekstissä olevien merkkien määrän (välilyönnit mukaan lukien)."; Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated Blockly.Msg.TEXT_PRINT_TITLE = "tulosta %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Tulostaa annetun tekstin, numeron tia muun arvon."; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Tulostaa annetun tekstin, numeron tai muun arvon."; Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Kehottaa käyttäjää syöttämään numeron."; Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Kehottaa käyttäjää syöttämään tekstiä."; Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "käyttäen annettua viestiä, kehottaa syöttämään numeron"; Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "käyttäen annettua viestiä, kehottaa syöttämään tekstiä"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated Blockly.Msg.TEXT_TEXT_HELPURL = "https://fi.wikipedia.org/wiki/Merkkijono"; Blockly.Msg.TEXT_TEXT_TOOLTIP = "Kirjain, sana tai rivi tekstiä."; Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated @@ -352,6 +371,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "poistaa välilyönnit vasemmalta puolelta Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "poistaa välilyönnit oikealta puolelta"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Palauttaa kopion tekstistä siten, että välilyönnit on poistettu yhdestä tai molemmista päistä."; Blockly.Msg.TODAY = "Tänään"; +Blockly.Msg.UNDO = "Kumoa"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "kohde"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Luo 'aseta %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated @@ -360,13 +380,13 @@ Blockly.Msg.VARIABLES_SET = "aseta %1 arvoksi %2"; Blockly.Msg.VARIABLES_SET_CREATE_GET = "Luo 'hae %1'"; Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "Asettaa muutujan arvoksi annetun syötteen."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Muuttuja nimeltään '%1' jo olemassa."; Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; @@ -374,9 +394,19 @@ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/fr.js b/src/opsoro/server/static/js/blockly/msg/js/fr.js new file mode 100644 index 0000000..4e21b5b --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/fr.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.fr'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Ajouter un commentaire"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Modifier la valeur :"; +Blockly.Msg.CLEAN_UP = "Nettoyer les blocs"; +Blockly.Msg.COLLAPSE_ALL = "Réduire les blocs"; +Blockly.Msg.COLLAPSE_BLOCK = "Réduire le bloc"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "couleur 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "couleur 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "taux"; +Blockly.Msg.COLOUR_BLEND_TITLE = "mélanger"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mélange deux couleurs dans une proportion donnée (de 0.0 à 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://fr.wikipedia.org/wiki/Couleur"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Choisir une couleur dans la palette."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "couleur aléatoire"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Choisir une couleur au hasard."; +Blockly.Msg.COLOUR_RGB_BLUE = "bleu"; +Blockly.Msg.COLOUR_RGB_GREEN = "vert"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "rouge"; +Blockly.Msg.COLOUR_RGB_TITLE = "colorier avec"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Créer une couleur avec la quantité spécifiée de rouge, vert et bleu. Les valeurs doivent être comprises entre 0 et 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "quitter la boucle"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "passer à l’itération de boucle suivante"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Sortir de la boucle englobante."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Sauter le reste de cette boucle, et poursuivre avec l’itération suivante."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Attention : Ce bloc ne devrait être utilisé que dans une boucle."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "pour chaque élément %1 dans la liste %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Pour chaque élément d’une liste, assigner la valeur de l’élément à la variable '%1', puis exécuter des instructions."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "compter avec %1 de %2 à %3 par %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Faire prendre à la variable « %1 » les valeurs depuis le nombre de début jusqu’au nombre de fin, en s’incrémentant du pas spécifié, et exécuter les instructions spécifiées."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Ajouter une condition au bloc si."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Ajouter une condition finale fourre-tout au bloc si."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Ajouter, supprimer ou réordonner les sections pour reconfigurer ce bloc si."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "sinon"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "sinon si"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "si"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Si une valeur est vraie, alors exécuter certains ordres."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Si une valeur est vraie, alors exécuter le premier bloc d’ordres. Sinon, exécuter le second bloc d’ordres."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Si la première valeur est vraie, alors exécuter le premier bloc d’ordres. Sinon, si la seconde valeur est vraie, exécuter le second bloc d’ordres."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Si la première valeur est vraie, alors exécuter le premier bloc d’ordres. Sinon, si la seconde valeur est vraie, exécuter le second bloc d’ordres. Si aucune des valeurs n’est vraie, exécuter le dernier bloc d’ordres."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "http://fr.wikipedia.org/wiki/Boucle_for"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "faire"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "répéter %1 fois"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Exécuter des instructions plusieurs fois."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "répéter jusqu’à"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "répéter tant que"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Tant qu’une valeur est fausse, alors exécuter des instructions."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Tant qu’une valeur est vraie, alors exécuter des instructions."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Supprimer ces %1 blocs ?"; +Blockly.Msg.DELETE_BLOCK = "Supprimer le bloc"; +Blockly.Msg.DELETE_VARIABLE = "Supprimer la variable '%1'"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Supprimer %1 utilisations de la variable '%2' ?"; +Blockly.Msg.DELETE_X_BLOCKS = "Supprimer %1 blocs"; +Blockly.Msg.DISABLE_BLOCK = "Désactiver le bloc"; +Blockly.Msg.DUPLICATE_BLOCK = "Dupliquer"; +Blockly.Msg.ENABLE_BLOCK = "Activer le bloc"; +Blockly.Msg.EXPAND_ALL = "Développer les blocs"; +Blockly.Msg.EXPAND_BLOCK = "Développer le bloc"; +Blockly.Msg.EXTERNAL_INPUTS = "Entrées externes"; +Blockly.Msg.HELP = "Aide"; +Blockly.Msg.INLINE_INPUTS = "Entrées en ligne"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "créer une liste vide"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Renvoyer une liste, de longueur 0, ne contenant aucun enregistrement"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "liste"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Ajouter, supprimer, ou réordonner les sections pour reconfigurer ce bloc de liste."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "créer une liste avec"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Ajouter un élément à la liste."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Créer une liste avec un nombre quelconque d’éléments."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "premier"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# depuis la fin"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "obtenir"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "obtenir et supprimer"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "dernier"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aléatoire"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "supprimer"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Renvoie le premier élément dans une liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Renvoie l’élément à la position indiquée dans une liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Renvoie le dernier élément dans une liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Renvoie un élément au hasard dans une liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Supprime et renvoie le premier élément dans une liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Supprime et renvoie l’élément à la position indiquée dans une liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Supprime et renvoie le dernier élément dans une liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Supprime et renvoie un élément au hasard dans une liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Supprime le premier élément dans une liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Supprime l’élément à la position indiquée dans une liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Supprime le dernier élément dans une liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Supprime un élément au hasard dans une liste."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "jusqu’à # depuis la fin"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "jusqu’à #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "jusqu’à la fin"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "obtenir la sous-liste depuis le début"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "obtenir la sous-liste depuis # depuis la fin"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "obtenir la sous-liste depuis #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crée une copie de la partie spécifiée d’une liste."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 est le dernier élément."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 est le premier élément."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "trouver la première occurrence de l’élément"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "trouver la dernière occurrence de l’élément"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Renvoie l’index de la première/dernière occurrence de l’élément dans la liste. Renvoie %1 si l'élément n'est pas trouvé."; +Blockly.Msg.LISTS_INLIST = "dans la liste"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 est vide"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Renvoie vrai si la liste est vide."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "longueur de %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Renvoie la longueur d’une liste."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "créer une liste avec l’élément %1 répété %2 fois"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Crée une liste consistant en la valeur fournie répétée le nombre de fois indiqué."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "inverser %1"; +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Inverser la copie d’une liste."; +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "comme"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "insérer en"; +Blockly.Msg.LISTS_SET_INDEX_SET = "mettre"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Insère l’élément au début d’une liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Insère l’élément à la position indiquée dans une liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Ajouter l’élément à la fin d’une liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Insère l’élément au hasard dans une liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Fixe le premier élément dans une liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Met à jour l’élément à la position indiquée dans une liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Fixe le dernier élément dans une liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Fixe un élément au hasard dans une liste."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "croissant"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "décroissant"; +Blockly.Msg.LISTS_SORT_TITLE = "trier %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Trier une copie d’une liste."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabétique, en ignorant la casse"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numérique"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabétique"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "créer une liste depuis le texte"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "créer un texte depuis la liste"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Réunir une liste de textes en un seul, en les séparant par un séparateur."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Couper un texte en une liste de textes, en coupant à chaque séparateur."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "avec le séparateur"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "faux"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Renvoie soit vrai soit faux."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "vrai"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://fr.wikipedia.org/wiki/Inegalite_(mathematiques)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Renvoyer vrai si les deux entrées sont égales."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Renvoyer vrai si la première entrée est plus grande que la seconde."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Renvoyer vrai si la première entrée est plus grande ou égale à la seconde."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Renvoyer vrai si la première entrée est plus petite que la seconde."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Renvoyer vrai si la première entrée est plus petite ou égale à la seconde."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Renvoyer vrai si les deux entrées sont différentes."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "pas %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Renvoie vrai si l’entrée est fausse. Renvoie faux si l’entrée est vraie."; +Blockly.Msg.LOGIC_NULL = "nul"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Renvoie nul."; +Blockly.Msg.LOGIC_OPERATION_AND = "et"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "ou"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Renvoyer vrai si les deux entrées sont vraies."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Renvoyer vrai si au moins une des entrées est vraie."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "si faux"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "si vrai"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Vérifier la condition dans 'test'. Si elle est vraie, renvoie la valeur 'si vrai' ; sinon renvoie la valeur 'si faux'."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://fr.wikipedia.org/wiki/Arithmetique"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Renvoie la somme des deux nombres."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Renvoie le quotient des deux nombres."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Renvoie la différence des deux nombres."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Renvoie le produit des deux nombres."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Renvoie le premier nombre élevé à la puissance du second."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "incrémenter %1 de %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Ajouter un nombre à la variable '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Renvoie une des constantes courantes : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ou ∞ (infini)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "contraindre %1 entre %2 et %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Contraindre un nombre à être entre les limites spécifiées (incluses)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "est divisible par"; +Blockly.Msg.MATH_IS_EVEN = "est pair"; +Blockly.Msg.MATH_IS_NEGATIVE = "est négatif"; +Blockly.Msg.MATH_IS_ODD = "est impair"; +Blockly.Msg.MATH_IS_POSITIVE = "est positif"; +Blockly.Msg.MATH_IS_PRIME = "est premier"; +Blockly.Msg.MATH_IS_TOOLTIP = "Vérifier si un nombre est pair, impair, premier, entier, positif, négatif, ou s’il est divisible par un certain nombre. Renvoie vrai ou faux."; +Blockly.Msg.MATH_IS_WHOLE = "est entier"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "reste de %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Renvoyer le reste de la division euclidienne des deux nombres."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://fr.wikipedia.org/wiki/Nombre"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un nombre."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "moyenne de la liste"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maximum de la liste"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "médiane de la liste"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimum de la liste"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "majoritaires de la liste"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "élément aléatoire de la liste"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "écart-type de la liste"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "somme de la liste"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Renvoyer la moyenne (arithmétique) des valeurs numériques dans la liste."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Renvoyer le plus grand nombre dans la liste."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Renvoyer le nombre médian de la liste."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Renvoyer le plus petit nombre dans la liste."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Renvoyer une liste des élément(s) le(s) plus courant(s) dans la liste."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Renvoyer un élément dans la liste au hasard."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Renvoyer l’écart-type de la liste."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Renvoyer la somme de tous les nombres dans la liste."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "fraction aléatoire"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Renvoyer une fraction aléatoire entre 0.0 (inclus) et 1.0 (exclus)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "entier aléatoire entre %1 et %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Renvoyer un entier aléatoire entre les deux limites spécifiées, incluses."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arrondir"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arrondir par défaut"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arrondir par excès"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Arrondir un nombre au-dessus ou au-dessous."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://fr.wikipedia.org/wiki/Racine_carree"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "valeur absolue"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "racine carrée"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Renvoie la valeur absolue d’un nombre."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Renvoie e à la puissance d’un nombre."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Renvoie le logarithme naturel d’un nombre."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Renvoie le logarithme base 10 d’un nombre."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Renvoie l’opposé d’un nombre"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Renvoie 10 à la puissance d’un nombre."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Renvoie la racine carrée d’un nombre."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Renvoie l’arccosinus d’un nombre."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Renvoie l’arcsinus d’un nombre."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Renvoie l’arctangente d’un nombre."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Renvoie le cosinus d’un angle en degrés (pas en radians)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Renvoie le sinus d’un angle en degrés (pas en radians)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Renvoie la tangente d’un angle en degrés (pas en radians)."; +Blockly.Msg.NEW_VARIABLE = "Créer une variable..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nouveau nom de la variable :"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "autoriser les ordres"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "avec :"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://fr.wikipedia.org/wiki/Sous-programme"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Exécuter la fonction '%1' définie par l’utilisateur."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://fr.wikipedia.org/wiki/Sous-programme"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Exécuter la fonction '%1' définie par l’utilisateur et utiliser son résultat."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "avec :"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Créer '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Décrire cette fonction…"; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "faire quelque chose"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "pour"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crée une fonction sans sortie."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "retour"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crée une fonction avec une sortie."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Attention : Cette fonction a des paramètres en double."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Surligner la définition de la fonction"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Si une valeur est vraie, alors renvoyer une seconde valeur."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Attention : Ce bloc pourrait n’être utilisé que dans une définition de fonction."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nom de l’entrée :"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Ajouter une entrée à la fonction."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entrées"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Ajouter, supprimer, ou réarranger les entrées de cette fonction."; +Blockly.Msg.REDO = "Refaire"; +Blockly.Msg.REMOVE_COMMENT = "Supprimer un commentaire"; +Blockly.Msg.RENAME_VARIABLE = "Renommer la variable…"; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Renommer toutes les variables « %1 » en :"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "ajouter le texte"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "à"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Ajouter du texte à la variable '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "en minuscules"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "en Majuscule Au Début De Chaque Mot"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "en MAJUSCULES"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Renvoyer une copie du texte dans une autre casse."; +Blockly.Msg.TEXT_CHARAT_FIRST = "obtenir la première lettre"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "obtenir la lettre # depuis la fin"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "obtenir la lettre #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "dans le texte"; +Blockly.Msg.TEXT_CHARAT_LAST = "obtenir la dernière lettre"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "obtenir une lettre au hasard"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Renvoie la lettre à la position indiquée."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "nombre %1 sur %2"; +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Compter combien de fois un texte donné apparait dans un autre."; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Ajouter un élément au texte."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "joindre"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Ajouter, supprimer, ou réordonner des sections pour reconfigurer ce bloc de texte."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "jusqu’à la lettre # depuis la fin"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "jusqu’à la lettre #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "jusqu’à la dernière lettre"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "dans le texte"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "obtenir la sous-chaîne depuis la première lettre"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "obtenir la sous-chaîne depuis la lettre # depuis la fin"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "obtenir la sous-chaîne depuis la lettre #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Renvoie une partie indiquée du texte."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "dans le texte"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "trouver la première occurrence de la chaîne"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "trouver la dernière occurrence de la chaîne"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Renvoie l’index de la première/dernière occurrence de la première chaîne dans la seconde. Renvoie %1 si la chaîne n’est pas trouvée."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 est vide"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Renvoie vrai si le texte fourni est vide."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "créer un texte avec"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Créer un morceau de texte en agrégeant un nombre quelconque d’éléments."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "longueur de %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Renvoie le nombre de lettres (espaces compris) dans le texte fourni."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "afficher %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Afficher le texte, le nombre ou une autre valeur spécifié."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Demander un nombre à l’utilisateur."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Demander un texte à l’utilisateur."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "invite pour un nombre avec un message"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "invite pour un texte avec un message"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "remplacer %1 par %2 dans %3"; +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Remplacer toutes les occurrences d’un texte par un autre."; +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "inverser %1"; +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Inverse l’ordre des caractères dans le texte."; +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Une lettre, un mot ou une ligne de texte."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "supprimer les espaces des deux côtés"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "supprimer les espaces du côté gauche"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "supprimer les espaces du côté droit"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Renvoyer une copie du texte avec les espaces supprimés d’un bout ou des deux."; +Blockly.Msg.TODAY = "Aujourd'hui"; +Blockly.Msg.UNDO = "Annuler"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "élément"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Créer 'fixer %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Renvoie la valeur de cette variable."; +Blockly.Msg.VARIABLES_SET = "fixer %1 à %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Créer 'obtenir %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Fixe cette variable pour qu’elle soit égale à la valeur de l’entrée."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Une variable appelée '%1' existe déjà."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/he.js b/src/opsoro/server/static/js/blockly/msg/js/he.js new file mode 100644 index 0000000..ccf54b9 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/he.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.he'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "הוסף תגובה"; +Blockly.Msg.CHANGE_VALUE_TITLE = "שנה ערך:"; +Blockly.Msg.CLEAN_UP = "סידור בלוקים"; +Blockly.Msg.COLLAPSE_ALL = "צמצם קטעי קוד"; +Blockly.Msg.COLLAPSE_BLOCK = "צמצם קטע קוד"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "צבע 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "צבע 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "יחס"; +Blockly.Msg.COLOUR_BLEND_TITLE = "ערבב"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "מערבב שני צבעים יחד עם יחס נתון(0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "http://he.wikipedia.org/wiki/%D7%A6%D7%91%D7%A2"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "בחר צבע מן הצבעים."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "צבע אקראי"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "בחר צבא אקראי."; +Blockly.Msg.COLOUR_RGB_BLUE = "כחול"; +Blockly.Msg.COLOUR_RGB_GREEN = "ירוק"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "אדום"; +Blockly.Msg.COLOUR_RGB_TITLE = "צבע עם"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "צור צבע עם הסכום המצוין של אדום, ירוק וכחול. כל הערכים חייבים להיות בין 0 ל100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "צא מהלולאה"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "המשך עם האיטרציה הבאה של הלולאה"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "צא אל מחוץ ללולאה הכוללת."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "דלג על שאר הלולאה והמשך עם האיטרציה הבאה."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "אזהרה: בלוק זה עשוי לשמש רק בתוך לולאה."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "לכל פריט %1 ברשימה %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "לכל פריט ברשימה, להגדיר את המשתנה '%1' לפריט הזה, ולאחר מכן לעשות כמה פעולות."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "תספור עם %1 מ- %2 ל- %3 עד- %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; // untranslated +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "תוסיף תנאי לבלוק If."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "לסיום, כל התנאים תקפים לגבי בלוק If."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "תוסיף, תמחק, או תסדר מחדש כדי להגדיר מחדש את הבלוק If."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "אחרת"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "אחרת אם"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "אם"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "אם ערך נכון, לבצע כמה פעולות."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "אם הערך הוא אמת, לבצע את הבלוק הראשון של הפעולות. אחרת, לבצע את הבלוק השני של הפעולות."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "אם הערך הראשון הוא אמת, לבצע את הבלוק הראשון של הפעולות. אחרת, אם הערך השני הוא אמת, לבצע את הבלוק השני של הפעולות."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "אם הערך הראשון הוא אמת, לבצע את הבלוק הראשון של הפעולות. אחרת, אם הערך השני הוא אמת, לבצע את הבלוק השני של הפעולות. אם אף אחד מהם אינו נכון, לבצע את הבלוק האחרון של הפעולות."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "http://he.wikipedia.org/wiki/בקרת_זרימה"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "תעשה"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "חזור על הפעולה %1 פעמים"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "לעשות כמה פעולות מספר פעמים."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "חזור עד ש..."; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "חזור כל עוד"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "בזמן שהערך שווה לשגוי, תעשה מספר חישובים."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "כל עוד הערך הוא אמת, לעשות כמה פעולות."; +Blockly.Msg.DELETE_ALL_BLOCKS = "האם למחוק את כל %1 קטעי הקוד?"; +Blockly.Msg.DELETE_BLOCK = "מחק קטע קוד"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "מחק %1 קטעי קוד"; +Blockly.Msg.DISABLE_BLOCK = "נטרל קטע קוד"; +Blockly.Msg.DUPLICATE_BLOCK = "שכפל"; +Blockly.Msg.ENABLE_BLOCK = "הפעל קטע קוד"; +Blockly.Msg.EXPAND_ALL = "הרחב קטעי קוד"; +Blockly.Msg.EXPAND_BLOCK = "הרחב קטע קוד"; +Blockly.Msg.EXTERNAL_INPUTS = "קלטים חיצוניים"; +Blockly.Msg.HELP = "עזרה"; +Blockly.Msg.INLINE_INPUTS = "קלטים פנימיים"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "צור רשימה ריקה"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "החזר רשימה,באורך 0, המכילה רשומות נתונים"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "רשימה"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "תוסיף, תמחק, או תסדר מחדש כדי להגדיר מחדש את הבלוק If."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "צור רשימה עם"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "הוסף פריט לרשימה."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "צור רשימה עם כל מספר של פריטים."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "ראשון"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# מהסוף"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "לקבל"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "קבל ומחק"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "אחרון"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "אקראי"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "הסרה"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "מחזיר את הפריט הראשון ברשימה."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "מחזיר פריט במיקום שצוין ברשימה."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "מחזיר את הפריט האחרון ברשימה."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "מחזיר פריט אקראי מהרשימה."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "מסיר ומחזיר את הפריט הראשון ברשימה."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "מסיר ומחזיר את הפריט במיקום שצוין ברשימה."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "מסיר ומחזיר את הפריט האחרון ברשימה."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "מחק והחזר פריט אקראי מהרשימה."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "הסר את הפריט הראשון ברשימה."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "מחזיר פריט במיקום שצוין ברשימה."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "הסר את הפריט הראשון ברשימה."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "הסר פריט אקראי ברשימה."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "ל # מהסוף"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "ל #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "לאחרון"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "לקבל חלק מהרשימה החל מהתחלה"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "לקבל חלק מהרשימה החל מ-# עד הסוף"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "לקבל חלק מהרשימה החל מ-#"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "יוצרת עותק של חלק מסוים מהרשימה."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 הוא הפריט האחרון."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 הוא הפריט הראשון."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "מחזירה את המיקום הראשון של פריט ברשימה"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "מחזירה את המיקום האחרון של פריט ברשימה"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "מחזירה את האינדקס של המופע הראשון/האחרון של הפריט ברשימה. מחזירה %1 אם הפריט אינו נמצא."; +Blockly.Msg.LISTS_INLIST = "ברשימה"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 הוא ריק"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "מחזיר אמת אם הרשימה ריקה."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "אורכו של %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "מחזירה את האורך של רשימה."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "ליצור רשימה עם הפריט %1 %2 פעמים"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "יוצר רשימה המורכבת מהערך נתון חוזר מספר פעמים שצוין."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "כמו"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "הכנס ב"; +Blockly.Msg.LISTS_SET_INDEX_SET = "הגדר"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "מכניס את הפריט בתחילת רשימה."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "מכניס את הפריט במיקום שצוין ברשימה."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "מוסיף את הפריט בסוף רשימה."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "הוסף פריט באופן אקראי ברשימה."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "מגדיר את הפריט הראשון ברשימה."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "מגדיר את הפריט במיקום שצוין ברשימה."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "מגדיר את הפריט האחרון ברשימה."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "מגדיר פריט אקראי ברשימה."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "סדר עולה"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "סדר יורד"; +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "סדר אלפביתי, לא תלוי רישיות"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "סדר אלפביתי"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "יצירת רשימה מטקסט"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "יצירת טקסט מרשימה"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "שגוי"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "תחזיר אם נכון או אם שגוי."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "נכון"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "תחזיר נכון אם שני הקלטים שווים אחד לשני."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "תחזיר נכון אם הקלט הראשון גדול יותר מהקלט השני."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "תחזיר נכון אם הקלט הראשון גדול יותר או שווה לכניסה השנייה."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "תחזיר אמת (true) אם הקלט הראשון הוא קטן יותר מאשר הקלט השני."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "תחזיר אמת אם הקלט הראשון הוא קטן יותר או שווה לקלט השני."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "תחזיר אמת אם שני הקלטים אינם שווים זה לזה."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "לא %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "החזר אמת אם הקלט הוא שקר. החזר שקר אם הקלט אמת."; +Blockly.Msg.LOGIC_NULL = "null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "תחזיר ריק."; +Blockly.Msg.LOGIC_OPERATION_AND = "ו"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "או"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "תחזיר נכון אם שני הקלטים נכונים."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "תחזיר נכון אם מתקיים לפחות אחד מהקלטים נכונים."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "בדיקה"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "אם שגוי"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "אם נכון"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "בדוק את התנאי ב'מבחן'. אם התנאי נכון, תחזיר את הערך 'אם נכון'; אחרת תחזיר את הערך 'אם שגוי'."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://he.wikipedia.org/wiki/ארבע_פעולות_החשבון"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "תחזיר את סכום שני המספרים."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "החזרת המנה של שני המספרים."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "החזרת ההפרש בין שני מספרים."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "החזרת תוצאת הכפל בין שני מספרים."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "החזרת המספר הראשון בחזקת המספר השני."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg.MATH_CHANGE_TITLE = "שינוי %1 על־ידי %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "הוסף מספר למשתנה '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "מתחלק ב"; +Blockly.Msg.MATH_IS_EVEN = "זוגי"; +Blockly.Msg.MATH_IS_NEGATIVE = "שלילי"; +Blockly.Msg.MATH_IS_ODD = "אי-זוגי"; +Blockly.Msg.MATH_IS_POSITIVE = "חיובי"; +Blockly.Msg.MATH_IS_PRIME = "ראשוני"; +Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated +Blockly.Msg.MATH_IS_WHOLE = "שלם"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated +Blockly.Msg.MATH_MODULO_TITLE = "שארית החילוק %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "החזרת השארית מחלוקת שני המספרים."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://he.wikipedia.org/wiki/מספר_ממשי"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "מספר."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "ממוצע של רשימה"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "מקסימום של רשימה"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "חציון של רשימה"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "מינימום של רשימה"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "שכיחי הרשימה"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "פריט אקראי מרשימה"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standard deviation of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "סכום של רשימה"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Return the average (arithmetic mean) of the numeric values in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "תחזיר את המספר הגדול ביותר ברשימה."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "תחזיר את המספר החיצוני ביותר ברשימה."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "תחזיר את המספר הקטן ביותר ברשימה."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "החזרת רשימה של הפריטים הנפוצים ביותר ברשימה"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "תחזיר רכיב אקראי מרשימה."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "החזרת הסכום של המספרים ברשימה."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "שבר אקראי"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_TITLE = "random integer from %1 to %2"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; // untranslated +Blockly.Msg.MATH_ROUND_HELPURL = "https://he.wikipedia.org/wiki/עיגול_(אריתמטיקה)"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "עיגול"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "עיגול למטה"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "עיגול למעלה"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "עיגול מספר למעלה או למטה."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://he.wikipedia.org/wiki/שורש_ריבועי"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "ערך מוחלט"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "שורש ריבועי"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "החזרת הערך המוחלט של מספר."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "החזרת e בחזקת מספר."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "החזרת הלוגריתם הטבעי של מספר."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "החזרת הלוגריתם לפי בסיס עשר של מספר."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "החזרת הערך הנגדי של מספר."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "החזרת 10 בחזקת מספר."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "החזרת השורש הריבועי של מספר."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "acos"; +Blockly.Msg.MATH_TRIG_ASIN = "asin"; +Blockly.Msg.MATH_TRIG_ATAN = "atan"; +Blockly.Msg.MATH_TRIG_COS = "cos"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://he.wikipedia.org/wiki/פונקציות_טריגונומטריות"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; +Blockly.Msg.MATH_TRIG_TAN = "tan"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "החזרת הקוסינוס של מעלה (לא רדיאן)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "החזרת הסינוס של מעלה (לא רדיאן)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "החזרת הטנגס של מעלה (לא רדיאן)."; +Blockly.Msg.NEW_VARIABLE = "משתנה חדש..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "שם המשתנה החדש:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "לאפשר פעולות"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "עם:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://he.wikipedia.org/wiki/שגרה_(תכנות)"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "להפעיל את הפונקציה המוגדרת על-ידי המשתמש '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://he.wikipedia.org/wiki/שגרה_(תכנות)"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "להפעיל את הפונקציה המוגדרת על-ידי המשתמש '%1' ולהשתמש הפלט שלה."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "עם:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "ליצור '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "לעשות משהו"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "לביצוע:"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "יצירת פונקציה ללא פלט."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "להחזיר"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "יצירת פונקציה עם פלט."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "אזהרה: לפונקציה זו יש פרמטרים כפולים."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "הדגש הגדרה של פונקציה"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "אם ערך נכון, אז להחזיר ערך שני."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "אזהרה: בלוק זה עשוי לשמש רק בתוך הגדרה של פונקציה."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "שם הקלט:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "הוסף קלט לפונקציה"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "מקורות קלט"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "הוסף, הסר או סדר מחדש קלטים לפונקציה זו"; +Blockly.Msg.REDO = "ביצוע חוזר"; +Blockly.Msg.REMOVE_COMMENT = "הסר תגובה"; +Blockly.Msg.RENAME_VARIABLE = "שנה את שם המשתנה..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "שנה את שם כל '%1' המשתנים ל:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "הוספת טקסט"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "אל"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; // untranslated +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "לאותיות קטנות (עבור טקסט באנגלית)"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "לאותיות גדולות בתחילת כל מילה (עבור טקסט באנגלית)"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "לאותיות גדולות (עבור טקסט באנגלית)"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg.TEXT_CHARAT_FIRST = "get first letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_FROM_END = "get letter # from end"; // untranslated +Blockly.Msg.TEXT_CHARAT_FROM_START = "get letter #"; // untranslated +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in text"; // untranslated +Blockly.Msg.TEXT_CHARAT_LAST = "get last letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "צירוף"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "לאות # מהסוף"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "לאות #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; // untranslated +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "מחזירה את האינדקס של המופע הראשון/האחרון בטקסט הראשון לתוך הטקסט השני. מחזירה %1 אם הטקסט אינו נמצא."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "יצירת טקסט עם"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; // untranslated +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "הדפס %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "להדפיס טקסט, מספר או ערך אחר שצוין"; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "בקש מהמשתמש מספר."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "בקשה למשתמש להזין טקסט כלשהו."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "בקשה למספר עם הודעה"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "בקשה להזנת טקסט עם הודעה"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated +Blockly.Msg.TEXT_TEXT_TOOLTIP = "אות, מילה, או שורת טקסט."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "למחוק רווחים משני הקצוות"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "למחוק רווחים מימין"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "למחוק רווחים משמאל"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "להחזיר עותק של הטקסט לאחר מחיקת רווחים מאחד או משני הקצוות."; +Blockly.Msg.TODAY = "היום"; +Blockly.Msg.UNDO = "ביטול"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "פריט"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "ליצור 'הגדר %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "להחזיר את הערך של משתנה זה."; +Blockly.Msg.VARIABLES_SET = "הגדר %1 ל- %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "ליצור 'קרא %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "מגדיר משתנה זה להיות שווה לקלט."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/hi.js b/src/opsoro/server/static/js/blockly/msg/js/hi.js similarity index 90% rename from src/opsoro/apps/visual_programming/static/blockly/msg/js/hi.js rename to src/opsoro/server/static/js/blockly/msg/js/hi.js index de94cdd..b9c0c15 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/hi.js +++ b/src/opsoro/server/static/js/blockly/msg/js/hi.js @@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.hi'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "टिप्पणी छोड़ें"; -Blockly.Msg.AUTH = "अपने कार्य को सहेजना सक्षम करने और अपने साथ इसे साझा करने हेतु कृपया इस एप्प को अधिकृत करें।"; Blockly.Msg.CHANGE_VALUE_TITLE = "मान परिवर्तित करें:"; -Blockly.Msg.CHAT = "इस सन्दूक में लिखकर हमारे सहयोगी के साथ बातचीत करें!"; Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated Blockly.Msg.COLLAPSE_ALL = "ब्लॉक संक्षिप्त करें"; Blockly.Msg.COLLAPSE_BLOCK = "ब्लॉक को संक्षिप्त करें"; @@ -62,7 +60,10 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "दोहराएँ जब Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "दोहराएँ जब कि"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "जब तक मान फॉल्स है, तब तक कुछ स्टेट्मेंट्स चलाएँ।"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "जब तक मान ट्रू है, तब तक कुछ स्टेट्मेंट्स चलाएँ।"; +Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated Blockly.Msg.DELETE_BLOCK = "ब्लॉक हटाएँ"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated Blockly.Msg.DELETE_X_BLOCKS = "%1 ब्लॉक हटाएँ"; Blockly.Msg.DISABLE_BLOCK = "ब्लॉक को अक्षम करें"; Blockly.Msg.DUPLICATE_BLOCK = "कॉपी करें"; @@ -81,28 +82,25 @@ Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/ Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "इसके सूची बनाएँ"; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "सूची मे एक आइटम जोड़ें।"; Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "कितने भी आइटम वाली एक सूची बनाएँ।"; -Blockly.Msg.LISTS_GET_INDEX_FIRST = "पहला"; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "%1 पहला आइटम है।"; Blockly.Msg.LISTS_GET_INDEX_FROM_END = "अंत से #"; Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated Blockly.Msg.LISTS_GET_INDEX_GET = "प्राप्त"; Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "प्राप्त करे और हटाए"; -Blockly.Msg.LISTS_GET_INDEX_LAST = "आखिरी"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "%1 आखरी आइटम है।"; Blockly.Msg.LISTS_GET_INDEX_RANDOM = "रैन्डम"; Blockly.Msg.LISTS_GET_INDEX_REMOVE = "निकालें"; Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "सूची का पहला आइटम रिटर्न करता है।"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returns the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returns the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "सूची का आखरी आइटम रिटर्न करता है।"; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "सूची से रैन्डम आइटम रिटर्न करता है।"; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "सूची का पहला आइटम निकालता है और रिटर्न करता है।"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Removes and returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Removes and returns the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Removes and returns the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "सूची का आखरी आइटम निकालता है और रिटर्न करता है।"; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "सूची से रैन्डम आइटम निकालता है और रिटर्न करता है।"; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "सूची का पहला आइटम निकालता है।"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Removes the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Removes the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Removes the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "सूची का आखरी आइटम निकालता है।"; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "सूची से रैन्डम आइटम निकालता है।"; Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "to # from end"; // untranslated @@ -114,10 +112,12 @@ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "सूची के बताए गये भाग की कॉपी बनता है।"; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 is the last item."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 is the first item."; // untranslated Blockly.Msg.LISTS_INDEX_OF_FIRST = "आइटम पहली बार जहाँ आया है उसे ढूढ़े"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "आइटम आखरी बार जहाँ आया है उसे ढूढ़े"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated Blockly.Msg.LISTS_INLIST = "सूची में"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 खाली है"; @@ -128,20 +128,29 @@ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "सूची की लंबाई रि Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "as"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INSERT = "insert at"; // untranslated Blockly.Msg.LISTS_SET_INDEX_SET = "सैट करें"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "आइटम को सूची के शुरू में इनसर्ट करता है।"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "सूची मे बताए गये स्थान में आइटम इनसर्ट करता है। #1 आखरी आइटम है।"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "सूची मे बताए गये स्थान में आइटम इनसर्ट करता है। #1 पहला आइटम है।"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "सूची मे बताए गये स्थान में आइटम इनसर्ट करता है।"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "आइटम को सूची के अंत में जोड़ता है।"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "आइटम को सूची में रैन्डम्ली इनसर्ट करता है।"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "सूची में पहला आइटम सैट करता है।"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "सूची मे बताए गये स्थान में आइटम सैट करता है। #1 आखरी आइटम है।"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "सूची मे बताए गये स्थान में आइटम सैट करता है। #1 पहला आइटम है।"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "सूची मे बताए गये स्थान में आइटम सैट करता है।"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "सूची में आखरी आइटम सैट करता है।"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "सूची में रैन्डम आइटम सैट करता है।"; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "अंकीय"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -187,7 +196,7 @@ Blockly.Msg.MATH_CHANGE_TITLE = "change %1 by %2"; // untranslated Blockly.Msg.MATH_CHANGE_TOOLTIP = "संख्या को चर '%1' से जोड़ें।"; Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated @@ -258,35 +267,36 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "संख्या का आर्कट Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "डिग्री का कोसाइन रिटर्न करें (रेडियन नही)"; Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "डिग्री का साइन रिटर्न करें (रेडियन नही)"; Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "डिग्री का टैन्जन्ट रिटर्न करें (रेडियन नही)"; -Blockly.Msg.ME = "मैं"; -Blockly.Msg.NEW_VARIABLE = "नया चर..."; +Blockly.Msg.NEW_VARIABLE = "चर बनाएँ..."; Blockly.Msg.NEW_VARIABLE_TITLE = "नए चर का नाम:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated Blockly.Msg.PROCEDURES_BEFORE_PARAMS = ": के साथ"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "यूज़र द्वारा वर्णन किया गया फ़ंक्शन '%1' चलाएँ।"; Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "यूज़र द्वारा वर्णन किया गया फ़ंक्शन '%1' चलाएँ और उसका आउटपुट इस्तेमाल करें।"; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = ": के साथ"; Blockly.Msg.PROCEDURES_CREATE_DO = "'%1' बनाएँ"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "कुछ करें"; Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "to"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "बिना आउटपुट वाला एक फ़ंक्शन बनाता है।"; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "रिटर्न"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "आउटपुट वाला एक फ़ंक्शन बनाता है।"; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "सावधान: इस फ़ंक्शन मे डुप्लिकेट पैरामीटर हैं।"; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "फ़ंक्शन परिभाषा को हाइलाइट करें"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "यदि एक मान ट्रू है तो, दूसरा मान रिटर्न करें।"; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "सावधान: ये ब्लॉक फ़ंक्शन परिभाषा के अंदर ही इस्तेमाल किया जा सकता।"; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "इनपुट का नाम:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "फंगक्शन को इनपुट प्रदान करें।"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "इनपुट"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "फिर से करें"; Blockly.Msg.REMOVE_COMMENT = "टिप्पणी हटायें"; Blockly.Msg.RENAME_VARIABLE = "चर का नाम बदलें..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "सभी '%1' चरों के नाम बदलें:"; @@ -308,6 +318,9 @@ Blockly.Msg.TEXT_CHARAT_LAST = "आखरी अक्षर पाएँ"; Blockly.Msg.TEXT_CHARAT_RANDOM = "रैन्डम अक्षर पाएँ"; Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated Blockly.Msg.TEXT_CHARAT_TOOLTIP = "बताई गयी जगह से अक्षर रिटर्न करता है"; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "सूची मे एक आइटम जोड़ें।"; Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "जोड़"; Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated @@ -326,7 +339,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "इस टेक्स्ट मे"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "टेक्स्ट पहली बार जहाँ आया है उसे ढूढ़े"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "टेक्स्ट आखरी बार जहाँ आया है उसे ढूढ़े"; Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 खाली है"; Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "ट्रू रिटर्न करता है यदि दिया गया टेक्स्ट खाली है।"; @@ -344,6 +357,12 @@ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "यूज़र से संख्य Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "यूज़र से कुछ टेक्स्ट के लिए प्रॉम्प्ट करें।"; Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "सूचना के साथ संख्या के लिए प्रॉम्प्ट करें"; Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "सूचना के साथ टेक्स्ट के लिए प्रॉम्प्ट करें"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; Blockly.Msg.TEXT_TEXT_TOOLTIP = "एक अक्षर, शब्द, या टेक्स्ट की पंक्ति।"; Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated @@ -352,6 +371,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "रिक्त स्थान को Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "रिक्त स्थान को इस टेक्स्ट के दाईं तरफ से निकालें"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated Blockly.Msg.TODAY = "आज"; +Blockly.Msg.UNDO = "पूर्ववत करें"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "आइटम"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "सेट '%1' बनाएँ"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated @@ -360,13 +380,13 @@ Blockly.Msg.VARIABLES_SET = "सेट करें %1 को %2"; Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "इस चर को इनपुट के बराबर सेट करता है।"; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "प्राचल नाम '%1' पहले से मौजूद है।"; Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; @@ -374,9 +394,19 @@ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/hrx.js b/src/opsoro/server/static/js/blockly/msg/js/hrx.js new file mode 100644 index 0000000..4b5bb76 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/hrx.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.hrx'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Kommentar hinzufüche"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Neie Variable..."; +Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.COLLAPSE_ALL = "Blocke zusammerfalte"; +Blockly.Msg.COLLAPSE_BLOCK = "Block zusammerfalte"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "Farreb 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "mit Farreb 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "im Verhältniss"; +Blockly.Msg.COLOUR_BLEND_TITLE = "misch"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Vermischt 2 Farwe mit konfigurierbare Farrebverhältniss (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://hrx.wikipedia.org/wiki/Farreb"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Wähl en Farreb von der Palett."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "zufälliche Farwe"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Wähl en Farreb noh dem Zufallsprinzip."; +Blockly.Msg.COLOUR_RGB_BLUE = "blau"; +Blockly.Msg.COLOUR_RGB_GREEN = "grün"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "rot"; +Blockly.Msg.COLOUR_RGB_TITLE = "Färreb mit"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Kreiere ene Farreb mit sellrbst definierte rot, grün und blau Wearte. All Wearte müsse zwischich 0 und 100 liehe."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "ausbreche aus der Schleif"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "mit der nächste Iteration fortfoohre aus der Schleifa"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Die umgebne Schleif beenne."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Die Oonweisung abbreche und mit der nächste Schleifiteration fortfoohre."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warnung: Die block sollt nuar in en Schleif verwennet sin."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "Für Weart %1 aus der List %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Füahr en Oonweisung für jede Weart in der List aus und setzt dabei die Variable \"%1\" uff den aktuelle List Weart."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "Zähl %1 von %2 bis %3 mit %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Zähl die Variable \"%1\" von enem Startweart bis zu enem Zielweart und füahrefür jede Weart en Oonweisung aus."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "En weitre Bedingung hinzufüche."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "En orrer Bedingung hinzufüche, füahrt en Oonweisung aus falls ken Bedingung zutrifft."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Hinzufüche, entferne orrer sortiere von Sektione"; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "orrer"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "orrer wenn"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "wenn"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Wenn en Bedingung woahr (true) ist, dann füahr en Oonweisung aus."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Wenn en Bedingung woahr (true) ist, dann füahr die earscht Oonweisung aus. Ansonscht füahr die zwooite Oonweisung aus."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Wenn der erschte Bedingung woahr (true) ist, dann füahr die erschte Oonweisung aus. Orrer wenn die zwooite Bedingung woahr (true) ist, dann füahr die zwooite Oonweisung aus."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Wenn der erscht Bedingung woahr (true) ist, dann füahr die erschte Oonweisung aus. Orrer wenn die zwooite Bedingung woahr (true) ist, dann füahr die zwooite Oonweisung aus. Falls ken der beide Bedingungen woahr (true) ist, dann füahr die dritte Oonweisung aus."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://hrx.wikipedia.org/wiki/For-Schleif"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "mach"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "wiederhol %1 mol"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "En Oonweisung meahrfach ausführe."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "Repetiere bis"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "Repetier solang"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Füahr die Oonweisung solang aus wie die Bedingung falsch (false) ist."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Füahr die Oonweisung solang aus wie die Bedingung woahr (true) ist."; +Blockly.Msg.DELETE_ALL_BLOCKS = "All %1 Bausten lösche?"; +Blockly.Msg.DELETE_BLOCK = "Block lösche"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "Block %1 lösche"; +Blockly.Msg.DISABLE_BLOCK = "Block deaktivieren"; +Blockly.Msg.DUPLICATE_BLOCK = "Kopieren"; +Blockly.Msg.ENABLE_BLOCK = "Block aktivieren"; +Blockly.Msg.EXPAND_ALL = "Blocke expandiere"; +Blockly.Msg.EXPAND_BLOCK = "Block entfalte"; +Blockly.Msg.EXTERNAL_INPUTS = "External Inputsexterne Ingänge"; +Blockly.Msg.HELP = "Hellef"; +Blockly.Msg.INLINE_INPUTS = "interne Ingänge"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "Generier/erzeich en leear List"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Generier/erzeich en leear List ohne Inhalt."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "List"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Hinzufüche, entferne und sortiere von Elemente."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "Erzeich List mit"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "En Element zur List hinzufüche."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Generier/erzeich en List mit konfigurierte Elemente."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "earste"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "#te von hinne"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "Nehm"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "Nehm und entfern"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "letzte"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "zufälliches"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "Entfern"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Extrahiert das earste Element von der List."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Extrahiert das Element zu en definierte Stell von der List."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Extrahiert das letzte Element von der List."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Extrahiert en zufälliches Element von der List."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Extrahiert und entfernt das earste Element von der List."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Extrahiert und entfernt das Element zu en definierte Stell von der List."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Extrahiert und entfernt das letzte Element von der List."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Extrahiert und entfernt en zufälliches Element von der List."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Entfernt das earste Element von der List."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Entfernt das Element zu en definierte Stell von der List."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Entfernt das letzte Element von der List."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Entfernt en zufälliches Element von der List."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "zu # vom End"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "zu #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "zum Letzte"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "hol Unnerliste vom Earste"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "hol Unnerliste von # vom End"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "hol Unnerlist von #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Generiert en Kopie von en definierte Tel von en List."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 ist das letzte Element."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 ist das earschte Element."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "Such earstes Voarkommniss"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "Such letztes Voarkommniss"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Sucht die Position (index) von en Element in der List Gebt %1 zurück wenn nixs gefunn woard."; +Blockly.Msg.LISTS_INLIST = "in der List"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ist leear?"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Ist woahr (true), wenn die List leear ist."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "länge %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Die Oonzoohl von Elemente in der List."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "Erzich List mit Element %1 wiederhol das %2 mol"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Erzeicht en List mit en variable Oonzoohl von Elemente"; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "uff"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "tue ren setz an"; +Blockly.Msg.LISTS_SET_INDEX_SET = "setz"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Tut das Element an en Oonfang von en List ren setze."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Tut das Element ren setze an en definierte Stell an en List."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Oonhängt das Element zu en List sei End."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Tut das Element zufällich an en List ren setze."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list.Setzt das earschte Element an en list."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Setzt das Element zu en definierte Stell in en List."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Setzt das letzte Element an en List."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setzt en zufälliches Element an en List."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falsch"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Ist entweder woahr (true) orrer falsch (false)"; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "woahr"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://hrx.wikipedia.org/wiki/Vergleich_%28Zahlen%29"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Ist woahr (true) wenn beide Wearte identisch sind."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Ist woahr (true) wenn der erschte Weart grösser als der zwooite Weart ist."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Ist woahr (true) wenn der erschte Weart grösser als orrer gleich gross wie zwooite Weart ist."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Ist woahr (true) wenn der earschte Weart klener als der zwooite Weart ist."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Ist woahr (true) wenn der earscht Weart klener als orrer gleich gross wie zwooite Weart ist."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Ist woahr (true) wenn beide Wearte unnerschiedlich sind."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "net %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Ist woahr (true) wenn der Ingäweweart falsch (false) ist. Ist falsch (false) wenn der Ingäweweart woahr (true) ist."; +Blockly.Msg.LOGIC_NULL = "null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Is NULL."; +Blockly.Msg.LOGIC_OPERATION_AND = "und"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "orrer"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Ist woahr (true) wenn beide Wearte woahr (true) sind."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Ist woahr (true) wenn en von der beide Wearte woahr (true) ist."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "wenn falsch"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "wenn woahr"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Üwerprüft en Bedingung \"test\". Wenn die Bedingung woahr ist weerd der \"wenn woahr\" Weart zurückgeb, annerfalls der \"wenn falsch\" Weart"; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://hrx.wikipedia.org/wiki/Grundrechenoort"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Ist die Summe zwooier Wearte."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Ist der Quotient zwooier Wearte."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Ist die Differenz zwooier Wearte."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Ist das Produkt zwooier Wearte."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Ist der earschte Weart potenziert mit dem zoiten Weart."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://hrx.wikipedia.org/wiki/Inkrement_und_Dekrement"; +Blockly.Msg.MATH_CHANGE_TITLE = "mach höcher / erhöhe %1 um %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Addiert en Weart zur Variable \"%1\" hinzu."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://hrx.wikipedia.org/wiki/Mathematische_Konstante"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Mathematische Konstante wie: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) oder ∞ (unendlich)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "begrenze %1 von %2 bis %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Begrenzt den Weartebereich mittels von / bis Wearte. (inklusiv)"; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "ist telbar/kann getelt sin doorrich"; +Blockly.Msg.MATH_IS_EVEN = "ist grood"; +Blockly.Msg.MATH_IS_NEGATIVE = "ist negativ"; +Blockly.Msg.MATH_IS_ODD = "ist ungrood"; +Blockly.Msg.MATH_IS_POSITIVE = "ist positiv"; +Blockly.Msg.MATH_IS_PRIME = "ist en Primenzoohl"; +Blockly.Msg.MATH_IS_TOOLTIP = "Üwerprüft ob en Zoohl grood, ungrood, en Primenzoohl, ganzzoohlich, positiv, negativ orrer doorrich en zwooite Zoohl telbar ist. Gebt woahr (true) orrer falsch (false) zurück."; +Blockly.Msg.MATH_IS_WHOLE = "ganze Zoohl"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://hrx.wikipedia.org/wiki/Modulo"; +Blockly.Msg.MATH_MODULO_TITLE = "Rest von %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Der Rest noh en Division."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://hrx.wikipedia.org/wiki/Zoohl"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "En Zoohl."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "Mittelweart en List"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "Maximalweart en List"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "Median von en List"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "Minimalweart von en List"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "Restweart von en List"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "Zufallsweart von en List"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "Standart/Padrong Abweichung von en List"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "Summe von en List"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Ist der Doorrichschnittsweart von aller Wearte in en List."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Ist der grösste Weart in en List."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Ist der Zentralweart von aller Wearte in en List."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Ist der klenste Weart in en List."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Findt den am häifichste voarkommend Weart in en List. Falls ken Weart öftersch voarkomme als all annre, weard die originale List zurückgeche"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Geb en Zufallsweart aus der List zurück."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Ist die standartiesierte/padronisierte Standartabweichung/Padrongabweichung von aller Wearte in der List"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Ist die Summ aller Wearte in en List."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://hex.wikipedia.org/wiki/Zufallszoohle"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "Zufallszoohl (0.0 -1.0)"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Generier/erzeich en Zufallszoohl zwischich 0.0 (inklusiv) und 1.0 (exklusiv)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://hrx.wikipedia.org/wiki/Zufallszahlen"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "ganzoohlicher Zufallswearte zwischich %1 bis %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Generier/erzeich en ganzähliche Zufallsweart zwischich zwooi Wearte (inklusiv)."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://hrx.wikipedia.org/wiki/Runden"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "runde"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "ab runde"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "uff runde"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "En Zoohl uff orrer ab runde."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://hrx.wikipedia.org/wiki/Quadratwoorzel"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "Absolutweart"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "Quadratwoorzel"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Ist der Absolutweart von en Weart."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Ist Weart von der Exponentialfunktion von en Weart."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Ist der natüarliche Logarithmus von en Weart."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Ist der dekoodische Logarithmus von en Weart."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Negiert en Weart."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Rechnet 10 hoch Ingäbweart."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Ist die Qudratwoorzel von en Weart."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://hrx.wikipedia.org/wiki/Trigonometrie"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Ist der Arcuscosinus von en Ingabweart."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Ist der Arcussinus von en Ingäbweart."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Ist der Arcustangens von en Ingäbweart."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Ist der Cosinus von en Winkel."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Ist der Sinus von en Winkel."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Ist der Tangens von en Winkel."; +Blockly.Msg.NEW_VARIABLE = "Neie Variable..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Die neie Variable sei Noome:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "mit:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://hrx.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Ruf en Funktionsblock ohne Rückgäweart uff."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://hrx.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Ruf en Funktionsblock mit Rückgäbweart uff."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "mit:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Generier/erzeich \"Uffruf %1\""; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "Funktionsblock"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "zu"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "En Funktionsblock ohne Rückgäbweart."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "geb zurück"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "En Funktionsblock mit Rückgäbweart."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warnung: die Funktionsblock hot doppelt Parameter."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Markiear Funktionsblock"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Wenn der earste Weart woahr (true) ist, Geb den zwooite Weart zurück."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warnung: Der Block därref nuar innich en Funktionsblock genutzt sin."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Markiear Funktionsblock"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Generier/erzeich \"Uffruf %1\""; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Parameter"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Variable:"; +Blockly.Msg.REDO = "Redo"; // untranslated +Blockly.Msg.REMOVE_COMMENT = "Kommentar entferne"; +Blockly.Msg.RENAME_VARIABLE = "Die neie Variable sei Noome:"; +Blockly.Msg.RENAME_VARIABLE_TITLE = "All \"%1\" Variable umbenenne in:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "Text oonhänge"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "An"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Text an die Variable \"%1\" oonhänge."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "umwandle in klenbuchstoobe"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "umwandle in Wörter"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "umwandle in GROSSBUCHSTOOBE"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Wandelt Schreibweise von Texte um, in Grossbuchstoobe, Klenbuchstoobe orrer den earste Buchstoob von jedes Wort gross und die annre klen."; +Blockly.Msg.TEXT_CHARAT_FIRST = "hol earschte Buchstoob"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "hol Buchstoob # von End"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "hol Buchstoob #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in Text"; +Blockly.Msg.TEXT_CHARAT_LAST = "hol letztes Wort"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "hol zufälliches Buchstoob"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Extrahiear en Buchstoob von en spezifizierte Position."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "En Element zum Text hinzufüche."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "verbinne"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Hinzufüche, entfernne und sortiere von Elemente."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "bis #te Buchstoob von hinne"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "bis Buchstoob #te"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "bis letzte Buchstoob"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in Text"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "earschte Buchstoob"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "hol #te Buchstoob von hinne"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "hol substring Buchstoob #te"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Schickt en bestimmstes Tel von dem Text retuar."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "im Text"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "Such der Begriff sein earstes Voarkommniss"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "Suche der Begriff sein letztes Vorkommniss."; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Findt das earste / letzte Voarkommniss von en Suchbegriffes in enem Text. Gebt die Position von dem Begriff orrer %1 zurück."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ist leer?"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Ist woahr (true), wenn der Text leer ist."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "Erstell Text aus"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Erstellt en Text doorrich das verbinne von mehre Textelemente."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "läng %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Die Oonzoohl von Zeiche in enem Text. (inkl. Leerzeiche)"; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "Ausgäb %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Geb den Inhalt von en Variable aus."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Frocht den Benutzer noh en Zoohl."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Frocht den Benutzer noh enem Text."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Frächt noh Zoohl mit Hinweis"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Frocht noh Text mit Hinweis"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)https://hrx.wikipedia.org/wiki/Zeichenkette"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "En Buchstoob, Text orrer Satz."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "entfern Leerzeiche von Oonfang und End Seite"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "entferne Leerzeiche von Oonfang Seite"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "entferne Leerzeiche von End Seite von"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Entfernt Leerzeiche vom Oonfang und / orrer End von en Text."; +Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.UNDO = "Undo"; // untranslated +Blockly.Msg.VARIABLES_DEFAULT_NAME = "Element"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Generier/erzeiche \"Schreibe %1\""; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Gebt der Variable sein Weart zurück."; +Blockly.Msg.VARIABLES_SET = "Schreib %1 zu %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Generier/erzeich \"Lese %1\""; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Setzt en Variable sei Weart."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/hu.js b/src/opsoro/server/static/js/blockly/msg/js/hu.js new file mode 100644 index 0000000..c043390 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/hu.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.hu'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Megjegyzés hozzáadása"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Érték módosítása:"; +Blockly.Msg.CLEAN_UP = "Blokkok kiürítése"; +Blockly.Msg.COLLAPSE_ALL = "Blokkok összecsukása"; +Blockly.Msg.COLLAPSE_BLOCK = "Blokk összecsukása"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "szín 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "szín 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "arány"; +Blockly.Msg.COLOUR_BLEND_TITLE = "színkeverés"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Két színt kever össze a megadott arányban (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://hu.wikipedia.org/wiki/Szín"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Válassz színt a palettáról."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "véletlen szín"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Véletlenszerűen kiválasztott szín."; +Blockly.Msg.COLOUR_RGB_BLUE = "kék"; +Blockly.Msg.COLOUR_RGB_GREEN = "zöld"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "vörös"; +Blockly.Msg.COLOUR_RGB_TITLE = "Szín"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Szín előállítása a megadott vörös, zöld, és kék értékekkel. Minden értéknek 0 és 100 közé kell esnie."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "befejezi az ismétlést"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "folytatja a következővel"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Megszakítja az utasítást tartalmazó ciklust."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Kihagyja a ciklus további részét, és elölről kezdi a következő elemmel."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Figyelem: Ez a blokk csak cikluson belül használható."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "minden %1 elemre a %2 listában"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "A '%1' változó minden lépésben megkapja a lista adott elemének értékét, és végrehajt vele néhány utasítást."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "számolj %1 értékével %2 és %3 között %4 lépésközzel"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "A(z) '%1' változó felveszi a kezdőérték és a végérték közötti értékeket a meghatározott lépésközzel. Eközben a meghatározott blokkokat hajtja végre."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Feltétel hozzáadása a ha blokkhoz."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Végső feltétel hozzáadása a ha blokkhoz."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "A ha blokk testreszabásához bővítsd, töröld vagy rendezd át a részeit."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "különben"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "különben ha"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "ha"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Ha a kifejezés igaz, akkor végrehajtja az utasításokat."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Ha a kifejezés igaz, akkor végrehajtja az első utasításblokkot. Különben a második utasításblokk kerül végrehajtásra."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Ha az első kifejezés igaz, akkor végrehajtja az első utasításblokkot. Különben, ha a második kifejezés igaz, akkor végrehajtja a második utasítás blokkot."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Ha az első kifejezés igaz, akkor végrehajtjuk az első utasítás blokkot. Ha a második kifejezés igaz, akkor végrehajtjuk a második utasítás blokkot. Amennyiben egyik kifejezés sem igaz, akkor az utolsó utasítás blokk kerül végrehajtásra."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://hu.wikipedia.org/wiki/Ciklus_(programoz%C3%A1s)#Sz.C3.A1ml.C3.A1l.C3.B3s_.28FOR.29_ciklus"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = ""; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "ismételd %1 alkalommal"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Megadott kódrészlet ismételt végrehajtása."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ismételd amíg"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ismételd amíg"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Amíg a feltétel hamis, végrehajtja az utasításokat."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Amíg a feltétel igaz, végrehajtja az utasításokat."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Az összes %1 blokk törlése?"; +Blockly.Msg.DELETE_BLOCK = "Blokk törlése"; +Blockly.Msg.DELETE_VARIABLE = "A(z) „%1” változó törlése"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "A(z) „%2” változó %1 használatának törlése?"; +Blockly.Msg.DELETE_X_BLOCKS = "%1 blokk törlése"; +Blockly.Msg.DISABLE_BLOCK = "Blokk letiltása"; +Blockly.Msg.DUPLICATE_BLOCK = "Másolat"; +Blockly.Msg.ENABLE_BLOCK = "Blokk engedélyezése"; +Blockly.Msg.EXPAND_ALL = "Blokkok kibontása"; +Blockly.Msg.EXPAND_BLOCK = "Blokk kibontása"; +Blockly.Msg.EXTERNAL_INPUTS = "Külső kapcsolatok"; +Blockly.Msg.HELP = "Súgó"; +Blockly.Msg.INLINE_INPUTS = "Belső kapcsolatok"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "üres lista"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Elemeket nem tartalmazó üres listát ad eredményül"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "Lista készítés, elemek:"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Elem hozzáadása listához."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Listát készít a megadott elemekből."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "az első"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "a végétől számított"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "az elejétől számított"; +Blockly.Msg.LISTS_GET_INDEX_GET = "listából értéke"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "listából kivétele"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "az utolsó"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "bármely"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "listából törlése"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = "elemnek"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "A lista első elemét adja eredményül."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "A lista megadott sorszámú elemét adja eredményül."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "A lista utolsó elemét adja eredményül."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "A lista véletlenszerűen választott elemét adja eredményül."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Az első elem kivétele a listából."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "A megadott sorszámú elem kivétele a listából."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Az utolsó elem kivétele a listából."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Véletlenszerűen választott elem kivétele a listából."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Az első elem törlése a listából."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "A megadott sorszámú elem törlése a listából."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Az utolsó elem törlése a listából."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Véletlenszerűen választott elem törlése a listából."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "és a végétől számított"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "és az elejétől számított"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "és az utolsó"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "részlistája az első"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "részlistája a végétől számított"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "részlistája az elejétől számított"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "elem között"; +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "A lista adott részéről másolat."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 az utolsó elemet jelenti."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 az első elemet jelenti."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "listában első előfordulásaː"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "listában utolsó előfordulásaː"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "A megadott elem első vagy utolsó előfordulásával tér vissza. Ha nem talál ilyen elemet, akkor %1 a visszatérési érték."; +Blockly.Msg.LISTS_INLIST = "A(z)"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 üres lista?"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Az eredmény igaz, ha a lista nem tartalmaz elemeket."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "%1 lista hossza"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "A lista elemszámát adja eredményül."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "Lista készítése %1 elemet %2 alkalommal hozzáadva"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "A megadtott elem felhasználásával n elemű listát készít"; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "elemkéntː"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "listába szúrd be"; +Blockly.Msg.LISTS_SET_INDEX_SET = "listába állítsd be"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Beszúrás a lista elejére."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Beszúrás a megadott sorszámú elem elé a listában."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Beszúrás a lista végére."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Beszúrás véletlenszerűen választott elem elé a listában."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Az első elem cseréje a listában."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "A megadott sorszámú elem cseréje a listában."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Az utolsó elem cseréje a listában."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Véletlenszerűen választott elem cseréje a listában."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "növekvő"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "csökkenő"; +Blockly.Msg.LISTS_SORT_TITLE = "%1 %2 %3 rendezés"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Egy lista egy másolatának rendezése."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "betűrendben nagybetű figyelmen kívül hagyásával"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numerikus"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "betűrendben"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "lista készítése szövegből"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "sztring készítése listából"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "A lista elemeit összefűzi szöveggé a határoló karaktereket is felhasználva."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Listát készít a határoló karaktereknél törve a szöveget."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "határoló karakter"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "hamis"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Igaz, vagy hamis érték"; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "igaz"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://hu.wikipedia.org/wiki/Egyenl%C5%91tlens%C3%A9g"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Igaz, ha a kifejezés két oldala egyenlő."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Igaz, ha a bal oldali kifejezés nagyobb, mint a jobb oldali."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Igaz, ha a bal oldali kifejezés nagyobb vagy egyenlő, mint a jobb oldali."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Igaz, ha a bal oldali kifejezés kisebb, mint a jobb oldali."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Igaz, ha a bal oldali kifejezés kisebb vagy egyenlő, mint a jobb oldali."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Igaz, ha a kifejezés két oldala nem egyenlő.."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "nem %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Igaz, ha a kifejezés hamis. Hamis, ha a kifejezés igaz."; +Blockly.Msg.LOGIC_NULL = "null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "null érték."; +Blockly.Msg.LOGIC_OPERATION_AND = "és"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "vagy"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Igaz, ha mindkét kifejezés igaz."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Igaz, ha legalább az egyik kifejezés igaz."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "vizsgáld meg:"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "érték, ha hamis:"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "érték, ha igaz:"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Kiértékeli a megvizsgálandó kifejezést. Ha a kifejezés igaz, visszatér az \"érték, ha igaz\" értékkel, különben az \"érték, ha hamis\" értékkel."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://hu.wikipedia.org/wiki/Matematikai_m%C5%B1velet"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Két szám összege."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Két szám hányadosa."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Két szám különbsége."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Két szám szorzata."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Az első számnak a második számmal megegyező hatványa."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://hu.wikipedia.org/wiki/JavaScript#Aritmetikai_oper.C3.A1torok"; +Blockly.Msg.MATH_CHANGE_TITLE = "növeld %1 értékét %2 -vel"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "A \"%1\" változó értékének növelése egy számmal."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://hu.wikipedia.org/wiki/Matematikai_konstans"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Ismert matematikai konstans: π (3.141…), e (2.718…), φ (1.618…), gyök(2) (1.414…), gyök(½) (0.707…), vagy ∞ (végtelen)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "korlátozd %1-t %2 és %3 közé"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Egy változó értékének korlátozása a megadott zárt intervallumra."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "-nek osztója"; +Blockly.Msg.MATH_IS_EVEN = "páros"; +Blockly.Msg.MATH_IS_NEGATIVE = "negatív"; +Blockly.Msg.MATH_IS_ODD = "páratlan"; +Blockly.Msg.MATH_IS_POSITIVE = "pozitív"; +Blockly.Msg.MATH_IS_PRIME = "prím"; +Blockly.Msg.MATH_IS_TOOLTIP = "Ellenőrzi, hogy a szám páros, páratlan, prím, egész, pozitív vagy negatív-e, illetve osztható-e a másodikkal. Igaz, vagy hamis értéket ad eredményül."; +Blockly.Msg.MATH_IS_WHOLE = "egész"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://hu.wikipedia.org/wiki/Eg%C3%A9szr%C3%A9sz#Als.C3.B3_eg.C3.A9szr.C3.A9sz"; +Blockly.Msg.MATH_MODULO_TITLE = "%1 ÷ %2 maradéka"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Az egész osztás maradékát adja eredméynül."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://hu.wikipedia.org/wiki/Sz%C3%A1m"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Egy szám."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "lista elemeinek átlaga"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "lista legnagyobb eleme"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "lista mediánja"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "lista legkisebb eleme"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "lista módusza"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "lista véletlen eleme"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "lista elemeinek szórása"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "lista elemeinek összege"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "A lista elemeinek átlagát adja eredményül."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "A lista legnagyobb elemét adja vissza."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "A lista elemeinek mediánját adja eredményül."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "A lista legkisebb elemét adja vissza."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "A lista elemeinek móduszát adja eredményül."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "A lista egy véletlen elemét adja eredményül."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "A lista elemeinek szórását adja eredményül."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "A lista elemeinek összegét adja eredményül."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://hu.wikipedia.org/wiki/V%C3%A9letlen"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "véletlen tört"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Véletlen tört érték 0.0 és 1.0 között."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://hu.wikipedia.org/wiki/V%C3%A9letlen"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "véletlen egész szám %1 között %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Véletlen egész szám a megadott zárt intervallumon belül."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://hu.wikipedia.org/wiki/Eg%C3%A9szr%C3%A9sz#Kerek.C3.ADt.C3.A9s"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "kerekítsd"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "kerekítsd lefelé"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "kerekítsd felfelé"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Egy szám kerekítése felfelé vagy lefelé."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://hu.wikipedia.org/wiki/Gy%C3%B6kvon%C3%A1s"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "abszolútérték"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "négyzetgyök"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "A szám abszolútértéke."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Az e megadott számú hatványa."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "A szám természetes alapú logaritmusa."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "A szám 10-es alapú logaritmusa."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "A szám -1 szerese."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "A 10 megadott számú hatványa."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "A szám négyzetgyöke."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://hu.wikipedia.org/wiki/Sz%C3%B6gf%C3%BCggv%C3%A9nyek"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "A fokban megadott szög arkusz koszinusz értéke."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "A fokban megadott szög arkusz szinusz értéke."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "A fokban megadott szög arkusz tangens értéke."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "A fokban megadott szög koszinusz értéke."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "A fokban megadott szög szinusz értéke."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "A fokban megadott szög tangens értéke."; +Blockly.Msg.NEW_VARIABLE = "Változó létrehozása…"; +Blockly.Msg.NEW_VARIABLE_TITLE = "Az új változó neve:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "."; +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "utasítások engedélyezése"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "paraméterlistaː"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://hu.wikipedia.org/wiki/F%C3%BCggv%C3%A9ny_(programoz%C3%A1s)"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Végrehajtja az eljárást."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://hu.wikipedia.org/wiki/F%C3%BCggv%C3%A9ny_(programoz%C3%A1s)"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Meghívja a függvényt."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "paraméterlistaː"; +Blockly.Msg.PROCEDURES_CREATE_DO = "„%1” létrehozása"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Írj erről a funkcióról..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "név"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "Eljárás"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Eljárás (nem ad vissza eredményt)."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "eredménye"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Függvény eredménnyel."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Figyelem: Az eljárásban azonos elnevezésű paramétert adtál meg."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Függvénydefiníció kiemelése"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Ha az érték igaz, akkor visszatér a függvény értékével."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Figyelem: Ez a blokk csak függvénydefiníción belül használható."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "változó:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Bemenet hozzáadása a függvényhez."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "paraméterek"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Bemenetek hozzáadása, eltávolítása vagy átrendezése ehhez a függvényhez."; +Blockly.Msg.REDO = "Újra"; +Blockly.Msg.REMOVE_COMMENT = "Megjegyzés törlése"; +Blockly.Msg.RENAME_VARIABLE = "Változó átnevezése..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Minden \"%1\" változó átnevezése erre:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "szövegéhez fűzd hozzá"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "A"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Szöveget fűz a \"%1\" változó értékéhez."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "kisbetűs"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "Címként Formázott"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "NAGYBETŰS"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; +Blockly.Msg.TEXT_CHARAT_FIRST = "első"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "hátulról"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "elölről"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "A"; +Blockly.Msg.TEXT_CHARAT_LAST = "utolsó"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "véletlen"; +Blockly.Msg.TEXT_CHARAT_TAIL = "karaktere"; +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "A szöveg egy megadott karakterét adja eredményül."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Elem hozzáfűzése a szöveghez."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "fűzd össze"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Összefűzéssel, törléssel vagy rendezéssel kapcsolato sblokkok szöveg szerkesztéséhez."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "betűtől a hátulról számított"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "betűtől a(z)"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "betűtől az utolsó"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "a"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "szövegben válaszd ki az első"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "szövegben válaszd ki a hátulról a(z)"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "szövegben válaszd ki a(z)"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = "betűig tartó betűsort"; +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "A megadott szövegrészletet adja eredményül."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "A(z)"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "szövegben az első előfordulásának helye"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "szövegben az utolsó előfordulásának helye"; +Blockly.Msg.TEXT_INDEXOF_TAIL = "szövegnek"; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "A keresett szöveg első vagy utolsó előfordulásával tér vissza. %1 esetén a szövegrészlet nem található."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 üres"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Igaz, ha a vizsgált szöveg hossza 0."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "fűzd össze"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Tetszőleges számú szövegrészletet fűz össze egybefüggő szöveggé."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "%1 hossza"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "A megadott szöveg karaktereinek számát adja eredményül (beleértve a szóközöket)."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "Üzenet %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Megejelníti a megadott kaakterláncot üzenetként a képernyőn."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Számot kér be a felhasználótól."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Szöveget kér be a felhasználótól."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Kérj be számot"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Kérj be szöveget"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://hu.wikipedia.org/wiki/String"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Egy betű, szó vagy szöveg egy sora."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "szóközök levágása mindkét végéről"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "szóközök levágása az elejéről"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "szóközök levágása a végéről"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Levágja a megadott szöveg végeiről a szóközöket."; +Blockly.Msg.TODAY = "Ma"; +Blockly.Msg.UNDO = "Visszavonás"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "változó"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Készíts \"%1=\""; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "A változó értékét adja eredményül."; +Blockly.Msg.VARIABLES_SET = "%1 %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Készíts \"%1\""; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "A változónak adhatunk értéket."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A(z) „%1” nevű változó már létezik."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/ia.js b/src/opsoro/server/static/js/blockly/msg/js/ia.js new file mode 100644 index 0000000..0bb9ad5 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/ia.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.ia'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Adder commento"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Cambiar valor:"; +Blockly.Msg.CLEAN_UP = "Clarar le blocos"; +Blockly.Msg.COLLAPSE_ALL = "Plicar blocos"; +Blockly.Msg.COLLAPSE_BLOCK = "Plicar bloco"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "color 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "color 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "ration"; +Blockly.Msg.COLOUR_BLEND_TITLE = "miscer"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Misce duo colores con un ration specificate (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ia.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Elige un color del paletta."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "color aleatori"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Eliger un color al hasardo."; +Blockly.Msg.COLOUR_RGB_BLUE = "blau"; +Blockly.Msg.COLOUR_RGB_GREEN = "verde"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "rubie"; +Blockly.Msg.COLOUR_RGB_TITLE = "colorar con"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Crear un color con le quantitate specificate de rubie, verde e blau. Tote le valores debe esser inter 0 e 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "escappar del bucla"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continuar con le proxime iteration del bucla"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Escappar del bucla continente."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Saltar le resto de iste bucla e continuar con le proxime iteration."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Attention: Iste bloco pote solmente esser usate in un bucla."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "pro cata elemento %1 in lista %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Pro cata elemento in un lista, mitter lo in le variabile '%1' e exequer certe instructiones."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "contar con %1 de %2 a %3 per %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Mitter in le variabile '%1' le valores ab le numero initial usque al numero final, con passos secundo le intervallo specificate, e exequer le blocos specificate."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Adder un condition al bloco \"si\"."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Adder un condition final de reserva al bloco \"si\"."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Adde, remove o reordina sectiones pro reconfigurar iste bloco \"si\"."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "si non"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "si non si"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "si"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Si un valor es ver, exequer certe instructiones."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Si un valor es ver, exequer le prime bloco de instructiones. Si non, exequer le secunde bloco de instructiones."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Si le prime valor es ver, exequer le prime bloco de instructiones. Si non, si le secunde valor es ver, exequer le secunde bloco de instructiones."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Si le prime valor es ver, exequer le prime bloco de instructiones. Si non, si le secunde valor es ver, exequer le secunde bloco de instructiones. Si necun del valores es ver, exequer le ultime bloco de instructiones."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "face"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "repeter %1 vices"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Exequer certe instructiones plure vices."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repeter usque a"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repeter durante que"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Durante que un valor es false, exequer certe instructiones."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Durante que un valor es ver, exequer certe instructiones."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Deler tote le %1 blocos?"; +Blockly.Msg.DELETE_BLOCK = "Deler bloco"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "Deler %1 blocos"; +Blockly.Msg.DISABLE_BLOCK = "Disactivar bloco"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplicar"; +Blockly.Msg.ENABLE_BLOCK = "Activar bloco"; +Blockly.Msg.EXPAND_ALL = "Displicar blocos"; +Blockly.Msg.EXPAND_BLOCK = "Displicar bloco"; +Blockly.Msg.EXTERNAL_INPUTS = "Entrata externe"; +Blockly.Msg.HELP = "Adjuta"; +Blockly.Msg.INLINE_INPUTS = "Entrata interne"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "crear un lista vacue"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Retorna un lista, de longitude 0, sin datos."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Adde, remove o reordina sectiones pro reconfigurar iste bloco de listas."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "crear lista con"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Adder un elemento al lista."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Crear un lista con un numero qualcunque de elementos."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "prime"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "№ ab fin"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "prender"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "prender e remover"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "ultime"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aleatori"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "remover"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Retorna le prime elemento in un lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Retorna le elemento presente al position specificate in un lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Retorna le ultime elemento in un lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Retorna un elemento aleatori in un lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Remove e retorna le prime elemento in un lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Remove e retorna le elemento presente al position specificate in un lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Remove e retorna le ultime elemento in un lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Remove e retorna un elemento aleatori in un lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Remove le prime elemento in un lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Remove le elemento presente al position specificate in un lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Remove le ultime elemento in un lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Remove un elemento aleatori in un lista."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "usque al № ab fin"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "usque al №"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "usque al ultime"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "prender sublista ab initio"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "prender sublista ab le fin ab №"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "prender sublista ab №"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crea un copia del parte specificate de un lista."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "№ %1 es le ultime elemento."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "№ %1 es le prime elemento."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "cercar le prime occurrentia del elemento"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "cercar le ultime occurrentia del elemento"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna le indice del prime/ultime occurrentia del elemento in le lista. Retorna %1 si le elemento non es trovate."; +Blockly.Msg.LISTS_INLIST = "in lista"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 es vacue"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Retorna ver si le lista es vacue."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "longitude de %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Retorna le longitude de un lista."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "crear lista con elemento %1 repetite %2 vices"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Crea un lista que contine le valor fornite, repetite le numero specificate de vices."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "a"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "inserer in"; +Blockly.Msg.LISTS_SET_INDEX_SET = "mitter"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Insere le elemento al initio de un lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Insere le elemento al position specificate in un lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Adjunge le elemento al fin de un lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Insere le elemento a un position aleatori in un lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Defini le valor del prime elemento in un lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Defini le valor del elemento al position specificate in un lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Defini le valor del ultime elemento in un lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Defini le valor de un elemento aleatori in un lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascendente"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descendente"; +Blockly.Msg.LISTS_SORT_TITLE = "ordinamento %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Ordinar un copia de un lista."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignorar majuscula/minuscula"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Crear un lista per un texto"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "crear un texto per un lista"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Unir un lista de textos, separate per un delimitator, in un sol texto."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Divider texto in un lista de textos, separante lo a cata delimitator."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "con delimitator"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "false"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Retorna o ver o false."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "ver"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Retornar ver si le duo entratas es equal."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Retornar ver si le prime entrata es major que le secunde."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Retornar ver si le prime entrata es major que o equal al secunde."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Retornar ver si le prime entrata es minor que le secunde."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Retornar ver si le prime entrata es minor que o equal al secunde."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Retornar ver si le duo entratas non es equal."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "non %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Retornar ver si le entrata es false. Retornar false si le entrata es ver."; +Blockly.Msg.LOGIC_NULL = "nulle"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Retorna nulle."; +Blockly.Msg.LOGIC_OPERATION_AND = "e"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "o"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Retornar ver si ambe entratas es ver."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Retornar ver si al minus un del entratas es ver."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "si false"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "si ver"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Verificar le condition in 'test'. Si le condition es ver, retorna le valor de 'si ver'; si non, retorna le valor de 'si false'."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ia.wikipedia.org/wiki/Arithmetica"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Retornar le summa del duo numeros."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Retornar le quotiente del duo numeros."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Retornar le differentia del duo numeros."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Retornar le producto del duo numeros."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Retornar le prime numero elevate al potentia del secunde numero."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg.MATH_CHANGE_TITLE = "cambiar %1 per %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Adder un numero al variabile '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Retornar un del constantes commun: π (3,141…), e (2,718…), φ (1,618…), sqrt(2) (1,414…), sqrt(½) (0,707…) o ∞ (infinite)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "limitar %1 inter %2 e %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Limitar un numero a esser inter le limites specificate (incluse)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "es divisibile per"; +Blockly.Msg.MATH_IS_EVEN = "es par"; +Blockly.Msg.MATH_IS_NEGATIVE = "es negative"; +Blockly.Msg.MATH_IS_ODD = "es impare"; +Blockly.Msg.MATH_IS_POSITIVE = "es positive"; +Blockly.Msg.MATH_IS_PRIME = "es prime"; +Blockly.Msg.MATH_IS_TOOLTIP = "Verificar si un numero es par, impare, prime, integre, positive, negative, o divisibile per un certe numero. Retorna ver o false."; +Blockly.Msg.MATH_IS_WHOLE = "es integre"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated +Blockly.Msg.MATH_MODULO_TITLE = "resto de %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Retornar le resto del division del duo numeros."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://ia.wikipedia.org/wiki/Numero"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un numero."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "media del lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maximo del lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana del lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimo del lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modas del lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "elemento aleatori del lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "deviation standard del lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "summa del lista"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Retornar le media arithmetic del valores numeric in le lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Retornar le numero le plus grande in le lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Retornar le numero median del lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Retornar le numero le plus parve in le lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Retornar un lista del elemento(s) le plus commun in le lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Retornar un elemento aleatori del lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Retornar le deviation standard del lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Retornar le summa de tote le numeros in le lista."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "fraction aleatori"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Retornar un fraction aleatori inter 0.0 (incluse) e 1.0 (excluse)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_TITLE = "numero integre aleatori inter %1 e %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Retornar un numero integre aleatori inter le duo limites specificate, incluse."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://ia.wikipedia.org/wiki/Rotundamento"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arrotundar"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arrotundar a infra"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arrotundar a supra"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Arrotundar un numero a supra o a infra."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://ia.wikipedia.org/wiki/Radice_quadrate"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolute"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "radice quadrate"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Retornar le valor absolute de un numero."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Retornar e elevate al potentia del numero."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Retornar le logarithmo natural de un numero."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Retornar le logarithmo in base 10 del numero."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Retornar le negation de un numero."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Retornar 10 elevate al potentia de un numero."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Retornar le radice quadrate de un numero."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Retornar le arcocosino de un numero."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Retornar le arcosino de un numero."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Retornar le arcotangente de un numero."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Retornar le cosino de un grado (non radiano)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Retornar le sino de un grado (non radiano)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Retornar le tangente de un grado (non radiano)."; +Blockly.Msg.NEW_VARIABLE = "Nove variabile..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nomine del nove variabile:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "permitter declarationes"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "con:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Executar le function '%1' definite per le usator."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Executar le function '%1' definite per le usator e usar su resultato."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "con:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Crear '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe iste function..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "facer qualcosa"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "pro"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crea un function que non retorna un valor."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "retornar"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crea un function que retorna un valor."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Attention: Iste function ha parametros duplicate."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Accentuar le definition del function"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Si un valor es ver, alora retornar un secunde valor."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Attention: Iste bloco pote solmente esser usate in le definition de un function."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nomine del entrata:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Adder un entrata al function."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entratas"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Adder, remover o reordinar le entratas pro iste function."; +Blockly.Msg.REDO = "Refacer"; +Blockly.Msg.REMOVE_COMMENT = "Remover commento"; +Blockly.Msg.RENAME_VARIABLE = "Renominar variabile..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Renominar tote le variabiles '%1' a:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "adjunger texto"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "a"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Adjunger un texto al variabile '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "in minusculas"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "con Initiales Majuscule"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "in MAJUSCULAS"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Retornar un copia del texto con differente majusculas/minusculas."; +Blockly.Msg.TEXT_CHARAT_FIRST = "prender le prime littera"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "prender ab le fin le littera №"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "prender le littera №"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in le texto"; +Blockly.Msg.TEXT_CHARAT_LAST = "prender le ultime littera"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "prender un littera aleatori"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Retorna le littera presente al position specificate."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Adder un elemento al texto."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "unir"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Adde, remove o reordina sectiones pro reconfigurar iste bloco de texto."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "ab le fin usque al littera №"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "usque al littera №"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "usque al ultime littera"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in le texto"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "prender subcatena ab le prime littera"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "prender subcatena ab le fin ab le littera №"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "prender subcatena ab le littera №"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Retorna le parte specificate del texto."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in le texto"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "cercar le prime occurrentia del texto"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "cercar le ultime occurrentia del texto"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna le indice del prime/ultime occurrentia del prime texto in le secunde texto. Retorna %1 si le texto non es trovate."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 es vacue"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Retorna ver si le texto fornite es vacue."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "crear texto con"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Crear un pecia de texto uniente un certe numero de elementos."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "longitude de %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Retorna le numero de litteras (incluse spatios) in le texto fornite."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "scriber %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Scriber le texto, numero o altere valor specificate."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Peter un numero al usator."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Peter un texto al usator."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "peter un numero con le message"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "peter un texto con le message"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Un littera, parola o linea de texto."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "remover spatios de ambe lateres de"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "remover spatios del sinistre latere de"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "remover spatios del dextre latere de"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Retornar un copia del texto con spatios eliminate de un extremitate o ambes."; +Blockly.Msg.TODAY = "Hodie"; +Blockly.Msg.UNDO = "Disfacer"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "cosa"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crea 'mitter %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Retorna le valor de iste variabile."; +Blockly.Msg.VARIABLES_SET = "mitter %1 a %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Crear 'prender %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Mitte iste variabile al valor del entrata."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/id.js b/src/opsoro/server/static/js/blockly/msg/js/id.js new file mode 100644 index 0000000..83ad325 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/id.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.id'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Tambahkan Komentar"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Ubah nilai:"; +Blockly.Msg.CLEAN_UP = "Bersihkan Blok"; +Blockly.Msg.COLLAPSE_ALL = "Ciutkan Blok"; +Blockly.Msg.COLLAPSE_BLOCK = "Ciutkan Blok"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "warna 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "warna 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "rasio"; +Blockly.Msg.COLOUR_BLEND_TITLE = "campur"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Campur dua warna secara bersamaan dengan perbandingan (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Pilih warna dari daftar warna."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "Warna acak"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Pilih warna secara acak."; +Blockly.Msg.COLOUR_RGB_BLUE = "biru"; +Blockly.Msg.COLOUR_RGB_GREEN = "hijau"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "merah"; +Blockly.Msg.COLOUR_RGB_TITLE = "Dengan warna"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Buatlah warna dengan jumlah yang ditentukan dari merah, hijau dan biru. Semua nilai harus antarai 0 sampai 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "keluar dari perulangan"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "lanjutkan dengan langkah perulangan berikutnya"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Keluar dari perulangan."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Abaikan sisa dari perulangan ini, dan lanjutkan dengan langkah berikutnya."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Peringatan: Blok ini hanya dapat digunakan dalam perulangan."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "untuk setiap item %1 di dalam list %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Untuk tiap-tiap item di dalam list, tetapkan variabel '%1' ke dalam item, selanjutnya kerjakan beberapa statement."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "Cacah dengan %1 dari %2 ke %3 dengan step / penambahan %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Menggunakan variabel \"%1\" dengan mengambil nilai dari batas awal hingga ke batas akhir, dengan interval tertentu, dan mengerjakan block tertentu."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Tambahkan prasyarat ke dalam blok IF."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Terakhir, tambahkan kondisi tangkap-semua kedalam blok IF."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Tambahkan, hapus, atau susun kembali bagian untuk mengkonfigurasi blok IF ini."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "lainnya"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "atau jika"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "jika"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Jika nilainya benar, maka lakukan beberapa perintah."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Jika nilainya benar, maka kerjakan perintah blok pertama. Jika tidak, kerjakan perintah blok kedua."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Jika nilai pertama benar, maka kerjakan perintah blok pertama. Sebaliknya, jika nilai kedua benar, kerjakan perintah blok kedua."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Jika nilai pertama benar, maka kerjakan perintah blok pertama. Sebaliknya, jika nilai kedua benar, kerjakan perintah blok kedua. Jika dua-duanya tidak benar, kerjakan perintah blok terakhir."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "kerjakan"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "ulangi %1 kali"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Lakukan beberapa perintah beberapa kali."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ulangi sampai"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ulangi jika"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Selagi nilainya salah, maka lakukan beberapa perintah."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Selagi nilainya benar, maka lakukan beberapa perintah."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Hapus semua %1 blok?"; +Blockly.Msg.DELETE_BLOCK = "Hapus Blok"; +Blockly.Msg.DELETE_VARIABLE = "Hapus variabel '%1'"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Hapus %1 yang digunakan pada variabel '%2'?"; +Blockly.Msg.DELETE_X_BLOCKS = "Hapus %1 Blok"; +Blockly.Msg.DISABLE_BLOCK = "Nonaktifkan Blok"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplikat"; +Blockly.Msg.ENABLE_BLOCK = "Aktifkan Blok"; +Blockly.Msg.EXPAND_ALL = "Kembangkan Blok"; +Blockly.Msg.EXPAND_BLOCK = "Kembangkan Blok"; +Blockly.Msg.EXTERNAL_INPUTS = "Input Eksternal"; +Blockly.Msg.HELP = "Bantuan"; +Blockly.Msg.INLINE_INPUTS = "Input Inline"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "buat list kosong"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Kembalikan list, dengan panjang 0, tidak berisi data"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "list"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Tambahkan, hapus, atau susun ulang bagian untuk mengkonfigurasi blok list ini."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "buat list dengan"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Tambahkan sebuah item ke list."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Buat sebuah list dengan sejumlah item."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "pertama"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# dari akhir"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "dapatkan"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "dapatkan dan hapus"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "terakhir"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "acak"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "Hapus"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Kembalikan item pertama dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Kembalikan item di posisi tertentu dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Kembalikan item terakhir dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Kembalikan item acak dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Hapus dan kembalikan item pertama dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Hapus dan kembalikan item di posisi tertentu dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Hapus dan kembalikan item terakhir dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Hapus dan kembalikan item acak dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Hapus item pertama dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Hapus item di posisi tertentu dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Hapus item terakhir dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Hapus sebuah item acak dalam list."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "ke # dari akhir"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "ke #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "ke yang paling akhir"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "dapatkan sub-list dari pertama"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "dapatkan sub-list dari nomor # dari akhir"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "dapatkan sub-list dari #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Buat salinan bagian tertentu dari list."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 adalah item terakhir."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 adalah item pertama."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "cari kejadian pertama item"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "cari kejadian terakhir item"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Kembalikan indeks dari item pertama/terakhir kali muncul dalam list. Kembalikan %1 jika item tidak ditemukan."; +Blockly.Msg.LISTS_INLIST = "dalam list"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 kosong"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Kembalikan benar jika list kosong."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "panjang dari %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Kembalikan panjang list."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "buat list dengan item %1 diulang %2 kali"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Buat sebuah list yang terdiri dari nilai yang diberikan diulang sebanyak jumlah yang ditentukan."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "sebagai"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "sisipkan di"; +Blockly.Msg.LISTS_SET_INDEX_SET = "tetapkan"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Sisipkan item di bagian awal dari list."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Sisipkan item ke dalam posisi yang telah ditentukan di dalam list."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Tambahkan item ke bagian akhir list."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Sisipkan item secara acak ke dalam list."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Tetapkan item pertama di dalam list."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Tetapkan item ke dalam posisi yang telah ditentukan di dalam list."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Menetapkan item terakhir dalam list."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Tetapkan secara acak sebuah item dalam list."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "menaik"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "menurun"; +Blockly.Msg.LISTS_SORT_TITLE = "urutkan %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Urutkan salinan dari daftar"; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "sesuai abjad, abaikan kasus"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "sesuai nomor"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "sesuai abjad"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "buat list dari teks"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "buat teks dari list"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Gabung daftar teks menjadi satu teks, yang dipisahkan oleh pembatas."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Membagi teks ke dalam daftar teks, pisahkan pada setiap pembatas."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "dengan pembatas"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "salah"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Kembalikan benar atau salah."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "benar"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Kembalikan benar jika kedua input sama satu dengan lainnya."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Kembalikan benar jika input pertama lebih besar dari input kedua."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Kembalikan benar jika input pertama lebih besar dari atau sama dengan input kedua."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Kembalikan benar jika input pertama lebih kecil dari input kedua."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Kembalikan benar jika input pertama lebih kecil atau sama dengan input kedua ."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Kembalikan benar jika kedua input tidak sama satu dengan lainnya."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "bukan (not) %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Kembalikan benar jika input salah. Kembalikan salah jika input benar."; +Blockly.Msg.LOGIC_NULL = "null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Kembalikan null."; +Blockly.Msg.LOGIC_OPERATION_AND = "dan"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "atau"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Kembalikan benar jika kedua input adalah benar."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Kembalikan benar jika minimal satu input nilainya benar."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "jika salah"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "jika benar"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Periksa kondisi di 'test'. Jika kondisi benar, kembalikan nilai 'if true'; jika sebaliknya kembalikan nilai 'if false'."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://id.wikipedia.org/wiki/Aritmetika"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Kembalikan jumlah dari kedua angka."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Kembalikan hasil bagi dari kedua angka."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Kembalikan selisih dari kedua angka."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Kembalikan perkalian dari kedua angka."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Kembalikan angka pertama pangkat angka kedua."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "ubah %1 oleh %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Tambahkan angka kedalam variabel '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Kembalikan salah satu konstanta: π (3,141…), e (2,718…), φ (1,618…), akar(2) (1,414…), akar(½) (0.707…), atau ∞ (tak terhingga)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "Batasi %1 rendah %2 tinggi %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Batasi angka antara batas yang ditentukan (inklusif)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "dapat dibagi oleh"; +Blockly.Msg.MATH_IS_EVEN = "adalah bilangan genap"; +Blockly.Msg.MATH_IS_NEGATIVE = "adalah bilangan negatif"; +Blockly.Msg.MATH_IS_ODD = "adalah bilangan ganjil"; +Blockly.Msg.MATH_IS_POSITIVE = "adalah bilangan positif"; +Blockly.Msg.MATH_IS_PRIME = "adalah bilangan pokok"; +Blockly.Msg.MATH_IS_TOOLTIP = "Periksa apakah angka adalah bilangan genap, bilangan ganjil, bilangan pokok, bilangan bulat, bilangan positif, bilangan negatif, atau apakan bisa dibagi oleh angka tertentu. Kembalikan benar atau salah."; +Blockly.Msg.MATH_IS_WHOLE = "adalah bilangan bulat"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "sisa dari %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Kembalikan sisa dari pembagian ke dua angka."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Suatu angka."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "rata-rata dari list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maksimum dari list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "median dari list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimum dari list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "mode-mode dari list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "item acak dari list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "deviasi standar dari list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "jumlah dari list"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Kembalikan rata-rata (mean aritmetik) dari nilai numerik dari list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Kembalikan angka terbesar dari list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Kembalikan median dari list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Kembalikan angka terkecil dari list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Kembalikan list berisi item yang paling umum dari dalam list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Kembalikan elemen acak dari list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Kembalikan standard deviasi dari list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Kembalikan jumlah dari seluruh bilangan dari list."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "nilai pecahan acak"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Kembalikan nilai pecahan acak antara 0.0 (inklusif) dan 1.0 (eksklusif)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "acak bulat dari %1 sampai %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Kembalikan bilangan acak antara dua batas yang ditentukan, inklusif."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "membulatkan"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "membulatkan kebawah"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "membulatkan keatas"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Bulatkan suatu bilangan naik atau turun."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "mutlak"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "akar"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Kembalikan nilai absolut angka."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Kembalikan 10 pangkat angka."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Kembalikan logaritma natural dari angka."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Kembalikan dasar logaritma 10 dari angka."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Kembalikan penyangkalan terhadap angka."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Kembalikan 10 pangkat angka."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Kembalikan akar dari angka."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "acos"; +Blockly.Msg.MATH_TRIG_ASIN = "asin"; +Blockly.Msg.MATH_TRIG_ATAN = "atan"; +Blockly.Msg.MATH_TRIG_COS = "cos"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; +Blockly.Msg.MATH_TRIG_TAN = "tan"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Kembalikan acosine dari angka."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Kembalikan asin dari angka."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Kembalikan atan dari angka."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Kembalikan cosinus dari derajat (bukan radian)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Kembalikan sinus dari derajat (bukan radian)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Kembalikan tangen dari derajat (bukan radian)."; +Blockly.Msg.NEW_VARIABLE = "Buat variabel..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nama variabel baru:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "memungkinkan pernyataan"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "dengan:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Menjalankan fungsi '%1' yang ditetapkan pengguna."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Menjalankan fungsi '%1' yang ditetapkan pengguna dan menggunakan outputnya."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "dengan:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Buat '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Jelaskan fungsi ini..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "buat sesuatu"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "untuk"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Buat sebuah fungsi tanpa output."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "kembali"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Buat sebuah fungsi dengan satu output."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Peringatan: Fungsi ini memiliki parameter duplikat."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Sorot definisi fungsi"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Jika nilai yang benar, kemudian kembalikan nilai kedua."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Peringatan: Blok ini dapat digunakan hanya dalam definisi fungsi."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "masukan Nama:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Tambahkan masukan ke fungsi."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "input"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Menambah, menghapus, atau menyusun ulang masukan untuk fungsi ini."; +Blockly.Msg.REDO = "Lakukan ulang"; +Blockly.Msg.REMOVE_COMMENT = "Hapus Komentar"; +Blockly.Msg.RENAME_VARIABLE = "Ubah nama variabel..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Ubah nama semua variabel '%1' menjadi:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "tambahkan teks"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "untuk"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Tambahkan beberapa teks ke variabel '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "menjadi huruf kecil"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "menjadi huruf pertama kapital"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "menjadi huruf kapital"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Kembalikan kopi dari text dengan kapitalisasi yang berbeda."; +Blockly.Msg.TEXT_CHARAT_FIRST = "ambil huruf pertama"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "ambil huruf nomor # dari belakang"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "ambil huruf ke #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "dalam teks"; +Blockly.Msg.TEXT_CHARAT_LAST = "ambil huruf terakhir"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "ambil huruf secara acak"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Kembalikan karakter dari posisi tertentu."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Tambahkan suatu item ke dalam teks."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "join"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Tambah, ambil, atau susun ulang teks blok."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "pada huruf nomer # dari terakhir"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "pada huruf #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "pada huruf terakhir"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in teks"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "ambil bagian teks (substring) dari huruf pertama"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "ambil bagian teks (substring) dari huruf ke # dari terakhir"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "ambil bagian teks (substring) dari huruf no #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Kembalikan spesifik bagian dari teks."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "dalam teks"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "temukan kejadian pertama dalam teks"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "temukan kejadian terakhir dalam teks"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Kembalikan indeks pertama dan terakhir dari kejadian pertama/terakhir dari teks pertama dalam teks kedua. Kembalikan %1 jika teks tidak ditemukan."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 kosong"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Kembalikan benar jika teks yang disediakan kosong."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "buat teks dengan"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Buat teks dengan cara gabungkan sejumlah item."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "panjang dari %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Kembalikan sejumlah huruf (termasuk spasi) dari teks yang disediakan."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "cetak %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Cetak teks yant ditentukan, angka atau ninlai lainnya."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Meminta pengguna untuk memberi sebuah angka."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Meminta pengguna untuk memberi beberapa teks."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Meminta angka dengan pesan"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "meminta teks dengan pesan"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Huruf, kata atau baris teks."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "pangkas ruang dari kedua belah sisi"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "pangkas ruang dari sisi kiri"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "pangkas ruang dari sisi kanan"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Kembali salinan teks dengan spasi dihapus dari satu atau kedua ujungnya."; +Blockly.Msg.TODAY = "Hari ini"; +Blockly.Msg.UNDO = "Urungkan"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Buat 'set %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Kembalikan nilai variabel ini."; +Blockly.Msg.VARIABLES_SET = "tetapkan %1 untuk %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Buat 'get %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "tetapkan variabel ini dengan input yang sama."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Sebuah variabel dengan nama '%1' sudah ada."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/is.js b/src/opsoro/server/static/js/blockly/msg/js/is.js new file mode 100644 index 0000000..2da4fe6 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/is.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.is'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Skrifa skýringu"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Breyta gildi:"; +Blockly.Msg.CLEAN_UP = "Hreinsa kubba"; +Blockly.Msg.COLLAPSE_ALL = "Loka kubbum"; +Blockly.Msg.COLLAPSE_BLOCK = "Loka kubbi"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "litur 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "litur 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "hlutfall"; +Blockly.Msg.COLOUR_BLEND_TITLE = "blöndun"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blandar tveimur litum í gefnu hlutfalli (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Velja lit úr litakorti."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "einhver litur"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Velja einhvern lit af handahófi."; +Blockly.Msg.COLOUR_RGB_BLUE = "blátt"; +Blockly.Msg.COLOUR_RGB_GREEN = "grænt"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "rauður"; +Blockly.Msg.COLOUR_RGB_TITLE = "litur"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Búa til lit úr tilteknu magni af rauðu, grænu og bláu. Allar tölurnar verða að vera á bilinu 0 til 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "fara út úr lykkju"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "fara beint í næstu umferð lykkjunnar"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Fara út úr umlykjandi lykkju."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Sleppa afganginum af lykkjunni og fara beint í næstu umferð hennar."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Aðvörun: Þennan kubb má aðeins nota innan lykkju."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "fyrir hvert %1 í lista %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Fyrir hvert atriði í lista er breyta '%1' stillt á atriðið og skipanir gerðar."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; +Blockly.Msg.CONTROLS_FOR_TITLE = "telja með %1 frá %2 til %3 um %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Láta breytuna '%1' taka inn gildi frá fyrstu tölu til síðustu tölu, hlaupandi á tiltekna bilinu og gera tilteknu kubbana."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Bæta skilyrði við EF kubbinn."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Bæta við hluta EF kubbs sem grípur öll tilfelli sem uppfylla ekki hin skilyrðin."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Bæta við, fjarlægja eða umraða til að breyta skipan þessa EF kubbs."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "annars"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "annars ef"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "ef"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Ef gildi er satt skal gera einhverjar skipanir."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Ef gildi er satt skal gera skipanir í fyrri kubbnum. Annars skal gera skipanir í seinni kubbnum."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Ef fyrra gildið er satt skal gera skipanir í fyrri kubbnum. Annars, ef seinna gildið er satt, þá skal gera skipanir í seinni kubbnum."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Ef fyrra gildið er satt skal gera skipanir í fyrri kubbnum. Annars, ef seinna gildið er satt, skal gera skipanir í seinni kubbnum. Ef hvorugt gildið er satt, skal gera skipanir í síðasta kubbnum."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "gera"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "endurtaka %1 sinnum"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Gera eitthvað aftur og aftur."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "endurtaka þar til"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "endurtaka á meðan"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Endurtaka eitthvað á meðan gildi er ósatt."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Endurtaka eitthvað á meðan gildi er satt."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Eyða öllum %1 kubbunum?"; +Blockly.Msg.DELETE_BLOCK = "Eyða kubbi"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "Eyða %1 kubbum"; +Blockly.Msg.DISABLE_BLOCK = "Óvirkja kubb"; +Blockly.Msg.DUPLICATE_BLOCK = "Afrita"; +Blockly.Msg.ENABLE_BLOCK = "Virkja kubb"; +Blockly.Msg.EXPAND_ALL = "Opna kubba"; +Blockly.Msg.EXPAND_BLOCK = "Opna kubb"; +Blockly.Msg.EXTERNAL_INPUTS = "Ytri inntök"; +Blockly.Msg.HELP = "Hjálp"; +Blockly.Msg.INLINE_INPUTS = "Innri inntök"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "búa til tóman lista"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Skilar lista með lengdina 0 án gagna"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "listi"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Bæta við, fjarlægja eða umraða hlutum til að breyta skipan þessa listakubbs."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "búa til lista með"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Bæta atriði við listann."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Búa til lista með einhverjum fjölda atriða."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "fyrsta"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# frá enda"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "sækja"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "sækja og fjarlægja"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "síðasta"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "eitthvert"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "fjarlægja"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Skilar fyrsta atriði í lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Skilar atriðinu í hinum tiltekna stað í lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Skilar síðasta atriði í lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Skilar einhverju atriði úr lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Fjarlægir og skilar fyrsta atriðinu í lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Fjarlægir og skilar atriðinu á hinum tiltekna stað í lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Fjarlægir og skilar síðasta atriðinu í lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Fjarlægir og skilar einhverju atriði úr lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Fjarlægir fyrsta atriðið í lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Fjarlægir atriðið á hinum tiltekna stað í lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Fjarlægir síðasta atriðið í lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Fjarlægir eitthvert atriði úr lista."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "til # frá enda"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "til #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "til síðasta"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "sækja undirlista frá fyrsta"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "sækja undirlista frá # frá enda"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "sækja undirlista frá #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Býr til afrit af tilteknum hluta lista."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 er síðasta atriðið."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 er fyrsta atriðið."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "finna fyrsta tilfelli atriðis"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; +Blockly.Msg.LISTS_INDEX_OF_LAST = "finna síðasta tilfelli atriðis"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Finnur hvar atriðið kemur fyrir fyrst/síðast í listanum og skilar sæti þess. Skilar %1 ef atriðið finnst ekki."; +Blockly.Msg.LISTS_INLIST = "í lista"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 er tómur"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Skilar sönnu ef listinn er tómur."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; +Blockly.Msg.LISTS_LENGTH_TITLE = "lengd %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Skilar lengd lista."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_REPEAT_TITLE = "búa til lista með atriði %1 endurtekið %2 sinnum"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Býr til lista sem inniheldur tiltekna gildið endurtekið tiltekið oft."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "sem"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "bæta við"; +Blockly.Msg.LISTS_SET_INDEX_SET = "setja í"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Bætir atriðinu fremst í listann."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Bætir atriðinu í listann á tilteknum stað."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Bætir atriðinu aftan við listann."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Bætir atriðinu einhversstaðar við listann."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Setur atriðið í fyrsta sæti lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Setur atriðið í tiltekna sætið í listanum."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Setur atriðið í síðasta sæti lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setur atriðið í eitthvert sæti lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "hækkandi"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "lækkandi"; +Blockly.Msg.LISTS_SORT_TITLE = "raða %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Raða afriti lista."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "í stafrófsröð án tillits til stafstöðu"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "í númeraröð"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "í stafrófsröð"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "gera lista úr texta"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "gera texta úr lista"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Sameinar lista af textum í einn texta, með skiltákn á milli."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Skiptir texta í lista af textum, með skil við hvert skiltákn."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "með skiltákni"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "ósatt"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Skilar annað hvort sönnu eða ósönnu."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "satt"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Skila sönnu ef inntökin eru jöfn."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Skila sönnu ef fyrra inntakið er stærra en seinna inntakið."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Skila sönnu ef fyrra inntakið er stærra en eða jafnt og seinna inntakið."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Skila sönnu ef fyrra inntakið er minna en seinna inntakið."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Skila sönnu ef fyrra inntakið er minna en eða jafnt og seinna inntakið."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Skila sönnu ef inntökin eru ekki jöfn."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg.LOGIC_NEGATE_TITLE = "ekki %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Skilar sönnu ef inntakið er ósatt. Skilar ósönnu ef inntakið er satt."; +Blockly.Msg.LOGIC_NULL = "tómagildi"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Skilar tómagildi."; +Blockly.Msg.LOGIC_OPERATION_AND = "og"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; +Blockly.Msg.LOGIC_OPERATION_OR = "eða"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Skila sönnu ef bæði inntökin eru sönn."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Skila sönnu ef að minnsta kosti eitt inntak er satt."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "prófun"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "ef ósatt"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "ef satt"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Kanna skilyrðið í 'prófun'. Skilar 'ef satt' gildinu ef skilyrðið er satt, en skilar annars 'ef ósatt' gildinu."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Skila summu talnanna tveggja."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Skila deilingu talnanna."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Skila mismun talnanna."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Skila margfeldi talnanna."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Skila fyrri tölunni í veldinu seinni talan."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "breyta %1 um %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Bæta tölu við breytu '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Skila algengum fasta: π (3.141…), e (2.718…), φ (1.618…), kvrót(2) (1.414…), kvrót(½) (0.707…) eða ∞ (óendanleika)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "þröngva %1 lægst %2 hæst %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Þröngva tölu til að vera innan hinna tilgreindu marka (að báðum meðtöldum)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "er\u00A0deilanleg með"; +Blockly.Msg.MATH_IS_EVEN = "er\u00A0jöfn tala"; +Blockly.Msg.MATH_IS_NEGATIVE = "er neikvæð"; +Blockly.Msg.MATH_IS_ODD = "er oddatala"; +Blockly.Msg.MATH_IS_POSITIVE = "er jákvæð"; +Blockly.Msg.MATH_IS_PRIME = "er prímtala"; +Blockly.Msg.MATH_IS_TOOLTIP = "Kanna hvort tala sé jöfn tala, oddatala, jákvæð, neikvæð eða deilanleg með tiltekinni tölu. Skilar sönnu eða ósönnu."; +Blockly.Msg.MATH_IS_WHOLE = "er heiltala"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "afgangur af %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Skila afgangi deilingar með tölunum."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Tala."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "meðaltal lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "stærst í lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "miðgildi lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minnst í lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "tíðast í lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "eitthvað úr lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "staðalfrávik lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "summa lista"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Skila meðaltali talna í listanum."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Skila stærstu tölu í listanum."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Skila miðgildi listans."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Skila minnstu tölu í listanum."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Skila lista yfir tíðustu gildin í listanum."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Skila einhverju atriði úr listanum."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Skila staðalfráviki lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Skila summu allra talna í listanum."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "slembibrot"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Skila broti sem er valið af handahófi úr tölum á bilinu frá og með 0.0 til (en ekki með) 1.0."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "slembitala frá %1 til %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Skila heiltölu sem valin er af handahófi og er innan tilgreindra marka, að báðum meðtöldum."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "námunda"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "námunda niður"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "námunda upp"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Námunda tölu upp eða niður."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "algildi"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "kvaðratrót"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Skila algildi tölu."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Skila e í veldi tölu."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Skila náttúrlegum lógaritma tölu."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Skila tugalógaritma tölu."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Skila neitun tölu (tölunni með öfugu formerki)."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Skila 10 í veldi tölu."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Skila kvaðratrót tölu."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "acos"; +Blockly.Msg.MATH_TRIG_ASIN = "asin"; +Blockly.Msg.MATH_TRIG_ATAN = "atan"; +Blockly.Msg.MATH_TRIG_COS = "cos"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; +Blockly.Msg.MATH_TRIG_TAN = "tan"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Skila arkarkósínusi tölu."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Skila arkarsínusi tölu."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Skila arkartangensi tölu."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Skila kósínusi horns gefnu í gráðum."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Skila sínusi horns gefnu í gráðum."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Skila tangensi horns gefnu í gráðum."; +Blockly.Msg.NEW_VARIABLE = "Ný breyta..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Heiti nýrrar breytu:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "leyfa setningar"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "með:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Keyra heimatilbúna fallið '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Keyra heimatilbúna fallið '%1' og nota úttak þess."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "með:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Búa til '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Lýstu þessari aðgerð/falli..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "gera eitthvað"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "til að"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Býr til fall sem skilar engu."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "skila"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Býr til fall sem skilar úttaki."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Aðvörun: Þetta fall er með tvítekna stika."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Sýna skilgreiningu falls"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Ef gildi er satt, skal skila öðru gildi."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Aðvörun: Þennan kubb má aðeins nota í skilgreiningu falls."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "heiti inntaks:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Bæta inntaki við fallið."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inntök"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Bæta við, fjarlægja eða umraða inntökum fyrir þetta fall."; +Blockly.Msg.REDO = "Endurtaka"; +Blockly.Msg.REMOVE_COMMENT = "Fjarlægja skýringu"; +Blockly.Msg.RENAME_VARIABLE = "Endurnefna breytu..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Endurnefna allar '%1' breyturnar:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "bæta texta"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg.TEXT_APPEND_TO = "við"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Bæta texta við breytuna '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "í lágstafi"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "í Upphafstafi"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "í HÁSTAFI"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Skila afriti af textanum með annarri stafastöðu."; +Blockly.Msg.TEXT_CHARAT_FIRST = "sækja fyrsta staf"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "sækja staf # frá enda"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "sækja staf #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "í texta"; +Blockly.Msg.TEXT_CHARAT_LAST = "sækja síðasta staf"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "sækja einhvern staf"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Skila staf á tilteknum stað."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Bæta atriði við textann."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "tengja"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Bæta við, fjarlægja eða umraða hlutum til að breyta skipan þessa textakubbs."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "að staf # frá enda"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "að staf #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "að síðasta staf"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "í texta"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "sækja textabút frá fyrsta staf"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "sækja textabút frá staf # frá enda"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "sækja textabút frá staf #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Skilar tilteknum hluta textans."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "í texta"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "finna fyrsta tilfelli texta"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "finna síðasta tilfelli texta"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Finnur fyrsta/síðasta tilfelli fyrri textans í seinni textanum og skilar sæti hans. Skilar %1 ef textinn finnst ekki."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 er tómur"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Skilar sönnu ef gefni textinn er tómur."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "búa til texta með"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Búa til texta með því að tengja saman einhvern fjölda atriða."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg.TEXT_LENGTH_TITLE = "lengd %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Skilar fjölda stafa (með bilum) í gefna textanum."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg.TEXT_PRINT_TITLE = "prenta %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Prenta tiltekinn texta, tölu eða annað gildi."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Biðja notandann um tölu."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Biðja notandann um texta."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "biðja um tölu með skilaboðum"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "biðja um texta með skilaboðum"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Stafur, orð eða textalína."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "eyða bilum báðum megin við"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "eyða bilum vinstra megin við"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "eyða bilum hægra megin við"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Skila afriti af textanum þar sem möguleg bil við báða enda hafa verið fjarlægð."; +Blockly.Msg.TODAY = "Í dag"; +Blockly.Msg.UNDO = "Afturkalla"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "atriði"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Búa til 'stilla %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Skilar gildi þessarar breytu."; +Blockly.Msg.VARIABLES_SET = "stilla %1 á %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Búa til 'sækja %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Stillir þessa breytu á innihald inntaksins."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/it.js b/src/opsoro/server/static/js/blockly/msg/js/it.js new file mode 100644 index 0000000..560cb06 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/it.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.it'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Aggiungi commento"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Modifica valore:"; +Blockly.Msg.CLEAN_UP = "Pulisci i blocchi"; +Blockly.Msg.COLLAPSE_ALL = "Comprimi blocchi"; +Blockly.Msg.COLLAPSE_BLOCK = "Comprimi blocco"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "colore 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "colore 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "rapporto"; +Blockly.Msg.COLOUR_BLEND_TITLE = "miscela"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mescola due colori insieme con un determinato rapporto (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://it.wikipedia.org/wiki/Colore"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Scegli un colore dalla tavolozza."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "colore casuale"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Scegli un colore a caso."; +Blockly.Msg.COLOUR_RGB_BLUE = "blu"; +Blockly.Msg.COLOUR_RGB_GREEN = "verde"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "rosso"; +Blockly.Msg.COLOUR_RGB_TITLE = "colora con"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Crea un colore con la quantità specificata di rosso, verde e blu. Tutti i valori devono essere compresi tra 0 e 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "esce dal ciclo"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "prosegui con la successiva iterazione del ciclo"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Esce dal ciclo."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Salta il resto di questo ciclo e prosegue con la successiva iterazione."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Attenzioneː Questo blocco può essere usato solo in un ciclo."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "per ogni elemento %1 nella lista %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Per ogni elemento in una lista, imposta la variabile '%1' pari all'elemento e quindi esegue alcune istruzioni."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "conta con %1 da %2 a %3 per %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Fa sì che la variabile '%1' prenda tutti i valori a partire dal numero di partenza fino a quello di arrivo, con passo pari all'intervallo specificato, ed esegue il blocco indicato."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Aggiungi una condizione al blocco se."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Aggiungi una condizione finale pigliatutto al blocco se."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Aggiungi, elimina o riordina le sezioni per riconfigurare questo blocco se."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "altrimenti"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "altrimenti se"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "se"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Se un valore è vero allora esegue alcune istruzioni."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Se un valore è vero allora esegue il primo blocco di istruzioni. Altrimenti esegue il secondo blocco di istruzioni."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Se il primo valore è vero allora esegue un primo blocco di istruzioni. Altrimenti, se il secondo valore è vero, esegue un secondo blocco di istruzioni."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Se il primo valore è vero allora esegue un primo blocco di istruzioni. Altrimenti, se il secondo valore è vero, esegue un secondo blocco di istruzioni. Se nessuno dei valori è vero esegue l'ultimo blocco di istruzioni."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://it.wikipedia.org/wiki/Ciclo_for"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "fai"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "ripeti %1 volte"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Esegue alcune istruzione diverse volte."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ripeti fino a che"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ripeti mentre"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Finché un valore è falso, esegue alcune istruzioni."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Finché un valore è vero, esegue alcune istruzioni."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Cancellare tutti i %1 blocchi?"; +Blockly.Msg.DELETE_BLOCK = "Cancella blocco"; +Blockly.Msg.DELETE_VARIABLE = "Cancella la variabile '%1'"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Cancella %1 usi della variabile '%2'?"; +Blockly.Msg.DELETE_X_BLOCKS = "Cancella %1 blocchi"; +Blockly.Msg.DISABLE_BLOCK = "Disattiva blocco"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplica"; +Blockly.Msg.ENABLE_BLOCK = "Attiva blocco"; +Blockly.Msg.EXPAND_ALL = "Espandi blocchi"; +Blockly.Msg.EXPAND_BLOCK = "Espandi blocco"; +Blockly.Msg.EXTERNAL_INPUTS = "Ingressi esterni"; +Blockly.Msg.HELP = "Aiuto"; +Blockly.Msg.INLINE_INPUTS = "Ingressi in linea"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "crea lista vuota"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Restituisce una lista, di lunghezza 0, contenente nessun record di dati"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Aggiungi, rimuovi o riordina le sezioni per riconfigurare il blocco lista."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "crea lista con"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Aggiunge un elemento alla lista."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Crea una lista con un certo numero di elementi."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "primo"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# dalla fine"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "prendi"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "prendi e rimuovi"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "ultimo"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "casuale"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "rimuovi"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Restituisce il primo elemento in una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Restituisce l'elemento nella posizione indicata della lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Restituisce l'ultimo elemento in una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Restituisce un elemento casuale in una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Rimuove e restituisce il primo elemento in una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Rimuove e restituisce l'elemento nella posizione indicata in una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Restituisce e rimuove l'ultimo elemento in una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Restituisce e rimuove un elemento casuale in una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Rimuove il primo elemento in una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Rimuove l'elemento nella posizione indicata in una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Rimuove l'ultimo elemento in una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Rimuove un elemento casuale in una lista."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "da # dalla fine"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "fino a #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "dagli ultimi"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "prendi sotto-lista dall'inizio"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "prendi sotto-lista da # dalla fine"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "prendi sotto-lista da #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Crea una copia della porzione specificata di una lista."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 corrisponde all'ultimo elemento."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 corrisponde al primo elemento."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "trova la prima occorrenza dell'elemento"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "trova l'ultima occorrenza dell'elemento"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Restituisce l'indice della prima/ultima occorrenza dell'elemento nella lista. Restituisce %1 se l'elemento non viene trovato."; +Blockly.Msg.LISTS_INLIST = "nella lista"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 è vuota"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Restituisce vero se la lista è vuota."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "lunghezza di %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Restituisce la lunghezza della lista"; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "crea una lista con l'elemento %1 ripetuto %2 volte"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Crea una lista costituita dal valore indicato ripetuto per il numero di volte specificato."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "inverti %1"; +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Inverti una copia di un elenco."; +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "come"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "inserisci in"; +Blockly.Msg.LISTS_SET_INDEX_SET = "imposta"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserisci l'elemento all'inizio della lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserisci un elemento nella posizione indicata in una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Aggiungi un elemento alla fine di una lista"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserisce l'elemento casualmente in una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Imposta il primo elemento in una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Imposta l'elemento nella posizione indicata di una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Imposta l'ultimo elemento in una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Imposta un elemento casuale in una lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "crescente"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "decrescente"; +Blockly.Msg.LISTS_SORT_TITLE = "ordinamento %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Ordina una copia di un elenco."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alfabetico, ignorare differenze maiuscole e minuscole"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numerico"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabetico"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "crea lista da testo"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "crea testo da lista"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Unisci una lista di testi in un unico testo, separato da un delimitatore."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Dividi il testo in un elenco di testi, interrompendo ad ogni delimitatore."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "con delimitatore"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falso"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Restituisce vero o falso."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "vero"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://it.wikipedia.org/wiki/Disuguaglianza"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Restituisce vero se gli input sono uno uguale all'altro."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Restituisce vero se il primo input è maggiore o uguale al secondo."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Restituisce uguale se il primo input è maggiore o uguale al secondo input."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Restituisce vero se il primo input è minore del secondo."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Restituisce vero se il primo input è minore o uguale al secondo."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Restituisce vero se gli input non sono uno uguale all'altro."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "non %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Restituisce vero se l'input è falso. Restituisce falso se l'input è vero."; +Blockly.Msg.LOGIC_NULL = "nullo"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Restituisce valore nullo."; +Blockly.Msg.LOGIC_OPERATION_AND = "e"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "o"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Restituisce vero se entrambi gli input sono veri."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Restituisce vero se almeno uno degli input è vero."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "se falso"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "se vero"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Verifica la condizione in 'test'. Se questa è vera restituisce il valore 'se vero' altrimenti restituisce il valore 'se falso'."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://it.wikipedia.org/wiki/Aritmetica"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Restituisce la somma dei due numeri."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Restituisce il quoziente dei due numeri."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Restituisce la differenza dei due numeri."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Restituisce il prodotto dei due numeri."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Restituisce il primo numero elevato alla potenza del secondo numero."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://it.wikipedia.org/wiki/Addizione"; +Blockly.Msg.MATH_CHANGE_TITLE = "cambia %1 di %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Aggiunge un numero alla variabile '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://it.wikipedia.org/wiki/Costante_matematica"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Restituisce una delle costanti comuniː π (3.141…), e (2.718…), φ (1.618…), radq(2) (1.414…), radq(½) (0.707…) o ∞ (infinito)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "costringi %1 da %2 a %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Costringe un numero all'interno dei limiti indicati (compresi)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "è divisibile per"; +Blockly.Msg.MATH_IS_EVEN = "è pari"; +Blockly.Msg.MATH_IS_NEGATIVE = "è negativo"; +Blockly.Msg.MATH_IS_ODD = "è dispari"; +Blockly.Msg.MATH_IS_POSITIVE = "è positivo"; +Blockly.Msg.MATH_IS_PRIME = "è primo"; +Blockly.Msg.MATH_IS_TOOLTIP = "Verifica se un numero è pari, dispari, primo, intero, positivo, negativo o se è divisibile per un certo numero. Restituisce vero o falso."; +Blockly.Msg.MATH_IS_WHOLE = "è intero"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://it.wikipedia.org/wiki/Resto"; +Blockly.Msg.MATH_MODULO_TITLE = "resto di %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Restituisce il resto della divisione di due numeri."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://it.wikipedia.org/wiki/Numero"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un numero."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "media della lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "massimo della lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana della lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimo della lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "mode della lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "elemento casuale della lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "deviazione standard della lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "somma la lista"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Restituisce la media (media aritmetica) dei valori numerici nella lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Restituisce il più grande numero della lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Restituisce il valore mediano della lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Restituisce il più piccolo numero della lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Restituisce una lista degli elementi più frequenti nella lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Restituisce un elemento casuale della lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Restituisce la deviazione standard della lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Restituisce la somma si tutti i numeri nella lista."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://it.wikipedia.org/wiki/Numeri_pseudo-casuali"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "frazione casuale"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Restituisce una frazione compresa fra 0.0 (incluso) e 1.0 (escluso)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://it.wikipedia.org/wiki/Numeri_pseudo-casuali"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "intero casuale da %1 a %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Restituisce un numero intero casuale compreso tra i due limiti indicati (inclusi)."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://it.wikipedia.org/wiki/Arrotondamento"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arrotonda"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arrotonda verso il basso"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arrotonda verso l'alto"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Arrotonda un numero verso l'alto o verso il basso."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://it.wikipedia.org/wiki/Radice_quadrata"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "assoluto"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "radice quadrata"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Restituisce il valore assoluto del numero."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Restituisce e elevato alla potenza del numero."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Restituisce il logaritmo naturale del numero."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Restituisce il logaritmo in base 10 del numero."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Restituisce l'opposto del numero."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Restituisce 10 elevato alla potenza del numero."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Restituisce la radice quadrata del numero."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://it.wikipedia.org/wiki/Funzione_trigonometrica"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Restituisce l'arco-coseno di un numero."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Restituisce l'arco-seno di un numero."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Restituisce l'arco-tangente di un numero."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Restituisce il coseno di un angolo espresso in gradi (non radianti)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Restituisce il seno di un angolo espresso in gradi (non radianti)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Restituisce la tangente di un angolo espresso in gradi (non radianti)."; +Blockly.Msg.NEW_VARIABLE = "Crea variabile..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nome della nuova variabile:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "consenti dichiarazioni"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "conː"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://it.wikipedia.org/wiki/Funzione_%28informatica%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Esegue la funzione definita dall'utente '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://it.wikipedia.org/wiki/Funzione_%28informatica%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Esegue la funzione definita dall'utente '%1' ed usa il suo output."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "conː"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Crea '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Descrivi questa funzione..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "fai qualcosa"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "per"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crea una funzione senza output."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "ritorna"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crea una funzione con un output."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Attenzioneː Questa funzione ha parametri duplicati."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Evidenzia definizione di funzione"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Se un valore è vero allora restituisce un secondo valore."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Attenzioneː Questo blocco può essere usato solo all'interno di una definizione di funzione."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nome inputː"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Aggiungi un input alla funzione."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "input"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Aggiungi, rimuovi o riordina input alla funzione."; +Blockly.Msg.REDO = "Ripeti"; +Blockly.Msg.REMOVE_COMMENT = "Rimuovi commento"; +Blockly.Msg.RENAME_VARIABLE = "Rinomina variabile..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Rinomina tutte le variabili '%1' in:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "aggiungi il testo"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "a"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Aggiunge del testo alla variabile '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "in minuscolo"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "con Iniziali Maiuscole"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "in MAIUSCOLO"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Restituisce una copia del testo in un diverso formato maiuscole/minuscole."; +Blockly.Msg.TEXT_CHARAT_FIRST = "prendi la prima lettera"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "prendi la lettera # dalla fine"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "prendi la lettera #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "nel testo"; +Blockly.Msg.TEXT_CHARAT_LAST = "prendi l'ultima lettera"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "prendi lettera casuale"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Restituisce la lettera nella posizione indicata."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "conta %1 in %2"; +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Contare quante volte una parte di testo si ripete all'interno di qualche altro testo."; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Aggiungi un elemento al testo."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "unisci"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Aggiungi, rimuovi o riordina le sezioni per riconfigurare questo blocco testo."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "alla lettera # dalla fine"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "alla lettera #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "all'ultima lettera"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "nel testo"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "prendi sotto-stringa dalla prima lettera"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "prendi sotto-stringa dalla lettera # dalla fine"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "prendi sotto-stringa dalla lettera #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Restituisce la porzione di testo indicata."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "nel testo"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "trova la prima occorrenza del testo"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "trova l'ultima occorrenza del testo"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Restituisce l'indice della prima occorrenza del primo testo all'interno del secondo testo. Restituisce %1 se il testo non viene trovato."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 è vuoto"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Restituisce vero se il testo fornito è vuoto."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "crea testo con"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Crea un blocco di testo unendo un certo numero di elementi."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "lunghezza di %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Restituisce il numero di lettere (inclusi gli spazi) nel testo fornito."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "scrivi %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Scrive il testo, numero o altro valore indicato."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Richiedi un numero all'utente."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Richiede del testo da parte dell'utente."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "richiedi numero con messaggio"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "richiedi testo con messaggio"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "sostituisci %1 con %2 in %3"; +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "sostituisci tutte le occorrenze di un certo testo con qualche altro testo."; +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "inverti %1"; +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Inverte l'ordine dei caratteri nel testo."; +Blockly.Msg.TEXT_TEXT_HELPURL = "https://it.wikipedia.org/wiki/Stringa_(informatica)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Una lettera, una parola o una linea di testo."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "rimuovi spazi da entrambi gli estremi"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "rimuovi spazi a sinistra"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "rimuovi spazi a destra"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Restituisce una copia del testo con gli spazi rimossi ad uno o entrambe le estremità."; +Blockly.Msg.TODAY = "Oggi"; +Blockly.Msg.UNDO = "Annulla"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "elemento"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crea 'imposta %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Restituisce il valore di una variabile."; +Blockly.Msg.VARIABLES_SET = "imposta %1 a %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Crea 'prendi %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Imposta questa variabile ad essere pari all'input."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Una variabile denominata '%1' esiste già."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/ja.js b/src/opsoro/server/static/js/blockly/msg/js/ja.js new file mode 100644 index 0000000..a8107da --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/ja.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.ja'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "コメントを追加"; +Blockly.Msg.CHANGE_VALUE_TITLE = "値を変える:"; +Blockly.Msg.CLEAN_UP = "ブロックを整理する"; +Blockly.Msg.COLLAPSE_ALL = "ブロックを折りたたむ"; +Blockly.Msg.COLLAPSE_BLOCK = "ブロックを折りたたむ"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "色 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "色 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "比率"; +Blockly.Msg.COLOUR_BLEND_TITLE = "ブレンド"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "2色を与えられた比率(0.0~1.0)で混ぜます。"; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ja.wikipedia.org/wiki/色"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "パレットから色を選んでください。"; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "ランダムな色"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "ランダムな色を選ぶ。"; +Blockly.Msg.COLOUR_RGB_BLUE = "青"; +Blockly.Msg.COLOUR_RGB_GREEN = "緑"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "赤"; +Blockly.Msg.COLOUR_RGB_TITLE = "色づけ"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "赤、緑、および青の指定された量で色を作成します。すべての値は 0 ~ 100 の間でなければなりません。"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "ループから抜け出します"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "ループの次の反復処理を続行します"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "入っているループから抜け出します。"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "このループの残りの部分をスキップして、ループの繰り返しを続けます。"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "注意: このブロックは、ループ内でのみ使用できます。"; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "リスト%2の各項目%1について"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "リストの各項目について、その項目を変数'%1'として、いくつかのステートメントを実行します。"; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "カウントする( 変数: %1 範囲: %2 ~ %3 間隔: %4 )"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "変数 '%1' が開始番号から終了番号まで指定した間隔での値をとって、指定したブロックを実行する。"; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "「もしも」のブロックに条件を追加します。"; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Ifブロックに、すべてをキャッチする条件を追加。"; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "追加、削除、またはセクションを順序変更して、ブロックをこれを再構成します。"; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "他"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "他でもしも"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "もしも"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "値が true の場合、ステートメントを実行します。"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "値が true 場合は、ステートメントの最初のブロックを行います。それ以外の場合は、ステートメントの 2 番目のブロックを行います。"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "最初の値が true 場合は、ステートメントの最初のブロックを行います。それ以外の場合は、2 番目の値が true の場合、ステートメントの 2 番目のブロックをします。"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "最初の値が true 場合は、ステートメントの最初のブロックを行います。2 番目の値が true の場合は、ステートメントの 2 番目のブロックを行います。それ以外の場合は最後のブロックのステートメントを行います。"; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://ja.wikipedia.org/wiki/for文"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "実行"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1 回繰り返します"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "いくつかのステートメントを数回実行します。"; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "繰り返す:終わる条件"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "繰り返す:続ける条件"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "値がfalseの間、いくつかのステートメントを実行する。"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "値がtrueの間、いくつかのステートメントを実行する。"; +Blockly.Msg.DELETE_ALL_BLOCKS = "%1件のすべてのブロックを削除しますか?"; +Blockly.Msg.DELETE_BLOCK = "ブロックを削除"; +Blockly.Msg.DELETE_VARIABLE = "変数 '%1' を削除"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "%1か所で使われている変数 '%2' を削除しますか?"; +Blockly.Msg.DELETE_X_BLOCKS = "%1 個のブロックを削除"; +Blockly.Msg.DISABLE_BLOCK = "ブロックを無効にする"; +Blockly.Msg.DUPLICATE_BLOCK = "複製"; +Blockly.Msg.ENABLE_BLOCK = "ブロックを有効にする"; +Blockly.Msg.EXPAND_ALL = "ブロックを展開する"; +Blockly.Msg.EXPAND_BLOCK = "ブロックを展開する"; +Blockly.Msg.EXTERNAL_INPUTS = "外部入力"; +Blockly.Msg.HELP = "ヘルプ"; +Blockly.Msg.INLINE_INPUTS = "インライン入力"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "空のリストを作成"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "長さ0でデータ・レコードを含まない空のリストを返す"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "リスト"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "追加、削除、またはセクションの順序変更をして、このリスト・ブロックを再構成する。"; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "以下を使ってリストを作成:"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "リストに項目を追加。"; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "項目数が不定のリストを作成。"; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "最初"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "後ろから #"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "取得"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "取得と削除"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "最後"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "ランダム"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "削除"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "リストの最初の項目を返します。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "リスト内の指定位置にある項目を返します。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "リストの最後の項目を返します。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "ランダム アイテム リストを返します。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "リスト内の最初の項目を削除し返します。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "リスト内の指定位置にある項目を削除し、返します。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "リスト内の最後の項目を削除したあと返します。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "リストのランダムなアイテムを削除し返します。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "リスト内の最初の項目を削除します。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "リスト内の指定された項目を削除します。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "リスト内の最後の項目を削除します。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "リスト内にあるアイテムをランダムに削除します。"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "最後から#へ"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "#へ"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "最後へ"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "最初からサブリストを取得する。"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "端から #のサブリストを取得します。"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "# からサブディレクトリのリストを取得します。"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "リストの指定された部分のコピーを作成してくださ。"; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 は、最後の項目です。"; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 は、最初の項目です。"; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "最初に見つかった項目を検索します。"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "最後に見つかったアイテムを見つける"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "リスト項目の最初/最後に出現するインデックス位置を返します。項目が見つからない場合は %1 を返します。"; +Blockly.Msg.LISTS_INLIST = "リストで"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1が空"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "リストが空の場合は、true を返します。"; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "%1の長さ"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "リストの長さを返します。"; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "項目%1を%2回繰り返したリストを作成"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "与えられた値を指定された回数繰り返してリストを作成。"; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "として"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "挿入位置:"; +Blockly.Msg.LISTS_SET_INDEX_SET = "セット"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "リストの先頭に項目を挿入します。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "リスト内の指定位置に項目を挿入します。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "リストの末尾に項目を追加します。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "リストに項目をランダムに挿入します。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "リスト内に最初の項目を設定します。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "リスト内の指定された位置に項目を設定します。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "リスト内の最後の項目を設定します。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "リスト内にランダムなアイテムを設定します。"; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "昇順"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "降順"; +Blockly.Msg.LISTS_SORT_TITLE = "並べ替え(タイプ:%1、順番:%2、項目のリスト:%3)"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "リストのコピーを並べ替え"; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "アルファベット順(大文字・小文字の区別無し)"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "数値順"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "アルファベット順"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "テキストからリストを作る"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "リストからテキストを作る"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "テキストのリストを区切り記号で区切られた一つのテキストにする"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "テキストを区切り記号で分割したリストにする"; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "区切り記号"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "false"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "True または false を返します。"; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "true"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://ja.wikipedia.org/wiki/不等式"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "もし両方がお互いに等しく入力した場合は true を返します。"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "最初の入力が 2 番目の入力よりも大きい場合は true を返します。"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "もし入力がふたつめの入よりも大きかったらtrueをり返します。"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "最初の入力が 2 番目の入力よりも小さいい場合は true を返します。"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "もし、最初の入力が二つ目入力より少ないか、おなじであったらTRUEをかえしてください"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "両方の入力が互いに等しくない場合に true を返します。"; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://ja.wikipedia.org/wiki/否定"; +Blockly.Msg.LOGIC_NEGATE_TITLE = "%1ではない"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "入力が false の場合は、true を返します。入力が true の場合は false を返します。"; +Blockly.Msg.LOGIC_NULL = "null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "null を返します。"; +Blockly.Msg.LOGIC_OPERATION_AND = "かつ"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "または"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "両方の入力が true のときに true を返します。"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "少なくとも 1 つの入力が true のときに true を返します。"; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "テスト"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://ja.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "false の場合"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "true の場合"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "'テスト' の条件をチェックします。条件が true の場合、'true' の値を返します。それ以外の場合 'false' のを返します。"; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ja.wikipedia.org/wiki/算術"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "2 つの数の合計を返します。"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "2 つの数の商を返します。"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "2 つの数の差を返します。"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "2 つの数の積を返します。"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "最初の数を2 番目の値で累乗した結果を返します。"; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://ja.wikipedia.org/wiki/加法"; +Blockly.Msg.MATH_CHANGE_TITLE = "変更 %1 に %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "変数'%1'に数をたす。"; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://ja.wikipedia.org/wiki/数学定数"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "いずれかの共通の定数のを返す: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (無限)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "%1の下限を%2に上限を%3に制限"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "指定した上限と下限の間に値を制限する(上限と下限の値を含む)。"; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "は以下で割りきれる:"; +Blockly.Msg.MATH_IS_EVEN = "は偶数"; +Blockly.Msg.MATH_IS_NEGATIVE = "は負"; +Blockly.Msg.MATH_IS_ODD = "は奇数"; +Blockly.Msg.MATH_IS_POSITIVE = "は正"; +Blockly.Msg.MATH_IS_PRIME = "は素数"; +Blockly.Msg.MATH_IS_TOOLTIP = "数字が、偶数、奇数、素数、整数、正数、負数、または特定の数で割り切れるかどうかを判定し、true か false を返します。"; +Blockly.Msg.MATH_IS_WHOLE = "は整数"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "%1÷%2の余り"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "2つの数値の割り算の余りを返す。"; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://ja.wikipedia.org/wiki/数"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "数です。"; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "リストの平均"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "リストの最大値"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "リストの中央値"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "リストの最小値"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "一覧モード"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "リストからランダムに選ばれた項目"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "リストの標準偏差"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "リストの合計"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "リストの数値の平均 (算術平均) を返す。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "リストの最大値を返す。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "リストの中央値を返す。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "リストの最小値を返す。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "リスト中の最頻項目のリストを返す。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "リストからランダムに選ばれた要素を返す。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "リストの標準偏差を返す。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "リストの数値を足して返す。"; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "1未満の正の乱数"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "0.0以上で1.0未満の範囲の乱数を返します。"; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "%1から%2までのランダムな整数"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "指定された(上下限を含む)範囲のランダムな整数を返します。"; +Blockly.Msg.MATH_ROUND_HELPURL = "https://ja.wikipedia.org/wiki/端数処理"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "四捨五入"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "切り捨て"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "切り上げ"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "数値を切り上げるか切り捨てる"; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://ja.wikipedia.org/wiki/平方根"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "絶対値"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "平方根"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "絶対値を返す。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "ネイピア数eの数値乗を返す。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "数値の自然対数を返す。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "底が10の対数を返す。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "負の数を返す。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "10の数値乗を返す。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "平方根を返す。"; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "acos"; +Blockly.Msg.MATH_TRIG_ASIN = "asin"; +Blockly.Msg.MATH_TRIG_ATAN = "atan"; +Blockly.Msg.MATH_TRIG_COS = "cos"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://ja.wikipedia.org/wiki/三角関数"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; +Blockly.Msg.MATH_TRIG_TAN = "tan"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "アークコサイン(arccosin)を返す。"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "アークサイン(arcsin)を返す。"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "アークタンジェント(arctan)を返す。"; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "(ラジアンではなく)度数の余弦(cosin)を返す。"; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "(ラジアンではなく)度数の正弦(sin)を返す。"; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "(ラジアンではなく)度数の正接(tan)を返す。"; +Blockly.Msg.NEW_VARIABLE = "変数の作成…"; +Blockly.Msg.NEW_VARIABLE_TITLE = "新しい変数の名前:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "ステートメントを許可"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "対象:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://ja.wikipedia.org/wiki/サブルーチン"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "ユーザー定義関数 '%1' を実行します。"; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://ja.wikipedia.org/wiki/サブルーチン"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "ユーザー定義関数 '%1' を実行し、その出力を使用します。"; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "対象:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "'%1' を作成"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "この関数の説明…"; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://ja.wikipedia.org/wiki/サブルーチン"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "何かしてください"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "宛先"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "出力なしの関数を作成します。"; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://ja.wikipedia.org/wiki/サブルーチン"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "返す"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "一つの出力を持つ関数を作成します。"; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "警告: この関数には重複するパラメーターがあります。"; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "関数の内容を強調表示します。"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "1番目の値が true の場合、2番目の値を返します。"; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "警告: このブロックは、関数定義内でのみ使用できます。"; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "入力名:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "関数への入力の追加。"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "入力"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "この関数への入力の追加、削除、順番変更。"; +Blockly.Msg.REDO = "やり直す"; +Blockly.Msg.REMOVE_COMMENT = "コメントを削除"; +Blockly.Msg.RENAME_VARIABLE = "変数の名前を変える…"; +Blockly.Msg.RENAME_VARIABLE_TITLE = "選択した%1の変数すべての名前を変える:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "へテキストを追加"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "項目"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "変数 '%1' にテキストを追加。"; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "小文字に"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "タイトル ケースに"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "大文字に変換する"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "別のケースに、テキストのコピーを返します。"; +Blockly.Msg.TEXT_CHARAT_FIRST = "最初の文字を得る"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "一番最後の言葉、キャラクターを所得"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "で、文字# を取得"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "テキスト"; +Blockly.Msg.TEXT_CHARAT_LAST = "最後の文字を得る"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "ランダムな文字を得る"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "指定された位置に文字を返します。"; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "テキストへ項目を追加。"; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "結合"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "セクションを追加、削除、または順序変更して、ブロックを再構成。"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "文字列の# 終わりからの#"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "# の文字"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "最後のの文字"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "テキストで"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "部分文字列を取得する。"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "部分文字列を取得する #端から得る"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "文字列からの部分文字列を取得 #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "テキストの指定部分を返します。"; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "テキスト"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "で以下のテキストの最初の出現箇所を検索:"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "テキストの最後の出現箇所を検索"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "二番目のテキストの中で一番目のテキストが最初/最後に出現したインデックスを返す。テキストが見つからない場合は%1を返す。"; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1が空"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "与えられたテキストが空の場合は true を返す。"; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "テキストの作成:"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "任意の数の項目一部を一緒に接合してテキストを作成。"; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "%1の長さ"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "与えられたテキストの(スペースを含む)文字数を返す。"; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "%1 を印刷します。"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "指定したテキスト、番号または他の値を印刷します。"; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "ユーザーに数値のインプットを求める。"; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "ユーザーにテキスト入力を求める。"; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "メッセージで番号の入力を求める"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "メッセージでテキスト入力を求める"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://ja.wikipedia.org/wiki/文字列"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "文字、単語、または行のテキスト。"; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "両端のスペースを取り除く"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "左端のスペースを取り除く"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "右端のスペースを取り除く"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "スペースを 1 つまたは両方の端から削除したのち、テキストのコピーを返します。"; +Blockly.Msg.TODAY = "今日"; +Blockly.Msg.UNDO = "取り消す"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "項目"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "'セット%1を作成します。"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "この変数の値を返します。"; +Blockly.Msg.VARIABLES_SET = "セット %1 宛先 %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "'%1 を取得' を作成します。"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "この入力を変数と等しくなるように設定します。"; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "変数名 '%1' は既に存在しています。"; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/ko.js b/src/opsoro/server/static/js/blockly/msg/js/ko.js new file mode 100644 index 0000000..cd2b8f0 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/ko.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.ko'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "댓글 추가"; +Blockly.Msg.CHANGE_VALUE_TITLE = "값 바꾸기:"; +Blockly.Msg.CLEAN_UP = "블록 정리"; +Blockly.Msg.COLLAPSE_ALL = "블록 축소"; +Blockly.Msg.COLLAPSE_BLOCK = "블록 축소"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "색 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "색 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "비율"; +Blockly.Msg.COLOUR_BLEND_TITLE = "혼합"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "두 색을 주어진 비율로 혼합 (0.0 - 1.0)"; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ko.wikipedia.org/wiki/색"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "팔레트에서 색을 고릅니다"; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "임의 색상"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "무작위로 색을 고릅니다."; +Blockly.Msg.COLOUR_RGB_BLUE = "파랑"; +Blockly.Msg.COLOUR_RGB_GREEN = "초록"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "빨강"; +Blockly.Msg.COLOUR_RGB_TITLE = "색"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "빨강,파랑,초록의 값을 이용하여 색을 만드십시오. 모든 값은 0과 100 사이에 있어야 합니다."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://ko.wikipedia.org/wiki/%EC%A0%9C%EC%96%B4_%ED%9D%90%EB%A6%84"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "반복 중단"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "다음 반복"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "현재 반복 실행 블럭을 빠져나갑니다."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "나머지 반복 부분을 더 이상 실행하지 않고, 다음 반복을 수행합니다."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "경고 : 이 블록은 반복 실행 블럭 안에서만 사용됩니다."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://ko.wikipedia.org/wiki/For_%EB%A3%A8%ED%94%84#.EC.9E.84.EC.9D.98.EC.9D.98_.EC.A7.91.ED.95.A9"; +Blockly.Msg.CONTROLS_FOREACH_TITLE = "각 항목에 대해 %1 목록으로 %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "리스트 안에 들어있는 각 아이템들을, 순서대로 변수 '%1' 에 한 번씩 저장시키고, 그 때 마다 명령을 실행합니다."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://ko.wikipedia.org/wiki/For_%EB%A3%A8%ED%94%84"; +Blockly.Msg.CONTROLS_FOR_TITLE = "으로 계산 %1 %2에서 %4을 이용하여 %3로"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "변수 \"%1\"은 지정된 간격으로 시작 수에서 끝 수까지를 세어 지정된 블록을 수행해야 합니다."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "\"만약\" 블럭에 조건 검사를 추가합니다."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "\"만약\" 블럭의 마지막에, 모든 검사 결과가 거짓인 경우 실행할 부분을 추가합니다."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://ko.wikipedia.org/wiki/%EC%A1%B0%EA%B1%B4%EB%AC%B8"; +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "섹션을 추가, 제거하거나 순서를 변경하여 이 if 블럭을 재구성합니다."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "아니라면"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "다른 경우"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "만약"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "조건식의 계산 결과가 참이면, 명령을 실행합니다."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "조건식의 계산 결과가 참이면, 첫 번째 블럭의 명령을 실행하고, 그렇지 않으면 두 번째 블럭의 명령을 실행합니다."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "첫 번째 조건식의 계산 결과가 참이면, 첫 번째 블럭의 명령을 실행하고, 두 번째 조건식의 계산 결과가 참이면, 두 번째 블럭의 명령을 실행합니다."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "첫 번째 조건식의 계산 결과가 참이면, 첫 번째 블럭의 명령을 실행하고, 두 번째 조건식의 계산 결과가 참이면, 두 번째 블럭의 명령을 실행하고, ... , 어떤 조건식의 계산 결과도 참이 아니면, 마지막 블럭의 명령을 실행합니다."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://ko.wikipedia.org/wiki/For_루프"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "하기"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1회 반복"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "여러 번 반복해 명령들을 실행합니다."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://ko.wikipedia.org/wiki/While_%EB%A3%A8%ED%94%84"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "다음까지 반복"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "동안 반복"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "값이 거짓일 때, 몇 가지 선언을 합니다."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "값이 참일 때, 몇 가지 선언을 합니다."; +Blockly.Msg.DELETE_ALL_BLOCKS = "모든 블록 %1개를 삭제하겠습니까?"; +Blockly.Msg.DELETE_BLOCK = "블록 삭제"; +Blockly.Msg.DELETE_VARIABLE = "'%1' 변수를 삭제합니다"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "'%2' 변수에서 %1을(를) 삭제하시겠습니까?"; +Blockly.Msg.DELETE_X_BLOCKS = "블록 %1개 삭제"; +Blockly.Msg.DISABLE_BLOCK = "블록 비활성화"; +Blockly.Msg.DUPLICATE_BLOCK = "중복됨"; +Blockly.Msg.ENABLE_BLOCK = "블록 활성화"; +Blockly.Msg.EXPAND_ALL = "블록 확장"; +Blockly.Msg.EXPAND_BLOCK = "블록 확장"; +Blockly.Msg.EXTERNAL_INPUTS = "외부 입력"; +Blockly.Msg.HELP = "도움말"; +Blockly.Msg.INLINE_INPUTS = "내부 입력"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "빈 리스트 생성"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "데이터 레코드가 없는, 길이가 0인 목록을 반환합니다."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "리스트"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "섹션을 추가, 제거하거나 순서를 변경하여 이 리스트 블럭을 재구성합니다."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "리스트 만들기"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "아이템을 리스트에 추가합니다."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "원하는 수의 항목들로 목록을 생성합니다."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "첫 번째"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "마지막 번째 위치부터, # 번째"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "가져오기"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "잘라 내기"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "마지막"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "임의로"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "삭제"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "첫 번째 아이템을 찾아 돌려줍니다."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "목록에서 특정 위치의 항목을 반환합니다."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "마지막 아이템을 찾아 돌려줍니다."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "리스트의 아이템들 중, 랜덤으로 선택해 돌려줍니다."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "첫 번째 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "목록의 특정 위치에 있는 항목을 제거하고 반환합니다."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "마지막 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "목록에서 임의 위치의 아이템을 찾아내 삭제하고 돌려줍니다."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "리스트에서 첫 번째 아이템을 삭제합니다."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "목록에서 특정 위치의 항목을 삭제합니다."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "리스트에서 마지막 아이템을 찾아 삭제합니다."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "리스트에서 랜덤하게 아이템을 삭제합니다."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "끝에서부터 # 번째로"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "앞에서부터 # 번째로"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "마지막으로"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "첫 번째 위치부터, 서브 리스트 추출"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "마지막부터 # 번째 위치부터, 서브 리스트 추출"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "처음 # 번째 위치부터, 서브 리스트 추출"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "목록의 특정 부분에 대한 복사본을 만듭니다."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1은(는) 마지막 항목입니다."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1은 첫 번째 항목입니다."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "처음으로 나타난 위치"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; +Blockly.Msg.LISTS_INDEX_OF_LAST = "마지막으로 나타난 위치"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "목록에서 항목이 처음 또는 마지막으로 발생한 색인 위치를 반환합니다. 항목이 없으면 %1을 반환합니다."; +Blockly.Msg.LISTS_INLIST = "리스트"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1이 비어 있습니다"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "목록이 비었을 때 참을 반환합니다."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; +Blockly.Msg.LISTS_LENGTH_TITLE = "%1의 길이"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "목록의 길이를 반환합니다."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_REPEAT_TITLE = "%1을 %2번 넣어, 리스트 생성"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "원하는 값을, 원하는 갯수 만큼 넣어, 목록을 생성합니다."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "에"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "에서 원하는 위치에 삽입"; +Blockly.Msg.LISTS_SET_INDEX_SET = "에서 설정"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "항목을 목록의 처음 위치에 삽입합니다."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "목록의 특정 위치에 항목을 삽입합니다."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "리스트의 마지막에 아이템을 추가합니다."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "목록에서 임의 위치에 아이템을 삽입합니다."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "첫 번째 위치의 아이템으로 설정합니다."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "목록의 특정 위치에 있는 항목으로 설정합니다."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "마지막 아이템으로 설정합니다."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "목록에서 임의 위치의 아이템을 설정합니다."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "오름차순"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "내림차순"; +Blockly.Msg.LISTS_SORT_TITLE = "정렬 %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "목록의 사본을 정렬합니다."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "알파벳순 (대소문자 구분 안 함)"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "숫자순"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "알파벳순"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "텍스트에서 목록 만들기"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "목록에서 텍스트 만들기"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "구분 기호로 구분하여 텍스트 목록을 하나의 텍스트에 병합합니다."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "각 속보, 텍스트의 목록들에서 텍스트를 분할합니다."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "분리와"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "거짓"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://ko.wikipedia.org/wiki/%EC%A7%84%EB%A6%BF%EA%B0%92"; +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "참 혹은 거짓 모두 반환합니다."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "참"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://ko.wikipedia.org/wiki/부등식"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "두 값이 같으면, 참(true) 값을 돌려줍니다."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "첫 번째 값이 두 번째 값보다 크면, 참(true) 값을 돌려줍니다."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "첫 번째 값이 두 번째 값보다 크거나 같으면, 참(true) 값을 돌려줍니다."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "첫 번째 값이 두 번째 값보다 작으면, 참(true) 값을 돌려줍니다."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "첫 번째 값이 두 번째 값보다 작거나 같으면, 참(true) 값을 돌려줍니다."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "두 값이 서로 다르면, 참(true) 값을 돌려줍니다."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://ko.wikipedia.org/wiki/%EB%B6%80%EC%A0%95"; +Blockly.Msg.LOGIC_NEGATE_TITLE = "%1가 아닙니다"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "입력값이 거짓이라면 참을 반환합니다. 참이라면 거짓을 반환합니다."; +Blockly.Msg.LOGIC_NULL = "빈 값"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "빈 값을 반환합니다."; +Blockly.Msg.LOGIC_OPERATION_AND = "그리고"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://ko.wikipedia.org/wiki/%EB%B6%88_%EB%85%BC%EB%A6%AC"; +Blockly.Msg.LOGIC_OPERATION_OR = "또는"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "두 값이 모두 참(true) 값이면, 참 값을 돌려줍니다."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "적어도 하나의 값이 참일 경우 참을 반환합니다."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "테스트"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://ko.wikipedia.org/wiki/물음표"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "만약 거짓이라면"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "만약 참이라면"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "'test'의 조건을 검사합니다. 조건이 참이면 'if true' 값을 반환합니다. 거짓이면 'if false' 값을 반환합니다."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ko.wikipedia.org/wiki/산술"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "두 수의 합을 반환합니다."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "두 수의 나눈 결과를 반환합니다."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "두 수간의 차이를 반환합니다."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "두 수의 곱을 반환합니다."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "첫 번째 수를 두 번째 수 만큼, 거듭제곱 한 결과값을 돌려줍니다."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "바꾸기 %1 만큼 %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "변수 '%1' 에 저장되어있는 값에, 어떤 수를 더해, 변수에 다시 저장합니다."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://ko.wikipedia.org/wiki/수학_상수"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "일반적인 상수 값들 중 하나를 돌려줍니다. : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://ko.wikipedia.org/wiki/%ED%81%B4%EB%9E%A8%ED%95%91_(%EA%B7%B8%EB%9E%98%ED%94%BD)"; +Blockly.Msg.MATH_CONSTRAIN_TITLE = "%1의 값을, 최소 %2 최대 %3으로 조정"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "어떤 수를, 특정 범위의 값이 되도록 강제로 조정합니다."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "가 다음 수로 나누어 떨어지면 :"; +Blockly.Msg.MATH_IS_EVEN = "가 짝수(even) 이면"; +Blockly.Msg.MATH_IS_NEGATIVE = "가 음(-)수 이면"; +Blockly.Msg.MATH_IS_ODD = "가 홀수(odd) 이면"; +Blockly.Msg.MATH_IS_POSITIVE = "가 양(+)수 이면"; +Blockly.Msg.MATH_IS_PRIME = "가 소수(prime) 이면"; +Blockly.Msg.MATH_IS_TOOLTIP = "어떤 수가 짝 수, 홀 수, 소 수, 정 수, 양 수, 음 수, 나누어 떨어지는 수 인지 검사해 결과값을 돌려줍니다. 참(true) 또는 거짓(false) 값을 돌려줌."; +Blockly.Msg.MATH_IS_WHOLE = "가 정수이면"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "%1 ÷ %2의 나머지"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "첫 번째 수를 두 번째 수로 나눈, 나머지 값을 돌려줍니다."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "x"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://ko.wikipedia.org/wiki/수_(수학)"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "수"; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "평균값"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "최대값"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "중간값"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "최소값"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "가장 여러 개 있는 값"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "목록의 임의 항목"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "표준 편차"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "합"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "리스트에 들어있는 수(값)들에 대해, 산술 평균(arithmetic mean) 한 값을 돌려줍니다."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "리스트에 들어있는 수(값) 들 중, 가장 큰(max) 수(값)를 돌려줍니다."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "리스트에 들어있는 수(값) 들 중, 중간(median) 수(값)를 돌려줍니다."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "리스트에 들어있는 수(값) 들 중, 가장 작은(min) 수(값)를 돌려줍니다."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "리스트에 들어있는 아이템들 중에서, 가장 여러 번 들어있는 아이템들을 리스트로 만들어 돌려줍니다. (최빈값, modes)"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "목록에서 임의의 아이템을 돌려줍니다."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "이 리스트의 표준 편차를 반환합니다."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "리스트에 들어있는 수(값)들을, 모두 합(sum) 한, 총합(sum)을 돌려줍니다."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "임의 분수"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "0.0 (포함)과 1.0 (배타적) 사이의 임의 분수 값을 돌려줍니다."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "랜덤정수(%1<= n <=%2)"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "두 주어진 제한된 범위 사이의 임의 정수값을 돌려줍니다."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://ko.wikipedia.org/wiki/반올림"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "반올림"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "버림"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "올림"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "어떤 수를 반올림/올림/버림한 결과를, 정수값으로 돌려줍니다."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://ko.wikipedia.org/wiki/제곱근"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "절대값"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "제곱근"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "어떤 수의 절대값(absolute)을 계산한 결과를, 정수값으로 돌려줍니다."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "e의 거듭제곱 값을 반환합니다."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "어떤 수의, 자연로그(natural logarithm) 값을 돌려줍니다.(밑 e, 예시 log e x)"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "어떤 수의, 기본로그(logarithm) 값을 돌려줍니다.(밑 10, 예시 log 10 x)"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "음(-)/양(+), 부호를 반대로 하여 값을 돌려줍니다."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "10의 거듭제곱 값을 반환합니다."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "숫자의 제곱근을 반환합니다."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "acos"; +Blockly.Msg.MATH_TRIG_ASIN = "asin"; +Blockly.Msg.MATH_TRIG_ATAN = "atan"; +Blockly.Msg.MATH_TRIG_COS = "cos"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://ko.wikipedia.org/wiki/삼각함수"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; +Blockly.Msg.MATH_TRIG_TAN = "tan"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "어떤 수에 대한, acos(arccosine) 값을 돌려줍니다."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "어떤 수에 대한, asin(arcsine) 값을 돌려줍니다."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "어떤 수에 대한, atan(arctangent) 값을 돌려줍니다."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "각도의 코사인을 반환합니다. (라디안 아님)"; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "각도의 사인을 반환합니다. (라디안 아님)"; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "각도의 탄젠트를 반환합니다. (라디안 아님)"; +Blockly.Msg.NEW_VARIABLE = "변수 만들기..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "새 변수 이름:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "서술 허가"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "사용:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://ko.wikipedia.org/wiki/함수_(프로그래밍)"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "미리 정의해 둔 '%1' 함수를 실행합니다."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://ko.wikipedia.org/wiki/함수_(프로그래밍)"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "미리 정의해 둔 '%1' 함수를 실행하고, 함수를 실행한 결과 값을 돌려줍니다."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "사용:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "'%1' 생성"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "이 함수를 설명하세요..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98_%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "함수 이름"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "함수"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "실행 후, 결과 값을 돌려주지 않는 함수를 만듭니다."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98_%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "다음을 돌려줌"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "실행 후, 결과 값을 돌려주는 함수를 만듭니다."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "경고: 이 함수에는, 같은 이름을 사용하는 매개 변수들이 있습니다."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "함수 정의 찾기"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "값이 참이라면, 두 번째 값을 반환합니다."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "경고: 이 블럭은, 함수 정의 블럭 안에서만 사용할 수 있습니다."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "매개 변수:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "함수에 값을 더합니다."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "매개 변수들"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "이 함수를 추가, 삭제, 혹은 재정렬합니다."; +Blockly.Msg.REDO = "다시 실행"; +Blockly.Msg.REMOVE_COMMENT = "내용 제거"; +Blockly.Msg.RENAME_VARIABLE = "변수 이름 바꾸기:"; +Blockly.Msg.RENAME_VARIABLE_TITLE = "'%1' 변수 이름을 바꾸기:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "내용 덧붙이기"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg.TEXT_APPEND_TO = "다음"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "'%1' 변수의 끝에 일부 텍스트를 덧붙입니다."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "소문자로"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "첫 문자만 대문자로"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "대문자로"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "영문 대소문자 형태를 변경해 돌려줍니다."; +Blockly.Msg.TEXT_CHARAT_FIRST = "에서, 첫 번째 문자 얻기"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "에서, 마지막부터 # 번째 위치의 문자 얻기"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "에서, 앞에서부터 # 번째 위치의 문자 얻기"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "문장"; +Blockly.Msg.TEXT_CHARAT_LAST = "에서, 마지막 문자 얻기"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "에서, 랜덤하게 한 문자 얻기"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "특정 번째 위치에서, 문자를 얻어내 돌려줍니다."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "텍스트에 항목을 추가합니다."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "가입"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "섹션을 추가, 제거하거나 순서를 변경하여 이 텍스트 블럭을 재구성합니다."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "끝에서부터 # 번째 문자까지"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "# 번째 문자까지"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "마지막 문자까지"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "문장"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "에서, 처음부터 얻어냄"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "에서, 마지막에서 # 번째부터 얻어냄"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "에서, 처음부터 # 번째 문자부터 얻어냄"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "문장 중 일부를 얻어내 돌려줍니다."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "문장"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "에서 다음 문장이 처음으로 나타난 위치 찾기 :"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "에서 다음 문장이 마지막으로 나타난 위치 찾기 :"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "두 번째 텍스트에서 첫 번째 텍스트가 처음 또는 마지막으로 발생한 색인 위치를 반환합니다. 텍스트가 없으면 %1을 반환합니다."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1이 비어 있습니다"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "입력된 문장이, 빈 문장(\"\")이면 참(true) 값을 돌려줍니다."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "텍스트 만들기"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "여러 개의 아이템들을 연결해(묶어), 새로운 문장을 만듭니다."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg.TEXT_LENGTH_TITLE = "다음 문장의 문자 개수 %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "입력된 문장의, 문자 개수를 돌려줍니다.(공백문자 포함)"; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg.TEXT_PRINT_TITLE = "다음 내용 출력 %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "원하는 문장, 수, 값 등을 출력합니다."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "수에 대해 사용자의 입력을 받습니다."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "문장에 대해 사용자의 입력을 받습니다."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "메시지를 활용해 수 입력"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "메시지를 활용해 문장 입력"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://ko.wikipedia.org/wiki/문자열"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "문자, 단어, 문장."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "양쪽의 공백 문자 제거"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "왼쪽의 공백 문자 제거"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "오른쪽의 공백 문자 제거"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "문장의 왼쪽/오른쪽/양쪽에서 스페이스 문자를 제거해 돌려줍니다."; +Blockly.Msg.TODAY = "오늘"; +Blockly.Msg.UNDO = "실행 취소"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "항목"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "'집합 %1' 생성"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://ko.wikipedia.org/wiki/%EB%B3%80%EC%88%98_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)"; +Blockly.Msg.VARIABLES_GET_TOOLTIP = "변수에 저장 되어있는 값을 돌려줍니다."; +Blockly.Msg.VARIABLES_SET = "%1를 %2로 설정"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "'%1 값 읽기' 블럭 생성"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://ko.wikipedia.org/wiki/%EB%B3%80%EC%88%98_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)"; +Blockly.Msg.VARIABLES_SET_TOOLTIP = "변수의 값을 입력한 값으로 변경해 줍니다."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "'%1' 변수는 이미 존재합니다."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/lb.js b/src/opsoro/server/static/js/blockly/msg/js/lb.js similarity index 84% rename from src/opsoro/apps/visual_programming/static/blockly/msg/js/lb.js rename to src/opsoro/server/static/js/blockly/msg/js/lb.js index af1e273..1fe9bc6 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/lb.js +++ b/src/opsoro/server/static/js/blockly/msg/js/lb.js @@ -7,11 +7,9 @@ goog.provide('Blockly.Msg.lb'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "Bemierkung derbäisetzen"; -Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated Blockly.Msg.CHANGE_VALUE_TITLE = "Wäert änneren:"; -Blockly.Msg.CHAT = "Mat ärem Mataarbechter chatten an deem Dir an dës Këscht tippt!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Collapse Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "Bléck opraumen"; +Blockly.Msg.COLLAPSE_ALL = "Bléck zesummeklappen"; Blockly.Msg.COLLAPSE_BLOCK = "Block zesummeklappen"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "Faarf 1"; Blockly.Msg.COLOUR_BLEND_COLOUR2 = "Faarf 2"; @@ -20,7 +18,7 @@ Blockly.Msg.COLOUR_BLEND_RATIO = "ratio"; Blockly.Msg.COLOUR_BLEND_TITLE = "mëschen"; Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; // untranslated -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Wielt eng Faarf vun der Palette."; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Sicht eng Faarf an der Palette eraus."; Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated Blockly.Msg.COLOUR_RANDOM_TITLE = "zoufälleg Faarf"; Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Eng zoufälleg Faarf eraussichen."; @@ -40,7 +38,7 @@ Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/L Blockly.Msg.CONTROLS_FOREACH_TITLE = "fir all Element %1 an der Lëscht %2"; Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For each item in a list, set the variable '%1' to the item, and then do some statements."; // untranslated Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "count with %1 from %2 to %3 by %4"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "zielt mat %1 vun %2 bis %3 mat %4"; Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; // untranslated Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block."; // untranslated Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block."; // untranslated @@ -54,18 +52,21 @@ Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "If a value is true, then do the first block Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; // untranslated -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "maachen"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1 mol widderhuelen"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "maach"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1-mol widderhuelen"; Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Do some statements several times."; // untranslated Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "widderhuele bis"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repeat while"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "While a value is false, then do some statements."; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "While a value is true, then do some statements."; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "Widderhuel soulaang"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Féiert d'Uweisungen aus, soulaang wéi de Wäert falsch ass."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Féiert d'Uweisungen aus, soulaang wéi de Wäert richteg ass"; +Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated Blockly.Msg.DELETE_BLOCK = "Block läschen"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated Blockly.Msg.DELETE_X_BLOCKS = "%1 Bléck läschen"; Blockly.Msg.DISABLE_BLOCK = "Block desaktivéieren"; -Blockly.Msg.DUPLICATE_BLOCK = "Duplizéieren"; +Blockly.Msg.DUPLICATE_BLOCK = "Eng Kopie maachen"; Blockly.Msg.ENABLE_BLOCK = "Block aktivéieren"; Blockly.Msg.EXPAND_ALL = "Bléck opklappen"; Blockly.Msg.EXPAND_BLOCK = "Block opklappen"; @@ -82,7 +83,7 @@ Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "create list with"; // untranslated Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "En Element op d'Lëscht derbäisetzen."; Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; // untranslated Blockly.Msg.LISTS_GET_INDEX_FIRST = "éischt"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# vum Schluss"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# vun hannen"; Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; Blockly.Msg.LISTS_GET_INDEX_GET = "get"; // untranslated Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "get and remove"; // untranslated @@ -91,18 +92,15 @@ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "Zoufall"; Blockly.Msg.LISTS_GET_INDEX_REMOVE = "ewechhuelen"; Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returns the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returns the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Schéckt en zoufällegt Element aus enger Lëscht zréck."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Removes and returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Removes and returns the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Removes and returns the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Removes the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Removes the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Removes the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Hëlt dat lescht Element aus enger Lëscht eraus."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Hëlt en zoufällegt Element aus enger Lëscht eraus."; Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "to # from end"; // untranslated @@ -114,10 +112,12 @@ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 ass dat éischt Element."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 ass dat éischt Element."; Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated Blockly.Msg.LISTS_INLIST = "an der Lëscht"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ass eidel"; @@ -128,20 +128,29 @@ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; // untransl Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "%1 ëmdréinen"; +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "als"; Blockly.Msg.LISTS_SET_INDEX_INSERT = "asetzen op"; Blockly.Msg.LISTS_SET_INDEX_SET = "set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserts the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserts the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Setzt d'Element um Ënn vun enger Lëscht derbäi."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserts the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Setzt d'Element um Enn vun enger Lëscht derbäi."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Setzt d'Element op eng zoufälleg Plaz an d'Lëscht derbäi."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sets the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setzt en zuofällegt Element an eng Lëscht."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setzt en zoufällegt Element an eng Lëscht."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeresch"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetesch"; Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -170,14 +179,14 @@ Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Lo Blockly.Msg.LOGIC_OPERATION_OR = "oder"; Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Return true if both inputs are true."; // untranslated Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true."; // untranslated -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "Test"; Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "wa falsch"; Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "wa wouer"; Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Gëtt d'Zomme vun zwou Zuelen."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Den Total vun den zwou Zuelen zréckginn."; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers."; // untranslated Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Return the difference of the two numbers."; // untranslated Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "D'Produkt vun den zwou Zuelen zréckginn."; @@ -187,14 +196,14 @@ Blockly.Msg.MATH_CHANGE_TITLE = "änneren %1 ëm %2"; Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; // untranslated Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated Blockly.Msg.MATH_IS_DIVISIBLE_BY = "is divisible by"; // untranslated Blockly.Msg.MATH_IS_EVEN = "ass gerued"; Blockly.Msg.MATH_IS_NEGATIVE = "ass negativ"; -Blockly.Msg.MATH_IS_ODD = "ass net gerued"; +Blockly.Msg.MATH_IS_ODD = "ass ongerued"; Blockly.Msg.MATH_IS_POSITIVE = "ass positiv"; Blockly.Msg.MATH_IS_PRIME = "ass eng Primzuel"; Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated @@ -206,7 +215,7 @@ Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg.MATH_NUMBER_TOOLTIP = "Eng Zuel."; Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "Duerchschnëtt vun der Lëscht"; +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "Moyenne vun der Lëscht"; Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "Maximum aus der Lëscht"; Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "median of list"; // untranslated Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "min of list"; // untranslated @@ -231,10 +240,10 @@ Blockly.Msg.MATH_RANDOM_INT_TITLE = "zoufälleg ganz Zuel tëscht %1 a(n) %2"; Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; // untranslated Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "opronnen"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "ofronnen"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "opronnen"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Eng Zuel op- oder ofronnen."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "ofrënnen"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "oprënnen"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Eng Zuel op- oder ofrënnen."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://lb.wikipedia.org/wiki/Racine carrée"; Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolut"; Blockly.Msg.MATH_SINGLE_OP_ROOT = "Quadratwuerzel"; Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number."; // untranslated @@ -258,36 +267,37 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // u Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated -Blockly.Msg.ME = "Mech"; -Blockly.Msg.NEW_VARIABLE = "Nei Variabel..."; +Blockly.Msg.NEW_VARIABLE = "Variabel uleeën..."; Blockly.Msg.NEW_VARIABLE_TITLE = "Neie variabelen Numm:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "mat:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "mat:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Create '%1'"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Dës Funktioun beschreiwen..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "eppes maachen"; Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "to"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "zréck"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; // untranslated Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; // untranslated Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; // untranslated Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated -Blockly.Msg.REMOVE_COMMENT = "Bemierkunge ewechhuelen"; +Blockly.Msg.REDO = "Widderhuelen"; +Blockly.Msg.REMOVE_COMMENT = "Bemierkung ewechhuelen"; Blockly.Msg.RENAME_VARIABLE = "Variabel ëmbenennen..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "All '%1' Variabelen ëmbenennen op:"; Blockly.Msg.TEXT_APPEND_APPENDTEXT = "Text drunhänken"; @@ -308,12 +318,15 @@ Blockly.Msg.TEXT_CHARAT_LAST = "get last letter"; // untranslated Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; // untranslated Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "En Element bei den Text derbäisetzen."; Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "join"; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "bis de Buschtaf #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "op de leschte Buschtaw"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "bis bei de Buschtaf #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "bis bei de leschte Buschtaw"; Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "am Text"; Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; // untranslated @@ -326,7 +339,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "am Text"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ass eidel"; Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated @@ -341,9 +354,15 @@ Blockly.Msg.TEXT_PRINT_TITLE = "%1 drécken"; Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; // untranslated Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Freet de Benotzer en Text."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Frot de Benotzer no engem Text."; Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "%1 duerch %2 a(n) %3 ersetzen"; +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg.TEXT_TEXT_TOOLTIP = "E Buschtaf, e Wuert oder eng Textzeil."; Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated @@ -352,6 +371,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untra Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated Blockly.Msg.TODAY = "Haut"; +Blockly.Msg.UNDO = "Réckgängeg maachen"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "Element"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated @@ -360,13 +380,13 @@ Blockly.Msg.VARIABLES_SET = "set %1 to %2"; // untranslated Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; @@ -374,9 +394,19 @@ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/lki.js b/src/opsoro/server/static/js/blockly/msg/js/lki.js new file mode 100644 index 0000000..b424015 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/lki.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.lki'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "گةپ دائن"; +Blockly.Msg.CHANGE_VALUE_TITLE = "تةغییر مقدار:"; +Blockly.Msg.CLEAN_UP = "تمیزکردن بلاکةل"; +Blockly.Msg.COLLAPSE_ALL = "چؤیچانن/پشکانن بلاکةل"; +Blockly.Msg.COLLAPSE_BLOCK = "چؤیچانن/پشکانن بلاک"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "رةنگ 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "رةنگ 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "نسبت"; +Blockly.Msg.COLOUR_BLEND_TITLE = "قاتی پاتی"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "دو رنگ را با نسبت مشخص‌شده مخلوط می‌کند (۰٫۰ - ۱٫۰)"; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/رةنگ"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "رةنگێ إژ تةختة رةنگ انتخاب کةن"; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "رةنگ بةختةکی"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = ".رةنگئ بةختةکی انتخاب کةن"; +Blockly.Msg.COLOUR_RGB_BLUE = "کاوو"; +Blockly.Msg.COLOUR_RGB_GREEN = "سؤز"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "سۆر"; +Blockly.Msg.COLOUR_RGB_TITLE = "رةنگ وة"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "ساخت یک رنگ با مقدار مشخص‌شده‌ای از سۆر، سؤز و کاوو. همهٔ مقادیر باید بین ۰ تا ۱۰۰ باشند."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "شکانِن حلقه"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "ادامه با تکرار بعدی حلقه"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "شکستن حلقهٔ شامل."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "پریدن از بقیهٔ حلقه و ادامه با تکرار بعدی."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "اخطار: این بلوک ممکن است فقط داخل یک حلقه استفاده شود."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "ئةرا هر مورد %1 وۀ نام لیست%2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "برای هر مورد در این فهرست، تنظیم متغیر «%1» به مورد و انجام تعدادی عبارت."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "با تعداد %1 از %2 به %3 با گام‌های %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "متغیر %1 را در مقادیر شروع‌شده از عدد انتهای به عدد انتهایی را دارد، با فواصل مشخص‌شده می‌شمارد و این بلوک مشخص‌شده را انجام می‌دهد."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "افزودن یک شرط به بلوک اگر."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "اضافه‌کردن نهایی، گرفتن همهٔ شرایط به بلوک اگر."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "افزودن، حذف یا بازمرتب‌سازی قسمت‌ها برای پیکربندی دوبارهٔ این بلوک اگر."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "آنگاه"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "اگر آنگاه"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "اگر"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "اگر یک مقدار صحیح است، سپس چند عبارت را انجام بده."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "اگر یک مقدار صحیح است، اول بلوک اول عبارات را انجام بده. در غیر این صورت بلوک دوم عبارات انجام بده."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "اگر مقدار اول صحیح بود، از آن بلوک اول عبارات را انجام بده. در غیر این صورت، اگر مقدار دوم صحیح است، بلوک دوم عبارات را انجام بده."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "اگر مقدار اول درست است، بلوک اول عبارات را انجام بده. در غیر این صورت، اگر مقدار دوم درست باشد بلوک دوم عبارات را انجام بده. اگر هیچ از مقادیر درست نبود، آخرین بلوک عبارات را انجام بده."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://lki.wikipedia.org/wiki/حلقه_فور"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "انجوم بی"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "%بار تکرار 1"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "انجام چةن عبارت چندین گِل."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "تکرار تا وةختێ گإ"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "تکرار در حالی که"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "تا زمانی که یک مقدار ناصحیح است، چند عبارت را انجام بده."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "تا زمانی که یک مقدار صحیح است، چند عبارت را انجام بده."; +Blockly.Msg.DELETE_ALL_BLOCKS = "حةذف کؤل %1 بلاکةل?"; +Blockly.Msg.DELETE_BLOCK = "پاک کردن بلاک"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "حةذف %1 بلاکةل"; +Blockly.Msg.DISABLE_BLOCK = "إ کار کةتن(غیرفعال‌سازی) بلاک"; +Blockly.Msg.DUPLICATE_BLOCK = "کؤپی کردن"; +Blockly.Msg.ENABLE_BLOCK = "إ کارآشتن(فعال)بلاک"; +Blockly.Msg.EXPAND_ALL = "کةلنگآ کردِن بلاکةل"; +Blockly.Msg.EXPAND_BLOCK = "کةلنگآ کردِن بلاک"; +Blockly.Msg.EXTERNAL_INPUTS = "ورودیةل خروجی"; +Blockly.Msg.HELP = "کؤمةک"; +Blockly.Msg.INLINE_INPUTS = "ورودیةل نوم جا"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "ایجاد فهرست خالی"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "فهرستی با طول صفر شامل هیچ رکورد داده‌ای بر می‌گرداند."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "لیست"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "اضافه‌کردن، حذف‌کردن یا ترتیب‌سازی مجدد بخش‌ها این بلوک فهرستی."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "ایجاد فهرست با"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "اضافه‌کردن یک مورد به فهرست."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "فهرستی از هر عددی از موارد می‌سازد."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "إژ أؤةل"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# إژ دؤما آخر"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "گِرتِن"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "گِرتِن و حةذف کردن"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "دؤمائن/آخرین"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "بةختةکی"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "حةذف کردن"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "اولین مورد یک فهرست را بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "موردی در محل مشخص‌شده بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "آخرین مورد در یک فهرست را بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "یک مورد تصادفی در یک فهرست بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "اولین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "آخرین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "مورد تصادفی‌ای را در فهرست حذف و بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "اولین مورد را در یک فهرست حذف می‌کند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "آخرین مورد را در یک فهرست حذف می‌کند."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "یک مورد تصادفی را یک فهرست حذف می‌کند."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "به # از انتها"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "به #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "به آخرین"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "گرفتن زیرمجموعه‌ای از ابتدا"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "گرفتن زیرمجموعه‌ای از # از انتها"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "گرفتن زیرمجموعه‌ای از #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "کپی از قسمت مشخص‌شدهٔ لیست درست می‌کند."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 آخرین مورد است."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 اولین مورد است."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "یافتن اولین رخ‌داد مورد"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "یافتن آخرین رخ‌داد مورد"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. %1 بر می‌گرداند اگر آیتم موجود نبود."; +Blockly.Msg.LISTS_INLIST = "در فهرست"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 خالی است"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "اگر فهرست خالی است مقدار صجیج بر می‌گرداند."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "طول %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "طول یک فهرست را برمی‌گرداند."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "فهرستی با %1 تکرارشده به اندازهٔ %2 می‌سازد"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "فهرستی شامل مقادیر داده‌شدهٔ تکرار شده عدد مشخص‌شده می‌سازد."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "به عنوان"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "درج در"; +Blockly.Msg.LISTS_SET_INDEX_SET = "مجموعه"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "موردی به ته فهرست اضافه می‌کند."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "موردی به ته فهرست الحاق می‌کند."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "مورد را به صورت تصادفی در یک فهرست می‌افزاید."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "اولین مورد در یک فهرست را تعیین می‌کند."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "مورد مشخص‌شده در یک فهرست را قرار می‌دهد."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "آخرین مورد در یک فهرست را تعیین می‌کند."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "یک مورد تصادفی در یک فهرست را تعیین می‌کند."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "ساخت لیست إژ متن"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "ساخت متن إژ لیست"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "همراه جداساز"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "نادرست"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "بازگرداندن یکی از صحیح یا ناصحیح."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "درست"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "بازگشت صحیح اگر هر دو ورودی با یکدیگر برابر باشد."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "بازگرداندن صحیح اگر ورودی اول بزرگتر از ورودی دوم باشد."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "بازگرداندن صحیح اگر ورودی اول بزرگتر یا مساوی یا ورودی دوم باشد."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "بازگرداندن صحیح اگر ورودی اول کوچکتر از ورودی دوم باشد."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "بازگرداندن صحیح اگر ورودی اول کوچکتر یا مساوی با ورودی دوم باشد."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "برگرداندن صحیح اگر هر دو ورودی با یکدیگر برابر نباشند."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "نه %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "صجیج باز می‌گرداند اگر ورودی نا صحیح باشند. ناصحیح بازمی‌گرداند اگر ورودی صحیح باشد."; +Blockly.Msg.LOGIC_NULL = "پةتی/خالی"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "تهی باز می گرداند"; +Blockly.Msg.LOGIC_OPERATION_AND = "و"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "یا"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "بازگرداندن صحیح اگر هر دو ورودی صحیح باشد."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "بازگرداندن صحیح اگر یکی از دو ورودی صحیح باشد."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "آزمائشت"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "اگر نادرست"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "اگر درست"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "بررسی وضعیت در «آزمایش». اگر وضعیت صحیح باشد، مقدار «اگر صحیح» را بر می‌گرداند در غیر اینصورت مقدار «اگر ناصحیح» را."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "بازگرداندن مقدار جمع دو عدد."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "بازگرداندن باقی‌ماندهٔ دو عدد."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "بازگرداندن تفاوت دو عدد."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "بازگرداندن حاصلضرب دو عدد."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "بازگرداندن اولین عددی که از توان عدد دوم حاصل شده باشد."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "تغییر %1 با %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "افزودن یک عدد به متغیر '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "یکی از مقادیر مشترک را برمی‌گرداند: π (۳٫۱۴۱…)، e (۲٫۷۱۸...)، φ (۱٫۶۱۸)، sqrt(۲) (۱٫۴۱۴)، sqrt(۱/۲) (۰٫۷۰۷...) و یا ∞ (بی‌نهایت)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "محدودکردن %1 پایین %2 بالا %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "محدودکردن یک عدد بین محدودیت‌های مشخص‌شده (بسته)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "تقسیم شده بر"; +Blockly.Msg.MATH_IS_EVEN = "زوج است"; +Blockly.Msg.MATH_IS_NEGATIVE = "منفی است"; +Blockly.Msg.MATH_IS_ODD = "فرد است"; +Blockly.Msg.MATH_IS_POSITIVE = "مثبت است"; +Blockly.Msg.MATH_IS_PRIME = "عدد اول است"; +Blockly.Msg.MATH_IS_TOOLTIP = "بررسی می‌کند که آیا یک عدد زوج، فرد، اول، کامل، مثبت، منفی یا بخش‌پذیر عدد خاصی باشد را بررسی می‌کند. درست یا نادرست باز می‌گرداند."; +Blockly.Msg.MATH_IS_WHOLE = "کامل است"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "باقی‌ماندهٔ %1 + %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "باقی‌ماندهٔ تقسیم دو عدد را بر می‌گرداند."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "شؤمارە یەک"; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "میانگین فهرست"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "بزرگ‌ترین فهرست"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "میانهٔ فهرست"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "گوجةرتةرین لیست"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "مد فهرست"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "مورد تصادفی از فهرست"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "انحراف معیار فهرست"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "جمع لیست"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "میانگین (میانگین ریاضی) مقادیر عددی فهرست را بر می‌گرداند."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "بزرگ‌ترین عدد در فهرست را باز می‌گرداند."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "میانهٔ عدد در فهرست را بر می‌گرداند."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "کوچک‌ترین عدد در فهرست را باز می‌گرداند."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "شایع‌ترین قلم(های) در فهرست را بر می‌گرداند."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "موردی تصادفی از فهرست را بر می‌گرداند."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "انحراف معیار فهرست را بر می‌گرداند."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "جمع همهٔ عددهای فهرست را باز می‌گرداند."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "کسر تصادفی"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "بازگرداندن کسری تصادفی بین ۰٫۰ (بسته) تا ۱٫۰ (باز)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "عدد صحیح تصادفی بین %1 تا %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "یک عدد تصادفی بین دو مقدار مشخص‌شده به صورت بسته باز می‌گرداند."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "گردکردن"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "گرد به پایین"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "گرد به بالا"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "گردکردن یک عدد به بالا یا پایین."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "مطلق"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "ریشهٔ دوم"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "قدر مطلق یک عدد را بازمی‌گرداند."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "بازگرداندن توان e یک عدد."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "لوگاریتم طبیعی یک عدد را باز می‌گرداند."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "بازگرداندن لگاریتم بر پایهٔ ۱۰ یک عدد."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "منفی‌شدهٔ یک عدد را باز می‌گرداند."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "بازگرداندن توان ۱۰ یک عدد."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "ریشهٔ دوم یک عدد را باز می‌گرداند."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "بازگرداندن آرک‌کسینوس درجه (نه رادیان)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = ".(بازگرداندن آرک‌سینوس درجه (نه رادیان"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "بازگرداندن آرک‌تانژانت درجه (نه رادیان)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "بازگرداندن کسینوس درجه (نه رادیان)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "بازگرداندن سینوس درجه (نه رادیان)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "بازگرداندن تانژانت یک درجه (نه رادیان)."; +Blockly.Msg.NEW_VARIABLE = "متغیر تازه..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "نام متغیر تازه:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "اجازه اظهارات"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "با:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "اجرای تابع تعریف‌شده توسط کاربر «%1»."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "اجرای تابع تعریف‌شده توسط کاربر «%1» و استفاده از خروجی آن."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "با:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "ساختن «%1»"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "انجام چیزی"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "به"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "تابعی می‌سازد بدون هیچ خروجی."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "بازگشت"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "تابعی با یک خروجی می‌سازد."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "اخطار: این تابعی پارامتر تکراری دارد."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "برجسته‌سازی تعریف تابع"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "اگر یک مقدار صحیح است، مقدار دوم را برگردان."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "اخطار: این بلوک احتمالاً فقط داخل یک تابع استفاده می‌شود."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "نام ورودی:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "اضافه کردن ورودی به تابع."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "ورودی‌ها"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "افزودن، حذف یا دوباره مرتب‌کردن ورودی این تابع."; +Blockly.Msg.REDO = "Redo"; // untranslated +Blockly.Msg.REMOVE_COMMENT = "پاک کردن گةپةل/قِسةل"; +Blockly.Msg.RENAME_VARIABLE = "تغییر نام متغیر..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "تغییر نام همهٔ متغیرهای «%1» به:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "چسباندن متن"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "به"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "الحاق متنی به متغیر «%1»."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "به حروف کوچک"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "به حروف بزرگ عنوان"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "به حروف بزرگ"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "بازگرداندن کپی متن در حالتی متفاوت."; +Blockly.Msg.TEXT_CHARAT_FIRST = "گرفتن اولین حرف"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "گرفتن حرف # از آخر"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "گرفتن حرف #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "در متن"; +Blockly.Msg.TEXT_CHARAT_LAST = "گرفتن آخرین حرف"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "گرفتن حرف تصادفی"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "حرفی در موقعیت مشخص‌شده بر می‌گرداند."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "افزودن یک مورد به متن."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "نام نؤیسی"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "اضافه‌کردن، حذف یا مرتب‌سازی بحش‌ها برای تنظیم مجدد این بلوک متنی."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "به حرف # از انتها"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "به حرف #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "به آخرین حرف"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "در متن"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "گرفتن زیرمتن از اولین حرف"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "گرفتن زیرمتن از حرف # به انتها"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "گرفتن زیرمتن از حرف #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "قسمت مشخصی‌شده‌ای از متن را بر می‌گرداند."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "در متن"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "اولین رخداد متن را بیاب"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "آخرین رخداد متن را بیاب"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد %1 باز می‌گرداند."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 خالی است"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "اضافه‌کردن صحیح اگر متن فراهم‌شده خالی است."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "ایجاد متن با"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "یک تکه‌ای از متن را با چسپاندن همهٔ تعداد از موارد ایجاد می‌کند."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "طول %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "بازگرداندن عددی از حروف (شامل فاصله‌ها) در متن فراهم‌شده."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "چاپ %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "چاپ متن، عدد یا هر مقدار دیگر مشخص‌شده."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "اعلان برای کاربر با یک عدد."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "اعلان برای کاربر برای یک متن."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "اعلان برای عدد با پیام"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "اعلان برای متن با پیام"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "یک حرف، کلمه یا خطی از متن."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "تراشیدن فاصله‌ها از هر دو طرف"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "تراشیدن فاصله‌ها از طرف چپ"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "تراشیدن فاصله‌ها از طرف چپ"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "کپی از متن با فاصله‌های حذف‌شده از یک یا هر دو پایان باز می‌گرداند."; +Blockly.Msg.TODAY = "ایمڕۆ"; +Blockly.Msg.UNDO = "Undo"; // untranslated +Blockly.Msg.VARIABLES_DEFAULT_NAME = "آیتم"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "درست‌کردن «تنظیم %1»"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "مقدار این متغیر را بر می‌گرداند."; +Blockly.Msg.VARIABLES_SET = "مجموعه %1 به %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "درست‌کردن «گرفتن %1»"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "متغیر برابر با خروجی را مشخص می‌کند."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/lrc.js b/src/opsoro/server/static/js/blockly/msg/js/lrc.js similarity index 89% rename from src/opsoro/apps/visual_programming/static/blockly/msg/js/lrc.js rename to src/opsoro/server/static/js/blockly/msg/js/lrc.js index 0639113..d59b713 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/lrc.js +++ b/src/opsoro/server/static/js/blockly/msg/js/lrc.js @@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.lrc'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "نظرتونه اضاف بکید"; -Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated Blockly.Msg.CHANGE_VALUE_TITLE = "ارزشت آلشت کو:"; -Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!"; // untranslated Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated Blockly.Msg.COLLAPSE_ALL = "کوچک کردن برشتیا"; Blockly.Msg.COLLAPSE_BLOCK = "کوچک کردن برشت"; @@ -62,7 +60,10 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "تا تکرار کو"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "تا تکرار کو"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "While a value is false, then do some statements."; // untranslated Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "While a value is true, then do some statements."; // untranslated +Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated Blockly.Msg.DELETE_BLOCK = "پاکسا کردن برشت"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated Blockly.Msg.DELETE_X_BLOCKS = "پاکسا کردن%1 د برشتیا"; Blockly.Msg.DISABLE_BLOCK = "ناکشتگر کردن برشت"; Blockly.Msg.DUPLICATE_BLOCK = "کپی کردن"; @@ -91,18 +92,15 @@ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "بختكی"; Blockly.Msg.LISTS_GET_INDEX_REMOVE = "ؤرداشتن"; Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returns the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returns the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Removes and returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Removes and returns the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Removes and returns the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Removes the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Removes the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Removes the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "to # from end"; // untranslated @@ -114,10 +112,12 @@ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 is the last item."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 is the first item."; // untranslated Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated Blockly.Msg.LISTS_INLIST = "د نوم گه"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 حالیه"; @@ -128,20 +128,29 @@ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; // untransl Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "چی"; Blockly.Msg.LISTS_SET_INDEX_INSERT = "بنه د"; Blockly.Msg.LISTS_SET_INDEX_SET = "set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserts the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserts the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserts the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sets the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -187,7 +196,7 @@ Blockly.Msg.MATH_CHANGE_TITLE = "آلشت بكيد %1 وا %2"; Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; // untranslated Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated @@ -258,35 +267,36 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // u Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated -Blockly.Msg.ME = "مه"; Blockly.Msg.NEW_VARIABLE = "آلشتگر تازه..."; Blockly.Msg.NEW_VARIABLE_TITLE = "نوم آلشتگر تازه:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "وا:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "وا:"; Blockly.Msg.PROCEDURES_CREATE_DO = "راس کردن%1"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "یه کار انجوم بیئت"; Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "سی"; Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "ورگنیئن"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; // untranslated Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; // untranslated Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "نوم داده:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "داده یا"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "نظر جا وه جا کو"; Blockly.Msg.RENAME_VARIABLE = "د نو نوم نیائن آلشتگر..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "د نو نوم نیائن %1 د تموم آلشتگریا د:"; @@ -308,6 +318,9 @@ Blockly.Msg.TEXT_CHARAT_LAST = "get last letter"; // untranslated Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; // untranslated Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "پیوسن"; Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated @@ -326,7 +339,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "د متن"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 حالیه"; Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated @@ -344,6 +357,12 @@ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // un Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; // untranslated Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated @@ -352,6 +371,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untra Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated Blockly.Msg.TODAY = "ئمروٙ"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "قلم"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated @@ -360,13 +380,13 @@ Blockly.Msg.VARIABLES_SET = "میزوکاری %1 سی %2"; Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; @@ -374,9 +394,19 @@ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/lt.js b/src/opsoro/server/static/js/blockly/msg/js/lt.js similarity index 77% rename from src/opsoro/apps/visual_programming/static/blockly/msg/js/lt.js rename to src/opsoro/server/static/js/blockly/msg/js/lt.js index abf9533..e6b4d8b 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/lt.js +++ b/src/opsoro/server/static/js/blockly/msg/js/lt.js @@ -6,11 +6,9 @@ goog.provide('Blockly.Msg.lt'); goog.require('Blockly.Msg'); -Blockly.Msg.ADD_COMMENT = "Pridėti komentarą"; -Blockly.Msg.AUTH = "Norint išsaugoti (ir dalintis) savo sukurtas programas, reikia prisijungti (autorizuotis)."; +Blockly.Msg.ADD_COMMENT = "Palikti komentarą"; Blockly.Msg.CHANGE_VALUE_TITLE = "Keisti reikšmę:"; -Blockly.Msg.CHAT = "Galite susirašinėti su projekto bendradarbiais."; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "Išvalyti blokus"; Blockly.Msg.COLLAPSE_ALL = "Suskleisti blokus"; Blockly.Msg.COLLAPSE_BLOCK = "Suskleisti bloką"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "1 spalva"; @@ -19,7 +17,7 @@ Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/" Blockly.Msg.COLOUR_BLEND_RATIO = "santykis"; Blockly.Msg.COLOUR_BLEND_TITLE = "sumaišyk"; Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Sumaišo dvi spalvas su pateiktu santykiu (0.0 - 1.0)."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://lt.wikipedia.org/wiki/Spalva"; Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Pasirinkti spalvą iš paletės."; Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated Blockly.Msg.COLOUR_RANDOM_TITLE = "atsitiktinė spalva"; @@ -28,7 +26,7 @@ Blockly.Msg.COLOUR_RGB_BLUE = "mėlyna"; Blockly.Msg.COLOUR_RGB_GREEN = "žalia"; Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated Blockly.Msg.COLOUR_RGB_RED = "raudona"; -Blockly.Msg.COLOUR_RGB_TITLE = "RGB spalva:"; +Blockly.Msg.COLOUR_RGB_TITLE = "spalva su"; Blockly.Msg.COLOUR_RGB_TOOLTIP = "Spalvą galima sudaryti iš raudonos, žalios ir mėlynos dedamųjų. Kiekvienos intensyvumas nuo 0 iki 100."; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "nutraukti kartojimą"; @@ -42,7 +40,7 @@ Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Kartok veiksmus, kol kintamasis \"%1\" p Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated Blockly.Msg.CONTROLS_FOR_TITLE = "kartok, kai %1 kinta nuo %2 iki %3 po %4"; Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Kartoti veiksmus su kiekvienu sąrašo elementu, priskirtu kintamajam \"%1\"."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Pridėti sąlygą"; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Pridėti sąlygą „jei“ blokui."; Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Pridėti veiksmų vykdymo variantą/\"šaką\", kai netenkinama nė viena sąlyga."; Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Galite pridėt/pašalinti/pertvarkyti sąlygų \"šakas\"."; @@ -54,7 +52,7 @@ Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Jei sąlyga tenkinama, atlikti jai priklaus Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Jei pirma sąlyga tenkinama, atlikti jai priklausančius veiksmus, O jei ne, tikrinti antrą sąlygą -- ir jei ši tenkinama, atlikti jos veiksmus."; Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Jei pirma sąlyga tenkinama, atlikti jai priklausančius veiksmus, O jei ne, tikrinti antrą sąlygą -- ir jei ši tenkinama, atlikti jos veiksmus. Kitais atvejais -- atlikti paskutinio bloko veiksmus."; Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = ":"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "daryti"; Blockly.Msg.CONTROLS_REPEAT_TITLE = "pakartokite %1 kartus"; Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Leidžia atlikti išvardintus veiksmus kelis kartus."; Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated @@ -62,25 +60,28 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "kartok, kol pasieksi"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "kartok kol"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Kartoja veiksmus, kol bus pasiekta nurodyta sąlyga."; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Kartoja veiksmus, kol sąlyga tenkinama."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Ištrinti visus %1 blokus?"; Blockly.Msg.DELETE_BLOCK = "Ištrinti bloką"; +Blockly.Msg.DELETE_VARIABLE = "Ištrinti „%1“ kintamąjį"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated Blockly.Msg.DELETE_X_BLOCKS = "Ištrinti %1 blokus"; Blockly.Msg.DISABLE_BLOCK = "Išjungti bloką"; Blockly.Msg.DUPLICATE_BLOCK = "Kopijuoti"; Blockly.Msg.ENABLE_BLOCK = "Įjungti bloką"; Blockly.Msg.EXPAND_ALL = "Išskleisti blokus"; -Blockly.Msg.EXPAND_BLOCK = "Išplėsti Bloką"; +Blockly.Msg.EXPAND_BLOCK = "Išskleisti bloką"; Blockly.Msg.EXTERNAL_INPUTS = "Išdėstyti stulpeliu, kai daug parametrų"; Blockly.Msg.HELP = "Pagalba"; Blockly.Msg.INLINE_INPUTS = "Išdėstyti vienoje eilutėje"; Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "tuščias sąrašas"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Grąžina sąrašą, ilgio 0, neturintį duomenų"; Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "sąrašas"; Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "sąrašas:"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Add an item to the list."; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "sukurti sąrašą su"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Pridėti elementą į sąrašą."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Sukurti sąrašą iš bet kokio skaičiaus elementų."; Blockly.Msg.LISTS_GET_INDEX_FIRST = "pirmas"; Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# nuo galo"; Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated @@ -88,21 +89,18 @@ Blockly.Msg.LISTS_GET_INDEX_GET = "paimk"; Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "paimk ir ištrink"; Blockly.Msg.LISTS_GET_INDEX_LAST = "paskutinis"; Blockly.Msg.LISTS_GET_INDEX_RANDOM = "atsitiktinis"; -Blockly.Msg.LISTS_GET_INDEX_REMOVE = "ištrink"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "pašalinti"; Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returns the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Grąžina pirmąjį sąrašo elementą."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Gražina objektą į nurodyta poziciją sąraše."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Grąžina paskutinį elementą iš sąrašo."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Grąžina atsitiktinį elementą iš sąrašo."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Removes and returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Removes and returns the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Removes and returns the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Removes the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Removes the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Removes the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "iki # nuo galo"; @@ -114,45 +112,56 @@ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "sąrašo dalis nuo # nuo galo"; Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "sąrašo dalis nuo #"; Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 yra paskutinis objektas."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 yra pirmasis objektas."; Blockly.Msg.LISTS_INDEX_OF_FIRST = "rask pirmą reikšmę"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "rask paskutinę reikšmę"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Grąžina pirmos/paskutinės reikšmės eilės nr. sąraše. Grąžina 0, jei reikšmės neranda."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Grąžina pirmos/paskutinės reikšmės eilės nr. sąraše. Grąžina %1, jei reikšmės neranda."; Blockly.Msg.LISTS_INLIST = "sąraše"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 yra tuščias"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty."; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Grąžina „true“, jeigu sąrašas tuščias."; Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated Blockly.Msg.LISTS_LENGTH_TITLE = "ilgis %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; // untranslated +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Grąžina sąrašo ilgį."; Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_REPEAT_TITLE = "sukurk sąrašą, kuriame %1 bus %2 kartus"; Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated -Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "reikšmę"; +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "kaip"; Blockly.Msg.LISTS_SET_INDEX_INSERT = "įterpk į vietą"; Blockly.Msg.LISTS_SET_INDEX_SET = "priskirk elementui"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserts the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserts the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Įterpią objektą į nurodytą poziciją sąraše."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sets the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "didėjančia tvarka"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "mažėjančia tvarka"; +Blockly.Msg.LISTS_SORT_TITLE = "rūšiuoti %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Rūšiuoti sąrašo kopiją."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "abecėlės, ignoruoti raidžių dydį"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "skaitmeninis"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "abėcėlės"; Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "su dalikliu"; Blockly.Msg.LOGIC_BOOLEAN_FALSE = "klaidinga"; Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Reikšmė gali būti \"teisinga\"/\"Taip\" arba \"klaidinga\"/\"Ne\"."; Blockly.Msg.LOGIC_BOOLEAN_TRUE = "tiesa"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Tenkinama, jei abu reiškiniai lygūs."; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Return true if the first input is greater than the second input."; // untranslated Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Return true if the first input is greater than or equal to the second input."; // untranslated @@ -167,7 +176,7 @@ Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; Blockly.Msg.LOGIC_NULL_TOOLTIP = "Reikšmė nebuvo nurodyta..."; Blockly.Msg.LOGIC_OPERATION_AND = "ir"; Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated -Blockly.Msg.LOGIC_OPERATION_OR = "ar"; +Blockly.Msg.LOGIC_OPERATION_OR = "arba"; Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Bus teisinga, kai abi sąlygos bus tenkinamos."; Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true."; // untranslated Blockly.Msg.LOGIC_TERNARY_CONDITION = "sąlyga"; @@ -177,17 +186,17 @@ Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "jei taip"; Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Jeigu sąlygą tenkinama, grąžina pirmą reikšmę, o jei ne - antrąją."; Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Grąžina dviejų skaičių suma."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Grąžina dviejų skaičių sumą."; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Grąžina dviejų skaičių dalmenį."; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Grąžina dviejų skaičių skirtumą."; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Grąžina dviejų skaičių sandaugą."; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Grąžina pirmą skaičių pakeltą laipsniu pagal antrą skaičių."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; Blockly.Msg.MATH_CHANGE_TITLE = "padidink %1 (emptypage) %2"; Blockly.Msg.MATH_CHANGE_TOOLTIP = "Prideda skaičių prie kintamojo '%1'. Kai skaičius neigiamas - gaunasi atimtis."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "apribok %1 tarp %2 ir %3"; Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated @@ -199,11 +208,11 @@ Blockly.Msg.MATH_IS_POSITIVE = "yra teigiamas"; Blockly.Msg.MATH_IS_PRIME = "yra pirminis"; Blockly.Msg.MATH_IS_TOOLTIP = "Patikrina skaičiaus savybę: (ne)lyginis/pirminis/sveikasis/teigiamas/neigiamas/dalus iš x."; Blockly.Msg.MATH_IS_WHOLE = "yra sveikasis"; -Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; Blockly.Msg.MATH_MODULO_TITLE = "dalybos liekana %1 ÷ %2"; Blockly.Msg.MATH_MODULO_TOOLTIP = "Return the remainder from dividing the two numbers."; // untranslated Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://lt.wikipedia.org/wiki/Skaičius"; Blockly.Msg.MATH_NUMBER_TOOLTIP = "Skaičius."; Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "vidurkis"; @@ -216,77 +225,78 @@ Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standartinis nuokrypis sąraše"; Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "suma"; Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Return the average (arithmetic mean) of the numeric values in the list."; // untranslated Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Return the largest number in the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Return the median number in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Grąžinti sąrašo medianą."; Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Return the smallest number in the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Return a list of the most common item(s) in the list."; // untranslated -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Return a random element from the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Grąžinti sąrašą dažniausių elementų sąraše."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Grąžinti atsitiktinį elementą iš sąrašo."; Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list."; // untranslated Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "didžiausia reikšmė"; Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "atsitiktinis sk. nuo 0 iki 1"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "atsitiktinė trupmena"; Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Atsitiktinė trupmena nuo 0 (imtinai) iki 1 (neimtinai)."; -Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; Blockly.Msg.MATH_RANDOM_INT_TITLE = "atsitiktinis sveikas sk. nuo %1 iki %2"; Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; // untranslated -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; // untranslated +Blockly.Msg.MATH_ROUND_HELPURL = "https://lt.wikipedia.org/wiki/Apvalinimas"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "apvalink"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "apvalink žemyn"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "apvalink aukštyn"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Round a number up or down."; // untranslated +Blockly.Msg.MATH_ROUND_TOOLTIP = "Suapvalinti skaičių į žemesnę ar aukštesnę reikšmę."; Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "modulis"; -Blockly.Msg.MATH_SINGLE_OP_ROOT = "kv. šaknis"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "kvadratinė šaknis"; Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Skaičiaus modulis - reikšmė be ženklo (panaikina minusą)."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Grąžinti skaičių laipsniu e."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Grąžinti skaičiaus natūrinį logaritmą."; Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Return the base 10 logarithm of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Neigiamas skaičius"; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Grąžina skaičiui priešingą skaičių."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Grąžinti skaičių laipsniu 10."; Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Return the square root of a number."; // untranslated Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://lt.wikipedia.org/wiki/Trigonometrinės_funkcijos"; Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated -Blockly.Msg.ME = "Aš"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Grąžinti skaičiaus arkkosinusą."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Grąžinti skaičiaus arksinusą."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Grąžinti skaičiaus arktangentą."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Grąžinti laipsnio kosinusą (ne radiano)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Grąžinti laipsnio sinusą (ne radiano)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Grąžinti laipsnio tangentą (ne radiano)."; Blockly.Msg.NEW_VARIABLE = "Naujas kintamasis..."; Blockly.Msg.NEW_VARIABLE_TITLE = "Naujo kintamojo pavadinimas:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "leisti vidinius veiksmus"; Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "pagal:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Vykdyti sukurtą komandą \"%1\"."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Įvykdyti komandą \"%1\" ir naudoti jos suskaičiuotą (atiduotą) reikšmę."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "su:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Sukurti \"%1\""; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "daryk kažką"; Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "komanda:"; Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Sukuria procedūrą - komandą, kuri nepateikia jokio rezultato (tik atlieka veiksmus)."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "duok"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Sukuria funkciją - komandą, kuri ne tik atlieka veiksmus bet ir pateikia (grąžina/duoda) rezultatą."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Ši komanda turi du vienodus gaunamų duomenų pavadinimus."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Jeigu pirma reikšmė yra teisinga (sąlyga tenkinama), grąžina antrą reikšmę."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Perspėjimas: šis blokas gali būti naudojamas tik aprašant funkciją."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "parametro pavadinimas:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Pridėti funkcijos parametrą (gaunamų duomenų pavadinimą)."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "gaunami duomenys (parametrai)"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Tvarkyti komandos gaunamus duomenis (parametrus)."; +Blockly.Msg.REDO = "Atkurti"; Blockly.Msg.REMOVE_COMMENT = "Pašalinti komentarą"; Blockly.Msg.RENAME_VARIABLE = "Pervardyti kintamajį..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Pervadinti visus '%1' kintamuosius į:"; @@ -299,15 +309,18 @@ Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = " mažosiom raidėm"; Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = " Pavadinimo Raidėmis"; Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = " DIDŽIOSIOM RAIDĖM"; Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated -Blockly.Msg.TEXT_CHARAT_FIRST = "raidė pradinė"; +Blockly.Msg.TEXT_CHARAT_FIRST = "gauti pirmą raidę"; Blockly.Msg.TEXT_CHARAT_FROM_END = "raidė nuo galo #"; -Blockly.Msg.TEXT_CHARAT_FROM_START = "raidė nr."; +Blockly.Msg.TEXT_CHARAT_FROM_START = "gauti raidę #"; Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "teksto"; -Blockly.Msg.TEXT_CHARAT_LAST = "raidė paskutinė"; -Blockly.Msg.TEXT_CHARAT_RANDOM = "raidė atsitiktinė"; +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "tekste"; +Blockly.Msg.TEXT_CHARAT_LAST = "gauti paskutinę raidę"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "gauti atsitiktinę raidę"; Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Pridėti teksto elementą."; Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "sujunk"; Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated @@ -315,7 +328,7 @@ Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "iki raidės nuo galo #"; Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "iki raidės #"; Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "iki pabaigos"; Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "teksto"; +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "tekste"; Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "dalis nuo pradžios"; Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "dalis nuo raidės #"; Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "dalis nuo raidės #"; @@ -326,12 +339,12 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "tekste"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "rask,kur pirmą kartą paminėta"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "rask,kur paskutinį kartą paminėta"; Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 yra tuščias"; Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "tekstas iš:"; +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "sukurti tekstą su"; Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg.TEXT_LENGTH_TITLE = "teksto %1 ilgis"; @@ -340,10 +353,16 @@ Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#pr Blockly.Msg.TEXT_PRINT_TITLE = "spausdinti %1"; Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; // untranslated Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prašyti vartotoją įvesti skaičių."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prašyti vartotoją įvesti tekstą."; Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "paprašyk įvesti skaičių :"; Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "paprašyk įvesti tekstą :"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg.TEXT_TEXT_TOOLTIP = "Tekstas (arba žodis, ar raidė)"; Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated @@ -351,7 +370,8 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "išvalyk tarpus šonuose"; Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "išvalyk tarpus pradžioje"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "išvalyk tarpus pabaigoje"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated -Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.TODAY = "Šiandien"; +Blockly.Msg.UNDO = "Anuliuoti"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "elementas"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Sukurk \"priskirk %1\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated @@ -360,13 +380,13 @@ Blockly.Msg.VARIABLES_SET = "priskirk %1 = %2"; Blockly.Msg.VARIABLES_SET_CREATE_GET = "Sukurti 'kintamasis %1'"; Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; @@ -374,9 +394,19 @@ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/lv.js b/src/opsoro/server/static/js/blockly/msg/js/lv.js new file mode 100644 index 0000000..31b4d74 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/lv.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.lv'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Pievienot komentāru"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Mainīt vērtību:"; +Blockly.Msg.CLEAN_UP = "Sakopt blokus"; +Blockly.Msg.COLLAPSE_ALL = "Sakļaut blokus"; +Blockly.Msg.COLLAPSE_BLOCK = "Sakļaut bloku"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "1. krāsa"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "2. krāsa"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "attiecība"; +Blockly.Msg.COLOUR_BLEND_TITLE = "sajaukt"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Sajauc kopā divas krāsas ar doto attiecību (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://lv.wikipedia.org/wiki/Krāsa"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Izvēlēties krāsu no paletes."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "nejauša krāsa"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Izvēlēties krāsu pēc nejaušības principa."; +Blockly.Msg.COLOUR_RGB_BLUE = "zila"; +Blockly.Msg.COLOUR_RGB_GREEN = "zaļa"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "sarkana"; +Blockly.Msg.COLOUR_RGB_TITLE = "veido krāsu no"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Izveidot krāsu ar norādīto daudzumu sarkanā, zaļā un zilā toņu. Visas vērtības ir starp 0 un 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "iet ārā no cikla"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "turpināt ar cikla nākamo iterāciju"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Iet ārā no iekļaujošā cikla"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Nepildīt atlikušo cikla daļu bet sākt nākamo iterāciju."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Brīdinājums: šo bloku drīkst izmantot tikai cikla iekšienē."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "visiem %1 no saraksta %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Katram objektam no saraksta piešķirt mainīgajam '%1' šo objektu un izpildīt komandas."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "skaitīt %1 no %2 līdz %3 ar soli %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Ļauj mainīgajam '%1' pieņemt vērtības no sākuma līdz beigu vērtībai, un izpildīt iekļautos blokus katrai no šīm pieņemtajām vērtībām."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Pievienot nosacījumu \"ja\" blokam."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Pievienot gala nosacījumu \"ja\" blokam."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Pievienot, noņemt vai mainīt sekciju secību šim \"ja\" blokam."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "citādi"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "citādi, ja"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "ja"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Ja vērtība ir patiesa, tad izpildīt komandas."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Ja vērtība ir patiesa, tad izpildīt pirmo bloku ar komandām. Citādi izpildīt otro bloku ar komandām."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Ja pirmā vērtība ir patiesa, tad izpildīt pirmo bloku ar komandām. Citādi, ja otrā vērtība ir patiesa, izpildīt otro bloku ar komandām."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Ja pirmā vērtība ir patiesa, tad izpildīt pirmo bloku ar komandām. Citādi, ja otrā vērtība ir patiesa, izpildīt otro bloku ar komandām. Ja neviena no vertībām nav patiesa, tad izpildīt pēdējo bloku ar komandām."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://lv.wikipedia.org/wiki/Cikls"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "izpildi"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "atkārtot %1 reizes"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Izpildīt komandas vairākas reizes."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "atkārtot līdz"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "atkārtot kamēr"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Izpildīt komandas, kamēr vērtība ir nepatiesa."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Izpildīt komandas, kamēr vērtība ir patiesa."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Izdzēst visus %1 blokus?"; +Blockly.Msg.DELETE_BLOCK = "Izmest bloku"; +Blockly.Msg.DELETE_VARIABLE = "Izdzēst mainīgo \"%1\""; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Mainīgais \"%2\" tiek izmantots %1 vietās. Dzēst?"; +Blockly.Msg.DELETE_X_BLOCKS = "Izmest %1 blokus"; +Blockly.Msg.DISABLE_BLOCK = "Atspējot bloku"; +Blockly.Msg.DUPLICATE_BLOCK = "Dublēt"; +Blockly.Msg.ENABLE_BLOCK = "Iespējot bloku"; +Blockly.Msg.EXPAND_ALL = "Izvērst blokus"; +Blockly.Msg.EXPAND_BLOCK = "Izvērst bloku"; +Blockly.Msg.EXTERNAL_INPUTS = "Ārējie ievaddati"; +Blockly.Msg.HELP = "Palīdzība"; +Blockly.Msg.INLINE_INPUTS = "Iekšējie ievaddati"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "izveidot tukšu sarakstu"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Izveidot sarakstu bez elementiem tajā."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "saraksts"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Pievienot, noņemt vai mainīt sekciju secību šim \"saraksta\" blokam."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "izveidot sarakstu no"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Pievienot objektu sarakstam."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Izveidot sarakstu no jebkura skaita vienību."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "pirmo"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "no beigām numur"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "paņemt"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "paņemt uz dzēst"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "pēdējo"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "nejauši izvēlētu"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "dzēst"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Atgriež pirmo saraksta elementu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Atgriež norādīto elementu no saraksta."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Atgriež pēdējo saraksta elementu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Atgriež nejauši izvēlētu saraksta elementu"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Atgriež un izdzēš saraksta pirmo elementu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Atgriež un izdzēš no saraksta norādīto elementu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Atgriež un izdzēš saraksta pēdējo elementu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Atgriež un izdzēš no saraksta nejauši izvēlētu elementu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Izdēš pirmo saraksta elementu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Izdēš norādīto elementu no saraksta."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Izdēš pēdējo saraksta elementu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Izdzēš no saraksta nejauši izvēlētu elementu."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "līdz pozīcijai no beigām"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "līdz pozīcijai"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "līdz beigām"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "paņemt apakšsarakstu no sākuma"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "paņemt apakšsarakstu no beigām no pozīcijas"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "paņemt apakšsarakstu no pozīcijas"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Nokopēt daļu no dotā saraksta."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "Saraksta elementu numerācija no beigām sākas no %1"; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "Saraksta elementu numerācija sākas no %1"; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "atrast pirmo elementu, kas vienāds ar"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "atrast pēdējo elementu, kas vienāds ar"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Atgriež pozīciju sarakstā, kurā atrodas dotais objekts. Atgriež %1 ja objekts neatrodas sarakstā."; +Blockly.Msg.LISTS_INLIST = "sarakstā"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ir tukšs"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Patiess, ja saraksts ir tukšs."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "%1 garums"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Atgriež elementu skaitu srakstā."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "saraksts no %1 atkārtots %2 reizes"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Izveido sarakstu, kas sastāv no dotās vērtības noteiktu reižu skaita."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "kā"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "ievieto"; +Blockly.Msg.LISTS_SET_INDEX_SET = "aizvieto"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Ievieto elementu saraksta sākumā."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Ievieto sarakstā elementu norādītajā pozīcijā."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Pievieno elementu saraksta beigās."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Ievieto sarakstā jaunu elementu nejauši izvēlētā pozīcijā."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Aizvieto elementu saraksta sākumā."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Aizvieto sarakstā elementu norādītajā pozīcijā."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Aizvieto elementu saraksta beigās."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Aizvieto sarakstā elementu nejauši izvēlētā pozīcijā."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "augošā"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "dilstošā"; +Blockly.Msg.LISTS_SORT_TITLE = "Sakārtot sarakstu no %3 elementiem %2 secībā %1"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Saraksta sakārtota kopija."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "pēc alfabēta, ignorēt mazos/lielos burtus"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "skaitliski"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "pēc alfabēta"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "vārdu saraksts no teksta"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "izveidot tekstu no saraksta"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Apvienot tekstu izmantojot atdalītāju."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Sadalīt tekstu vārdos izmantojot atdalītāju."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "ar atdalītāju"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "aplams"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Atgriež rezultātu \"patiess\" vai \"aplams\"."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "patiess"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://lv.wikipedia.org/wiki/Nevien%C4%81d%C4%ABba"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Patiess, ja abas puses ir vienādas."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Patiess, ja kreisā puse ir lielāka par labo pusi."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Patiess, ja kreisā puse ir lielāka vai vienāda ar labo pusi."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Patiess, ja kreisā puse ir mazāka par labo pusi."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Patiess, ja kreisā puse ir mazāka vai vienāda ar labo pusi."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Patiess, ja abas puses nav vienādas."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "ne %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Patiess, ja arguments ir aplams."; +Blockly.Msg.LOGIC_NULL = "nekas"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Atgriež neko."; +Blockly.Msg.LOGIC_OPERATION_AND = "un"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "vai"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Patiess, ja abas puses ir patiesas."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Patiess, ja vismaz viena puse ir patiesa."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "nosacījums"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "ja aplams"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "ja patiess"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Pārbaudīt nosacījumu. Ja 'nosacījums' ir patiess, atgriež vērtību 'ja patiess', pretējā gadījumā vērtību 'ja aplams'."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://lv.wikipedia.org/wiki/Aritm%C4%93tika"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Atgriež divu skaitļu summu."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Atgriež divu skaitļu dalījumu."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Atgriež divu skaitļu starpību."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Atgriež divu skaitļu reizinājumu."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Atgriež pirmo skaitli kāpinātu pakāpē otrais skaitlis."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "izmainīt %1 par %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Pieskaitīt doto skaitli mainīgajam '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Atgriež kādu no matemātikas konstantēm: π (3.141…), e (2.718…), φ (1.618…), √(2) (1.414…), √(½) (0.707…), ∞ (bezgalība)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "ierobežot %1 no %2 līdz %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Ierobežo skaitli no noteiktajās robežās (ieskaitot galapunktus)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "dalās bez atlikuma ar"; +Blockly.Msg.MATH_IS_EVEN = "ir pāra"; +Blockly.Msg.MATH_IS_NEGATIVE = "ir negatīvs"; +Blockly.Msg.MATH_IS_ODD = "ir nepāra"; +Blockly.Msg.MATH_IS_POSITIVE = "ir pozitīvs"; +Blockly.Msg.MATH_IS_PRIME = "ir pirmskaitlis"; +Blockly.Msg.MATH_IS_TOOLTIP = "Pārbauda, vai skaitlis ir pāra, nepāra, vesels, pozitīvs, negatīvs vai dalās ar noteiktu skaitli. Atgriež \"patiess\" vai \"aplams\"."; +Blockly.Msg.MATH_IS_WHOLE = "ir vesels"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "atlikums no %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Atlikums no divu skaitļu dalījuma."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://lv.wikipedia.org/wiki/Skaitlis"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Skaitlis."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "vidējais"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "lielākais"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediāna"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "mazākais"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "moda"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "nejaušs"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standartnovirze"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "summa"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Atgriež dotā saraksta vidējo aritmētisko vērtību."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Atgriež lielāko vērtību no saraksta."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Atgriež dotā saraksta mediānas vērtību."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Atgriež mazāko vērtību no saraksta."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Atgriež dotā saraksta biežāk sastopamās vērtības (modas)."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Atgriež nejauši izvēlētu vērtību no dotā saraksta."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Atgriež dotā saraksta standartnovirzi."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Saskaitīt visus skaitļus no dotā saraksta."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "nejaušs skaitlis [0..1)"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Atgriež nejaušu reālo skaitli robežās no 0 (iekļaujot) līdz 1 (neiekļaujot)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "nejaušs vesels skaitlis no %1 līdz %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Atgriež nejaušu veselu skaitli dotajās robežās (iekļaujot galapunktus)"; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "noapaļot"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "apaļot uz leju"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "apaļot uz augšu"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Noapaļot skaitli uz augšu vai uz leju."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://lv.wikipedia.org/wiki/Kvadr%C4%81tsakne"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolūtā vērtība"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "kvadrātsakne"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Atgriež skaitļa absolūto vērtību."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Atgriež e pakāpē dotais skaitlis."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Atgriež skaitļa naturālo logaritmu."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Atgriež skaitļa logaritmu pie bāzes 10."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Atgriež pretējo skaitli."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Atgriež 10 pakāpē dotais skaitlis."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Atgriež skaitļa kvadrātsakni."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://lv.wikipedia.org/wiki/Trigonometrisk%C4%81s_funkcijas"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Arkkosinuss (grādos)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Arksinuss (grādos)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Arktangenss (grādos)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Kosinuss no grādiem (nevis radiāniem)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Sinuss no grādiem (nevis radiāniem)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Tangenss no grādiem (nevis radiāniem)."; +Blockly.Msg.NEW_VARIABLE = "Izveidot mainīgo..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Jaunā mainīgā vārds:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "atļaut apakškomandas"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "ar:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Izpildīt iepriekš definētu funkcju '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Izpildīt iepriekš definētu funkcju '%1' un izmantot tās rezultātu."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "ar:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Izveidot '%1' izsaukumu"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Funkcijas apraksts..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "darīt kaut ko"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "funkcija"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Izveido funkciju, kas neatgriež rezultātu."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "atgriezt"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Izveido funkciju, kas atgriež rezultātu."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Brīdinājums: funkcijai ir vienādi argumenti."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Izcelt funkcijas definīciju"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Ja pirmā vērtība ir \"patiesa\", tad atgriezt otro vērtību."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Brīdinājums: Šo bloku var izmantot tikai funkcijas definīcijā."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "arguments:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Pievienot funkcijai argumentu."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "argumenti"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Pievienot, pārkārtot vai dzēst funkcijas argumentus."; +Blockly.Msg.REDO = "Atcelt atsaukšanu"; +Blockly.Msg.REMOVE_COMMENT = "Noņemt komentāru"; +Blockly.Msg.RENAME_VARIABLE = "Pārdēvēt mainīgo..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Pārdēvējiet visus '%1' mainīgos:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "pievienot tekstu"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "tekstam"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Pievienot tekstu mainīgajam '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "kā mazie burti"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "kā Nosaukuma Burti"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "kā LIELIE BURTI"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Atgriež teksta kopiju ar mainītiem lielajiem/mazajiem burtiem."; +Blockly.Msg.TEXT_CHARAT_FIRST = "paņemt pirmo burtu"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "paņemt no beigām burtu #"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "paņemt burtu #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "tekstā"; +Blockly.Msg.TEXT_CHARAT_LAST = "paņemt pēdējo burtu"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "paņemt nejaušu burtu"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Atgriež burtu dotajā pozīcijā."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Pievienot tekstam objektu."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "savienot"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Pievienot, noņemt vai mainīt sekciju secību šim \"teksta\" blokam."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "līdz burtam nr (no beigām)"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "līdz burtam nr"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "līdz pēdējam burtam"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "no teksta"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "paņemt apakšvirkni no sākuma"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "paņemt apakšvirkni no beigām sākot ar burta nr"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "paņemt apakšvirkni sākot no burta nr"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Atgriež norādīto teksta daļu."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "tekstā"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "meklēt pirmo vietu, kur sākas teksts"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "meklēt pēdējo vietu, kur sākas teksts"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Meklē pirmā teksta rindu otrajā tekstā. Atgriež pozīciju otrajā tekstā, kurā sākas pirmais teksts. Atgriež %1 ja pirmā teksta rinda nav atrasta."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ir tukšs"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Patiess, ja teksts ir tukšs."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "veidot tekstu no"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Izveidot tekstu savienojot dotos argumentus."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "garums tekstam %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Atgriež burtu skaitu (ieskaitot atstarpes) dotajā tekstā."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "parādīt %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Parādīt norādīto tekstu vai skaitli."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Palūgt lietotāju ievadīt skaitli."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Palūgt lietotāju ievadīt tekstu."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "palūgt ievadīt skaitli ar ziņu"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "palūgt ievadīt tekstu ar ziņu"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Burts, vārds vai jebkāda teksta rinda."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "Dzēst atstarpes no abām pusēm"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "Dzēst atstarpes no sākuma"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "Dzēst atstarpes no beigām"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Atgriež teksta kopiju ar noņemtām atstarpēm vienā vai otrā galā."; +Blockly.Msg.TODAY = "Šodiena"; +Blockly.Msg.UNDO = "Atsaukt"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "objekts"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Izveidot piešķiršanu mainīgajam %1"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Atgriež mainīgā vērtību."; +Blockly.Msg.VARIABLES_SET = "piešķirt mainīgajam %1 vērtību %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Izveidot 'ņem %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Piešķirt mainīgajam vērtību."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Mainīgais '%1' jau eksistē."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/mk.js b/src/opsoro/server/static/js/blockly/msg/js/mk.js new file mode 100644 index 0000000..32ec70d --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/mk.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.mk'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Додај коментар:"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Смена на вредност:"; +Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.COLLAPSE_ALL = "Собери блокови"; +Blockly.Msg.COLLAPSE_BLOCK = "Собери блок"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "боја 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "боја 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "сооднос"; +Blockly.Msg.COLOUR_BLEND_TITLE = "смешај"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Меша две бои во даден сооднос (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://mk.wikipedia.org/wiki/Боја"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Изберете боја од палетата."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "случајна боја"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Избери боја на тепка."; +Blockly.Msg.COLOUR_RGB_BLUE = "сина"; +Blockly.Msg.COLOUR_RGB_GREEN = "зелена"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "црвена"; +Blockly.Msg.COLOUR_RGB_TITLE = "боја со"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Создајте боја со укажаните износи на црвена, зелена и сина. Сите вредности мора да бидат помеѓу 0 и 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "излези од јамката"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "продолжи со следното повторување на јамката"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Излези од содржечката јамка."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the rest of this loop, and continue with the next iteration."; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warning: This block may only be used within a loop."; // untranslated +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "за секој елемент %1 на списокот %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Му ја задава променливата „%1“ на секој елемент на списокот, а потоа исполнува наредби."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "број со %1 од %2 до %3 со %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Променливата \"%1\" да ги земе вредностите од почетниот до завршниот број, броејќи според укажаниот интервал и ги исполнува укажаните блокови."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block."; // untranslated +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block."; // untranslated +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Додава, отстранува или прередува делови за прераспоредување на овој блок „ако“."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "инаку"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "инаку ако"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "ако"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "If a value is true, then do some statements."; // untranslated +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://mk.wikipedia.org/wiki/For-јамка"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "исполни"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "повтори %1 пати"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Исполнува наредби неколку пати."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "повторувај сè до"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "повторувај додека"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Додека вредноста е невистинита, исполнува наредби."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Додека вредноста е вистинита, исполнува наредби."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Да ги избришам сите %1 блокчиња?"; +Blockly.Msg.DELETE_BLOCK = "Избриши блок"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "Избриши %1 блока"; +Blockly.Msg.DISABLE_BLOCK = "Исклучи блок"; +Blockly.Msg.DUPLICATE_BLOCK = "Ископирај"; +Blockly.Msg.ENABLE_BLOCK = "Вклучи блок"; +Blockly.Msg.EXPAND_ALL = "Рашири блокови"; +Blockly.Msg.EXPAND_BLOCK = "Рашири го блокови"; +Blockly.Msg.EXTERNAL_INPUTS = "Надворешен внос"; +Blockly.Msg.HELP = "Помош"; +Blockly.Msg.INLINE_INPUTS = "Внатрешен внос"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "create empty list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "list"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "create list with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Add an item to the list."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_FIRST = "first"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# from end"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "get"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "get and remove"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_LAST = "last"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "random"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "remove"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returns the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Removes and returns the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Removes the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "to # from end"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "to #"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "to last"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "get sub-list from first"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 is the last item."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 is the first item."; // untranslated +Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated +Blockly.Msg.LISTS_INLIST = "in list"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty."; // untranslated +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; // untranslated +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "as"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INSERT = "insert at"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_SET = "set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserts the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sets the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "невистина"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Дава или вистина или невистина."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "вистина"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://mk.wikipedia.org/wiki/Неравенство"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Дава вистина ако обата вноса се еднакви."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Дава вистина ако првиот внос е поголем од вториот."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Дава вистина ако првиот внос е поголем или еднаков на вториот."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Дава вистина ако првиот внос е помал од вториот."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Дава вистина ако првиот внос е помал или еднаков на вториот."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Дава вистина ако обата вноса не се еднакви."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "не %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Дава вистина ако вносот е невистинит. Дава невистина ако вносот е вистинит."; +Blockly.Msg.LOGIC_NULL = "ништо"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Дава ништо."; +Blockly.Msg.LOGIC_OPERATION_AND = "и"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "или"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Дава вистина ако обата вноса се вистинити."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Дава вистина ако барем еден од вносовите е вистинит."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "испробај"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "ако е невистинито"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "ако е вистинито"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Return the sum of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Return the difference of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Return the product of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter?uselang=mk"; +Blockly.Msg.MATH_CHANGE_TITLE = "повиши %1 за %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Ѝ додава број на променливата „%1“."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://mk.wikipedia.org/wiki/Математичка_константа"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Дава една од вообичаените константи: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), или ∞ (бесконечност)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "е делив со"; +Blockly.Msg.MATH_IS_EVEN = "е парен"; +Blockly.Msg.MATH_IS_NEGATIVE = "е негативен"; +Blockly.Msg.MATH_IS_ODD = "е непарен"; +Blockly.Msg.MATH_IS_POSITIVE = "е позитивен"; +Blockly.Msg.MATH_IS_PRIME = "е прост"; +Blockly.Msg.MATH_IS_TOOLTIP = "Проверува дали бројот е парен, непарен, прост, цел, позитивен, негативен или делив со некој број. Дава вистина или невистина."; +Blockly.Msg.MATH_IS_WHOLE = "е цел"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated +Blockly.Msg.MATH_MODULO_TITLE = "remainder of %1 ÷ %2"; // untranslated +Blockly.Msg.MATH_MODULO_TOOLTIP = "Return the remainder from dividing the two numbers."; // untranslated +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; // untranslated +Blockly.Msg.MATH_NUMBER_TOOLTIP = "A number."; // untranslated +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "просек на списокот"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "најголем на списокот"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "медијана на списокот"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "најмал на списокот"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "модул на списокот"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "random item of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standard deviation of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "збир од списокот"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Дава просек (аритметичка средина) од броевите на списокот."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Го дава најголемиот број на списокот."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Дава медијана од броевите на списокот."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Го дава најмалиот број на списокот."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Дава список на најзастапен(и) елемент(и) на списокот."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Return a random element from the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Дава збир од сите броеви на списокот."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "random fraction"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_TITLE = "random integer from %1 to %2"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; // untranslated +Blockly.Msg.MATH_ROUND_HELPURL = "https://mk.wikipedia.org/wiki/Заокружување"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "заокружи"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "заокружи на помало"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "заокружи на поголемо"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Го заокружува бројот на поголем или помал."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; // untranslated +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolute"; // untranslated +Blockly.Msg.MATH_SINGLE_OP_ROOT = "square root"; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Return the negation of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Return the square root of a number."; // untranslated +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated +Blockly.Msg.NEW_VARIABLE = "Нова променлива..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Назив на новата променлива:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "with:"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "with:"; // untranslated +Blockly.Msg.PROCEDURES_CREATE_DO = "Create '%1'"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "do something"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "to"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "return"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; // untranslated +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; // untranslated +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; // untranslated +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated +Blockly.Msg.REMOVE_COMMENT = "Отстрани коментар"; +Blockly.Msg.RENAME_VARIABLE = "Преименувај променлива..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Преименувај ги сите променливи „%1“ во:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "append text"; // untranslated +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "to"; // untranslated +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; // untranslated +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "to lower case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "to UPPER CASE"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg.TEXT_CHARAT_FIRST = "get first letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_FROM_END = "get letter # from end"; // untranslated +Blockly.Msg.TEXT_CHARAT_FROM_START = "get letter #"; // untranslated +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in text"; // untranslated +Blockly.Msg.TEXT_CHARAT_LAST = "get last letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "join"; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; // untranslated +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "create text with"; // untranslated +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; // untranslated +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "print %1"; // untranslated +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; // untranslated +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated +Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; // untranslated +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "trim spaces from both sides of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated +Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.UNDO = "Undo"; // untranslated +Blockly.Msg.VARIABLES_DEFAULT_NAME = "елемент"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; // untranslated +Blockly.Msg.VARIABLES_SET = "set %1 to %2"; // untranslated +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/ms.js b/src/opsoro/server/static/js/blockly/msg/js/ms.js new file mode 100644 index 0000000..a636bbe --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/ms.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.ms'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Berikan Komen"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Ubah nilai:"; +Blockly.Msg.CLEAN_UP = "Kemaskan Blok"; +Blockly.Msg.COLLAPSE_ALL = "Lipat Blok²"; +Blockly.Msg.COLLAPSE_BLOCK = "Lipat Blok"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "warna 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "warna 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "nisbah"; +Blockly.Msg.COLOUR_BLEND_TITLE = "adun"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Campurkan dua warna sekali pada nisbah yang ditentukan (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ms.wikipedia.org/wiki/Warna"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Pilih satu warna daripada palet."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "warna rawak"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Pilih satu warna secara rawak."; +Blockly.Msg.COLOUR_RGB_BLUE = "biru"; +Blockly.Msg.COLOUR_RGB_GREEN = "hijau"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "merah"; +Blockly.Msg.COLOUR_RGB_TITLE = "warnakan"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Peroleh satu warna dengan menentukan amaun campuran merah, hijau dan biru. Kesemua nilai haruslah antara 0 hingga 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "hentikan gelung"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "teruskan dengan lelaran gelung seterusnya"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Keluar dari gelung pengandung."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Langkau seluruh gelung yang tinggal dan bersambung dengan lelaran seterusnya."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Amaran: Blok ini hanya boleh digunakan dalam satu gelung."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "untuk setiap perkara %1 dalam senarai %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Untuk setiap perkara dalam senarai, tetapkan pembolehubah '%1' pada perkara, kemudian lakukan beberapa perintah."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "kira dengan %1 dari %2 hingga %3 selang %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Gunakan pembolehubah '%1' pada nilai-nilai dari nombor pangkal hingga nombor hujung, mengira mengikut selang yang ditentukan, dan lakukan blok-blok yang tertentu."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Tambah satu syarat kepada blok jika."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Tambah yang terakhir, alihkan semua keadaan ke blok jika."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Tambah, alih keluar, atau susun semula bahagian-bahagian untuk menyusun semula blok jika."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "lain"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "lain jika"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "jika"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Jika nilai yang benar, lakukan beberapa penyata."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Jika suatu nilai benar, lakukan penyata blok pertama. Jika tidak, bina penyata blok kedua."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Jika nilai yang pertama adalah benar, lakukan penyata pertama blok. Sebaliknya, jika nilai kedua adalah benar, lakukan penyata blok kedua."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Jika nilai yang pertama adalah benar, lakukan penyata blok pertama. Sebaliknya, jika nilai kedua adalah benar, lakukan penyata blok kedua. Jika tiada nilai adalah benar, lakukan penyata blok terakhir."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "lakukan"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "ulang %1 kali"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Lakukan perintah berulang kali."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ulangi sehingga"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ulangi apabila"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Lakukan beberapa perintah apabila nilainya palsu (false)."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Lakukan beberapa perintah apabila nilainya benar (true)."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Hapuskan kesemua %1 blok?"; +Blockly.Msg.DELETE_BLOCK = "Hapuskan Blok"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "Hapuskan %1 Blok"; +Blockly.Msg.DISABLE_BLOCK = "Matikan Blok"; +Blockly.Msg.DUPLICATE_BLOCK = "Pendua"; +Blockly.Msg.ENABLE_BLOCK = "Hidupkan Blok"; +Blockly.Msg.EXPAND_ALL = "Buka Blok²"; +Blockly.Msg.EXPAND_BLOCK = "Buka Blok"; +Blockly.Msg.EXTERNAL_INPUTS = "Input Luaran"; +Blockly.Msg.HELP = "Bantuan"; +Blockly.Msg.INLINE_INPUTS = "Input Sebaris"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "Wujudkan senarai kosong"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Kembalikan senarai panjang 0, yang tidak mengandungi rekod data"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "senarai"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Tambah, alih keluar, atau susun semula bahagian-bahagian untuk menyusun semula senarai blok."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "wujudkan senarai dengan"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Tambah item ke dalam senarai."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Wujudkan senarai dengan apa jua nombor item."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "pertama"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# dari akhir"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "dapatkan"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "dapat dan alihkan"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "terakhir"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "rawak"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "alihkan"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Kembalikan item pertama dalam senarai."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Kembalikan item dalam kedudukan yang ditetapkan dalam senarai."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Kembalikan item pertama dalam senarai."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Kembalikan item rawak dalam senarai."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Alihkan dan kembalikan item pertama dalam senarai."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Alihkan dan kembalikan item mengikut spesifikasi posisi dalam senarai."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Alihkan dan kembalikan item terakhir dalam senarai."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Alihkan dan kembalikan item rawak dalam senarai."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Alihkan item pertama dalam senarai."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Alihkan item pada posisi mengikut spesifikasi dalam senarai."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Alihkan item terakhir dalam senarai."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Alihkan item rawak dalam senarai."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "ke # dari akhir"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "ke #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "ke akhir"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "dapatkan sub-senarai daripada pertama"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "dapatkan sub-senarai daripada # daripada terakhir"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "dapatkan sub-senarai daripada #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Wujudkan salinan bahagian yang ditentukan dari senarai."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 ialah item terakhir."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 ialah item pertama."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "cari pertama item kejadian"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "cari kejadian akhir item"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Menyatakan indeks kejadian pertama/terakhir item berkenaan dalam senarai. Menyatakan %1 jika item berkenaan tidak ditemui."; +Blockly.Msg.LISTS_INLIST = "dalam senarai"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 adalah kosong"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Kembalikan benar jika senarai kosong."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "panjang %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Kembalikan panjang senarai"; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "wujudkan senarai dengan item %1 diulangi %2 kali"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Wujudkan senarai yang terdiri daripada nilai berulang mengikut nombor yang ditentukan."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "sebagai"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "masukkan pada"; +Blockly.Msg.LISTS_SET_INDEX_SET = "set"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Selit item pada permulaan senarai."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Masukkan item pada posisi yand ditentukan dalam senarai."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Tambahkan item dalam senarai akhir."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Selit item secara rawak di dalam senarai."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Set item pertama dalam senarai."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Masukkan item pada posisi yang ditentukan dalam senarai."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Set item terakhir dalam senarai."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Set item rawak dalam senarai."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "buat senarai dgn teks"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "buat teks drpd senarai"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Cantumkan senarai teks menjadi satu teks, dipecahkan oleh delimiter."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Pecahkan teks kepada senarai teks, berpecah di setiap delimiter."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "dengan delimiter"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "palsu"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Kembalikan samada benar atau palsu."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "benar"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://id.wikipedia.org/wiki/Pertidaksamaan"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Kembali benar jika kedua-dua input benar antara satu sama lain."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Kembali benar jika input pertama adalah lebih besar daripada input kedua."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Kembali benar jika input pertama adalah lebih besar daripada atau sama dengan input kedua."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Kembali benar jika input pertama adalah lebih kecil daripada input kedua."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Kembali benar jika input pertama adalah lebih kecil daripada atau sama dengan input kedua."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Taip balik benar jika kedua-dua input tidak sama."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "bukan %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "'Benar' akan dibalas jika inputnya salah. 'Salah' akan dibalas jika inputnya benar."; +Blockly.Msg.LOGIC_NULL = "null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returns null."; +Blockly.Msg.LOGIC_OPERATION_AND = "dan"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "atau"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Return true if both inputs are true."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "Jika palsu"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "Jika benar"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ms.wikipedia.org/wiki/Aritmetik"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Kembalikan jumlah kedua-dua bilangan."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Taip balik hasil bahagi dua nombor tersebut."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Taip balik hasil tolak dua nombor tersebut."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Taip balik hasil darab dua nombor tersebut."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://id.wikipedia.org/wiki/Perjumlahan"; +Blockly.Msg.MATH_CHANGE_TITLE = "perubahan %1 oleh %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Tambah nombor kepada pembolehubah '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://ms.wikipedia.org/wiki/Pemalar_matematik"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "Boleh dibahagikan dengan"; +Blockly.Msg.MATH_IS_EVEN = "Adalah genap"; +Blockly.Msg.MATH_IS_NEGATIVE = "negatif"; +Blockly.Msg.MATH_IS_ODD = "aneh"; +Blockly.Msg.MATH_IS_POSITIVE = "adalah positif"; +Blockly.Msg.MATH_IS_PRIME = "is prime"; +Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; +Blockly.Msg.MATH_IS_WHOLE = "is whole"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://id.wikipedia.org/wiki/Operasi_modulus"; +Blockly.Msg.MATH_MODULO_TITLE = "remainder of %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Taip balik baki yang didapat daripada pembahagian dua nombor tersebut."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://ms.wikipedia.org/wiki/Nombor"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Suatu nombor."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "purata daripada senarai"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "Max senarai"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "Median senarai"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "min dalam senarai"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "jenis senarai"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "Item rawak daripada senarai"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "sisihan piawai bagi senarai"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "Jumlah senarai"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Kembalikan purata (min aritmetik) nilai-nilai angka di dalam senarai."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Pulangkan jumlah terbesar dalam senarai."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Kembalikan nombor median dalam senarai."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Kembalikan nombor terkecil dalam senarai."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Kembali senarai item yang paling biasa dalam senarai."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Kembalikan elemen rawak daripada senarai."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Kembali dengan sisihan piawai daripada senarai."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Kembalikan jumlah semua nombor dalam senarai."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "pecahan rawak"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Kembali sebahagian kecil rawak antara 0.0 (inklusif) dan 1.0 (eksklusif)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "integer rawak dari %1ke %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Kembalikan integer rawak diantara dua had yang ditentukan, inklusif."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "pusingan"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "Pusingan ke bawah"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "pusingan ke atas"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Bulat nombor yang naik atau turun."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://ms.wikipedia.org/wiki/Punca_kuasa_dua"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "mutlak"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "Punca kuasa dua"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Kembalikan nilai mutlak suatu nombor."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Kembalikan e kepada kuasa nombor."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Kembali dalam logaritma nombor asli."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Kembali logarithm 10 asas nombor."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Kembalikan nombor yang songsang."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Kembalikan 10 kepada kuasa nombor."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Kembalikan punca kuasa nombor."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "acos"; +Blockly.Msg.MATH_TRIG_ASIN = "asin"; +Blockly.Msg.MATH_TRIG_ATAN = "atan"; +Blockly.Msg.MATH_TRIG_COS = "cos"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://ms.wikipedia.org/wiki/Fungsi_trigonometri"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; +Blockly.Msg.MATH_TRIG_TAN = "tan"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Kembali arccosine beberapa nombor."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Kembalikan arcsince beberapa nombor."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Kembalikan beberapa nombor arctangent."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Kembalikan darjah kosinus (bukan radian)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Kembalikan darjah sine (bukan radian)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Kembalikan darjah tangen (bukan radian)."; +Blockly.Msg.NEW_VARIABLE = "Pembolehubah baru..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nama pembolehubah baru:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "bolehkan kenyataan"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "dengan:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://ms.wikipedia.org/wiki/Fungsi"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://ms.wikipedia.org/wiki/Fungsi"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "dengan:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Hasilkan '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Terangkan fungsi ini..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "Buat sesuatu"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "Untuk"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Menghasilkan suatu fungsi tanpa output."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "kembali"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Mencipta satu fungsi dengan pengeluaran."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Amaran: Fungsi ini mempunyai parameter yang berganda."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Serlahkan definisi fungsi"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Amaran: Blok ini hanya boleh digunakan dalam fungsi definisi."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Nama input:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Tambah satu input pada fungsi."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Input-input"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Tambah, alih keluar atau susun semula input pada fungsi ini."; +Blockly.Msg.REDO = "Redo"; // untranslated +Blockly.Msg.REMOVE_COMMENT = "Padamkan Komen"; +Blockly.Msg.RENAME_VARIABLE = "Tukar nama pembolehubah..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Tukar nama semua pembolehubah '%1' kepada:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "append text"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "Untuk"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "Kepada huruf kecil"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "Kepada HURUF BESAR"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; +Blockly.Msg.TEXT_CHARAT_FIRST = "get first letter"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "get letter # from end"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "get letter #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "Dalam teks"; +Blockly.Msg.TEXT_CHARAT_LAST = "Dapatkan abjad terakhir"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "Dapatkan abjad rawak"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "Sertai"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "untuk huruf terakhir"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "dalam teks"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "dalam teks"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "mencari kejadian pertama teks"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "mencari kejadian terakhir teks"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Kembalikan Indeks kejadian pertama/terakhir dari teks pertama ke dalam teks kedua. Kembalikan %1 Jika teks tidak ditemui."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 adalah kosong"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Kembalikan benar jika teks yang disediakan adalah kosong."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "hasilkan teks dengan"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Hasilkan sebahagian teks dengan menghubungkan apa jua nombor item."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "panjang %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Kembalikan jumlah huruf (termasuk ruang) dalam teks yang disediakan."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "cetak %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Cetak teks yang ditentukan, nombor atau nilai lain."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Peringatan kepada pengguna untuk nombor."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Peringatkan pengguna untuk sebahagian teks."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Prom untuk nombor dengan mesej"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Prom untuk teks dengan mesej"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://ms.wikipedia.org/wiki/Rentetan"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Huruf, perkataan, atau baris teks."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "mengurangkan kawasan dari kedua-dua belah"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "mengurangkan ruang dari sebelah kiri"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "mengurangkan kawasan dari sisi kanan"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Kembali salinan teks dengan ruang yang dikeluarkan daripada satu atau hujung kedua belah."; +Blockly.Msg.TODAY = "Hari ini"; +Blockly.Msg.UNDO = "Undo"; // untranslated +Blockly.Msg.VARIABLES_DEFAULT_NAME = "Perkara"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Hasilkan 'set %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Kembalikan nilai pemboleh ubah ini."; +Blockly.Msg.VARIABLES_SET = "set %1 ke %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Hasilkan 'set %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Set pembolehubah ini supaya sama dengan input."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/nb.js b/src/opsoro/server/static/js/blockly/msg/js/nb.js new file mode 100644 index 0000000..902a59e --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/nb.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.nb'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Legg til kommentar"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Bytt verdi:"; +Blockly.Msg.CLEAN_UP = "Rydd opp Blocks"; +Blockly.Msg.COLLAPSE_ALL = "Skjul blokker"; +Blockly.Msg.COLLAPSE_BLOCK = "Skjul blokk"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "farge 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "farge 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "forhold"; +Blockly.Msg.COLOUR_BLEND_TITLE = "blande"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blander to farger sammen med et gitt forhold (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Velg en farge fra paletten."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "tilfeldig farge"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Velg en tilfeldig farge."; +Blockly.Msg.COLOUR_RGB_BLUE = "blå"; +Blockly.Msg.COLOUR_RGB_GREEN = "grønn"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "rød"; +Blockly.Msg.COLOUR_RGB_TITLE = "farge med"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Lag en farge med angitt verdi av rød, grønn og blå. Alle verdier må være mellom 0 og 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "bryt ut av løkken"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "fortsett med neste gjentakelse av løkken"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Bryt ut av den gjeldende løkken."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Hopp over resten av denne løkken og fortsett med neste gjentakelse."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Advarsel: Denne blokken kan kun brukes innenfor en løkke."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "for hvert element %1 i listen %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For hvert element i en liste, angi variabelen '%1' til elementet, og deretter lag noen setninger."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "tell med %1 fra %2 til %3 med %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Ha variabel \"%1\" ta verdiene fra start nummer til slutt nummer, telle med spesifisert intervall og lag de spesifiserte blokkene."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Legg til en betingelse til hvis blokken."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Legg til hva som skal skje hvis de andre ikke slår til."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Legg til, fjern eller flytt seksjoner i denne hvis-blokken."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "ellers"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "ellers hvis"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "hvis"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Hvis dette er sant, så gjør følgende."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Hvis dette er sant, så utfør den første blokken av instruksjoner. Hvis ikke, utfør den andre blokken."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Hvis det første stemmer, så utfør den første blokken av instruksjoner. Ellers, hvis det andre stemmer, utfør den andre blokken av instruksjoner."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Hvis den første verdien er sann, så utfør den første blokken med setninger. Ellers, hvis den andre verdien er sann, så utfør den andre blokken med setninger. Hvis ingen av verdiene er sanne, så utfør den siste blokken med setninger."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "gjør"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "gjenta %1 ganger"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Gjenta noen instruksjoner flere ganger."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "gjenta til"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "gjenta mens"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Så lenge et utsagn ikke stemmer, gjør noen instruksjoner."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Så lenge et utsagn stemmer, utfør noen instruksjoner."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Slett alle %1 blokker?"; +Blockly.Msg.DELETE_BLOCK = "Slett blokk"; +Blockly.Msg.DELETE_VARIABLE = "Slett variabelen «%1»"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Slett %1 bruk av variabelen «%2»?"; +Blockly.Msg.DELETE_X_BLOCKS = "Slett %1 blokker"; +Blockly.Msg.DISABLE_BLOCK = "Deaktiver blokk"; +Blockly.Msg.DUPLICATE_BLOCK = "duplikat"; +Blockly.Msg.ENABLE_BLOCK = "Aktiver blokk"; +Blockly.Msg.EXPAND_ALL = "Utvid blokker"; +Blockly.Msg.EXPAND_BLOCK = "Utvid blokk"; +Blockly.Msg.EXTERNAL_INPUTS = "Eksterne kilder"; +Blockly.Msg.HELP = "Hjelp"; +Blockly.Msg.INLINE_INPUTS = "Interne kilder"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "opprett en tom liste"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returnerer en tom liste, altså med lengde 0"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "liste"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Legg til, fjern eller endre rekkefølgen for å endre på denne delen av listen."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "lag en liste med"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Tilføy et element til listen."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Lag en liste med et vilkårlig antall elementer."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "først"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# fra slutten"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "hent"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "hent og fjern"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "siste"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "tilfeldig"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "fjern"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returnerer det første elementet i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returner elementet på den angitte posisjonen i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returnerer det siste elementet i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returnerer et tilfeldig element i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Fjerner og returnerer det første elementet i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Fjerner og returnerer elementet ved en gitt posisjon i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Fjerner og returnerer det siste elementet i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Fjerner og returnerer et tilfeldig element i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Fjerner det første elementet i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Fjerner et element ved en gitt posisjon i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Fjerner det siste elementet i en liste."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Fjerner et tilfeldig element i en liste."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "til # fra slutten"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "til #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "til siste"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "Hent en del av listen"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "Hent de siste # elementene"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "Hent del-listen fra #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Kopiérer en ønsket del av en liste."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 er det siste elementet."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 er det første elementet."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "finn første forekomst av elementet"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "finn siste forekomst av elementet"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returnerer indeksen av den første/siste forekomsten av elementet i lista. Returnerer %1 hvis ikke funnet."; +Blockly.Msg.LISTS_INLIST = "i listen"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 er tom"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returnerer sann hvis listen er tom."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "lengden på %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returnerer lengden til en liste."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "Lag en liste hvor elementet %1 forekommer %2 ganger"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Lager en liste hvor den gitte verdien gjentas et antall ganger."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "som"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "sett inn ved"; +Blockly.Msg.LISTS_SET_INDEX_SET = "sett"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Setter inn elementet i starten av en liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Setter inn elementet ved den angitte posisjonen i en liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Tilføy elementet til slutten av en liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Setter inn elementet ved en tilfeldig posisjon i en liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Angir det første elementet i en liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Setter inn elementet ved den angitte posisjonen i en liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Angir det siste elementet i en liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Angir et tilfeldig element i en liste."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "stigende"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "synkende"; +Blockly.Msg.LISTS_SORT_TITLE = "sorter %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sorter en kopi av en liste."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alfabetisk, ignorert store/små bokstaver"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numerisk"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabetisk"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "lag liste av tekst"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "lag tekst av liste"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Føy sammen en liste tekster til én tekst, avskilt av en avgrenser."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Splitt teksten til en liste med tekster, brutt ved hver avgrenser."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "med avgrenser"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "usann"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returnerer enten sann eller usann."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "sann"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Returnerer sann hvis begge inputene er like hverandre."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Returnerer sant hvis det første argumentet er større enn den andre argumentet."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Returnerer sant hvis det første argumentet er større enn eller likt det andre argumentet."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Returnerer sant hvis det første argumentet er mindre enn det andre argumentet."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Returnerer sant hvis det første argumentet er mindre enn eller likt det andre argumentet."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Returnerer sant hvis begge argumentene er ulike hverandre."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "ikke %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returnerer sant hvis argumentet er usant. Returnerer usant hvis argumentet er sant."; +Blockly.Msg.LOGIC_NULL = "null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returnerer null."; +Blockly.Msg.LOGIC_OPERATION_AND = "og"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "eller"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Returnerer sant hvis begge argumentene er sanne."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Returnerer sant hvis minst ett av argumentene er sant."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "hvis usant"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "hvis sant"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Sjekk betingelsen i 'test'. Hvis betingelsen er sann, da returneres 'hvis sant' verdien. Hvis ikke returneres 'hvis usant' verdien."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://no.wikipedia.org/wiki/Aritmetikk"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Returnerer summen av to tall."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Returner kvotienten av to tall."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Returner differansen mellom to tall."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Returner produktet av to tall."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Returner det første tallet opphøyd i den andre tallet."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "endre %1 ved %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Addere et tall til variabelen '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Returner en av felleskonstantene π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), eller ∞ (uendelig)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "begrense %1 lav %2 høy %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Begrens et tall til å være mellom de angitte grenseverdiene (inklusiv)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "er delelig med"; +Blockly.Msg.MATH_IS_EVEN = "er et partall"; +Blockly.Msg.MATH_IS_NEGATIVE = "er negativer negativt"; +Blockly.Msg.MATH_IS_ODD = "er et oddetall"; +Blockly.Msg.MATH_IS_POSITIVE = "er positivt"; +Blockly.Msg.MATH_IS_PRIME = "er et primtall"; +Blockly.Msg.MATH_IS_TOOLTIP = "Sjekk om et tall er et partall, oddetall, primtall, heltall, positivt, negativt, eller om det er delelig med et annet tall. Returnerer sant eller usant."; +Blockly.Msg.MATH_IS_WHOLE = "er et heltall"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "resten av %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Returner resten fra delingen av to tall."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "x"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Et tall."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "gjennomsnittet av listen"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maksimum av liste"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "medianen til listen"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimum av listen"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "Listens typetall"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "tilfeldig element i listen"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standardavviket til listen"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "summen av listen"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Returner det aritmetiske gjennomsnittet av tallene i listen."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Returner det største tallet i listen."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Returner listens median."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Returner det minste tallet i listen."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Returner en liste av de vanligste elementene i listen."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Returner et tilfeldig element fra listen."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Returner listens standardavvik."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Returner summen av alle tallene i listen."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "tilfeldig flyttall"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Returner et tilfeldig flyttall mellom 0.0 (inkludert) og 1.0 (ikke inkludert)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "Et tilfeldig heltall mellom %1 og %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Returner et tilfeldig tall mellom de to spesifiserte grensene, inkludert de to."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "avrunding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "rund ned"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "rund opp"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Avrund et tall ned eller opp."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absoluttverdi"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "kvadratrot"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Returner absoluttverdien av et tall."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Returner e opphøyd i et tall."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Returner den naturlige logaritmen til et tall."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Returner base-10 logaritmen til et tall."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Returner det negative tallet."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Returner 10 opphøyd i et tall."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Returner kvadratroten av et tall."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "acos"; +Blockly.Msg.MATH_TRIG_ASIN = "asin"; +Blockly.Msg.MATH_TRIG_ATAN = "atan"; +Blockly.Msg.MATH_TRIG_COS = "cos"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; +Blockly.Msg.MATH_TRIG_TAN = "tan"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Returner arccosinus til et tall."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Returner arcsinus til et tall."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Returner arctangens til et tall."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Returner cosinus av en vinkel (ikke radian)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Returner sinus av en vinkel (ikke radian)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Returner tangenten av en vinkel (ikke radian)."; +Blockly.Msg.NEW_VARIABLE = "Opprett variabel..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nytt variabelnavn:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "tillat uttalelser"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "med:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Kjør den brukerdefinerte funksjonen '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Kjør den brukerdefinerte funksjonen'%1' og bruk resultatet av den."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "med:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Opprett '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Beskriv denne funksjonen..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "gjør noe"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "til"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Opprett en funksjon som ikke har noe resultat."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "returner"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Oppretter en funksjon som har et resultat."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Advarsel: Denne funksjonen har duplikate parametere."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Marker funksjonsdefinisjonen"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Hvis en verdi er sann, returner da en annen verdi."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Advarsel: Denne blokken kan bare benyttes innenfor en funksjonsdefinisjon."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Navn på parameter:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Legg til en input til funksjonen."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "parametere"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Legg til, fjern eller endre rekkefølgen på input til denne funksjonen."; +Blockly.Msg.REDO = "Gjør om"; +Blockly.Msg.REMOVE_COMMENT = "Fjern kommentar"; +Blockly.Msg.RENAME_VARIABLE = "Gi nytt navn til variabel..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Endre navnet til alle '%1' variabler til:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "tilføy tekst"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "til"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Tilføy tekst til variabelen '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "til små bokstaver"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "til store forbokstaver"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "til STORE BOKSTAVER"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Returnerer en kopi av teksten der store og små bokstaver er byttet om."; +Blockly.Msg.TEXT_CHARAT_FIRST = "hent første bokstav"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "hent bokstav # fra slutten"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "hent bokstav #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "i tekst"; +Blockly.Msg.TEXT_CHARAT_LAST = "hent den siste bokstaven"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "hent en tilfeldig bokstav"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returnerer bokstaven på angitt plassering."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Legg til et element til teksten."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "føy sammen"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Legg til, fjern eller forandre rekkefølgen for å forandre på denne tekstblokken."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "til bokstav # fra slutten"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "til bokstav #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "til siste bokstav"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "i tekst"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "hent delstreng fra første bokstav"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "hent delstreng fra bokstav # fra slutten"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "hent delstreng fra bokstav #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returnerer den angitte delen av teksten."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "i tekst"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "finn første forekomst av tekst"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "finn siste forekomst av tekst"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returnerer posisjonen for første/siste forekomsten av den første tekst i den andre teksten. Returnerer %1 hvis teksten ikke blir funnet."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 er tom"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returnerer sann hvis den angitte teksten er tom."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "lage tekst med"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Opprett en tekst ved å sette sammen et antall elementer."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "lengden av %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returnerer antall bokstaver (inkludert mellomrom) i den angitte teksten."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "skriv ut %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Skriv ut angitt tekst, tall eller annet innhold."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Be brukeren om et tall."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Spør brukeren om tekst."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "spør om et tall med en melding"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "spør om tekst med en melding"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "En bokstav, ett ord eller en linje med tekst."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "fjern mellomrom fra begge sider av"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "fjern mellomrom fra venstre side av"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "fjern mellomrom fra høyre side av"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Returner en kopi av teksten med mellomrom fjernet fra en eller begge sidene."; +Blockly.Msg.TODAY = "I dag"; +Blockly.Msg.UNDO = "Angre"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Opprett 'sett %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returnerer verdien av denne variabelen."; +Blockly.Msg.VARIABLES_SET = "sett %1 til %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Opprett 'hent %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Setter verdien av denne variablen lik parameteren."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "En variabel med navn «%1» finnes allerede."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/nl.js b/src/opsoro/server/static/js/blockly/msg/js/nl.js new file mode 100644 index 0000000..f02fdd3 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/nl.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.nl'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Reactie toevoegen"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Waarde wijzigen:"; +Blockly.Msg.CLEAN_UP = "Blokken opschonen"; +Blockly.Msg.COLLAPSE_ALL = "Blokken samenvouwen"; +Blockly.Msg.COLLAPSE_BLOCK = "Blok samenvouwen"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "kleur 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "kleur 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "verhouding"; +Blockly.Msg.COLOUR_BLEND_TITLE = "mengen"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mengt twee kleuren samen met een bepaalde verhouding (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://nl.wikipedia.org/wiki/Kleur"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Kies een kleur in het palet."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "willekeurige kleur"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Kies een willekeurige kleur."; +Blockly.Msg.COLOUR_RGB_BLUE = "blauw"; +Blockly.Msg.COLOUR_RGB_GREEN = "groen"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "rood"; +Blockly.Msg.COLOUR_RGB_TITLE = "kleuren met"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Maak een kleur met de opgegeven hoeveelheid rood, groen en blauw. Alle waarden moeten tussen 0 en 100 liggen."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "uit lus breken"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "doorgaan met de volgende iteratie van de lus"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "uit de bovenliggende lus breken"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "De rest van deze lus overslaan en doorgaan met de volgende herhaling."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Waarschuwing: dit blok mag alleen gebruikt worden in een lus."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "voor ieder item %1 in lijst %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Voor ieder item in een lijst, stel de variabele \"%1\" in op het item en voer daarna opdrachten uit."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; +Blockly.Msg.CONTROLS_FOR_TITLE = "rekenen met %1 van %2 tot %3 in stappen van %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Laat de variabele \"%1\" de waarden aannemen van het beginnummer tot het laatste nummer, tellende met het opgegeven interval, en met uitvoering van de opgegeven blokken."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Voeg een voorwaarde toe aan het als-blok."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Voeg een laatste, vang-alles conditie toe aan het als-statement."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Voeg stukken toe, verwijder of wijzig de volgorde om dit \"als\"-blok te wijzigen."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "anders"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "anders als"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "als"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Als een waarde waar is, voer dan opdrachten uit."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Als een waarde waar is, voert dan het eerste blok met opdrachten uit. Voer andere het tweede blok met opdrachten uit."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Als de eerste waarde waar is, voer dan het eerste blok met opdrachten uit. Voer anders, als de tweede waarde waar is, het tweede blok met opdrachten uit."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Als de eerste waarde \"waar\" is, voer dan het eerste blok uit. Voer anders wanneer de tweede waarde \"waar\" is, het tweede blok uit. Als geen van beide waarden waar zijn, voer dan het laatste blok uit."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://nl.wikipedia.org/wiki/Repetitie_(informatica)#For_en_Foreach"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "voer uit"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1 keer herhalen"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Voer een aantal opdrachten meerdere keren uit."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "herhalen totdat"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "herhalen zolang"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Terwijl een waarde onwaar is de volgende opdrachten uitvoeren."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Terwijl een waarde waar is de volgende opdrachten uitvoeren."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Alle %1 blokken verwijderen?"; +Blockly.Msg.DELETE_BLOCK = "Blok verwijderen"; +Blockly.Msg.DELETE_VARIABLE = "Verwijder de variabele \"%1\""; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "%1 gebruiken van de variabele \"%2\" verwijderen?"; +Blockly.Msg.DELETE_X_BLOCKS = "%1 blokken verwijderen"; +Blockly.Msg.DISABLE_BLOCK = "Blok uitschakelen"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplicaat"; +Blockly.Msg.ENABLE_BLOCK = "Blok inschakelen"; +Blockly.Msg.EXPAND_ALL = "Blokken uitvouwen"; +Blockly.Msg.EXPAND_BLOCK = "Blok uitvouwen"; +Blockly.Msg.EXTERNAL_INPUTS = "Externe invoer"; +Blockly.Msg.HELP = "Hulp"; +Blockly.Msg.INLINE_INPUTS = "Inline invoer"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "maak een lege lijst"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Geeft een lijst terug met lengte 0, zonder items"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lijst"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Voeg stukken toe, verwijder ze of wijzig de volgorde om dit lijstblok aan te passen."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "maak een lijst met"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Voeg iets toe aan de lijst."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Maak een lijst met een willekeurig aantal items."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "eerste"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# van einde"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "haal op"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "haal op en verwijder"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "laatste"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "willekeurig"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "verwijder"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Geeft het eerste item in een lijst terug."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Geeft het item op de opgegeven positie in een lijst."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Geeft het laatste item in een lijst terug."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Geeft een willekeurig item uit een lijst."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Geeft het laatste item in een lijst terug en verwijdert het."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Geeft het item op de opgegeven positie in een lijst terug en verwijdert het."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Geeft het laatste item uit een lijst terug en verwijdert het."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Geeft een willekeurig item in een lijst terug en verwijdert het."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Verwijdert het eerste item in een lijst."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Verwijdert het item op de opgegeven positie in een lijst."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Verwijdert het laatste item uit een lijst."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Verwijdert een willekeurig item uit een lijst."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "naar # vanaf einde"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "naar item"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "naar laatste"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "haal sublijst op vanaf eerste"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "haal sublijst op van positie vanaf einde"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "haal sublijst op vanaf positie"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Maakt een kopie van het opgegeven deel van de lijst."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "Item %1 is het laatste item."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "Item %1 is het eerste item."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "zoek eerste voorkomen van item"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; +Blockly.Msg.LISTS_INDEX_OF_LAST = "zoek laatste voorkomen van item"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Geeft de index terug van het eerste of laatste voorkomen van een item in de lijst. Geeft %1 terug als het item niet is gevonden."; +Blockly.Msg.LISTS_INLIST = "in lijst"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is leeg"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Geeft waar terug als de lijst leeg is."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; +Blockly.Msg.LISTS_LENGTH_TITLE = "lengte van %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Geeft de lengte van een lijst terug."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_REPEAT_TITLE = "Maak lijst met item %1, %2 keer herhaald"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Maakt een lijst die bestaat uit de opgegeven waarde, het opgegeven aantal keer herhaald."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "als"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "tussenvoegen op"; +Blockly.Msg.LISTS_SET_INDEX_SET = "stel in"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Voegt het item toe aan het begin van de lijst."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Voegt het item op een opgegeven positie in een lijst in."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Voeg het item aan het einde van een lijst toe."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Voegt het item op een willekeurige positie in de lijst in."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Stelt het eerste item in een lijst in."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Zet het item op de opgegeven positie in de lijst."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Stelt het laatste item van een lijst in."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Stelt een willekeurig item uit de lijst in."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "oplopend"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "aflopend"; +Blockly.Msg.LISTS_SORT_TITLE = "sorteer %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sorteer een kopie van een lijst."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alfabetisch, negeer hoofd-/kleine letters"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeriek"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabetisch"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "lijst maken van tekst"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "tekst maken van lijst"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Lijst van tekstdelen samenvoegen in één stuk tekst, waarbij de tekstdelen gescheiden zijn door een scheidingsteken."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Tekst splitsen in een lijst van teksten op basis van een scheidingsteken."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "met scheidingsteken"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "onwaar"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Geeft \"waar\" of \"onwaar\" terug."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "waar"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://nl.wikipedia.org/wiki/Ongelijkheid_(wiskunde)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Geeft \"waar\", als beide waarden gelijk aan elkaar zijn."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Geeft \"waar\" terug als de eerste invoer meer is dan de tweede invoer."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Geeft \"waar\" terug als de eerste invoer groter is of gelijk aan de tweede invoer."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Geeft \"waar\" als de eerste invoer kleiner is dan de tweede invoer."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Geeft \"waar\" terug als de eerste invoer kleiner of gelijk is aan de tweede invoer."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Geeft \"waar\" terug als de waarden niet gelijk zijn aan elkaar."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg.LOGIC_NEGATE_TITLE = "niet %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Geeft \"waar\" terug als de invoer \"onwaar\" is. Geeft \"onwaar\" als de invoer \"waar\" is."; +Blockly.Msg.LOGIC_NULL = "niets"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Geeft niets terug."; +Blockly.Msg.LOGIC_OPERATION_AND = "en"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; +Blockly.Msg.LOGIC_OPERATION_OR = "of"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Geeft waar als beide waarden waar zijn."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Geeft \"waar\" terug als in ieder geval één van de waarden waar is."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "als onwaar"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "als waar"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Test de voorwaarde in \"test\". Als de voorwaarde \"waar\" is, geef de waarde van \"als waar\" terug; geef anders de waarde van \"als onwaar\" terug."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://nl.wikipedia.org/wiki/Rekenen"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Geeft de som van 2 getallen."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Geeft de gedeelde waarde van twee getallen."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Geeft het verschil van de twee getallen."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Geeft het product terug van de twee getallen."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Geeft het eerste getal tot de macht van het tweede getal."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "%1 wijzigen met %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Voegt een getal toe aan variabele \"%1\"."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://nl.wikipedia.org/wiki/Wiskundige_constante"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Geeft een van de vaak voorkomende constante waardes: π (3.141…), e (2.718…), φ (1.618…), √2 (1.414…), √½ (0.707…), of ∞ (oneindig)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "beperk %1 van minimaal %2 tot maximaal %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Beperk een getal tussen de twee opgegeven limieten (inclusief)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "is deelbaar door"; +Blockly.Msg.MATH_IS_EVEN = "is even"; +Blockly.Msg.MATH_IS_NEGATIVE = "is negatief"; +Blockly.Msg.MATH_IS_ODD = "is oneven"; +Blockly.Msg.MATH_IS_POSITIVE = "is positief"; +Blockly.Msg.MATH_IS_PRIME = "is priemgetal"; +Blockly.Msg.MATH_IS_TOOLTIP = "Test of een getal even, oneven, een priemgetal, geheel, positief of negatief is, of deelbaar is door een bepaald getal. Geeft \"waar\" of \"onwaar\"."; +Blockly.Msg.MATH_IS_WHOLE = "is geheel getal"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://nl.wikipedia.org/wiki/Modulair_rekenen"; +Blockly.Msg.MATH_MODULO_TITLE = "restgetal van %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Geeft het restgetal van het resultaat van de deling van de twee getallen."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://nl.wikipedia.org/wiki/Getal_%28wiskunde%29"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Een getal."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "gemiddelde van lijst"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "hoogste uit lijst"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediaan van lijst"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "laagste uit lijst"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modi van lijst"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "willekeurige item van lijst"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standaarddeviatie van lijst"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "som van lijst"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Geeft het gemiddelde terug van de numerieke waardes in een lijst."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Geeft het grootste getal in een lijst."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Geeft de mediaan in de lijst."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Geeft het kleinste getal uit een lijst."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Geeft een lijst van de meest voorkomende onderdelen in de lijst."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Geeft een willekeurig item uit de lijst terug."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Geeft de standaardafwijking van de lijst."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Geeft de som van alle getallen in de lijst."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://nl.wikipedia.org/wiki/Toevalsgenerator"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "willekeurige fractie"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Geeft een willekeurige fractie tussen 0.0 (inclusief) en 1.0 (exclusief)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://nl.wikipedia.org/wiki/Toevalsgenerator"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "willekeurig geheel getal van %1 tot %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Geeft een willekeurig getal tussen de 2 opgegeven limieten in, inclusief."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://nl.wikipedia.org/wiki/Afronden"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "afronden"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "naar beneden afronden"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "omhoog afronden"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Rondt een getal af omhoog of naar beneden."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://nl.wikipedia.org/wiki/Vierkantswortel"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absoluut"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "wortel"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Geeft de absolute waarde van een getal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Geeft e tot de macht van een getal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Geeft het natuurlijk logaritme van een getal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Geeft het logaritme basis 10 van een getal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Geeft de negatief van een getal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Geeft 10 tot de macht van een getal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Geeft de wortel van een getal."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "acos"; +Blockly.Msg.MATH_TRIG_ASIN = "asin"; +Blockly.Msg.MATH_TRIG_ATAN = "arctan"; +Blockly.Msg.MATH_TRIG_COS = "cos"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://nl.wikipedia.org/wiki/Goniometrische_functie"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; +Blockly.Msg.MATH_TRIG_TAN = "tan"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Geeft de arccosinus van een getal."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Geeft de arcsinus van een getal."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Geeft de arctangens van een getal."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Geeft de cosinus van een graad (geen radialen)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Geeft de sinus van een graad (geen radialen)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Geeft de tangens van een graad (geen radialen)."; +Blockly.Msg.NEW_VARIABLE = "Variabele maken..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nieuwe variabelenaam:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "statements toestaan"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "met:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://nl.wikipedia.org/wiki/Subprogramma"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Voer de door de gebruiker gedefinieerde functie \"%1\" uit."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://nl.wikipedia.org/wiki/Subprogramma"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Voer de door de gebruiker gedefinieerde functie \"%1\" uit en gebruik de uitvoer."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "met:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Maak \"%1\""; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Deze functie beschrijven..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://nl.wikipedia.org/wiki/Subprogramma"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "doe iets"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "om"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Maakt een functie zonder uitvoer."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://nl.wikipedia.org/wiki/Subprogramma"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "uitvoeren"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Maakt een functie met een uitvoer."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Waarschuwing: deze functie heeft parameters met dezelfde naam."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Accentueer functiedefinitie"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Als de eerste waarde \"waar\" is, geef dan de tweede waarde terug."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Waarschuwing: dit blok mag alleen gebruikt worden binnen de definitie van een functie."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "invoernaam:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Een invoer aan de functie toevoegen."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "ingangen"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Invoer van deze functie toevoegen, verwijderen of herordenen."; +Blockly.Msg.REDO = "Opnieuw"; +Blockly.Msg.REMOVE_COMMENT = "Opmerking verwijderen"; +Blockly.Msg.RENAME_VARIABLE = "Variabele hernoemen..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Alle variabelen \"%1\" hernoemen naar:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "tekst"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg.TEXT_APPEND_TO = "voeg toe aan"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Voeg tekst toe aan de variabele \"%1\"."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "naar kleine letters"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "naar Hoofdletter Per Woord"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "naar HOOFDLETTERS"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Geef een kopie van de tekst met veranderde hoofdletters terug."; +Blockly.Msg.TEXT_CHARAT_FIRST = "haal eerste letter op"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "haal letter # op vanaf einde"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "haal letter # op"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in tekst"; +Blockly.Msg.TEXT_CHARAT_LAST = "haal laatste letter op"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "haal willekeurige letter op"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Geeft de letter op de opgegeven positie terug."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Voegt een item aan de tekst toe."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "samenvoegen"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Toevoegen, verwijderen of volgorde wijzigen van secties om dit tekstblok opnieuw in te stellen."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "van letter # tot einde"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "naar letter #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "naar laatste letter"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in tekst"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "haal subtekst op van eerste letter"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "haal subtekst op vanaf letter # vanaf einde"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "haal subtekst op vanaf letter #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Geeft het opgegeven onderdeel van de tekst terug."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in tekst"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "zoek eerste voorkomen van tekst"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "zoek het laatste voorkomen van tekst"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Geeft de index terug van het eerste of laatste voorkomen van de eerste tekst in de tweede tekst. Geeft %1 terug als de tekst niet gevonden is."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is leeg"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Geeft \"waar\" terug, als de opgegeven tekst leeg is."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "maak tekst met"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Maakt een stuk tekst door één of meer items samen te voegen."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg.TEXT_LENGTH_TITLE = "lengte van %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Geeft het aantal tekens terug (inclusief spaties) in de opgegeven tekst."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg.TEXT_PRINT_TITLE = "tekst weergeven: %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Drukt de opgegeven tekst, getal of een andere waarde af."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Vraagt de gebruiker om een getal in te voeren."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Vraagt de gebruiker om invoer."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "vraagt de gebruiker om een getal met de tekst"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "vraagt om invoer met bericht"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://nl.wikipedia.org/wiki/String_%28informatica%29"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Een letter, woord of een regel tekst."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "spaties van beide kanten afhalen van"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "spaties van de linkerkant verwijderen van"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "spaties van de rechterkant verwijderen van"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Geeft een kopie van de tekst met verwijderde spaties van één of beide kanten."; +Blockly.Msg.TODAY = "Vandaag"; +Blockly.Msg.UNDO = "Ongedaan maken"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Maak \"verander %1\""; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Geeft de waarde van deze variabele."; +Blockly.Msg.VARIABLES_SET = "stel %1 in op %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Maak 'opvragen van %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Verandert de waarde van de variabele naar de waarde van de invoer."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Er bestaat al een variabele met de naam \"%1\"."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/oc.js b/src/opsoro/server/static/js/blockly/msg/js/oc.js new file mode 100644 index 0000000..cea1eab --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/oc.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.oc'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Apondre un comentari"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Modificar la valor :"; +Blockly.Msg.CLEAN_UP = "Netejar los blòts"; +Blockly.Msg.COLLAPSE_ALL = "Redusir los blòts"; +Blockly.Msg.COLLAPSE_BLOCK = "Redusir lo blòt"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "color 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "color 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "ratio"; +Blockly.Msg.COLOUR_BLEND_TITLE = "mesclar"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://oc.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Choose a colour from the palette."; // untranslated +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "color aleatòria"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Causir una color a l'azard."; +Blockly.Msg.COLOUR_RGB_BLUE = "blau"; +Blockly.Msg.COLOUR_RGB_GREEN = "verd"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "roge"; +Blockly.Msg.COLOUR_RGB_TITLE = "coloriar amb"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "break out of loop"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continue with next iteration of loop"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Break out of the containing loop."; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the rest of this loop, and continue with the next iteration."; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warning: This block may only be used within a loop."; // untranslated +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "per cada element %1 dins la lista %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For each item in a list, set the variable '%1' to the item, and then do some statements."; // untranslated +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "comptar amb %1 de %2 a %3 per %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; // untranslated +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block."; // untranslated +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block."; // untranslated +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Add, remove, or reorder sections to reconfigure this if block."; // untranslated +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "siquenon"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "siquenon se"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "se"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "If a value is true, then do some statements."; // untranslated +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://oc.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "far"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "repetir %1 còps"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Do some statements several times."; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repetir fins a"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repetir tant que"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "While a value is false, then do some statements."; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "While a value is true, then do some statements."; // untranslated +Blockly.Msg.DELETE_ALL_BLOCKS = "Suprimir totes los %1 blòts ?"; +Blockly.Msg.DELETE_BLOCK = "Suprimir lo blòt"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "Suprimir %1 blòts"; +Blockly.Msg.DISABLE_BLOCK = "Desactivar lo blòt"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplicar"; +Blockly.Msg.ENABLE_BLOCK = "Activar lo blòt"; +Blockly.Msg.EXPAND_ALL = "Desvolopar los blòts"; +Blockly.Msg.EXPAND_BLOCK = "Desvolopar lo blòt"; +Blockly.Msg.EXTERNAL_INPUTS = "Entradas extèrnas"; +Blockly.Msg.HELP = "Ajuda"; +Blockly.Msg.INLINE_INPUTS = "Entradas en linha"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "create empty list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "crear una lista amb"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Add an item to the list."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_FIRST = "primièr"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# dempuèi la fin"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "obténer"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "obténer e suprimir"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "darrièr"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aleatòri"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "suprimit"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returns the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Removes and returns the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Removes the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "fins a # dempuèi la fin"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "fins a #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "fins a la fin"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "get sub-list from first"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 is the last item."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 is the first item."; // untranslated +Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated +Blockly.Msg.LISTS_INLIST = "dins la lista"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty."; // untranslated +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; // untranslated +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "coma"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "inserir en"; +Blockly.Msg.LISTS_SET_INDEX_SET = "metre"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserts the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sets the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "creissent"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descreissent"; +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabetic"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "amb lo separador"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "fals"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returns either true or false."; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "verai"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Renviar verai se las doas entradas son egalas."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Return true if the first input is greater than the second input."; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Return true if the first input is greater than or equal to the second input."; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Return true if the first input is smaller than the second input."; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Return true if the first input is smaller than or equal to the second input."; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Renviar verai se las doas entradas son diferentas."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "pas %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returns true if the input is false. Returns false if the input is true."; // untranslated +Blockly.Msg.LOGIC_NULL = "nul"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Renvia nul."; +Blockly.Msg.LOGIC_OPERATION_AND = "e"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "o"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Renviar verai se las doas entradas son vertadièras."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true."; // untranslated +Blockly.Msg.LOGIC_TERNARY_CONDITION = "tèst"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "se fals"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "se verai"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://oc.wikipedia.org/wiki/Aritmetica"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Return the sum of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Return the difference of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Return the product of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg.MATH_CHANGE_TITLE = "incrementar %1 per %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; // untranslated +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "es devesible per"; +Blockly.Msg.MATH_IS_EVEN = "es par"; +Blockly.Msg.MATH_IS_NEGATIVE = "es negatiu"; +Blockly.Msg.MATH_IS_ODD = "es impar"; +Blockly.Msg.MATH_IS_POSITIVE = "es positiu"; +Blockly.Msg.MATH_IS_PRIME = "es primièr"; +Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated +Blockly.Msg.MATH_IS_WHOLE = "es entièr"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated +Blockly.Msg.MATH_MODULO_TITLE = "remainder of %1 ÷ %2"; // untranslated +Blockly.Msg.MATH_MODULO_TOOLTIP = "Return the remainder from dividing the two numbers."; // untranslated +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://oc.wikipedia.org/wiki/Nombre"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un nombre."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "mejana de la lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maximum de la lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana de la lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimum de la lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modes of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "random item of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standard deviation of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "soma de la lista"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Return the average (arithmetic mean) of the numeric values in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Return the largest number in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Return the median number in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Return the smallest number in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Return a list of the most common item(s) in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Return a random element from the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Return the sum of all the numbers in the list."; // untranslated +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "random fraction"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_TITLE = "random integer from %1 to %2"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; // untranslated +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; // untranslated +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arredondir"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arredondir a l’inferior"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arredondir al superior"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Round a number up or down."; // untranslated +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; // untranslated +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolut"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "raiç carrada"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Return the negation of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Return the square root of a number."; // untranslated +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated +Blockly.Msg.NEW_VARIABLE = "Crear una variabla..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nom de la novèla variabla :"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "amb :"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "amb :"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Crear '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "far quicòm"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "a"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "retorn"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; // untranslated +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; // untranslated +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nom de l’entrada :"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entradas"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Refar"; +Blockly.Msg.REMOVE_COMMENT = "Suprimir un comentari"; +Blockly.Msg.RENAME_VARIABLE = "Renomenar la variabla…"; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Renomenar totas las variablas « %1 » a :"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "apondre lo tèxte"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "a"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; // untranslated +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "en minusculas"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "en MAJUSCULAS"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg.TEXT_CHARAT_FIRST = "obténer la primièra letra"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "obténer la letra # dempuèi la fin"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "obténer la letra #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "dins lo tèxte"; +Blockly.Msg.TEXT_CHARAT_LAST = "obténer la darrièra letra"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "obténer una letra a l'azard"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Renvia la letra a la posicion indicada."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "jónher"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "fins a la letra #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "dins lo tèxte"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; // untranslated +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "dins lo tèxte"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 es void"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "create text with"; // untranslated +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "longor de %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; // untranslated +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "afichar %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; // untranslated +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated +Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; // untranslated +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "trim spaces from both sides of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated +Blockly.Msg.TODAY = "Uèi"; +Blockly.Msg.UNDO = "Anullar"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crear 'fixar %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; // untranslated +Blockly.Msg.VARIABLES_SET = "fixar %1 a %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/pl.js b/src/opsoro/server/static/js/blockly/msg/js/pl.js new file mode 100644 index 0000000..f189dc9 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/pl.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.pl'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Dodaj komentarz"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Zmień wartość:"; +Blockly.Msg.CLEAN_UP = "Uporządkuj bloki"; +Blockly.Msg.COLLAPSE_ALL = "Zwiń bloki"; +Blockly.Msg.COLLAPSE_BLOCK = "Zwiń blok"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "kolor 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "kolor 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "proporcja"; +Blockly.Msg.COLOUR_BLEND_TITLE = "wymieszaj"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Miesza dwa kolory w danej proporcji (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Wybierz kolor z palety."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "losowy kolor"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Wybierz kolor w sposób losowy."; +Blockly.Msg.COLOUR_RGB_BLUE = "niebieski"; +Blockly.Msg.COLOUR_RGB_GREEN = "zielony"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "czerwony"; +Blockly.Msg.COLOUR_RGB_TITLE = "kolor z"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Połącz czerwony, zielony i niebieski w odpowiednich proporcjach, tak aby powstał nowy kolor. Zawartość każdego z nich określa liczba z przedziału od 0 do 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "wyjdź z pętli"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "przejdź do kolejnej iteracji pętli"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Wyjdź z zawierającej pętli."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Pomiń resztę pętli i kontynuuj w kolejnej iteracji."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Uwaga: Ten blok może być użyty tylko w pętli."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "dla każdego elementu %1 na liście %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Dla każdego elementu listy ustaw zmienną %1 na ten element, a następnie wykonaj kilka instrukcji."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "licz z %1 od %2 do %3 co %4 (wartość kroku)"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Przypisuje zmiennej %1 wartości od numeru startowego do numeru końcowego, licząc co określony interwał, wykonując określone bloki."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Dodaj warunek do bloku „jeśli”."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Dodaj ostatni warunek do bloku „jeśli”, gdy żaden wcześniejszy nie był spełniony."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Dodaj, usuń lub zmień kolejność bloków, żeby zmodyfikować ten blok „jeśli”."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "w przeciwnym razie"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "w przeciwnym razie, jeśli"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "jeśli"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Jeśli wartość jest prawdziwa, to wykonaj kilka instrukcji."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Jeśli wartość jest prawdziwa, to wykonaj pierwszy blok instrukcji. W przeciwnym razie, wykonaj drugi blok instrukcji."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Jeśli pierwsza wartość jest prawdziwa, to wykonaj pierwszy blok instrukcji. W przeciwnym razie, jeśli druga wartość jest prawdziwa, to wykonaj drugi blok instrukcji."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Jeśli pierwsza wartość jest prawdziwa, wykonaj pierwszy blok instrukcji. W przeciwnym razie jeśli druga wartość jest prawdziwa, wykonaj drugi blok instrukcji. Jeżeli żadna z wartości nie jest prawdziwa, wykonaj ostatni blok instrukcji."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "wykonaj"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "powtórz %1 razy"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Wykonaj niektóre instrukcje kilka razy."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "powtarzaj aż"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "powtarzaj dopóki"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Gdy wartość jest nieprawdziwa, wykonaj kilka instrukcji."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Gdy wartość jest prawdziwa, wykonaj kilka instrukcji."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Usunąć wszystkie %1 bloki(ów)?"; +Blockly.Msg.DELETE_BLOCK = "Usuń blok"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "Usuń %1 bloki(ów)"; +Blockly.Msg.DISABLE_BLOCK = "Wyłącz blok"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplikuj"; +Blockly.Msg.ENABLE_BLOCK = "Włącz blok"; +Blockly.Msg.EXPAND_ALL = "Rozwiń bloki"; +Blockly.Msg.EXPAND_BLOCK = "Rozwiń blok"; +Blockly.Msg.EXTERNAL_INPUTS = "Zewnętrzne wejścia"; +Blockly.Msg.HELP = "Pomoc"; +Blockly.Msg.INLINE_INPUTS = "Wbudowane wejścia"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "utwórz pustą listę"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Zwraca listę, o długości 0, nie zawierającą rekordów z danymi"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Dodaj, usuń lub zmień kolejność sekcji żeby skonfigurować ten blok listy."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "Tworzenie listy z"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Dodaj element do listy."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Utwórz listę z dowolną ilością elementów."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "pierwszy"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# od końca"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "pobierz"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "Pobierz i usuń"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "ostatni"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "losowy"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "usuń"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Zwraca pierwszy element z listy."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Zwraca element z konkretnej pozycji na liście."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Zwraca ostatni element z listy."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Zwraca losowy element z listy."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Usuwa i zwraca pierwszy element z listy."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Usuwa i zwraca element z określonej pozycji na liście."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Usuwa i zwraca ostatni element z listy."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Usuwa i zwraca losowy element z listy."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Usuwa pierwszy element z listy."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Usuwa element z określonej pozycji na liście."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Usuwa ostatni element z listy."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Usuwa losowy element z listy."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "do # od końca"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "do #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "do ostatniego"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "Pobierz listę podrzędną z pierwszego"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "Pobierz listę podrzędną z # od końca"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "Pobierz listę podrzędną z #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Tworzy kopię z określoną część listy."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 to ostatni element."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 to pierwszy element."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "znaleźć pierwsze wystąpienie elementu"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "znajduje ostatanie wystąpienie elementu"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Zwraca indeks pierwszego/ostatniego wystąpienia elementu na liście. Zwraca wartość %1, jeśli tekst nie zostanie znaleziony."; +Blockly.Msg.LISTS_INLIST = "na liście"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 jest pusty"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Zwraca \"prawda\" jeśli lista jest pusta."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "długość %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Zwraca długość listy."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "stwórz listę, powtarzając element %1 %2 razy"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Tworzy listę składającą się z podanej wartości powtórzonej odpowiednią liczbę razy."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "jako"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "wstaw w"; +Blockly.Msg.LISTS_SET_INDEX_SET = "ustaw"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Wstawia element na początku listy."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Wstawia element w odpowiednim miejscu na liście."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Dodaj element na koniec listy."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Wstawia element w losowym miejscu na liście."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Ustawia pierwszy element na liście."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Ustawia element w określonym miejscu na liście."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Ustawia ostatni element na liście."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Ustawia losowy element na liście."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "rosnąco"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "malejąco"; +Blockly.Msg.LISTS_SORT_TITLE = "sortuj %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sortuj kopię listy."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alfabetycznie, bez uwzględniania wielkości liter"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numerycznie"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabetycznie"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "stwórz listę z tekstu"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "stwórz tekst z listy"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Łączy listę tekstów w jeden tekst, rozdzielany separatorem."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Rozdziela tekst na listę mniejszych tekstów, dzieląc na każdym separatorze."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "z separatorem"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "fałsz"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Zwraca 'prawda' lub 'fałsz'."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "prawda"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://pl.wikipedia.org/wiki/Nierówność"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Zwróć \"prawda\", jeśli oba wejścia są sobie równe."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Zwróć \"prawda\" jeśli pierwsze wejście jest większe od drugiego."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Zwróć \"prawda\", jeśli pierwsze wejście jest większe lub równe drugiemu."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Zwróć \"prawda\" jeśli pierwsze wejście jest większe od drugiego."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Zwróć \"prawda\", jeśli pierwsze wejście jest większe lub równe drugiemu."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Zwróć \"prawda\", jeśli oba wejścia są sobie nierówne."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "nie %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Zwraca \"prawda\", jeśli dane wejściowe są fałszywe. Zwraca \"fałsz\", jeśli dana wejściowa jest prawdziwa."; +Blockly.Msg.LOGIC_NULL = "nic"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Zwraca nic."; +Blockly.Msg.LOGIC_OPERATION_AND = "i"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "lub"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Zwróć \"prawda\" jeśli oba dane elementy mają wartość \"prawda\"."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Zwróć \"prawda\" jeśli co najmniej jeden dany element ma wartość \"prawda\"."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "jeśli fałsz"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "jeśli prawda"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Sprawdź warunek w „test”. Jeśli warunek jest prawdziwy, to zwróci „jeśli prawda”; jeśli nie jest prawdziwy to zwróci „jeśli fałsz”."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://pl.wikipedia.org/wiki/Arytmetyka"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Zwróć sumę dwóch liczb."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Zwróć iloraz dwóch liczb."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Zwróć różnicę dwóch liczb."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Zwróć iloczyn dwóch liczb."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Zwróć pierwszą liczbę podniesioną do potęgi o wykładniku drugiej liczby."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "zmień %1 o %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Dodaj liczbę do zmiennej '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://pl.wikipedia.org/wiki/Stała_(matematyka)"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Zwróć jedną wspólną stałą: π (3.141), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) lub ∞ (nieskończoność)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "ogranicz %1 z dołu %2 z góry %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Ogranicz liczbę, aby była w określonych granicach (włącznie)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "/"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "jest podzielna przez"; +Blockly.Msg.MATH_IS_EVEN = "jest parzysta"; +Blockly.Msg.MATH_IS_NEGATIVE = "jest ujemna"; +Blockly.Msg.MATH_IS_ODD = "jest nieparzysta"; +Blockly.Msg.MATH_IS_POSITIVE = "jest dodatnia"; +Blockly.Msg.MATH_IS_PRIME = "jest liczbą pierwszą"; +Blockly.Msg.MATH_IS_TOOLTIP = "Sprawdź, czy liczba jest parzysta, nieparzysta, pierwsza, całkowita, dodatnia, ujemna, lub czy jest podzielna przez podaną liczbę. Zwraca wartość \"prawda\" lub \"fałsz\"."; +Blockly.Msg.MATH_IS_WHOLE = "jest liczbą całkowitą"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://pl.wikipedia.org/wiki/Modulo"; +Blockly.Msg.MATH_MODULO_TITLE = "reszta z dzielenia %1 przez %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Zwróć resztę z dzielenia dwóch liczb przez siebie."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Liczba."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "średnia elementów listy"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maksymalna wartość z listy"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana listy"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimalna wartość z listy"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "dominanty listy"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "losowy element z listy"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "odchylenie standardowe listy"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "suma elementów listy"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Zwróć średnią (średnią arytmetyczną) wartości liczbowych z listy."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Zwróć największą liczbę w liście."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Zwróć medianę listy."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Zwróć najmniejszą liczbę w liście."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Zwróć listę najczęściej występujących elementów w liście."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Zwróć losowy element z listy."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Zwróć odchylenie standardowe listy."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Zwróć sumę wszystkich liczb z listy."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "losowy ułamek"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Zwróć losowy ułamek między 0.0 (włącznie), a 1.0 (wyłącznie)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "losowa liczba całkowita od %1 do %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Zwróć losową liczbę całkowitą w ramach dwóch wyznaczonych granic, włącznie."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://pl.wikipedia.org/wiki/Zaokrąglanie"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "zaokrąglij"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "zaokrąglij w dół"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "zaokrąglij w górę"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Zaokrąglij w górę lub w dół."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://pl.wikipedia.org/wiki/Pierwiastek_kwadratowy"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "wartość bezwzględna"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "pierwiastek kwadratowy"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Zwróć wartość bezwzględną danej liczby."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Zwróć e do potęgi danej liczby."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Zwróć logarytm naturalny danej liczby."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Zwraca logarytm dziesiętny danej liczby."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Zwróć negację danej liczby."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Zwróć 10 do potęgi danej liczby."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Zwróć pierwiastek kwadratowy danej liczby."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "arccos"; +Blockly.Msg.MATH_TRIG_ASIN = "arcsin"; +Blockly.Msg.MATH_TRIG_ATAN = "arctg"; +Blockly.Msg.MATH_TRIG_COS = "cos"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://pl.wikipedia.org/wiki/Funkcje_trygonometryczne"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; +Blockly.Msg.MATH_TRIG_TAN = "tg"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Zwróć arcus cosinus danej liczby."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Zwróć arcus sinus danej liczby."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Zwróć arcus tangens danej liczby."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Zwróć wartość cosinusa o stopniu (nie w radianach)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Zwróć wartość sinusa o stopniu (nie w radianach)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Zwróć tangens o stopniu (nie w radianach)."; +Blockly.Msg.NEW_VARIABLE = "Stwórz zmienną..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nowa nazwa zmiennej:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "zezwól na instrukcje"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "z:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://pl.wikipedia.org/wiki/Podprogram"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Uruchom funkcję zdefiniowaną przez użytkownika '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://pl.wikipedia.org/wiki/Podprogram"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Uruchom funkcję zdefiniowaną przez użytkownika '%1' i skorzystaj z jej wyniku."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "z:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Stwórz '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Opisz tę funkcję..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "zrób coś"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "do"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Tworzy funkcję bez wyniku."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "zwróć"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Tworzy funkcję z wynikiem."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Uwaga: Ta funkcja ma powtórzone parametry."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Podświetl definicję funkcji"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Jeśli wartość jest prawdziwa, zwróć drugą wartość."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Uwaga: Ten blok może być używany tylko w definicji funkcji."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nazwa wejścia:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Dodaj dane wejściowe do funkcji."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "wejścia"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Dodaj, usuń lub zmień kolejność danych wejściowych dla tej funkcji."; +Blockly.Msg.REDO = "Ponów"; +Blockly.Msg.REMOVE_COMMENT = "Usuń komentarz"; +Blockly.Msg.RENAME_VARIABLE = "Zmień nazwę zmiennej..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Zmień nazwy wszystkich '%1' zmiennych na:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "dołącz tekst"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "do"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Dołącz tekst do zmiennej '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "zmień na małe litery"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "zmień na od Wielkich Liter"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "zmień na WIELKIE LITERY"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Zwraca kopię tekstu z inną wielkością liter."; +Blockly.Msg.TEXT_CHARAT_FIRST = "pobierz pierwszą literę"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "pobierz literę # od końca"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "pobierz literę #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "z tekstu"; +Blockly.Msg.TEXT_CHARAT_LAST = "pobierz ostatnią literę"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "pobierz losową literę"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Zwraca literę z określonej pozycji."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Dodaj element do tekstu."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "połącz"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Dodaj, usuń lub zmień kolejność sekcji, aby zmodyfikować blok tekstowy."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "do # litery od końca"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "do # litery"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "do ostatniej litery"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "w tekście"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "pobierz podciąg od pierwszej litery"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "pobierz podciąg od # litery od końca"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "pobierz podciąg od # litery"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Zwraca określoną część tekstu."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "w tekście"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "znajdź pierwsze wystąpienie tekstu"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "znajdź ostatnie wystąpienie tekstu"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Zwraca indeks pierwszego/ostatniego wystąpienia pierwszego tekstu w drugim tekście. Zwraca wartość %1, jeśli tekst nie został znaleziony."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 jest pusty"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Zwraca prawda (true), jeśli podany tekst jest pusty."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "utwórz tekst z"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Tworzy fragment tekstu, łącząc ze sobą dowolną liczbę tekstów."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "długość %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Zwraca liczbę liter (łącznie ze spacjami) w podanym tekście."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "wydrukuj %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Drukuj określony tekst, liczbę lub inną wartość."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Zapytaj użytkownika o liczbę."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Zapytaj użytkownika o jakiś tekst."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "poproś o liczbę z tą wiadomością"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "poproś o tekst z tą wiadomością"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://pl.wikipedia.org/wiki/Tekstowy_typ_danych"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Litera, wyraz lub linia tekstu."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "usuń spacje po obu stronach"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "usuń spacje z lewej strony"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "usuń spacje z prawej strony"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Zwraca kopię tekstu z usuniętymi spacjami z jednego lub z obu końców tekstu."; +Blockly.Msg.TODAY = "Dzisiaj"; +Blockly.Msg.UNDO = "Cofnij"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Utwórz blok 'ustaw %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Zwraca wartość tej zmiennej."; +Blockly.Msg.VARIABLES_SET = "przypisz %1 wartość %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Utwórz blok 'pobierz %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Nadaj tej zmiennej wartość."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Zmienna o nazwie '%1' już istnieje."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/pms.js b/src/opsoro/server/static/js/blockly/msg/js/pms.js new file mode 100644 index 0000000..62a005f --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/pms.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.pms'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Gionté un coment"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Modifiché ël valor:"; +Blockly.Msg.CLEAN_UP = "Dëscancelé ij blòch"; +Blockly.Msg.COLLAPSE_ALL = "Arduve ij blòch"; +Blockly.Msg.COLLAPSE_BLOCK = "Arduve ël blòch"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "color 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "color 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "rapòrt"; +Blockly.Msg.COLOUR_BLEND_TITLE = "mës-cé"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "A mës-cia doi color ansema con un rapòrt dàit (0,0 - 1,0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Serne un color ant la taulòssa."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "color a asar"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Serne un color a asar."; +Blockly.Msg.COLOUR_RGB_BLUE = "bleu"; +Blockly.Msg.COLOUR_RGB_GREEN = "verd"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "ross"; +Blockly.Msg.COLOUR_RGB_TITLE = "coloré con"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Creé un color con la quantità spessificà ëd ross, verd e bleu. Tuti ij valor a devo esse antra 0 e 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "seurte da la liassa"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continué con l'iterassion sucessiva dla liassa"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Seurte da la liassa anglobanta."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Sauté ël rest ëd sa liassa, e continué con l'iterassion apress."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Atension: Ës blòch a peul mach esse dovrà andrinta a na liassa."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "për minca n'element %1 ant la lista %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Për minca element an na lista, dé ël valor ëd l'element a la variàbil '%1', peui eseguì chèiche anstrussion."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "conté con %1 da %2 a %3 për %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Fé an manera che la variàbil \"%1\" a pija ij valor dal nùmer inissial fin-a al nùmer final, an contand për l'antërval ëspessificà, e eseguì ij bloch ëspessificà."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Gionté na condission al blòch si."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Gionté na condission final ch'a cheuj tut al blòch si."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Gionté, gavé o riordiné le session për cinfiguré torna ës blòch si."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "dësnò"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "dësnò si"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "si"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Si un valor a l'é ver, antlora eseguì chèiche anstrussion."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Si un valor a l'é ver, antlora eseguì ël prim blòch d'anstrussion. Dësnò, eseguì ël second blòch d'anstrussion."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Si ël prim valor a l'é ver, antlora fé andé ël prim blòch d'anstrussion. Dësnò, si ël second valor a l'é ver, fé andé ël second blòch d'anstrussion."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Si ël prim valor a l'é ver, antlora fé andé ël prim blòch d'anstrussion. Dësnò, si ël second valor a l'é ver, fé andé ël second blòcj d'anstrussion. Si gnun dij valor a l'é ver, fé andé l'ùltim blòch d'anstrussion."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "fé"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "arpete %1 vire"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Eseguì chèiche anstrussion vàire vire."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "arpete fin-a a"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "arpete antramentre che"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Cand un valor a l'é fàuss, eseguì chèiche anstrussion."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Cand un valor a l'é ver, eseguì chèiche anstrussion."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Scancelé tuti ij %1 blòch?"; +Blockly.Msg.DELETE_BLOCK = "Scancelé ël blòch"; +Blockly.Msg.DELETE_VARIABLE = "Eliminé la variàbil '%1'"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Eliminé %1 utilisassion ëd la variàbil '%2'?"; +Blockly.Msg.DELETE_X_BLOCKS = "Scancelé %1 blòch"; +Blockly.Msg.DISABLE_BLOCK = "Disativé ël blòch"; +Blockly.Msg.DUPLICATE_BLOCK = "Dupliché"; +Blockly.Msg.ENABLE_BLOCK = "Ativé ël blòch"; +Blockly.Msg.EXPAND_ALL = "Dësvlupé ij blòch"; +Blockly.Msg.EXPAND_BLOCK = "Dësvlupé ël blòch"; +Blockly.Msg.EXTERNAL_INPUTS = "Imission esterne"; +Blockly.Msg.HELP = "Agiut"; +Blockly.Msg.INLINE_INPUTS = "Imission an linia"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "creé na lista veuida"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Smon-e na lista, ëd longheur 0, ch'a conten gnun-a argistrassion"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Gionté, gavé o riordiné le session për configuré torna cost blòch ëd lista."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "creé na lista con"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Gionté n'element a la lista."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Creé na lista con un nùmer qualsëssìa d'element."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "prim"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# da la fin"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "oten-e"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "oten-e e eliminé"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "ùltim"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "a l'ancàpit"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "eliminé"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "A smon ël prim element an na lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "A smon l'element a la posission ëspessificà an na lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "A smon l'ùltim element an na lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "A smon n'element a l'ancàpit an na lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "A gava e a smon ël prim element an na lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "A gava e a smon l'element a la posission ëspessificà an na lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "A gava e a smon l'ùltim element an na lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "A gava e a smon n'element a l'ancàpit an na lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "A gava ël prim element an na lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "A gava l'element a la posission ëspessificà an na lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "A gava l'ùltim element an na lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "A gava n'element a l'ancàpit da na lista."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "fin-a a # da la fin"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "fin-a a #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "fin-a a l'ùltim"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "oten-e la sot-lista dal prim"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "oten-e la sot-lista da # da la fin"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "oten-e la sot-lista da #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "A crea na còpia dël tòch ëspessificà ëd na lista."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 a l'é l'ùltim element."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 a l'é ël prim element."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "trové la prima ocorensa dl'element"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "trové l'ùltima ocorensa dl'element"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "A smon l'ìndes ëd la prima/ùltima ocorensa dl'element ant la lista. A smon %1 se l'element a l'é nen trovà."; +Blockly.Msg.LISTS_INLIST = "ant la lista"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 a l'é veuid"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "A smon ver se la lista a l'é veuida."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "longheur ëd %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "A smon la longheur ¨d na lista."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "creé na lista con l'element %1 arpetù %2 vire"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "A crea na lista ch'a consist dël valor dàit arpetù ël nùmer ëspessificà ëd vire."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "anversé %1"; +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Anversé na còpia ëd na lista"; +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "tanme"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "anserì an"; +Blockly.Msg.LISTS_SET_INDEX_SET = "buté"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "A anseriss l'element al prinsipi ëd na lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "A anseriss l'element a la posission ëspessificà an na lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Gionté l'element a la fin ëd na lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "A anseriss l'element a l'ancàpit an na lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "A fissa ël prim element an na lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "A fissa l'element a la posission ëspessificà an na lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "A fissa l'ùltim element an na lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "A fissa n'element a l'ancàpit an na lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "chërsent"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "calant"; +Blockly.Msg.LISTS_SORT_TITLE = "ordiné %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Ordiné na còpia ëd na lista."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alfabétich, ignorand ël caràter minùscol o majùscol"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numérich"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabétich"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "fé na lista da 'n test"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "fé 'n test da na lista"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Gionze na lista ëd test ant un test sol, separandje con un separator."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Divide un test an na lista ëd test, tajand a minca 'n separator."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "con ël separator"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "fàuss"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "A rëspond ver o fàuss."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "ver"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Rësponde ver si le doe imission a son uguaj."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Rësponde ver si la prima imission a l'é pi granda che la sconda."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Rësponde ver si la prima imission a l'é pi granda o ugual a la sconda."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Rësponde ver si la prima imission a l'é pi cita dla sconda."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Rësponde ver si la prima imission a l'é pi cita o ugual a la sconda."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Rësponde ver si le doe imission a son nen uguaj."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "nen %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "A rëspond ver se l'imission a l'é fàussa. A rëspond fàuss se l'imission a l'é vera."; +Blockly.Msg.LOGIC_NULL = "gnente"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "A rëspond gnente."; +Blockly.Msg.LOGIC_OPERATION_AND = "e"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "o"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Rësponde ver se tute doe j'imission a son vere."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Rësponde ver se almanch un-a d'imission a l'é vera."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "preuva"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "se fàuss"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "se ver"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Controlé la condission an 'preuva'. Se la condission a l'é vera, a rëspond con ël valor 'se ver'; dësnò a rëspond con ël valor 'se fàuss'."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "A smon la soma ëd doi nùmer."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "A smon ël cossient dij doi nùmer."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "A smon la diferensa dij doi nùmer."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "A smon ël prodot dij doi nùmer."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "A smon ël prim nùmer alvà a la potensa dël second."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "ancrementé %1 për %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Gionté un nùmer a la variàbil '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "A smon un-a dle costante comun-e π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) o ∞ (infinì)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "limité %1 antra %2 e %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Limité un nùmer a esse antra le limitassion ëspessificà (comprèise)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "a l'é divisìbil për"; +Blockly.Msg.MATH_IS_EVEN = "a l'é cobi"; +Blockly.Msg.MATH_IS_NEGATIVE = "a l'é negativ"; +Blockly.Msg.MATH_IS_ODD = "a l'é dëscobi"; +Blockly.Msg.MATH_IS_POSITIVE = "a l'é positiv"; +Blockly.Msg.MATH_IS_PRIME = "a l'é prim"; +Blockly.Msg.MATH_IS_TOOLTIP = "A contròla si un nùmer a l'é cobi, dëscobi, prim, antreghm positiv, negativ, o s'a l'é divisìbil për un nùmer dàit. A rëspond ver o fàuss."; +Blockly.Msg.MATH_IS_WHOLE = "a l'é antregh"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "resta ëd %1:%2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "A smon la resta ëd la division dij doi nùmer."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un nùmer."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "media dla lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "màssim ëd la lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mesan-a dla lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "mìnim ëd la lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "mòde dla lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "element a l'ancàpit ëd la lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "deviassion ëstàndard ëd la lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "soma dla lista"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "A smon la media (aritmética) dij valor numérich ant la lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "A smon ël pi gròss nùmer ëd la lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "A smon ël nùmer mesan ëd la lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "A smon ël pi cit nùmer ëd la lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "A smon na lista dj'element pi frequent ëd la lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "A smon n'element a l'ancàpit da la lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "A smon la deviassion ëstàndard ëd la lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "A smon la soma ëd tuti ij nùmer ant la lista."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "frassion aleatòria"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "A smon na frassion aleatòria antra 0,0 (comprèis) e 1,0 (esclus)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "antregh aleatòri antra %1 e %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "A smon n'antregh aleatòri antra ij doi lìmit ëspessificà, comprèis."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "ariondé"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "ariondé për difet"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "ariondé për ecess"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "A arionda un nùmer për difet o ecess."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "assolù"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "rèis quadra"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "A smon ël valor assolù d'un nùmer."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "A smon e a la potensa d'un nùmer."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "A smon ël logaritm natural d'un nùmer."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "A smon ël logaritm an base 10 d'un nùmer."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "A smon l'opòst d'un nùmer."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "A smon 10 a la potensa d'un nùmer."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "A smon la rèis quadra d'un nùmer."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "A smon l'arch-cosen d'un nùmer."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "A smon l'arch-sen d'un nùmer."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "A smon l'arch-tangenta d'un nùmer."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "A smon ël cosen ëd n'àngol an gré (pa an radiant)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "A smon ël sen ëd n'àngol an gré (pa an radiant)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "A smon la tangenta ëd n'àngol an gré (pa an radiant)."; +Blockly.Msg.NEW_VARIABLE = "Creé na variàbil..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nòm ëd la neuva variàbil:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "përmëtte le diciairassion"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "con:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Eseguì la fonsion '%1' definìa da l'utent."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Eseguì la fonsion '%1' definìa da l'utent e dovré sò arzultà."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "con:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Creé '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Descrive sa fonsion..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "fé cheicòs"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "a"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "A crea na fonsion sensa surtìa."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "artorn"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "A crea na fonsion con na surtìa."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Atension: Costa fonsion a l'ha dij paràmeter duplicà."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Sot-ligné la definission dla fonsion"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Se un valor a l'é ver, antlora smon-e un second valor."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Atension: Ës blòch a podria esse dovrà mach an na definission ëd fonsion."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nòm ëd l'imission:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Gionté n'imission a la fonsion."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "imission"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Gionté, gavé o riordiné j'imission ëd sa fonsion."; +Blockly.Msg.REDO = "Fé torna"; +Blockly.Msg.REMOVE_COMMENT = "Scancelé un coment"; +Blockly.Msg.RENAME_VARIABLE = "Arnomé la variàbil..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Arnomé tute le variàbij '%1' 'me:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "taché ël test"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "a"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Taché dël test a la variàbil '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "an minùscul"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "an Majùscol A L'Ancamin Ëd Minca Paròla"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "an MAJÙSCOL"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "A smon na còpia dël test ant un caràter diferent."; +Blockly.Msg.TEXT_CHARAT_FIRST = "oten-e la prima litra"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "oten-e la litra # da la fin"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "oten-e la litra #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "ant ël test"; +Blockly.Msg.TEXT_CHARAT_LAST = "oten-e l'ùltima litra"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "oten-e na litra a l'ancàpit"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "A smon la litra ant la posission ëspessificà."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "nùmer %1 su %2"; +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Conté vàire vire un test dàit a compariss an n'àutr test."; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Gionté n'element al test."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "gionze"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Gionté, gavé o riordiné le session për configuré torna ës blòch ëd test."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "fin-a a la litra # da la fin"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "fin-a a la litra #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "fin-a a l'ùltima litra"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "ant ël test"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "oten-e la sota-stringa da la prima litra"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "oten-e la sota-stringa da la litra # da la fin"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "oten-e la sota-stringa da la litra #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "A smon un tòch ëspessificà dël test."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "ant ël test"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "trové la prima ocorensa dël test"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "trové l'ùltima ocorensa dël test"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "A smon l'ìndes dla prima/ùltima ocorensa dël prim test ant ël second test. A smon %1 se ël test a l'é nen trovà."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 a l'é veuid"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "A smon ver se ël test fornì a l'é veuid."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "creé ël test con"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Creé un tòch ëd test an gionzend un nùmer qualsëssìa d'element."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "longheur ëd %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "A smon ël nùmer ëd litre (spassi comprèis) ant ël test fornì."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "smon-e %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Smon-e ël test, ël nùmer o n'àutr valor ëspessificà."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Ciamé un nùmer a l'utent."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Ciamé un test a l'utent."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "anvit për un nùmer con un mëssagi"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "anvit për un test con un mëssagi"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "rampiassé %1 con %2 an %3"; +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Rampiassé tute j'ocorense d'un test con n'àutr."; +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "Anversé %1"; +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Anversé l'òrdin dij caràter ant ël test."; +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Na litra, na paròla o na linia ëd test."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "gavé jë spassi da le doe bande ëd"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "gavé jë spassi da la banda snistra ëd"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "gavé jë spassi da la banda drita ëd"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "A smon na còpia dël test con jë spassi gavà da n'estremità o da tute doe."; +Blockly.Msg.TODAY = "Ancheuj"; +Blockly.Msg.UNDO = "Anulé"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Creé 'fissé %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "A smon ël valor ëd sa variàbil."; +Blockly.Msg.VARIABLES_SET = "fissé %1 a %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Creé 'oten-e %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Fissé costa variàbil ugual al valor d'imission."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Na variàbil con ël nòm '%1' a esist già."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/pt-br.js b/src/opsoro/server/static/js/blockly/msg/js/pt-br.js new file mode 100644 index 0000000..e323d03 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/pt-br.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.pt.br'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Adicionar comentário"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Mudar valor:"; +Blockly.Msg.CLEAN_UP = "Limpar blocos"; +Blockly.Msg.COLLAPSE_ALL = "Colapsar Bloco"; +Blockly.Msg.COLLAPSE_BLOCK = "Colapsar Bloco"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "cor 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "cor 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "proporção"; +Blockly.Msg.COLOUR_BLEND_TITLE = "misturar"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mistura duas cores em uma dada proporção (0,0 - 1,0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://pt.wikipedia.org/wiki/Cor"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Escolher uma cor da palheta de cores."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "cor aleatória"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Escolher cor de forma aleatória."; +Blockly.Msg.COLOUR_RGB_BLUE = "azul"; +Blockly.Msg.COLOUR_RGB_GREEN = "verde"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "vermelho"; +Blockly.Msg.COLOUR_RGB_TITLE = "colorir com"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Criar uma cor com a quantidade especificada de vermelho, verde e azul. Todos os valores devem estar entre 0 e 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "encerra o laço"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continua com a próxima iteração do laço"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Encerra o laço."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Ignora o resto deste laço, e continua com a próxima iteração."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Atenção: Este bloco só pode ser usado dentro de um laço."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "para cada item %1 na lista %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Para cada item em uma lista, atribuir o item à variável '%1' e então realiza algumas instruções."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "contar com %1 de %2 até %3 por %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Faz com que a variável '%1' assuma os valores do número inicial ao número final, contando de acordo com o intervalo especificado e executa os blocos especificados."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Acrescente uma condição para o bloco se."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Acrescente uma condição final para o bloco se."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Acrescente, remova ou reordene seções para reconfigurar este bloco."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "senão"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "senão se"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "se"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Se um valor for verdadeiro, então realize algumas instruções."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Se um valor for verdadeiro, então realize o primeiro bloco de instruções. Senão, realize o segundo bloco de instruções."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Se o primeiro valor é verdadeiro, então realize o primeiro bloco de instruções. Senão, se o segundo valor é verdadeiro, realize o segundo bloco de instruções."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Se o primeiro valor for verdadeiro, então realize o primeiro bloco de instruções. Senão, se o segundo valor é verdadeiro, realize o segundo bloco de instruções. Se nenhum dos blocos for verdadeiro, realize o último bloco de instruções."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://pt.wikipedia.org/wiki/Estrutura_de_repeti%C3%A7%C3%A3o#Repeti.C3.A7.C3.A3o_com_vari.C3.A1vel_de_controle"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "faça"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "repita %1 vezes"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Faça algumas instruções várias vezes."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repita até"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repita enquanto"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Enquanto um valor for falso, então faça algumas instruções."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Enquanto um valor for verdadeiro, então faça algumas instruções."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Deletar todos os blocos %1?"; +Blockly.Msg.DELETE_BLOCK = "Deletar bloco"; +Blockly.Msg.DELETE_VARIABLE = "Deletar a variável '%1'"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Deletar %1 usos da variável '%2'?"; +Blockly.Msg.DELETE_X_BLOCKS = "Deletar %1 blocos"; +Blockly.Msg.DISABLE_BLOCK = "Desabilitar bloco"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplicar"; +Blockly.Msg.ENABLE_BLOCK = "Habilitar bloco"; +Blockly.Msg.EXPAND_ALL = "Expandir blocos"; +Blockly.Msg.EXPAND_BLOCK = "Expandir bloco"; +Blockly.Msg.EXTERNAL_INPUTS = "Entradas externas"; +Blockly.Msg.HELP = "Ajuda"; +Blockly.Msg.INLINE_INPUTS = "Entradas incorporadas"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "criar lista vazia"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Retorna uma lista, de tamanho 0, contendo nenhum registro"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Acrescenta, remove ou reordena seções para reconfigurar este bloco de lista."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "criar lista com"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Acrescenta um item à lista."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Cria uma lista com a quantidade de itens informada."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "primeiro"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "nº a partir do final"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "nº"; +Blockly.Msg.LISTS_GET_INDEX_GET = "obter"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "obter e remover"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "último"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aleatório"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "remover"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Retorna o primeiro item em uma lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Retorna o item da lista na posição especificada."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Retorna o último item em uma lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Retorna um item aleatório de uma lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Remove e retorna o primeiro item de uma lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Remove e retorna o item na posição especificada em uma lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Remove e retorna o último item de uma lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Remove e retorna um item aleatório de uma lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Remove o primeiro item de uma lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Remove o item na posição especificada em uma lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Remove o último item de uma lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Remove um item aleatório de uma lista."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "até nº a partir do final"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "até nº"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "até último"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "obtém sublista a partir do primeiro"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "obtém sublista de nº a partir do final"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "obtém sublista de nº"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Cria uma cópia da porção especificada de uma lista."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 é o último item."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 é o primeiro item."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "encontre a primeira ocorrência do item"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "encontre a última ocorrência do item"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna o índice da primeira/última ocorrência do item na lista. Retorna %1 se o item não for encontrado."; +Blockly.Msg.LISTS_INLIST = "na lista"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 é vazia"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Retorna ao verdadeiro se a lista estiver vazia."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "tamanho de %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Retorna o tamanho de uma lista."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "criar lista com item %1 repetido %2 vezes"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Cria uma lista consistindo no valor informado repetido o número de vezes especificado."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "como"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "inserir em"; +Blockly.Msg.LISTS_SET_INDEX_SET = "definir"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Insere o item no início de uma lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Insere o item na posição especificada em uma lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Insere o item no final de uma lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Insere o item em uma posição qualquer de uma lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Define o primeiro item de uma lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Define o item da posição especificada de uma lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Define o último item de uma lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Define um item aleatório de uma lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascendente"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descendente"; +Blockly.Msg.LISTS_SORT_TITLE = "ordenar %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Ordenar uma cópia de uma lista."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alfabético, ignorar maiúscula/minúscula"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numérico"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabético"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Fazer uma lista a partir do texto"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "fazer um texto a partir da lista"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Juntar uma lista de textos em um único texto, separado por um delimitador."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Dividir o texto em uma lista de textos, separando-o em cada delimitador."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "com delimitador"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falso"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Retorna verdadeiro ou falso."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "verdadeiro"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://pt.wikipedia.org/wiki/Inequa%C3%A7%C3%A3o"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Retorna verdadeiro se ambas as entradas forem iguais."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Retorna verdadeiro se a primeira entrada for maior que a segunda entrada."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Retorna verdadeiro se a primeira entrada for maior ou igual à segunda entrada."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Retorna verdadeiro se a primeira entrada for menor que a segunda entrada."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Retorna verdadeiro se a primeira entrada for menor ou igual à segunda entrada."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Retorna verdadeiro se ambas as entradas forem diferentes."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "não %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Retorna verdadeiro se a entrada for falsa. Retorna falsa se a entrada for verdadeira."; +Blockly.Msg.LOGIC_NULL = "nulo"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Retorna nulo."; +Blockly.Msg.LOGIC_OPERATION_AND = "e"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "ou"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Retorna verdadeiro se ambas as entradas forem verdadeiras."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Retorna verdadeiro se uma das estradas for verdadeira."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "teste"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "se falso"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "se verdadeiro"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Avalia a condição em \"teste\". Se a condição for verdadeira retorna o valor \"se verdadeiro\", senão retorna o valor \"se falso\"."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://pt.wikipedia.org/wiki/Aritm%C3%A9tica"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Retorna a soma dos dois números."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Retorna o quociente da divisão dos dois números."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Retorna a diferença entre os dois números."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Retorna o produto dos dois números."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Retorna o primeiro número elevado à potência do segundo número."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://pt.wikipedia.org/wiki/Adi%C3%A7%C3%A3o"; +Blockly.Msg.MATH_CHANGE_TITLE = "alterar %1 por %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Soma um número à variável \"%1\"."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://pt.wikipedia.org/wiki/Anexo:Lista_de_constantes_matem%C3%A1ticas"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Retorna uma das constantes comuns: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ou ∞ (infinito)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "restringe %1 inferior %2 superior %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Restringe um número entre os limites especificados (inclusivo)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "é divisível por"; +Blockly.Msg.MATH_IS_EVEN = "é par"; +Blockly.Msg.MATH_IS_NEGATIVE = "é negativo"; +Blockly.Msg.MATH_IS_ODD = "é ímpar"; +Blockly.Msg.MATH_IS_POSITIVE = "é positivo"; +Blockly.Msg.MATH_IS_PRIME = "é primo"; +Blockly.Msg.MATH_IS_TOOLTIP = "Verifica se um número é par, ímpar, inteiro, positivo, negativo, ou se é divisível por outro número. Retorna verdadeiro ou falso."; +Blockly.Msg.MATH_IS_WHOLE = "é inteiro"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://pt.wikipedia.org/wiki/Opera%C3%A7%C3%A3o_m%C3%B3dulo"; +Blockly.Msg.MATH_MODULO_TITLE = "resto da divisão de %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Retorna o resto da divisão de dois números."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://pt.wikipedia.org/wiki/N%C3%BAmero"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Um número."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "média da lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maior da lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana da lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "menor da lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "moda da lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "item aleatório da lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "desvio padrão da lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "soma de uma lista"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Retorna a média aritmética dos números da lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Retorna o maior número da lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Retorna a mediana dos números da lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Retorna o menor número da lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Retorna uma lista do(s) item(ns) mais comum(ns) da lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Retorna um elemento aleatório da lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Retorna o desvio padrão dos números da lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Retorna a soma de todos os números na lista."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://pt.wikipedia.org/wiki/Gerador_de_n%C3%BAmeros_pseudoaleat%C3%B3rios"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "fração aleatória"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Retorna uma fração aleatória entre 0.0 (inclusivo) e 1.0 (exclusivo)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://pt.wikipedia.org/wiki/Gerador_de_n%C3%BAmeros_pseudoaleat%C3%B3rios"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "inteiro aleatório entre %1 e %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Retorna um número inteiro entre os dois limites informados, inclusivo."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://pt.wikipedia.org/wiki/Arredondamento"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arredonda"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arredonda para baixo"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arredonda para cima"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Arredonda um número para cima ou para baixo."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://pt.wikipedia.org/wiki/Raiz_quadrada"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absoluto"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "raiz quadrada"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Retorna o valor absoluto de um número."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Retorna o número e elevado à potência de um número."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Retorna o logaritmo natural de um número."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Retorna o logaritmo em base 10 de um número."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Retorna o oposto de um número."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Retorna 10 elevado à potência de um número."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Retorna a raiz quadrada de um número."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://pt.wikipedia.org/wiki/Fun%C3%A7%C3%A3o_trigonom%C3%A9trica"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Retorna o arco cosseno de um número."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Retorna o arco seno de um número."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Retorna o arco tangente de um número."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Retorna o cosseno de um grau (não radiano)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Retorna o seno de um grau (não radiano)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Retorna a tangente de um grau (não radiano)."; +Blockly.Msg.NEW_VARIABLE = "Criar variável..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nome da nova variável:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "permitir declarações"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "com:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://pt.wikipedia.org/wiki/Sub-rotina"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Executa a função definida pelo usuário \"%1\"."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://pt.wikipedia.org/wiki/Sub-rotina"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Executa a função definida pelo usuário \"%1\" e usa seu retorno."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "com:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Criar \"%1\""; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Descreva esta função..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "faça algo"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "para"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Cria uma função que não tem retorno."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "retorna"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Cria uma função que possui um valor de retorno."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Atenção: Esta função tem parâmetros duplicados."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Destacar definição da função"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Se um valor é verdadeiro, então retorna um valor."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Atenção: Este bloco só pode ser utilizado dentro da definição de uma função."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nome da entrada:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Adiciona uma entrada para esta função"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entradas"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Adiciona, remove, ou reordena as entradas para esta função."; +Blockly.Msg.REDO = "Refazer"; +Blockly.Msg.REMOVE_COMMENT = "Remover comentário"; +Blockly.Msg.RENAME_VARIABLE = "Renomear variável..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Renomear todas as variáveis '%1' para:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "acrescentar texto"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "para"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Acrescentar um pedaço de texto à variável \"%1\"."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "para minúsculas"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "para Nomes Próprios"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "para MAIÚSCULAS"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Retorna uma cópia do texto em um formato diferente."; +Blockly.Msg.TEXT_CHARAT_FIRST = "obter primeira letra"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "obter letra # a partir do final"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "obter letra nº"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "no texto"; +Blockly.Msg.TEXT_CHARAT_LAST = "obter última letra"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "obter letra aleatória"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Retorna a letra na posição especificada."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Acrescentar um item ao texto."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "unir"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Acrescenta, remove ou reordena seções para reconfigurar este bloco de texto."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "até letra nº a partir do final"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "até letra nº"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "até última letra"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "no texto"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "obter trecho de primeira letra"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "obter trecho de letra nº a partir do final"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "obter trecho de letra nº"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Retorna o trecho de texto especificado."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "no texto"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "encontre a primeira ocorrência do item"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "encontre a última ocorrência do texto"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna %1 se o texto não for encontrado."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 é vazio"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Retorna verdadeiro se o texto fornecido for vazio."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "criar texto com"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Criar um pedaço de texto juntando qualquer número de itens."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "tamanho de %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Retorna o número de letras (incluindo espaços) no texto fornecido."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "imprime %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Imprime o texto, número ou valor especificado."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Pede ao usuário um número."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Pede ao usuário um texto."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Pede um número com uma mensagem"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Pede um texto com uma mensagem"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://pt.wikipedia.org/wiki/Cadeia_de_caracteres"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Uma letra, palavra ou linha de texto."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "remover espaços de ambos os lados de"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "remover espaços à esquerda de"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "remover espaços à direita de"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Retorna uma cópia do texto com os espaços removidos de uma ou ambas extremidades."; +Blockly.Msg.TODAY = "Hoje"; +Blockly.Msg.UNDO = "Desfazer"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Criar \"definir %1\""; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Retorna o valor desta variável."; +Blockly.Msg.VARIABLES_SET = "definir %1 para %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Criar \"obter %1\""; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Define esta variável para o valor da entrada."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variável chamada '%1' já existe."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/pt.js b/src/opsoro/server/static/js/blockly/msg/js/pt.js similarity index 85% rename from src/opsoro/apps/visual_programming/static/blockly/msg/js/pt.js rename to src/opsoro/server/static/js/blockly/msg/js/pt.js index 8f2e84c..b0bb52f 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/pt.js +++ b/src/opsoro/server/static/js/blockly/msg/js/pt.js @@ -7,23 +7,21 @@ goog.provide('Blockly.Msg.pt'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "Adicionar Comentário"; -Blockly.Msg.AUTH = "Por favor autorize esta aplicação para permitir que o seu trabalho seja gravado e que o possa partilhar."; Blockly.Msg.CHANGE_VALUE_TITLE = "Alterar valor:"; -Blockly.Msg.CHAT = "Converse com o seu colaborador, ao digitar nesta caixa!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated -Blockly.Msg.COLLAPSE_ALL = "Recolher Blocos"; -Blockly.Msg.COLLAPSE_BLOCK = "Colapsar Bloco"; +Blockly.Msg.CLEAN_UP = "Limpar Blocos"; +Blockly.Msg.COLLAPSE_ALL = "Ocultar Blocos"; +Blockly.Msg.COLLAPSE_BLOCK = "Ocultar Bloco"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "cor 1"; Blockly.Msg.COLOUR_BLEND_COLOUR2 = "cor 2"; Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; Blockly.Msg.COLOUR_BLEND_RATIO = "proporção"; Blockly.Msg.COLOUR_BLEND_TITLE = "misturar"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mistura duas cores dada uma proporção (0.0 - 1.0)."; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mistura duas cores com a proporção indicada (0.0 - 1.0)."; Blockly.Msg.COLOUR_PICKER_HELPURL = "http://pt.wikipedia.org/wiki/Cor"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Escolhe uma cor da paleta de cores."; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Escolha uma cor da paleta de cores."; Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated Blockly.Msg.COLOUR_RANDOM_TITLE = "cor aleatória"; -Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Escolher cor de forma aleatória."; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Escolha uma cor aleatoriamente."; Blockly.Msg.COLOUR_RGB_BLUE = "azul"; Blockly.Msg.COLOUR_RGB_GREEN = "verde"; Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; @@ -34,7 +32,7 @@ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockl Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "sair do ciclo"; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continuar com a próxima iteração do ciclo"; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Sair do ciclo que está contido."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Ignora o resto deste ciclo e continua na próxima iteração."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Ignorar o resto deste ciclo, e continuar com a próxima iteração."; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Atenção: Este bloco só pode ser usado dentro de um ciclo."; Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated Blockly.Msg.CONTROLS_FOREACH_TITLE = "para cada item %1 na lista %2"; @@ -55,23 +53,26 @@ Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Se o primeiro valor é verdadeiro, então r Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Se o primeiro valor é verdadeiro, então realize o primeiro bloco de instruções. Senão, se o segundo valor é verdadeiro, realize o segundo bloco de instruções. Se nenhum dos blocos for verdadeiro, realize o último bloco de instruções."; Blockly.Msg.CONTROLS_REPEAT_HELPURL = "http://pt.wikipedia.org/wiki/Estrutura_de_repeti%C3%A7%C3%A3o#Repeti.C3.A7.C3.A3o_com_vari.C3.A1vel_de_controle"; Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "faça"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "repita %1 vez"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "repetir %1 vez"; Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Faça algumas instruções várias vezes."; Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repita até"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repita enquanto"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repetir até"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repetir enquanto"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Enquanto um valor for falso, então faça algumas instruções."; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Enquanto um valor for verdadeiro, então faça algumas instruções."; -Blockly.Msg.DELETE_BLOCK = "Remover Bloco"; -Blockly.Msg.DELETE_X_BLOCKS = "Remover %1 Blocos"; -Blockly.Msg.DISABLE_BLOCK = "Desabilitar Bloco"; +Blockly.Msg.DELETE_ALL_BLOCKS = "Eliminar todos os %1 blocos?"; +Blockly.Msg.DELETE_BLOCK = "Eliminar Bloco"; +Blockly.Msg.DELETE_VARIABLE = "Eliminar a variável '%1'"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Eliminar %1 utilizações da variável '%2'?"; +Blockly.Msg.DELETE_X_BLOCKS = "Eliminar %1 Blocos"; +Blockly.Msg.DISABLE_BLOCK = "Desativar Bloco"; Blockly.Msg.DUPLICATE_BLOCK = "Duplicar"; -Blockly.Msg.ENABLE_BLOCK = "Habilitar Bloco"; +Blockly.Msg.ENABLE_BLOCK = "Ativar Bloco"; Blockly.Msg.EXPAND_ALL = "Expandir Blocos"; Blockly.Msg.EXPAND_BLOCK = "Expandir Bloco"; -Blockly.Msg.EXTERNAL_INPUTS = "Entradas externas"; +Blockly.Msg.EXTERNAL_INPUTS = "Entradas Externas"; Blockly.Msg.HELP = "Ajuda"; -Blockly.Msg.INLINE_INPUTS = "Entradas Internas"; +Blockly.Msg.INLINE_INPUTS = "Entradas Em Linhas"; Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "criar lista vazia"; Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Retorna uma lista, de tamanho 0, contendo nenhum registo"; @@ -91,18 +92,15 @@ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aleatório"; Blockly.Msg.LISTS_GET_INDEX_REMOVE = "remover"; Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Retorna o primeiro item de uma lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Retorna o item da lista na posição especificada. #1 é o último item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Retorna o item na posição especificada da lista . #1 é o primeiro item."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Retorna o item na posição especificada da lista."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Retorna o último item de uma lista."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Retorna um item aleatório de uma lista."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Remove e retorna o primeiro item de uma lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Remove e retorna o item na posição especificada de uma lista. #1 é o último item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Remove e retorna o item na posição especificada de uma lista. #1 é o primeiro item."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Remove e retorna o item na posição especificada de uma lista."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Remove e retorna o último item de uma lista."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Remove e retorna um item aleatório de uma lista."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Remove o primeiro item de uma lista."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Remove o item na posição especificada de uma lista. #1 é o ultimo item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Remove o item de uma posição especifica da lista. #1 é o primeiro item."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Remove o item de uma posição especifica da lista."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Remove o último item de uma lista."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Remove um item aleatório de uma lista."; Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "até #, a partir do final"; @@ -114,10 +112,12 @@ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "obtem sublista de # a partir do Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "obtem sublista de #"; Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Cria uma cópia da porção especificada de uma lista."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 é o último item."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 é o primeiro item."; Blockly.Msg.LISTS_INDEX_OF_FIRST = "encontre a primeira ocorrência do item"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "encontre a última ocorrência do item"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do item na lista. Retorna 0 se o texto não for encontrado."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do item na lista. Retorna %1 se o item não for encontrado."; Blockly.Msg.LISTS_INLIST = "na lista"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 está vazia"; @@ -128,20 +128,29 @@ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Retorna o tamanho de uma lista."; Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_REPEAT_TITLE = "criar lista com o item %1 repetido %2 vezes"; Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Cria uma lista constituída por um dado valor repetido o número de vezes especificado."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "como"; Blockly.Msg.LISTS_SET_INDEX_INSERT = "inserir em"; Blockly.Msg.LISTS_SET_INDEX_SET = "definir"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Insere o item no início da lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Insere o item numa posição especificada de uma lista. #1 é o último item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Insere o item numa posição especificada numa lista. #1 é o primeiro item."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Insere o item numa posição especificada numa lista."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Insere o item no final da lista."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Insere o item numa posição aleatória de uma lista."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Define o primeiro item de uma lista."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Define o item na posição especificada de uma lista. #1 é o último item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Define o item na posição especificada de uma lista. #1 é o primeiro item."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Define o item na posição especificada de uma lista."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Define o último item de uma lista."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Define um item aleatório de uma lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascendente"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descendente"; +Blockly.Msg.LISTS_SORT_TITLE = "ordenar %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Ordenar uma cópia de uma lista."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alfabética, ignorar maiúsculas/minúsculas"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numérica"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabética"; Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "fazer lista a partir de texto"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "fazer texto a partir da lista"; @@ -187,7 +196,7 @@ Blockly.Msg.MATH_CHANGE_TITLE = "alterar %1 por %2"; Blockly.Msg.MATH_CHANGE_TOOLTIP = "Soma um número à variável \"%1\"."; Blockly.Msg.MATH_CONSTANT_HELPURL = "http://pt.wikipedia.org/wiki/Anexo:Lista_de_constantes_matem%C3%A1ticas"; Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Retorna uma das constantes comuns: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ou ∞ (infinito)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "restringe %1 inferior %2 superior %3"; Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Restringe um número entre os limites especificados (inclusive)."; Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; @@ -258,19 +267,18 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Retorna o arco tangente de um número."; Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Retorna o cosseno de um grau (não radiano)."; Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Retorna o seno de um grau (não radiano)."; Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Retorna a tangente de um grau (não radiano)."; -Blockly.Msg.ME = "Eu"; -Blockly.Msg.NEW_VARIABLE = "Nova variável..."; +Blockly.Msg.NEW_VARIABLE = "Criar variável…"; Blockly.Msg.NEW_VARIABLE_TITLE = "Nome da nova variável:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "permitir declarações"; Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "com:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "http://pt.wikipedia.org/wiki/Sub-rotina"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://pt.wikipedia.org/wiki/Sub-rotina"; Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Executa a função \"%1\"."; -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "http://pt.wikipedia.org/wiki/Sub-rotina"; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://pt.wikipedia.org/wiki/Sub-rotina"; Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Executa a função \"%1\" e usa o seu retorno."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "com:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Criar \"%1\""; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Descreva esta função..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "faz algo"; @@ -281,12 +289,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "retorna"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Cria uma função que possui um valor de retorno."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Atenção: Esta função tem parâmetros duplicados."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Destacar definição da função"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "se o valor é verdadeiro, então retorna um segundo valor."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Atenção: Este bloco só pode ser utilizado dentro da definição de uma função."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nome da entrada:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Adicionar uma entrada para a função."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entradas"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Adicionar, remover ou reordenar as entradas para esta função."; +Blockly.Msg.REDO = "Refazer"; Blockly.Msg.REMOVE_COMMENT = "Remover Comentário"; Blockly.Msg.RENAME_VARIABLE = "Renomear variável..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Renomear todas as variáveis '%1' para:"; @@ -308,6 +318,9 @@ Blockly.Msg.TEXT_CHARAT_LAST = "obter última letra"; Blockly.Msg.TEXT_CHARAT_RANDOM = "obter letra aleatória"; Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Retorna a letra na posição especificada."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Acrescentar um item ao texto."; Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "unir"; Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Acrescenta, remove ou reordena seções para reconfigurar este bloco de texto."; @@ -326,7 +339,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "no texto"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "primeira ocorrência do texto"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "última ocorrência do texto"; Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna 0 se o texto não for encontrado."; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna %1 se o texto não for encontrado."; Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 está vazio"; Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Retorna verdadeiro se o texto fornecido estiver vazio."; @@ -344,6 +357,12 @@ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Pede ao utilizador um número."; Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Pede ao utilizador um texto."; Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "pede um número com a mensagem"; Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Pede um texto com a mensagem"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated Blockly.Msg.TEXT_TEXT_HELPURL = "http://pt.wikipedia.org/wiki/Cadeia_de_caracteres"; Blockly.Msg.TEXT_TEXT_TOOLTIP = "Uma letra, palavra ou linha de texto."; Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated @@ -352,6 +371,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "remover espaços à esquerda de"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "remover espaços à direita"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Retorna uma cópia do texto com os espaços removidos de uma ou ambas as extremidades."; Blockly.Msg.TODAY = "Hoje"; +Blockly.Msg.UNDO = "Anular"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Criar \"definir %1\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated @@ -360,13 +380,13 @@ Blockly.Msg.VARIABLES_SET = "definir %1 para %2"; Blockly.Msg.VARIABLES_SET_CREATE_GET = "Criar \"obter %1\""; Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "Define esta variável para o valor inserido."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Já existe uma variável com o nome de '%1'."; Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; @@ -374,9 +394,19 @@ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/ro.js b/src/opsoro/server/static/js/blockly/msg/js/ro.js new file mode 100644 index 0000000..93211e6 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/ro.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.ro'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Adaugă un comentariu"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Schimbaţi valoarea:"; +Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.COLLAPSE_ALL = "Restrange blocurile"; +Blockly.Msg.COLLAPSE_BLOCK = "Restrange blocul"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "culoare 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "culoare 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "Raport"; +Blockly.Msg.COLOUR_BLEND_TITLE = "amestec"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Amestecă două culori cu un raport dat (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ro.wikipedia.org/wiki/Culoare"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Alege o culoare din paleta de culori."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "culoare aleatorie"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Alege o culoare la întâmplare."; +Blockly.Msg.COLOUR_RGB_BLUE = "albastru"; +Blockly.Msg.COLOUR_RGB_GREEN = "verde"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "roşu"; +Blockly.Msg.COLOUR_RGB_TITLE = "colorează cu"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Creează o culoare cu suma specificată de roşu, verde şi albastru. Toate valorile trebuie să fie între 0 şi 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "ieşi din bucla"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continuă cu următoarea iterație a buclei"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Ieși din bucla care conţine."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Sari peste restul aceastei bucle, şi continuă cu urmatoarea iteratie."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Avertisment: Acest bloc pote fi utilizat numai în interiorul unei bucle."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "pentru fiecare element %1 în listă %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Pentru fiecare element din listă, setaţi variabila '%1' ca valoarea elementului, şi apoi faceţi unele declaraţii."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "numără cu %1 de la %2 la %3 prin %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Cu variablia \"%1\" ia o valoare din numărul început la numărul final, numara in intervalul specificat, apoi face blocurile specificate."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Adăugaţi o condiţie in blocul if."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Adauga o stare finala, cuprinde toata conditia din blocul if."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Adaugă, elimină sau reordonează secţiuni pentru a reconfigura acest bloc if."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "altfel"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "altfel dacă"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "dacă"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Dacă o valoare este adevărată, atunci fa unele declaraţii."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Dacă o valoare este adevărat, atunci face primul bloc de declaraţii. Altfel, face al doilea bloc de declaraţii."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Dacă prima valoare este adevărat, atunci face primul bloc de declaraţii. Altfel, dacă a doua valoare este adevărat, face al doilea bloc de declaraţii."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Dacă prima valoare este adevărat, atunci face primul bloc de declaraţii. Altfel, dacă a doua valoare este adevărat, face al doilea bloc de declaraţii. În cazul în care niciuna din valorilor nu este adevărat, face ultimul bloc de declaraţii."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "fă"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "repetă de %1 ori"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Face unele afirmaţii de mai multe ori."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "Repetaţi până când"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repetă în timp ce"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "În timp ce o valoare este adevărat, atunci face unele declaraţii."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "În timp ce o valoare este adevărat, atunci face unele declaraţii."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Ștergi toate cele %1 (de) blocuri?"; +Blockly.Msg.DELETE_BLOCK = "Șterge Bloc"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "Ștergeți %1 Blocuri"; +Blockly.Msg.DISABLE_BLOCK = "Dezactivaţi bloc"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplicati"; +Blockly.Msg.ENABLE_BLOCK = "Permite bloc"; +Blockly.Msg.EXPAND_ALL = "Extinde blocuri"; +Blockly.Msg.EXPAND_BLOCK = "Extinde bloc"; +Blockly.Msg.EXTERNAL_INPUTS = "Intrări externe"; +Blockly.Msg.HELP = "Ajutor"; +Blockly.Msg.INLINE_INPUTS = "Intrări în linie"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "creează listă goală"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returnează o listă, de lungime 0, care nu conţine înregistrări de date"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "listă"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Adaugă, elimină sau reordonează secţiuni ca să reconfiguraţi aceste blocuri de listă."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "creează listă cu"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Adăugaţi un element la listă."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Creaţi o listă cu orice număr de elemente."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "primul"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# de la sfârșit"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "obţine"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "obţine şi elimină"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "ultimul"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "aleator"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "elimină"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returnează primul element dintr-o listă."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returneaza elementul la poziţia specificată într-o listă."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returnează ultimul element într-o listă."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returneaza un element aleatoriu într-o listă."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Elimină şi returnează primul element într-o listă."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Elimină şi returneaza elementul la poziţia specificată într-o listă."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Elimină şi returnează ultimul element într-o listă."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Elimină şi returnează un element aleatoriu într-o listă."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Elimină primul element într-o listă."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Elimină elementul la poziţia specificată într-o listă."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Elimină ultimul element într-o listă."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Elimină un element aleatoriu într-o listă."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "la # de la sfarsit"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "la #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "la ultima"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "obţine sub-lista de la primul"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "obţine sub-lista de la # de la sfârşitul"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "obţine sub-lista de la #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creează o copie a porţiunii specificate dintr-o listă."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 este ultimul element."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 este primul element."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "Găseşte prima apariţie a elementului"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "găseşte ultima apariţie a elementului"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Revine la indexul de la prima/ultima apariție a elementului din listă. Returnează %1 dacă elementul nu este găsit."; +Blockly.Msg.LISTS_INLIST = "în listă"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 este gol"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returnează adevărat dacă lista este goală."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "lungime de %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returnează lungimea unei liste."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "creaza lista cu %1 elemente repetate de %2 ori"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creează o listă alcătuită dintr-o anumită valoare repetată de numărul specificat de ori."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "ca"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "introduceţi la"; +Blockly.Msg.LISTS_SET_INDEX_SET = "seteaza"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserează elementul la începutul unei liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserează elementul la poziţia specificată într-o listă."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Adăugă elementul la sfârşitul unei liste."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserează elementul aleatoriu într-o listă."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Setează primul element într-o listă."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Setează elementul la poziţia specificată într-o listă."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Setează ultimul element într-o listă."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setează un element aleator într-o listă."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "convertește textul în listă"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "convertește lista în text"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Concatenează o listă de texte (alternate cu separatorul) într-un text unic"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Împarte textul într-o listă de texte, despărțite prin fiecare separator"; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "cu separatorul"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "fals"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returnează adevărat sau fals."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "adevărat"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Returnează adevărat dacă ambele intrări sunt egale."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Returnează adevărat dacă prima intrare este mai mare decât a doua intrare."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Returnează adevărat dacă prima intrare este mai mare sau egală cu a doua intrare."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Returnează adevărat dacă prima intrare este mai mică decât a doua intrare."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Returnează adevărat dacă prima intrare este mai mică sau egală cu a doua intrare."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Returnează adevărat daca cele două intrări nu sunt egale."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "non %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returnează adevărat dacă intrarea este falsă. Returnează fals dacă intrarea este adevărată."; +Blockly.Msg.LOGIC_NULL = "nul"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "returnează nul."; +Blockly.Msg.LOGIC_OPERATION_AND = "şi"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "sau"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Returnează adevărat daca ambele intrări sunt adevărate."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Returnează adevărat dacă cel puţin una din intrări este adevărată."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "dacă este fals"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "dacă este adevărat"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Verifică condiţia din \"test\". Dacă condiţia este adevărată, returnează valoarea \"în cazul în care adevărat\"; în caz contrar întoarce valoarea \"în cazul în care e fals\"."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ro.wikipedia.org/wiki/Aritmetic%C4%83"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Returnează suma a două numere."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Returnează câtul celor două numere."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Returneaza diferenţa dintre cele două numere."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Returnează produsul celor două numere."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Returneaza numărul rezultat prin ridicarea primului număr la puterea celui de-al doilea."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "schimbă %1 de %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Adaugă un număr variabilei '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://ro.wikipedia.org/wiki/Constant%C4%83_matematic%C4%83"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Întoarcă una din constantele comune: π (3.141...), e (2.718...), φ (1,618...), sqrt(2) (1.414...), sqrt(½) (0.707...) sau ∞ (infinitate)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrânge %1 redus %2 ridicat %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrânge un număr să fie între limitele specificate (inclusiv)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "este divizibil cu"; +Blockly.Msg.MATH_IS_EVEN = "este par"; +Blockly.Msg.MATH_IS_NEGATIVE = "este negativ"; +Blockly.Msg.MATH_IS_ODD = "este impar"; +Blockly.Msg.MATH_IS_POSITIVE = "este pozitiv"; +Blockly.Msg.MATH_IS_PRIME = "este prim"; +Blockly.Msg.MATH_IS_TOOLTIP = "Verifică dacă un număr este un par, impar, prim, întreg, pozitiv, negativ, sau dacă este divizibil cu un anumit număr. Returnează true sau false."; +Blockly.Msg.MATH_IS_WHOLE = "este întreg"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "restul la %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Întoarce restul din împărţirea celor două numere."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un număr."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "media listei"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maximul listei"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "media listei"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimul listei"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "moduri de listă"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "element aleatoriu din lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "deviația standard a listei"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "suma listei"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Întoarce media (aritmetică) a valorilor numerice în listă."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Întoarce cel mai mare număr din listă."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Întoarce numărul median în listă."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Returnează cel mai mic număr din listă."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Returnează o listă cu cel(e) mai frecvent(e) element(e) din listă."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Returnează un element aleatoriu din listă."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Întoarce deviația standard a listei."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Returnează suma tuturor numerelor din lista."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "fracții aleatorii"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Returnează o fracţie aleatoare între 0.0 (inclusiv) si 1.0 (exclusiv)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "un număr întreg aleator de la %1 la %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Returnează un număr întreg aleator aflat între cele două limite specificate, inclusiv."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "rotund"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "rotunjit"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "rotunjește în sus"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Rotunjirea unui număr în sus sau în jos."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolută"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "rădăcina pătrată"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Returnează valoarea absolută a unui număr."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Returnează e la puterea unui număr."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Întoarce logaritmul natural al unui număr."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Returnează logaritmul în baza 10 a unui număr."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Returnează negaţia unui număr."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Returnează 10 la puterea unui număr."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Returnează rădăcina pătrată a unui număr."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "arccos"; +Blockly.Msg.MATH_TRIG_ASIN = "arcsin"; +Blockly.Msg.MATH_TRIG_ATAN = "arctg"; +Blockly.Msg.MATH_TRIG_COS = "cos"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://ko.wikipedia.org/wiki/삼각함수"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; +Blockly.Msg.MATH_TRIG_TAN = "tg"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Returnează arccosinusul unui număr."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Returnează arcsinusul unui număr."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Returnează arctangenta unui număr."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Întoarce cosinusul unui grad (nu radianul)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Întoarce cosinusul unui grad (nu radianul)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Întoarce tangenta unui grad (nu radianul)."; +Blockly.Msg.NEW_VARIABLE = "Variabilă nouă..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Noul nume de variabilă:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "permite declarațiile"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "cu:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Executați funcția '%1 'definită de utilizator."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Executați funcția '%1 'definită de utilizator şi folosiţi producţia sa."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "cu:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Creaţi '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "fă ceva"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "la"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crează o funcţie cu nici o ieşire."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://ko.wikipedia.org/wiki/함수_(프로그래밍)"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "returnează"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creează o funcţie cu o ieşire."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Atenţie: Această funcţie are parametri duplicaţi."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Evidenţiază definiţia funcţiei"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Dacă o valoare este adevărată, atunci returnează valoarea a doua."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Avertisment: Acest bloc poate fi utilizat numai în definiţia unei funcţii."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nume de intrare:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Adaugă un parametru de intrare pentru funcție."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "intrări"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Adăugă, șterge sau reordonează parametrii de intrare ai acestei funcții."; +Blockly.Msg.REDO = "Redo"; // untranslated +Blockly.Msg.REMOVE_COMMENT = "Elimină comentariu"; +Blockly.Msg.RENAME_VARIABLE = "Redenumirea variabilei..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Redenumeşte toate variabilele '%1' în:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "Adăugaţi text"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "la"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Adăugaţi text la variabila '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "la litere mici"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "către Titlul de caz"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "la MAJUSCULE"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Întoarce o copie a textului într-un caz diferit."; +Blockly.Msg.TEXT_CHARAT_FIRST = "obţine prima litera"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "obţine litera # de la sfârșit"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "obtine litera #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "în text"; +Blockly.Msg.TEXT_CHARAT_LAST = "obţine o litera oarecare"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "obtine o litera oarecare"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returnează litera la poziția specificată."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Adaugă un element în text."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "alăturaţi-vă"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Adaugă, elimină sau reordonează secțiuni ca să reconfigureze blocul text."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "la litera # de la sfarsit"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "la litera #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "la ultima literă"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "în text"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "obţine un subșir de la prima literă"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "obține un subșir de la litera # de la sfârșit"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "obține subșir de la litera #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returnează o anumită parte din text."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "în text"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "găseşte prima apariţie a textului"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "găseşte ultima apariţie a textului"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returnează indicele primei/ultimei apariţii din primul text în al doilea text. Returnează %1 dacă textul nu este găsit."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 este gol"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returnează adevărat dacă textul furnizat este gol."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "crează text cu"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Creaţi o bucată de text prin unirea oricărui număr de elemente."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "lungime de %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returnează numărul de litere (inclusiv spaţiile) în textul furnizat."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "imprimare %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Afișează textul specificat, numărul sau altă valoare."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Solicită utilizatorul pentru un număr."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Solicită utilizatorul pentru text."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "solicită pentru număr cu mesaj"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "solicită pentru text cu mesaj"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "O literă, cuvânt sau linie de text."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "taie spațiile de pe ambele părți ale"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "tăiaţi spațiile din partea stângă a"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "taie spațiile din partea dreaptă a"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Returnează o copie a textului fără spațiile de la unul sau ambele capete."; +Blockly.Msg.TODAY = "Astăzi"; +Blockly.Msg.UNDO = "Undo"; // untranslated +Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crează 'set %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returnează valoarea acestei variabile."; +Blockly.Msg.VARIABLES_SET = "seteaza %1 la %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Crează 'get %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Setează această variabilă sa fie egală la intrare."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/ru.js b/src/opsoro/server/static/js/blockly/msg/js/ru.js new file mode 100644 index 0000000..345c290 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/ru.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.ru'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Добавить комментарий"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Измените значение:"; +Blockly.Msg.CLEAN_UP = "Убрать блоки"; +Blockly.Msg.COLLAPSE_ALL = "Свернуть блоки"; +Blockly.Msg.COLLAPSE_BLOCK = "Свернуть блок"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "цвет 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "цвет 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "доля цвета 1"; +Blockly.Msg.COLOUR_BLEND_TITLE = "смешать"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Смешивает два цвета в заданном соотношении (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://ru.wikipedia.org/wiki/Цвет"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Выберите цвет из палитры."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "случайный цвет"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Выбирает цвет случайным образом."; +Blockly.Msg.COLOUR_RGB_BLUE = "синего"; +Blockly.Msg.COLOUR_RGB_GREEN = "зелёного"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "красного"; +Blockly.Msg.COLOUR_RGB_TITLE = "цвет из"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Создаёт цвет с указанной пропорцией красного, зеленого и синего. Все значения должны быть между 0 и 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "выйти из цикла"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "перейти к следующему шагу цикла"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Прерывает этот цикл."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Пропускает остаток цикла и переходит к следующему шагу."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Предупреждение: этот блок может использоваться только внутри цикла."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "для каждого элемента %1 в списке %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Для каждого элемента в списке, присваивает переменной '%1' значение элемента и выполняет указанные команды."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "цикл по %1 от %2 до %3 с шагом %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Присваивает переменной '%1' значения от начального до конечного с заданным шагом и выполняет указанные команды."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Добавляет условие к блоку \"если\""; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Добавить заключительный подблок для случая, когда все условия ложны."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Добавьте, удалите, переставьте фрагменты для переделки блока \"если\"."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "иначе"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "иначе если"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "если"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Если условие истинно, выполняет команды."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Если условие истинно, выполняет первый блок команд. Иначе выполняется второй блок команд."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Если первое условие истинно, то выполняет первый блок команд. Иначе, если второе условие истинно, выполняет второй блок команд."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Если первое условие истинно, то выполняет первый блок команд. В противном случае, если второе условие истинно, выполняет второй блок команд. Если ни одно из условий не истинно, выполняет последний блок команд."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://ru.wikipedia.org/wiki/Цикл_(программирование)"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "выполнить"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "повторить %1 раз"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Выполняет некоторые команды несколько раз."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "повторять, пока не"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "повторять, пока"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Пока значение ложно, выполняет команды"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Пока значение истинно, выполняет команды."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Удалить все блоки (%1)?"; +Blockly.Msg.DELETE_BLOCK = "Удалить блок"; +Blockly.Msg.DELETE_VARIABLE = "Удалить переменную '%1'"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Удалить %1 использований переменной '%2'?"; +Blockly.Msg.DELETE_X_BLOCKS = "Удалить %1 блоков"; +Blockly.Msg.DISABLE_BLOCK = "Отключить блок"; +Blockly.Msg.DUPLICATE_BLOCK = "Скопировать"; +Blockly.Msg.ENABLE_BLOCK = "Включить блок"; +Blockly.Msg.EXPAND_ALL = "Развернуть блоки"; +Blockly.Msg.EXPAND_BLOCK = "Развернуть блок"; +Blockly.Msg.EXTERNAL_INPUTS = "Вставки снаружи"; +Blockly.Msg.HELP = "Справка"; +Blockly.Msg.INLINE_INPUTS = "Вставки внутри"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "создать пустой список"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Возвращает список длины 0, не содержащий данных"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "список"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Добавьте, удалите, переставьте элементы для переделки блока списка."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "создать список из"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Добавляет элемент к списку."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Создаёт список с любым числом элементов."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "первый"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "№ с конца"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "взять"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "взять и удалить"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "последний"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "произвольный"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "удалить"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Возвращает первый элемент списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Возвращает элемент в указанной позиции списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Возвращает последний элемент списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Возвращает случайный элемент списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Удаляет и возвращает первый элемент списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Удаляет и возвращает элемент в указанной позиции списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Удаляет и возвращает последний элемент списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Удаляет и возвращает случайный элемент списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Удаляет первый элемент списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Удаляет элемент в указанной позиции списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Удаляет последний элемент списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Удаляет случайный элемент списка."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "по № с конца"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "по №"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "по последний"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "взять подсписок с первого"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "взять подсписок с № с конца"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "взять подсписок с №"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Создаёт копию указанной части списка."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 - последний элемент."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 - первый элемент."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "найти первое вхождение элемента"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "найти последнее вхождение элемента"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Возвращает номер позиции первого/последнего вхождения элемента в списке. Возвращает %1, если элемент не найден."; +Blockly.Msg.LISTS_INLIST = "в списке"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 пуст"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Возвращает значение истина, если список пуст."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "длина %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Возвращает длину списка."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "создать список из элемента %1, повторяющегося %2 раз"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Создаёт список, состоящий из заданного числа копий элемента."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "изменить порядок на обратный %1"; +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Изменить порядок списка на обратный."; +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "="; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "вставить в"; +Blockly.Msg.LISTS_SET_INDEX_SET = "присвоить"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Вставляет элемент в начало списка."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Вставляет элемент в указанной позиции списка."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Добавляет элемент в конец списка."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Вставляет элемент в случайное место в списке."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Присваивает значение первому элементу списка."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Присваивает значение элементу в указанной позиции списка."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Присваивает значение последнему элементу списка."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Присваивает значение случайному элементу списка."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "по возрастанию"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "по убыванию"; +Blockly.Msg.LISTS_SORT_TITLE = "сортировать %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Сортировать копию списка."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "по алфавиту, без учёта регистра"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "числовая"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "по алфавиту"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "сделать список из текста"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "собрать текст из списка"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Соединяет сптсок текстов в один текст с разделителями."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Разбивает текст в список текстов, по разделителям."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "с разделителем"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "ложь"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Возвращает значение истина или ложь."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "истина"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://ru.wikipedia.org/wiki/Неравенство"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Возвращает положительное значение, если вводы равны."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Возвращает значение истина, если первая вставка больше второй."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Возвращает значение истина, если первая вставка больше или равна второй."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Возвращает положительное значение, если первый ввод меньше второго."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Возвращает значение истина, если первая вставка меньше или равна второй."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Возвращает положительное значение, если вводы не равны."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "не %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Возвращает значение истина, если вставка ложна. Возвращает значение ложь, если вставка истинна."; +Blockly.Msg.LOGIC_NULL = "ничто"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Возвращает ничто."; +Blockly.Msg.LOGIC_OPERATION_AND = "и"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "или"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Возвращает значение истина, если обе вставки истинны."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Возвращает значение истина, если хотя бы одна из вставок истинна."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "выбрать по"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://ru.wikipedia.org/wiki/Тернарная_условная_операция"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "если ложь"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "если истина"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Проверяет условие выбора. Если условие истинно, возвращает первое значение, в противном случае возвращает второе значение."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ru.wikipedia.org/wiki/Арифметика"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Возвращает сумму двух чисел."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Возвращает частное от деления первого числа на второе."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Возвращает разность двух чисел."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Возвращает произведение двух чисел."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Возвращает первое число, возведённое в степень второго числа."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://ru.wikipedia.org/wiki/%D0%98%D0%B4%D0%B8%D0%BE%D0%BC%D0%B0_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29#.D0.98.D0.BD.D0.BA.D1.80.D0.B5.D0.BC.D0.B5.D0.BD.D1.82"; +Blockly.Msg.MATH_CHANGE_TITLE = "увеличить %1 на %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Добавляет число к переменной '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://ru.wikipedia.org/wiki/Математическая_константа"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Возвращает одну из распространённых констант: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) или ∞ (бесконечность)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "ограничить %1 снизу %2 сверху %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Ограничивает число нижней и верхней границами (включительно)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "делится на"; +Blockly.Msg.MATH_IS_EVEN = "чётное"; +Blockly.Msg.MATH_IS_NEGATIVE = "отрицательное"; +Blockly.Msg.MATH_IS_ODD = "нечётное"; +Blockly.Msg.MATH_IS_POSITIVE = "положительное"; +Blockly.Msg.MATH_IS_PRIME = "простое"; +Blockly.Msg.MATH_IS_TOOLTIP = "Проверяет, является ли число чётным, нечётным, простым, целым, положительным, отрицательным или оно кратно определённому числу. Возвращает значение истина или ложь."; +Blockly.Msg.MATH_IS_WHOLE = "целое"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://ru.wikipedia.org/wiki/Деление_с_остатком"; +Blockly.Msg.MATH_MODULO_TITLE = "остаток от %1 : %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Возвращает остаток от деления двух чисел."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://ru.wikipedia.org/wiki/Число"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Число."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "среднее арифметическое списка"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "наибольшее в списке"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "медиана списка"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "наименьшее в списке"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "моды списка"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "случайный элемент списка"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "стандартное отклонение списка"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "сумма списка"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Возвращает среднее арифметическое списка."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Возвращает наибольшее число списка."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Возвращает медиану списка."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Возвращает наименьшее число списка."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Возвращает список наиболее часто встречающихся элементов списка."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Возвращает случайный элемент списка."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Возвращает стандартное отклонение списка."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Возвращает сумму всех чисел в списке."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "случайное число от 0 (включительно) до 1"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Возвращает случайное число от 0.0 (включительно) до 1.0."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "случайное целое число от %1 для %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Возвращает случайное число между двумя заданными пределами (включая и их)."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://ru.wikipedia.org/wiki/Округление"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "округлить"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "округлить к меньшему"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "округлить к большему"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Округляет число до большего или меньшего."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://ru.wikipedia.org/wiki/Квадратный_корень"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "модуль"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "квадратный корень"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Возвращает модуль числа"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Возвращает е в указанной степени."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Возвращает натуральный логарифм числа."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Возвращает десятичный логарифм числа."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Возвращает противоположное число."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Возвращает 10 в указанной степени."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Возвращает квадратный корень числа."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://ru.wikipedia.org/wiki/Тригонометрические_функции"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Возвращает арккосинус (в градусах)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Возвращает арксинус (в градусах)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Возвращает арктангенс (в градусах)"; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Возвращает косинус угла в градусах."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Возвращает синус угла в градусах."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Возвращает тангенс угла в градусах."; +Blockly.Msg.NEW_VARIABLE = "Создать переменную…"; +Blockly.Msg.NEW_VARIABLE_TITLE = "Имя новой переменной:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "разрешить операторы"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "с:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://ru.wikipedia.org/wiki/Подпрограмма"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Исполняет определённую пользователем процедуру '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://ru.wikipedia.org/wiki/Подпрограмма"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Исполняет определённую пользователем процедуру '%1' и возвращает вычисленное значение."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "с:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Создать вызов '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Опишите эту функцию…"; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "выполнить что-то"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "чтобы"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Создаёт процедуру, не возвращающую значение."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "вернуть"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Создаёт процедуру, возвращающую значение."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Предупреждение: эта функция имеет повторяющиеся параметры."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Выделить определение процедуры"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Если первое значение истинно, возвращает второе значение."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Предупреждение: Этот блок может использоваться только внутри определения функции."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "имя параметра:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Добавить входной параметр в функцию."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "параметры"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Добавить, удалить или изменить порядок входных параметров для этой функции."; +Blockly.Msg.REDO = "Повторить"; +Blockly.Msg.REMOVE_COMMENT = "Удалить комментарий"; +Blockly.Msg.RENAME_VARIABLE = "Переименовать переменную…"; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Переименовать все переменные '%1' в:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "добавить текст"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "к"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Добавить текст к переменной «%1»."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "в строчные буквы"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "в Заглавные Начальные Буквы"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "в ЗАГЛАВНЫЕ БУКВЫ"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Возвращает копию текста с ЗАГЛАВНЫМИ или строчными буквами."; +Blockly.Msg.TEXT_CHARAT_FIRST = "взять первую букву"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "взять букву № с конца"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "взять букву №"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "в тексте"; +Blockly.Msg.TEXT_CHARAT_LAST = "взять последнюю букву"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "взять случайную букву"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Возвращает букву в указанной позиции."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "подсчитать количество %1 в %2"; +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Подсчитать, сколько раз отрывок текста появляется в другом тексте."; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Добавить элемент к тексту."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "соединить"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Добавьте, удалите, переставьте фрагменты для переделки текстового блока."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "по букву № с конца"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "по букву №"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "по последнюю букву"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "в тексте"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "взять подстроку с первой буквы"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "взять подстроку с буквы № с конца"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "взять подстроку с буквы №"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Возвращает указанную часть текста."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "в тексте"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "найти первое вхождение текста"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "найти последнее вхождение текста"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Возвращает номер позиции первого/последнего вхождения первого текста во втором. Возвращает %1, если текст не найден."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 пуст"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Возвращает значение истина, если предоставленный текст пуст."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "создать текст из"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Создаёт фрагмент текста, объединяя любое число элементов"; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "длина %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Возвращает число символов (включая пробелы) в заданном тексте."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "напечатать %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Печатает текст, число или другой объект."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Запросить у пользователя число."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Запросить у пользователя текст."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "запросить число с подсказкой"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "запросить текст с подсказкой"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "заменить %1 на %2 в %3"; +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "изменить порядок на обратный %1"; +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Меняет порядок символов в тексте на обратный."; +Blockly.Msg.TEXT_TEXT_HELPURL = "https://ru.wikipedia.org/wiki/Строковый_тип"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Буква, слово или строка текста."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "обрезать пробелы с двух сторон"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "обрезать пробелы слева"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "обрезать пробелы справа"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Возвращает копию текста с пробелами, удалеными с одного или обоих концов."; +Blockly.Msg.TODAY = "Сегодня"; +Blockly.Msg.UNDO = "Отменить"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "элемент"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Создать блок \"присвоить\" для %1"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Возвращает значение этой переменной."; +Blockly.Msg.VARIABLES_SET = "присвоить %1 = %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Создать вставку %1"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Присваивает переменной значение вставки."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Переменная с именем '%1' уже существует."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/sc.js b/src/opsoro/server/static/js/blockly/msg/js/sc.js new file mode 100644 index 0000000..8a595d7 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/sc.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.sc'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Agiunghe unu cumentu"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Muda valori:"; +Blockly.Msg.CLEAN_UP = "Lìmpia is brocus"; +Blockly.Msg.COLLAPSE_ALL = "Serra e stringi Brocus"; +Blockly.Msg.COLLAPSE_BLOCK = "Serra e stringi Brocu"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "colori 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "colori 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "raportu"; +Blockly.Msg.COLOUR_BLEND_TITLE = "mestura"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Amestura duus coloris cun unu raportu (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Scebera unu colori de sa tauledda."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "Unu colori a brítiu"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Scebera unu colori a brítiu."; +Blockly.Msg.COLOUR_RGB_BLUE = "blue"; +Blockly.Msg.COLOUR_RGB_GREEN = "birdi"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "arrùbiu"; +Blockly.Msg.COLOUR_RGB_TITLE = "colora cun"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Cuncorda unu colori cun su tanti de arrubiu, birdi, e blue. Totu is valoris depint essi intra 0 e 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "sàrtiat a foras de sa lòriga"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "sighit cun su repicu afatànti"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Bessit de sa lòriga."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Sartiat su chi abarrat de sa loriga, e sighit cun su repicu afatànti."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Amonestu: Custu brocu ddu podis ponni sceti aintru de una lòriga."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "po dònnia item %1 in lista %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Po dònnia item in sa lista, ponit sa variàbili '%1' pari a s'item, e tandu fait pariga de cumandus."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "po %1 de %2 fintzas %3 a passus de %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Fait pigai a sa variàbili \"%1\" i valoris de su primu numeru a s'urtimu, a su passu impostau e fait su brocu."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Aciungi una cunditzioni a su brocu si."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Aciungi una urtima cunditzioni piga-totu a su brocu si."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Aciungi, fùlia, o assenta is partis po torrai a sètiu custu brocu si."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "sinuncas"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "sinuncas si"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "si"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Si su valori est berus, tandu fait pariga de cumandus."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Si su valori est berus, tandu fai su primu brocu de is cumandus. Sinuncas, fai su segundu brocu de is cumandus."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Si su primu valori est beridadi, tandu fai su primu brocu de is cumandus. Sinuncas, si su segundu valori est beridadi, fai su segundu brocu de is cumandus."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Si su primu valori est berus, tandu fai su primu brocu de is cumandus. Sinuncas, si su segundu valori est berus, fai su segundu brocu de is cumandus. Si mancu unu valori est berus, tandu fai s'urtimu brocu de is cumandus."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "fai"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "repiti %1 bortas"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Fait pariga de cumandus prus bortas."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repiti fintzas"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repiti interis"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Interis su valori est frassu, tandu fai pariga de cumandus."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Interis su valori est berus, tandu fai pariga de cumandus."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Scancellu su %1 de is brocus?"; +Blockly.Msg.DELETE_BLOCK = "Fùlia Blocu"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "Fulia %1 Blocus"; +Blockly.Msg.DISABLE_BLOCK = "Disabìlita Blocu"; +Blockly.Msg.DUPLICATE_BLOCK = "Dùplica"; +Blockly.Msg.ENABLE_BLOCK = "Abìlita Blocu"; +Blockly.Msg.EXPAND_ALL = "Aberi Brocus"; +Blockly.Msg.EXPAND_BLOCK = "Aberi Brocu"; +Blockly.Msg.EXTERNAL_INPUTS = "Intradas esternas"; +Blockly.Msg.HELP = "Agiudu"; +Blockly.Msg.INLINE_INPUTS = "Intradas in lìnia"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "fait una lista buida"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Torrat una lista, de longària 0, chena records de datus."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Aciungi, fùlia, o assenta is partis po torrai a sètiu custu brocu lista."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "fait una lista cun"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Acciungi unu item a sa lista."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Fait una lista cun calisiollat numeru de items."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "primu"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# de sa fini"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "piga"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "piga e fùlia"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "urtimu"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "a brìtiu (random)"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "fùlia"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Torrat su primu elementu de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Torrat s'elementu de su postu inditau de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Torrat s'urtimu elementu de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Torrat un'elementu a brìtiu de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Fùliat e torrat su primu elementu de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Fùliat e torrat s'elementu de su postu inditau de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Fùliat e torrat s'urtimu elementu de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Fùliat e torrat un'elementu a brìtiu de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Fùliat su primu elementu de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Fùliat s'elementu de su postu inditau de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Fùliat s'urtimu elementu de una lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Fùliat unu elementu a brìtiu de una lista."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "a # de sa fini"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "fintzas a #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "a s'urtimu"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "bogandi suta-lista de su primu"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "bogandi suta-lista de # de sa fini."; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "bogandi suta-lista de #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Fait una copia de sa parti inditada de sa lista."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 est po s'urtimu elementu."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 est po su primu elementu."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "circa prima ocasioni de s'item"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "circa urtima ocasioni de s'item"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Torrat s'indixi de sa primu/urtima ocasioni de s'item in sa lista. Torrat %1 si s'item non s'agatat."; +Blockly.Msg.LISTS_INLIST = "in lista"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 est buidu"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Torrat berus si sa lista est buida."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "longària de %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Torrat sa longària de una lista."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "fait una lista cun item %1 repitiu %2 bortas"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Fait una lista cun unu numeru giau repitiu su tanti de is bortas inditadas."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "a"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "inserta a"; +Blockly.Msg.LISTS_SET_INDEX_SET = "imposta"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Insertat s'elementu a su cumintzu de sa lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Insertat s'elementu in su postu inditau in una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Aciungit s'elementu a sa fini de sa lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Aciungit s'elementu a brítiu in sa lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Impostat su primu elementu in una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Impostat s'elementu in su postu inditau de una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Impostat s'urtimu elementu in una lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Impostat unu elementu random in una lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "fai una lista de unu testu"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "fai unu testu de una lista"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Auni una lista de testus in d-unu sceti, ponendi separadoris."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Dividi su testu in un'elencu de testus, firmendi po dònnia separadori."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "cun separadori"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "frassu"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Torrat berus o frassu."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "berus"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Torrat berus si is inputs funt unu uguali a s'àteru."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Torrat berus si su primu input est prus mannu de s'àteru."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Torrat berus si su primu input est prus mannu o uguali a s'àteru."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Torrat berus si su primu input est prus piticu de s'àteru."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Torrat berus si su primu input est prus piticu o uguali a s'àteru."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Torrat berus si is inputs non funt unu uguali a s'àteru."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "non %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Torrat berus si s'input est frassu. Torrat frassu si s'input est berus."; +Blockly.Msg.LOGIC_NULL = "null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Torrat null."; +Blockly.Msg.LOGIC_OPERATION_AND = "and"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "or"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Torrat berus si ambos is inputs funt berus."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Torrat berus si assumancu unu de is inputs est berus."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "cumpròa"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "si frassu"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "si berus"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "‎Cumproa sa cunditzioni in 'cumproa'. Si sa cunditzioni est berus, torrat su valori 'si berus'; sinuncas torrat su valori 'si frassu'."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Torrat sa summa de is duus nùmerus."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Torrat su cuotzienti de is duus nùmerus."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Torrat sa diferèntzia de is duus nùmerus."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Torrat su produtu de is duus nùmerus."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Torrat su primu numeru artziau a sa potenza de su segundu nùmeru."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "muda %1 de %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Aciungi unu numeru a sa variabili '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Torrat una de is costantis comunas: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), o ∞ (infiniu)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "custringi %1 de %2 a %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Custringi unu numeru aintru de is liminaxus giaus (cumprendius)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "fait a ddu dividi po"; +Blockly.Msg.MATH_IS_EVEN = "est paris"; +Blockly.Msg.MATH_IS_NEGATIVE = "est negativu"; +Blockly.Msg.MATH_IS_ODD = "est dísparu"; +Blockly.Msg.MATH_IS_POSITIVE = "est positivu"; +Blockly.Msg.MATH_IS_PRIME = "est primu"; +Blockly.Msg.MATH_IS_TOOLTIP = "Cumprova si unu numeru est paris, dìsparis, primu, intreu, positivu, negativu o si fait a ddu dividi po unu numeru giau. Torrat berus o frassu."; +Blockly.Msg.MATH_IS_WHOLE = "est intreu"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "arrestu de %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Torrat s'arrestu de sa divisioni de duus numerus."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Unu numeru"; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "mèdia de sa lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "massimu de sa lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "medianu de sa lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimu de sa lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modas de sa lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "unu item a brìtiu de sa lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "deviadura standard de sa lista"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "suma sa lista"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Torrat sa mèdia (aritimètica) de is valoris de sa lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Torrat su numeru prus mannu de sa lista"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Torrat su numeru medianu de sa lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Torrat su numeru prus piticu de sa lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Torrat una lista de is itams prus frecuentis de sa lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Torrat unu item a brìtiu de sa lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Torrat sa deviadura standard de sa lista."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Torrat sa suma de totu is numerus de sa lista."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "una fratzioni a brìtiu"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Torrat una fratzioni a brìtiu intra 0.0 (cumpresu) e 1.0 (bogau)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "numeru intreu a brítiu de %1 a %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Torrat unu numeru intreu a brìtiu intra duus nùmerus giaus (cumpresus)."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arretunda"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arretunda faci a bàsciu."; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "Arretunda faci a susu"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Arretunda unu numeru faci a susu o faci a bàsciu."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "assolutu"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "arraxina cuadra"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Torrat su valori assolútu de unu numeru."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Torrat (e) a sa potèntzia de unu numeru."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Torrat su logaritmu naturali de unu numeru."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Torrat su logaritmu a basi 10 de unu numeru."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Torrat su valori negau de unu numeru."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Torrat (10) a sa potèntzia de unu numeru."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Torrat s'arraxina cuadra de unu numeru."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Torrat su arccosinu de unu numeru."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Torrat su arcsinu de unu numeru."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Torrat su arctangenti de unu numeru."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Torrat su cosinu de unu gradu (no radianti)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Torrat su sinu de unu gradu (no radianti)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Torrat sa tangenti de unu gradu (no radianti)."; +Blockly.Msg.NEW_VARIABLE = "Variabili noa..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nòmini de sa variabili noa:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "permiti decraratzionis"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "con:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Arròllia sa funtzione '%1' cuncordada dae s'impitadore."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Arròllia sa funtzione '%1' cuncordada dae s'impitadore e imprea s'output suu."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "cun"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Ingenerau'%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "fait calincuna cosa"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "po"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Fait una funtzioni chena output."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "torrat"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Fait una funtzioni cun output."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Amonestu: Custa funtzioni tenit parametrus duplicaus."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Marca sa definitzioni de funtzioni."; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Si unu valori est berus, tandu torrat unu segundu valori."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Amonestu: Custu brocu ddu podis ponni sceti aintru de una funtzioni."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nomini input:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Aciungi un input a sa funtzioni."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Aciungi, fùlia, o assenta is inputs a custa funtzioni."; +Blockly.Msg.REDO = "Redo"; // untranslated +Blockly.Msg.REMOVE_COMMENT = "Fùlia unu cumentu"; +Blockly.Msg.RENAME_VARIABLE = "Muda nòmini a variabili..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "A is variabilis '%1' muda nòmini a:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "acciungi su testu"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "a"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Aciungit testu a sa variàbili '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "a minúdu"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "cun Primu lìtera a Mauschínu"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "a mauschínu"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Torrat una copia de su testu inditau mudendi mauschínu/minúdu."; +Blockly.Msg.TEXT_CHARAT_FIRST = "piga sa prima lìtera"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "piga sa lìtera # de sa fini"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "piga sa lìtera #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in su testu"; +Blockly.Msg.TEXT_CHARAT_LAST = "piga s'urtima lìtera"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "piga una lìtera a brìtiu"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Torrat sa lìtera de su postu giau."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Acciungi unu item a su testu."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "auni a pari"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Aciungi, fùlia, o assenta is partis po torrai a sètiu custu brocu de testu."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "a sa lìtera # de sa fini"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "a sa lìtera #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "a s'urtima lìtera"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in su testu"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "piga suta-stringa de sa primu lìtera"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "piga suta-stringa de sa lìtera # fintzas a fini"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "piga suta-stringa de sa lìtera #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Torrat su testu inditau."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in su testu"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "circa prima ocasioni de su testu"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "circa urtima ocasioni de su testu"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Torrat s'indixi de sa primu/urtima ocasioni de su primu testu in su segundu testu. Torrat %1 si su testu no ddu agatat."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 est buidu"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Torrat berus si su testu giau est buidu."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "scri testu cun"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Fait unu testu ponendi a pari parigas de items."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "longària de %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Torrat su numeru de lìteras (cun is spàtzius) in su testu giau."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "scri %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Scri su testu, numeru o àteru valori."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Pregonta unu nùmeru a s'impitadore."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Pregonta testu a s'impitadore."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "pregonta po unu numeru"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "pregonta po su testu"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Una lìtera, paràula, o linia de testu."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "bogat spàtzius de ambus càbudus de"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "bogat spàtzius de su càbudu de manca de"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "bogat spàtzius de su càbudu de dereta de"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Torrat una copia de su testu bogaus is spàtzius de unu o de ambus is càbudus."; +Blockly.Msg.TODAY = "Oe"; +Blockly.Msg.UNDO = "Undo"; // untranslated +Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Fait 'imposta %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Torrat su valori de custa variabili."; +Blockly.Msg.VARIABLES_SET = "imposta %1 a %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Fait 'piga %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Imposta custa variabili uguali a s'input."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/sd.js b/src/opsoro/server/static/js/blockly/msg/js/sd.js new file mode 100644 index 0000000..b8bb414 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/sd.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.sd'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "تاثرات ڏيو"; +Blockly.Msg.CHANGE_VALUE_TITLE = "قدر بدلايو"; +Blockly.Msg.CLEAN_UP = "بندشون هٽايو"; +Blockly.Msg.COLLAPSE_ALL = "بلاڪَ ڍڪيو"; +Blockly.Msg.COLLAPSE_BLOCK = "بلاڪ ڍڪيو"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "رنگ 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "رنگ 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "تناسب"; +Blockly.Msg.COLOUR_BLEND_TITLE = "blend"; // untranslated +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "ڄاڻايل تناسب سان ٻہ رنگ پاڻ ۾ ملايو (0.0-1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "رنگ دٻيءَ مان رنگ چونڊيو."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "بلا ترتيب رنگ"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "ڪو بہ ‌ڃڳ چونڊيو."; +Blockly.Msg.COLOUR_RGB_BLUE = "نيرو"; +Blockly.Msg.COLOUR_RGB_GREEN = "سائو"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "ڳاڙهو"; +Blockly.Msg.COLOUR_RGB_TITLE = "سان رڱيو"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "ڳاڙهي، سائي، ۽ نيري جو مقدار ڄاڻائي گھربل رنگ ٺاهيو. سمورا قدر 0 ۽ 100 جي وچ ۾ هجن."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "چڪر مان ٻاهر نڪرو"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "چڪر جاري رکندر نئين ڦيري پايو"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Break out of the containing loop."; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the rest of this loop, and continue with the next iteration."; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warning: This block may only be used within a loop."; // untranslated +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "for each item %1 in list %2"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For each item in a list, set the variable '%1' to the item, and then do some statements."; // untranslated +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "count with %1 from %2 to %3 by %4"; // untranslated +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; // untranslated +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block."; // untranslated +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block."; // untranslated +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Add, remove, or reorder sections to reconfigure this if block."; // untranslated +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "نہ تہ"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "نہ تہ جي"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "جيڪڏهن"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "If a value is true, then do some statements."; // untranslated +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "ڪريو"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "1٪ ڀيرا ورجايو"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Do some statements several times."; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ورجايو جيستائين"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ورجايو جڏهن"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "While a value is false, then do some statements."; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "While a value is true, then do some statements."; // untranslated +Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated +Blockly.Msg.DELETE_BLOCK = "بلاڪ ڊاهيو"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "1٪ بلاڪ ڊاهيو"; +Blockly.Msg.DISABLE_BLOCK = "بلاڪ کي غيرفعال بڻايو"; +Blockly.Msg.DUPLICATE_BLOCK = "نقل"; +Blockly.Msg.ENABLE_BLOCK = "بلاڪ کي فعال بڻايو"; +Blockly.Msg.EXPAND_ALL = "بلاڪَ نمايو"; +Blockly.Msg.EXPAND_BLOCK = "بلاڪ نمايو"; +Blockly.Msg.EXTERNAL_INPUTS = "خارجي ڄاڻ"; +Blockly.Msg.HELP = "مدد"; +Blockly.Msg.INLINE_INPUTS = "Inline Inputs"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "خالي فهرست تخليق ڪريو"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "لسٽ"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "create list with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "فهرست ۾ ڪا شي شامل ڪريو."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_FIRST = "پهريون"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# آخر کان"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "get"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "get and remove"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_LAST = "آخري"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "بي ترتيب"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "هٽايو"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returns the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Removes and returns the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Removes the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "ڏانهن # آخر کان"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "ڏانهن #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "آخري ڏانهن"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "get sub-list from first"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 is the last item."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 is the first item."; // untranslated +Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated +Blockly.Msg.LISTS_INLIST = "فهرست ۾"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty."; // untranslated +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; // untranslated +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "جيان"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "تي داخل ڪريو"; +Blockly.Msg.LISTS_SET_INDEX_SET = "ميڙ"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserts the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sets the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "ڪُوڙ"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "درست يا غير درست وراڻي ٿو."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "سچ"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "جيڪڏهن ٻئي ان پُٽس برابر آهن تہ درست وراڻيو"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "جيڪڏهن پهريون ان پُٽ ٻين ان پُٽ کان وڏو آهي تہ درست وراڻيو."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "جيڪڏهن پهريون ان پُٽ ٻين ان پُٽ کان وڏو آهي يا ٻئي برابر آهن تہ درست وراڻيو."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "جيڪڏهن پهريون ان پُٽ ٻين ان پُٽ کان ننڍو آهي تہ درست وراڻيو"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "جيڪڏهن پهريون ان پُٽ ٻين ان پُٽ کان ننڍو آهي يا ٻئي برابر آهن تہ درست وراڻيو"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "جيڪڏهن ٻئي ان پُٽس اڻ برابر آهن تہ درست وراڻيو"; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "نڪي %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "ان پُٽ غير درست آهي تہ درست وراڻيو. ان پُٽ درست آهي تہ غير درست وراڻيو."; +Blockly.Msg.LOGIC_NULL = "null"; // untranslated +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returns null."; // untranslated +Blockly.Msg.LOGIC_OPERATION_AND = "۽"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "يا"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "جيڪڏهن ٻئي ان پُٽ درست آهن تہ درست وراڻيو."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "جيڪڏهن ٻنهي ان پُٽس مان ڪو هڪ بہ درست آهي تہ درست وراڻيو."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; // untranslated +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "جيڪڏهن ڪوڙو"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "جيڪڏهن سچو"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "ٻن انگن جي جوڙ اپت ڏيو."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "ٻنهي انگن جي ونڊ ڏيو."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "ٻنهي انگن جو تفاوت ڏيو."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "ٻنهي انگن جي ضرب اُپت ڏيو."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg.MATH_CHANGE_TITLE = "%1 کي %2 سان مَٽايو"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; // untranslated +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/رياضياتي استقلال"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "سان ونڊجندڙ آهي"; +Blockly.Msg.MATH_IS_EVEN = "ٻڌي آهي"; +Blockly.Msg.MATH_IS_NEGATIVE = "ڪاٽو آهي"; +Blockly.Msg.MATH_IS_ODD = "اِڪي آهي"; +Blockly.Msg.MATH_IS_POSITIVE = "واڌو آهي"; +Blockly.Msg.MATH_IS_PRIME = "مفرد آهي"; +Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated +Blockly.Msg.MATH_IS_WHOLE = "سڄو آهي"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated +Blockly.Msg.MATH_MODULO_TITLE = "remainder of %1 ÷ %2"; // untranslated +Blockly.Msg.MATH_MODULO_TOOLTIP = "Return the remainder from dividing the two numbers."; // untranslated +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; // untranslated +Blockly.Msg.MATH_NUMBER_TOOLTIP = "ڪو انگ."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "لسٽ جي سراسري"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "لسٽ جو وڏي ۾ وڏو قدر"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "لسٽ جو مڌيان"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "لسٽ جو ننڍي ۾ ننڍو قدر"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modes of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "random item of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standard deviation of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "فهرست جو وچور"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Return the average (arithmetic mean) of the numeric values in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "لسٽ ۾ وڏي کان وڏو قدر ڄاڻايو."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "لسٽ جو مڌيان انگ ڄاڻايو."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "لسٽ ۾ ننڍي کان ننڍو قدر ڄاڻايو."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Return a list of the most common item(s) in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Return a random element from the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Return the sum of all the numbers in the list."; // untranslated +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "random fraction"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_TITLE = "random integer from %1 to %2"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; // untranslated +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; // untranslated +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "round"; // untranslated +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "هيٺ ڦيرايو (رائونڊ ڊائون)"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "ويڙهيو (رائونڊ اَپ)"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Round a number up or down."; // untranslated +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/ٻيون مول"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "ٺپ"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "ٻيون مول"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "ڪنهن انگ جو قدرتي لاگ ڄاڻايو."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "ڪنهن انگ جو 10 بنيادي لاگ ڄاڻايو."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "ڪنهن انگ جو ڪاٽو ڄاڻايو."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "ڪنهن انگ جو ٻيون مول ڄاڻايو."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/ٽڪنڊور ڪاڄ"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated +Blockly.Msg.NEW_VARIABLE = "نئون ڦرڻو..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "ڦرڻي جو نئون نالو:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "سان:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "سان:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "تخليق ڪريو '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "ڪجھ ڪريو"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "ڏانهن"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "واپس ورو"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; // untranslated +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; // untranslated +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "ان پُٽس"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "ٻيهر ڪريو"; +Blockly.Msg.REMOVE_COMMENT = "تاثرات مِٽايو"; +Blockly.Msg.RENAME_VARIABLE = "ڦرڻي کي نئون نالو ڏيو..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Rename all '%1' variables to:"; // untranslated +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "append text"; // untranslated +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "to"; // untranslated +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; // untranslated +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "ننڍن اکر ڏانهن"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "وڏن اکرن ڏانهن"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg.TEXT_CHARAT_FIRST = "get first letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_FROM_END = "get letter # from end"; // untranslated +Blockly.Msg.TEXT_CHARAT_FROM_START = "get letter #"; // untranslated +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "متن ۾"; +Blockly.Msg.TEXT_CHARAT_LAST = "get last letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "شامل ٿيو"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "متن ۾"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; // untranslated +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "متن ۾"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "create text with"; // untranslated +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; // untranslated +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "ڇاپيو %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "ڄاڻايل تحرير، انگ يا ڪو ٻيو قدر ڇاپيو."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated +Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; // untranslated +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "trim spaces from both sides of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated +Blockly.Msg.TODAY = "اڄ"; +Blockly.Msg.UNDO = "Undo"; // untranslated +Blockly.Msg.VARIABLES_DEFAULT_NAME = "اسم"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; // untranslated +Blockly.Msg.VARIABLES_SET = "set %1 to %2"; // untranslated +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/shn.js b/src/opsoro/server/static/js/blockly/msg/js/shn.js similarity index 90% rename from src/opsoro/apps/visual_programming/static/blockly/msg/js/shn.js rename to src/opsoro/server/static/js/blockly/msg/js/shn.js index 1f14ed0..36f24b5 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/shn.js +++ b/src/opsoro/server/static/js/blockly/msg/js/shn.js @@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.shn'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "သႂ်ႇၶေႃႈၵႂၢမ်း"; -Blockly.Msg.AUTH = "ၶွပ်ႈၸႂ် ပၼ်ၶႂၢင်ႉႁပ်ႉဢဝ် ဢႅပ်ႉၼႆႉ တီႈၼႂ်းၵၢၼ်ၸဝ်ႈၵဝ်ႇသေယဝ်ႉ ၸဝ်ႈၵဝ်ႇ ႁႂ်ႈလႆႈသိမ်း ႁႂ်ႈလႆႈပိုၼ်ပၼ်သေၵမ်း"; Blockly.Msg.CHANGE_VALUE_TITLE = "လႅၵ်ႈလၢႆႈၼမ်ႉၵတ်ႉ"; -Blockly.Msg.CHAT = "​ပေႃႉလိၵ်ႈ ၼႂ်းလွၵ်းၼႆႉသေ ၶျၢတ်ႉၸူး ၵေႃႉႁူမ်ႈႁဵတ်းႁူမ်ႈသၢင်ႈ ၸဝ်ႈၵဝ်ႇ"; Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated Blockly.Msg.COLLAPSE_ALL = "ပလွၵ်ႉတင်းၼမ် လႅဝ်"; Blockly.Msg.COLLAPSE_BLOCK = "ပလွၵ်ႉလႅဝ်"; @@ -62,7 +60,10 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "တိုၵ်ႉလိုမ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ၶၢဝ်းတိုၵ်ႉလိုမ်ႉ"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "ပေႃးဝႃႈ ၵႃႈၶၼ် (ၼမ်ႉၵတ်ႉ) ဢမ်ႇမၢၼ်ႇမႅၼ်ႈၸိုင် ႁဵတ်းၶေႃႈၵဵပ်းထွၼ် ၵမ်ႈၽွင်ႈ"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "ပေႃးဝႃႈ ၵႃႈၶၼ် (ၼမ်ႉၵတ်ႉ) မၢၼ်ႇမႅၼ်ႈယဝ်ႉၸိုင် ႁဵတ်းၶေႃႈၵဵပ်းထွၼ်ၵမ်ႈၽွင်ႈ"; +Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated Blockly.Msg.DELETE_BLOCK = "မွတ်ႇပလွၵ်ႉ"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated Blockly.Msg.DELETE_X_BLOCKS = "မွတ်ႇပလွၵ်ႉ %1"; Blockly.Msg.DISABLE_BLOCK = "ဢမ်ႇၸၢင်ႈပလွၵ်ႉ"; Blockly.Msg.DUPLICATE_BLOCK = "ထုတ်ႇ"; @@ -91,18 +92,15 @@ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "random"; // untranslated Blockly.Msg.LISTS_GET_INDEX_REMOVE = "remove"; // untranslated Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returns the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returns the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Removes and returns the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Removes and returns the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Removes and returns the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Removes the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Removes the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Removes the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "to # from end"; // untranslated @@ -114,10 +112,12 @@ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 is the last item."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 is the first item."; // untranslated Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated Blockly.Msg.LISTS_INLIST = "in list"; // untranslated Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty"; // untranslated @@ -128,20 +128,29 @@ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; // untransl Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "as"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INSERT = "insert at"; // untranslated Blockly.Msg.LISTS_SET_INDEX_SET = "set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserts the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserts the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserts the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specified position in a list. #1 is the last item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sets the item at the specified position in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -187,7 +196,7 @@ Blockly.Msg.MATH_CHANGE_TITLE = "change %1 by %2"; // untranslated Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; // untranslated Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated @@ -258,35 +267,36 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // u Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated -Blockly.Msg.ME = "ၸဝ်ႈၵဝ်ႇ"; Blockly.Msg.NEW_VARIABLE = "လၢႆႈဢၼ်မႂ်ႇ"; Blockly.Msg.NEW_VARIABLE_TITLE = "ၸိုဝ်ႈဢၼ်လၢႆႈမႂ်ႇ"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "with:"; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated -Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "with:"; // untranslated Blockly.Msg.PROCEDURES_CREATE_DO = "Create '%1'"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "do something"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "to"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; // untranslated -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "return"; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; // untranslated Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; // untranslated Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; // untranslated Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "ဢဝ်ဢွၵ်ႇ ၶေႃႈၵႂၢမ်း"; Blockly.Msg.RENAME_VARIABLE = "လိုမ်ႉၶိုၼ်း ဢၼ်လၢႆႈမႂ်ႇ"; Blockly.Msg.RENAME_VARIABLE_TITLE = "လိုမ်ႉၶိုၼ်း ဢၼ်လၢႆႈမႂ်ႇၸိူဝ်းၼၼ်ႉ '%1' ထိုင်"; @@ -308,6 +318,9 @@ Blockly.Msg.TEXT_CHARAT_LAST = "get last letter"; // untranslated Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; // untranslated Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "join"; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated @@ -326,7 +339,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; // untranslated Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty"; // untranslated Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated @@ -344,6 +357,12 @@ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // un Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; // untranslated Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated @@ -352,6 +371,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untra Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated Blockly.Msg.TODAY = "မိူဝ်ႈၼႆႉ"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "ဢၼ်"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated @@ -360,13 +380,13 @@ Blockly.Msg.VARIABLES_SET = "set %1 to %2"; // untranslated Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; @@ -374,9 +394,19 @@ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/sk.js b/src/opsoro/server/static/js/blockly/msg/js/sk.js new file mode 100644 index 0000000..ec4629d --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/sk.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.sk'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Pridať komentár"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Zmeniť hodnotu:"; +Blockly.Msg.CLEAN_UP = "Narovnať bloky"; +Blockly.Msg.COLLAPSE_ALL = "Zvinúť bloky"; +Blockly.Msg.COLLAPSE_BLOCK = "Zvinúť blok"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "farba 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "farba 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "pomer"; +Blockly.Msg.COLOUR_BLEND_TITLE = "zmiešať"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Zmieša dve farby v danom pomere (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Zvoľte farbu z palety."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "náhodná farba"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Zvoliť farbu náhodne."; +Blockly.Msg.COLOUR_RGB_BLUE = "modrá"; +Blockly.Msg.COLOUR_RGB_GREEN = "zelená"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "červená"; +Blockly.Msg.COLOUR_RGB_TITLE = "ofarbiť s"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Vytvoriť farbu pomocou zadaného množstva červenej, zelenej a modrej. Množstvo musí byť medzi 0 a 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "opustiť slučku"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "prejdi na nasledujúce opakovanie slučky"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Opustiť túto slučku."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Vynechať zvyšok tejto slučky a pokračovať ďalším opakovaním."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Upozornenie: Tento blok sa môže používať len v rámci slučky."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "pre každý prvok %1 v zozname %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Pre každý prvok v zozname priraď jeho hodnotu do premenej '%1' a vykonaj príkazy."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "počítať s %1 od %2 do %3 o %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Nechá premennú '%1' nadobúdať hodnoty od začiatočného čísla po konečné s daným medzikrokom a vykoná zadané bloky."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Pridať podmienku k \"ak\" bloku."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Pridať poslednú záchytnú podmienku k \"ak\" bloku."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Pridať, odstrániť alebo zmeniť poradie oddielov tohto \"ak\" bloku."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "inak"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "inak ak"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "ak"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Ak je hodnota pravda, vykonaj príkazy."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Ak je hodnota pravda, vykonaj príkazy v prvom bloku. Inak vykonaj príkazy v druhom bloku."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Ak je prvá hodnota pravda, vykonaj príkazy v prvom bloku. Inak, ak je druhá hodnota pravda, vykonaj príkazy v druhom bloku."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Ak je prvá hodnota pravda, vykonaj príkazy v prvom bloku. Inak, ak je druhá hodnota pravda, vykonaj príkazy v druhom bloku. Ak ani jedna hodnota nie je pravda, vykonaj príkazy v poslednom bloku."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "rob"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "opakuj %1 krát"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Opakuj určité príkazy viackrát."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "opakuj kým nebude"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "opakuj kým"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Kým je hodnota nepravdivá, vykonávaj príkazy."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Kým je hodnota pravdivá, vykonávaj príkazy."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Zmazať všetkých %1 dielcov?"; +Blockly.Msg.DELETE_BLOCK = "Odstrániť blok"; +Blockly.Msg.DELETE_VARIABLE = "Odstrániť premennú '%1'"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Odstrániť %1 použití premennej '%2'?"; +Blockly.Msg.DELETE_X_BLOCKS = "Odstrániť %1 blokov"; +Blockly.Msg.DISABLE_BLOCK = "Vypnúť blok"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplikovať"; +Blockly.Msg.ENABLE_BLOCK = "Povoliť blok"; +Blockly.Msg.EXPAND_ALL = "Rozvinúť bloky"; +Blockly.Msg.EXPAND_BLOCK = "Rozvinúť blok"; +Blockly.Msg.EXTERNAL_INPUTS = "Vonkajšie vstupy"; +Blockly.Msg.HELP = "Pomoc"; +Blockly.Msg.INLINE_INPUTS = "Riadkové vstupy"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "prázdny zoznam"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Vráti zoznam nulovej dĺžky, ktorý neobsahuje žiadne prvky."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "zoznam"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Pridaj, odstráň alebo zmeň poradie v tomto zoznamovom bloku."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "vytvor zoznam s"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Pridaj prvok do zoznamu."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Vytvor zoznam s ľubovoľným počtom prvkov."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "prvý"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# od konca"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "zisti"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "zisti a odstráň"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "posledný"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "náhodný"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "odstráň"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Vráti počiatočný prvok zoznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Vráti prvok na určenej pozícii v zozname."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Vráti posledný prvok zoznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Vráti náhodný prvok zoznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Odstráni a vráti prvý prvok v zozname."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Odstráni a vráti prvok z určenej pozície v zozname."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Odstráni a vráti posledný prvok v zozname."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Odstráni a vráti náhodný prvok v zozname."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Odstráni prvý prvok v zozname."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Odstráni prvok na určenej pozícii v zozname."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Odstráni posledný prvok v zozname."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Odstráni náhodný prvok v zozname."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "po # od konca"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "po #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "po koniec"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "Získať podzoznam od začiatku"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "Získať podzoznam od # od konca"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "získať podzoznam od #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Skopíruje určený úsek zoznamu."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 je posledný prvok."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 je počiatočný prvok."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "nájdi prvý výskyt prvku"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "nájdi posledný výskyt prvku"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Vráti index prvého/posledného výskytu prvku v zozname. Ak sa nič nenašlo, vráti %1."; +Blockly.Msg.LISTS_INLIST = "v zozname"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 je prázdny"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Vráti pravda, ak je zoznam prázdny."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "dĺžka %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Vráti dĺžku zoznamu"; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "vytvor zoznam s prvkom %1 opakovaným %2 krát"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Vytvorí zoznam s niekoľkými rovnakými prvkami s danou hodnotou."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "ako"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "vložiť na"; +Blockly.Msg.LISTS_SET_INDEX_SET = "nastaviť"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Vsunie prvok na začiatok zoznamu."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Vsunie prvok na určenú pozíciu v zozname."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Pripojí prvok na koniec zoznamu."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Vsunie prvok na náhodné miesto v zozname."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Nastaví prvý prvok v zozname."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Nastaví prvok na určenej pozícii v zozname."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Nastaví posledný prvok v zozname."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Nastaví posledný prvok v zozname."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "Vzostupne"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "Zostupne"; +Blockly.Msg.LISTS_SORT_TITLE = "zoradiť %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Zoradiť kópiu zoznamu."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "abecedne, ignorovať veľkosť písmen"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numericky"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "abecedne"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "vytvoriť zoznam z textu"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "vytvoriť text zo zoznamu"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Spojiť zoznam textov do jedného textu s oddeľovačmi."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Rozdelenie textu do zoznamu textov, lámanie na oddeľovačoch."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "s oddeľovačom"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "nepravda"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Vráť buď hodnotu pravda alebo nepravda."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "pravda"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Vráť hodnotu pravda, ak sú vstupy rovnaké."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Vráť hodnotu pravda ak prvý vstup je väčší než druhý."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Vráť hodnotu pravda ak prvý vstup je väčší alebo rovný druhému."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Vráť hodnotu pravda, ak prvý vstup je menší než druhý."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Vráť hodnotu pravda ak prvý vstup je menší alebo rovný druhému."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Vráť hodnotu pravda, ak vstupy nie sú rovnaké."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "nie je %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Vráti hodnotu pravda, ak je vstup nepravda. Vráti hodnotu nepravda ak je vstup pravda."; +Blockly.Msg.LOGIC_NULL = "nič"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Vráti hodnotu nula."; +Blockly.Msg.LOGIC_OPERATION_AND = "a"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "alebo"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Vráť hodnotu pravda, ak sú vstupy pravdivé."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Vráť hodnotu pravda, ak je aspoň jeden vstup pravda."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "ak nepravda"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "ak pravda"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Skontroluj podmienku testom. Ak je podmienka pravda, vráť hodnotu \"ak pravda\", inak vráť hodnotu \"ak nepravda\"."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Vráť súčet dvoch čísel."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Vráť podiel dvoch čísel."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Vráť rozdiel dvoch čísel."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Vráť súčin dvoch čísel."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Vráť prvé číslo umocnené druhým."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "zmeniť %1 o %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Pridaj číslo do premennej \"%1\"."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant‎"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Vráť jednu zo zvyčajných konštánt: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), alebo ∞ (nekonečno)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "obmedz %1 od %2 do %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Obmedzí číslo do zadaných hraníc (vrátane)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "je deliteľné"; +Blockly.Msg.MATH_IS_EVEN = "je párne"; +Blockly.Msg.MATH_IS_NEGATIVE = "je záporné"; +Blockly.Msg.MATH_IS_ODD = "je nepárne"; +Blockly.Msg.MATH_IS_POSITIVE = "je kladné"; +Blockly.Msg.MATH_IS_PRIME = "je prvočíslo"; +Blockly.Msg.MATH_IS_TOOLTIP = "Skontroluj či je číslo párne, nepárne, celé, kladné, záporné alebo deliteľné určitým číslom. Vráť hodnotu pravda alebo nepravda."; +Blockly.Msg.MATH_IS_WHOLE = "je celé číslo"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "zvyšok po delení %1 + %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Vráť zvyšok po delení jedného čísla druhým."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Číslo."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "priemer zoznamu"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "najväčšie v zozname"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "medián zoznamu"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "najmenšie v zozname"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "najčastejšie v zozname"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "náhodný prvok zoznamu"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "smerodajná odchýlka zoznamu"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "súčet zoznamu"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Vráť aritmetický priemer čísel v zozname."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Vrátiť najväčšie číslo v zozname."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Vráť medián čísel v zozname."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Vrátiť najmenšie číslo v zozname."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Vrátiť najčastejší prvok v zozname."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Vráť náhodne zvolený prvok zoznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Vráť smeroddajnú odchýlku zoznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Vráť súčet všetkých čísel v zozname."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "náhodné číslo od 0 do 1"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Vráť náhodné číslo z intervalu 0.0 (vrátane) až 1.0."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "náhodné celé číslo od %1 do %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Vráť náhodné celé číslo z určeného intervalu (vrátane)."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "zaokrúhli"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "zaokrúhli nadol"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "zaokrúhli nahor"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Zaokrúhli číslo nahor alebo nadol."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolútna hodnota"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "druhá odmocnina"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Vráť absolútnu hodnotu čísla."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Vráť e umocnené číslom."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Vráť prirodzený logaritmus čísla."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Vráť logaritmus čísla so základom 10."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Vráť opačné číslo."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Vráť 10 umocnené číslom."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Vráť druhú odmocninu čísla."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "arccos"; +Blockly.Msg.MATH_TRIG_ASIN = "arcsin"; +Blockly.Msg.MATH_TRIG_ATAN = "arctan"; +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Vráť arkus kosínus čísla."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Vráť arkus sínus čísla."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Vráť arkus tangens čísla."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Vráť kosínus uhla (v stupňoch)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Vráť sínus uhla (v stupňoch)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Vráť tangens uhla (v stupňoch)."; +Blockly.Msg.NEW_VARIABLE = "Vytvoriť premennú..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Názov novej premennej:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "povoliť príkazy"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "s:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Spustí používateľom definovanú funkciu '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Spustí používateľom definovanú funkciu '%1' a použije jej výstup."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "s:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Vytvoriť '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Doplň, čo robí táto funkcia..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "urob niečo"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "na"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Vytvorí funciu bez výstupu."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "vrátiť"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Vytvorí funkciu s výstupom."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Upozornenie: Táto funkcia má duplicitné parametre."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Zvýrazniť definíciu funkcie"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Ak je hodnota pravda, tak vráti druhú hodnotu."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Upozornenie: Tento blok môže byť len vo vnútri funkcie."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "názov vstupu:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Pridať vstup do funkcie."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "vstupy"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Pridať, odstrániť alebo zmeniť poradie vstupov tejto funkcie."; +Blockly.Msg.REDO = "Znova"; +Blockly.Msg.REMOVE_COMMENT = "Odstrániť komentár"; +Blockly.Msg.RENAME_VARIABLE = "Premenovať premennú..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Premenovať všetky premenné '%1' na:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "pridaj text"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "do"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Pridaj určitý text do premennej '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "na malé písmená"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "na Veľké Začiatočné Písmená"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "na VEĽKÉ PÍSMENÁ"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Vráť kópiu textu s inou veľkosťou písmen."; +Blockly.Msg.TEXT_CHARAT_FIRST = "zisti prvé písmeno"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "zisti # písmeno od konca"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "zisti písmeno #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "v texte"; +Blockly.Msg.TEXT_CHARAT_LAST = "zisti posledné písmeno"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "vyber náhodné písmeno"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Vráti písmeno na určenej pozícii."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Pridaj prvok do textu."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "spoj"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Pridaj, odstráň alebo zmeň poradie oddielov v tomto textovom bloku."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "po # písmeno od konca"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "po písmeno #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "po koniec"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "v texte"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "vyber podreťazec od začiatku"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "vyber podreťazec od # písmena od konca"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "vyber podreťazec od písmena #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Vráti určenú časť textu."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "v texte"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "nájdi prvý výskyt textu"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "nájdi posledný výskyt textu"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Vráti index prvého/posledného výskytu prvého textu v druhom texte. Ak nenájde, vráti %1."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 je prázdny"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Vráti hodnotu pravda, ak zadaný text je prázdny."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "vytvor text z"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Vytvor text spojením určitého počtu prvkov."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "dĺžka %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Vráti počet písmen (s medzerami) v zadanom texte."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "píš %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Napíš zadaný text, číslo alebo hodnotu."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Výzva pre používateľa na zadanie čísla."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Výzva pre používateľa na zadanie textu."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "výzva na zadanie čísla so správou"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "výzva za zadanie textu so správou"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Písmeno, slovo alebo riadok textu."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "odstráň medzery z oboch strán"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "odstráň medzery z ľavej strany"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "odstráň medzery z pravej strany"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Vráť kópiu textu bez medzier na jednom alebo oboch koncoch."; +Blockly.Msg.TODAY = "Dnes"; +Blockly.Msg.UNDO = "Späť"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "prvok"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Vytvoriť \"nastaviť %1\""; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Vráti hodnotu tejto premennej."; +Blockly.Msg.VARIABLES_SET = "nastaviť %1 na %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Vytvoriť \"získať %1\""; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Nastaví túto premennú, aby sa rovnala vstupu."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Premenná s názvom %1 už existuje."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/sl.js b/src/opsoro/server/static/js/blockly/msg/js/sl.js new file mode 100644 index 0000000..708cb52 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/sl.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.sl'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Dodaj komentar"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Spremeni vrednost:"; +Blockly.Msg.CLEAN_UP = "Ponastavi kocke"; +Blockly.Msg.COLLAPSE_ALL = "Skrči kocke"; +Blockly.Msg.COLLAPSE_BLOCK = "Skrči kocko"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "barva 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "barva 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "razmerje"; +Blockly.Msg.COLOUR_BLEND_TITLE = "mešanica"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Zmeša dve barvi v danem razmerju (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Izberi barvo s palete."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "naključna barva"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Izbere naključno barvo."; +Blockly.Msg.COLOUR_RGB_BLUE = "modra"; +Blockly.Msg.COLOUR_RGB_GREEN = "zelena"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "rdeča"; +Blockly.Msg.COLOUR_RGB_TITLE = "določena barva"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Ustvari barvo z določeno količino rdeče, zelene in modre. Vse vrednosti morajo biti med 0 in 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "izstopi iz zanke"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "nadaljuj z naslednjo ponovitvijo zanke"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Izstopi iz trenutne zanke."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Preskoči preostanek te zanke in nadaljuje z naslednjo ponovitvijo."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Pozor: To kocko lahko uporabiš samo znotraj zanke."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; +Blockly.Msg.CONTROLS_FOREACH_TITLE = "za vsak element %1 v seznamu %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Za vsak element v seznamu, nastavi spremenljivko '%1' na ta element. Pri tem se izvedejo določene kocke."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; +Blockly.Msg.CONTROLS_FOR_TITLE = "štej s/z %1 od %2 do %3 s korakom %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Vrednost spremenljivke '%1' se spreminja od začetnega števila do končnega števila, z določenim korakom. Pri tem se izvedejo določene kocke."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Dodaj pogoj »če« kocki."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Dodaj končni pogoj »če« kocki."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Dodaj, odstrani ali spremeni vrstni red odsekov za ponovno nastavitev »če« kocke."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "sicer"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "sicer če"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "če"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Če je vrednost resnična, izvedi določene kocke."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Če je vrednost resnična, izvedi prvo skupino kock. Sicer izvedi drugo skupino kock."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Če je prva vrednost resnična, izvedi prvo skupino kock. Sicer, če je resnična druga vrednost, izvedi drugo skupino kock."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Če je prva vrednost resnična, izvedi prvo skupino kock. Sicer, če je resnična druga vrednost, izvedi drugo skupino kock. Če nobena izmed vrednosti ni resnična, izvedi zadnjo skupino kock."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "izvedi"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "ponavljaj %1 krat"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Kocke se izvedejo večkrat."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ponavljaj dokler"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ponavljaj"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Kocke se izvajajo dokler je vrednost neresnična."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Kocke se izvajajo dokler je vrednost resnična."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Izbrišem vseh %1 kock?"; +Blockly.Msg.DELETE_BLOCK = "Izbriši kocko"; +Blockly.Msg.DELETE_VARIABLE = "Izbriši spremenljivko »%1«"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Izbrišem %1 uporab spremenljivke »%2«?"; +Blockly.Msg.DELETE_X_BLOCKS = "Izbriši kocke"; +Blockly.Msg.DISABLE_BLOCK = "Onemogoči kocko"; +Blockly.Msg.DUPLICATE_BLOCK = "Podvoji"; +Blockly.Msg.ENABLE_BLOCK = "Omogoči kocko"; +Blockly.Msg.EXPAND_ALL = "Razširi kocke"; +Blockly.Msg.EXPAND_BLOCK = "Razširi kocko"; +Blockly.Msg.EXTERNAL_INPUTS = "Vnosi zunaj"; +Blockly.Msg.HELP = "Pomoč"; +Blockly.Msg.INLINE_INPUTS = "Vnosi v vrsti"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "ustvari prazen seznam"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Vrne seznam, dolžine 0, ki ne vsebuje nobenih podatkov."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "seznam"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Doda, odstrani ali spremeni vrstni red elementov tega seznama."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "ustvari seznam s/z"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Doda element seznamu."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Ustvari seznam s poljubnim številom elementov."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "prvo mesto"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "mesto št. od konca"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "št."; +Blockly.Msg.LISTS_GET_INDEX_GET = "vrni"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "odstrani in vrni"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "zadnje mesto"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "naključno mesto"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "odstrani"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Vrne prvi element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Vrne element na določenem mestu v seznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Vrne zadnji element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Vrne naključni element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Odstrani in vrne prvi element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Odstrani in vrne element na določenem mestu v seznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Odstrani in vrne zadnji element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Odstrani in vrne naključni element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Odstrani prvi element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Odstrani element na določenem mestu v seznamu."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Odstrani zadnji element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Odstrani naključni element seznama."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "do mesta št. od konca"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "do mesta št."; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "do zadnjega mesta"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "ustvari podseznam od prvega mesta"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "ustvari podseznam od mesta št. od konca"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "ustvari podseznam od mesta št."; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Ustvari nov seznam, kot kopijo določenega dela seznama."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "Zadnji element je št. %1."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "Prvi element je št. %1."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "najdi prvo pojavitev elementa"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; +Blockly.Msg.LISTS_INDEX_OF_LAST = "najdi zadnjo pojavitev elementa"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Vrne mesto (indeks) prve/zadnje pojavitve elementa v seznamu. Če elementa ne najde, vrne %1."; +Blockly.Msg.LISTS_INLIST = "v seznamu"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 je prazen"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Vrne resnično, če je seznam prazen."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; +Blockly.Msg.LISTS_LENGTH_TITLE = "dolžina %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Vrne dolžino seznama."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_REPEAT_TITLE = "ustvari seznam z elementom %1, ki se ponovi %2 krat"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Ustvari seznam z danim elementom, ki se poljubno mnogo krat ponovi."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "element"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "vstavi na"; +Blockly.Msg.LISTS_SET_INDEX_SET = "nastavi na"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Vstavi element na začetek seznama."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Vstavi element na določeno mesto v seznamu."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Doda element na konec seznama."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Vstavi element na naključno mesto v seznamu."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Nastavi prvi element seznama."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Nastavi element na določenem mestu v seznamu."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Nastavi zadnji element seznama."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Nastavi naključni element seznama."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "naraščajoče"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "padajoče"; +Blockly.Msg.LISTS_SORT_TITLE = "uredi %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Uredi kopijo seznama."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "abecedno, brez velikosti črk"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "številčno"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "abecedno"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "ustvari seznam iz besedila"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "ustvari besedilo iz seznama"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Združi seznam besedil v eno besedilo, ločeno z ločilom."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Razdruži besedilo v seznam besedil. Za razdruževanje besedila uporabi ločilo."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "z ločilom"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "neresnično"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Vrne resnično ali neresnično."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "resnično"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Vrne resnično, če sta vnosa enaka."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Vrne resnično, če je prvi vnos večji od drugega."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Vrne resnično, če je prvi vnos večji ali enak drugemu."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Vrne resnično, če je prvi vnos manjši od drugega."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Vrne resnično, če je prvi vnos manjši ali enak drugemu."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Vrne resnično, če vnosa nista enaka."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg.LOGIC_NEGATE_TITLE = "ne %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Vrne resnično, če je vnos neresničen. Vrne neresnično, če je vnos resničen."; +Blockly.Msg.LOGIC_NULL = "prazno"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Vrne prazno."; +Blockly.Msg.LOGIC_OPERATION_AND = "in"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; +Blockly.Msg.LOGIC_OPERATION_OR = "ali"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Vrne resnično, če sta oba vnosa resnična."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Vrne resnično, če je vsaj eden od vnosov resničen."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "če neresnično"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "če resnično"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Preveri pogoj v »testu«. Če je pogoj resničen, potem vrne vrednost »če resnično«; sicer vrne vrednost »če neresnično«."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Vrne vsoto dveh števil."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Vrne kvocient dveh števil."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Vrne razliko dveh števil."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Vrne zmnožek dveh števil."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Vrne prvo število na potenco drugega števila."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "spremeni %1 za %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Prišteje število k spremenljivki '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Vrne eno izmed običajnih konstant: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ali ∞ (neskončno)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; +Blockly.Msg.MATH_CONSTRAIN_TITLE = "omeji %1 na najmanj %2 in največ %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Omeji število, da bo med določenima (vključenima) mejama."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "je deljivo s/z"; +Blockly.Msg.MATH_IS_EVEN = "je sodo"; +Blockly.Msg.MATH_IS_NEGATIVE = "je negativno"; +Blockly.Msg.MATH_IS_ODD = "je liho"; +Blockly.Msg.MATH_IS_POSITIVE = "je pozitivno"; +Blockly.Msg.MATH_IS_PRIME = "je praštevilo"; +Blockly.Msg.MATH_IS_TOOLTIP = "Preveri, če je število sodo, liho, praštevilo, celo, pozitivno, negativno ali, če je deljivo z določenim številom. Vrne resnično ali neresnično."; +Blockly.Msg.MATH_IS_WHOLE = "je celo"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "ostanek pri %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Vrne ostanek pri deljenju dveh števil."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Število."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "povprečje seznama"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maksimum seznama"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana seznama"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimum seznama"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modus seznama"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "naključni element seznama"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standardni odklon seznama"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "vsota seznama"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Vrne povprečje (aritmetično sredino) števil na seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Vrne največje število na seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Vrne mediano števil na seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Vrne najmanjše število na seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Vrne seznam najpogostejšega elementa(-ov) na seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Vrne naključno število izmed števil na seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Vrne standardni odklon seznama."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Vrne vsoto vseh števil na seznamu."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "naključni ulomek"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Vrne naključni ulomek med (vključno) 0.0 in 1.0 (izključno)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "naključno število med %1 in %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Vrne naključno število med dvema določenima mejama, vključno z mejama."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "zaokroži"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "zaokroži navzdol"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "zaokroži navzgor"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Zaokroži število navzgor ali navzdol."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolutno"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "kvadratni koren"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Vrne absolutno vrednost števila."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Vrne e na potenco števila."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Vrne naravni logaritem števila."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Vrne desetiški logaritem števila."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Vrne negacijo števila."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Vrne 10 na potenco števila."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Vrne kvadratni koren števila."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "acos"; +Blockly.Msg.MATH_TRIG_ASIN = "asin"; +Blockly.Msg.MATH_TRIG_ATAN = "atan"; +Blockly.Msg.MATH_TRIG_COS = "cos"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; +Blockly.Msg.MATH_TRIG_TAN = "tan"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Vrne arkus kosinus števila."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Vrne arkus sinus števila."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Vrne arkus tangens števila."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Vrne kosinus kota v stopinjah (ne radianih)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Vrne sinus kota v stopinjah (ne radianih)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Vrne tangens kota v stopinjah (ne radianih)."; +Blockly.Msg.NEW_VARIABLE = "Ustvari spremenljivko ..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Ime nove spremenljivke:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "dovoli korake"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "s/z:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Izvede uporabniško funkcijo '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Izvede uporabniško funkcijo '%1' in uporabi njen izhod."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "s/z:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Ustvari '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Opišite funkcijo ..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "nekaj"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "izvedi"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Ustvari funkcijo brez izhoda."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "vrni"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Ustvari funkcijo z izhodom."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Pozor: Ta funkcija ima podvojene parametre."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Označi definicijo funkcije"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Če je vrednost resnična, vrne drugo vrednost."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Pozor: To kocko lahko uporabiš samo znotraj definicije funkcije."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "ime vnosa:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Funkciji doda vnos."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "vnosi"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Doda, odstrani ali spremeni vrstni red vnosov te funkcije."; +Blockly.Msg.REDO = "Ponovi"; +Blockly.Msg.REMOVE_COMMENT = "Odstrani komentar"; +Blockly.Msg.RENAME_VARIABLE = "Preimenuj spremenljivko..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Preimenuj vse spremenljivke '%1' v:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "dodaj besedilo"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg.TEXT_APPEND_TO = "k"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Doda besedilo k spremenljivki '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "v male črke"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "v Velike Začetnice"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "v VELIKE ČRKE"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Vrne kopijo besedila v drugi obliki."; +Blockly.Msg.TEXT_CHARAT_FIRST = "vrni prvo črko"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "vrni črko št. od konca"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "vrni črko št."; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "iz besedila"; +Blockly.Msg.TEXT_CHARAT_LAST = "vrni zadnjo črko"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "vrni naključno črko"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Vrne črko na določenem mestu v besedilu."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Doda element k besedilu."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "združi"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Doda, odstrani ali spremeni vrstni red elementov tega besedila."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "do črke št. od konca"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "do črke št."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "do zadnje črke"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "iz besedila"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "vrni del od prve črke"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "vrni del od črke št. od konca"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "vrni del od črke št."; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Vrne določen del besedila."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "v besedilu"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "najdi prvo pojavitev besedila"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "najdi zadnjo pojavitev besedila"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Vrne mesto (indeks) prve/zadnje pojavitve drugega besedila v prvem besedilu. Če besedila ne najde, vrne %1."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 je prazno"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Vrne resnično, če je določeno besedilo prazno."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "ustvari besedilo iz"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Ustvari besedilo tako, da združi poljubno število elementov."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg.TEXT_LENGTH_TITLE = "dolžina %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Vrne število črk oz. znakov (vključno s presledki) v določenem besedilu."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg.TEXT_PRINT_TITLE = "izpiši %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Izpiše določeno besedilo, število ali drugo vrednost."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Vpraša uporabnika za vnos števila."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Vpraša uporabnika za vnos besedila."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "vprašaj za število s sporočilom"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "vprašaj za besedilo s sporočilom"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Črka, beseda ali vrstica besedila."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "odstrani presledke z obeh strani"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "odstrani presledke z leve strani"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "odstrani presledke z desne strani"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Vrne kopijo besedila z odstranjenimi presledki z ene ali obeh strani."; +Blockly.Msg.TODAY = "Danes"; +Blockly.Msg.UNDO = "Razveljavi"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Ustvari 'nastavi %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Vrne vrednost spremenljivke."; +Blockly.Msg.VARIABLES_SET = "nastavi %1 na %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Ustvari 'vrni %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Nastavi, da je vrednost spremenljivke enaka vnosu."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Spremenljivka »%1« že obstaja."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/sq.js b/src/opsoro/server/static/js/blockly/msg/js/sq.js similarity index 88% rename from src/opsoro/apps/visual_programming/static/blockly/msg/js/sq.js rename to src/opsoro/server/static/js/blockly/msg/js/sq.js index 79ccfbc..fb7b49e 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/sq.js +++ b/src/opsoro/server/static/js/blockly/msg/js/sq.js @@ -7,10 +7,8 @@ goog.provide('Blockly.Msg.sq'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "Vendos nje Koment"; -Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated Blockly.Msg.CHANGE_VALUE_TITLE = "Ndrysho Vlerat:"; -Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!"; // untranslated -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "Pastro blloqet"; Blockly.Msg.COLLAPSE_ALL = "Mbyll blloqet"; Blockly.Msg.COLLAPSE_BLOCK = "Mbyll bllokun"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "Ngjyra 1"; @@ -62,7 +60,10 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "përsërit derisa"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "përsërit përderisa"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Përderisa një vlerë është e pasaktë, atëherë ekzekuto disa fjali."; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Përderisa një vlerë është e saktë, atëherë ekzekuto disa fjali."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Fshijë të gjitha %1 të blloqeve?"; Blockly.Msg.DELETE_BLOCK = "Fshij bllokun"; +Blockly.Msg.DELETE_VARIABLE = "Fshi variablën '%1'"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Fshi përdorimin %1 të variablës '%2'?"; Blockly.Msg.DELETE_X_BLOCKS = "Fshij %1 blloqe"; Blockly.Msg.DISABLE_BLOCK = "Çaktivizo bllokun"; Blockly.Msg.DUPLICATE_BLOCK = "Kopjo"; @@ -91,18 +92,15 @@ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "i rastësishëm"; Blockly.Msg.LISTS_GET_INDEX_REMOVE = "largo"; Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Rikthen tek artikulli i par në list."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Kthen një send në pozicionin e specifikuar në listë. #1 është sendi i fundit."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Kthen një send në pozicionin e specifikuar në listë. #1 është sendi i parë."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Kthen një send në pozicionin e specifikuar në listë."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Kthen artikullin e fundit në list."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Kthen një send të rastësishëm në listë."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Fshin dhe kthen sendin e parë në listë."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Fshin dhe kthen sendin në pozicionin e specifikuar në listë. #1 është sendi i fundit."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Fshin dhe kthen sendin në pozicionin e specifikuar në listë. #1 është sendi i parë."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Fshin dhe kthen sendin në pozicionin e specifikuar në listë."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Fshin dhe kthen sendin e fundit në listë."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Fshin dhe kthen një send të rastësishëm në listë."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Fshin sendin e parë në listë."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Fshin sendin në pozicionin e specifikuar në listë. #1 është sendi i fundit."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Fshin sendin në pozicionin e specifikuar në listë. #1 është sendi i parë."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Fshin sendin në pozicionin e specifikuar në listë."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Fshin sendin e fundit në listë."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Kthen një send të rastësishëm në listë."; Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "tek # nga fundi"; @@ -114,10 +112,12 @@ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "merr nën listën nga # nga fund Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "merr nën-listën nga #"; Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Krijon në kopje të pjesës së specifikuar të listës."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 është sendi i fundit."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 është sendi i parë."; Blockly.Msg.LISTS_INDEX_OF_FIRST = "gjen ndodhjen e parë të sendit"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "gjen ndodhjen e fundit të sendit"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Kthen indeksin e ndodhjes së parë/fudit të sendit në listë. Kthen 0 nëse teksti nuk është gjetur."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Kthen indeksin e ndodhjes së parë/fudit të sendit në listë. Kthen %1 nëse teksti nuk është gjetur."; Blockly.Msg.LISTS_INLIST = "në listë"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 është e zbraztë"; @@ -128,23 +128,32 @@ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Kthen gjatësinë e listës."; Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_REPEAT_TITLE = "krijo listën me sendin %1 të përsëritur %2 herë"; Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Krijon në listë qe përmban vlerën e dhënë të përsëritur aq herë sa numri i specifikuar."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "sikurse"; Blockly.Msg.LISTS_SET_INDEX_INSERT = "fut në"; Blockly.Msg.LISTS_SET_INDEX_SET = "vendos"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Fut sendin në fillim të listës."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Fut sendin në pozicionin e specifikuar të listës. #1 është sendi i fundit."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Fut sendin në pozicionin e specifikuar të listës. #1 është sendi i parë."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Fut sendin në pozicionin e specifikuar të listës."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Bashkangjit sendin në fund të listës."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Fut sendin rastësisht në listë."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Vendos sendin e parë në listë."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Vendos sendin ne pozicionin e specifikuar në listë. #1 është sendi i fundit."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Vendos sendin në pozicionin e specifikuar në listë. #1 është sendi i parë."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Vendos sendin në pozicionin e specifikuar në listë."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Vendos sendin e fundit në listë."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Vendos një send të rastësishëm në listë."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ngjitje"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "zbritje"; +Blockly.Msg.LISTS_SORT_TITLE = "rendit %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Rendit një kopje të listës."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alfabetike, injoro madhësinë e shkronjave"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numerike"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabetike"; Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "bëj listë nga teksti"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "bëj tekst nga lista"; Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated @@ -187,7 +196,7 @@ Blockly.Msg.MATH_CHANGE_TITLE = "ndrysho %1 nga %2"; Blockly.Msg.MATH_CHANGE_TOOLTIP = "Shto një numër në ndryshoren '%1'."; Blockly.Msg.MATH_CONSTANT_HELPURL = "http://en.wikipedia.org/wiki/Mathematical_constant"; Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Kthen një nga konstantet e përbashkëta: : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infiniti)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "detyro %1 e ulët %2 e lartë %3"; Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Vëni një numër që të jetë në mes të kufive të specifikuara(përfshirëse)."; Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; @@ -258,19 +267,18 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Kthe tg-1 e nje numeri."; Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Kthe kosinusin e nje grade (jo ne radiant)."; Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Kthe kosinusin e nje kendi (jo ne radiant)."; Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Kthe tangentin e nje kendi (jo radiant)."; -Blockly.Msg.ME = "Me"; // untranslated -Blockly.Msg.NEW_VARIABLE = "Identifikatorë i ri..."; +Blockly.Msg.NEW_VARIABLE = "Krijo variabël..."; Blockly.Msg.NEW_VARIABLE_TITLE = "Emri i identifikatorit të ri:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "me:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Lësho funksionin e definuar nga përdoruesi '%1'."; Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Lëho funksionin e definuar nga përdoruesi '%1' dhe përdor daljen e tij."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "me:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Krijo '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "bëj diqka"; @@ -281,12 +289,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "rikthe"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Krijon një funksion me një dalje."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Paralajmërim: Ky funksion ka parametra të dyfishuar."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Thekso definicionin e funksionit"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Nëse një vlerë është e saktë, atëherë kthe një vlerë të dytë."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Paralajmërim: Ky bllok mund të përdoret vetëm brenda definicionit të funksionit."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Fut emrin:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Informacioni i futur"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Ribëj"; Blockly.Msg.REMOVE_COMMENT = "Fshij komentin"; Blockly.Msg.RENAME_VARIABLE = "Ndrysho emrin variables..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Ndrysho emrin e te gjitha '%1' variablave ne :"; @@ -308,6 +318,9 @@ Blockly.Msg.TEXT_CHARAT_LAST = "merr shkronjen e fundit"; Blockly.Msg.TEXT_CHARAT_RANDOM = "merr nje shkronje te rastesishme"; Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Kthe nje shkronje nga nje pozicion i caktuar."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Shto nje gje ne tekst"; Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "bashkangjit"; Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Shto, fshij, ose rirregullo sektoret për ta rikonfiguruar këtë bllok teksti."; @@ -326,7 +339,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "ne tekst"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "gjej rastisjen e pare te tekstit"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "gjej rastisjen e fundit te tekstit"; Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Pergjigjet me indeksin e pare/fundit te rastisjes se tekstit te pare ne tekstin e dyte. Pergjigjet me 0 ne qofte se teksti nuk u gjet."; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Pergjigjet me indeksin e pare/fundit te rastisjes se tekstit te pare ne tekstin e dyte. Pergjigjet me %1 ne qofte se teksti nuk u gjet."; Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 eshte bosh"; Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Kthehet e vertete neqoftese teksti i dhene eshte bosh."; @@ -344,6 +357,12 @@ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Kerkoji perdoruesit nje numer."; Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Kerkoji perdoruesit ca tekst."; Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "kerko nje numer me njoftim"; Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "kerko tekst me njoftim"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated Blockly.Msg.TEXT_TEXT_HELPURL = "http://en.wikipedia.org/wiki/String_(computer_science)"; Blockly.Msg.TEXT_TEXT_TOOLTIP = "Nje shkronje, fjale, ose rresht teksti."; Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated @@ -351,7 +370,8 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "prit hapesirat nga te dyja anet"; Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "prit hapesirat nga ana e majte"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "prit hapesirat nga ana e djathte"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Pergjigju me nje kopje te tekstit me hapesira te fshira nga njera ane ose te dyja anet."; -Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.TODAY = "Sot"; +Blockly.Msg.UNDO = "Zhbëj"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "send"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Krijo 'vendos %1"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated @@ -360,13 +380,13 @@ Blockly.Msg.VARIABLES_SET = "vendos %1 ne %2"; Blockly.Msg.VARIABLES_SET_CREATE_GET = "Krijo 'merr %1"; Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "Vendos kete variable te jete e barabarte me te dhenat ne hyrje."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Një variabël e quajtur '%1' tashmë ekziston."; Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; @@ -374,9 +394,19 @@ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/sr.js b/src/opsoro/server/static/js/blockly/msg/js/sr.js new file mode 100644 index 0000000..2da842a --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/sr.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.sr'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Додај коментар"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Промените вредност:"; +Blockly.Msg.CLEAN_UP = "Уклони блокове"; +Blockly.Msg.COLLAPSE_ALL = "Скупи блокове"; +Blockly.Msg.COLLAPSE_BLOCK = "Скупи блок"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "боја 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "боја 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "однос"; +Blockly.Msg.COLOUR_BLEND_TITLE = "помешај"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Помешати две боје заједно са датим односом (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://sr.wikipedia.org/wiki/Боја"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Изаберите боју са палете."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "случајна боја"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Изаберите боју насумице."; +Blockly.Msg.COLOUR_RGB_BLUE = "плава"; +Blockly.Msg.COLOUR_RGB_GREEN = "зелена"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "црвена"; +Blockly.Msg.COLOUR_RGB_TITLE = "боја са"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Креирај боју са одређеном количином црвене,зелене, и плаве. Све вредности морају бити између 0 и 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "Изађите из петље"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "настави са следећом итерацијом петље"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Напусти садржај петље."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Прескочи остатак ове петље, и настави са следећом итерацијом(понављанјем)."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Упозорење: Овај блок може да се употреби само унутар петље."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "за сваку ставку %1 на списку %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "За сваку ставку унутар листе, подеси промењиву '%1' по ставци, и онда начини неке изјаве-наредбе."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "преброј са %1 од %2 до %3 од %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Имај промењиву \"%1\" узми вредности од почетног броја до задњег броја, бројећи по одређеном интервалу, и изврши одређене блокове."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Додајте услов блоку „ако“."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Додај коначни, catch-all (ухвати све) услове иф блока."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Додај, уклони, или преуреди делове како бих реконфигурисали овај иф блок."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "иначе"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "иначе-ако"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "ако"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "ако је вредност тачна, онда изврши неке наредбе-изјаве."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "ако је вредност тачна, онда изврши први блок наредби, У супротном, изврши други блок наредби."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Ако је прва вредност тачна, онда изврши први блок наредби, у супротном, ако је друга вредност тачна , изврши други блок наредби."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Ако је прва вредност тачна, онда изврши први блок наредби, у супротном, ако је друга вредност тачна , изврши други блок наредби. Ако ни једна од вредности није тачна, изврши последнји блок наредби."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://sr.wikipedia.org/wiki/For_петља"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "изврши"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "понови %1 пута"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Одрадити неке наредбе неколико пута."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "понављати до"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "понављати док"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Док вредност није тачна, онда извршити неке наредбе."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Док је вредност тачна, онда извршите неке наредбе."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Да обришем свих %1 блокова?"; +Blockly.Msg.DELETE_BLOCK = "Обриши блок"; +Blockly.Msg.DELETE_VARIABLE = "Обриши променљиву '%1'"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Да обришем %1 употреба променљиве '%2'?"; +Blockly.Msg.DELETE_X_BLOCKS = "Обриши %1 блокова"; +Blockly.Msg.DISABLE_BLOCK = "Онемогући блок"; +Blockly.Msg.DUPLICATE_BLOCK = "Дуплирај"; +Blockly.Msg.ENABLE_BLOCK = "Омогући блок"; +Blockly.Msg.EXPAND_ALL = "Прошири блокове"; +Blockly.Msg.EXPAND_BLOCK = "Прошири блок"; +Blockly.Msg.EXTERNAL_INPUTS = "Спољни улази"; +Blockly.Msg.HELP = "Помоћ"; +Blockly.Msg.INLINE_INPUTS = "Унутрашњи улази"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "направи празан списак"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "враћа листу, дужине 0, не садржавајући евиденцију података"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "списак"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Додајте, избришите, или преуредите делове како би се реорганизовали овај блок листе."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "направи списак са"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Додајте ставку на списак."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Креирај листу са било којим бројем ставки."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "прва"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# са краја"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "преузми"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "преузми и уклони"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "последња"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "случајна"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "уклони"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Враћа прву ставку на списку."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Враћа ставку на одређену позицију на листи."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Враћа последњу ставку на списку."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Враћа случајну ставку са списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Уклања и враћа прву ставку са списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Уклања и враћа ставку са одређеног положаја на списку."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Уклања и враћа последњу ставку са списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Уклања и враћа случајну ставку са списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Уклања прву ставку са списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Уклања ставку са одређеног положаја на списку."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Уклања последњу ставку са списка."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Уклања случајну ставку са списка."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "до # од краја"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "до #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "до последње"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "преузми подсписак од прве"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "преузми подсписак из # са краја"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "преузми подсписак од #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Прави копију одређеног дела листе."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 је последња ставка."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 је прва ставка."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "пронађи прво појављивање ставке"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "пронађи последње појављивање ставке"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Враћа број првог и/последњег уласка елемента у листу. Враћа %1 Ако елемент није пронађен."; +Blockly.Msg.LISTS_INLIST = "на списку"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 је празан"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Враћа вредност тачно ако је листа празна."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "дужина списка %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Враћа дужину списка."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "Направити листу са ставком %1 која се понавлја %2 пута"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Прави листу која се састоји од задане вредности коју понавлјамо одређени број шута."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "као"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "убаци на"; +Blockly.Msg.LISTS_SET_INDEX_SET = "постави"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Убацује ставку на почетак списка."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Убацује ставку на одређени положај на списку."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Додајте ставку на крај списка."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Убацује ставку на случајно место на списку."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Поставља прву ставку на списку."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Поставља ставку на одређени положај на списку."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Поставља последњу ставку на списку."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Поставља случајну ставку на списку."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "растуће"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "опадајуће"; +Blockly.Msg.LISTS_SORT_TITLE = "сортирај %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Сортирајте копију списка."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "азбучно, игнориши мала и велика слова"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "као бројеве"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "азбучно"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "направите листу са текста"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "да текст из листе"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Да се придружи листу текстова у један текст, подељених за раздвајање."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Поделити текст у листу текстова, разбијање на сваком граничник."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "са раздвајање"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "нетачно"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Враћа или тачно или нетачно."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "тачно"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://sr.wikipedia.org/wiki/Неједнакост"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Враћа вредност „тачно“ ако су оба улаза једнака."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Враћа вредност „тачно“ ако је први улаз већи од другог."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Враћа вредност „тачно“ ако је први улаз већи или једнак другом."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Враћа вредност „тачно“ ако је први улаз мањи од другог."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Враћа вредност „тачно“ ако је први улаз мањи или једнак другом."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Враћа вредност „тачно“ ако су оба улаза неједнака."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "није %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Враћа вредност „тачно“ ако је улаз нетачан. Враћа вредност „нетачно“ ако је улаз тачан."; +Blockly.Msg.LOGIC_NULL = "без вредности"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Враћа „без вредности“."; +Blockly.Msg.LOGIC_OPERATION_AND = "и"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "или"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Враћа вредност „тачно“ ако су оба улаза тачна."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Враћа вредност „тачно“ ако је бар један од улаза тачан."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "проба"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "ако је нетачно"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "ако је тачно"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Провери услов у 'test'. Ако је услов тачан, тада враћа 'if true' вредност; у другом случају враћа 'if false' вредност."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Вратите збир два броја."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Враћа количник два броја."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Враћа разлику два броја."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Враћа производ два броја."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Враћа први број степенован другим."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "промени %1 за %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Додајте број променљивој „%1“."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://sr.wikipedia.org/wiki/Математичка_константа"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "врати једну од заједничких константи: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), или ∞ (infinity)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "ограничи %1 ниско %2 високо %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Ограничава број на доње и горње границе (укључиво)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "је дељив са"; +Blockly.Msg.MATH_IS_EVEN = "је паран"; +Blockly.Msg.MATH_IS_NEGATIVE = "је негативан"; +Blockly.Msg.MATH_IS_ODD = "је непаран"; +Blockly.Msg.MATH_IS_POSITIVE = "је позитиван"; +Blockly.Msg.MATH_IS_PRIME = "је прост"; +Blockly.Msg.MATH_IS_TOOLTIP = "Провјерава да ли је број паран, непаран, прост, цио, позитиван, негативан, или да ли је делјив са одређеним бројем. Враћа тачно или нетачно."; +Blockly.Msg.MATH_IS_WHOLE = "је цео"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://sr.wikipedia.org/wiki/Конгруенција"; +Blockly.Msg.MATH_MODULO_TITLE = "подсетник од %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Враћа подсетник од дељења два броја."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Неки број."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "просек списка"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "макс. списка"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "медијана списка"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "мин. списка"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "модус списка"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "случајна ставка списка"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "стандардна девијација списка"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "збир списка"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Враћа просек нумеричких вредности са списка."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Враћа највећи број са списка."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Враћа медијану са списка."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Враћа најмањи број са списка."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Враћа најчешће ставке са списка."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Враћа случајни елемент са списка."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Враћа стандардну девијацију списка."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Враћа збир свих бројева са списка."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://sr.wikipedia.org/wiki/Генератор_случајних_бројева"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "случајни разломак"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Враћа случајни разломак између 0.0 (укључиво) и 1.0 (искључиво)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://sr.wikipedia.org/wiki/Генератор_случајних_бројева"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "сличајно одабрани цијели број од %1 до %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Враћа случајно одабрани цели број између две одређене границе, уклјучиво."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://sr.wikipedia.org/wiki/Заокруживање"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "заокружи"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "заокружи наниже"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "заокружи навише"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Заокружите број на већу или мању вредност."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://sr.wikipedia.org/wiki/Квадратни_корен"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "апсолутан"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "квадратни корен"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Враћа апсолутну вредност броја."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "вратити е на власти броја."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Враћа природни логаритам броја."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Враћа логаритам броја са основом 10."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Враћа негацију броја."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Враћа 10-ти степен броја."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Враћа квадратни корен броја."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "арц цос"; +Blockly.Msg.MATH_TRIG_ASIN = "арц син"; +Blockly.Msg.MATH_TRIG_ATAN = "арц тан"; +Blockly.Msg.MATH_TRIG_COS = "цос"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://sr.wikipedia.org/wiki/Тригонометријске_функције"; +Blockly.Msg.MATH_TRIG_SIN = "син"; +Blockly.Msg.MATH_TRIG_TAN = "тан"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Враћа аркус косинус броја."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Враћа аркус броја."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Враћа аркус тангенс броја."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Враћа косинус степена (не радијан)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Враћа синус степена (не радијан)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Враћа тангенс степена (не радијан)."; +Blockly.Msg.NEW_VARIABLE = "Направи променљиву…"; +Blockly.Msg.NEW_VARIABLE_TITLE = "Име нове променљиве:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "дозволити изреке"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "са:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://sr.wikipedia.org/sr-ec/Potprogram?%2"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Покрените прилагођену функцију „%1“."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://sr.wikipedia.org/sr-ec/Potprogram?%2"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Покрените прилагођену функцију „%1“ и користи њен излаз."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "са:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Направи „%1“"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Описати ову функцију..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "урадите нешто"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "да"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Прави функцију без излаза."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "врати"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Прави функцију са излазом."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Упозорење: Ова функција има дупликате параметара."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Истакни дефиницију функције"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Уколико је вредност тачна, врати другу вредност."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Упозорење: Овај блок се може користити једино у дефиницији функције."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "назив улаза:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Додајте улазна функција."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "улази"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Да додате, уклоните или переупорядочить улаза за ову функцију."; +Blockly.Msg.REDO = "Понови"; +Blockly.Msg.REMOVE_COMMENT = "Уклони коментар"; +Blockly.Msg.RENAME_VARIABLE = "Преименуј променљиву…"; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Преименујте све „%1“ променљиве у:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "додај текст"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "на"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Додајте текст на променљиву „%1“."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "малим словима"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "свака реч великим словом"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "великим словима"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Враћа примерак текста са другачијом величином слова."; +Blockly.Msg.TEXT_CHARAT_FIRST = "преузми прво слово"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "преузми слово # са краја"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "преузми слово #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "у тексту"; +Blockly.Msg.TEXT_CHARAT_LAST = "преузми последње слово"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "преузми случајно слово"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Враћа слово на одређени положај."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Додајте ставку у текст."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "спајањем"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Додај, уклони, или другачије поредај одјелке како би изнова поставили овај текст блок."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "слову # са краја"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "слову #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "последњем слову"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "у тексту"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "преузми подниску из првог слова"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "преузми подниску из слова # са краја"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "преузми подниску из слова #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Враћа одређени део текста."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "у тексту"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "пронађи прво појављивање текста"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "пронађи последње појављивање текста"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Враћа однос првог/заднјег појавлјиванја текста у другом тексту. Врађа %1 ако текст није пронађен."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 је празан"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Враћа тачно ако је доставлјени текст празан."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "напиши текст са"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Направити дио текста спајајући различите ставке."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "дужина текста %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Враћа број слова (уклјучујући размаке) у датом тексту."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "прикажи %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Прикажите одређени текст, број или другу вредност на екрану."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Питајте корисника за број."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Питајте корисника за унос текста."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "питај за број са поруком"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "питај за текст са поруком"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://sr.wikipedia.org/wiki/Ниска"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Слово, реч или ред текста."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "трим празнине са обе стране"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "скратити простор са леве стране"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "скратити простор са десне стране"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Враћа копију текста са уклонјеним простором са једног од два краја."; +Blockly.Msg.TODAY = "Данас"; +Blockly.Msg.UNDO = "Опозови"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "ставка"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Направи „постави %1“"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Враћа вредност ове променљиве."; +Blockly.Msg.VARIABLES_SET = "постави %1 у %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Направи „преузми %1“"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Поставља променљиву тако да буде једнака улазу."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Променљива под именом '%1' већ постоји."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/sv.js b/src/opsoro/server/static/js/blockly/msg/js/sv.js new file mode 100644 index 0000000..359bb61 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/sv.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.sv'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Lägg till kommentar"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Ändra värde:"; +Blockly.Msg.CLEAN_UP = "Rada upp block"; +Blockly.Msg.COLLAPSE_ALL = "Fäll ihop block"; +Blockly.Msg.COLLAPSE_BLOCK = "Fäll ihop block"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "färg 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "färg 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "förhållande"; +Blockly.Msg.COLOUR_BLEND_TITLE = "blanda"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blandar ihop två färger med ett bestämt förhållande (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://sv.wikipedia.org/wiki/Färg"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Välj en färg från paletten."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "slumpfärg"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Slumpa fram en färg."; +Blockly.Msg.COLOUR_RGB_BLUE = "blå"; +Blockly.Msg.COLOUR_RGB_GREEN = "grön"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "röd"; +Blockly.Msg.COLOUR_RGB_TITLE = "färg med"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Skapa en färg med det angivna mängden röd, grön och blå. Alla värden måste vara mellan 0 och 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "bryt ut ur loop"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "fortsätta med nästa upprepning av loop"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Bryt ut ur den innehållande upprepningen."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Hoppa över resten av denna loop och fortsätt med nästa loop."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Varning: Detta block kan endast användas i en loop."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "för varje föremål %1 i listan %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "För varje objekt i en lista, ange variabeln '%1' till objektet, och utför sedan några kommandon."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "räkna med %1 från %2 till %3 med %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Låt variabeln \"%1\" ta värden från starttalet till sluttalet, beräknat med det angivna intervallet, och utför de angivna blocken."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Lägg till ett villkor blocket \"om\"."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Lägg till ett sista villkor som täcker alla alternativ som är kvar för \"if\"-blocket."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Lägg till, ta bort eller ändra ordningen för sektioner för att omkonfigurera blocket \"om\"."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "annars"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "annars om"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "om"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Om ett värde är sant, utför några kommandon."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Om värdet är sant, utför det första kommandoblocket. Annars utför det andra kommandoblocket."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Om det första värdet är sant, utför det första kommandoblocket. Annars, om det andra värdet är sant, utför det andra kommandoblocket."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Om det första värdet är sant, utför det första kommandoblocket. Annars, om det andra värdet är sant, utför det andra kommandoblocket. Om ingen av värdena är sanna, utför det sista kommandoblocket."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "utför"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "upprepa %1 gånger"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Utför några kommandon flera gånger."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "upprepa tills"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "upprepa medan"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Medan ett värde är falskt, utför några kommandon."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Medan ett värde är sant, utför några kommandon."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Radera alla %1 block?"; +Blockly.Msg.DELETE_BLOCK = "Radera block"; +Blockly.Msg.DELETE_VARIABLE = "Radera variabeln \"%1\""; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Radera %1 användningar av variabeln \"%2\"?"; +Blockly.Msg.DELETE_X_BLOCKS = "Radera %1 block"; +Blockly.Msg.DISABLE_BLOCK = "Inaktivera block"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplicera"; +Blockly.Msg.ENABLE_BLOCK = "Aktivera block"; +Blockly.Msg.EXPAND_ALL = "Fäll ut block"; +Blockly.Msg.EXPAND_BLOCK = "Fäll ut block"; +Blockly.Msg.EXTERNAL_INPUTS = "Externa inmatningar"; +Blockly.Msg.HELP = "Hjälp"; +Blockly.Msg.INLINE_INPUTS = "Radinmatning"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "skapa tom lista"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Ger tillbaka en lista utan någon data, alltså med längden 0"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Lägg till, ta bort eller ändra ordningen på objekten för att göra om det här \"list\"-blocket."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "skapa lista med"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Lägg till ett föremål till listan."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Skapa en lista med valfritt antal föremål."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "första"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# från slutet"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "hämta"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "hämta och ta bort"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "sista"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "slumpad"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "ta bort"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returnerar det första objektet i en lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Ger tillbaka objektet på den efterfrågade positionen i en lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returnerar det sista objektet i en lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returnerar ett slumpmässigt objekt i en lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Tar bort och återställer det första objektet i en lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Tar bort och återställer objektet på den specificerade positionen i en lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Tar bort och återställer det sista objektet i en lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Tar bort och återställer ett slumpmässigt objekt i en lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Tar bort det första objektet i en lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Tar bort objektet på den specificerade positionen i en lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Tar bort det sista objektet i en lista."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Tar bort en slumpmässig post i en lista."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "till # från slutet"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "till #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "till sista"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "få underlista från första"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "få underlista från # från slutet"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "få underlista från #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Skapar en kopia av den specificerade delen av en lista."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 är det sista objektet."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 är det första objektet."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "hitta första förekomsten av objektet"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "hitta sista förekomsten av objektet"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Ger tillbaka den första/sista förekomsten av objektet i listan. Returnerar %1 om objektet inte hittas."; +Blockly.Msg.LISTS_INLIST = "i listan"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 är tom"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returnerar sant om listan är tom."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "längden på %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returnerar längden på en lista."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "skapa lista med föremålet %1 upprepat %2 gånger"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Skapar en lista som innehåller ett valt värde upprepat ett bestämt antalet gånger."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "som"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "Sätt in vid"; +Blockly.Msg.LISTS_SET_INDEX_SET = "ange"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "sätter in objektet i början av en lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Sätter in objektet vid en specificerad position i en lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Lägg till objektet i slutet av en lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "sätter in objektet på en slumpad position i en lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Anger det första objektet i en lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sätter in objektet vid en specificerad position i en lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Anger det sista elementet i en lista."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sätter in ett slumpat objekt i en lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "stigande"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "fallande"; +Blockly.Msg.LISTS_SORT_TITLE = "sortera %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sortera en kopia av en lista."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alfabetiskt, ignorera skiftläge"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeriskt"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabetiskt"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "skapa lista från text"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "skapa text från lista"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Sammanfoga en textlista till en text, som separeras av en avgränsare."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Dela upp text till en textlista och bryt vid varje avgränsare."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "med avgränsare"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "falskt"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returnerar antingen sant eller falskt."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "sant"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://sv.wikipedia.org/wiki/Olikhet"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Ger tillbaka sant om båda värdena är lika med varandra."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Ger tillbaka sant om det första värdet är större än det andra."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Ger tillbaka sant om det första värdet är större än eller lika med det andra."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Ger tillbaka sant om det första värdet är mindre än det andra."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Ger tillbaka sant om det första värdet är mindre än eller lika med det andra."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Ger tillbaka sant om båda värdena inte är lika med varandra."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "inte %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Ger tillbaka sant om inmatningen är falsk. Ger tillbaka falskt och inmatningen är sann."; +Blockly.Msg.LOGIC_NULL = "null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://sv.wikipedia.org/wiki/Null"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returnerar null."; +Blockly.Msg.LOGIC_OPERATION_AND = "och"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "eller"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Ger tillbaka sant om båda värdena är sanna."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Ger tillbaka sant om minst ett av värdena är sant."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "om falskt"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "om sant"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Kontrollera villkoret i \"test\". Om villkoret är sant, ge tillbaka \"om sant\"-värdet; annars ge tillbaka \"om falskt\"-värdet."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://sv.wikipedia.org/wiki/Aritmetik"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Returnerar summan av de två talen."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Returnerar kvoten av de två talen."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Returnerar differensen mellan de två talen."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Returnerar produkten av de två talen."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Ger tillbaka det första talet upphöjt till det andra talet."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "ändra %1 med %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Lägg till ett tal till variabeln '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://sv.wikipedia.org/wiki/Matematisk_konstant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Returnerar en av de vanliga konstanterna: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) eller ∞ (oändligt)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "begränsa %1 till mellan %2 och %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Begränsa ett tal till att mellan de angivna gränsvärden (inkluderande)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "är delbart med"; +Blockly.Msg.MATH_IS_EVEN = "är jämnt"; +Blockly.Msg.MATH_IS_NEGATIVE = "är negativt"; +Blockly.Msg.MATH_IS_ODD = "är ojämnt"; +Blockly.Msg.MATH_IS_POSITIVE = "är positivt"; +Blockly.Msg.MATH_IS_PRIME = "är ett primtal"; +Blockly.Msg.MATH_IS_TOOLTIP = "Kontrollera om ett tal är jämnt, ojämnt, helt, positivt, negativt eller det är delbart med ett bestämt tal. Returnerar med sant eller falskt."; +Blockly.Msg.MATH_IS_WHOLE = "är helt"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "resten av %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Returnerar kvoten från divisionen av de två talen."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://sv.wikipedia.org/wiki/Tal"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Ett tal."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "medelvärdet av listan"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "högsta talet i listan"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "medianen av listan"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minsta talet i listan"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "typvärdet i listan"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "slumpmässigt objekt i listan"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standardavvikelsen i listan"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "summan av listan"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Ger tillbaka medelvärdet (aritmetiskt) av de numeriska värdena i listan."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Ger tillbaka det största talet i listan."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Returnerar medianen av talen i listan."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Ger tillbaka det minsta talet i listan."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Ger tillbaka en lista med de(t) vanligaste objekte(t/n) i listan."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Returnerar ett slumpmässigt element från listan."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Ger tillbaka standardavvikelsen i listan."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Ger tillbaka summan av alla talen i listan."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://sv.wikipedia.org/wiki/Slumptalsgenerator"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "slumpat decimaltal"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Ger tillbaka ett slumpat decimaltal mellan 0.0 (inkluderat) och 1.0 (exkluderat)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://sv.wikipedia.org/wiki/Slumptalsgenerator"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "slumpartat heltal från %1 till %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Ger tillbaka ett slumpat heltal mellan två värden, inkluderande."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://sv.wikipedia.org/wiki/Avrundning"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "avrunda"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "avrunda nedåt"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "avrunda uppåt"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Avrunda ett tal uppåt eller nedåt."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://sv.wikipedia.org/wiki/Kvadratrot"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolut"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "kvadratrot"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Returnerar absolutvärdet av ett tal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Ger tillbaka e upphöjt i ett tal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Returnera den naturliga logaritmen av ett tal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Returnerar logaritmen för bas 10 av ett tal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Returnerar negationen av ett tal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Ger tillbaka 10 upphöjt i ett tal."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Returnerar kvadratroten av ett tal."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "arccos"; +Blockly.Msg.MATH_TRIG_ASIN = "arcsin"; +Blockly.Msg.MATH_TRIG_ATAN = "arctan"; +Blockly.Msg.MATH_TRIG_COS = "cos"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://sv.wikipedia.org/wiki/Trigonometrisk_funktion"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; +Blockly.Msg.MATH_TRIG_TAN = "tan"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Ger tillbaka arcus cosinus (arccos) för ett tal."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Ger tillbaka arcus sinus (arcsin) för ett tal."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Ger tillbaka arcus tangens (arctan) av ett tal."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Ger tillbaka cosinus för en grad (inte radian)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Ger tillbaka sinus för en grad (inte radian)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Ger tillbaka tangens för en grad (inte radian)."; +Blockly.Msg.NEW_VARIABLE = "Skapa variabel..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nytt variabelnamn:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "tillåta uttalanden"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "med:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Kör den användardefinierade funktionen \"%1\"."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Kör den användardefinierade funktionen \"%1\" och använd resultatet av den."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "med:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Skapa '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Beskriv denna funktion..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "göra något"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "för att"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Skapar en funktion utan output."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "returnera"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Skapar en funktion med output."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Varning: Denna funktion har dubbla parametrar."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Markera funktionsdefinition"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Om ett värde är sant returneras ett andra värde."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Varning: Detta block får användas endast i en funktionsdefinition."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "inmatningsnamn:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Lägg till en inmatning till funktionen."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inmatningar"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Lägg till, ta bort och ändra ordningen för inmatningar till denna funktion."; +Blockly.Msg.REDO = "Gör om"; +Blockly.Msg.REMOVE_COMMENT = "Radera kommentar"; +Blockly.Msg.RENAME_VARIABLE = "Byt namn på variabel..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Byt namn på alla'%1'-variabler till:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "lägg till text"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "till"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Lägg till lite text till variabeln '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "till gemener"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "till Versala Initialer"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "till VERSALER"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Returnerar en kopia av texten i ett annat skiftläge."; +Blockly.Msg.TEXT_CHARAT_FIRST = "hämta första bokstaven"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "hämta bokstaven # från slutet"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "hämta bokstaven #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "i texten"; +Blockly.Msg.TEXT_CHARAT_LAST = "hämta sista bokstaven"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "hämta slumpad bokstav"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Ger tillbaka bokstaven på den specificerade positionen."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Lägg till ett föremål till texten."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "sammanfoga"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Lägg till, ta bort eller ändra ordningen för sektioner för att omkonfigurera detta textblock."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "till bokstav # från slutet"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "till bokstav #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "till sista bokstaven"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "i texten"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "få textdel från första bokstaven"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "få textdel från bokstav # från slutet"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "få textdel från bokstav #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Ger tillbaka en viss del av texten."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "i texten"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "hitta första förekomsten av texten"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "hitta sista förekomsten av texten"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Ger tillbaka indexet för den första/sista förekomsten av första texten i den andra texten. Ger tillbaka %1 om texten inte hittas."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 är tom"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returnerar sant om den angivna texten är tom."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "skapa text med"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Skapa en textbit genom att sammanfoga ett valfritt antal föremål."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "längden på %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Ger tillbaka antalet bokstäver (inklusive mellanslag) i den angivna texten."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "skriv %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Skriv den angivna texten, talet eller annat värde."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Fråga användaren efter ett tal."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Fråga användaren efter lite text."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "fråga efter ett tal med meddelande"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "fråga efter text med meddelande"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://sv.wikipedia.org/wiki/Str%C3%A4ng_%28data%29"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "En bokstav, ord eller textrad."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "ta bort mellanrum från båda sidorna av"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "ta bort mellanrum från vänstra sidan av"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "ta bort mellanrum från högra sidan av"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Returnerar en kopia av texten med borttagna mellanrum från en eller båda ändar."; +Blockly.Msg.TODAY = "Idag"; +Blockly.Msg.UNDO = "Ångra"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "föremål"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Skapa \"välj %1\""; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returnerar värdet av denna variabel."; +Blockly.Msg.VARIABLES_SET = "ange %1 till %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Skapa 'hämta %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Gör så att den här variabeln blir lika med inputen."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "En variabel som heter \"%1\" finns redan."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ta.js b/src/opsoro/server/static/js/blockly/msg/js/ta.js similarity index 91% rename from src/opsoro/apps/visual_programming/static/blockly/msg/js/ta.js rename to src/opsoro/server/static/js/blockly/msg/js/ta.js index 2e3e745..f2143ba 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/ta.js +++ b/src/opsoro/server/static/js/blockly/msg/js/ta.js @@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.ta'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "கருத்தை சேர்"; -Blockly.Msg.AUTH = "தயவுச்செய்து இச்செயலியை அங்கீகரித்து உங்கள் வேலையைச் சேமித்து பகிரரும்படி அனுமதிக்கவும்."; Blockly.Msg.CHANGE_VALUE_TITLE = "மதிப்பை மாற்றவும்:"; -Blockly.Msg.CHAT = "இந்தப் பெட்டியில் தட்டச்சு செய்வதன் மூலம் கூட்டுப்பணியாளருடன் உரையாடலாம்!"; Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated Blockly.Msg.COLLAPSE_ALL = "உறுப்புகளை மரை"; Blockly.Msg.COLLAPSE_BLOCK = "உறுப்பை மரை"; @@ -62,7 +60,10 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "பலமுரை திர Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "பலமுரை திரும்ப செய் (வரை)"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "மாறி பொய் ஆக உள்ள வரை, கட்டளைகளை இயக்கு"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "மாறி உண்மை ஆக உள்ள வரை, கட்டளைகளை இயக்கு"; +Blockly.Msg.DELETE_ALL_BLOCKS = "அனைத்து %1 நிரல் துண்டுகளையும் அழிக்கவா??"; Blockly.Msg.DELETE_BLOCK = "உறுப்பை நீக்கு"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated Blockly.Msg.DELETE_X_BLOCKS = "%1 உறுப்பை நீக்கு"; Blockly.Msg.DISABLE_BLOCK = "உறுப்பை இயங்காது செய்"; Blockly.Msg.DUPLICATE_BLOCK = "மறுநகல்"; @@ -91,18 +92,15 @@ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "ஏதோ ஒன்று"; Blockly.Msg.LISTS_GET_INDEX_REMOVE = "நீக்குக"; Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "பட்டியல் முதல் உருப்படியை பின்கொடு,"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "பட்டியலில் இடத்தில் உருப்படி பின்கொடு. #1 முதல் உருப்படி."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "பட்டியலில் இடத்தில் உருப்படி பின்கொடு. #1 முதல் உருப்படி."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "பட்டியலில் இடத்தில் உருப்படி பின்கொடு."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "பட்டியல் கடைசி உருப்படியை பின்கொடு,"; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "பட்டியல் சீரற்ற உருப்படியை பின்கொடு,"; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "பட்டியல் முதல் உருப்படியை நீக்கியபின் பின்கொடு,"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கி பின்கொடு. #1 கடைசி உருப்படி."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கி பின்கொடு. #1 கடைசி உருப்படி."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கி பின்கொடு."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "பட்டியல் இறுதி உருப்படியை நீக்கியபின் பின்கொடு,"; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "பட்டியல் சீரற்ற உருப்படியை நீக்கியபின் பின்கொடு,"; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "பட்டியலில் முதல் உருப்படியை நீக்கு"; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "பட்டியலில் கேட்ட இடத்தின் உருப்படியை நீக்கு. #1 கடைசி உருப்படி."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கு. #1 முதல் உருப்படி."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கு."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "பட்டியலில் கடைசி உருப்படியை நீக்கு"; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "பட்டியல் சீரற்ற உருப்படியை நீக்கு,"; Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "முடிவில் இருந்து # வரை"; @@ -114,10 +112,12 @@ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "# கடைசியில் Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "பகுதி பட்டியலை # இடத்தில் இருந்து கொடு"; Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "குறிப்பட்ட பகுதி பட்டியலின் நகலை கொடு"; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 கடைசி உருப்படி.ி"; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 முதல் உருப்படி."; Blockly.Msg.LISTS_INDEX_OF_FIRST = "உரையில் முதல் தோற்ற இடத்தை காட்டு"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "உரையில் கடைசி தோற்ற இடத்தை காட்டு"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "பட்டியலில் மதிப்பின் முதல், கடைசி தோற்ற இடத்தை பின்கொடு. காணாவிட்டால் 0 பின்கொடு."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "பட்டியலில் மதிப்பின் முதல், கடைசி தோற்ற இடத்தை பின்கொடு. காணாவிட்டால் %1 பின்கொடு."; Blockly.Msg.LISTS_INLIST = "பட்டியலில் உள்ள"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 காலியானது"; @@ -128,20 +128,29 @@ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "பட்டியல் நீளம் ப Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_REPEAT_TITLE = "உருப்படி %1-யை, %2 தடவைகள் உள்ளவாறு ஒரு பட்டியலை உருவாக்கு"; Blockly.Msg.LISTS_REPEAT_TOOLTIP = "கொடுக்க பட்ட மதிப்பை, கூறியுள்ள தடவைகள் உள்ளவாறு ஒரு பட்டியலை உருவாக்கு"; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "இதுபொல"; Blockly.Msg.LISTS_SET_INDEX_INSERT = "அவ்விடத்தில் நுழை"; Blockly.Msg.LISTS_SET_INDEX_SET = "நியமி"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "மதிப்பை பட்டியலின் முதலில் நுழை"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "பட்டியலில் கேட்ட இடத்தில் உருப்படியை நுழை. #1, கடைசி உருப்படி."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "பட்டியலில் கேட்ட இடத்தில் உருப்படியை நுழை. #1, முதல் உருப்படி."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "பட்டியலில் கேட்ட இடத்தில் உருப்படியை நுழை."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "மதிப்பை பட்டியலின் முடிவில் நுழை"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "மதிப்பை பட்டியலின் சீற்ற இடத்தில் நுழை"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "மதிப்பை பட்டியலில் முதல் உருப்படியில் வை"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "பட்டியலில் கேட்ட இடத்தில் உருப்படியை வை. #1, கடைசி உருப்படி."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "பட்டியலில் கேட்ட இடத்தில் உருப்படியை வை. #1, முதல் உருப்படி."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "பட்டியலில் கேட்ட இடத்தில் உருப்படியை வை."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "மதிப்பை பட்டியலில் கடைசி உருப்படியில் வை"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "மதிப்பை பட்டியலில் சீரற்ற உருப்படியில் வை"; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "உரையில் இருந்து பட்டியல் உருவாக்கு"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "பட்டியலில் இருந்து உரை உருவாக்கு"; @@ -187,7 +196,7 @@ Blockly.Msg.MATH_CHANGE_TITLE = "மாற்று %1 மூலம் %2"; Blockly.Msg.MATH_CHANGE_TOOLTIP = "எண்னை '%1' மதிப்பால் கூட்டு,"; Blockly.Msg.MATH_CONSTANT_HELPURL = "https://ta.wikipedia.org/wiki/%E0%AE%95%E0%AE%A3%E0%AE%BF%E0%AE%A4_%E0%AE%AE%E0%AE%BE%E0%AE%B1%E0%AE%BF%E0%AE%B2%E0%AE%BF"; Blockly.Msg.MATH_CONSTANT_TOOLTIP = "ஒரு மாறிலியை பின்கொடு π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (முடிவிலி)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "%1 மாறியை %2 மேலும் %3 கீழும் வற்புறுத்து"; Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "எண் மாறி வீசுகளம் உள்ளடங்கிய வாறு வற்புறுத்து"; Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated @@ -258,35 +267,36 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "மதிப்பின் நேர் Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "டிகிரீ கோசைன் மதிப்பை பின்கொடு"; Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "டிகிரீ சைன் மதிப்பை பின்கொடு."; Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "டிகிரீ டேஞ்சன்டு மதிப்பை பின்கொடு"; -Blockly.Msg.ME = "எனக்கு"; Blockly.Msg.NEW_VARIABLE = "புதிய மாறிலி..."; Blockly.Msg.NEW_VARIABLE_TITLE = "புதிய மாறிலியின் பெயர்:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "வாக்குமூலங்களை அனுமதிக்கவும்"; Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "இத்துடன்"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "பயனரின் '%1' செயற்கூற்றை ஓட்டு."; Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "பயனரின் '%1' செயற்கூற்றை ஓட்டி வரும் வெளியீட்டை பயன்படுத்து."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "இத்துடன்:"; Blockly.Msg.PROCEDURES_CREATE_DO = "'%1' உருவாக்குக"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "கட்டளைகள் செய்ய (இடம்காட்டி)"; Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "இந்த மாறியிற்கு"; Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "வெளியீடு இல்லாத ஒரு செயல்பாடு உருவாக்குகிறது"; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "பின்கொடு"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "வெளியீடு உள்ள ஒரு செயல்பாடு உருவாக்குகிறது"; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "எச்சரிக்கை: இந்த செயற்கூறில் போலியான அளபுருக்கள் உண்டு."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "நிரல்பாகத்தை விளக்கமாக காட்டு"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "மதிப்பு உண்மையானால், இரண்டாவது மதிப்பை பின்கொடு."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "பெயரை உள்ளிடுக:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "செயல்கூறுக்கு ஒரு உள்ளீட்டை சேர்."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "உள்ளீடுகள்"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "செயல்கூறுகளின் உள்ளீட்டை சேர், நீக்கு, or மீண்டும் வரிசை செய்."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "கருத்தை நீக்கு"; Blockly.Msg.RENAME_VARIABLE = "மாறிலியை மறுபெயரிடுக..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "அனைத்து '%1' மாறிலிகளையும் பின்வருமாறு மறுபெயரிடுக:"; @@ -308,6 +318,9 @@ Blockly.Msg.TEXT_CHARAT_LAST = "இறுதி எழுத்தைப் ப Blockly.Msg.TEXT_CHARAT_RANDOM = "சமவாய்ப்புள்ள எழுத்தை எடு"; Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated Blockly.Msg.TEXT_CHARAT_TOOLTIP = "கூறிய இடத்தில் உள்ள எழுத்தை எடு"; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "உருபடியை உரையில் சேர்க்க."; Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "சேர்க்க"; Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "தொகுப்பு உரை திருத்துதம் செய்"; @@ -344,6 +357,12 @@ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "எண்-உள்ளீடு தூ Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "உரை-உள்ளீடு தூண்டுதலை காட்டு"; Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "உரை கொண்டு எண்-உள்ளீடு தூண்டுதலை காட்டு"; Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "உரை கொண்டு உரை-உள்ளீடு தூண்டுதலை காட்டு"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated Blockly.Msg.TEXT_TEXT_HELPURL = "https://ta.wikipedia.org/wiki/%E0%AE%9A%E0%AE%B0%E0%AE%AE%E0%AF%8D_%28%E0%AE%95%E0%AE%A3%E0%AE%BF%E0%AE%A9%E0%AE%BF%E0%AE%AF%E0%AE%BF%E0%AE%AF%E0%AE%B2%E0%AF%8D%29"; Blockly.Msg.TEXT_TEXT_TOOLTIP = "எழுத்து, சரம், சொல், அல்லது உரை சொற்தொடர்."; Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated @@ -352,6 +371,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "இடது பக்கத்தில Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "வலது பக்கத்தில் இடைவெளி எழுத்து நேர்த்தி செய்."; Blockly.Msg.TEXT_TRIM_TOOLTIP = "உரை நகல் எடுத்து இடைவெளி எழுத்து நீக்கி பின்கொடு."; Blockly.Msg.TODAY = "இன்று"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "உருப்படி"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "'%1 நியமி' உருவாக்கு"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated @@ -360,13 +380,13 @@ Blockly.Msg.VARIABLES_SET = "நியமி %1 இந்த மாறியி Blockly.Msg.VARIABLES_SET_CREATE_GET = "'எடு %1' உருவாக்கு"; Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "மாறியின் மதிப்பாய் உள்ளீட்டு மதிப்பை வை."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; @@ -374,9 +394,19 @@ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/tcy.js b/src/opsoro/server/static/js/blockly/msg/js/tcy.js new file mode 100644 index 0000000..9c99266 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/tcy.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.tcy'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "ಟಿಪ್ಪಣಿ ಸೇರ್ಸಲೆ"; +Blockly.Msg.CHANGE_VALUE_TITLE = "ಮೌಲ್ಯೊದ ಬದಲಾವಣೆ"; +Blockly.Msg.CLEAN_UP = "ನಿರ್ಬಂದೊಲೆನ್ ಸ್ವೊಚ್ಚೊ ಮಲ್ಪುಲೆ"; +Blockly.Msg.COLLAPSE_ALL = "ಕುಗ್ಗಿಸಾದ್ ನಿರ್ಬಂಧಿಸಾಪುನೆ"; +Blockly.Msg.COLLAPSE_BLOCK = "ಕುಗ್ಗಿಸಾದ್ ತಡೆಪತ್ತುನೆ"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "ಬಣ್ಣೊ ೧(ಒಂಜಿ)"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "ಬಣ್ಣೊ ೨(ರಡ್ಡ್)"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "ಅನುಪಾತೊ"; +Blockly.Msg.COLOUR_BLEND_TITLE = "ಮಿಸ್ರನೊ"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "ಕೊರ್‍ನ ಅನುಪಾತೊದ ಒಟ್ಟುಗೆ (0.0- 1.0 ) ರಡ್ಡ್ ಬಣ್ಣೊಲೆನ್ ಜೊತೆಟ್ ಒಂಜಿ ಮಲ್ಪುಂಡು."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/ಬಣ್ಣೊ"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "ವರ್ಣಫಲಕೊದ ಒಂಜಿ ಬಣ್ಣೊದ ಆಯ್ಕೆ."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "ಯಾದೃಚ್ಛಿಕೊ ಬಣ್ಣೊ"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "ಯಾದೃಚ್ಛಿಕವಾಯಿನ ಬಣ್ಣೊದ ಆಯ್ಕೆ."; +Blockly.Msg.COLOUR_RGB_BLUE = "ನೀಲಿ"; +Blockly.Msg.COLOUR_RGB_GREEN = "ಪಚ್ಚೆ"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "ಕೆಂಪು ಬಣ್ಣೊ"; +Blockly.Msg.COLOUR_RGB_TITLE = "ಬಣ್ಣೊದೊಟ್ಟುಗೆ"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "ತೋಜಿಪಾಯಿನ ಕೆಂಪು, ಪಚ್ಚೆ ಬುಕ್ಕೊ ನೀಲಿ ಬಣ್ಣೊದ ಪ್ರಮಾಣೊನು ರಚಿಸಲೆ. ಮಾಂತ ಮೌಲ್ಯೊಲು 0 ಬುಕ್ಕೊ 100 ನಡುಟೆ ಇಪ್ಪೊಡು."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "ಕುಣಿಕೆದ ಪಿದಯಿ ತುಂಡಾಪುಂಡು"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "ದುಂಬುದ ಆದೇಸೊಡೆ ಪುನರಾವರ್ತನೆ ದುಂಬರಿಪ್ಪುಂಡು"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "ಬಳಕೆಡುಪ್ಪುನ ಕೊಲಿಕೆಡ್ದ್ ಪಿದಯಿ ಪಾಡ್‍ಲೆ"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "ದುಂಬುದ ಆವೃತಿಡ್ ಉಪ್ಪುನಂಚನೆ ಮಾಂತ ಕೊಲಿಕೆಲೆನ್ ದೆತ್ಪುಲೆ ಬುಕ್ಕೊ ದುಂಬರಿಲೆ"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "ಎಚ್ಚರೊ: ಈ ನಿರ್ಬಂದೊನು ಕೇವಲ ಒಂಜಿ ಕೊಲಿಕೆದಾಕಾರೊದ ಮುಕ್ತಮಾರ್ಗೊದ ಪರಿಮಿತಿದುಲಯಿಡ್ ಬಳಸೊಲಿ"; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "ಅತ್ತಂದೆ ಪ್ರತೀ ಅಂಸೊ %1ದ ಉಲಯಿ %2ದ ಪಟ್ಟಿ"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಪ್ರತಿ ವಸ್ತುಗು, ಜೋಡಾಯಿನ ವಸ್ತು ಬದಲಾಪುನಂಚ '% 1', ಬುಕ್ಕೊ ಒಂತೆ ಹೇಳಿಕೆಲೆನ್ ಮಲ್ಲಪುಲೆ."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "%1ಡ್ದ್ %2ಗ್ ಮುಟ್ಟ %3 ಬುಕ್ಕೊ %4ನ್ ಒಟ್ಟೂಗು ಗೆನ್ಪಿ"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "ಸುರೂತ ನಂಬ್ರೊಡ್ದು ಅಕೇರಿದ ನಂಬ್ರೊಗು ಬಿಲೆಟ್ ಮಸ್ತ್ ಹೆಚ್ಚ್‌ಕಮ್ಮಿ ಇತ್ತ್ಂಡಲಾ %1 ದೆತೊಂದ್, ನಿರ್ದಿಸ್ಟೊ ಮಧ್ಯಂತರೊದ ಮೂಲಕೊ ಲೆಕ್ಕೊದೆತೊಂದು ಬುಕ್ಕೊ ನಿಗಂಟ್ ಮಲ್ತ್‌ನ ಬ್ಲಾಕ್‍ಲೆನ್ ಲೆಕ್ಕೊ ಮಲ್ಪುಲ."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "ಒಂಜಿ ವೇಲೆ ಒಂಜಿ ತಡೆಕ್ ಈ ಪರಿಸ್ಥಿತಿನ್ ಸೇರಲೆ"; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "ಒಂಜಿ ವೇಲೆ ಮಾಂತೆನ್ಲಾ ದೀಡೊಂದು ಅಕೇರಿದ ಪರಿಸ್ಥಿಡ್ ಸೇರಲೆ"; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "ಸೇರಲ, ದೆತ್ತ್‌ ಪಾಡ್‌ಲ, ಅತ್ತಂಡ ಒಂಜಿ ವೇಲೆ ಈ ರಚನೆನ್ ತಡೆದ್, ಇಂದೆತ ಇಬಾಗೊಲೆನ್ ಬೇತೆ ಕ್ರಮೊಟು ಮಲ್ಪುಲೆ"; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "ಬೇತೆ"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "ಬೇತೆ ಸಮಯೊ"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "ಒಂಜಿ ವೇಲೆ"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "ಇಂದೆತ ಮೌಲ್ಯೊ ನಿಜವಾದಿತ್ತ್‌ಂಡ, ಬುಕ್ಕೊ ಒಂತೆ ನಿರೂಪಣೆಲೆನ್ ಮಲ್ಪುಲೆ"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "ಇಂದೆತ ಮೌಲ್ಯೊ ನಿಜವಾದಿತ್ತ್‌ಂಡ, ಬುಕ್ಕೊದ ನಿರೂಪಣೆಲೆನ್ ಸುರೂಕು ಮಲ್ಪುಲೆ. ಅತ್ತಂಡ ರಡ್ಡನೆದ ನಿರೂಪಣೆನ್ ತಡೆ ಪತ್ತುನಂಚನೆ ಮಲ್ಲಪುಲೆ"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "ಸುರೂತ ಮೌಲ್ಯೊ ನಿಜವಾದಿತ್ತ್‌ಂಡ, ಬುಕ್ಕೊದ ನಿರೂಪಣೆಲೆನ್ ಸುರೂಕು ತಡೆ ಮಲ್ಪುಲೆ. ಅತ್ತಂಡ ರಡ್ಡನೆದ ನಿರೂಪಣೆನ್ ನಿಜವಾದಿತ್ತ್‌ಂಡ ಬುಕ್ಕೊ ಒಂತೆ ನಿರೂಪಣೆಲೆನ್ ಮಲ್ಪುಲೆ"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "ಸುರೂತ ಮೌಲ್ಯೊ ನಿಜವಾದಿತ್ತ್‌ಂಡ, ಸುರೂತ ನಿರೂಪಣೆನ್ ತಡೆ ಮಲ್ಪುಲೆ. ರಡ್ಡನೆದ ನಿರೂಪಣೆ ನಿಜವಾದಿತ್ತ್ಂಡ, ರಡ್ಡನೆದ ನಿರೂಪಣೆನ್ ತಡೆ ಮಲ್ಪುಲೆ. ಉಂದು ಒವ್ವೇ ಮೌಲ್ಯೊ ನಿಜವಾದಿದ್ಯಂಡ, ಅಕೇರಿದ ನಿರೂಪಣೆನ್ ತಡೆ ಮಲ್ಪುಲೆ."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "ಮಲ್ಪು / ಅಂಚನೆ"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "ನಾನೊರೊ %1 ಸಮಯೊಗು"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "ಕೆಲವು ಹೇಳಿಕೆಲೆನ್ ಮಸ್ತ್ ಸಮಯೊ ಮಲ್ಪೊಡು"; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ಬುಕ್ಕೊ ಮುಟ್ಟೊ"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ಬುಕ್ಕೊ ಅಂಚನೇ"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "ಈ ತಿರ್ತ್‍ದ ತಪ್ಪಾದುಂಡು, ಬುಕ್ಕೊದ ಕೆಲವು ಹೇಳಿಕೆಲೆನ್ ಮಲ್ಪಪುಲ"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "ಈ ತಿರ್ತ್‌ದ ಸರಿ ಇತ್ತ್ಂಡಲಾ, ಬುಕ್ಕೊದ ಕೆಲವು ಹೇಳಿಕೆಲೆನ್ ಮಲ್ಪುಲ"; +Blockly.Msg.DELETE_ALL_BLOCKS = "ಮಾತ %1 ನಿರ್ಬಂದೊಲೆನ್ ದೆತ್ತ್ ಪಾಡ್ಲೆ ?"; +Blockly.Msg.DELETE_BLOCK = "ಮಾಜಯರ ತಡೆಯಾತ್ಂಡ್"; +Blockly.Msg.DELETE_VARIABLE = "ಬದಲಾಯಿನೆಡ್ದ್ %1 ಮಾಜಲೆ"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "ಗಳಸ್‍ನ '%2' ಬದಲಾವನೆಡ್ %1 ಮಾಜಲೆ?"; +Blockly.Msg.DELETE_X_BLOCKS = "ಮಾಜಯರ ಶೇಕಡಾ ೧ ತಡೆಯಾತ್ಂಡ್"; +Blockly.Msg.DISABLE_BLOCK = "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಾದ್ ತಡೆಪತ್ತುನೆ"; +Blockly.Msg.DUPLICATE_BLOCK = "ನಕಲ್"; +Blockly.Msg.ENABLE_BLOCK = "ಸಕ್ರಿಯಗೊಳಿಸಾದ್ ತಡೆಪತ್ತುನೆ"; +Blockly.Msg.EXPAND_ALL = "ವಿಸ್ತರಿಸಾದ್ ನಿರ್ಬಂದಿಸಾಪುನೆ"; +Blockly.Msg.EXPAND_BLOCK = "ವಿಸ್ತರಿಸಾದ್ ತಡೆಪತ್ತುನೆ"; +Blockly.Msg.EXTERNAL_INPUTS = "ಬಾಹ್ಯೊ ಪರಿಕರೊ"; +Blockly.Msg.HELP = "ಸಹಾಯೊ"; +Blockly.Msg.INLINE_INPUTS = "ಉಳಸಾಲ್‍ದ ಉಳಪರಿಪು"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "ಕಾಲಿ ಪಟ್ಟಿನ್ ಸ್ರಿಸ್ಟಿಸಲೆ"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "ಒಂಜಿ ಪಟ್ಟಿ, ೦ದ ಉದ್ದೊ, ಒವ್ವೇ ಅಂಕಿಅಂಸೊ ಇದ್ಯಾಂತಿನ ದಾಖಲೆ ಪಿರಕೊರು."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "ಪಟ್ಟಿ"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "ಸೇರಯರ, ದೆತ್ತ್‌ ಪಾಡೆರೆ ಅತ್ತಂಡ ಈ ಪಟ್ಯೊಲೆನ್ ತಡೆದ್ ಪತ್ತ್‌ದ್ ಇಬಾಗೊ ಮಲ್ಪುಲೆ."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "ಜತೆ ಪಟ್ಟಿನ್ ರಚಿಸಲೆ"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "ಪಟ್ಟಿಡ್ ಕೆಲವು ಅಂಸೊಲೆನ್ ಸೇರಲೆ."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "ಒವ್ವೇ ಸಂಖ್ಯೆದ ಪಟ್ಟಿಲೆ ಅಂಸೊದೊಟ್ಟುಗೆ ರಚಿಸಲೆ"; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "ಸುರುತ"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# ಅಕೇರಿಡ್ದ್"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "ದೆತೊನು"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "ದೆತೊನಿಯರ ಬುಕ್ಕೊ ದೆಪ್ಪೆರೆ"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "ಕಡೆತ"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "ಗೊತ್ತು ಗುರಿದಾಂತಿನ"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "ದೆಪ್ಪುಲೆ"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "ಸುರುತ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ಪಿರಕೊರು."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "ನಿರ್ದಸ್ಟೊ ಜಾಗೆಡುಪ್ಪುನ ಅಂಸೊಲೆ ಪಟ್ಟಿನ್ ಪಿರಕೊರು"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "ಅಕೇರಿದ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ಪಿರಕೊರು."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "ಗೊತ್ತುಗುರಿದಾಂತಿನ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ಪಿರಕೊರು."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "ಸುರುತ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ದೆಪ್ಪು ಅತ್ತಂಡ ಪಿರಕೊರು."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "ನಿರ್ದಿಸ್ಟೊ ಜಾಗೆಡುಪ್ಪುನ ಅಂಸೊಲೆ ಪಟ್ಟಿನ್ ದೆಪ್ಪು ಅತ್ತಂಡ ಪಿರಕೊರು"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "ಅಕೇರಿದ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ದೆಪ್ಪು ಅತ್ತಂಡ ಪಿರಕೊರು."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "ಗೊತ್ತುಗುರಿದಾಂತಿನ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ದೆಪ್ಪು ಅತ್ತಂಡ ಪಿರಕೊರು."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "ಸುರುತ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ದೆಪ್ಪು."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "ನಿರ್ದಿಸ್ಟೊ ಜಾಗೆಡುಪ್ಪುನ ಅಂಸೊಲೆ ಪಟ್ಟಿನ್ ದೆಪ್ಪುಲೆ"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "ಅಕೇರಿದ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ದೆಪ್ಪು."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "ಗೊತ್ತುಗುರಿದಾಂತಿನ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ದೆಪ್ಪು."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "ಡ್ದ್ # ಅಕೇರಿಗ್"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "ಡ್ದ್"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "ಅಕೇರಿಡ್ದ್"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "ಉಪ-ಪಟ್ಯೊನು ಸುರುಡ್ದು ದೆತೊನು"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "ಉಪ-ಪಟ್ಯೊನು ದೆತೊನು#ಅಕೇರಿಡ್ದ್"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "ಉಪ-ಪಟ್ಯೊನು ದೆತೊನು#"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "ಪಟ್ಯೊದ ನಿರ್ದಿಷ್ಟ ಬಾಗೊದ ಪ್ರತಿನ್ ಸ್ರಸ್ಟಿಸವುಂಡು."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 ಅಕೇರಿತ ಅಂಸೊ"; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 ಸುರುತ ಅಂಸೊ"; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "ದುಂಬು ಕರಿನ ಪಟ್ಯೊನು ನಾಡ್‍ಲೆ"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "ಅಕೆರಿಗ್ ಕರಿನ ಪಟ್ಯೊನು ನಾಡ್‍ಲೆ"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "ಸುರುತ ಪಟ್ಯೊದ ಸೂಚ್ಯಿ/ಅಕೇರಿಟ್ ಸಂಭವಿಸವುನ ಸುರುತ ಪಟ್ಟಯೊದುಲಯಿದ ರಡ್ಡನೆ ಪಟ್ಯೊನು ಪಿರಕೊರು. %1 ಪಟ್ಯೊ ತಿಕಂದಿತ್ತ್‌ಂಡ ಪಿರಕೊರು."; +Blockly.Msg.LISTS_INLIST = "ಪಟ್ಟಿಡ್"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ಕಾಲಿ"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "ಪಟ್ಯೊ ಕಾಲಿ ಪನ್ಪುನವು ಸತ್ಯೊ ಆಂಡ ಪಿರಕೊರು."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "%1 ಉದ್ದೊ"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "ಪಟ್ಟಿದ ಉದ್ದೊನು ಪಿರಕೊರು."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "%1 ಪಿರೊರ %2 ಕಾಲೊಡು ಪಟ್ಟಿಲೆನ ಅಂಸೊನು ರಚಿಸಲೆ."; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "ಕೊರ್‍ನ ಮೌಲ್ಯಡು ನಿರ್ದಿಷ್ಟ ಕಾಲೊಡು ಪಿರೊತ ಪಟ್ಟಿನ್ ರಚಿಸಲೆ."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "ಅಂಚ"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "ಸೇರಲ"; +Blockly.Msg.LISTS_SET_INDEX_SET = "ಮಾಲ್ಪು"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "ಸುರುತ ಅಂಸೊಲೆ ಪಟ್ಟಿನ್ ಸೇರಲ."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "ನಿರ್ದಿಸ್ಟೊ ಜಾಗೆಡುಪ್ಪುನ ಅಂಸೊಲೆ ಪಟ್ಟಿನ್ ಸೇರಲ"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "ಪಟ್ಟಿದ ಅಕೇರಿಗ್ ಈ ಅಂಸೊಲೆನ್ ಸೇರಲ."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "ಪಟ್ಟಿಗ್ ಗೊತ್ತುಗುರಿದಾಂತೆ ಅಂಸೊಲೆನ್ ಸೇರಲ."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "ಸುರುತ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ಮಾಲ್ಪು."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "ನಿರ್ದಿಸ್ಟೊ ಜಾಗೆಡುಪ್ಪುನ ಅಂಸೊಲೆ ಪಟ್ಟಿನ್ ಮಾಲ್ಪು"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "ಅಕೇರಿದ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ಮಾಲ್ಪು."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "ಗೊತ್ತುಗುರಿದಾಂತಿನ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ಮಾಲ್ಪು."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ಮಿತ್ತ್ ಪೋಪುನೆ"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "ತಿರ್ತ್ ಪೋಪುನೆ"; +Blockly.Msg.LISTS_SORT_TITLE = "%1 %2 %3 ಇಂಗಡಿಪು"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "ಪಟ್ಟಿಲೆ ಪ್ರತಿನ್ ಇಂಗಡಿಪುಲೆ"; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "ಅಕ್ಷರೊಲು, ಸಂದರ್ಭೊಡು ನಿರ್ಲಕ್ಷಿಸಲೆ"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "ಸಂಕೇತೊ"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "ಅಕ್ಷರೊಲು"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "ಪಟ್ಯೊಲೆ ಪಟ್ಟಿನ್ ತಯಾರ್ ಮಲ್ಪುಲೆ"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "ಪಟ್ಟಿದ ಪಟ್ಯೊನು ತಯಾರ್ ಮಲ್ಪುಲೆ"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "ಒಂಜಿ ಗ್ರಂತೊಡ್ದು ಒಂಜಿ ಪಟ್ಯೊದ ಪಟ್ಟಿಗ್ ಸೇರಾದ್, ಮಿತಿಸೂಚಕೊದ ಮೂಲಕೊ ಬೇತೆ ಮಲ್ಪುಲೆ."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "ಗ್ರಂತೊಲೆನ ಪಟ್ಟಿಡ್ದ್ ಪಟ್ಯೊಲೆನ್ ಬೇತೆ ಮಾಲ್ತ್‌ಂಡ,ಪ್ರತಿ ಮಿತಿಸೂಚಕೊಡು ಬೇತೆ ಆಪುಂಡು."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "ಮಿತಿಸೂಚಕೊದ ಒಟ್ಟುಗು"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "ಸುಲ್ಲು"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "ಪೂರ ಸತ್ಯೊ ಅತ್ತಂಡ ಸುಲ್ಲು ಆಂಡ ಪಿರಕೊರು"; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "ಸತ್ಯೊ"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "ರಡ್ಡ್ ಅತ್ತಂದೆ ಬೇತೆ ಸೂಚನೆಲು ನಿಜೊಕ್ಕುಲಾ ಸಮೊ ಇತ್ತ್ಂಡ ಪಿರ ಕೊರ್ಲೆ."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "ಸುರುತ ಅತ್ತಂದೆ ರಡ್ಡನೆದ ಸೂಚನೆಡ್ದ್ ನಿಜೊಕ್ಕುಲಾ ಮಲ್ಲೆ ಆದಿತ್ತ್ಂಡ ಪಿರ ಕೊರ್ಲೆ"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "ಸುರುತ ಅತ್ತಂದೆ ರಡ್ಡನೆದ ಸೂಚನೆ ನಿಜೊಕ್ಕುಲಾ ದಿಂಜ ಮಲ್ಲೆ ಅತ್ತಂಡ ಸಮೊ ಆದಿತ್ತ್ಂಡ ಪಿರ ಕೊರ್ಲೆ"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "ಸುರುತ ಅತ್ತಂದೆ ರಡ್ಡನೆದ ಸೂಚನೆ ನಿಜೊಕ್ಕುಲಾ ಒಂಜಿ ವೇಲೆ ಎಲ್ಯೆ ಆದಿತ್ತ್ಂಡ ಪಿರ ಕೊರ್ಲೆ"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "ಸುರುತ ಅತ್ತಂದೆ ರಡ್ಡನೆದ ಸೂಚನೆ ನಿಜೊಕ್ಕುಲಾ ದಿಂಜ ಎಲ್ಯೆ ಅತ್ತಂಡ ಸಮೊ ಆದಿತ್ತ್ಂಡ ಪಿರ ಕೊರ್ಲೆ"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "ರಡ್ಡ್ ಅತ್ತಂದೆ ಬೇತೆ ಸೂಚನೆಲು ನಿಜೊಕ್ಕುಲಾ ಸಮೊ ಆತಿಜಂಡ ಪಿರ ಕೊರ್ಲೆ"; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "%1 ಇದ್ದಿ"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "ನಿಜವಾದ್‍ ಇನ್‍ಪುಟ್ ಸುಲ್ಲಾದಿತ್ತ್‌ಂಡ ಪಿರಕೊರು. ನಿಜವಾದ್ ಸುಲ್ಲು ಇನ್‍ಪುಟ್ ಇತ್ತ್‌ಂಡ ಪಿರಕೊರು"; +Blockly.Msg.LOGIC_NULL = "ಸೊನ್ನೆ"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "ಸೊನ್ನೆನ್ ಪರಿಕೊರ್ಪುಂಡು"; +Blockly.Msg.LOGIC_OPERATION_AND = "ಬುಕ್ಕೊ"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "ಅತ್ತಂಡ"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "ರಡ್ಡ್ ಸೂಚನೆಲಾ ನಿಜೊ ಆದಿತ್ತ್ಂಡ ನಿಜವಾತ್ ಪಿರಕೊರ್ಲೆ"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "ನಿಜವಾದ್‍ಲ ಒಂಜಿವೇಳೆ ಇನ್‍ಪುಟ್ ಒಂತೆ ನಿಜವಾದಿತ್ತ್ಂಡ ಪಿರಕೊರು"; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "ಪರೀಕ್ಷೆ"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "ಒಂಜಿ ವೇಲೆ ಸುಳ್ಳು"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "ಒಂಜಿ ವೇಲೆ ಸತ್ಯೊ"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "ಪರೀಕ್ಷೆದ ಸ್ಥಿತಿನ್ ಪರಿಶೀಲನೆ ಮಲ್ಲಪುಲೆ. ಪರಿಸ್ಥಿತಿ ನಿಜವಾದಿತ್ತ್ಂಡ, ನಿಜವಾಯಿನ ಮೌಲ್ಯೊನು ಪಿರಕೊರ್ಲೆ; ಅತ್ತಂಡ ತಪ್ಪು ಮೌಲ್ಯೊನೇ ಪಿರ ಕೊರ್ಲೆ."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/ಅಂಕಗಣಿತ"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "ಸಂಖ್ಯೆದ ಮೊತ್ತನ್ ಪಿರ ಕೊರು."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "ಸಂಖ್ಯೆದ ಭಾಗಲಬ್ದೊನು ಪಿರ ಕೊರು."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "ಸಂಖ್ಯೆದ ವ್ಯತ್ಯಾಸೊನು ಪರಕೊರು."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "ಸಂಖ್ಯೆದ ಉತ್ಪನ್ನೊನು ಪಿರ ಕೊರು."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "ಒಂಜನೆ ಸಂಖ್ಯೆದ ಶಕ್ತಿನ್ ರಡ್ಡನೆ ಸಂಖ್ಯೆಡ್ದ್ ಪಿರ ಹೆಚ್ಚಿಗೆ ಮಲ್ಪುಲೆ."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "%1 ಡ್ದ್ %2 ಬದಲಾಯಿಸವೊಲಿ"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "'%1' ಬದಲ್ ಮಲ್ಪುನಂಚಿನ ಒಂಜಿ ನಂಬರ್‍ನ್ ಸೇರಾವು"; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/ಗಣಿತ_ನಿರಂತರ"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "ಸಾಮಾನ್ಯವಾದ್ ಒಂಜಿ ಸ್ಥಿರವಾದಿತ್ತ್‌ಂಡ ಪಿರಕೊರು: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = " %1 ಕಮ್ಮಿ %2 ಜಾಸ್ತಿ %3 ಕಡ್ಡಾಯ ಮಲ್ಪು"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "ನಿಗದಿತ ನಿಯಮೊಗು ನಡುಟು ದಿಂಜ ನಿರ್ಬಂದೊ(ಸೇರ್‍ನಂಚ)"; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "ಭಾಗಿಸವೊಲಿಯ"; +Blockly.Msg.MATH_IS_EVEN = "ಸಮೊ ಆತ್ಂಡ್"; +Blockly.Msg.MATH_IS_NEGATIVE = "ರುನೊ ಆತ್ಂಡ್"; +Blockly.Msg.MATH_IS_ODD = "ಬೆಸೊ ಆತ್ಂಡ್"; +Blockly.Msg.MATH_IS_POSITIVE = "ಗುನೊ ಆತ್ಂಡ್"; +Blockly.Msg.MATH_IS_PRIME = "ಎಡ್ಡೆ ಆತ್ಂಡ್"; +Blockly.Msg.MATH_IS_TOOLTIP = "ಒಂಜಿ ವೇಲ್ಯೊ ಸಂಖ್ಯೆ ಸರಿ, ಬೆಸ, ಅವಿಭಾಜ್ಯ, ಇಡೀ, ಕೂಡಬುನ, ಕಲೆವುನ, ಅತ್ತಂಡ ನಿರ್ದಿಷ್ಟ ಸಂಖ್ಯೆಡ್ದ್ ಭಾಗಿಸವುಂಡಂದ್ ಪರಿಶೀಲಿಸ. ಸರಿ ಅತ್ತಂಡ ತಪ್ಪುನು ಪಿರಕೊರು."; +Blockly.Msg.MATH_IS_WHOLE = "ಮಾಂತ ಆತ್ಂಡ್"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/ಮೋಡ್ಯುಲೊ_ಒಪರೇಶನ್"; +Blockly.Msg.MATH_MODULO_TITLE = " %1 ÷ %2 ಒರಿನ ಬಾಗೊ"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "ರಡ್ಡ್ ಸಂಖ್ಯೆದ ಇಬಾಗೊಡ್ದು ಒರಿನ ಬಾಗೊನು ಪಿರಕೊರು"; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/ಸಂಖ್ಯೆ"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "ಅ ನಂಬ್ರೊ"; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "ಸರಾಸರಿ ಪಟ್ಟಿ"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "ಪಟ್ಟಿನ್ ಮಿಸ್ರೊ ಮಲ್ಪು"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "ನಡುತ ಪಟ್ಟಿ"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "ಕಿನ್ಯ ಪಟ್ಟಿ"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "ಪಟ್ಟಿದ ಇದಾನೊಲು"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "ಗೊತ್ತುಗುರಿ ದಾಂತಿನ ಅಂಸೊದ ಪಟ್ಟಿ"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "ಕಬರ್ ಪಟ್ಟಿದ ಪ್ರಮಾನೊ"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "ಒಟ್ಟು ಕೂಡಯಿನಾ ಪಟ್ಟಿ"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "ಪಟ್ಟಿಡುಪ್ಪುನ ಸರ್ವಸಾಧಾರಣ ಬಿಲೆನ್ ಪಿರಕೋರ್ಲೆ"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "ಪಟ್ಟಿದಾ ಮಲ್ಲ ಸಂಕ್ಯೆನ್ ಪಿರಕೊರು"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "ಪಟ್ಟಿದಾ ನಡುತ ಸಂಕ್ಯೆನ್ ಪಿರಕೊರು"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "ಪಟ್ಟಿದಾ ಕಿನ್ಯ ಸಂಕ್ಯೆನ್ ಪಿರಕೊರು"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "ಪಟ್ಟಿದ ಸಾಮಾನ್ಯೊ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ಪಿರಕೊರು"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "ಪಟ್ಟಿದ ಗೊತ್ತು ಗುರಿದಾಂತಿನ ಅಂಸೊಲೆನ್ ಪಿರಕೊರು"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "ಪಟ್ಟಿದ ಗುಣಮಟ್ಟೊದ ವರ್ಗೀಕರಣೊನು ಪಿರಕೊರು"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "ಪಟ್ಟಿದಾ ಮಾಂತ ಸಂಕ್ಯೆಲೆನ್ ಪಿರಕೊರ್ಲೆ"; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/ರಾಂಡಮ್_ನಂಬರ್_ಜನರೇಶನ್"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "ಗೊತ್ತುಗುರಿ ದಾಂತಿನ ಬಾಗೊ"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "0.0 (ಸೇರ್ನಂಚಿನ) and 1.0 (ಸೇರಂದಿನಂಚಿನ) ನಡುತ ಗೊತ್ತು ಗುರಿದಾಂತಿನ ಬಾಗೊನು ಪಿರಕೊರು."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/ರಾಂಡಮ್_ನಂಬರ್_ಜನರೇಶನ್"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = " %1 ಡ್ದ್ %2 ಯಾದೃಚ್ಛಿಕ ಪೂರ್ಣಾಂಕೊ"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "ರಡ್ಡ್ ನಿಗದಿತ ನಿಯಮೊದ ನಡುತ ಯಾದೃಚ್ಛಿಕ ಪೂರ್ಣಾಂಕೊನು ಪಿರಕೊರು"; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/ಪೂರ್ಣಾಂಕೊ"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "ಸುತ್ತು"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "ಸುತ್ತು ಕಡಮೆ"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "ಮುಗಿಪುನ ಸಮಯೊ"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "ಸಂಖ್ಯೆನ್ ಮಿತ್ತ್ ಅತ್ತಂಡ ತಿರ್ತ್ ರೌಂಡ್ ಮಲ್ಪು"; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/ವರ್ಗೊಮೂಲೊ"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "ಸಂಪೂರ್ನೊ"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "ವರ್ಗಮೂಲೊ"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "ಸಂಖ್ಯೆದ ಸರಿಯಾಯಿನ ಮೌಲ್ಯೊನು ಕೊರು"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "ಸಂಖ್ಯೆದ ಇ ಗ್ ಅಧಿಕಾರೊನು ಪಿರಕೊರು"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "ಸಂಖ್ಯೆದ ನಿಜವಾಯಿನ ಕ್ರಮಾವಳಿನ್ ಪಿರಕೊರು"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "ಸಂಖ್ಯೆದ ೧೦ ಮೂಲೊ ಕ್ರಮಾವಳಿನ್ ಪಿರಕೊರು"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "ಸಂಖ್ಯೆದ ನಿರಾಕರಣೆನ್ ಪಿರಕೊರು"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "ಸಂಖ್ಯೆದ ೧೦ಗ್ ಅಧಿಕಾರೊನು ಪಿರಕೊರು"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "ಸಂಖ್ಯೆದ ವರ್ಗಮೂಲೊನು ಪಿರ ಕೊರು."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/ತ್ರಿಕೋನಮಿತಿದ_ಕಾರ್ಯೊಲು"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "ಸಂಖ್ಯೆದ ಆರ್ಕ್ಕೊಸಿನ್ ಪಿರಕೊರು"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "ಪದವಿದ ಆರ್ಕ್ಸೈನ್ ಪಿರಕೊರು"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "ಸಂಖ್ಯೆದ ಆರ್ಕ್ಟ್ಯಾಂಜೆಂಟ್ ಪಿರಕೊರು"; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "ಪದವಿದ ಸಹ ಚಿಹ್ನೆನ್ ಪಿರಕೊರು"; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "ಪದವಿದ ಚಿಹ್ನೆನ್ ಪಿರಕೊರು"; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "ಪದವಿದ ಸ್ಪರ್ಶಕೊನು ಪಿರಕೊರು"; +Blockly.Msg.NEW_VARIABLE = "ಬದಲ್ ಮಲ್ಪೊಡಾಯಿನೆನ್ ರಚಿಸಲೆ"; +Blockly.Msg.NEW_VARIABLE_TITLE = "ಪುದರ್‍ದ ಪೊಸ ಬದಲಾವಣೆ:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "ಹೇಳಿಕೆಗ್ ಅವಕಾಸೊ"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "ಜೊತೆ:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/ಪ್ರೊಸಿಜರ್_%28ಕಂಪ್ಯೂಟರ್_ಸೈನ್ಸ್%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "'%1' ಬಳಕೆದಾರೆರೆ ಕಾರ್ಯೊನು ನಡಪಾಲೆ."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/ಪ್ರೊಸಿಜರ್_%28ಕಂಪ್ಯೂಟರ್_ಸೈನ್ಸ್%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = " '%1' ಬಳಕೆದಾರೆರೆ ಕಾರ್ಯೊನು ನಡಪಾಲೆ ಬುಕ್ಕೊ ಅಯಿತ ಉತ್ಪಾದನೆನ್ ಉಪಯೋಗಿಸಲೆ."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "ಜೊತೆ:"; +Blockly.Msg.PROCEDURES_CREATE_DO = " '%1'ನ್ ರಚಿಸಲೆ"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "ಈ ಕಾರ್ಯೊನು ಇವರಿಸಲೆ..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "ಎಂಚಿನಾಂಡಲ ಮಲ್ಪು"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "ಇಂದೆಕ್"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "ಉತ್ಪಾದನೆ ದಾಂತಿನ ಕಾರ್ಯೊನು ಸ್ರಿಸ್ಟಿಸಲೆ."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "ಪಿರಪೋ"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "ಉತ್ಪಾದನೆ ದಾಂತಿನ ಕಾರ್ಯೊನು ಸ್ರಿಸ್ಟಿಸಲೆ."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "ಎಚ್ಚರಿಕೆ: ಈ ಕಾರ್ಯೊ ನಕಲಿ ಮಾನದಂಡೊನು ಹೊಂದ್‍ದ್ಂಡ್."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "ದೇರ್ತ್ ತೋಜುನ ಕಾರ್ಯೊದ ವ್ಯಾಕ್ಯಾನೊ"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "ಮೌಲ್ಯೊ ಸತ್ಯೊ ಆಯಿನೆಡ್ದ್ ಬುಕ್ಕೊನೆ ರಡ್ಡನೆ ಮೌಲ್ಯೊನು ಪಿರಕೊರು."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "ಎಚ್ಚರಿಕೆ:ವ್ಯಾಕ್ಯಾನೊದ ಕಾರ್ಯೊನು ತಡೆ ಮಲ್ಪೆರೆ ಮಾತ್ರೊ ಇಂದೆತ ಉಪಯೊಗ."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "ಉಲಪರಿಪುದ ಪುದರ್:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "ಕಾರ್ಯೊದ ಉಲಪರಿಪುನು ಸೇರಲೆ."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "ಉಲಪರಿಪು"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "ಸೇರಯರ, ದೆತ್ತ್‌ ಪಾಡೆರೆ ಅತ್ತಂಡ ಪಿರಕೋರಿಕೆದ ಉಲಪರಿಪುದ ಕಾರ್ಯೊನು ಮಲ್ಪುಲೆ."; +Blockly.Msg.REDO = "ಪಿರವುದಂಚ"; +Blockly.Msg.REMOVE_COMMENT = "ಟಿಪ್ಪಣಿನ್ ದೆತ್ತ್‌ಪಾಡ್ಲೆ"; +Blockly.Msg.RENAME_VARIABLE = "ಬದಲಾವಣೆ ಆಯಿನ ಪುದರ್‍ನ್ ನಾನೊರೊ ಪನ್ಲೆ"; +Blockly.Msg.RENAME_VARIABLE_TITLE = "ನಾನೊರೊ ಪುದರ್ ಬದಲಾವಣೆ ಆಯಿನ ಮಾಂತ '% 1':"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "ಪಟ್ಯೊನು ಸೇರವೆ"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "ಇಂದೆಕ್"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "%1 ಬದಲಾಪುನ ಕೆಲವು ಪಟ್ಯೊಲೆನ್ ಸೇರಾವೊಂಡು."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "ಎಲ್ಯ ಅಕ್ಷರೊಗು"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "ತರೆಬರವುಗು"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "ಮಲ್ಲ ಅಕ್ಷರೊಗು"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "ಪಟ್ಯೊದ ಒಂಜಿ ನಕಲ್‍ನ್ ಬೇತೆ ಸಮಯೊಡು ಪಿರಕೊರು"; +Blockly.Msg.TEXT_CHARAT_FIRST = "ಸುರುಡ್ದ್ ಅಕ್ಷರೊನು ನಟೊನ್ಲ"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "ಅಕ್ಷರೊ ನಟೊನ್#ಅಕೇರಿಡ್ದ್"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "ಅಕ್ಸರೊನು ದೆತೊನುಲೆ#"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "ಪಟ್ಯೊಡು"; +Blockly.Msg.TEXT_CHARAT_LAST = "ಅಕೇರಿದ ಅಕ್ಷರೊನು ನಟೊನ್ಲ"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "ಗೊತ್ತುಗುರಿದಾಂತಿ ಅಕ್ಷರೊನು ನಟೊನ್ಲ"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "ಅಕ್ಷರೊನು ನಿರ್ದಿಷ್ಟ ಜಾಗೆಡ್ ಪಿರಕೊರು."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "ಪಟ್ಯೊಡು ಅಂಸೊಲೆನ್ ಸೇರಲೆ"; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "ಸೇರೊಲಿ"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "ಸೇರಯರ, ದೆತ್ತ್‌ ಪಾಡೆರೆ ಅತ್ತಂಡ ಈ ಪಟ್ಯೊಲೆನ್ ತಡೆದ್ ಪತ್ತ್‌ದ್ ಪಿರ ರಚಿಸಯರ ಇಬಾಗೊ ಮಲ್ಪುಲೆ."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "ಅಕ್ಷರೊಗು#ಅಕೇರಿಡ್ದ್"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "ಅಕ್ಷರೊಗು#"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "ಅಕೇರಿದ ಅಕ್ಷರೊಗು"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "ಪಟ್ಯೊಡು"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "ಉಪ ವಾಕ್ಯೊಡ್ದು ಸುರುತ ಅಕ್ಷರೊನು ನಟೊನ್ಲ"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "ಉಪ ವಾಕ್ಯೊಡ್ದು ಅಕ್ಷರೊನು ನಟೊನ್ಲ#ಅಕೇರಿಡ್ದ್"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "ಉಪ ವಾಕ್ಯೊಡ್ದು ಅಕ್ಷರೊನು ನಟೊನ್ಲ"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "ಪಟ್ಯೊನು ನಿರ್ದಿಷ್ಟ ಬಾಗೊಡು ಪಿರಕೊರು"; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "ಪಟ್ಯೊಡು"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "ಸುರುಟು ಸಂಭವಿಸಯಿನ ಪಟ್ಯೊನು ನಾಡ್‍ಲ"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "ದುಂಬು ಕರಿನ ಪಟ್ಯೊನು ನಾಡ್‍ಲೆ"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "ಸುರುತ ಪಟ್ಯೊದ ಸೂಚ್ಯಿ/ಅಕೇರಿಟ್ ಸಂಭವಿಸವುನ ಸುರುತ ಪಟ್ಟಯೊದುಲಯಿದ ರಡ್ಡನೆ ಪಟ್ಯೊನು ಪಿರಕೊರು. %1 ಪಟ್ಯೊ ತಿಕಂದಿತ್ತ್‌ಂಡ ಪಿರಕೊರು."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ಕಾಲಿ"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "ಕೊರ್‌ನ ಪಟ್ಯೊ ಕಾಲಿಂದ್ ಸತ್ಯೊ ಆಂಡ ಪಿರಕೊರು"; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "ಪಟ್ಯೊನು ರಚನೆ ಮಲ್ಪು"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "ಒವ್ವೇ ಸಂಖ್ಯೆದ ಪಟ್ಯೊದ ತುಂಡುಲೆನ್ ಒಟ್ಟೂಗೆ ಸೇರಯರ ರಚಿಸಲೆ"; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "೧% ಉದ್ದೊ"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "ಕೊರ್‌ನ ಪಟ್ಯೊದ ಅಕ್ಷರೊಲೆನ(ಅಂತರೊಲು ಸೇರ್‌ನಂಚ) ಸಂಖ್ಯೆನ್ ಪಿರಕೊರು."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "%1 ಮುದ್ರಿತ"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "ನಿರ್ದಿಷ್ಟ ಪಟ್ಯೊ, ಸಂಖ್ಯೆ ಅತ್ತಂಡ ಬೇತೆ ಮೌಲ್ಯೊನು ಮುದ್ರಿಸಲೆ."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "ದಿಂಜ ಬಳಕೆದಾರೆರೆನ್ ಕೇನುಂಡು."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "ಕೆಲವು ಪಟ್ಯೊದ ಬಳಕೆದಾರೆರೆನ್ ಕೇನುಂಡು."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "ಸಂಖ್ಯೆದೊಟ್ಟುಗೆ ಸಂದೇಸೊನು ಕೇನುಂಡು"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "ಪಟ್ಯೊದೊಟ್ಟುಗೆ ಸಂದೇಸೊನು ಕೇನುಂಡು."; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/ಸ್ಟ್ರಿಂಗ್_(ಕಂಪ್ಯೂಟರ್_ಸೈನ್ಸ್)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "ಒಂಜಿ ಅಕ್ಷರೊ, ಪದೊ ಅತ್ತಂಡ ಪಾಟೊದ ಒಂಜಿ ಸಾಲ್"; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "ರಡ್ಡ್ ಬರಿತ ಜಾಗೆನ್ಲ ಕತ್ತೆರಿಪುಲೆ."; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "ಎಡತ ಬರಿತ ಜಾಗೆನ್ ಕತ್ತೆರಿಪುಲೆ."; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "ಬಲತ ಬರಿತ ಜಾಗೆನ್ ಕತ್ತೆರಿಪುಲೆ."; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "ಒಂಜಿ ಅತ್ತಂಡ ರಡ್ಡ್ ಕೊಡಿಡ್ದ್ ದೆತ್ತ್‌ನ ಕಅಲಿ ಪಟ್ಯೊದ ಪ್ರತಿನ್ ಪಿರಕೊರು."; +Blockly.Msg.TODAY = "ಇನಿ"; +Blockly.Msg.UNDO = "ದುಂಬುದಲೆಕೊ"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "ವಸ್ತು"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "'%1' ರಚನೆ ಮಲ್ಪುಲೆ"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "ಈ ವ್ಯತ್ಯಯೊದ ಮೌಲ್ಯೊನು ಪಿರಕೊರು."; +Blockly.Msg.VARIABLES_SET = "%1 ಡ್ದು %2 ಮಲ್ಪುಲೆ"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "'%1' ರಚನೆ ಮಲ್ಪುಲೆ"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "ಉಲಯಿ ಬರ್ಪುನವು ಸಮಪಾಲ್ ಇಪ್ಪುನಂಚ ವ್ಯತ್ಯಾಸೊ ಮಾಲ್ಪು"; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "ಬದಲ್ ಮಲ್ಪೊಡಾಯಿನ '%1' ಇತ್ತೆನೆ ಅಸ್ತಿತ್ವೊಡು ಉಂಡು."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/th.js b/src/opsoro/server/static/js/blockly/msg/js/th.js new file mode 100644 index 0000000..ea9adf2 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/th.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.th'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "ใส่คำอธิบาย"; +Blockly.Msg.CHANGE_VALUE_TITLE = "เปลี่ยนค่า:"; +Blockly.Msg.CLEAN_UP = "จัดเรียงบล็อกให้เป็นแถว"; +Blockly.Msg.COLLAPSE_ALL = "ย่อบล็อก"; +Blockly.Msg.COLLAPSE_BLOCK = "ย่อบล็อก"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "สีที่ 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "สีที่ 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "อัตราส่วน"; +Blockly.Msg.COLOUR_BLEND_TITLE = "ผสม"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "ผสมสองสีเข้าด้วยกันด้วยอัตราส่วน (0.0 - 1.0)"; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://th.wikipedia.org/wiki/สี"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "เลือกสีจากจานสี"; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "สุ่มสี"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "เลือกสีแบบสุ่ม"; +Blockly.Msg.COLOUR_RGB_BLUE = "ค่าสีน้ำเงิน"; +Blockly.Msg.COLOUR_RGB_GREEN = "ค่าสีเขียว"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "ค่าสีแดง"; +Blockly.Msg.COLOUR_RGB_TITLE = "สีที่ประกอบด้วย"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "สร้างสีด้วยการกำหนดค่าสีแดง เขียว และน้ำเงิน ค่าทั้งหมดต้องอยู่ระหว่าง 0 ถึง 100"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "ออกจากการวนซ้ำ"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "เริ่มการวนซ้ำรอบต่อไป"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "ออกจากการวนซ้ำที่อยู่"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "ข้ามคำสั่งที่เหลืออยู่ และเริ่มต้นวนซ้ำรอบต่อไป"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "คำเตือน: บล็อกนี้ใช้งานได้ภายในการวนซ้ำเท่านั้น"; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "จากทุกรายการ %1 ในรายชื่อ %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "จากทุกรายการในรายชื่อ ตั้งค่าตัวแปร \"%1\" เป็นรายการ และทำตามคำสั่งที่กำหนดไว้"; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "นับด้วย %1 จาก %2 จนถึง %3 เปลี่ยนค่าทีละ %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "ตัวแปร '%1' จะเริ่มจากจำนวนเริ่มต้น ไปจนถึงจำนวนสุดท้าย ตามระยะที่กำหนด และ ทำบล็อกที่กำหนดไว้"; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "กำหนดเงื่อนไขของบล็อก \"ถ้า\""; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "เพิ่มสิ่งสุดท้าย ที่จะตรวจจับความเป็นไปได้ทั้งหมดของบล็อก \"ถ้า\""; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "เพิ่ม ลบ หรือจัดเรียงบล็อก \"ถ้า\" นี้ใหม่"; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "นอกเหนือจากนี้"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "นอกเหนือจากนี้ ถ้า"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "ถ้า"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "ว่าเงื่อนไขเป็นจริง ก็จะ \"ทำ\" ตามที่กำหนด"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "ถ้าเงื่อนไขเป็นจริง ก็จะ \"ทำ\" ตามที่กำหนด แต่ถ้าเงื่อนไขเป็นเท็จก็จะทำ \"นอกเหนือจากนี้\""; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "ถ้าเงื่อนไขแรกเป็นจริง ก็จะทำตามคำสั่งในบล็อกแรก แต่ถ้าไม่ก็จะไปตรวจเงื่อนไขที่สอง ถ้าเงื่อนไขที่สองเป็นจริง ก็จะทำตามเงื่อนไขในบล็อกที่สองนี้"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "ถ้าเงื่อนไขแรกเป็นจริง ก็จะทำคำสั่งในบล็อกแรก จากนั้นจะข้ามคำสั่งในบล็อกที่เหลือ แต่ถ้าเงื่อนไขแรกเป็นเท็จ ก็จะทำการตรวจเงื่อนไขที่สอง ถ้าเงื่อนไขที่สองเป็นจริง ก็จะทำตามคำสั่งในบล็อกที่สอง จากนั้นจะข้ามคำสั่งในบล็อกที่เหลือ แต่ถ้าทั้งเงื่อนไขแรกและเงื่อนไขที่สองเป็นเท็จทั้งหมด ก็จะมาทำบล็อกที่สาม"; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "ทำ:"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "ทำซ้ำ %1 ครั้ง"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "ทำซ้ำบางคำสั่งหลายครั้ง"; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ทำซ้ำจนกระทั่ง"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ทำซ้ำขณะที่"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "ขณะที่ค่าเป็นเท็จ ก็จะทำบางคำสั่ง"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "ขณะที่ค่าเป็นจริง ก็จะทำบางคำสั่ง"; +Blockly.Msg.DELETE_ALL_BLOCKS = "ลบ %1 บล็อกทั้งหมด?"; +Blockly.Msg.DELETE_BLOCK = "ลบบล็อก"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "ลบ %1 บล็อก"; +Blockly.Msg.DISABLE_BLOCK = "ปิดใช้งานบล็อก"; +Blockly.Msg.DUPLICATE_BLOCK = "ทำสำเนา"; +Blockly.Msg.ENABLE_BLOCK = "เปิดใช้งานบล็อก"; +Blockly.Msg.EXPAND_ALL = "ขยายบล็อก"; +Blockly.Msg.EXPAND_BLOCK = "ขยายบล็อก"; +Blockly.Msg.EXTERNAL_INPUTS = "อินพุตภายนอก"; +Blockly.Msg.HELP = "ช่วยเหลือ"; +Blockly.Msg.INLINE_INPUTS = "อินพุตในบรรทัด"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "สร้างรายการเปล่า"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "สร้างรายการเปล่า (ความยาวเป็น 0) ยังไม่มีข้อมูลใดๆ อยู่"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "รายการ"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "เพิ่ม ลบ หรือจัดเรียงบล็อกรายการนี้ใหม่"; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "สร้างข้อความด้วย"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "เพิ่มไอเท็มเข้าไปในรายการ"; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "สร้างรายการพร้อมด้วยไอเท็ม"; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "แรกสุด"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# จากท้าย"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "เรียกดู"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "เรียกดูและเอาออก"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "ท้ายสุด"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "สุ่ม"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "เอาออก"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "คืนค่าไอเท็มอันแรกในรายการ"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "คืนค่าไอเท็มอันสุดท้ายในรายการ"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "คืนค่าไอเท็มแบบสุ่มจากรายการ"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "เอาออก และคืนค่าไอเท็มอันแรกในรายการ"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "เอาออก และคืนค่าไอเท็มในตำแหน่งที่ระบุจากรายการ"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "เอาออก และคืนค่าไอเท็มอันสุดท้ายในรายการ"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "เอาออก และคืนค่าไอเท็มแบบสุ่มจากรายการ"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "เอาไอเท็มแรกสุดในรายการออก"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "เอาไอเท็มอันท้ายสุดในรายการออก"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "เอาไอเท็มแบบสุ่มจากรายการออก"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "ถึง # จากท้ายสุด"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "จนถึง #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "ถึง ท้ายสุด"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "ดึงรายการย่อยทั้งแต่แรกสุด"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "ดึงรายการย่อยจาก # จากท้ายสุด"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "ดึงรายการย่อยจาก #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "สร้างสำเนารายการในช่วงที่กำหนด"; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 คือไอเท็มอันท้ายสุด"; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 คือไอเท็มอันแรกสุด"; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "หาอันแรกที่พบ"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "หาอันสุดท้ายที่พบ"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "คืนค่าตำแหน่งของไอเท็มอันแรก/สุดท้ายที่พบในรายการ คืนค่า %1 ถ้าหาไม่พบ"; +Blockly.Msg.LISTS_INLIST = "ในรายการ"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ว่างเปล่า"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "คืนค่าเป็นจริง ถ้ารายการยังว่างเปล่า"; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "ความยาวของ %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "ส่งคืนค่าความยาวของรายการ"; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "สร้างรายการที่มีไอเท็ม %1 จำนวน %2"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "สร้างรายการที่ประกอบด้วยค่าตามที่ระบุในจำนวนตามที่ต้องการ"; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "เป็น"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "แทรกที่"; +Blockly.Msg.LISTS_SET_INDEX_SET = "กำหนด"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "แทรกไอเท็มเข้าไปเป็นอันแรกสุดของรายการ"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "แทรกไอเท็มเข้าไปในตำแหน่งที่กำหนด"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "เพิ่มไอเท็มเข้าไปท้ายสุดของรายการ"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "เพิ่มไอเท็มเข้าไปในรายการแบบสุ่ม"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "กำหนดไอเท็มอันแรกในรายการ"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "กำหนดไอเท็มในตำแหน่งที่ระบุในรายการ"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "กำหนดไอเท็มอันสุดท้ายในรายการ"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "กำหนดไอเท็มแบบสุ่มในรายการ"; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "น้อยไปหามาก"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "มากไปหาน้อย"; +Blockly.Msg.LISTS_SORT_TITLE = "เรียงลำดับ %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "เรียงลำดับสำเนาของรายชื่อ"; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "ตัวอักษร"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "ตัวเลข"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "ตัวอักษร"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "สร้างรายการจากข้อความ"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "สร้างข้อความจากรายการ"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "รวมรายการข้อความเป็นข้อความเดียว แบ่งด้วยตัวคั่น"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "แบ่งข้อความเป็นรายการข้อความ แยกแต่ละรายการด้วยตัวคั่น"; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "ด้วยตัวคั่น"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "เท็จ"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "คืนค่าเป็นจริงหรือเท็จ"; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "จริง"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://th.wikipedia.org/wiki/อสมการ"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "คืนค่าเป็น \"จริง\" ถ้าค่าที่ใส่ทั้งสองค่านั้นเท่ากัน"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "คืนค่าเป็น \"จริง\" ถ้าค่าแรกมากกว่าค่าที่สอง"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "คืนค่าเป็น \"จริง\" ถ้าค่าแรกมากกว่าหรือเท่ากับค่าที่สอง"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "คืนค่าเป็น \"จริง\" ถ้าค่าแรกน้อยกว่าค่าที่สอง"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "คืนค่าเป็น \"จริง\" ถ้าค่าแรกน้อยกว่าหรือเท่ากับค่าที่สอง"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "คืนค่าเป็น \"จริง\" ถ้าค่าที่ใส่ทั้งสองค่านั้นไม่เท่ากัน"; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "ไม่ %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "คืนค่าเป็น \"จริง\" ถ้าค่าที่ใส่เป็นเท็จ คืนค่าเป็น \"เท็จ\" ถ้าค่าที่ใส่เป็นจริง"; +Blockly.Msg.LOGIC_NULL = "ไม่กำหนด"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "คืนค่า \"ไม่กำหนด\""; +Blockly.Msg.LOGIC_OPERATION_AND = "และ"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "หรือ"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "คืนค่าเป็น \"จริง\" ถ้าค่าทั้งสองค่าเป็นจริง"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "คืนค่าเป็น \"จริง\" ถ้ามีอย่างน้อยหนึ่งค่าที่เป็นจริง"; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "ทดสอบ"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "ถ้า เป็นเท็จ"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "ถ้า เป็นจริง"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "ตรวจสอบเงื่อนไขใน \"ทดสอบ\" ถ้าเงื่อนไขเป็นจริง จะคืนค่า \"ถ้า เป็นจริง\" ถ้าเงื่อนไขเป็นเท็จ จะคืนค่า \"ถ้า เป็นเท็จ\""; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://th.wikipedia.org/wiki/เลขคณิต"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "คืนค่าผลรวมของตัวเลขทั้งสองจำนวน"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "คืนค่าผลหารของตัวเลขทั้งสองจำนวน"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "คืนค่าผลต่างของตัวเลขทั้งสองจำนวน"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "คืนค่าผลคูณของตัวเลขทั้งสองจำนวน"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "คืนค่าผลการยกกำลัง โดยตัวเลขแรกเป็นฐาน และตัวเลขที่สองเป็นเลขชี้กำลัง"; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "เปลี่ยนค่า %1 เป็น %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "เพิ่มค่าของตัวแปร \"%1\""; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://th.wikipedia.org/wiki/ค่าคงตัวทางคณิตศาสตร์"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "คืนค่าคงตัวทางคณิตศาสตร์ที่พบบ่อยๆ เช่น π (3.141…), e (2.718…), φ (1.618…), รากที่สอง (1.414…), รากที่ ½ (0.707…), ∞ (อนันต์)"; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "จำกัดค่า %1 ต่ำสุด %2 สูงสุด %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "จำกัดค่าของตัวเลขให้อยู่ในช่วงที่กำหนด"; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "หารลงตัว"; +Blockly.Msg.MATH_IS_EVEN = "เป็นจำนวนคู่"; +Blockly.Msg.MATH_IS_NEGATIVE = "เป็นเลขติดลบ"; +Blockly.Msg.MATH_IS_ODD = "เป็นจำนวนคี่"; +Blockly.Msg.MATH_IS_POSITIVE = "เป็นเลขบวก"; +Blockly.Msg.MATH_IS_PRIME = "เป็นจำนวนเฉพาะ"; +Blockly.Msg.MATH_IS_TOOLTIP = "ตรวจว่าตัวเลขเป็นจำนวนคู่ จำนวนคี่ จำนวนเฉพาะ จำนวนเต็ม เลขบวก เลขติดลบ หรือหารด้วยเลขที่กำหนดลงตัวหรือไม่ คืนค่าเป็นจริงหรือเท็จ"; +Blockly.Msg.MATH_IS_WHOLE = "เป็นเลขจำนวนเต็ม"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "เศษของ %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "คืนค่าเศษที่ได้จากการหารของตัวเลขทั้งสองจำนวน"; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://th.wikipedia.org/wiki/จำนวน"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "จำนวน"; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "ค่าเฉลี่ยของรายการ"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "มากที่สุดในรายการ"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "ค่ามัธยฐานของรายการ"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "น้อยที่สุดในรายการ"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "ฐานนิยมของรายการ"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "สุ่มรายการ"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "ส่วนเบี่ยงเบนมาตรฐานของรายการ"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "ผลรวมของรายการ"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "คืนค่าเฉลี่ยของรายการ"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "คืนค่าตัวเลขที่มากที่สุดในรายการ"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "คืนค่ามัธยฐานของรายการ"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "คืนค่าตัวเลขที่น้อยที่สุดในรายการ"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "คืนค่าฐานนิยมของรายการ"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "สุ่มคืนค่าสิ่งที่อยู่ในรายการ"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "คืนค่าส่วนเบี่ยงเบนมาตรฐานของรายการ"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "คืนค่าผลรวมของตัวเลขทั้งหมดในรายการ"; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "สุ่มเลขเศษส่วน"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "สุ่มเลขเศษส่วน ตั้งแต่ 0.0 แต่ไม่เกิน 1.0"; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "สุ่มเลขจำนวนเต็มตั้งแต่ %1 จนถึง %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "สุ่มเลขจำนวนเต็มจากช่วงที่กำหนด"; +Blockly.Msg.MATH_ROUND_HELPURL = "https://th.wikipedia.org/wiki/การปัดเศษ"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "ปัดเศษ"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "ปัดเศษลง"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "ปัดเศษขึ้น"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "ปัดเศษของตัวเลขขึ้นหรือลง"; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "ค่าสัมบูรณ์"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "รากที่สอง"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "คืนค่าค่าสัมบูรณ์ของตัวเลข"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "คืนค่า e ยกกำลังด้วยตัวเลข"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "คืนค่าลอการิทึมธรรมชาติของตัวเลข"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "คืนค่าลอการิทึมฐานสิบของตัวเลข"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "คืนค่าติดลบของตัวเลข"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "คืนค่า 10 ยกกำลังด้วยตัวเลข"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "คืนค่ารากที่สองของตัวเลข"; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://th.wikipedia.org/wiki/ฟังก์ชันตรีโกณมิติ"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "คืนค่า arccosine ของตัวเลข"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "คืนค่า arcsine ของตัวเลข"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "คืนค่า arctangent ของตัวเลข"; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "คืนค่า cosine ขององศา (ไม่ใช่เรเดียน)"; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "คืนค่า sine ขององศา (ไม่ใช่เรเดียน)"; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "คืนค่า tangent ขององศา (ไม่ใช่เรเดียน)"; +Blockly.Msg.NEW_VARIABLE = "สร้างตัวแปร..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "ชื่อตัวแปรใหม่:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "ข้อความที่ใช้ได้"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "ด้วย:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_(computer_science)"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "เรียกใช้ฟังก์ชันที่สร้างโดยผู้ใช้ \"%1\""; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_(computer_science)"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "เรียกใช้ฟังก์ชันที่สร้างโดยผู้ใช้ \"%1\" และใช้ผลลัพธ์ของมัน"; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "ด้วย:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "สร้าง \"%1\""; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "อธิบายฟังก์ชันนี้"; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "ทำอะไรบางอย่าง"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "ถึง"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "สร้างฟังก์ชันที่ไม่มีผลลัพธ์"; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "คืนค่า"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "สร้างฟังก์ชันที่มีผลลัพธ์"; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "ระวัง: ฟังก์ชันนี้มีพารามิเตอร์ที่มีชื่อซ้ำกัน"; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "เน้นฟังก์ชันนิยาม"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "ถ้ามีค่าเป็นจริง ให้คืนค่าที่สอง"; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "ระวัง: บล็อกนี้ใช้เฉพาะในการสร้างฟังก์ชันเท่านั้น"; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "ชื่อนำเข้า:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "เพิ่มค่าป้อนเข้าฟังก์ชัน"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "นำเข้า"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "เพิ่ม, ลบ, หรือจัดเรียง ข้อมูลที่ป้อนเข้าฟังก์ชันนี้"; +Blockly.Msg.REDO = "ทำซ้ำ"; +Blockly.Msg.REMOVE_COMMENT = "เอาคำอธิบายออก"; +Blockly.Msg.RENAME_VARIABLE = "เปลี่ยนชื่อตัวแปร..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "เปลี่ยนชื่อตัวแปร '%1' ทั้งหมดเป็น:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "ต่อด้วยข้อความ"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "นำเอา"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "ต่อข้อความให้ตัวแปร \"%1\""; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "เปลี่ยนเป็น ตัวพิมพ์เล็ก"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "เปลี่ยนเป็น ตัวอักษรแรกเป็นตัวพิมพ์ใหญ่"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "เปลี่ยนเป็น ตัวพิมพ์ใหญ่"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "คืนค่าสำเนาของข้อความในกรณีต่างๆ"; +Blockly.Msg.TEXT_CHARAT_FIRST = "ดึง ตัวอักษรตัวแรก"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "ดึง ตัวอักษรตัวที่ # จากท้าย"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "ดึง ตัวอักษรตัวที่"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "ในข้อความ"; +Blockly.Msg.TEXT_CHARAT_LAST = "ดึง ตัวอักษรตัวสุดท้าย"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "ถึงตัวอักษรแบบสุ่ม"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "คืนค่าตัวอักษรจากตำแหน่งที่ระบุ"; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "เพิ่มรายการเข้าไปในข้อความ"; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "รวม"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "เพิ่ม ลบ หรือจัดเรียงบล็อกข้อความนี้ใหม่"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "จนถึง ตัวอักษรที่ # จากท้าย"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "จนถึง ตัวอักษรที่"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "จนถึง ตัวอักษรสุดท้าย"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "ในข้อความ"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "แยกข้อความย่อยตั้งแต่ ตัวอักษรแรก"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "แยกข้อความย่อยตั้งแต่ ตัวอักษรที่ # จากท้าย"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "แยกข้อความย่อยตั้งแต่ ตัวอักษรที่"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "คืนค่าบางส่วนของข้อความ"; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "ในข้อความ"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "หาข้อความแรกที่พบ"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "หาข้อความสุดท้ายที่พบ"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "คืนค่าตำแหน่งที่พบข้อความแรกอยู่ในข้อความที่สอง คืนค่า %1 ถ้าหาไม่พบ"; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 ว่าง"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "คืนค่าจริง ถ้าข้อความยังว่าง"; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "สร้างข้อความด้วย"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "สร้างข้อความด้วยการรวมจำนวนของรายการเข้าด้วยกัน"; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "ความยาวของ %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "คืนค่าความยาวของข้อความ (รวมช่องว่าง)"; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "พิมพ์ %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "พิมพ์ข้อความ ตัวเลข หรือค่าอื่นๆ"; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "แสดงหน้าต่างให้ผู้ใช้ใส่ตัวเลข"; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "แสดงหน้าต่างให้ผู้ใช้ใส่ข้อความ"; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "แสดงหน้าต่างตัวเลข"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "แสดงหน้าต่างข้อความ"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://th.wikipedia.org/wiki/สายอักขระ"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "ตัวหนังสือ คำ หรือข้อความ"; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "ลบช่องว่างทั้งสองข้างของ"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "ลบช่องว่างด้านหน้าของ"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "ลบช่องว่างข้างท้ายของ"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "คืนค่าสำเนาของข้อความที่ลบเอาช่องว่างหน้าและหลังข้อความออกแล้ว"; +Blockly.Msg.TODAY = "วันนี้"; +Blockly.Msg.UNDO = "ย้อนกลับ"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "รายการ"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "สร้าง \"กำหนด %1\""; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "คืนค่าของตัวแปรนี้"; +Blockly.Msg.VARIABLES_SET = "กำหนด %1 จนถึง %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "สร้าง \"get %1\""; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "กำหนดให้ตัวแปรนี้เท่ากับการป้อนข้อมูล"; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/js/tl.js b/src/opsoro/server/static/js/blockly/msg/js/tl.js similarity index 88% rename from src/opsoro/apps/visual_programming/static/blockly/msg/js/tl.js rename to src/opsoro/server/static/js/blockly/msg/js/tl.js index 1ba0822..31cdc66 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/js/tl.js +++ b/src/opsoro/server/static/js/blockly/msg/js/tl.js @@ -7,9 +7,7 @@ goog.provide('Blockly.Msg.tl'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "Dagdag komento"; -Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated Blockly.Msg.CHANGE_VALUE_TITLE = "pagbago ng value:"; -Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!"; // untranslated Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated Blockly.Msg.COLLAPSE_ALL = "bloke"; Blockly.Msg.COLLAPSE_BLOCK = "bloke"; @@ -62,7 +60,10 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ulitin hanggang"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ulitin habang"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Habang ang value ay false, gagawin ang ibang statements."; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Habang ang value ay true, gagawin ang ibang statements."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated Blockly.Msg.DELETE_BLOCK = "burahin ang bloke"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated Blockly.Msg.DELETE_X_BLOCKS = "burahin %1 ng bloke"; Blockly.Msg.DISABLE_BLOCK = "Ipangwalang bisa ang Block"; Blockly.Msg.DUPLICATE_BLOCK = "Kaparehas"; @@ -91,18 +92,15 @@ Blockly.Msg.LISTS_GET_INDEX_RANDOM = "nang hindi pinipili"; Blockly.Msg.LISTS_GET_INDEX_REMOVE = "tanggalin"; Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Ibalik ang unang item sa list."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Ibalik ang item sa tinakdang posisyon sa list. #1 ay ang huling item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Ibalik ang item sa itinakdang posisyon sa list. #1 ay ang unang item."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Ibalik ang item sa itinakdang posisyon sa list."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Ibalik ang huling item sa list."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Nag babalik ng hindi pinipiling item sa list."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Nag tatanggal at nag babalik ng mga unang item sa list."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Nag tatanggal at nag babalik ng items sa tinukoy na posisyon sa list. #1 ay ang huling item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Nag tatanggal at nag babalik ng mga items sa tinukoy na posisyon sa list. #1 ang unang item."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Nag tatanggal at nag babalik ng mga items sa tinukoy na posisyon sa list."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Nag tatanggal at nag babalik ng huling item sa list."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Nag tatanggal at nag babalik ng mga hindi pinipiling item sa list."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Nag tatanggal ng unang item sa list."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Nag tatanggal ng item sa tinukoy na posisyon sa list. #1 ay ang huling item."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Nag tatanggal ng item sa tinukoy na posisyon sa list. #1 ay ang unang item."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Nag tatanggal ng item sa tinukoy na posisyon sa list."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Nag tatanggal ng huling item sa list."; Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Nag tatanggal ng item mula sa walang pinipiling list."; Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "mula # hanggang huli"; @@ -114,10 +112,12 @@ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "pag kuha ng sub-list mula sa # m Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "pag kuha ng sub-list mula #"; Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Gumagawa ng kopya ng tinukoy na bahagi ng list."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 ay ang huling item."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 ay ang unang item."; Blockly.Msg.LISTS_INDEX_OF_FIRST = "Hanapin ang unang pangyayari ng item"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "hanapin ang huling pangyayari ng item"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Pagbalik ng index ng una/huli pangyayari ng item sa list. Pagbalik ng 0 kung ang item ay hindi makita."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Pagbalik ng index ng una/huli pangyayari ng item sa list. Pagbalik ng %1 kung ang item ay hindi makita."; Blockly.Msg.LISTS_INLIST = "sa list"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 ay walang laman"; @@ -128,20 +128,29 @@ Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Pag balik ng haba ng list."; Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_REPEAT_TITLE = "pag gawa ng list kasama ng item %1 inuulit %2 beses"; Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Pag gawa ng list na binubuo ng binigay na value at inulit na tinuloy na bilang ng beses."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "gaya ng"; Blockly.Msg.LISTS_SET_INDEX_INSERT = "isingit sa"; Blockly.Msg.LISTS_SET_INDEX_SET = "set"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Nag singit ng item sa simula ng list."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Nag singit ng item sa tinukoy na posisyon sa list. #1 ay ang huling item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Nag singit ng item sa tinukoy na posistion sa list. #1 ay ang unang item."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Nag singit ng item sa tinukoy na posistion sa list."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Idagdag ang item sa huli ng isang list."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Isingit ang item ng walang pinipili sa isang list."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Pag set ng unang item sa isang list."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Pag set ng item sa tinukoy na posisyon sa isang list. #1 ay ang huling item."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Pag set ng item sa tinukoy na position sa isang list. #1 ay ang unang item."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Pag set ng item sa tinukoy na position sa isang list."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Pag set sa huling item sa isang list."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Pag set ng walang pinipiling item sa isang list."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -187,7 +196,7 @@ Blockly.Msg.MATH_CHANGE_TITLE = "baguhin %1 by %2"; Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; Blockly.Msg.MATH_CONSTANT_HELPURL = "http://en.wikipedia.org/wiki/Mathematical_constant"; Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; -Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; @@ -258,19 +267,18 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; -Blockly.Msg.ME = "Me"; // untranslated Blockly.Msg.NEW_VARIABLE = "New variable..."; Blockly.Msg.NEW_VARIABLE_TITLE = "New variable name:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "with:"; -Blockly.Msg.PROCEDURES_CALLNORETURN_CALL = ""; // untranslated Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "with:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Create '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "do something"; @@ -281,12 +289,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "return"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Remove Comment"; Blockly.Msg.RENAME_VARIABLE = "Rename variable..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Rename all '%1' variables to:"; @@ -308,6 +318,9 @@ Blockly.Msg.TEXT_CHARAT_LAST = "get last letter"; Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "join"; Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; @@ -326,7 +339,7 @@ Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated -Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of first text in the second text. Returns 0 if text is not found."; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of first text in the second text. Returns %1 if text is not found."; Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty"; Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; @@ -344,6 +357,12 @@ Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated Blockly.Msg.TEXT_TEXT_HELPURL = "http://en.wikipedia.org/wiki/String_(computer_science)"; Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated @@ -352,6 +371,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated @@ -360,13 +380,13 @@ Blockly.Msg.VARIABLES_SET = "set %1 to %2"; Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; -Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; -Blockly.Msg.PROCEDURES_CALLRETURN_CALL = Blockly.Msg.PROCEDURES_CALLNORETURN_CALL; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; @@ -374,9 +394,19 @@ Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; -Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; \ No newline at end of file +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/tlh.js b/src/opsoro/server/static/js/blockly/msg/js/tlh.js new file mode 100644 index 0000000..e84a94c --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/tlh.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.tlh'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "QInHom chel"; +Blockly.Msg.CHANGE_VALUE_TITLE = "choH:"; +Blockly.Msg.CLEAN_UP = "ngoghmeyvaD tlhegh rurmoH"; +Blockly.Msg.COLLAPSE_ALL = "ngoghmey DejmoH"; +Blockly.Msg.COLLAPSE_BLOCK = "ngogh DejmoH"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "rItlh wa'"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "rItlh cha'"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "'ar"; +Blockly.Msg.COLOUR_BLEND_TITLE = "DuD"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; // untranslated +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Choose a colour from the palette."; // untranslated +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "rItlh vISaHbe'"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Choose a colour at random."; // untranslated +Blockly.Msg.COLOUR_RGB_BLUE = "chal rItlh"; +Blockly.Msg.COLOUR_RGB_GREEN = "tI rItlh"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "'Iw rItlh"; +Blockly.Msg.COLOUR_RGB_TITLE = "rItlh wIv"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "gho Haw'"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "gho taHqa'"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Break out of the containing loop."; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the rest of this loop, and continue with the next iteration."; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "yIqIm! ghoDaq neH ngoghvam lo'laH vay'."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "ngIq Doch %1 ngaSbogh tetlh %2 nuDDI'"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For each item in a list, set the variable '%1' to the item, and then do some statements."; // untranslated +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "togh %1 mung %2 ghoch %3 Do %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; // untranslated +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block."; // untranslated +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block."; // untranslated +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Add, remove, or reorder sections to reconfigure this if block."; // untranslated +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "pagh"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "pagh teHchugh"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "teHchugh"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "If a value is true, then do some statements."; // untranslated +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; // untranslated +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "ruch"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1-logh qaSmoH"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Do some statements several times."; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "teHpa' qaSmoH"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "teHtaHvIS qaSmoH"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "While a value is false, then do some statements."; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "While a value is true, then do some statements."; // untranslated +Blockly.Msg.DELETE_ALL_BLOCKS = "Hoch %1 ngoghmey Qaw'?"; +Blockly.Msg.DELETE_BLOCK = "ngogh Qaw'"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "%1 ngoghmey Qaw'"; +Blockly.Msg.DISABLE_BLOCK = "ngogh Qotlh"; +Blockly.Msg.DUPLICATE_BLOCK = "velqa' chenmoH"; +Blockly.Msg.ENABLE_BLOCK = "ngogh QotlhHa'"; +Blockly.Msg.EXPAND_ALL = "ngoghmey DejHa'moH"; +Blockly.Msg.EXPAND_BLOCK = "ngogh DejHa'moH"; +Blockly.Msg.EXTERNAL_INPUTS = "Hur rar"; +Blockly.Msg.HELP = "QaH"; +Blockly.Msg.INLINE_INPUTS = "qoD rar"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "tetlh chIm"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "tetlh"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "tetlh ghom"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Add an item to the list."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_FIRST = "wa'DIch"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# Qav"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "Suq"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "Suq vaj pej"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "Qav"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "Sahbe'"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "pej"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returns the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Removes and returns the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Removes the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "mojaQ # Qav"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "mojaQ #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "mojaQ Qav"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "tetlhHom moHaq wa'DIch"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "tetlhHom moHaq # Qav"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "tetlhHom moHaq #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "Suq"; +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 is the last item."; // untranslated +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 is the first item."; // untranslated +Blockly.Msg.LISTS_INDEX_OF_FIRST = "Doch sam wa'DIch"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "Doch sam Qav"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated +Blockly.Msg.LISTS_INLIST = "tetlhDaq"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 chIm'a'"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty."; // untranslated +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "chuq %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; // untranslated +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "tetlh ghom %2 Dochmey %1 pus"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "Dos"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "lIH"; +Blockly.Msg.LISTS_SET_INDEX_SET = "choH"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Inserts the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Sets the item at the specified position in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "tetlh ghermeH ghItlh wav"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "ghItlh chenmoHmeH tetlh gherHa'"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "rarwI'Hom lo'"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "teHbe'"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returns either true or false."; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "teH"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Return true if both inputs equal each other."; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Return true if the first input is greater than the second input."; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Return true if the first input is greater than or equal to the second input."; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Return true if the first input is smaller than the second input."; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Return true if the first input is smaller than or equal to the second input."; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Return true if both inputs are not equal to each other."; // untranslated +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "yoymoH %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returns true if the input is false. Returns false if the input is true."; // untranslated +Blockly.Msg.LOGIC_NULL = "paghna'"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returns null."; // untranslated +Blockly.Msg.LOGIC_OPERATION_AND = "'ej"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "qoj"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Return true if both inputs are true."; // untranslated +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true."; // untranslated +Blockly.Msg.LOGIC_TERNARY_CONDITION = "chov"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "teHbe'chugh"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "teHchugh"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Return the sum of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Return the difference of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Return the product of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg.MATH_CHANGE_TITLE = "choH %1 chel %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; // untranslated +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "jon %1 bIng %2 Dung %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "wav'a'"; +Blockly.Msg.MATH_IS_EVEN = "lang'a' mI'"; +Blockly.Msg.MATH_IS_NEGATIVE = "bIng pagh"; +Blockly.Msg.MATH_IS_ODD = "ror'a' mI'"; +Blockly.Msg.MATH_IS_POSITIVE = "Dung pagh"; +Blockly.Msg.MATH_IS_PRIME = "potlh'a' mI'"; +Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated +Blockly.Msg.MATH_IS_WHOLE = "ngoHlaHbe''a'"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated +Blockly.Msg.MATH_MODULO_TITLE = "ratlwI' SIm %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Return the remainder from dividing the two numbers."; // untranslated +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; // untranslated +Blockly.Msg.MATH_NUMBER_TOOLTIP = "A number."; // untranslated +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "beQwI' SIm tetlh"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "tInwI''a' SIm tetlh"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "beQwI'botlh SIm tetlh"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "machwI''a' SIm tetlh"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "beQwI' motlh SIm tetlh"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "SaHbe' SIm tetlh"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "motlhbe'wI' SIm tetlh"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "chelwI' SIm tetlh"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Return the average (arithmetic mean) of the numeric values in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Return the largest number in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Return the median number in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Return the smallest number in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Return a list of the most common item(s) in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Return a random element from the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Return the sum of all the numbers in the list."; // untranslated +Blockly.Msg.MATH_POWER_SYMBOL = "^"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "mI'HomSaHbe'"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_TITLE = "ngoH mI'SaHbe' bIng %1 Dung %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; // untranslated +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; // untranslated +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "ngoH"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "bIng ngoH"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "Dung ngoH"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Round a number up or down."; // untranslated +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; // untranslated +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "Dung pagh choH"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "cha'DIch wav"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Return the negation of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Return the square root of a number."; // untranslated +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; +Blockly.Msg.MATH_TRIG_ACOS = "acos"; +Blockly.Msg.MATH_TRIG_ASIN = "asin"; +Blockly.Msg.MATH_TRIG_ATAN = "atan"; +Blockly.Msg.MATH_TRIG_COS = "cos"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated +Blockly.Msg.MATH_TRIG_SIN = "sin"; +Blockly.Msg.MATH_TRIG_TAN = "tan"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated +Blockly.Msg.NEW_VARIABLE = "lIw chu'..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "lIw chu' pong:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "mu'tlhegh chaw'"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "qel:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "qel:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "chel '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "mIw yIDel..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "mIw"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "ruch"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "chegh"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; // untranslated +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "ghuHmoHna': qelwI' cha'logh chen."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "mIwna' wew"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "ghoHmoHna': ngoghvam ngaSbe' mIwDaq."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "pong:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "qelwI'mey"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "vangqa'"; +Blockly.Msg.REMOVE_COMMENT = "QInHom chelHa'"; +Blockly.Msg.RENAME_VARIABLE = "lIw pong choH..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Hoch \"%1\" lIwmey pongmey choH:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "ghItlh"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "chel"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; // untranslated +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "machchoH"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "DojchoH"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "tInchoH"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg.TEXT_CHARAT_FIRST = "mu'Hom wa'DIch"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "mu'Hom # Qav"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "mu'Hom #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "ghItlhDaq"; +Blockly.Msg.TEXT_CHARAT_LAST = "mu'Hom Qav"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "mu'Hom SaHbe'"; +Blockly.Msg.TEXT_CHARAT_TAIL = "Suq"; +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "ghom"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "mojaq mu'Hom # Qav"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "mojaq mu'Hom #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "mojaq mu'Hom Qav"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "ghItlhDaq"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "ghItlhHom moHaq mu'Hom wa'DIch"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "ghItlhHom moHaq mu'Hom # Qav"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "ghItlhHom moHaq mu'Hom #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = "Suq"; +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; // untranslated +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "ghItlhDaq"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "ghItlh wa'DIch Sam"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "ghItlh Qav Sam"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 chIm'a'"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "ghItlh ghom"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "chuq %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; // untranslated +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "maq %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; // untranslated +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "mI' tlhob 'ej maq"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "ghItln tlhob 'ej maq"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated +Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; // untranslated +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "poSnIHlogh pei"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "poSlogh pei"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "nIHlogh pei"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated +Blockly.Msg.TODAY = "DaHjaj"; +Blockly.Msg.UNDO = "vangHa'"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "Doch"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "chel 'choH %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; // untranslated +Blockly.Msg.VARIABLES_SET = "choH %1 %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "chel 'Suq %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/tr.js b/src/opsoro/server/static/js/blockly/msg/js/tr.js new file mode 100644 index 0000000..9c64175 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/tr.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.tr'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Yorum Ekle"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Değeri değiştir:"; +Blockly.Msg.CLEAN_UP = "Blokları temizle"; +Blockly.Msg.COLLAPSE_ALL = "Blokları Daralt"; +Blockly.Msg.COLLAPSE_BLOCK = "Blok'u Daralt"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "renk 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "renk 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "oran"; +Blockly.Msg.COLOUR_BLEND_TITLE = "karıştır"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Verilen bir orana bağlı olarak iki rengi karıştırır. (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://tr.wikipedia.org/wiki/Renk"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Paletten bir renk seçin."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "rastgele renk"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Rastgele bir renk seçin."; +Blockly.Msg.COLOUR_RGB_BLUE = "mavi"; +Blockly.Msg.COLOUR_RGB_GREEN = "yeşil"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "kırmızı"; +Blockly.Msg.COLOUR_RGB_TITLE = "renk değerleri"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Kırmızı, yeşil ve mavinin belirtilen miktarıyla bir renk oluşturun. Tüm değerler 0 ile 100 arasında olmalıdır."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "döngüden çık"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "döngünün sonraki adımından devam et"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "İçeren döngüden çık."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Bu döngünün geri kalanını atlayın ve sonraki adım ile devam edin."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Uyarı: Bu blok sadece bir döngü içinde kullanılabilir."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "her öğe için %1 listede %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Bir listedeki her öğe için '%1' değişkenini maddeye atayın ve bundan sonra bazı açıklamalar yapın."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "ile sayılır %1 %2 den %3 ye, her adımda %4 değişim"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Başlangıç sayısından bitiş sayısına kadar belirtilen aralık ve belirtilen engeller ile devam eden değerler alan '%1' değişkeni oluştur."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "If bloğuna bir koşul ekleyin."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "If bloğuna kalan durumları \"yakalayan\" bir son ekle."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "If bloğuna ekle, kaldır veya yeniden düzenleme yap."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "değilse"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "değilse eğer"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "eğer"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Eğer değişken true , yani gerçekleşmiş ise , ardından gelen işlemi yerine getir ."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Eğer değişken true, yani gerçekleşiyor ise ilk blok'taki işlemleri yerine getir, Aksi halde ikinci blok'taki işlemleri yerine getir."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Eğer ilk değişken true, yani koşul gerçekleşmiş ise ilk blok içerisindeki işlem(ler)i gerçekleştir. Eğer ikinci değişken true ise, ikinci bloktaki işlem(ler)i gerçekleştir ."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Eğer ilk değer true, yani olumlu ise, ilk blok'taki işlem(ler)i gerçekleştir. İlk değer true değil ama ikinci değer true ise, ikinci bloktaki işlem(ler)i gerçekleştir. Eğer değerlerin hiçbiri true değil ise son blok'taki işlem(ler)i gerçekleştir."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://tr.wikipedia.org/wiki/For_d%C3%B6ng%C3%BCs%C3%BC"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "yap"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1 kez tekrarla"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Bazı işlemleri birkaç kez yap."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "kadar tekrarla"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "tekrar ederken"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Bir değer yanlış olduğunda bazı beyanlarda bulun."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Bir değer doğru olduğunda bazı beyanlarda bulun."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Tüm %1 blok silinsin mi?"; +Blockly.Msg.DELETE_BLOCK = "Bloğu Sil"; +Blockly.Msg.DELETE_VARIABLE = "'%1' değişkenini silmek istiyor musunuz?"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "'%2' değişkeninin %1 kullanımını silmek istiyor musunuz?"; +Blockly.Msg.DELETE_X_BLOCKS = "%1 Blokları Sil"; +Blockly.Msg.DISABLE_BLOCK = "Bloğu Devre Dışı Bırak"; +Blockly.Msg.DUPLICATE_BLOCK = "Çoğalt"; +Blockly.Msg.ENABLE_BLOCK = "Bloğu Etkinleştir"; +Blockly.Msg.EXPAND_ALL = "Blokları Genişlet"; +Blockly.Msg.EXPAND_BLOCK = "Bloğu Genişlet"; +Blockly.Msg.EXTERNAL_INPUTS = "Harici Girişler"; +Blockly.Msg.HELP = "Yardım"; +Blockly.Msg.INLINE_INPUTS = "Satır içi girdiler"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "Boş liste oluştur"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Veri kaydı içermeyen uzunluğu 0 olan bir listeyi verir"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "liste"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Bu liste bloğunu yeniden yapılandırmak için bölüm ekle,kaldır veya yeniden çağır."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "İle liste oluşturma"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Listeye bir nesne ekle."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Herhangi sayıda nesne içeren bir liste oluştur."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "ilk"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# sonundan"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "# Kare"; +Blockly.Msg.LISTS_GET_INDEX_GET = "Al"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "al ve kaldır"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "son"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "rastgele"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "kaldır"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Listedeki ilk öğeyi verir."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Listede belirli pozisyondaki bir öğeyi verir."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Listedeki son öğeyi verir."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Listedeki rastgele bir öğeyi verir."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Kaldırır ve listedeki ilk öğeyi döndürür."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Kaldırır ve listede belirtilen konumdaki bir öğeyi döndürür."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Kaldırır ve listedeki son öğeyi döndürür."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Kaldırır ve listedeki rastgele bir öğeyi verir."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Listedeki ilk nesneyi kaldırır."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Bir liste içerisinde , tanımlanan pozisyonda ki öğeyi kaldırır."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Listedeki son nesneyi kaldırır."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Listedeki rastgele bir nesneyi kaldırır."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "Sondan #'a kadar"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "#'a"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "Sona kadar"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "ilk öğeden alt liste al"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "# işaretinden sonra gelen ifadeye göre alt liste al , # sondan"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "# dan alt liste al"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Listenin belirli bir kısmının kopyasını yaratır."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 son öğedir."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 ilk öğedir."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "Öğenin ilk varolduğu yeri bul"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "Öğenin son varolduğu yeri bul"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Listedeki öğenin ilk/son oluşumunun indeksini döndürür. Eğer öğe bulunamaz ise %1 döndürür."; +Blockly.Msg.LISTS_INLIST = "Listede"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 boş"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Eğer liste boş ise true döndürür ."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "%1'in uzunluğu"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Bir listenin uzunluğunu verir."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "%1 nesnenin %2 kez tekrarlandığı bir liste yarat"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Verilen bir değerin , belirli bir sayıda tekrarlanmasından oluşan bir liste yaratır ."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "olarak"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "e yerleştir"; +Blockly.Msg.LISTS_SET_INDEX_SET = "yerleştir"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Nesneyi listenin başlangıcına ekler."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Bir öğeyi belirtilen pozisyona göre listeye yerleştirir ."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Öğeyi listenin sonuna ekle ."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Bir öğeyi listeye rast gele ekler ."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Bir listenin ilk öğesini yerleştirir ."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Bir öğeyi belirtilen yere göre listeye yerleştirir ."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Bir listedeki son öğeyi yerleştirir ."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Listeye rast gele bir öğe yerleştirir ."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "artan"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "azalan"; +Blockly.Msg.LISTS_SORT_TITLE = "kısa %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Listenin kısa bir kopyası."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alfabetik, gözardı et"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "sayısal"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alfabetik"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "metinden liste yap"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "listeden metin yap"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Bir sınırlayıcı tarafından kesilen metinlerin listesini bir metine ekle."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Her sınırlayıcıda kesen metinleri bir metin listesine ayır."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "sınırlayıcı ile"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "false = Olumsuz"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Ya 'True' yada 'False' değerini verir."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "Olumlu"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://tr.wikipedia.org/wiki/E%C5%9Fitsizlikler"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Girilen iki değer birbirine eşitse \"True\" değerini verir."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Girilen ilk değer ikinci değerden daha büyükse \"True\" değerini verir."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Girilen ilk değer ikinci değerden büyük veya eşitse \"True\" değerini verir."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Girilen ilk değer ikinci değerden küçükse \"True\" değerini verir."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Girilen ilk değer ikinci değerden küçük veya eşitse \"True\" değerini verir."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Girilen iki değerde birbirine eşit değilse \"True\" değerini verir."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "%1 değil"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Girilen değer yanlışsa \"True\" değerini verir.Girilen değer doğruysa \"False\" değerini verir."; +Blockly.Msg.LOGIC_NULL = "sıfır"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "sıfır verir."; +Blockly.Msg.LOGIC_OPERATION_AND = "ve"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "veya"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Girilen iki değerde doğruysa \"True\" değerini verir."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Girilen iki değerden en az biri doğruysa \"True\" değerini verir."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "yanlış ise"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "doğru ise"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "'test'deki şartı test eder. Eğer şart doğru ise 'doğru' değeri döndürür, aksi halde 'yanlış' değeri döndürür."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://tr.wikipedia.org/wiki/Aritmetik"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "İki rakamın toplamını döndür."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "İki sayının bölümünü döndür."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "İki sayını farkını döndür."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "İki sayının çarpımını döndür."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "İlk sayinin ikincinin kuvvetine yükseltilmişini döndür."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "%1'i %2 kadar değiştir"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "'%1' değişkenine bir sayı ekle."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Yaygın sabitlerden birini döndür:π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (sonsuz)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "%1 i en düşük %2 en yüksek %3 ile sınırla"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Bir sayıyı belirli iki sayı arasında sınırlandır(dahil)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "bölünebilir"; +Blockly.Msg.MATH_IS_EVEN = "çift"; +Blockly.Msg.MATH_IS_NEGATIVE = "negatif"; +Blockly.Msg.MATH_IS_ODD = "tek"; +Blockly.Msg.MATH_IS_POSITIVE = "pozitif"; +Blockly.Msg.MATH_IS_PRIME = "asal"; +Blockly.Msg.MATH_IS_TOOLTIP = "Bir sayinin çift mi tek mi , tam mı, asal mı , pozitif mi, negatif mi, veya tam bir sayıyla bölünebilirliğini kontrol et.'True' veya 'False' değerini döndür."; +Blockly.Msg.MATH_IS_WHOLE = "Bütün olduğunu"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "%1 ÷ %2 nin kalanı"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "İki sayının bölümünden kalanı döndür."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "x"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Bir sayı."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "listenin ortalaması"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "en büyük sayı"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "Listenin medyanı"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "Listenin en küçüğü"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "Listenin modları"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "Listenin rastgele öğesi"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "Listenin standart sapması"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "Listenin toplamı"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Listedeki sayısal değerlerin ortalamasını (aritmetik anlamda) döndür."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Listenin en büyüğünü döndür."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Listenin medyanını döndür."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Listenin en küçüğünü döndür."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Listede ki en yaygın öğe veya öğelerinin listesini döndür."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Listeden rastgele bir element döndür."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Listenin standart sapmasını döndür."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Listede ki tüm sayıların toplamını döndür."; +Blockly.Msg.MATH_POWER_SYMBOL = "üst alma"; +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://tr.wikipedia.org/wiki/Rastgele_say%C4%B1_%C3%BCretimi"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "Rast gele kesirli sayı , yada parça"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "0.0(dahil) ve 1.0 (hariç) sayıları arasında bir sayı döndür ."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://tr.wikipedia.org/wiki/Rastgele_say%C4%B1_%C3%BCretimi"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "%1 ile %2 arasında rastgele tam sayı üret"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Herhangi iki sayı arasında , sayılar dahil olmak üzere , rastgele bir tam sayı döndür."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding Yuvarlama fonksiyonu için araştırma yapınız, sayfanın Türkçe çevirisi henüz mevcut değil."; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "Yuvarla"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "aşağı yuvarla"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "yukarı yuvarla"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Bir sayı yı yukarı yada aşağı yuvarla ."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://tr.wikipedia.org/wiki/Karek%C3%B6k"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "Kesin"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "Kare kök"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Bir sayının tam değerini döndür ."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Bir sayının e ' inci kuvvetini döndür ."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Bir sayının doğal logaritmasını döndür ."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Bir sayının 10 temelinde logaritmasını döndür ."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Bir sayıyı geçersiz olarak döndür ."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Bir sayının 10. kuvvetini döndür ."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Bir sayının karekökü nü döndür ."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "tire"; +Blockly.Msg.MATH_TRIG_ACOS = "akosünüs"; +Blockly.Msg.MATH_TRIG_ASIN = "asinüs"; +Blockly.Msg.MATH_TRIG_ATAN = "atanjant"; +Blockly.Msg.MATH_TRIG_COS = "kosünüs"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://tr.wikipedia.org/wiki/Trigonometrik_fonksiyonlar"; +Blockly.Msg.MATH_TRIG_SIN = "Sinüs"; +Blockly.Msg.MATH_TRIG_TAN = "tanjant"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Bir sayının ters kosunusunu döndür ."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Bir sayının ters sinüsünü döndür ."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Bir sayının ters tanjantını döndür ."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Bir açının kosinüsünü döndür(radyan olarak değil)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Bir açının sinüsünü döndür(radyan olarak değil)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Bir açının tanjantını döndür(radyan olarak değil)."; +Blockly.Msg.NEW_VARIABLE = "Değişken oluştur..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Yeni değişken ismi :"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "Eğer ifadelerine izin ver"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "ile :"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Kullanıcı tanımlı fonksiyonu çalıştır '%1' ."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Kullanıcı tanımlı fonksiyonu çalıştır '%1' ve çıktısını kullan ."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "ile :"; +Blockly.Msg.PROCEDURES_CREATE_DO = "'%1' oluştur"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Bu işlevi açıkla..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "birşey yap"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "e"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Çıktı vermeyen bir fonksiyon yaratır ."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "Geri dön"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Çıktı veren bir fonksiyon oluşturur."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Uyarı: Bu fonksiyon yinelenen parametreler vardır."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Fonksiyon tanımı vurgulamak"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Eğer değer doğruysa, ikinci değere geri dön."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Uyarı: Bu blok yalnızca bir fonksiyon tanımı içinde kullanılır."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "girdi adı:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "İşleve bir girdi ekleyin."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "girdiler"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Bu işlevin girdilerini ekleyin, çıkarın, ya da yeniden sıralayın."; +Blockly.Msg.REDO = "Yinele"; +Blockly.Msg.REMOVE_COMMENT = "Yorumu Sil"; +Blockly.Msg.RENAME_VARIABLE = "Değişkeni yeniden adlandır..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Tüm '%1' değişkenlerini yeniden isimlendir:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "Metin Ekle"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "e"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Değişken '%1' e bazı metinler ekleyin."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "küçük harf"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "Baş Harfler Büyük"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "büyük harf"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Metnin bir kopyasını farklı bir harf durumunda (HEPSİ BÜYÜK - hepsi küçük) getirir."; +Blockly.Msg.TEXT_CHARAT_FIRST = "İlk harfini al"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "# dan sona harfleri al"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "# harfini al"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "metinde"; +Blockly.Msg.TEXT_CHARAT_LAST = "son harfi al"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "Rastgele bir harf al"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Belirli pozisyonda ki bir harfi döndürür."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Metine bir öğe ekle."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "Katıl"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Bu metin bloğunu düzenlemek için bölüm ekle,sil veya yeniden görevlendir."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "Sondan # harfe"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "# harfe"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "son harfe"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "metinde"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "ilk harften başlayarak alt-string alma"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "n inci harften sona kadar alt-string alma"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "n inci harften alt-string alma"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Metinin belirli bir kısmını döndürür."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "metinde"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "Metnin ilk varolduğu yeri bul"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "Metnin son varolduğu yeri bul"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "İlk metnin ikinci metnin içindeki ilk ve son varoluşlarının indeksini döndürür.Metin bulunamadıysa %1 döndürür."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 boş"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Verilen metin boşsa true(doğru) değerini verir."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "ile metin oluştur"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Herhangi bir sayıda ki öğeleri bir araya getirerek metnin bir parçasını oluştur."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "%1 in uzunluğu"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Yazı içerisinde verilen harflerin ( harf arasındaki boşluklar dahil) sayısını verir ."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "%1 ' i Yaz"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Belirli bir metni,sayıyı veya başka bir değeri yaz."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Kullanıcıdan sayı al ."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Kullanıcıdan Yazım al ."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Kullanıcıdan sayı al , istek mesajı göstererek"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Kullanıcıdan yazım al , istek mesajıyla"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Metnin bir harfi,kelimesi veya satırı."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "iki tarafından da boşlukları temizle"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "solundan boşlukları temizle"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "sağından boşlukları temizle"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Metnin bir veya her iki sondan da boşlukları silinmiş şekilde kopyasını verir."; +Blockly.Msg.TODAY = "Bugün"; +Blockly.Msg.UNDO = "Geri al"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "öge"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "'set %1' oluştur"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Bu değişkenin değerini verir."; +Blockly.Msg.VARIABLES_SET = "Atamak %1 e %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "'get %1' oluştur"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Bu değişkeni girilen değere eşitler."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "'%1' isimli değişken adı zaten var."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/uk.js b/src/opsoro/server/static/js/blockly/msg/js/uk.js new file mode 100644 index 0000000..1958da6 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/uk.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.uk'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Додати коментар"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Змінити значення:"; +Blockly.Msg.CLEAN_UP = "Вирівняти блоки"; +Blockly.Msg.COLLAPSE_ALL = "Згорнути блоки"; +Blockly.Msg.COLLAPSE_BLOCK = "Згорнути блок"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "колір 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "колір 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg.COLOUR_BLEND_RATIO = "співвідношення"; +Blockly.Msg.COLOUR_BLEND_TITLE = "змішати"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Змішує два кольори разом у вказаному співвідношені (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://uk.wikipedia.org/wiki/Колір"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Вибрати колір з палітри."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "випадковий колір"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Вибрати колір навмання."; +Blockly.Msg.COLOUR_RGB_BLUE = "синій"; +Blockly.Msg.COLOUR_RGB_GREEN = "зелений"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg.COLOUR_RGB_RED = "червоний"; +Blockly.Msg.COLOUR_RGB_TITLE = "колір з"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Створити колір зі вказаними рівнями червоного, зеленого та синього. Усі значення мають бути від 0 до 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "перервати цикл"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "продовжити з наступної ітерації циклу"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Перервати виконання циклу."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Пропустити залишок цього циклу і перейти до виконання наступної ітерації."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Попередження: цей блок може бути використаний тільки в межах циклу."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "для кожного елемента %1 у списку %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Для кожного елемента в списку змінна '%1' отримує значення елемента, а потім виконуються певні дії."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "рахувати з %1 від %2 до %3 через %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Наявна змінна \"%1\" набуває значень від початкового до кінцевого, враховуючи заданий інтервал, і виконуються вказані блоки."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Додайте умову до блока 'якщо'."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Додати остаточну, всеосяжну умову до блоку 'якщо'."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Додайте, вилучіть або змініть порядок секцій, щоб переналаштувати цей блок 'якщо'."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "інакше"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "інакше якщо"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "якщо"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Якщо значення істинне, то виконати певні дії."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Якщо значення істинне, то виконується перший блок операторів. В іншому випадку виконується другий блок операторів."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Якщо перше значення істинне, то виконується перший блок операторів. В іншому випадку, якщо друге значення істина, то виконується другий блок операторів."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Якщо перше значення істинне, то виконується перший блок операторів. В іншому випадку, якщо друге значення істинне, то виконується другий блок операторів. Якщо жодне із значень не є істинним, то виконується останній блок операторів."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://uk.wikipedia.org/wiki/Цикл_(програмування)#.D0.A6.D0.B8.D0.BA.D0.BB_.D0.B7_.D0.BB.D1.96.D1.87.D0.B8.D0.BB.D1.8C.D0.BD.D0.B8.D0.BA.D0.BE.D0.BC"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "виконати"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "повторити %1 разів"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Виконати певні дії декілька разів."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "повторювати, доки не"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "повторювати поки"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Поки значення хибне, виконувати певні дії."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Поки значення істинне, виконувати певні дії."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Вилучити всі блоки %1?"; +Blockly.Msg.DELETE_BLOCK = "Видалити блок"; +Blockly.Msg.DELETE_VARIABLE = "Вилучити змінну '%1'"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Вилучити %1 використання змінної '%2'?"; +Blockly.Msg.DELETE_X_BLOCKS = "Видалити %1 блоків"; +Blockly.Msg.DISABLE_BLOCK = "Вимкнути блок"; +Blockly.Msg.DUPLICATE_BLOCK = "Дублювати"; +Blockly.Msg.ENABLE_BLOCK = "Увімкнути блок"; +Blockly.Msg.EXPAND_ALL = "Розгорнути блоки"; +Blockly.Msg.EXPAND_BLOCK = "Розгорнути блок"; +Blockly.Msg.EXTERNAL_INPUTS = "Зовнішні входи"; +Blockly.Msg.HELP = "Довідка"; +Blockly.Msg.INLINE_INPUTS = "Вбудовані входи"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "створити порожній список"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Повертає список, довжиною 0, що не містить записів даних"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "список"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Додайте, вилучіть або змініть порядок секцій для переналаштування блока списку."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "створити список з"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Додати елемент до списку."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Створює список з будь-якою кількістю елементів."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "перший"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# з кінця"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "отримати"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "отримати і вилучити"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "останній"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "випадковий"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "вилучити"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = "-ий."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Повертає перший елемент списку."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Повертає елемент у заданій позиції у списку."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Повертає останній елемент списку."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Повертає випадковий елемент списку."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Видаляє і повертає перший елемент списку."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Видаляє і повертає елемент у заданій позиції у списку."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Видаляє і повертає останній елемент списку."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Видаляє і повертає випадковий елемент списоку."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Вилучає перший елемент списку."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Вилучає зі списку елемент у вказаній позиції."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Вилучає останній елемент списку."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Вилучає випадковий елемент списку."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "до # з кінця"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "до #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "до останнього"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "отримати вкладений список з першого"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "отримати вкладений список від # з кінця"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "отримати вкладений список з #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "символу."; +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Створює копію вказаної частини списку."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 - це останній елемент."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 - це перший елемент."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "знайти перше входження елемента"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "знайти останнє входження елемента"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Повертає індекс першого/останнього входження елемента у списку. Повертає %1, якщо елемент не знайдено."; +Blockly.Msg.LISTS_INLIST = "у списку"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 є порожнім"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Повертає істину, якщо список порожній."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "довжина %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Повертає довжину списку."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "створити список з елемента %1 повтореного %2 разів"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Створює список, що складається з заданого значення повтореного задану кількість разів."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "як"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "вставити в"; +Blockly.Msg.LISTS_SET_INDEX_SET = "встановити"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Вставляє елемент на початок списку."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Вставка елемента у вказану позицію списку."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Додає елемент у кінці списку."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Випадковим чином вставляє елемент у список."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Задає перший елемент списку."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Задає елемент списку у вказаній позиції."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Задає останній елемент списку."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Задає випадковий елемент у списку."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "за зростанням"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "за спаданням"; +Blockly.Msg.LISTS_SORT_TITLE = "сортувати %3 %1 %2"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Сортувати копію списку."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "за абеткою, ігноруючи регістр"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "як числа"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "за абеткою"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "зробити з тексту список"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "зробити зі списку текст"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Злити список текстів у єдиний текст, відокремивши розділювачами."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Поділити текст на список текстів, розриваючи на кожному розділювачі."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "з розділювачем"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "хибність"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Повертає значення істина або хибність."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "істина"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://uk.wikipedia.org/wiki/Нерівність"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Повертає істину, якщо обидва входи рівні один одному."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Повертає істину, якщо перше вхідне значення більше, ніж друге."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Повертає істину, якщо перше вхідне значення більше або дорівнює другому."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Повертає істину, якщо перше вхідне значення менше, ніж друге."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Повертає істину, якщо перше вхідне значення менше або дорівнює другому."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Повертає істину, якщо обидва входи не дорівнюють один одному."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "не %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Повертає істину, якщо вхідне значення хибне. Повертає хибність, якщо вхідне значення істинне."; +Blockly.Msg.LOGIC_NULL = "ніщо"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Повертає ніщо."; +Blockly.Msg.LOGIC_OPERATION_AND = "та"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "або"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Повертає істину, якщо обидва входи істинні."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Повертає істину, якщо принаймні один з входів істинний."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "тест"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "якщо хибність"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "якщо істина"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Перевіряє умову в 'тест'. Якщо умова істинна, то повертає значення 'якщо істина'; в іншому випадку повертає значення 'якщо хибність'."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://uk.wikipedia.org/wiki/Арифметика"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Повертає суму двох чисел."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Повертає частку двох чисел."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Повертає різницю двох чисел."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Повертає добуток двох чисел."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Повертає перше число, піднесене до степеня, вираженого другим числом."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "змінити %1 на %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Додати число до змінної '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://uk.wikipedia.org/wiki/Математична_константа"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Повертає одну з поширених констант: π (3.141...), e (2.718...), φ (1,618...), sqrt(2) (1.414...), sqrt(½) (0.707...) або ∞ (нескінченність)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "обмежити %1 від %2 до %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Обмежує число вказаними межами (включно)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "ділиться на"; +Blockly.Msg.MATH_IS_EVEN = "парне"; +Blockly.Msg.MATH_IS_NEGATIVE = "від'ємне"; +Blockly.Msg.MATH_IS_ODD = "непарне"; +Blockly.Msg.MATH_IS_POSITIVE = "додатне"; +Blockly.Msg.MATH_IS_PRIME = "просте"; +Blockly.Msg.MATH_IS_TOOLTIP = "Перевіряє, чи число парне, непарне, просте, ціле, додатне, від'ємне або чи воно ділиться на певне число без остачі. Повертає істину або хибність."; +Blockly.Msg.MATH_IS_WHOLE = "ціле"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://uk.wikipedia.org/wiki/Ділення_з_остачею"; +Blockly.Msg.MATH_MODULO_TITLE = "остача від %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Повертає остачу від ділення двох чисел."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://uk.wikipedia.org/wiki/Число"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Число."; +Blockly.Msg.MATH_ONLIST_HELPURL = "http://www.mapleprimes.com/questions/100441-Applying-Function-To-List-Of-Numbers"; +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "середнє списку"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "максимум списку"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "медіана списку"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "мінімум списку"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "моди списку"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "випадковий елемент списку"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "стандартне відхилення списку"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "сума списку"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Повертає середнє (арифметичне) числових значень у списку."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Повертає найбільше число у списку."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Повертає медіану списку."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Повертає найменше число у списку."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Повертає перелік найпоширеніших елементів у списку."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Повертає випадковий елемент зі списку."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Повертає стандартне відхилення списку."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Повертає суму всіх чисел у списку."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://uk.wikipedia.org/wiki/Генерація_випадкових_чисел"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "випадковий дріб"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Повертає випадковий дріб від 0,0 (включно) та 1.0 (не включно)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://uk.wikipedia.org/wiki/Генерація_випадкових_чисел"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "випадкове ціле число від %1 до %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Повертає випадкове ціле число між двома заданими межами включно."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://uk.wikipedia.org/wiki/Округлення"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "округлити"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "округлити до меншого"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "округлити до більшого"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Округлення числа до більшого або до меншого."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://uk.wikipedia.org/wiki/Квадратний_корінь"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "модуль"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "квадратний корінь"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Повертає модуль числа."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Повертає e у степені."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Повертає натуральний логарифм числа."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Повертає десятковий логарифм числа."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Повертає протилежне число."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Повертає 10 у степені."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Повертає квадратний корінь з числа."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://uk.wikipedia.org/wiki/Тригонометричні_функції"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Повертає арккосинус числа."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Повертає арксинус числа."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Повертає арктангенс числа."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Повертає косинус кута в градусах (не в радіанах)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Повертає синус кута в градусах (не в радіанах)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Повертає тангенс кута в градусах (не в радіанах)."; +Blockly.Msg.NEW_VARIABLE = "Створити змінну..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Нова назва змінної:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "-ий."; +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "дозволити дії"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "з:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://uk.wikipedia.org/wiki/Підпрограма"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Запустити користувацьку функцію \"%1\"."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://uk.wikipedia.org/wiki/Підпрограма"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Запустити користувацьку функцію \"%1\" і використати її вивід."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "з:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Створити \"%1\""; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Опишіть цю функцію..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = "блок тексту"; +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://uk.wikipedia.org/wiki/Підпрограма"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "щось зробити"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "до"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Створює функцію без виводу."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://uk.wikipedia.org/wiki/Підпрограма"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "повернути"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Створює функцію з виводом."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Увага: ця функція має дубльовані параметри."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Підсвітити визначення функції"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Якщо значення істинне, то повернути друге значення."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Попередження: цей блок може використовуватися лише в межах визначення функції."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "назва входу:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Додати до функції вхідні параметри."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "входи"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Додайте, вилучіть або змініть порядок вхідних параметрів для цієї функції."; +Blockly.Msg.REDO = "Повторити"; +Blockly.Msg.REMOVE_COMMENT = "Видалити коментар"; +Blockly.Msg.RENAME_VARIABLE = "Перейменувати змінну..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Перейменувати усі змінні \"%1\" до:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "додати текст"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "до"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Додати деякий текст до змінної '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "до нижнього регістру"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "Великі Перші Букви"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "до ВЕРХНЬОГО регістру"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "В іншому випадку повертає копію тексту."; +Blockly.Msg.TEXT_CHARAT_FIRST = "отримати перший символ"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "отримати символ # з кінця"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "отримати символ #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "у тексті"; +Blockly.Msg.TEXT_CHARAT_LAST = "отримати останній символ"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "отримати випадковий символ"; +Blockly.Msg.TEXT_CHARAT_TAIL = "-ий."; +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Повертає символ у зазначеній позиції."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Додати елемент до тексту."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "приєднати"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Додайте, вилучіть або змініть порядок секцій для переналаштування текстового блоку."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "до символу # з кінця"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "до символу #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "до останнього символу"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "у тексті"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "отримати підрядок від першого символу"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "отримати підрядок від символу # з кінця"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "отримати підрядок від символу #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = "-ого."; +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Повертає заданий фрагмент тексту."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "у тексті"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "знайти перше входження тексту"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "знайти останнє входження тексту"; +Blockly.Msg.TEXT_INDEXOF_TAIL = "."; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Повертає індекс першого/останнього входження першого тексту в другий. Повертає %1, якщо текст не знайдено."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 є порожнім"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Повертає істину, якщо вказаний текст порожній."; +Blockly.Msg.TEXT_JOIN_HELPURL = "http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_8.html"; +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "створити текст з"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Створити фрагмент тексту шляхом з'єднування будь-якого числа елементів."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "довжина %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Повертає число символів (включно з пропусками) у даному тексті."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "друк %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Надрукувати заданий текст, числа або інші значення."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Запитати у користувача число."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Запитати у користувача деякий текст."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "запит числа з повідомленням"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "запит тексту з повідомленням"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://uk.wikipedia.org/wiki/Рядок_(програмування)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Символ, слово або рядок тексту."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "вилучити крайні пропуски з обох кінців"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "вилучити пропуски з лівого боку"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "вилучити пропуски з правого боку"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Повертає копію тексту з вилученими пропусками з одного або обох кінців."; +Blockly.Msg.TODAY = "Сьогодні"; +Blockly.Msg.UNDO = "Скасувати"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "елемент"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Створити 'встановити %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Повертає значення цієї змінної."; +Blockly.Msg.VARIABLES_SET = "встановити %1 до %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Створити 'отримати %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Задає цю змінну рівною входу."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "Змінна з назвою '%1' вже існує."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/vi.js b/src/opsoro/server/static/js/blockly/msg/js/vi.js new file mode 100644 index 0000000..76c59de --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/vi.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.vi'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Thêm Chú Giải"; +Blockly.Msg.CHANGE_VALUE_TITLE = "Thay giá trị thành:"; +Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.COLLAPSE_ALL = "Thu Nhỏ Mọi Mảnh"; +Blockly.Msg.COLLAPSE_BLOCK = "Thu Nhỏ Mảnh"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "màu 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "màu 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "tỉ lệ"; +Blockly.Msg.COLOUR_BLEND_TITLE = "pha"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Pha hai màu với nhau theo tỉ lệ (0 - 100)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://vi.wikipedia.org/wiki/M%C3%A0u_s%E1%BA%AFc"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Chọn một màu từ bảng màu."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "màu bất kỳ"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "chọn một màu bất kỳ."; +Blockly.Msg.COLOUR_RGB_BLUE = "màu xanh dương"; +Blockly.Msg.COLOUR_RGB_GREEN = "màu xanh lá cây"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "màu đỏ"; +Blockly.Msg.COLOUR_RGB_TITLE = "Tạo màu từ"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Tạo màu từ ba màu: đỏ, xanh lá cây, xanh dương với số lượng cụ thể. Mỗi số phải có giá trị từ 0 đến 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "thoát"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "sang lần lặp tiếp theo"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Thoát khỏi vòng lặp hiện tại."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Bỏ qua phần còn lại trong vòng lặp này, và sang lần lặp tiếp theo."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Chú ý: Mảnh này chỉ có thế dùng trong các vòng lặp."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "với mỗi thành phần %1 trong danh sách %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Trong một danh sách, lấy từng thành phần, gán vào biến \"%1\", rồi thực hiện một số lệnh."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "đếm theo %1 từ %2 đến %3 mỗi lần thêm %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Đếm từ số đầu đến số cuối. Khi đến mỗi số, gán số vào biến \"%1\" rồi thực hiện các lệnh."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Thêm một điều kiện vào mảnh nếu."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Cuối cùng, khi không điều kiện nào đúng."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Thêm, bỏ, hoặc đổi thứ tự các mảnh con để tạo cấu trúc mới cho mảnh nếu."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "nếu không"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "nếu không nếu"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "nếu"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Nếu điều kiện đúng, thực hiện các lệnh."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Nếu điều kiện đúng, thực hiện các lệnh đầu. Nếu sai, thực hiện các lệnh sau."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Nếu điều kiện đúng, thực hiện các lệnh đầu. Nếu không, nếu điều kiện thứ hai đúng, thực hiện các lệnh thứ hai."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Nếu điều kiện đúng, thực hiện các lệnh đầu. Nếu không, nếu điều kiện thứ hai đúng, thực hiện các lệnh thứ hai. Nếu không điều kiện nào đúng, thực hiện các lệnh cuối cùng."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "thực hiện"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "lặp lại %1 lần"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Thực hiện các lệnh vài lần."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "lặp lại cho đến khi"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "lặp lại trong khi"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Miễn là điều kiện còn sai, thì thực hiện các lệnh. Khi điều kiện đúng thì ngưng."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Miễn là điều kiện còn đúng, thì thực hiện các lệnh."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Xóa hết %1 mảnh?"; +Blockly.Msg.DELETE_BLOCK = "Xóa Mảnh Này"; +Blockly.Msg.DELETE_VARIABLE = "Delete the '%1' variable"; // untranslated +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg.DELETE_X_BLOCKS = "Xóa %1 Mảnh"; +Blockly.Msg.DISABLE_BLOCK = "Ngưng Tác Dụng"; +Blockly.Msg.DUPLICATE_BLOCK = "Tạo Bản Sao"; +Blockly.Msg.ENABLE_BLOCK = "Phục Hồi Tác Dụng"; +Blockly.Msg.EXPAND_ALL = "Mở Lớn Mọi Mảnh"; +Blockly.Msg.EXPAND_BLOCK = "Mở Lớn Mảnh"; +Blockly.Msg.EXTERNAL_INPUTS = "Chỗ Gắn Bên Ngoài"; +Blockly.Msg.HELP = "Trợ Giúp"; +Blockly.Msg.INLINE_INPUTS = "Chỗ Gắn Cùng Dòng"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "tạo danh sách trống"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Hoàn trả một danh sách, với độ dài 0, không có thành tố nào cả"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "danh sách"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Thêm, bỏ, hoặc sắp xếp lại các thành phần để tạo dựng mảnh danh sách này."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "tạo danh sách gồm"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Thêm vật vào danh sách."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Tạo một danh sách bao gồm nhiều vậts, với một số lượng bất kỳ."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "đầu tiên"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "(đếm từ cuối) thứ"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "thứ"; +Blockly.Msg.LISTS_GET_INDEX_GET = "lấy thành tố"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "lấy và xóa thành tố"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "cuối cùng"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "bất kỳ"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "xóa thành tố"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Hoàn trả thành tố đầu tiên trong danh sách."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Hoàn trả thành tố trong danh sách ở vị trí ấn định."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Hoàn trả thành tố cuối cùng trong danh sách."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Hoàn trả một thành tố bất kỳ trong danh sách."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Hoàn trả và xóa thành tố đầu tiên trong danh sách."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "Hoàn trả và xóa thành tố trong danh sách ở vị trí ấn định."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Hoàn trả và xóa thành tố cuối cùng trong danh sách."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Hoàn trả và xóa mộtthành tố bất kỳ trong danh sách."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Xóa thành tố đầu tiên trong danh sách."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "Xóa thành tố trong danh sách ở vị trí ấn định."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Xóa thành tố cuối cùng trong danh sách."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Xóa thành tố bất kỳ trong danh sách."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "đến (đếm từ cuối) thứ"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "đến thứ"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "đến cuối cùng"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "lấy một danh sách con từ đầu tiên"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "lấy một danh sách con từ (đếm từ cuối) thứ"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "lấy một danh sách con từ thứ"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Lấy một mảng của danh sách này để tạo danh sách con."; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 là thành tố cuối cùng."; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 là thành tố đầu tiên."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "tìm sự có mặt đầu tiên của vật"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "tìm sự có mặt cuối cùng của vật"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Hoàn trả vị trí xuất hiện đầu/cuối của vật trong danh sách. Nếu không tìm thấy thì hoàn trả số %1."; +Blockly.Msg.LISTS_INLIST = "trong dánh sách"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 trống rỗng"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Hoàn trả “đúng\" nếu danh sách không có thành tử nào."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "độ dài của %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Hoàn trả độ dài của một danh sách."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "tạo danh sách gồm một vật %1 lặp lại %2 lần"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Tạo danh sách gồm một số lượng vật nhất định với mỗi vật đều giống nhau."; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "Reverse a copy of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "giá trị"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "gắn chèn vào vị trí"; +Blockly.Msg.LISTS_SET_INDEX_SET = "đặt thành tố"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Gắn chèn vật vào đầu danh sách."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "Gắn chèn vật vào danh sách theo vị trí ấn định."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Gắn thêm vật vào cuối danh sách."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Gắn chèn vật vào danh sách ở vị trí ngẫu nhiên."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Đặt giá trị của thành tố đầu tiên trong danh sách."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "Đặt giá trị của thành tố ở vị trí ấn định trong một danh sách."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Đặt giá trị của thành tố cuối cùng trong danh sách."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Đặt giá trị của thành tố ngẫu nhiên trong danh sách."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "sai"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Hoàn trả \"đúng\" hoặc \"sai\"."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "đúng"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://vi.wikipedia.org/wiki/B%E1%BA%A5t_%C4%91%E1%BA%B3ng_th%E1%BB%A9c"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Hoàn trả giá trị \"đúng\" (true) nếu giá trị hai đầu vào bằng nhau."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Hoàn trả giá trị \"đúng\" (true) nếu đầu vào thứ nhất lớn hơn đầu vào thứ hai."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Hoàn trả giá trị \"đúng\" (true) nếu đầu vào thứ nhất lớn hơn hoặc bằng đầu vào thứ hai."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Hoàn trả giá trị \"đúng\" (true) nếu đầu vào thứ nhất nhỏ hơn đầu vào thứ hai."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Hoàn trả giá trị \"đúng\" (true) nếu đầu vào thứ nhất nhỏ hơn hoặc bằng đầu vào thứ hai."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Hoàn trả giá trị \"đúng\" (true) nếu giá trị hai đầu vào không bằng nhau."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "không %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Hoàn trả \"đúng\" (true) nếu đầu vào sai. Hoàn trả \"sai\" (false) nếu đầu vào đúng."; +Blockly.Msg.LOGIC_NULL = "trống không"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Hoàn trả trống không."; +Blockly.Msg.LOGIC_OPERATION_AND = "và"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "hoặc"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Hoàn trả \"đúng\" (true) nếu cả hai đầu vào đều đúng."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Hoàn trả \"đúng\" (true) nếu ít nhất một trong hai đầu vào đúng."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "kiểm tra"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "nếu sai"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "nếu đúng"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Kiểm tra điều kiện. Nếu điều kiện đúng, hoàn trả giá trị từ mệnh đề \"nếu đúng\" nếu không đúng, hoàn trả giá trị từ mệnh đề \"nếu sai\"."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://vi.wikipedia.org/wiki/S%E1%BB%91_h%E1%BB%8Dc"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Hoàn trả tổng của hai con số."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Hoàn trả thương của hai con số."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Hoàn trả hiệu của hai con số."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Hoàn trả tích của hai con số."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Hoàn trả số lũy thừa với số thứ nhất là cơ số và số thứ hai là số mũ."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://vi.wikipedia.org/wiki/Ph%C3%A9p_c%E1%BB%99ng"; +Blockly.Msg.MATH_CHANGE_TITLE = "cộng vào %1 giá trị %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Cộng số đầu vào vào biến \"%1\"."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Hoàn trả các đẳng số thường gặp: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (vô cực)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "giới hạn %1 không dưới %2 không hơn %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Giới hạn số đầu vào để không dưới số thứ nhất và không hơn số thứ hai."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "chia hết cho"; +Blockly.Msg.MATH_IS_EVEN = "chẵn"; +Blockly.Msg.MATH_IS_NEGATIVE = "là số âm"; +Blockly.Msg.MATH_IS_ODD = "lẻ"; +Blockly.Msg.MATH_IS_POSITIVE = "là số dương"; +Blockly.Msg.MATH_IS_PRIME = "là số nguyên tố"; +Blockly.Msg.MATH_IS_TOOLTIP = "Kiểm tra con số xem nó có phải là số chẵn, lẻ, nguyên tố, nguyên, dương, âm, hay xem nó có chia hết cho số đầu vào hay không. Hoàn trả đúng hay sai."; +Blockly.Msg.MATH_IS_WHOLE = "là số nguyên"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "số dư của %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Chia số thứ nhất cho số thứ hai rồi hoàn trả số dư từ."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://vi.wikipedia.org/wiki/S%E1%BB%91"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Một con số."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "giá trị trung bình của một danh sách"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "số lớn nhât của một danh sách"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "số trung vị của một danh sách"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "số nhỏ nhất của một danh sách"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "các mode của một danh sách"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "một số bất kỳ của một danh sách"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "độ lệch chuẩn của một danh sách"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "tổng của một danh sách"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Hoàn trả giá trị trung bình từ của danh sách số."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Hoàn trả số lớn nhất trong tất cả các số trong danh sách."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Hoàn trả số trung vị của danh sách số."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Hoàn trả số nhỏ nhất trong tất cả các số trong danh sách."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Hoàn trả các số có mặt nhiều nhất trong danh sách."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Hoàn trả một số bất kỳ từ các số trong danh sách."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Hoàn trả độ lệch chuẩn của danh sách số."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Hoàn trả tổng số của tất cả các số trong danh sách."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "phân số bất kỳ"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Hoàn trả một phân số bất kỳ không nhỏ hơn 0.0 và không lớn hơn 1.0."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "Một số nguyên bất kỳ từ %1 đến %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Hoàn trả một số nguyên bất kỳ lớn hơn hoặc bằng số đầu và nhỏ hơn hoặc bằng số sau."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "làm tròn"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "làm tròn xuống"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "làm tròn lên"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Làm tròn lên hoặc tròn xuống số đầu vào."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://vi.wikipedia.org/wiki/C%C4%83n_b%E1%BA%ADc_hai"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "giá trị tuyệt đối"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "căn bật hai"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Hoàn trả giá trị tuyệt đối của số đầu vào."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Hoàn trả lũy thừa của số e với số mũ đầu vào."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Hoàn trả lôgarit tự nhiên của số đầu vào."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Hoàn trả lôgarit cơ số 10 của số đầu vào."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Đổi dấu của số đầu vào: âm thành dương và dương thành âm, và hoàn trả số mới."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Hoàn trả lũy thừa của số 10 với số mũ đầu vào."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Hoàn trả căn bật hai của số đầu vào."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://vi.wikipedia.org/wiki/H%C3%A0m_l%C6%B0%E1%BB%A3ng_gi%C3%A1c"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Hoàn trả Arccos của một góc (theo độ)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Hoàn trả Arcsin của một góc (theo độ)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Hoàn trả Arctang của một góc (theo độ)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Hoàn trả Cos của một góc (theo độ)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Hoàn trả Sin của một góc (theo độ)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Hoàn trả Tang của một góc (theo độ)."; +Blockly.Msg.NEW_VARIABLE = "Biến mới..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Tên của biến mới:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "cho phép báo cáo"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "với:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Chạy một thủ tục không có giá trị hoàn trả."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Chạy một thủ tục có giá trị hoàn trả."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "với:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Tạo mảnh \"thực hiện %1\""; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "thủ tục"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = ""; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Một thủ tục không có giá trị hoàn trả."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "hoàn trả"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Một thủ tục có giá trị hoàn trả."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Chú ý: Thủ tục này có lặp lại tên các tham số."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Làm nổi bật thủ tục"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Khi điều kiện đúng thì hoàn trả một giá trị."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Chú ý: Mảnh này chỉ có thể dùng trong một thủ tục."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "biến:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Thêm một đầu vào cho hàm."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "các tham số"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Thêm, xóa hoặc sắp xếp lại các đầu vào cho hàm này."; +Blockly.Msg.REDO = "Redo"; // untranslated +Blockly.Msg.REMOVE_COMMENT = "Xóa Chú Giải"; +Blockly.Msg.RENAME_VARIABLE = "Thay tên biến..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Thay tên tất cả \"%1\" biến này thành:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "thêm văn bản"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "ở cuối"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Thêm một mảng văn bản vào biến \"%1\"."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "thành chữ thường"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "thành Chữ In Đầu Mỗi Từ"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "thành CHỮ IN HOA"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Hoàn trả văn bản sau khi chuyển đổi chữ in hoa hay thường."; +Blockly.Msg.TEXT_CHARAT_FIRST = "lấy ký tự đầu tiên"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "lấy từ phía cuối, ký tự thứ"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "lấy ký tự thứ"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "trong văn bản"; +Blockly.Msg.TEXT_CHARAT_LAST = "lấy ký tự cuối cùng"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "lấy ký tự bất kỳ"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Hoàn trả ký tự ở vị trí đặt ra."; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "count %1 in %2"; // untranslated +Blockly.Msg.TEXT_COUNT_TOOLTIP = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "thêm vật mới vào văn bản."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "kết nối"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Thêm, bỏ, hoặc sắp xếp lại các thành phần để tạo dựng mảnh văn bản này."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "đến từ phía cuối, ký tự thứ"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "đến ký tự thứ"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "đến ký tự cuối cùng"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "trong văn bản"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "lấy từ ký tự đầu tiên"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "lấy từ phía cuối, ký tự thứ"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "lấy từ ký tự thứ"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Hoàn trả một mảng ký tự ấn định từ trong văn bản."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "trong văn bản"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "tìm sự có mặt đầu tiên của"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "tìm sự có mặt cuối cùng của"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Hoàn trả vị trí xuất hiện đầu/cuối của văn bản thứ nhất trong văn bản thứ hai. Nếu không tìm thấy thì hoàn trả số %1."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 trống không"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Hoàn trả “đúng nếu văn bản không có ký tự nào."; +Blockly.Msg.TEXT_JOIN_HELPURL = ""; +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "tạo văn bản từ"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Tạo một văn bản từ các thành phần."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "độ dài của %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Hoàn trả số lượng ký tự (kể cả khoảng trắng) trong văn bản đầu vào."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "in lên màng hình %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "In ra màng hình một văn bản, con số, hay một giá trị đầu vào khác."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Xin người dùng nhập vào một con số."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Xin người dùng nhập vào một văn bản."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "Xin người dùng nhập vào con số với dòng hướng dẫn"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "Xin người dùng nhập vào văn bản với dòng hướng dẫn"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "reverse %1"; // untranslated +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/string_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Một ký tự, một từ, hay một dòng."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "cắt các không gian từ cả hai mặt của"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "cắt các không gian từ bên trái của"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "cắt các không gian từ bên phải của"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Hoàn trả bản sao của văn bản sau khi xóa khoảng trắng từ một hoặc hai bên."; +Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.UNDO = "Undo"; // untranslated +Blockly.Msg.VARIABLES_DEFAULT_NAME = "vật"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Tạo mảnh \"đặt vào %1\""; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Hoàn trả giá trị của."; +Blockly.Msg.VARIABLES_SET = "cho %1 bằng %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Tạo mảnh \"lấy %1\""; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Đặt giá trị của biến này thành..."; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "A variable named '%1' already exists."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/zh-hans.js b/src/opsoro/server/static/js/blockly/msg/js/zh-hans.js new file mode 100644 index 0000000..8faa0cc --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/zh-hans.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.zh.hans'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "添加注释"; +Blockly.Msg.CHANGE_VALUE_TITLE = "更改值:"; +Blockly.Msg.CLEAN_UP = "整理块"; +Blockly.Msg.COLLAPSE_ALL = "折叠块"; +Blockly.Msg.COLLAPSE_BLOCK = "折叠块"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "颜色1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "颜色2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "比例"; +Blockly.Msg.COLOUR_BLEND_TITLE = "混合"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "用一个给定的比率(0.0-1.0)混合两种颜色。"; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://zh.wikipedia.org/wiki/颜色"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "从调色板中选择一种颜色。"; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "随机颜色"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "随机选择一种颜色。"; +Blockly.Msg.COLOUR_RGB_BLUE = "蓝色"; +Blockly.Msg.COLOUR_RGB_GREEN = "绿色"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "红色"; +Blockly.Msg.COLOUR_RGB_TITLE = "颜色"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "通过指定红色、绿色和蓝色的量创建一种颜色。所有的值必须在0和100之间。"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "中断循环"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "继续下一次循环"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "中断包含它的循环。"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "跳过这个循环的剩余部分,并继续下一次迭代。"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "警告:此块仅可用于在一个循环内。"; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "为每个项目 %1 在列表中 %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "遍历每个列表中的项目,将变量“%1”设定到该项中,然后执行某些语句。"; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "使用 %1 从范围 %2 到 %3 每隔 %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "从起始数到结尾数中取出变量“%1”的值,按指定的时间间隔,执行指定的块。"; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "在if语句块中增加一个条件。"; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "添加一个最终的,包括所有情况的节到if块中。"; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "增加、删除或重新排列各节来重新配置“if”块。"; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "否则"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "否则如果"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "如果"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "如果值为真,执行一些语句。"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "如果值为真,则执行第一块语句。否则,则执行第二块语句。"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "如果第一个值为真,则执行第一块的语句。否则,如果第二个值为真,则执行第二块的语句。"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "如果第一个值为真,则执行第一块对语句。否则,如果第二个值为真,则执行语句的第二块。如果没有值为真,则执行最后一块的语句。"; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://zh.wikipedia.org/wiki/For循环"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "执行"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "重复 %1 次"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "多次执行一些语句。"; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "重复直到"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "重复当"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "只要值为假,执行一些语句。"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "只要值为真,执行一些语句。"; +Blockly.Msg.DELETE_ALL_BLOCKS = "删除所有%1块吗?"; +Blockly.Msg.DELETE_BLOCK = "删除块"; +Blockly.Msg.DELETE_VARIABLE = "删除“%1”变量"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "删除“%2”变量的%1用途么?"; +Blockly.Msg.DELETE_X_BLOCKS = "删除 %1 块"; +Blockly.Msg.DISABLE_BLOCK = "禁用块"; +Blockly.Msg.DUPLICATE_BLOCK = "复制"; +Blockly.Msg.ENABLE_BLOCK = "启用块"; +Blockly.Msg.EXPAND_ALL = "展开块"; +Blockly.Msg.EXPAND_BLOCK = "展开块"; +Blockly.Msg.EXTERNAL_INPUTS = "外部输入"; +Blockly.Msg.HELP = "帮助"; +Blockly.Msg.INLINE_INPUTS = "单行输入"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "创建空列表"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "返回一个列表,长度为 0,不包含任何数据记录"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "列表"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "增加、删除或重新排列各部分以此重新配置这个列表块。"; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "建立列表使用"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "将一个项添加到列表中。"; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "建立一个具有任意数量项目的列表。"; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "第一"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "倒数第#"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; +Blockly.Msg.LISTS_GET_INDEX_GET = "取得"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "取出并移除"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "最后"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "随机"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "移除"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = "空白"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "返回列表中的第一个项目。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "返回在列表中的指定位置的项。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "返回列表中的最后一项。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "随机返回列表中的一个项目。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "移除并返回列表中的第一个项目。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "移除并返回列表中的指定位置的项。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "移除并返回列表中的最后一个项目。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "移除并返回列表中的一个随机项目中。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "移除列表中的第一项"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "移除在列表中的指定位置的项。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "移除列表中的最后一项"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "删除列表中的一个随机的项。"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "到倒数第#"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "到#"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "到最后"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "从头获得子列表"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "从倒数#取得子列表"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "从#取得子列表"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "空白"; +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "复制列表中指定的部分。"; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1是最后一项。"; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1是第一个项目。"; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "找出第一个项出现"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "找出最后一个项出现"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "返回在列表中的第一/最后一个匹配项的索引值。如果找不到项目则返回%1。"; +Blockly.Msg.LISTS_INLIST = "在列表中"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1是空的"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "如果改列表为空,则返回真。"; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "%1的长度"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "返回列表的长度。"; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "建立列表使用项 %1 重复 %2 次"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "建立包含指定重复次数的值的列表。"; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "倒转%1"; +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "倒转一个列表的拷贝。"; +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "为"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "插入在"; +Blockly.Msg.LISTS_SET_INDEX_SET = "设置"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "在列表的起始处添加该项。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "插入在列表中指定位置的项。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "将该项追加到列表的末尾。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "在列表中随机插入项。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "设置列表中的第一个项目。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "设置在列表中指定位置的项。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "设置列表中的最后一项。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "设置列表中一个随机的项目。"; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "升序"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "降序"; +Blockly.Msg.LISTS_SORT_TITLE = "排序%1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "排序一个列表的拷贝。"; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "按字母排序,忽略大小写"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "按数字排序"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "按字母排序"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "从文本制作列表"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "从列表拆出文本"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "加入文本列表至一个文本,由分隔符分隔。"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "拆分文本到文本列表,按每个分隔符拆分。"; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "用分隔符"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "假"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "返回真或假。"; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "真"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://zh.wikipedia.org/wiki/不等"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "如果两个输入结果相等,则返回真。"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "如果第一个输入结果比第二个大,则返回真。"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "如果第一个输入结果大于或等于第二个输入结果,则返回真。"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "如果第一个输入结果比第二个小,则返回真。"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "如果第一个输入结果小于或等于第二个输入结果,则返回真。"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "如果两个输入结果不相等,则返回真。"; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg.LOGIC_NEGATE_TITLE = "非%1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "如果输入结果为假,则返回真;如果输入结果为真,则返回假。"; +Blockly.Msg.LOGIC_NULL = "空"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "返回空值。"; +Blockly.Msg.LOGIC_OPERATION_AND = "和"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "或"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "如果两个输入结果都为真,则返回真。"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "如果至少有一个输入结果为真,则返回真。"; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "测试"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://zh.wikipedia.org/wiki/条件运算符"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "如果为假"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "如果为真"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "检查“test”中的条件。如果条件为真,则返回“if true”的值,否则,则返回“if false”的值。"; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://zh.wikipedia.org/wiki/算术"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "返回两个数字的和。"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "返回两个数字的商。"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "返回两个数字的区别。"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "返回两个数字的乘积。"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "返回第一个数的第二个数次幂。"; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://zh.wikipedia.org/wiki/加法"; +Blockly.Msg.MATH_CHANGE_TITLE = "更改 %1 从 %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "将一个数添加到变量“%1”。"; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://zh.wikipedia.org/wiki/数学常数"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "返回一个常见常量:π (3.141......),e (2.718...)、φ (1.618...)、 sqrt(2) (1.414......)、sqrt(½) (0.707......)或 ∞(无穷大)。"; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "限制数字 %1 介于 (低) %2 到 (高) %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "限制数字介于两个指定的数字之间"; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "可被整除"; +Blockly.Msg.MATH_IS_EVEN = "是偶数"; +Blockly.Msg.MATH_IS_NEGATIVE = "为负"; +Blockly.Msg.MATH_IS_ODD = "是奇数"; +Blockly.Msg.MATH_IS_POSITIVE = "为正"; +Blockly.Msg.MATH_IS_PRIME = "是质数"; +Blockly.Msg.MATH_IS_TOOLTIP = "如果数字是偶数、奇数、非负整数、正数、负数或如果它可被某数字整除,则返回真或假。"; +Blockly.Msg.MATH_IS_WHOLE = "为整数"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://zh.wikipedia.org/wiki/模除"; +Blockly.Msg.MATH_MODULO_TITLE = "取余数自 %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "返回这两个数字相除后的余数。"; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://zh.wikipedia.org/wiki/数"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "一个数字。"; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "列表中的平均数"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "列表中的最大值"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "列表中位数"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "列表中的最小值"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "列表模式"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "列表的随机项"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "列表中的标准差"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "列表中的数的总和"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "返回列表中的数值的平均值。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "返回列表中最大数。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "返回列表中的中位数。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "返回列表中最小数。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "返回列表中的最常见的项的列表。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "从列表中返回一个随机的元素。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "返回列表的标准偏差。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "返回列表中的所有数字的和。"; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://zh.wikipedia.org/wiki/随机数生成器"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "随机分数"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "返回介于(包含)0.0到1.0之间的随机数。"; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://zh.wikipedia.org/wiki/随机数生成器"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "从 %1 到 %2 之间的随机整数"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "返回两个指定的范围(含)之间的随机整数。"; +Blockly.Msg.MATH_ROUND_HELPURL = "https://zh.wikipedia.org/wiki/数值修约"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "向下舍入"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "向下舍入"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "向上舍入"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "数字向上或向下舍入。"; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://zh.wikipedia.org/wiki/平方根"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "绝对"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "平方根"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "返回一个数的绝对值。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "返回一个数的e次幂。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "返回一个数的自然对数。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "返回一个数的对数。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "返回一个数的逻辑非。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "返回一个数的10次幂。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "返回一个数的平方根。"; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://zh.wikipedia.org/wiki/三角函数"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "返回一个数的反余弦值。"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "返回一个数的反正弦值。"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "返回指定角度的反正切值。"; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "返回指定角度的余弦值(非弧度)。"; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "返回指定角度的正弦值(非弧度)。"; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "返回指定角度的正切值(非弧度)。"; +Blockly.Msg.NEW_VARIABLE = "创建变量..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "新变量的名称:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "空白"; +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "允许声明"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "与:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://zh.wikipedia.org/wiki/子程序"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "运行用户定义的函数“%1”。"; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://zh.wikipedia.org/wiki/子程序"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "运行用户定义的函数“%1”,并使用它的输出值。"; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "与:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "创建“%1”"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "描述该功能..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = "空白"; +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://zh.wikipedia.org/wiki/子程序"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "做点什么"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "至"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "创建一个不带输出值的函数。"; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://zh.wikipedia.org/wiki/子程序"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "返回"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "创建一个有输出值的函数。"; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "警告: 此函数具有重复参数。"; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "突出显示函数定义"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "如果值为真,则返回第二个值。"; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "警告: 仅在定义函数内可使用此块。"; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "输入名称:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "添加函数输入。"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "输入"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "添加、删除或重新排此函数的输入。"; +Blockly.Msg.REDO = "重做"; +Blockly.Msg.REMOVE_COMMENT = "删除注释"; +Blockly.Msg.RENAME_VARIABLE = "重命名变量..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "将所有“%1”变量重命名为:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "追加文本"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "在"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "将一些文本追加到变量“%1”。"; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "转为小写"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "将首字母大写"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "转为大写"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "在不同大小写下复制并返回这段文字。"; +Blockly.Msg.TEXT_CHARAT_FIRST = "获得第一个字符"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "获得倒数第#个字符"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "获得字符#"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "于文本中"; +Blockly.Msg.TEXT_CHARAT_LAST = "获得最后一个字符"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "获取随机的字母"; +Blockly.Msg.TEXT_CHARAT_TAIL = "空白"; +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "返回位于指定位置的字母。"; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "将%1计算在%2之内"; +Blockly.Msg.TEXT_COUNT_TOOLTIP = "计算在一些其他文本中,部分文本重现了多少次。"; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "将一个项添加到文本中。"; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "加入"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "添加、移除或重新排列各节来重新配置这个文本块。"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "到倒数第#个字符"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "到字符#"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "到最后一个字符"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "自文本"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "取得一段字串自第一个字符"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "取得一段字串自倒数第#个字符"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "取得一段字串自#"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = "空白"; +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "返回指定的部分文本。"; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "自文本"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "寻找第一个出现的文本"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "寻找最后一个出现的文本"; +Blockly.Msg.TEXT_INDEXOF_TAIL = "空白"; +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "返回在第二个字串中的第一/最后一个匹配项的索引值。如果未找到则返回%1。"; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1是空的"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "如果提供的文本为空,则返回真。"; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "建立字串使用"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "通过串起任意数量的项以建立一段文字。"; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "%1的长度"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "返回提供文本的字母数(包括空格)。"; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "打印%1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "打印指定的文字、数字或其他值。"; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "提示用户输入数字。"; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "提示用户输入一些文本。"; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "输入数字并显示提示消息"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "输入数字并显示提示消息"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "在%3中,将%1替换为%2"; +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "在某些其他文本中,替换部分文本的所有事件。"; +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "倒转%1"; +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "倒转文本中字符的排序。"; +Blockly.Msg.TEXT_TEXT_HELPURL = "https://zh.wikipedia.org/wiki/字符串"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "一个字母、单词或一行文本。"; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "消除两侧空格"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "消除左侧空格"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "消除右侧空格"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "复制这段文字的同时删除两端多余的空格。"; +Blockly.Msg.TODAY = "今天"; +Blockly.Msg.UNDO = "撤销"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "项目"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "创建“设定%1”"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "返回此变量的值。"; +Blockly.Msg.VARIABLES_SET = "赋值 %1 到 %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "创建“获得%1”"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "设置此变量,以使它和输入值相等。"; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "已存在名为“%1”的变量。"; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/msg/js/zh-hant.js b/src/opsoro/server/static/js/blockly/msg/js/zh-hant.js new file mode 100644 index 0000000..196ef00 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/js/zh-hant.js @@ -0,0 +1,412 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.zh.hant'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "加入註解"; +Blockly.Msg.CHANGE_VALUE_TITLE = "修改值:"; +Blockly.Msg.CLEAN_UP = "整理積木"; +Blockly.Msg.COLLAPSE_ALL = "收合積木"; +Blockly.Msg.COLLAPSE_BLOCK = "收合積木"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "顏色 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "顏色 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "比例"; +Blockly.Msg.COLOUR_BLEND_TITLE = "混合"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "用一個給定的比率(0.0-1.0)混合兩種顏色。"; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://zh.wikipedia.org/wiki/顏色"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "從調色板中選擇一種顏色。"; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "隨機顏色"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "隨機選擇一種顏色。"; +Blockly.Msg.COLOUR_RGB_BLUE = "藍"; +Blockly.Msg.COLOUR_RGB_GREEN = "綠"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "紅"; +Blockly.Msg.COLOUR_RGB_TITLE = "顏色"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "透過指定紅、綠、 藍色的值來建立一種顏色。所有的值必須介於 0 和 100 之間。"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "中斷循環"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "繼續下一個循環"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "中斷當前的循環。"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "跳過這個循環的其餘步驟,並繼續下一次的循環。"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "警告: 此積木僅可用於迴圈內。"; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "取出每個 %1 自清單 %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "遍歷每個清單中的項目,將變數「%1」設定到該項目中,然後執行某些陳述式。"; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "循環計數 %1 從 %2 到 %3 間隔數 %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "從起始數到結尾數中取出變數「%1」的值,按指定的時間間隔,執行指定的積木。"; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "添加條件到「如果」積木。"; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "加入一個最終、所有條件都執行的區塊到「如果」積木中。"; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "添加、 刪除或重新排列各區塊以重新配置這個「如果」積木。"; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "否則"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "否則如果"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "如果"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "當值為 true 時,執行一些陳述式。"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "當值為 true 時,執行第一個陳述式,否則,執行第二個陳述式。"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "如果第一個值為 true,則執行第一個陳述式。否則,當第二個值為 true 時,則執行第二個陳述式。"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "如果第一個值為 true,則執行第一個陳述式。否則當第二個值為 true 時,則執行第二個陳述式。如果前幾個敘述都不為 ture,則執行最後一個陳述式。"; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://zh.wikipedia.org/wiki/For迴圈"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "執行"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "重複 %1 次"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "重複執行指定的陳述式多次。"; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "重複 直到"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "重複 當"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "當值為 false 時,執行一些陳述式。"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "當值為 true 時,執行一些陳述式。"; +Blockly.Msg.DELETE_ALL_BLOCKS = "刪除共 %1 個積木?"; +Blockly.Msg.DELETE_BLOCK = "刪除積木"; +Blockly.Msg.DELETE_VARIABLE = "刪除變數「%1」"; +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = "刪除%1使用的「%2」變數?"; +Blockly.Msg.DELETE_X_BLOCKS = "刪除 %1 個積木"; +Blockly.Msg.DISABLE_BLOCK = "停用積木"; +Blockly.Msg.DUPLICATE_BLOCK = "複製"; +Blockly.Msg.ENABLE_BLOCK = "啟用積木"; +Blockly.Msg.EXPAND_ALL = "展開積木"; +Blockly.Msg.EXPAND_BLOCK = "展開積木"; +Blockly.Msg.EXTERNAL_INPUTS = "多行輸入"; +Blockly.Msg.HELP = "幫助"; +Blockly.Msg.INLINE_INPUTS = "單行輸入"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "建立空的清單"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "返回一個長度(項目數量)為 0 的清單,不包含任何資料記錄"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "清單"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "添加、刪除或重新排列各區塊以重新配置這個「清單」積木。"; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "使用這些值建立清單"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "添加一個項目到清單裡。"; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "建立一個具備任意數量項目的清單。"; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "第一筆"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "倒數第 # 筆"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "取得"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "取得並移除"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "最後一筆"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "隨機"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "移除"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "返回清單中的第一個項目。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "返回在清單中指定位置的項目。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "返回清單中的最後一個項目。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "返回清單中隨機一個項目。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "移除並返回清單中的第一個項目。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = "移除並返回清單中的指定位置的項目。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "移除並返回清單中的最後一個項目。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "移除並返回清單中的隨機項目。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "移除清單中的第一個項目。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = "移除在清單中指定位置的項目。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "移除清單中的最後一個項目。"; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "移除清單中隨機一個項目。"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "到 # 倒數"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "到 #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "到 最後面"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "取得子清單 從 最前面"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "取得子清單 從 # 倒數"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "取得子清單 從 #"; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "複製清單中指定的部分。"; +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 是最後一個項目。"; +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 是第一個項目。"; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "從 最前面 索引項目"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "從 最後面 索引項目"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "在清單中檢索是否有包含項目,如果有,返回從頭/倒數算起的索引值。如果沒有則返回 %1。"; +Blockly.Msg.LISTS_INLIST = "自清單"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 值為空"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "如果該清單為空,則返回 true。"; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "長度 %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "返回清單的長度(項目數)。"; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "建立清單使用項目 %1 重複 %2 次"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "建立一個清單,項目中包含指定重複次數的值。"; +Blockly.Msg.LISTS_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = "反轉%1"; +Blockly.Msg.LISTS_REVERSE_TOOLTIP = "反轉清單的複製內容。"; +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "為"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "添加"; +Blockly.Msg.LISTS_SET_INDEX_SET = "設定"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "添加一個項目到清單中的第一個位置。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = "添加一個項目到清單中的指定位置。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "添加一個項目到清單中的最後一個位置。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "添加一個項目到清單中的隨機位置。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "設定清單中的第一個項目。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = "設定清單中指定位置的項目。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "設定清單中的最後一個項目。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "設定清單中隨機一個項目。"; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "升序"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "降序"; +Blockly.Msg.LISTS_SORT_TITLE = "排列 %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "排序清單的複製內容。"; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "依字母排序,忽略大小寫"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "依數字"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "依字母"; +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "從文本製作清單"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "從清單拆出文本"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "串起清單項目成一個文本,並用分隔符號分開。"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "將文本變成清單項目,按分隔符號拆分。"; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "用分隔符"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "false"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "返回 true 或 false。"; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "true"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://zh.wikipedia.org/wiki/不等"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "如果這兩個輸入區塊的結果相等,返回 true。"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "如果第一個輸入結果大於第二個,返回 true。"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "如果第一個輸入結果大於或等於第二個,返回 true。"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "如果第一個輸入結果比第二個小,返回 true。"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "如果第一個輸入結果小於或等於第二個,返回 true。"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "如果這兩個輸入區塊的結果不相等,返回 true。"; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "%1 不成立"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "如果輸入結果是 false,則返回 true。如果輸入結果是 true,則返回 false。"; +Blockly.Msg.LOGIC_NULL = "null"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "返回 null。"; +Blockly.Msg.LOGIC_OPERATION_AND = "且"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "或"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "如果兩個輸入結果都為 true,則返回 true。"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "如果至少一個輸入結果為 true,返回 true。"; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "測試"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://zh.wikipedia.org/wiki/條件運算符"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "如果為 false"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "如果為 true"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "檢查「測試」中的條件。如果條件為 true,將返回「如果為 true」的值;否則,返回「如果為 false」的值。"; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://zh.wikipedia.org/wiki/算術"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "返回兩個數字的總和。"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "返回兩個數字的商。"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "返回兩個數字的差。"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "返回兩個數字的乘積。"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "返回第二個數字的指數的第一個數字。"; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://zh.wikipedia.org/wiki/加法"; +Blockly.Msg.MATH_CHANGE_TITLE = "修改 %1 自 %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "將數字加到變數「%1」。"; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://zh.wikipedia.org/wiki/數學常數"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "返回一個的常見常量: π (3.141......),e (2.718...)、 φ (1.618...)、 開方(2) (1.414......)、 開方(½) (0.707......) 或 ∞ (無窮大)。"; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "限制數字 %1 介於(低)%2 到(高)%3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "限制數字介於兩個指定的數字之間(包含)。"; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "可被整除"; +Blockly.Msg.MATH_IS_EVEN = "是偶數"; +Blockly.Msg.MATH_IS_NEGATIVE = "是負值"; +Blockly.Msg.MATH_IS_ODD = "是奇數"; +Blockly.Msg.MATH_IS_POSITIVE = "是正值"; +Blockly.Msg.MATH_IS_PRIME = "是質數"; +Blockly.Msg.MATH_IS_TOOLTIP = "如果數字是偶數,奇數,非負整數,正數、 負數,或如果它是可被某數字整除,則返回 true 或 false。"; +Blockly.Msg.MATH_IS_WHOLE = "是非負整數"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://zh.wikipedia.org/wiki/模除"; +Blockly.Msg.MATH_MODULO_TITLE = "%1 除以 %2 的餘數"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "回傳兩個數字相除的餘數。"; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://zh.wikipedia.org/wiki/數"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "一個數字。"; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "平均數 自清單"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "最大值 自清單"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "中位數 自清單"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "最小值 自清單"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "比較眾數 自清單"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "隨機抽取 自清單"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "標準差 自清單"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "數字總和 自清單"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "返回清單中數值的平均值(算術平均值)。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "返回清單項目中最大的數字。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "返回清單中數值的中位數。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "返回清單項目中最小的數字。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "返回一個清單中的最常見的項目。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "從清單中返回一個隨機的項目。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "返回清單中數字的標準差。"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "返回清單中的所有數字的總和。"; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://zh.wikipedia.org/wiki/隨機數生成器"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "隨機取分數"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "在 0.0(包含)和 1.0(不包含)之間隨機取一個數。"; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://zh.wikipedia.org/wiki/隨機數生成器"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "隨機取數 %1 到 %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "在指定二個數之間隨機取一個數(包含)。"; +Blockly.Msg.MATH_ROUND_HELPURL = "https://zh.wikipedia.org/wiki/數值簡化"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "四捨五入"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "無條件捨去"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "無條件進位"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "將數字無條件進位或無條件捨去。"; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://zh.wikipedia.org/wiki/平方根"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "絕對值"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "開根號"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "返回指定數字的絕對值。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "返回指定數字指數的 e"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "返回指定數字的自然對數。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "返回指定數字的對數。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "返回指定數字的 negation。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "返回指定數字指數的10的冪次。"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "返回指定數字的平方根。"; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://zh.wikipedia.org/wiki/三角函數"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "返回指定角度的反餘弦值(非弧度)。"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "返回指定角度的反正弦值(非弧度)。"; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "返回指定角度的反正切值。"; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "返回指定角度的餘弦值(非弧度)。"; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "返回指定角度的正弦值(非弧度)。"; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "返回指定角度的正切值(非弧度)。"; +Blockly.Msg.NEW_VARIABLE = "建立變數..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "新變數名稱:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "允許陳述式"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "與:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://zh.wikipedia.org/wiki/%E5%AD%90%E7%A8%8B%E5%BA%8F"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "執行使用者定義的函式「%1」。"; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://zh.wikipedia.org/wiki/%E5%AD%90%E7%A8%8B%E5%BA%8F"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "執行使用者定義的函式「%1」,並使用它的回傳值。"; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "與:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "建立「%1」"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "描述此函式..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://zh.wikipedia.org/wiki/子程式"; +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "做些什麼"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "到"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "創建一個無回傳值的函式。"; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://zh.wikipedia.org/wiki/子程式"; +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "返回"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "創建一個有回傳值的的函式。"; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "警告: 此函式中有重複的參數。"; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "反白顯示函式定義"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "如果值為 true,則返回第二個值。"; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "警告:這個積木只可以在定義函式時使用。"; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "輸入名稱:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "添加一個輸入區塊到函式。"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "輸入"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "添加、刪除或重新排列此函式的輸入。"; +Blockly.Msg.REDO = "重試"; +Blockly.Msg.REMOVE_COMMENT = "移除註解"; +Blockly.Msg.RENAME_VARIABLE = "重新命名變數..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "將所有「%1」變數重新命名為:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "後加入文字"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "在"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "添加一些文字到變數「%1」之後。"; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "轉成 英文小寫"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "轉成 英文首字大寫"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "轉成 英文大寫"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "使用不同的大小寫複製這段文字。"; +Blockly.Msg.TEXT_CHARAT_FIRST = "取得 第一個字元"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "取得 倒數第 # 個字元"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "取得 字元 #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "在字串"; +Blockly.Msg.TEXT_CHARAT_LAST = "取得 最後一個字元"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "取得 任意字元"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "返回位於指定位置的字元。"; +Blockly.Msg.TEXT_COUNT_HELPURL = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg.TEXT_COUNT_MESSAGE0 = "在%2計算%1"; +Blockly.Msg.TEXT_COUNT_TOOLTIP = "計算某些文字在內容裡的出現次數。"; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "添加一個項目到字串中。"; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "加入"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "添加、刪除或重新排列各區塊以重新配置這個文字積木。"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "到 倒數第 # 個字元"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "到 字元 #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "到 最後一個字元"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "在字串"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "取得 第一個字元"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "取得 倒數第 # 個字元"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "取得 字元 #"; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "返回指定的部分文字。"; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "在字串"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "從 最前面 索引字串"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "從 最後面 索引字串"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "在字串1中檢索是否有包含字串2,如果有,返回從頭/倒數算起的索引值。如果沒有則返回 %1。"; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 為空"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "如果提供的字串為空,則返回 true。"; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "字串組合"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "通過連接任意數量的項目來建立一串文字。"; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "長度 %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "返回這串文字的字元數(包含空格)。"; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "輸出 %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "輸出指定的文字、 數字或其他值。"; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "輸入數字"; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "輸入文字"; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "輸入 數字 並顯示提示訊息"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "輸入 文字 並顯示提示訊息"; +Blockly.Msg.TEXT_REPLACE_HELPURL = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = "在%3以%2取代%1"; +Blockly.Msg.TEXT_REPLACE_TOOLTIP = "取代在內容裡的全部某些文字。"; +Blockly.Msg.TEXT_REVERSE_HELPURL = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = "反轉%1"; +Blockly.Msg.TEXT_REVERSE_TOOLTIP = "反轉排序在文字裡的字元。"; +Blockly.Msg.TEXT_TEXT_HELPURL = "https://zh.wikipedia.org/wiki/字串"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "一個字元、一個單詞,或一串文字。"; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "消除兩側空格"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "消除左側空格"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "消除右側空格"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "複製這段文字,同時刪除兩端多餘的空格。"; +Blockly.Msg.TODAY = "今天"; +Blockly.Msg.UNDO = "復原"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "變數"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "建立「賦值 %1」"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "返回此變數的值。"; +Blockly.Msg.VARIABLES_SET = "賦值 %1 成 %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "建立「取得 %1」"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "設定此變數,好和輸入結果相等。"; +Blockly.Msg.VARIABLE_ALREADY_EXISTS = "一個名為「%1」的變數已存在。"; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; + +Blockly.Msg.MATH_HUE = "230"; +Blockly.Msg.LOOPS_HUE = "120"; +Blockly.Msg.LISTS_HUE = "260"; +Blockly.Msg.LOGIC_HUE = "210"; +Blockly.Msg.VARIABLES_HUE = "330"; +Blockly.Msg.TEXTS_HUE = "160"; +Blockly.Msg.PROCEDURES_HUE = "290"; +Blockly.Msg.COLOUR_HUE = "20"; \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ar.json b/src/opsoro/server/static/js/blockly/msg/json/ar.json similarity index 89% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/ar.json rename to src/opsoro/server/static/js/blockly/msg/json/ar.json index 2d0ff10..6d06893 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ar.json +++ b/src/opsoro/server/static/js/blockly/msg/json/ar.json @@ -3,17 +3,25 @@ "authors": [ "Meno25", "Test Create account", - "아라" + "아라", + "Diyariq", + "محمد أحمد عبد الفتاح", + "Moud hosny", + "ديفيد", + "Samir" ] }, "VARIABLES_DEFAULT_NAME": "البند", - "DUPLICATE_BLOCK": "ادمج", + "TODAY": "اليوم", + "DUPLICATE_BLOCK": "مكرر", "ADD_COMMENT": "اضافة تعليق", "REMOVE_COMMENT": "ازل التعليق", "EXTERNAL_INPUTS": "ادخال خارجي", "INLINE_INPUTS": "ادخال خطي", "DELETE_BLOCK": "إحذف القطعة", "DELETE_X_BLOCKS": "إحذف قطع %1", + "DELETE_ALL_BLOCKS": "حذف كل مناعات %1؟", + "CLEAN_UP": "مجموعات التنظيف", "COLLAPSE_BLOCK": "إخفاء القطعة", "COLLAPSE_ALL": "إخفاء القطع", "EXPAND_BLOCK": "وسٌّع القطعة", @@ -21,12 +29,16 @@ "DISABLE_BLOCK": "عطّل القطعة", "ENABLE_BLOCK": "أعد تفعيل القطعة", "HELP": "مساعدة", - "CHAT": "دردش مع زملائك بالكتابة في هذا الصندوق!", + "UNDO": "رجوع", + "REDO": "إعادة", "CHANGE_VALUE_TITLE": "تغيير قيمة:", - "NEW_VARIABLE": "متغير جديد...", - "NEW_VARIABLE_TITLE": "اسم المتغير الجديد:", "RENAME_VARIABLE": "إعادة تسمية المتغير...", "RENAME_VARIABLE_TITLE": "إعادة تسمية كافة المتغيرات '%1' إلى:", + "NEW_VARIABLE": "إنشاء متغير...", + "NEW_VARIABLE_TITLE": "اسم المتغير الجديد:", + "VARIABLE_ALREADY_EXISTS": "المتغير '%1' موجود بالفعل", + "DELETE_VARIABLE_CONFIRMATION": "حذف%1 1 استخدامات المتغير '%2'؟", + "DELETE_VARIABLE": "حذف المتغير %1", "COLOUR_PICKER_HELPURL": "https://ar.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "اختر لون من اللوحة.", "COLOUR_RANDOM_TITLE": "لون عشوائي", @@ -51,7 +63,7 @@ "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "اكرّر حتى", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "بما ان القيمة صحيحة, نفّذ بعض الأوامر.", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "بما ان القيمة خاطئة, نفّذ بعض الأوامر.", - "CONTROLS_FOR_TOOLTIP": "اجعل المتغير %1 يأخذ القيم من رقم البداية الى رقم النهاية، قم بالعد داخل المجال المحدد، وطبق أوامر القطع المحددة.", + "CONTROLS_FOR_TOOLTIP": "اجعل المتغير %1 يأخذ القيم من رقم البداية الى رقم النهاية، وقم بالعد داخل المجال المحدد، وطبق أوامر القطع المحددة.", "CONTROLS_FOR_TITLE": "عد بـ %1 من %2 إلى %3 بمعدل %4", "CONTROLS_FOREACH_TITLE": "لكل عنصر %1 في قائمة %2", "CONTROLS_FOREACH_TOOLTIP": "لكل عنصر في قائمة ما، عين المتغير '%1' لهذا الغنصر، ومن ثم نفذ بعض الأوامر.", @@ -189,7 +201,7 @@ "TEXT_LENGTH_TOOLTIP": "تقوم بإرجاع عدد الاحرف (بما في ذلك الفراغات) في النص المقدم.", "TEXT_ISEMPTY_TITLE": "%1 فارغ", "TEXT_ISEMPTY_TOOLTIP": "يرجع \"صحيح\" إذا كان النص المقدم فارغ.", - "TEXT_INDEXOF_TOOLTIP": "تقوم بإرجاع مؤشر التواجد الأول/الأخير للنص الأول في النص الثاني. تقوم بإرجاع 0 إذا لم يتم العثور على النص.", + "TEXT_INDEXOF_TOOLTIP": "تقوم بإرجاع مؤشر التواجد الأول/الأخير للنص الأول في النص الثاني. تقوم بإرجاع %1 إذا لم يتم العثور على النص.", "TEXT_INDEXOF_INPUT_INTEXT": "في النص", "TEXT_INDEXOF_OPERATOR_FIRST": "ابحث عن التواجد الأول للنص", "TEXT_INDEXOF_OPERATOR_LAST": "ابحث عن التواجد الأخير للنص", @@ -222,6 +234,7 @@ "TEXT_PROMPT_TYPE_NUMBER": "انتظر ادخال المستخدم لرقم ما مع اظهار رسالة", "TEXT_PROMPT_TOOLTIP_NUMBER": "انتظر ادخال المستخذم لرقم ما.", "TEXT_PROMPT_TOOLTIP_TEXT": "انتظر ادخال المستخدم لنص ما.", + "TEXT_REVERSE_TOOLTIP": "يعكس ترتيب حروف النص", "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "إنشئ قائمة فارغة", "LISTS_CREATE_EMPTY_TOOLTIP": "تقوم بإرجاع قائمة، طولها 0, لا تحتوي على أية سجلات البيانات", @@ -239,7 +252,7 @@ "LISTS_INLIST": "في قائمة", "LISTS_INDEX_OF_FIRST": "ابحث على على التواجد الأول للعنصر", "LISTS_INDEX_OF_LAST": "ابحث على التواجد الأخير للعنصر", - "LISTS_INDEX_OF_TOOLTIP": "تقوم بإرجاع مؤشر التواجد الأول/الأخير في القائمة. تقوم بإرجاع 0 إذا لم يتم العثور على النص.", + "LISTS_INDEX_OF_TOOLTIP": "تقوم بإرجاع مؤشر التواجد الأول/الأخير في القائمة. تقوم بإرجاع %1 إذا لم يتم العثور على النص.", "LISTS_GET_INDEX_GET": "احصل على", "LISTS_GET_INDEX_GET_REMOVE": "احصل على و ازل", "LISTS_GET_INDEX_REMOVE": "ازل", @@ -248,31 +261,28 @@ "LISTS_GET_INDEX_FIRST": "أول", "LISTS_GET_INDEX_LAST": "أخير", "LISTS_GET_INDEX_RANDOM": "عشوائي", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "يقوم بإرجاع العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأول.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "يقوم بإرجاع العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأخير.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 هو العنصر الأول.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 هو العنصر الأخير.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "يقوم بإرجاع العنصر في الموضع المحدد في قائمة ما.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "يرجع العنصر الأول في قائمة ما.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "يرجع العنصر الأخير في قائمة ما.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "يرجع عنصرا عشوائيا في قائمة.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "يزيل ويقوم بإرجاع العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأول.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "يزيل ويقوم بإرجاع العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأخير.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "يزيل ويقوم بإرجاع العنصر في الموضع المحدد في قائمة ما.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "يزيل ويرجع العنصر الأول في قائمة.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "يزيل ويرجع العنصر الأخير في قائمة ما.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "يزيل و يرجع عنصرا عشوائيا في قائمة ما.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "يزيل العنصر الموجود في الموضع المحدد في قائمة ما. #1 هو العنصر الأول.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "يزيل العنصر الموجود في الموضع المحدد في قائمة ما. #1 هو العنصر الأخير.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "يزيل العنصر الموجود في الموضع المحدد في قائمة ما.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "يزيل العنصر الأول في قائمة ما.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "يزيل العنصر الأخير في قائمة ما.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "يزيل عنصرا عشوائيا في قائمة ما.", "LISTS_SET_INDEX_SET": "تعيين", "LISTS_SET_INDEX_INSERT": "أدخل في", "LISTS_SET_INDEX_INPUT_TO": "مثل", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "يحدد العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأول.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "يحدد العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأخير.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "يحدد العنصر في الموضع المحدد في قائمة ما.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "يحدد العنصر الأول في قائمة.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "يحدد العنصر الأخير في قائمة.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "يحدد عنصرا عشوائيا في قائمة.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "يقوم بإدخال العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأول.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "يقوم بإدخال العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأخير.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "يقوم بإدخال العنصر في الموضع المحدد في قائمة ما.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "يقوم بإدراج هذا العنصر في بداية قائمة.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "ألصق هذا العنصر بنهاية قائمة.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "ادخل العنصر عشوائياً في القائمة.", @@ -283,8 +293,19 @@ "LISTS_GET_SUBLIST_END_FROM_END": "إلى # من نهاية", "LISTS_GET_SUBLIST_END_LAST": "إلى الأخير", "LISTS_GET_SUBLIST_TOOLTIP": "يقوم بإنشاء نسخة من الجزء المحدد من قائمة ما.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "رتب %1 %2 %3", + "LISTS_SORT_TOOLTIP": "فرز نسخة من القائمة.", + "LISTS_SORT_ORDER_ASCENDING": "تصاعديا", + "LISTS_SORT_ORDER_DESCENDING": "تنازليا", + "LISTS_SORT_TYPE_NUMERIC": "رقمي", + "LISTS_SORT_TYPE_TEXT": "أبجديًا", + "LISTS_SORT_TYPE_IGNORECASE": "أبجديا، وتجاهل الحالة", "LISTS_SPLIT_LIST_FROM_TEXT": "إعداد قائمة من النصوص", "LISTS_SPLIT_TEXT_FROM_LIST": "إعداد نص من القائمة", + "LISTS_SPLIT_WITH_DELIMITER": "مع محدد", + "LISTS_SPLIT_TOOLTIP_SPLIT": "تقسيم النص إلى قائمة من النصوص، وكسر في كل محدد", + "LISTS_SPLIT_TOOLTIP_JOIN": "ضم قائمة النصوص في نص واحد، مفصولة بواسطة محدد.", "VARIABLES_GET_TOOLTIP": "يرجع قيمة هذا المتغير.", "VARIABLES_GET_CREATE_SET": "انشئ 'التعيين %1'", "VARIABLES_SET": "تعيين %1 إلى %2", @@ -296,16 +317,20 @@ "PROCEDURES_BEFORE_PARAMS": "مع:", "PROCEDURES_CALL_BEFORE_PARAMS": "مع:", "PROCEDURES_DEFNORETURN_TOOLTIP": "انشئ دالة بدون مخرجات .", + "PROCEDURES_DEFNORETURN_COMMENT": "صف هذه الوظيفة...", "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "يرجع", "PROCEDURES_DEFRETURN_TOOLTIP": "انشئ دالة مع المخرجات.", + "PROCEDURES_ALLOW_STATEMENTS": "اسمح بالبيانات", "PROCEDURES_DEF_DUPLICATE_WARNING": "تحذير: هذه الدالة تحتوي على معلمات مكررة.", "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_CALLNORETURN_TOOLTIP": "تشغيل الدالة المعرفة من قبل المستخدم '%1'.", "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_CALLRETURN_TOOLTIP": "تشغيل الدالة المعرفة من قبل المستخدم %1 واستخدام مخرجاتها.", "PROCEDURES_MUTATORCONTAINER_TITLE": "المدخلات", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "إضافة أو إزالة أو إعادة ترتيب المدخلات لهذه المهمة.", "PROCEDURES_MUTATORARG_TITLE": "اسم الإدخال:", + "PROCEDURES_MUTATORARG_TOOLTIP": "أضف مدخلا إلى الوظيفة.", "PROCEDURES_HIGHLIGHT_DEF": "تسليط الضوء على تعريف الدالة", "PROCEDURES_CREATE_DO": "إنشئ '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "إذا كانت القيمة صحيحة ، اذان قم بارجاع القيمة الثانية.", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/az.json b/src/opsoro/server/static/js/blockly/msg/json/az.json similarity index 92% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/az.json rename to src/opsoro/server/static/js/blockly/msg/json/az.json index 79b1208..1463692 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/az.json +++ b/src/opsoro/server/static/js/blockly/msg/json/az.json @@ -1,10 +1,12 @@ { "@metadata": { "authors": [ - "Cekli829" + "Cekli829", + "AZISS" ] }, "VARIABLES_DEFAULT_NAME": "element", + "TODAY": "Bugün", "DUPLICATE_BLOCK": "Dublikat", "ADD_COMMENT": "Şərh əlavə et", "REMOVE_COMMENT": "Şərhi sil", @@ -12,6 +14,8 @@ "INLINE_INPUTS": "Sətiriçi girişlər", "DELETE_BLOCK": "Bloku sil", "DELETE_X_BLOCKS": "%1 bloku sil", + "DELETE_ALL_BLOCKS": "Bütün %1 blok silinsin?", + "CLEAN_UP": "Blokları təmizlə", "COLLAPSE_BLOCK": "Bloku yığ", "COLLAPSE_ALL": "Blokları yığ", "EXPAND_BLOCK": "Bloku aç", @@ -20,15 +24,16 @@ "ENABLE_BLOCK": "Bloku aktivləşdir", "HELP": "Kömək", "CHANGE_VALUE_TITLE": "Qiyməti dəyiş:", - "NEW_VARIABLE": "Yeni dəyişən...", - "NEW_VARIABLE_TITLE": "Yeni dəyişənin adı:", "RENAME_VARIABLE": "Dəyişənin adını dəyiş...", "RENAME_VARIABLE_TITLE": "Bütün '%1' dəyişənlərinin adını buna dəyiş:", + "NEW_VARIABLE": "Yeni dəyişən...", + "NEW_VARIABLE_TITLE": "Yeni dəyişənin adı:", + "COLOUR_PICKER_HELPURL": "https://az.wikipedia.org/wiki/Rəng", "COLOUR_PICKER_TOOLTIP": "Palitradan bir rəng seçin.", "COLOUR_RANDOM_TITLE": "təsadüfi rəng", "COLOUR_RANDOM_TOOLTIP": "Təsadüfi bir rəng seçin.", "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "rəngin komponentləri:", + "COLOUR_RGB_TITLE": "rənglə", "COLOUR_RGB_RED": "qırmızı", "COLOUR_RGB_GREEN": "yaşıl", "COLOUR_RGB_BLUE": "mavi", @@ -39,6 +44,7 @@ "COLOUR_BLEND_COLOUR2": "rəng 2", "COLOUR_BLEND_RATIO": "nisbət", "COLOUR_BLEND_TOOLTIP": "İki rəngi verilmiş nisbətdə (0,0 - 1,0) qarışdırır.", + "CONTROLS_REPEAT_HELPURL": "https://az.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "%1 dəfə təkrar et", "CONTROLS_REPEAT_INPUT_DO": "icra et", "CONTROLS_REPEAT_TOOLTIP": "Bəzi əmrləri bir neçə dəfə yerinə yetir.", @@ -65,6 +71,7 @@ "CONTROLS_IF_IF_TOOLTIP": "Bu \"əgər\" blokunu dəyişdirmək üçün bölümlərin yenisini əlavə et, sil və ya yerini dəyiş.", "CONTROLS_IF_ELSEIF_TOOLTIP": "\"Əgər\" blokuna bir şərt əlavə et.", "CONTROLS_IF_ELSE_TOOLTIP": "\"Əgər\" blokuna qalan bütün halları əhatə edəb son bir şərt əlavə et.", + "LOGIC_COMPARE_HELPURL": "https://az.wikipedia.org/wiki/bərabərsizlik_(riyazi)", "LOGIC_COMPARE_TOOLTIP_EQ": "Girişlər bir birinə bərabərdirsə \"doğru\" cavabını qaytarır.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Girişlər bərabər deyillərsə \"doğru\" cavabını qaytarır.", "LOGIC_COMPARE_TOOLTIP_LT": "Birinci giriş ikincidən kiçikdirsə \"doğru\" cavabını qaytarır.", @@ -76,16 +83,17 @@ "LOGIC_OPERATION_TOOLTIP_OR": "Girişlərdən heç olmasa biri \"doğru\"-dursa \"doğru\" cavabını qaytarır.", "LOGIC_OPERATION_OR": "və ya", "LOGIC_NEGATE_TITLE": "%1 deyil", - "LOGIC_NEGATE_TOOLTIP": "Giriş \"yalan\"-dursa \"doğru\" cavabını qaytarır. Giriş \"doğru\"-dursa \"yalan\" cavabını qaytarır.", + "LOGIC_NEGATE_TOOLTIP": "Giriş \"yalan\"-dursa \"doğru\" cavabını qaytarır. Giriş \"doğru\"-dursa \"səhf\" cavabını qaytarır.", "LOGIC_BOOLEAN_TRUE": "doğru", - "LOGIC_BOOLEAN_FALSE": "yalan", - "LOGIC_BOOLEAN_TOOLTIP": "\"doğru\" və ya \"yalan\" cavanını qaytarır.", + "LOGIC_BOOLEAN_FALSE": "səhf", + "LOGIC_BOOLEAN_TOOLTIP": "\"doğru\" və ya \"səhf\" cavanını qaytarır.", "LOGIC_NULL": "boş", "LOGIC_NULL_TOOLTIP": "Boş cavab qaytarır.", "LOGIC_TERNARY_CONDITION": "test", "LOGIC_TERNARY_IF_TRUE": "əgər doğrudursa", - "LOGIC_TERNARY_IF_FALSE": "əgər yalandırsa", + "LOGIC_TERNARY_IF_FALSE": "əgər səhfdirsə", "LOGIC_TERNARY_TOOLTIP": "'Yoxla' əmrindəki şərtə nəzər yetirin. Əgər şərt \"doğru\"-dursa \"əgər doğru\", əks halda isə \"əgər yalan\" cavabını qaytarır.", + "MATH_NUMBER_HELPURL": "https://az.wikipedia.org/wiki/Ədəd", "MATH_NUMBER_TOOLTIP": "Ədəd.", "MATH_ADDITION_SYMBOL": "+", "MATH_SUBTRACTION_SYMBOL": "-", @@ -104,6 +112,7 @@ "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "İki ədədin hasilini verir.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "İki ədədin nisbətini qaytarır.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Birinci ədədin ikinci ədəd dərəcəsindən qüvvətini qaytarır.", + "MATH_SINGLE_HELPURL": "https://az.wikipedia.org/wiki/Kvadrat_kökləri", "MATH_SINGLE_OP_ROOT": "kvadrat kök", "MATH_SINGLE_TOOLTIP_ROOT": "Ədədin kvadrat kökünü qaytarır.", "MATH_SINGLE_OP_ABSOLUTE": "modul", @@ -113,12 +122,14 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Ədədin 10-cu dərəcədən loqarifmini tapır.", "MATH_SINGLE_TOOLTIP_EXP": "e sabitinin verilmiş ədədə qüvvətini qaytarır.", "MATH_SINGLE_TOOLTIP_POW10": "10-un verilmiş ədədə qüvvətini qaytarır.", + "MATH_TRIG_HELPURL": "https://az.wikipedia.org/wiki/Triqonometrik_funksiyalar", "MATH_TRIG_TOOLTIP_SIN": "Dərəcənin sinusunu qaytar (radianın yox).", "MATH_TRIG_TOOLTIP_COS": "Dərəcənin kosinusunu qaytarır (radianın yox).", "MATH_TRIG_TOOLTIP_TAN": "Dərəcənin tangensini qaytar (radianın yox).", "MATH_TRIG_TOOLTIP_ASIN": "Ədədin arcsinusunu qaytarır.", "MATH_TRIG_TOOLTIP_ACOS": "Ədədin arccosinusunu qaytarır.", "MATH_TRIG_TOOLTIP_ATAN": "Ədədin arctanqensini qaytarır.", + "MATH_CONSTANT_HELPURL": "https://az.wikipedia.org/wiki/Riyazi_sabitlər", "MATH_CONSTANT_TOOLTIP": "Ümumi sabitlərdən birini qaytarır π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), və ya ∞ (sonsuzluq).", "MATH_IS_EVEN": "cütdür", "MATH_IS_ODD": "təkdir", @@ -171,7 +182,7 @@ "TEXT_LENGTH_TOOLTIP": "Verilmiş mətndəki hərflərin(sözlər arası boşluqlar sayılmaqla) sayını qaytarır.", "TEXT_ISEMPTY_TITLE": "%1 boşdur", "TEXT_ISEMPTY_TOOLTIP": "Verilmiş mətn boşdursa, doğru qiymətini qaytarır.", - "TEXT_INDEXOF_TOOLTIP": "Birinci mətnin ikinci mətndə ilk/son rastlaşma indeksini qaytarır. Əgər rastlaşma baş verməzsə, 0 qaytarır.", + "TEXT_INDEXOF_TOOLTIP": "Birinci mətnin ikinci mətndə ilk/son rastlaşma indeksini qaytarır. Əgər rastlaşma baş verməzsə, %1 qaytarır.", "TEXT_INDEXOF_INPUT_INTEXT": "mətndə", "TEXT_INDEXOF_OPERATOR_FIRST": "Bu mətn ilə ilk rastlaşmanı tap:", "TEXT_INDEXOF_OPERATOR_LAST": "Bu mətn ilə son rastlaşmanı tap:", @@ -220,7 +231,7 @@ "LISTS_INLIST": "siyahıda", "LISTS_INDEX_OF_FIRST": "Element ilə ilk rastlaşma indeksini müəyyən edin", "LISTS_INDEX_OF_LAST": "Element ilə son rastlaşma indeksini müəyyən edin", - "LISTS_INDEX_OF_TOOLTIP": "Siyahıda element ilə ilk/son rastlaşma indeksini qaytarır. Əgər tekst siyahıda tapılmazsa, 0 qaytarılır.", + "LISTS_INDEX_OF_TOOLTIP": "Siyahıda element ilə ilk/son rastlaşma indeksini qaytarır. Əgər tekst siyahıda tapılmazsa, %1 qaytarılır.", "LISTS_GET_INDEX_GET": "götür", "LISTS_GET_INDEX_GET_REMOVE": "götür və sil", "LISTS_GET_INDEX_REMOVE": "yığışdır", @@ -229,31 +240,28 @@ "LISTS_GET_INDEX_FIRST": "birinci", "LISTS_GET_INDEX_LAST": "axırıncı", "LISTS_GET_INDEX_RANDOM": "təsadüfi", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Siyahıdan təyin olunmuş indeksli elementi qaytarır. #1 ilk elementdir.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Siyahıdan təyin olunmuş indeksli elementi qaytarır. #1 son elementdir.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 ilk elementdir.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 son elementdir.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Siyahıdan təyin olunmuş indeksli elementi qaytarır.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Siyahının ilk elementini qaytarır.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Siyahının son elementini qaytarır.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Siyahıdan hər hansı təsadüfi elementi qaytarır.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Siyahıdan təyin olunmuş indeksli elementi silir və qaytarır. #1 ilk elementdir.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Siyahıdan təyin olunmuş indeksli elementi silir və qaytarır. #1 son elementdir.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Siyahıdan təyin olunmuş indeksli elementi silir və qaytarır.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Siyahıdan ilk elementi silir və qaytarır.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Siyahıdan son elementi silir və qaytarır.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Siyahıdan təsadufi elementi silir və qaytarır.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Siyahıdan təyin olunmuş indeksli elementi silir. #1 ilk elementdir.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Siyahıdan təyin olunmuş indeksli elementi silir. #1 son elementdir.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Siyahıdan təyin olunmuş indeksli elementi silir.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Siyahıdan ilk elementi silir.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Siyahıdan son elementi silir.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Siyahıdan təsadüfi bir elementi silir.", "LISTS_SET_INDEX_SET": "təyin et", "LISTS_SET_INDEX_INSERT": "daxil et", "LISTS_SET_INDEX_INPUT_TO": "Kimi", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Siyahının göstərilən yerdəki elementini təyin edir. #1 birinci elementdir.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Siyahının göstərilən yerdəki elementini təyin edir. #1 axırıncı elementdir.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Siyahının göstərilən yerdəki elementini təyin edir.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Siyahıda birinci elementi təyin edir.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Siyahının sonuncu elementini təyin edir.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Siyahının təsadüfi seçilmiş bir elementini təyin edir.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Elementi siyahıda göstərilən yerə daxil edir. #1 birinci elementdir.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Elementi siyahıda göstərilən yerə daxil edir. #1 axırıncı elementdir.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Elementi siyahıda göstərilən yerə daxil edir.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Elementi siyahının əvvəlinə daxil edir.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Elementi siyahının sonuna artırır.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Elementi siyahıda təsadüfi seçilmiş bir yerə atır.", diff --git a/src/opsoro/server/static/js/blockly/msg/json/ba.json b/src/opsoro/server/static/js/blockly/msg/json/ba.json new file mode 100644 index 0000000..e1cc00c --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/ba.json @@ -0,0 +1,210 @@ +{ + "@metadata": { + "authors": [ + "Alfiya55", + "Ләйсән", + "Айсар", + "Кутлубаева Кунсулу Закиевна", + "Азат Хәлилов", + "Танзиля Кутлугильдина" + ] + }, + "VARIABLES_DEFAULT_NAME": "элемент", + "TODAY": "Бөгөн", + "DUPLICATE_BLOCK": "Күсереп алырға", + "ADD_COMMENT": "Фекер өҫтәргә", + "REMOVE_COMMENT": "Аңлатмаларҙы юйырға", + "EXTERNAL_INPUTS": "Тышҡы өҫтәлмә", + "INLINE_INPUTS": "Эске өҫтәлмә", + "DELETE_BLOCK": "Блокты юйҙырырға", + "DELETE_X_BLOCKS": " %1 блокты юйҙырырға", + "DELETE_ALL_BLOCKS": "Бөтә %1 блоктарҙы юйырғамы?", + "CLEAN_UP": "Блоктарҙы таҙартырға", + "COLLAPSE_BLOCK": "Блокты төрөргә", + "COLLAPSE_ALL": "Блоктарҙы төрөргә", + "EXPAND_BLOCK": "Блокты йәйергә", + "EXPAND_ALL": "Блоктарҙы йәйергә", + "DISABLE_BLOCK": "Блокты һүндерергә", + "ENABLE_BLOCK": "Блокты тоҡандырырға", + "HELP": "Ярҙам", + "UNDO": "Кире алырға", + "REDO": "документтарҙы үҙгәртергә", + "CHANGE_VALUE_TITLE": "Мәғәнәне үҙгәртегеҙ:", + "RENAME_VARIABLE": "Үҙгәреүсәндең исемен алмаштырырға...", + "RENAME_VARIABLE_TITLE": "Бөтә '%1' үҙгәреүсәндәрҙең исемен ошолай алмаштырырға:", + "NEW_VARIABLE": "Яңы үҙгәреүсән...", + "NEW_VARIABLE_TITLE": "Яңы үҙгәреүсәндең исеме:", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Төҫ", + "COLOUR_PICKER_TOOLTIP": "Палитранан төҫ һайлағыҙ.", + "COLOUR_RANDOM_TITLE": "осраҡлы төҫ", + "COLOUR_RANDOM_TOOLTIP": "Төҫтө осраҡлылыҡ буйынса һайлай.", + "COLOUR_RGB_TITLE": "ошонан төҫ", + "COLOUR_RGB_RED": "ҡыҙылдан", + "COLOUR_RGB_GREEN": "йәшелдән", + "COLOUR_RGB_BLUE": "зәңгәр", + "COLOUR_RGB_TOOLTIP": "Бирелгән нисбәттәрҙә ҡыҙылдан, йәшелдән һәм зәңгәрҙән төҫ барлыҡҡа килә. Бөтә мәғәнәләр 0 менән 100 араһында булырға тейеш.", + "COLOUR_BLEND_TITLE": "ҡатнаштырырға", + "COLOUR_BLEND_COLOUR1": "1-се төҫ", + "COLOUR_BLEND_COLOUR2": "2-се төҫ", + "COLOUR_BLEND_RATIO": "1-се төҫтөң өлөшө", + "COLOUR_BLEND_TOOLTIP": "Ике төҫтө бирелгән нисбәттә болғата (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/Цикл_(программалау)", + "CONTROLS_REPEAT_TITLE": " %1 тапҡыр ҡабатларға", + "CONTROLS_REPEAT_INPUT_DO": "үтәргә", + "CONTROLS_REPEAT_TOOLTIP": "Командаларҙы бер нисә тапҡыр үтәй.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ҡабатларға, әлегә", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ҡабатларға, әлегә юҡ", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Мәғәнә дөрөҫ булғанда, командаларҙы ҡабатлай.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Мәғәнә ялған булғанда, командаларҙы ҡабатлай.", + "CONTROLS_FOR_TOOLTIP": "Үҙгәреүсәнгә башынан аҙағына тиклем тәғәйен аҙым менән %1 мәғәнәне бирә һәм күрһәтелгән командаларҙы үтәй.", + "CONTROLS_FOREACH_TITLE": "һәр элемент өсөн %1 исемлектә %2", + "CONTROLS_FOREACH_TOOLTIP": "Исемлектәге һәр элемент өсөн үҙгәреүсәнгә элементтың '%1' мәғәнәһен бирә һәм күрһәтелгән командаларҙы үтәй.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "циклдан сығырға", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "циклдың киләһе аҙымына күсергә", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Был циклды өҙә.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Циклдың ҡалдығын төшөрөп ҡалдыра һәм киләһе аҙымға күсә.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Иҫкәртеү: был блок цикл эсендә генә ҡулланыла ала.", + "CONTROLS_IF_TOOLTIP_1": "Мәғәнә дөрөҫ булғанда, командаларҙы үтәй.", + "CONTROLS_IF_TOOLTIP_2": "Шарт дөрөҫ булғанда, командаларҙың беренсе блогын үтәй. Улай булмаһа, командаларҙың икенсе блогы үтәлә.", + "CONTROLS_IF_TOOLTIP_3": "Беренсе шарт дөрөҫ булһа, командаларҙың беренсе блогын үтәй. Икенсе шарт дөрөҫ булһа, командаларҙың икенсе блогын үтәй.", + "CONTROLS_IF_TOOLTIP_4": "Беренсе шарт дөрөҫ булһа, командаларҙың беренсе блогын үтәй. Әгәр икенсе шарт дөрөҫ булһа, командаларҙың икенсе блогын үтәй. Бер шарт та дөрөҫ булмаһа, команда блоктарының һуңғыһын үтәй.", + "CONTROLS_IF_MSG_IF": "әгәр", + "CONTROLS_IF_MSG_ELSEIF": "юғиһә, әгәр", + "CONTROLS_IF_MSG_ELSE": "юғиһә", + "CONTROLS_IF_IF_TOOLTIP": "\"Әгәр\" блогын ҡабаттан төҙөү өсөн киҫәктәрҙе өҫтәгеҙ, юйҙырығыҙ, урындарын алмаштырығыҙ.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "\"Әгәр\" блогына шарт өҫтәй", + "CONTROLS_IF_ELSE_TOOLTIP": "Бер шарт та дөрөҫ булмаған осраҡҡа йомғаҡлау ярҙамсы блогын өҫтәргә.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(математика)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Өҫтәмәләр тигеҙ булһа, дөрөҫ мәғәнәһен кире ҡайтара.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Өҫтәмәләр тигеҙ булмаһа, дөрөҫ мәғәнәһен кире ҡайтара.", + "LOGIC_COMPARE_TOOLTIP_LT": "Беренсе өҫтәмә икенсеһенән бәләкәйерәк булһа, дөрөҫ мәғәнәһен кире ҡайтара.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Беренсе өҫтәмә икенсеһенән бәләкәйерәк йә уға тиң булһа, дөрөҫ мәғәнәһен кире ҡайтара.", + "LOGIC_COMPARE_TOOLTIP_GT": "Беренсе өҫтәмә икенсеһенән ҙурыраҡ булһа, дөрөҫ мәғәнәһен кире ҡайтара.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Беренсе өҫтәмә икенсеһенән бәләкәйерәк йә уға тиң булһа, дөрөҫ мәғәнәһен кире ҡайтара.", + "LOGIC_OPERATION_TOOLTIP_AND": "Әгәр ҙә ике өҫтәлмә лә тап килһә, дөрөҫ аңлатманы кире ҡайтара.", + "LOGIC_OPERATION_AND": "һәм", + "LOGIC_OPERATION_TOOLTIP_OR": "Өҫтәлмәләрҙең береһе генә дөрөҫ булһа, дөрөҫ аңлатманы ҡайтара.", + "LOGIC_OPERATION_OR": "йәки", + "LOGIC_NEGATE_TITLE": "%1 түгел", + "LOGIC_NEGATE_TOOLTIP": "Өҫтәлмә ялған булһа, дөрөҫ аңлатманы ҡайтара. Өҫтәлмә дөрөҫ булһа, ялған аңлатманы ҡайтара.", + "LOGIC_BOOLEAN_TRUE": "дөрөҫ", + "LOGIC_BOOLEAN_FALSE": "ялған", + "LOGIC_BOOLEAN_TOOLTIP": "Дөрөҫ йәки ялғанды ҡайтара.", + "LOGIC_NULL": "нуль", + "LOGIC_NULL_TOOLTIP": "Нулде ҡайтара.", + "LOGIC_TERNARY_CONDITION": "тест", + "LOGIC_TERNARY_IF_TRUE": "әгәр дөрөҫ булһа", + "LOGIC_TERNARY_IF_FALSE": "әгәр ялған булһа", + "LOGIC_TERNARY_TOOLTIP": "Һайлау шартын тикшерә. Әгәр ул дөрөҫ булһа, беренсе мәғәнәне, хата булһа, икенсе мәғәнәне ҡайтара.", + "MATH_NUMBER_HELPURL": "https://ba.wikipedia.org/wiki/Һан", + "MATH_NUMBER_TOOLTIP": "Рәт.", + "MATH_ARITHMETIC_HELPURL": "https://ba.wikipedia.org/wiki/Арифметика", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Ике һандың суммаһын ҡайтара.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Ике һандың айырмаһын ҡайтара.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Ике һандың ҡабатландығын ҡайтара.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Ике һандың бүлендеген ҡайтара.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Дәрәжәгә күтәрелгән икенсе һандан тәүгеһенә ҡайтара.", + "MATH_SINGLE_HELPURL": "https://ba.wikipedia.org/wiki/Квадрат_тамыр", + "MATH_SINGLE_OP_ROOT": "квадрат тамыр", + "MATH_SINGLE_TOOLTIP_ROOT": "Һандың квадрат тамырын ҡайтара.", + "MATH_SINGLE_OP_ABSOLUTE": "абсолют", + "MATH_SINGLE_TOOLTIP_ABS": "Һандың модулен ҡайтара.", + "MATH_SINGLE_TOOLTIP_NEG": "Кире һанды ҡайтара.", + "MATH_SINGLE_TOOLTIP_LN": "Һандың натураль логаритмын ҡайтара.", + "MATH_SINGLE_TOOLTIP_LOG10": "Һандың унынсы логаритмын ҡайтара.", + "MATH_SINGLE_TOOLTIP_EXP": "Күрһәтелгән дәрәжәлә ҡайтара.", + "MATH_SINGLE_TOOLTIP_POW10": "Күрһәтелгән 10-сы дәрәжәлә ҡайтара.", + "MATH_TRIG_HELPURL": "https://ba..wikipedia.org/wiki/Тригонометрик_функциялар", + "MATH_TRIG_TOOLTIP_SIN": "Мөйөштөң синусын градустарҙа ҡайтара.", + "MATH_TRIG_TOOLTIP_COS": "Мөйөштөң косинусын градустарҙа ҡайтара.", + "MATH_TRIG_TOOLTIP_TAN": "Мөйөштөң тангенсын градустарҙа күрһәтә.", + "MATH_TRIG_TOOLTIP_ASIN": "Арксинусты градустарҙа күрһәтә.", + "MATH_TRIG_TOOLTIP_ACOS": "Арккосинусты градустарҙа күрһәтә.", + "MATH_TRIG_TOOLTIP_ATAN": "Арктангенсты градустарҙа күрһәтә.", + "MATH_CONSTANT_HELPURL": "https://ba.wikipedia.org/wiki/Математик_константа", + "MATH_CONSTANT_TOOLTIP": "Таралған константаның береһен күрһәтә: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) йәки ∞ (сикһеҙлек).", + "MATH_IS_EVEN": "тағы", + "MATH_IS_ODD": "сәйер", + "MATH_IS_PRIME": "ябай", + "MATH_IS_WHOLE": "бөтөн", + "MATH_IS_POSITIVE": "ыңғай", + "MATH_IS_NEGATIVE": "тиҫкәре", + "MATH_IS_DIVISIBLE_BY": "бүленә", + "MATH_IS_TOOLTIP": "Һандың йоп, таҡ, ябай, бөтөн, ыңғай, кире йәки билдәле һанға ҡарата ниндәй булыуын тикшерә. Дөрөҫ йә ялған мәғәнәһен күрһәтә.", + "MATH_CHANGE_HELPURL": "https://ba.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "%1 тан %2 ҡа арттырырға", + "MATH_CHANGE_TOOLTIP": "Үҙгәреүсән һанға өҫтәй '%1'.", + "MATH_ROUND_HELPURL": "https://ba.wikipedia.org/wiki/Т=Түңәрәкләү", + "MATH_ROUND_TOOLTIP": "Һанды ҙурына йә бәләкәйенә тиклем түңәрәкләргә.", + "MATH_ROUND_OPERATOR_ROUND": "түңәрәк", + "MATH_ROUND_OPERATOR_ROUNDUP": "ҙурына тиклем түңәрәкләргә", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "бәләкәйгә тиклем түңәрәкләргә", + "MATH_ONLIST_OPERATOR_SUM": "исемлек суммаһы", + "MATH_ONLIST_TOOLTIP_SUM": "Исемлектәрҙәге һандар суммаһын күрһәтә.", + "MATH_ONLIST_OPERATOR_MIN": "Исемлектәге иң бәләкәйе", + "MATH_ONLIST_TOOLTIP_MIN": "Исемлектәге иң бәләкәй һанды күрһәтә.", + "MATH_ONLIST_OPERATOR_MAX": "исемлектәге иң ҙуры", + "MATH_ONLIST_TOOLTIP_MAX": "Исемлектең иң ҙур һанын күрһәтә.", + "MATH_ONLIST_OPERATOR_AVERAGE": "исемлектең уртаса арифметик дәүмәле", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Исемлектең уртаса арифметик дәүмәле күрһәтә.", + "MATH_ONLIST_OPERATOR_MEDIAN": "исемлек медианаһы", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Исемлек медианаһын күрһәтә.", + "MATH_ONLIST_OPERATOR_MODE": "исемлек модалары", + "MATH_ONLIST_TOOLTIP_MODE": "Исемлектең иң күп осраған элементтарын күрһәтә.", + "MATH_ONLIST_OPERATOR_STD_DEV": "исемлекте стандарт кире ҡағыу", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Исемлекте стандарт кире ҡағыуҙы күрһәтә.", + "MATH_ONLIST_OPERATOR_RANDOM": "исемлектең осраҡлы элементы", + "MATH_ONLIST_TOOLTIP_RANDOM": "Исемлектең осраҡлы элементын күрһәтә.", + "MATH_MODULO_HELPURL": "https://ba.wikipedia.org/wiki/Ҡалдыҡ_менән_бүлеү", + "MATH_MODULO_TITLE": "ҡалдыҡ %1 : %2 араһында", + "MATH_MODULO_TOOLTIP": "Ике һанды бүлеү ҡалдығын күрһәтә.", + "MATH_CONSTRAIN_TITLE": "сикләргә %1 аҫтан %2 өҫтән %3", + "MATH_CONSTRAIN_TOOLTIP": "Һанды аҫтан һәм өҫтән сикләй (сиктәгеләрен индереп).", + "MATH_RANDOM_INT_HELPURL": "https://ba.wikipedia.org/wiki/Ялған осраҡлы_һандар_генераторы", + "MATH_RANDOM_INT_TITLE": "%1-ҙән %2-гә тиклем осраҡлы бөтөн һан", + "MATH_RANDOM_INT_TOOLTIP": "Ике бирелгән һан араһындағы (үҙҙәрен дә индереп) осраҡлы һанды күрһәтә.", + "MATH_RANDOM_FLOAT_HELPURL": "https://ba.wikipedia.org/wiki/Ялған осраҡлы_һандар_генераторы", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "0 (үҙен дә индереп) һәм 1 араһындағы осраҡлы һан", + "TEXT_TEXT_TOOLTIP": "Текстың хәрефе, һүҙе йәки юлы.", + "TEXT_JOIN_TITLE_CREATEWITH": "текст төҙөргә", + "TEXT_JOIN_TOOLTIP": "Элементтарҙың теләһә күпме һанын берләштереп текст фрагментын булдыра.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "ҡушылығыҙ", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Текстҡа элемент өҫтәү.", + "TEXT_APPEND_APPENDTEXT": "текст өҫтәргә", + "TEXT_APPEND_TOOLTIP": "Үҙгәреүсән «%1»-гә текст өҫтәргә.", + "TEXT_LENGTH_TITLE": "оҙонлоғо %1", + "TEXT_LENGTH_TOOLTIP": "Бирелгән текстағы символдар һанын (буш урындар менән бергә) кире ҡайтара.", + "TEXT_ISEMPTY_TITLE": "%1 буш", + "TEXT_INDEXOF_INPUT_INTEXT": "текстҡа", + "TEXT_INDEXOF_OPERATOR_FIRST": "текстың тәүге инеүен табырға", + "TEXT_INDEXOF_OPERATOR_LAST": "Текстың һуңғы инеүен табырға", + "TEXT_CHARAT_INPUT_INTEXT": "текста", + "TEXT_CHARAT_FROM_START": "хат алырға #", + "TEXT_CHARAT_FROM_END": "№ хәрефен аҙаҡтан алырға", + "TEXT_CHARAT_FIRST": "тәүге хәрефте алырға", + "TEXT_CHARAT_LAST": "һуңғы хәрефте алырға", + "TEXT_CHARAT_RANDOM": "осраҡлы хәрефте алырға", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "текста", + "TEXT_GET_SUBSTRING_END_FROM_START": "# хатҡа", + "TEXT_GET_SUBSTRING_END_LAST": "һуңғы хәрефкә тиклем", + "TEXT_PRINT_TITLE": "%1 баҫтырырға", + "LISTS_CREATE_WITH_INPUT_WITH": "менән исемлек төҙөргә", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "исемлек", + "LISTS_LENGTH_TITLE": "оҙонлоғо %1", + "LISTS_ISEMPTY_TITLE": "%1 буш", + "LISTS_INLIST": "исемлеккә", + "LISTS_GET_INDEX_GET": "алырға", + "LISTS_GET_INDEX_GET_REMOVE": "алырға һәм юйырға", + "LISTS_GET_INDEX_REMOVE": "юйырға", + "LISTS_GET_INDEX_FROM_END": "# аҙағынан", + "LISTS_GET_INDEX_FIRST": "беренсе", + "LISTS_GET_INDEX_LAST": "аҙаҡҡы", + "LISTS_GET_INDEX_RANDOM": "осраҡлы", + "LISTS_SET_INDEX_SET": "йыйылма", + "LISTS_SET_INDEX_INSERT": "өҫтәп ҡуйырға", + "LISTS_SET_INDEX_INPUT_TO": "кеүек", + "PROCEDURES_DEFRETURN_RETURN": "кире ҡайтарыу", + "PROCEDURES_MUTATORCONTAINER_TITLE": "инеү", + "PROCEDURES_MUTATORARG_TITLE": "инеү исеме:", + "PROCEDURES_CREATE_DO": "'%1' төҙөргә" +} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/bcc.json b/src/opsoro/server/static/js/blockly/msg/json/bcc.json similarity index 91% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/bcc.json rename to src/opsoro/server/static/js/blockly/msg/json/bcc.json index 2d59f41..88fd167 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/bcc.json +++ b/src/opsoro/server/static/js/blockly/msg/json/bcc.json @@ -19,14 +19,11 @@ "DISABLE_BLOCK": "غیرفعال‌سازی بلوک", "ENABLE_BLOCK": "فعال‌سازی بلوک", "HELP": "کومک", - "CHAT": "با همکارتان با نوشتن در این کادر چت کنید!", - "AUTH": "لطفا این اپلیکیشن را ثبت کنید و آثارتان را فعال کنید تا ذخیره شود و اجازهٔ اشتراک‌گذاری توسط شما داده شود.", - "ME": "من", "CHANGE_VALUE_TITLE": "تغییر مقدار:", - "NEW_VARIABLE": "متغیر تازه...", - "NEW_VARIABLE_TITLE": "نام متغیر تازه:", "RENAME_VARIABLE": "تغییر نام متغیر...", "RENAME_VARIABLE_TITLE": "تغییر نام همهٔ متغیرهای «%1» به:", + "NEW_VARIABLE": "متغیر تازه...", + "NEW_VARIABLE_TITLE": "نام متغیر تازه:", "COLOUR_PICKER_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%D9%86%DA%AF", "COLOUR_PICKER_TOOLTIP": "انتخاب یک رنگ از تخته‌رنگ.", "COLOUR_RANDOM_TITLE": "رنگ تصادفی", @@ -174,7 +171,7 @@ "TEXT_LENGTH_TOOLTIP": "بازگرداندن عددی از حروف (شامل فاصله‌ها) در متن فراهم‌شده.", "TEXT_ISEMPTY_TITLE": "%1 خالی است", "TEXT_ISEMPTY_TOOLTIP": "اضافه‌کردن صحیح اگر متن فراهم‌شده خالی است.", - "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد ۰ باز می‌گرداند.", + "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد %1 باز می‌گرداند.", "TEXT_INDEXOF_INPUT_INTEXT": "در متن", "TEXT_INDEXOF_OPERATOR_FIRST": "اولین رخداد متن را بیاب", "TEXT_INDEXOF_OPERATOR_LAST": "آخرین رخداد متن را بیاب", @@ -223,7 +220,7 @@ "LISTS_INLIST": "در فهرست", "LISTS_INDEX_OF_FIRST": "آخرین رخداد متن را بیاب", "LISTS_INDEX_OF_LAST": "یافتن آخرین رخ‌داد مورد", - "LISTS_INDEX_OF_TOOLTIP": "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. ۰ بر می‌گرداند اگر متن موجود نبود.", + "LISTS_INDEX_OF_TOOLTIP": "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. %1 بر می‌گرداند اگر متن موجود نبود.", "LISTS_GET_INDEX_GET": "گرفتن", "LISTS_GET_INDEX_GET_REMOVE": "گرفتن و حذف‌کردن", "LISTS_GET_INDEX_REMOVE": "حذف‌کردن", @@ -231,31 +228,28 @@ "LISTS_GET_INDEX_FIRST": "اولین", "LISTS_GET_INDEX_LAST": "اهرین", "LISTS_GET_INDEX_RANDOM": "تصادفی", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "موردی در محل مشخص‌شده بر می‌گرداند. #1 اولین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "موردی در محل مشخص در فهرست بر می‌گرداند. #1 آخرین مورد است.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 اولین مورد است.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 آخرین مورد است.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "موردی در محل مشخص‌شده بر می‌گرداند.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "اولین مورد یک فهرست را بر می‌گرداند.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "آخرین مورد در یک فهرست را بر می‌گرداند.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "یک مورد تصادفی در یک فهرست بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند. #1 اولین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند. #1 آخرین مورد است.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "اولین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "آخرین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "مورد تصادفی‌ای را در فهرست حذف و بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند. #1 اولین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند. #1 آخرین مورد است.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "اولین مورد را در یک فهرست حذف می‌کند.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "آخرین مورد را در یک فهرست حذف می‌کند.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "یک مورد تصادفی را یک فهرست حذف می‌کند.", "LISTS_SET_INDEX_SET": "مجموعه", "LISTS_SET_INDEX_INSERT": "درج در", "LISTS_SET_INDEX_INPUT_TO": "به‌عنوان", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 اولین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 آخرین مورد است.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "اولین مورد در یک فهرست را تعیین می‌کند.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "آخرین مورد در یک فهرست را تعیین می‌کند.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "یک مورد تصادفی در یک فهرست را تعیین می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند. #1 اولین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند. #1 آخرین مورد است.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "موردی به ته فهرست اضافه می‌کند.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "موردی به ته فهرست الحاق می‌کند.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "مورد را به صورت تصادفی در یک فهرست می‌افزاید.", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/be-tarask.json b/src/opsoro/server/static/js/blockly/msg/json/be-tarask.json similarity index 90% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/be-tarask.json rename to src/opsoro/server/static/js/blockly/msg/json/be-tarask.json index 8d3e38d..4ec9f83 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/be-tarask.json +++ b/src/opsoro/server/static/js/blockly/msg/json/be-tarask.json @@ -15,6 +15,8 @@ "INLINE_INPUTS": "Унутраныя ўваходы", "DELETE_BLOCK": "Выдаліць блёк", "DELETE_X_BLOCKS": "Выдаліць %1 блёкі", + "DELETE_ALL_BLOCKS": "Выдаліць усе блёкі %1?", + "CLEAN_UP": "Ачысьціць блёкі", "COLLAPSE_BLOCK": "Згарнуць блёк", "COLLAPSE_ALL": "Згарнуць блёкі", "EXPAND_BLOCK": "Разгарнуць блёк", @@ -22,14 +24,16 @@ "DISABLE_BLOCK": "Адключыць блёк", "ENABLE_BLOCK": "Уключыць блёк", "HELP": "Дапамога", - "CHAT": "Стасуйцеся са сваім калегам, набіраючы тэкст у гэтым полі!", - "AUTH": "Калі ласка, аўтарызуйце гэтае прыкладаньне, каб можна было захоўваць Вашую працу і мець магчымасьць дзяліцца ёю.", - "ME": "Я", + "UNDO": "Скасаваць", + "REDO": "Паўтарыць", "CHANGE_VALUE_TITLE": "Зьмяніць значэньне:", - "NEW_VARIABLE": "Новая зьменная…", - "NEW_VARIABLE_TITLE": "Імя новай зьменнай:", "RENAME_VARIABLE": "Перайменаваць зьменную…", "RENAME_VARIABLE_TITLE": "Перайменаваць усе назвы зьменных '%1' на:", + "NEW_VARIABLE": "Стварыць зьменную…", + "NEW_VARIABLE_TITLE": "Імя новай зьменнай:", + "VARIABLE_ALREADY_EXISTS": "Зьменная з назвай «%1» ужо існуе.", + "DELETE_VARIABLE_CONFIRMATION": "Выдаліць %1 выкарыстаньняў зьменнай «%2»?", + "DELETE_VARIABLE": "Выдаліць зьменную «%1»", "COLOUR_PICKER_HELPURL": "https://be-x-old.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D0%B5%D1%80", "COLOUR_PICKER_TOOLTIP": "Абярыце колер з палітры.", "COLOUR_RANDOM_TITLE": "выпадковы колер", @@ -177,7 +181,7 @@ "TEXT_LENGTH_TOOLTIP": "Вяртае колькасьць літараў (у тым ліку прабелы) у пададзеным тэксьце.", "TEXT_ISEMPTY_TITLE": "%1 пусты", "TEXT_ISEMPTY_TOOLTIP": "Вяртае значэньне ісьціна, калі тэкст пусты.", - "TEXT_INDEXOF_TOOLTIP": "Вяртае індэкс першага/апошняга ўваходжаньня першага тэксту ў другі тэкст. Вяртае 0, калі тэкст ня знойдзены.", + "TEXT_INDEXOF_TOOLTIP": "Вяртае індэкс першага/апошняга ўваходжаньня першага тэксту ў другі тэкст. Вяртае %1, калі тэкст ня знойдзены.", "TEXT_INDEXOF_INPUT_INTEXT": "у тэксьце", "TEXT_INDEXOF_OPERATOR_FIRST": "знайсьці першае ўваходжаньне тэксту", "TEXT_INDEXOF_OPERATOR_LAST": "знайсьці апошняе ўваходжаньне тэксту", @@ -210,6 +214,12 @@ "TEXT_PROMPT_TYPE_NUMBER": "запытаць лічбу з падказкай", "TEXT_PROMPT_TOOLTIP_NUMBER": "Запытаць у карыстальніка лічбу.", "TEXT_PROMPT_TOOLTIP_TEXT": "Запытаць у карыстальніка тэкст.", + "TEXT_COUNT_MESSAGE0": "падлічыць %1 сярод %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Падлічвае колькі разоў нейкі тэкст сустракаецца ўнутры нейкага іншага тэксту.", + "TEXT_REPLACE_MESSAGE0": "замяніць %1 на %2 у %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Замяняе ўсе выпадкі нейкага тэксту на іншы тэкст.", "LISTS_CREATE_EMPTY_TITLE": "стварыць пусты сьпіс", "LISTS_CREATE_EMPTY_TOOLTIP": "Вяртае сьпіс даўжынёй 0, які ня ўтрымлівае запісаў зьвестак", "LISTS_CREATE_WITH_TOOLTIP": "Ставарае сьпіс зь любой колькасьцю элемэнтаў.", @@ -226,7 +236,7 @@ "LISTS_INLIST": "у сьпісе", "LISTS_INDEX_OF_FIRST": "знайсьці першае ўваходжаньне элемэнту", "LISTS_INDEX_OF_LAST": "знайсьці апошняе ўваходжаньне элемэнту", - "LISTS_INDEX_OF_TOOLTIP": "Вяртае індэкс першага/апошняга ўваходжаньня элемэнту ў сьпісе. Вяртае 0, калі тэкст ня знойдзены.", + "LISTS_INDEX_OF_TOOLTIP": "Вяртае індэкс першага/апошняга ўваходжаньня элемэнту ў сьпіс. Вяртае %1, калі элемэнт ня знойдзены.", "LISTS_GET_INDEX_GET": "атрымаць", "LISTS_GET_INDEX_GET_REMOVE": "атрымаць і выдаліць", "LISTS_GET_INDEX_REMOVE": "выдаліць", @@ -234,31 +244,28 @@ "LISTS_GET_INDEX_FIRST": "першы", "LISTS_GET_INDEX_LAST": "апошні", "LISTS_GET_INDEX_RANDOM": "выпадковы", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Вяртае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Вяртае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — апошні элемэнт.", + "LISTS_INDEX_FROM_START_TOOLTIP": "№%1 — першы элемэнт.", + "LISTS_INDEX_FROM_END_TOOLTIP": "№%1 — апошні элемэнт.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Вяртае элемэнт у пазначанай пазыцыі ў сьпісе.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Вяртае першы элемэнт у сьпісе.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Вяртае апошні элемэнт у сьпісе.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Вяртае выпадковы элемэнт у сьпісе.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Выдаляе і вяртае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Выдаляе і вяртае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — апошні элемэнт.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Выдаляе і вяртае элемэнт у пазначанай пазыцыі ў сьпісе.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Выдаляе і вяртае першы элемэнт у сьпісе.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Выдаляе і вяртае апошні элемэнт у сьпісе.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Выдаляе і вяртае выпадковы элемэнт у сьпісе.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Выдаляе элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Выдаляе элемэнт у пазначанай пазыцыі ў сьпісе. №1 — апошні элемэнт.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Выдаляе элемэнт у пазначанай пазыцыі ў сьпісе.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Выдаляе першы элемэнт у сьпісе.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Выдаляе апошні элемэнт у сьпісе.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Выдаляе выпадковы элемэнт у сьпісе.", "LISTS_SET_INDEX_SET": "усталяваць", "LISTS_SET_INDEX_INSERT": "уставіць у", "LISTS_SET_INDEX_INPUT_TO": "як", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Задае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Задае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — апошні элемэнт.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Задае элемэнт у пазначанай пазыцыі ў сьпісе.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Задае першы элемэнт у сьпісе.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Задае апошні элемэнт у сьпісе.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Задае выпадковы элемэнт у сьпісе.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Устаўляе элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Устаўляе элемэнт у пазначанай пазыцыі ў сьпісе. №1 — апошні элемэнт.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Устаўляе элемэнт у пазначанай пазыцыі ў сьпісе.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Устаўляе элемэнт у пачатак сьпісу.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Дадае элемэнт у канец сьпісу.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Выпадковым чынам устаўляе элемэнт у сьпіс.", @@ -269,6 +276,14 @@ "LISTS_GET_SUBLIST_END_FROM_END": "па № з канца", "LISTS_GET_SUBLIST_END_LAST": "да апошняга", "LISTS_GET_SUBLIST_TOOLTIP": "Стварае копію пазначанай часткі сьпісу.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "сартаваць %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Сартаваць копію сьпісу.", + "LISTS_SORT_ORDER_ASCENDING": "па павелічэньні", + "LISTS_SORT_ORDER_DESCENDING": "па зьмяншэньні", + "LISTS_SORT_TYPE_NUMERIC": "як лікі", + "LISTS_SORT_TYPE_TEXT": "паводле альфабэту", + "LISTS_SORT_TYPE_IGNORECASE": "паводле альфабэту, ігнараваць рэгістар", "LISTS_SPLIT_LIST_FROM_TEXT": "стварыць сьпіс з тэксту", "LISTS_SPLIT_TEXT_FROM_LIST": "стварыць тэкст са сьпісу", "LISTS_SPLIT_WITH_DELIMITER": "з падзяляльнікам", @@ -284,6 +299,7 @@ "PROCEDURES_BEFORE_PARAMS": "з:", "PROCEDURES_CALL_BEFORE_PARAMS": "з:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Стварае функцыю бяз выніку.", + "PROCEDURES_DEFNORETURN_COMMENT": "Апішыце гэтую функцыю…", "PROCEDURES_DEFRETURN_RETURN": "вярнуць", "PROCEDURES_DEFRETURN_TOOLTIP": "Стварае функцыю з вынікам.", "PROCEDURES_ALLOW_STATEMENTS": "дазволіць зацьвярджэньне", @@ -299,5 +315,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Падсьвяціць вызначэньне функцыі", "PROCEDURES_CREATE_DO": "Стварыць '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Калі значэньне ісьціна, вярнуць другое значэньне.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Папярэджаньне: гэты блёк можа выкарыстоўвацца толькі ў вызначанай функцыі." } diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/bg.json b/src/opsoro/server/static/js/blockly/msg/json/bg.json similarity index 85% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/bg.json rename to src/opsoro/server/static/js/blockly/msg/json/bg.json index 8c6b89a..f4916b2 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/bg.json +++ b/src/opsoro/server/static/js/blockly/msg/json/bg.json @@ -2,10 +2,14 @@ "@metadata": { "authors": [ "Gkostov", - "Vodnokon4e" + "Vodnokon4e", + "Alpinistbg", + "Miroslav35232", + "StanProg" ] }, "VARIABLES_DEFAULT_NAME": "елемент", + "TODAY": "Днес", "DUPLICATE_BLOCK": "Копирай", "ADD_COMMENT": "Добави коментар", "REMOVE_COMMENT": "Премахни коментар", @@ -13,6 +17,8 @@ "INLINE_INPUTS": "Вътрешни входове", "DELETE_BLOCK": "Изтрий блок", "DELETE_X_BLOCKS": "Изтрий %1 блока", + "DELETE_ALL_BLOCKS": "Изтриване на всички 1% блокове?", + "CLEAN_UP": "Премахни блокове", "COLLAPSE_BLOCK": "Скрий блок", "COLLAPSE_ALL": "Скрий блокове", "EXPAND_BLOCK": "Покажи блок", @@ -20,14 +26,16 @@ "DISABLE_BLOCK": "Деактивирай блок", "ENABLE_BLOCK": "Активирай блок", "HELP": "Помощ", - "CHAT": "Говори с колега, като пишеш в това поле!", - "AUTH": "Позволи на приложението да записва и споделя работата ти.", - "ME": "Аз", + "UNDO": "Отмяна", + "REDO": "Повторение", "CHANGE_VALUE_TITLE": "Промени стойността:", - "NEW_VARIABLE": "Нова променлива...", - "NEW_VARIABLE_TITLE": "Ново име на променливата:", "RENAME_VARIABLE": "Преименувай променливата...", "RENAME_VARIABLE_TITLE": "Преименувай всички '%1' променливи на:", + "NEW_VARIABLE": "Създаване на променлива...", + "NEW_VARIABLE_TITLE": "Ново име на променливата:", + "VARIABLE_ALREADY_EXISTS": "Променлива с име '%1' вече съществува.", + "DELETE_VARIABLE_CONFIRMATION": "Изтриване на %1 използване на променлива '%2'?", + "DELETE_VARIABLE": "Изтриване на променливата \"%1\"", "COLOUR_PICKER_HELPURL": "https://bg.wikipedia.org/wiki/Цвят_(оптика)", "COLOUR_PICKER_TOOLTIP": "Избери цвят от палитрата.", "COLOUR_RANDOM_TITLE": "случаен цвят", @@ -90,7 +98,7 @@ "LOGIC_TERNARY_CONDITION": "тест", "LOGIC_TERNARY_IF_TRUE": "Ако е вярно", "LOGIC_TERNARY_IF_FALSE": "Ако е невярно", - "LOGIC_TERNARY_TOOLTIP": "Провери исловието в \"тест\". Ако условието е истина, върни \"ако е истина\" стойността, иначе върни \"ако е лъжа\" стойността.", + "LOGIC_TERNARY_TOOLTIP": "Провери условието в \"тест\". Ако условието е истина, върни стойността \"ако е вярно\", иначе върни стойността \"ако е невярно\".", "MATH_NUMBER_HELPURL": "https://bg.wikipedia.org/wiki/Число", "MATH_NUMBER_TOOLTIP": "Число.", "MATH_ARITHMETIC_HELPURL": "https://bg.wikipedia.org/wiki/Аритметика", @@ -125,7 +133,7 @@ "MATH_IS_POSITIVE": "е положително", "MATH_IS_NEGATIVE": "е отрицателно", "MATH_IS_DIVISIBLE_BY": "се дели на", - "MATH_IS_TOOLTIP": "Проверете дали дадено число е четно, нечетно, просто, цяло, положително, отрицателно или дали се дели на друго число. Връща истина или лъжа.", + "MATH_IS_TOOLTIP": "Проверете дали дадено число е четно, нечетно, просто, цяло, положително, отрицателно или дали се дели на друго число. Връща вярно или невярно.", "MATH_CHANGE_HELPURL": "https://bg.wikipedia.org/wiki/Събиране", "MATH_CHANGE_TITLE": "промени %1 на %2", "MATH_CHANGE_TOOLTIP": "Добави число към променлива '%1'.", @@ -134,7 +142,7 @@ "MATH_ROUND_OPERATOR_ROUND": "закръгли", "MATH_ROUND_OPERATOR_ROUNDUP": "закръгли нагоре", "MATH_ROUND_OPERATOR_ROUNDDOWN": "закръгли надолу", - "MATH_ONLIST_OPERATOR_SUM": "сумираай списъка", + "MATH_ONLIST_OPERATOR_SUM": "сумирай списъка", "MATH_ONLIST_TOOLTIP_SUM": "Върни сумата на всички числа в списъка.", "MATH_ONLIST_OPERATOR_MIN": "най-малката стойност в списъка", "MATH_ONLIST_TOOLTIP_MIN": "Върни най-малкото число в списъка.", @@ -144,7 +152,7 @@ "MATH_ONLIST_TOOLTIP_AVERAGE": "Върни средната стойност (аритметичното средно) на числата в списъка.", "MATH_ONLIST_OPERATOR_MEDIAN": "медианата на списък", "MATH_ONLIST_TOOLTIP_MEDIAN": "Върни медианата в списъка.", - "MATH_ONLIST_OPERATOR_MODE": "мода на списъка", + "MATH_ONLIST_OPERATOR_MODE": "режими на списъка", "MATH_ONLIST_TOOLTIP_MODE": "Върни списък на най-често срещаните елементи в списъка.", "MATH_ONLIST_OPERATOR_STD_DEV": "стандартно отклонение на списък", "MATH_ONLIST_TOOLTIP_STD_DEV": "Връща стандартното отклонение на списъка.", @@ -170,16 +178,16 @@ "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Добави елемент към текста.", "TEXT_APPEND_TO": "към", "TEXT_APPEND_APPENDTEXT": "добави текста", - "TEXT_APPEND_TOOLTIP": "Добави текста към променливата \"%1\".", + "TEXT_APPEND_TOOLTIP": "Добави текст към променливата \"%1\".", "TEXT_LENGTH_TITLE": "дължината на %1", "TEXT_LENGTH_TOOLTIP": "Връща броя на символите (включително и интервалите) в текста.", "TEXT_ISEMPTY_TITLE": "%1 е празен", - "TEXT_ISEMPTY_TOOLTIP": "Връща истина, ако текста е празен.", - "TEXT_INDEXOF_TOOLTIP": "Връща индекса на първото/последното срещане на първия текст във втория текст. Връща 0, ако текстът не е намерен.", + "TEXT_ISEMPTY_TOOLTIP": "Връща вярно, ако текста е празен.", + "TEXT_INDEXOF_TOOLTIP": "Връща индекса на първото/последното срещане на първия текст във втория текст. Връща %1, ако текстът не е намерен.", "TEXT_INDEXOF_INPUT_INTEXT": "в текста", "TEXT_INDEXOF_OPERATOR_FIRST": "намери първата поява на текста", "TEXT_INDEXOF_OPERATOR_LAST": "намери последната поява на текста", - "TEXT_CHARAT_INPUT_INTEXT": "От текста", + "TEXT_CHARAT_INPUT_INTEXT": "от текста", "TEXT_CHARAT_FROM_START": "вземи поредна буква", "TEXT_CHARAT_FROM_END": "вземи поредна буква от края", "TEXT_CHARAT_FIRST": "вземи първата буква", @@ -187,7 +195,7 @@ "TEXT_CHARAT_RANDOM": "вземи произволна буква", "TEXT_CHARAT_TOOLTIP": "Връща буквата в определена позиция.", "TEXT_GET_SUBSTRING_TOOLTIP": "Връща определена част от текста.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "В текста", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "в текста", "TEXT_GET_SUBSTRING_START_FROM_START": "вземи текста от буква №", "TEXT_GET_SUBSTRING_START_FROM_END": "вземи текста от буква № (броено отзад-напред)", "TEXT_GET_SUBSTRING_START_FIRST": "вземи текста от първата буква", @@ -208,6 +216,11 @@ "TEXT_PROMPT_TYPE_NUMBER": "питай за число със съобщение", "TEXT_PROMPT_TOOLTIP_NUMBER": "Питай потребителя за число.", "TEXT_PROMPT_TOOLTIP_TEXT": "Питай потребителя за текст.", + "TEXT_COUNT_MESSAGE0": "пресмята броя на %1 в %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_REPLACE_MESSAGE0": "замяна на %1 с %2 в %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "LISTS_CREATE_EMPTY_TITLE": "създай празен списък", "LISTS_CREATE_EMPTY_TOOLTIP": "Връща списък с дължина 0, не съдържащ данни", "LISTS_CREATE_WITH_TOOLTIP": "Създай списък с произволен брой елементи.", @@ -220,11 +233,11 @@ "LISTS_LENGTH_TITLE": "дължината на %1", "LISTS_LENGTH_TOOLTIP": "Връща дължината на списък.", "LISTS_ISEMPTY_TITLE": "%1 е празен", - "LISTS_ISEMPTY_TOOLTIP": "Връща истина, ако списъкът е празен.", + "LISTS_ISEMPTY_TOOLTIP": "Връща стойност вярно, ако списъкът е празен.", "LISTS_INLIST": "в списъка", "LISTS_INDEX_OF_FIRST": "намери първата поява на елемента", "LISTS_INDEX_OF_LAST": "намери последната поява на елемента", - "LISTS_INDEX_OF_TOOLTIP": "Връща индекса на първото/последното появяване на елемента в списъка. Връща 0, ако елементът не е намерен.", + "LISTS_INDEX_OF_TOOLTIP": "Връща индекса на първото/последното появяване на елемента в списъка. Връща %1 ако елементът не е намерен.", "LISTS_GET_INDEX_GET": "вземи", "LISTS_GET_INDEX_GET_REMOVE": "вземи и премахни", "LISTS_GET_INDEX_REMOVE": "премахни", @@ -232,31 +245,28 @@ "LISTS_GET_INDEX_FIRST": "първия", "LISTS_GET_INDEX_LAST": "последния", "LISTS_GET_INDEX_RANDOM": "произволен", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Връща елемента на определената позиция в списък. #1 е първият елемент.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Връща елемента на определената позиция в списък. #1 е последният елемент.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 е първият елемент.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 е последният елемент.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Връща елемента на определената позиция в списък.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Връща първия елемент в списък.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Връща последния елемент в списък.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Връща случаен елемент от списъка.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Премахва и връща елемента на определена позиция в списък. #1 е последният елемент.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Премахва и връща елемента на определена позиция в списък. #1 е последният елемент.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Премахва и връща елемента на определена позиция в списък.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Премахва и връща първия елемент в списък.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Премахва и връща последния елемент в списък.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Премахва и връща случаен елемент в списък.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Премахва елемент на определена позиция в списък. #1 е първият елемент.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Премахва елемент на определена позиция в списък. #1 е последният елемент.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Премахва елемент на определена позиция в списък.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Премахва първия елемент в списък.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Премахва последния елемент в списък.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Премахва случаен елемент от списък.", "LISTS_SET_INDEX_SET": "промени", "LISTS_SET_INDEX_INSERT": "вмъкни на позиция", "LISTS_SET_INDEX_INPUT_TO": "следното", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Променя елемента на определена позиция в списък. #1 е първият елемент.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Променя елемента на определена позиция в списък. #1 е последният елемент.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Променя елемента на определена позиция в списък.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Променя първия елемент в списък.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Променя последния елемент в списък.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Променя случаен елемент от списък.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Вмъква елемент на определена позиция в списък. №1 е първият елемент.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Вмъква елемент на определена позиция в списък. №1 е последният елемент.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Вмъква елемент на определена позиция в списък.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Вмъква елемент в началото на списъка.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Добави елемент в края на списък.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Вмъква елемент на произволно място в списък.", @@ -267,6 +277,20 @@ "LISTS_GET_SUBLIST_END_FROM_END": "до № открая", "LISTS_GET_SUBLIST_END_LAST": "до края", "LISTS_GET_SUBLIST_TOOLTIP": "Копира част от списък.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "Сортирай по %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Подреди копие на списъка.", + "LISTS_SORT_ORDER_ASCENDING": "възходящо", + "LISTS_SORT_ORDER_DESCENDING": "низходящо", + "LISTS_SORT_TYPE_NUMERIC": "в числов ред", + "LISTS_SORT_TYPE_TEXT": "по азбучен ред", + "LISTS_SORT_TYPE_IGNORECASE": "по азбучен ред, без отчитане на малки и главни букви", + "LISTS_SPLIT_LIST_FROM_TEXT": "Направи списък от текст", + "LISTS_SPLIT_TEXT_FROM_LIST": "направи текст от списък", + "LISTS_SPLIT_WITH_DELIMITER": "с разделител", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Разделя текст в списък на текстове, по всеки разделител.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Събира списък от текстове в един текст, раделени с разделител.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "VARIABLES_GET_TOOLTIP": "Връща стойността на тази променлива.", "VARIABLES_GET_CREATE_SET": "Създай \"промени стойността на %1\"", "VARIABLES_SET": "нека %1 бъде %2", @@ -277,6 +301,7 @@ "PROCEDURES_BEFORE_PARAMS": "със:", "PROCEDURES_CALL_BEFORE_PARAMS": "със:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Създава функция, която не връща резултат.", + "PROCEDURES_DEFNORETURN_COMMENT": "Опишете тази функция...", "PROCEDURES_DEFRETURN_RETURN": "върни", "PROCEDURES_DEFRETURN_TOOLTIP": "Създава функция, която връща резултат.", "PROCEDURES_ALLOW_STATEMENTS": "позволи операциите", @@ -291,6 +316,7 @@ "PROCEDURES_MUTATORARG_TOOLTIP": "Добавяне на параметър към функцията.", "PROCEDURES_HIGHLIGHT_DEF": "Покажи дефиницията на функцията", "PROCEDURES_CREATE_DO": "Създай '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Ако стойността е истина, върни втората стойност.", + "PROCEDURES_IFRETURN_TOOLTIP": "Ако стойността е вярна, върни втората стойност.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Предупреждение: Този блок може да се използва само във функция." } diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/bn.json b/src/opsoro/server/static/js/blockly/msg/json/bn.json similarity index 90% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/bn.json rename to src/opsoro/server/static/js/blockly/msg/json/bn.json index 4cb033e..a96abf6 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/bn.json +++ b/src/opsoro/server/static/js/blockly/msg/json/bn.json @@ -3,7 +3,9 @@ "authors": [ "Aftabuzzaman", "Rakibul", - "Tauhid16" + "Tauhid16", + "MasterMinhaz", + "এম আবু সাঈদ" ] }, "VARIABLES_DEFAULT_NAME": "পদ", @@ -20,12 +22,12 @@ "DISABLE_BLOCK": "ব্লকটি বিকল কর", "ENABLE_BLOCK": "ব্লকটি সচল কর", "HELP": "সাহায্য", - "CHAT": "এই বাক্সে লিখার মাধ্যমে আপনার সহযোগীর সাথে আলাপ করুন!", - "ME": "আমাকে", + "UNDO": "পূর্বাবস্থা", + "REDO": "পুনরায় করুন", "CHANGE_VALUE_TITLE": "মান পরিবর্তন করুন:", - "NEW_VARIABLE": "নতুন চলক...", - "NEW_VARIABLE_TITLE": "নতুন চলকের নাম:", "RENAME_VARIABLE": "চলকের নাম পরিবর্তন...", + "NEW_VARIABLE": "চলক তৈরি করুন...", + "NEW_VARIABLE_TITLE": "নতুন চলকের নাম:", "COLOUR_PICKER_TOOLTIP": "প্যালেট থেকে একটি রং পছন্দ করুন", "COLOUR_RANDOM_TITLE": "এলোমেলো রং", "COLOUR_RANDOM_TOOLTIP": "এলোমেলোভাবে একটি রং পছন্দ করুন।", @@ -63,8 +65,8 @@ "LOGIC_BOOLEAN_TRUE": "সত্য", "LOGIC_BOOLEAN_FALSE": "মিথ্যা", "LOGIC_BOOLEAN_TOOLTIP": "পাঠাবে হয় সত্য অথবা মিথ্যা।", - "LOGIC_NULL": "নুল", - "LOGIC_NULL_TOOLTIP": "পাঠাবে নাল।", + "LOGIC_NULL": "কিছু না", + "LOGIC_NULL_TOOLTIP": "কিছু ফেরত দিবে না।", "LOGIC_TERNARY_CONDITION": "পরীক্ষা", "LOGIC_TERNARY_IF_TRUE": "যদি সত্য হয়", "LOGIC_TERNARY_IF_FALSE": "যদি মিথ্যা হয়", @@ -84,7 +86,7 @@ "MATH_IS_POSITIVE": "ইতিবাচক", "MATH_IS_NEGATIVE": "নেতিবাচক", "MATH_IS_DIVISIBLE_BY": "দ্বারা বিভাজ্য", - "MATH_CHANGE_TITLE": "পরিবর্তন %1 দ্বারা %2", + "MATH_CHANGE_TITLE": "%2 দ্বারা %1 পরিবর্তন", "MATH_ONLIST_OPERATOR_SUM": "তালিকার যোগফল", "MATH_ONLIST_TOOLTIP_SUM": "পাঠাবে তালিকার সব সংখ্যার যোগফল।", "MATH_ONLIST_OPERATOR_MIN": "তালিকার মধ্যে সর্বনিম্ন", @@ -100,9 +102,10 @@ "MATH_MODULO_TITLE": "%1 ÷ %2 এর ভাগশেষ", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "এলোমেলো ভগ্নাংশ", "TEXT_TEXT_TOOLTIP": "একটি অক্ষর, শব্দ অথবা বাক্য।", - "TEXT_CREATE_JOIN_TITLE_JOIN": "সংযোগ কর", + "TEXT_CREATE_JOIN_TITLE_JOIN": "যোগ", "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "লেখাটিতে একটি পদ যোগ করুন।", "TEXT_APPEND_TO": "এতে", + "TEXT_LENGTH_TITLE": "%1-এর দৈর্ঘ্য", "TEXT_ISEMPTY_TITLE": "%1 খালি", "TEXT_ISEMPTY_TOOLTIP": "পাঠাবে সত্য যদি সরবরাহকৃত লেখাটি খালি হয়।", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "বড়হাতের অক্ষরে", @@ -110,17 +113,25 @@ "TEXT_TRIM_OPERATOR_BOTH": "উভয় পাশ থেকে খালি অংশ ছাটাই", "TEXT_TRIM_OPERATOR_LEFT": "বামপাশ থেকে খালি অংশ ছাটাই", "TEXT_TRIM_OPERATOR_RIGHT": "ডানপাশ থেকে খালি অংশ ছাটাই", - "TEXT_PRINT_TITLE": "প্রিন্ট %1", + "TEXT_PRINT_TITLE": "%1 মুদ্রণ করুন", + "TEXT_REVERSE_MESSAGE0": "%1 উল্টান", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "LISTS_CREATE_EMPTY_TITLE": "খালি তালিকা তৈরি করুন", "LISTS_CREATE_EMPTY_TOOLTIP": "পাঠাবে একটি তালিকা, দের্ঘ্য হবে ০, কোন উপাত্ত থাকবে না", "LISTS_CREATE_WITH_TOOLTIP": "যেকোন সংখ্যক পদ নিয়ে একটি তালিকা তৈরি করুন।", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "তালিকা", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "তালিকায় একটি পদ যোগ কর", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "তালিকায় একটি পদ যোগ করুন।", + "LISTS_LENGTH_TITLE": "%1-এর দৈর্ঘ্য", "LISTS_LENGTH_TOOLTIP": "একটি তালিকার দৈর্ঘ্য পাঠাবে।", "LISTS_ISEMPTY_TITLE": "%1 খালি", "LISTS_ISEMPTY_TOOLTIP": "পাঠাবে সত্য যদি তালিকাটি খালি হয়।", "LISTS_INLIST": "তালিকার মধ্যে", + "LISTS_INDEX_OF_FIRST": "আইটেমের প্রথম সংঘটন খুঁজুন", + "LISTS_INDEX_OF_LAST": "আইটেমের শেষ সংঘটন খুঁজুন", + "LISTS_GET_INDEX_GET": "নিন", + "LISTS_GET_INDEX_GET_REMOVE": "নিন ও সরান", "LISTS_GET_INDEX_REMOVE": "অপসারণ", + "LISTS_GET_INDEX_FROM_END": "# শেষ থেকে", "LISTS_GET_INDEX_FIRST": "প্রথম", "LISTS_GET_INDEX_LAST": "শেষ", "LISTS_GET_INDEX_RANDOM": "এলোমেলো", @@ -135,6 +146,8 @@ "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "তালিকা থেকে এলোমেলো একটি পদ অপসারণ করা হয়েছে।", "LISTS_SPLIT_LIST_FROM_TEXT": "লিখা থেকে তালিকা তৈরি করুন", "LISTS_SPLIT_TEXT_FROM_LIST": "তালিকা থেকে লিখা তৈরি করুন", + "LISTS_REVERSE_TOOLTIP": "একটি তালিকার একটি অনুলিপি উল্টান", + "VARIABLES_SET_CREATE_GET": "'%1 নিন' তৈরি করুন", "PROCEDURES_DEFNORETURN_TITLE": "এতে", "PROCEDURES_DEFNORETURN_TOOLTIP": "আউটপুট ছাড়া একটি ক্রিয়া তৈরি করুন।", "PROCEDURES_DEFRETURN_RETURN": "পাঠাবে", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/br.json b/src/opsoro/server/static/js/blockly/msg/json/br.json similarity index 87% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/br.json rename to src/opsoro/server/static/js/blockly/msg/json/br.json index e036d12..3c22ec0 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/br.json +++ b/src/opsoro/server/static/js/blockly/msg/json/br.json @@ -3,7 +3,8 @@ "authors": [ "Fohanno", "Y-M D", - "Gwenn-Ael" + "Gwenn-Ael", + "Fulup" ] }, "VARIABLES_DEFAULT_NAME": "elfenn", @@ -15,6 +16,8 @@ "INLINE_INPUTS": "Monedoù enlinenn", "DELETE_BLOCK": "Dilemel ar bloc'h", "DELETE_X_BLOCKS": "Dilemel %1 bloc'h", + "DELETE_ALL_BLOCKS": "Diverkañ an holl vloc'hoù %1 ?", + "CLEAN_UP": "Naetaat ar bloc'hoù", "COLLAPSE_BLOCK": "Bihanaat ar bloc'h", "COLLAPSE_ALL": "Bihanaat ar bloc'hoù", "EXPAND_BLOCK": "Astenn ar bloc'h", @@ -22,14 +25,16 @@ "DISABLE_BLOCK": "Diweredekaat ar bloc'h", "ENABLE_BLOCK": "Gweredekaat ar bloc'h", "HELP": "Skoazell", - "CHAT": "Flapañ gant ho kenlabourer en ur skrivañ er voest-se !", - "AUTH": "Roit aotre, mar plij, d'an arload-mañ evit gallout saveteiñ ho labour ha reiñ aotre dezhañ da rannañ ho labour ganimp.", - "ME": "Me", + "UNDO": "Dizober", + "REDO": "Adober", "CHANGE_VALUE_TITLE": "Kemmañ an dalvoudenn :", - "NEW_VARIABLE": "Argemmenn nevez...", - "NEW_VARIABLE_TITLE": "Anv an argemmenn nevez :", "RENAME_VARIABLE": "Adenvel an argemmenn...", "RENAME_VARIABLE_TITLE": "Adenvel an holl argemmennoù '%1' e :", + "NEW_VARIABLE": "Krouiñ un argemm nevez...", + "NEW_VARIABLE_TITLE": "Anv an argemmenn nevez :", + "VARIABLE_ALREADY_EXISTS": "Un argemm anvet '%1' zo anezhañ dija.", + "DELETE_VARIABLE_CONFIRMATION": "Lemel %1 implij eus an argemm '%2' ?", + "DELETE_VARIABLE": "Lemel an argemm '%1'", "COLOUR_PICKER_HELPURL": "http://br.wikipedia.org/wiki/Liv", "COLOUR_PICKER_TOOLTIP": "Dibab ul liv diwar al livaoueg.", "COLOUR_RANDOM_TITLE": "liv dargouezhek", @@ -177,7 +182,7 @@ "TEXT_LENGTH_TOOLTIP": "Distreiñ an niver a lizherennoù(en ur gontañ an esaouennoù e-barzh) en destenn roet.", "TEXT_ISEMPTY_TITLE": "%1 zo goullo", "TEXT_ISEMPTY_TOOLTIP": "Adkas gwir m'eo goullo an destenn roet.", - "TEXT_INDEXOF_TOOLTIP": "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus ar chadenn gentañ en eil chadenn. Distreiñ 0 ma n'eo ket kavet ar chadenn.", + "TEXT_INDEXOF_TOOLTIP": "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus ar chadenn gentañ en eil chadenn. Distreiñ %1 ma n'eo ket kavet ar chadenn.", "TEXT_INDEXOF_INPUT_INTEXT": "en destenn", "TEXT_INDEXOF_OPERATOR_FIRST": "kavout reveziadenn gentañ an destenn", "TEXT_INDEXOF_OPERATOR_LAST": "kavout reveziadenn diwezhañ an destenn", @@ -210,6 +215,15 @@ "TEXT_PROMPT_TYPE_NUMBER": "pedadenn evit un niver gant ur c'hemennad", "TEXT_PROMPT_TOOLTIP_NUMBER": "Goulenn un niver gant an implijer.", "TEXT_PROMPT_TOOLTIP_TEXT": "Goulenn un destenn gant an implijer.", + "TEXT_COUNT_MESSAGE0": "niver %1 war %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Kontañ pet gwech e c'hoarvez un destenn bennak en un destenn bennak all.", + "TEXT_REPLACE_MESSAGE0": "erlec'hiañ %1 gant %2 e %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Erlec'hiañ holl reveziadennoù un destenn bennak gant un destenn all.", + "TEXT_REVERSE_MESSAGE0": "eilpennañ %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Eilpennañ urzh an arouezennoù en destenn.", "LISTS_CREATE_EMPTY_TITLE": "krouiñ ur roll goullo", "LISTS_CREATE_EMPTY_TOOLTIP": "Distreiñ ul listenn, 0 a hirder, n'eus enrolladenn ebet enni", "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", @@ -227,7 +241,7 @@ "LISTS_INLIST": "el listenn", "LISTS_INDEX_OF_FIRST": "kavout reveziadenn gentañ un elfenn", "LISTS_INDEX_OF_LAST": "kavout reveziadenn diwezhañ un elfenn", - "LISTS_INDEX_OF_TOOLTIP": "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus an elfenn en ul listenn. Distreiñ 0 ma n'eo ket kavet an destenn.", + "LISTS_INDEX_OF_TOOLTIP": "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus an elfenn en ul listenn. Distreiñ %1 ma n'eo ket kavet an destenn.", "LISTS_GET_INDEX_GET": "tapout", "LISTS_GET_INDEX_GET_REMOVE": "tapout ha lemel", "LISTS_GET_INDEX_REMOVE": "lemel", @@ -235,31 +249,28 @@ "LISTS_GET_INDEX_FIRST": "kentañ", "LISTS_GET_INDEX_LAST": "diwezhañ", "LISTS_GET_INDEX_RANDOM": "dre zegouezh", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Distreiñ an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Distreiñ an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 eo an elfenn gentañ.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 eo an elfenn gentañ.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Distreiñ an elfenn el lec'h meneget en ul listenn.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Distreiñ an elfenn gentañ en ul listenn.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Distreiñ un elfenn diwezhañ en ul listenn.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Distreiñ un elfenn dre zegouezh en ul listenn.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Lemel ha distreiñ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Lemel ha distreiñ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn ziwezhañ.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Lemel ha distreiñ a ra an elfenn el lec'h meneget en ul listenn.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Lemel ha distreiñ a ra an elfenn gentañ en ul listenn.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Lemel ha distreiñ a ra an elfenn diwezhañ en ul listenn.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Lemel ha distreiñ a ra an elfenn dre zegouezh en ul listenn.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Lemel a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Lemel a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn ziwezhañ.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Lemel a ra an elfenn el lec'h meneget en ul listenn.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Lemel a ra an elfenn gentañ en ul listenn.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Distreiñ a ra an elfenn diwezhañ en ul listenn.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Lemel a ra un elfenn dre zegouezh en ul listenn.", "LISTS_SET_INDEX_SET": "termenañ", "LISTS_SET_INDEX_INSERT": "ensoc'hañ evel", "LISTS_SET_INDEX_INPUT_TO": "evel", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Termenañ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn ziwezhañ.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Termenañ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn diwezhañ.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Termenañ a ra an elfenn el lec'h meneget en ul listenn.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Termenañ a ra an elfenn gentañ en ul listenn.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Termenañ a ra an elfenn diwezhañ en ul listenn.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Termenañ a ra un elfenn dre zegouezh en ul listenn.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Ensoc'hañ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Ensoc'hañ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Ensoc'hañ a ra an elfenn el lec'h meneget en ul listenn.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Ensoc'hañ a ra an elfenn e deroù ul listenn.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Ouzhpennañ a ra an elfenn e fin al listenn.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Ensoc'hañ a ra an elfenn dre zegouezh en ul listenn.", @@ -270,12 +281,23 @@ "LISTS_GET_SUBLIST_END_FROM_END": "betek # adalek an dibenn", "LISTS_GET_SUBLIST_END_LAST": "betek ar fin", "LISTS_GET_SUBLIST_TOOLTIP": "Krouiñ un eilad eus lodenn spisaet ul listenn.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", + "LISTS_SORT_TITLE": "Rummañ%1,%2,%3", + "LISTS_SORT_TOOLTIP": "Rummañ un eilenn eus ar roll", + "LISTS_SORT_ORDER_ASCENDING": "war gresk", + "LISTS_SORT_ORDER_DESCENDING": "war zigresk", + "LISTS_SORT_TYPE_NUMERIC": "niverel", + "LISTS_SORT_TYPE_TEXT": "Dre urzh al lizherenneg", + "LISTS_SORT_TYPE_IGNORECASE": "Dre urzh al lizherenneg, hep derc'hel kont eus an direnneg", "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "Krouiñ ul listenn diwar an destenn", "LISTS_SPLIT_TEXT_FROM_LIST": "Krouiñ un destenn diwar al listenn", "LISTS_SPLIT_WITH_DELIMITER": "gant an dispartier", "LISTS_SPLIT_TOOLTIP_SPLIT": "Troc'hañ un destenn en ul listennad testennoù, o troc'hañ e pep dispartier.", "LISTS_SPLIT_TOOLTIP_JOIN": "Bodañ ul listennad testennoù en ul listenn hepken, o tispartiañ anezho gant un dispartier.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "eilpennañ %1", + "LISTS_REVERSE_TOOLTIP": "Eilpennañ un eilskrid eus ur roll.", "VARIABLES_GET_TOOLTIP": "Distreiñ talvoud an argemm-mañ.", "VARIABLES_GET_CREATE_SET": "Krouiñ 'termenañ %1'", "VARIABLES_SET": "termenañ %1 da %2", @@ -286,13 +308,14 @@ "PROCEDURES_BEFORE_PARAMS": "gant :", "PROCEDURES_CALL_BEFORE_PARAMS": "gant :", "PROCEDURES_DEFNORETURN_TOOLTIP": "Krouiñ un arc'hwel hep mont er-maez.", + "PROCEDURES_DEFNORETURN_COMMENT": "Deskrivañ an arc'hwel-mañ...", "PROCEDURES_DEFRETURN_RETURN": "distreiñ", "PROCEDURES_DEFRETURN_TOOLTIP": "Kouiñ un arc'hwel gant ur mont er-maez", "PROCEDURES_ALLOW_STATEMENTS": "aotren an disklêriadurioù", "PROCEDURES_DEF_DUPLICATE_WARNING": "Diwallit : an arc'hwel-mañ en deus arventennoù eiladet.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Seveniñ an arc'hwel '%1' termenet gant an implijer.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Seveniñ an arc'hwel '%1' termenet gant an implijer hag implijout e zisoc'h.", "PROCEDURES_MUTATORCONTAINER_TITLE": "Monedoù", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Ouzhpennañ, lemel, pe adkempenn monedoù an arc'hwel-mañ.", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ca.json b/src/opsoro/server/static/js/blockly/msg/json/ca.json similarity index 91% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/ca.json rename to src/opsoro/server/static/js/blockly/msg/json/ca.json index f6167e9..fc13a69 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ca.json +++ b/src/opsoro/server/static/js/blockly/msg/json/ca.json @@ -3,7 +3,8 @@ "authors": [ "Alvaro Vidal-Abarca", "Espertus", - "Hiperpobla" + "Hiperpobla", + "Jaumeortola" ] }, "VARIABLES_DEFAULT_NAME": "element", @@ -14,6 +15,7 @@ "INLINE_INPUTS": "Entrades en línia", "DELETE_BLOCK": "Esborra bloc", "DELETE_X_BLOCKS": "Esborra %1 blocs", + "DELETE_ALL_BLOCKS": "Esborrar els %1 blocs?", "COLLAPSE_BLOCK": "Contraure bloc", "COLLAPSE_ALL": "Contraure blocs", "EXPAND_BLOCK": "Expandir bloc", @@ -21,14 +23,11 @@ "DISABLE_BLOCK": "Desactiva bloc", "ENABLE_BLOCK": "Activa bloc", "HELP": "Ajuda", - "CHAT": "Xateja amb el teu col·laborador escrivint en aquest quadre!", - "AUTH": "Si us plau, autoritzeu que aquesta aplicació pugui desar la vostra feina i que la pugueu compartir.", - "ME": "Jo", "CHANGE_VALUE_TITLE": "Canvia valor:", - "NEW_VARIABLE": "Nova variable...", - "NEW_VARIABLE_TITLE": "Nou nom de variable:", "RENAME_VARIABLE": "Reanomena variable...", "RENAME_VARIABLE_TITLE": "Reanomena totes les variables '%1' a:", + "NEW_VARIABLE": "Nova variable...", + "NEW_VARIABLE_TITLE": "Nou nom de variable:", "COLOUR_PICKER_HELPURL": "https://ca.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Escolliu un color de la paleta.", "COLOUR_RANDOM_TITLE": "color aleatori", @@ -155,7 +154,7 @@ "MATH_MODULO_TITLE": "residu de %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Retorna el residu de dividir els dos nombres.", "MATH_CONSTRAIN_TITLE": "limitar %1 entre %2 i %3", - "MATH_CONSTRAIN_TOOLTIP": "Limita un nombre per tal que estigui entre els límits especificats (inclosos).", + "MATH_CONSTRAIN_TOOLTIP": "Limita un nombre perquè estigui entre els límits especificats (inclosos).", "MATH_RANDOM_INT_HELPURL": "https://ca.wikipedia.org/wiki/Generaci%C3%B3_de_nombres_aleatoris", "MATH_RANDOM_INT_TITLE": "nombre aleatori entre %1 i %2", "MATH_RANDOM_INT_TOOLTIP": "Retorna un nombre aleatori entre els dos límits especificats, inclosos.", @@ -176,7 +175,7 @@ "TEXT_LENGTH_TOOLTIP": "Retorna el nombre de lletres (espais inclosos) en el text proporcionat.", "TEXT_ISEMPTY_TITLE": "%1 està buit", "TEXT_ISEMPTY_TOOLTIP": "Retorna cert si el text proporcionat està buit.", - "TEXT_INDEXOF_TOOLTIP": "Retorna l'índex de la primera/última aparició del primer text dins el segon. Retorna 0 si no es troba el text.", + "TEXT_INDEXOF_TOOLTIP": "Retorna l'índex de la primera/última aparició del primer text dins el segon. Retorna %1 si no es troba el text.", "TEXT_INDEXOF_INPUT_INTEXT": "en el text", "TEXT_INDEXOF_OPERATOR_FIRST": "trobar la primera aparició del text", "TEXT_INDEXOF_OPERATOR_LAST": "trobar l'última aparició del text", @@ -225,7 +224,7 @@ "LISTS_INLIST": "en la llista", "LISTS_INDEX_OF_FIRST": "buscar primera aparició d'un element", "LISTS_INDEX_OF_LAST": "buscar última aparició d'un element", - "LISTS_INDEX_OF_TOOLTIP": "Retorna l'índex de la primera/última aparició d'un element a la llista. Retorna 0 si no s'hi troba el text.", + "LISTS_INDEX_OF_TOOLTIP": "Retorna l'índex de la primera/última aparició d'un element a la llista. Retorna %1 si no s'hi troba el text.", "LISTS_GET_INDEX_GET": "recupera", "LISTS_GET_INDEX_GET_REMOVE": "recupera i esborra", "LISTS_GET_INDEX_REMOVE": "esborra", @@ -233,31 +232,28 @@ "LISTS_GET_INDEX_FIRST": "primer", "LISTS_GET_INDEX_LAST": "últim", "LISTS_GET_INDEX_RANDOM": "a l'atzar", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Retorna l'element de la posició especificada a la llista. #1 és el primer element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Retorna l'element de la posició especificada a la llista. #1 és l'últim element.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 és el primer element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 és l'últim element.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Retorna l'element de la posició especificada a la llista.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Retorna el primer element d'una llista.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Retorna l'últim element d'una llista.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Retorna un element a l'atzar d'una llista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Esborra i retorna l'element de la posició especificada de la llista. #1 és el primer element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Esborra i retorna l'element de la posició especificada de la llista. #1 és l'últim element.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Esborra i retorna l'element de la posició especificada de la llista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Esborra i retorna el primer element d'una llista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Esborra i retorna l'últim element d'una llista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Esborra i retorna un element a l'atzar d'una llista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Esborra l'element de la posició especificada de la llista. #1 és el primer element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Esborra l'element de la posició especificada de la llista. #1 és l'últim element.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Esborra l'element de la posició especificada de la llista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Esborra el primer element d'una llista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Esborra l'últim element d'una llista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Esborra un element a l'atzar d'una llista.", "LISTS_SET_INDEX_SET": "modifica", "LISTS_SET_INDEX_INSERT": "insereix a", "LISTS_SET_INDEX_INPUT_TO": "com", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Modifica l'element de la posició especificada d'una llista. #1 és el primer element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Modifica l'element de la posició especificada d'una llista. #1 és l'últim element.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Modifica l'element de la posició especificada d'una llista.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Modifica el primer element d'una llista.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Modifica l'últim element d'una llista.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Modifica un element a l'atzar d'una llista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Insereix l'element a la posició especificada d'una llista. #1 és el primer element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Insereix l'element a la posició especificada d'una llista. #1 és l'últim element.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Insereix l'element a la posició especificada d'una llista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Insereix l'element al principi d'una llista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Afegeix l'element al final d'una llista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Insereix l'element en una posició a l'atzar d'una llista.", diff --git a/src/opsoro/server/static/js/blockly/msg/json/constants.json b/src/opsoro/server/static/js/blockly/msg/json/constants.json new file mode 100644 index 0000000..5b50103 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/constants.json @@ -0,0 +1 @@ +{"MATH_HUE": "230", "LOOPS_HUE": "120", "LISTS_HUE": "260", "LOGIC_HUE": "210", "VARIABLES_HUE": "330", "TEXTS_HUE": "160", "PROCEDURES_HUE": "290", "COLOUR_HUE": "20"} \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/cs.json b/src/opsoro/server/static/js/blockly/msg/json/cs.json similarity index 79% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/cs.json rename to src/opsoro/server/static/js/blockly/msg/json/cs.json index 22add2c..6e67676 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/cs.json +++ b/src/opsoro/server/static/js/blockly/msg/json/cs.json @@ -4,34 +4,44 @@ "Chmee2", "Rosnicka.kacka", "Matěj Grabovský", - "Espertus" + "Espertus", + "Utar", + "Clon", + "Koo6", + "Vtmarvin", + "Dvorapa" ] }, "VARIABLES_DEFAULT_NAME": "položka", - "DUPLICATE_BLOCK": "zdvojit", + "TODAY": "Dnes", + "DUPLICATE_BLOCK": "Duplikovat", "ADD_COMMENT": "Přidat komentář", "REMOVE_COMMENT": "Odstranit komentář", "EXTERNAL_INPUTS": "vnější vstupy", "INLINE_INPUTS": "Vložené vstupy", - "DELETE_BLOCK": "Odstranit blok", - "DELETE_X_BLOCKS": "Odstranit %1 bloky", - "COLLAPSE_BLOCK": "Skrýt blok", - "COLLAPSE_ALL": "Skrýt bloky", - "EXPAND_BLOCK": "Rozbalení bloku", + "DELETE_BLOCK": "Smazat blok", + "DELETE_X_BLOCKS": "Smazat %1 bloků", + "DELETE_ALL_BLOCKS": "Smazat všech %1 bloků?", + "CLEAN_UP": "Uspořádat bloky", + "COLLAPSE_BLOCK": "Sbalit blok", + "COLLAPSE_ALL": "Sbalit bloky", + "EXPAND_BLOCK": "Rozbalit blok", "EXPAND_ALL": "Rozbalit bloky", - "DISABLE_BLOCK": "Zakázat blok", + "DISABLE_BLOCK": "Deaktivovat blok", "ENABLE_BLOCK": "Povolit blok", "HELP": "Nápověda", - "CHANGE_VALUE_TITLE": "Změna hodnoty:", + "UNDO": "Zpět", + "REDO": "Znovu", + "CHANGE_VALUE_TITLE": "Změnit hodnotu:", + "RENAME_VARIABLE": "Přejmenovat proměnnou...", + "RENAME_VARIABLE_TITLE": "Přejmenuj všech '%1' proměnných na:", "NEW_VARIABLE": "Nová proměnná...", "NEW_VARIABLE_TITLE": "Nový název proměnné:", - "RENAME_VARIABLE": "Přejmenovat proměnné...", - "RENAME_VARIABLE_TITLE": "Přejmenujte všechny proměnné '%1':", "COLOUR_PICKER_HELPURL": "https://cs.wikipedia.org/wiki/Barva", "COLOUR_PICKER_TOOLTIP": "Vyberte barvu z palety.", "COLOUR_RANDOM_TITLE": "náhodná barva", "COLOUR_RANDOM_TOOLTIP": "Zvolte barvu náhodně.", - "COLOUR_RGB_TITLE": "barva s", + "COLOUR_RGB_TITLE": "obarvěte barvou", "COLOUR_RGB_RED": "červená", "COLOUR_RGB_GREEN": "zelená", "COLOUR_RGB_BLUE": "modrá", @@ -41,21 +51,21 @@ "COLOUR_BLEND_COLOUR2": "barva 2", "COLOUR_BLEND_RATIO": "poměr", "COLOUR_BLEND_TOOLTIP": "Smíchá dvě barvy v daném poměru (0.0–1.0).", - "CONTROLS_REPEAT_HELPURL": "https://cs.wikipedia.org/wiki/Cyklus_for", - "CONTROLS_REPEAT_TITLE": "opakovat %1 krát", - "CONTROLS_REPEAT_INPUT_DO": "udělej", + "CONTROLS_REPEAT_HELPURL": "https://cs.wikipedia.org/wiki/Cyklus_pro", + "CONTROLS_REPEAT_TITLE": "opakuj %1 krát", + "CONTROLS_REPEAT_INPUT_DO": "dělej", "CONTROLS_REPEAT_TOOLTIP": "Proveď určité příkazy několikrát.", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "opakovat když", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "opakovat dokud", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Dokud je hodnota pravdivá, prováděj určité příkazy.", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Dokud je hodnota nepravdivá, prováděj určité příkazy.", - "CONTROLS_FOR_TOOLTIP": "Nechá proměnnou \"%1\" nabývat hodnot od počátečního do koncového čísla po daném přírůstku a provádí s ní příslušné bloky.", + "CONTROLS_FOR_TOOLTIP": "Nechá proměnnou '%1' nabývat hodnot od počátečního do koncového čísla po daném přírůstku a provádí s ní příslušné bloky.", "CONTROLS_FOR_TITLE": "počítat s %1 od %2 do %3 po %4", "CONTROLS_FOREACH_TITLE": "pro každou položku %1 v seznamu %2", "CONTROLS_FOREACH_TOOLTIP": "Pro každou položku v seznamu nastavte do proměnné '%1' danou položku a proveďte nějaké operace.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "vymanit se ze smyčky", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "vyskočit ze smyčky", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "pokračuj dalším opakováním smyčky", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Přeruš vnitřní smyčku.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Vyskoč z vnitřní smyčky.", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Přeskoč zbytek této smyčky a pokračuj dalším opakováním.", "CONTROLS_FLOW_STATEMENTS_WARNING": "Upozornění: Tento blok může být použit pouze uvnitř smyčky.", "CONTROLS_IF_TOOLTIP_1": "Je-li hodnota pravda, proveď určité příkazy.", @@ -65,9 +75,9 @@ "CONTROLS_IF_MSG_IF": "pokud", "CONTROLS_IF_MSG_ELSEIF": "nebo pokud", "CONTROLS_IF_MSG_ELSE": "jinak", - "CONTROLS_IF_IF_TOOLTIP": "Přidej, odstraň či uspořádej sekce k přenastavení tohoto bloku pokud.", + "CONTROLS_IF_IF_TOOLTIP": "Přidej, odstraň či uspořádej sekce k přenastavení tohoto bloku \"pokud\".", "CONTROLS_IF_ELSEIF_TOOLTIP": "Přidat podmínku do \"pokud\" bloku.", - "CONTROLS_IF_ELSE_TOOLTIP": "Přidej konečnou podmínku zahrnující ostatní případy do bloku pokud.", + "CONTROLS_IF_ELSE_TOOLTIP": "Přidej konečnou podmínku zahrnující ostatní případy do bloku \"pokud\".", "LOGIC_COMPARE_HELPURL": "https://cs.wikipedia.org/wiki/Nerovnost_(matematika)", "LOGIC_COMPARE_TOOLTIP_EQ": "Vrátí hodnotu pravda, pokud se oba vstupy rovnají jeden druhému.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Vrátí hodnotu pravda, pokud se oba vstupy nerovnají sobě navzájem.", @@ -79,16 +89,17 @@ "LOGIC_OPERATION_AND": "a", "LOGIC_OPERATION_TOOLTIP_OR": "Vrátí hodnotu pravda, pokud alespoň jeden ze vstupů má hodnotu pravda.", "LOGIC_OPERATION_OR": "nebo", - "LOGIC_NEGATE_TITLE": "není %1", + "LOGIC_NEGATE_TITLE": "ne %1", "LOGIC_NEGATE_TOOLTIP": "Navrátí hodnotu pravda, pokud je vstup nepravda. Navrátí hodnotu nepravda, pokud je vstup pravda.", "LOGIC_BOOLEAN_TRUE": "pravda", "LOGIC_BOOLEAN_FALSE": "nepravda", "LOGIC_BOOLEAN_TOOLTIP": "Vrací pravda nebo nepravda.", - "LOGIC_NULL": "nula", - "LOGIC_NULL_TOOLTIP": "Vrátí nulovou hodnotu", + "LOGIC_NULL": "prázdný", + "LOGIC_NULL_TOOLTIP": "Vrátí prázdnou hodnotu", + "LOGIC_TERNARY_HELPURL": "https://cs.wikipedia.org/wiki/Ternární operátor (programování)", "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "je-li to pravda", - "LOGIC_TERNARY_IF_FALSE": "je-li nepravda", + "LOGIC_TERNARY_IF_TRUE": "pokud pravda", + "LOGIC_TERNARY_IF_FALSE": "pokud nepravda", "LOGIC_TERNARY_TOOLTIP": "Zkontroluje podmínku v \"testu\". Když je podmínka pravda, vrátí hodnotu \"pokud pravda\"; v opačném případě vrátí hodnotu \"pokud nepravda\".", "MATH_NUMBER_HELPURL": "https://cs.wikipedia.org/wiki/Číslo", "MATH_NUMBER_TOOLTIP": "Číslo.", @@ -111,38 +122,38 @@ "MATH_SINGLE_HELPURL": "https://cs.wikipedia.org/wiki/Druhá_odmocnina", "MATH_SINGLE_OP_ROOT": "druhá odmocnina", "MATH_SINGLE_TOOLTIP_ROOT": "Vrátí druhou odmocninu čísla.", - "MATH_SINGLE_OP_ABSOLUTE": "absolutní", + "MATH_SINGLE_OP_ABSOLUTE": "absolutní hodnota", "MATH_SINGLE_TOOLTIP_ABS": "Vrátí absolutní hodnotu čísla.", "MATH_SINGLE_TOOLTIP_NEG": "Vrátí zápornou hodnotu čísla.", "MATH_SINGLE_TOOLTIP_LN": "Vrátí přirozený logaritmus čísla.", "MATH_SINGLE_TOOLTIP_LOG10": "Vrátí desítkový logaritmus čísla.", "MATH_SINGLE_TOOLTIP_EXP": "Vrátí mocninu čísla e.", "MATH_SINGLE_TOOLTIP_POW10": "Vrátí mocninu čísla 10.", - "MATH_TRIG_HELPURL": "https://cs.wikipedia.org/wiki/Goniometrická_funkce", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Vrátí sinus úhlu ve stupních.", "MATH_TRIG_TOOLTIP_COS": "Vrátí kosinus úhlu ve stupních.", "MATH_TRIG_TOOLTIP_TAN": "Vrátí tangens úhlu ve stupních.", - "MATH_TRIG_TOOLTIP_ASIN": "Vrátí arcsinus čísla.", - "MATH_TRIG_TOOLTIP_ACOS": "Vrátí arckosinus čísla.", - "MATH_TRIG_TOOLTIP_ATAN": "Vrátí arctangens čísla.", + "MATH_TRIG_TOOLTIP_ASIN": "Vrátí arkus sinus čísla.", + "MATH_TRIG_TOOLTIP_ACOS": "Vrátí arkus kosinus čísla.", + "MATH_TRIG_TOOLTIP_ATAN": "Vrátí arkus tangens čísla.", "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Vraťte jednu z následujících konstant: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).", + "MATH_CONSTANT_TOOLTIP": "Vraťte jednu z následujících konstant: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (nekonečno).", "MATH_IS_EVEN": "je sudé", "MATH_IS_ODD": "je liché", "MATH_IS_PRIME": "je prvočíslo", "MATH_IS_WHOLE": "je celé", "MATH_IS_POSITIVE": "je kladné", "MATH_IS_NEGATIVE": "je záporné", - "MATH_IS_DIVISIBLE_BY": "je dělitelné", + "MATH_IS_DIVISIBLE_BY": "je dělitelné číslem", "MATH_IS_TOOLTIP": "Kontrola, zda je číslo sudé, liché, prvočíslo, celé, kladné, záporné nebo zda je dělitelné daným číslem. Vrací pravdu nebo nepravdu.", - "MATH_CHANGE_HELPURL": "https://pt.wikipedia.org/wiki/Adi%C3%A7%C3%A3o", - "MATH_CHANGE_TITLE": "změnit %1 od %2", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "zaměň %1 za %2", "MATH_CHANGE_TOOLTIP": "Přičti číslo k proměnné '%1'.", - "MATH_ROUND_HELPURL": "https://cs.wikipedia.org/wiki/Zaokrouhlení", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Zaokrouhlit číslo nahoru nebo dolů.", "MATH_ROUND_OPERATOR_ROUND": "zaokrouhlit", "MATH_ROUND_OPERATOR_ROUNDUP": "zaokrouhlit nahoru", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "zaokrouhlit dolu", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "zaokrouhlit dolů", "MATH_ONLIST_OPERATOR_SUM": "suma seznamu", "MATH_ONLIST_TOOLTIP_SUM": "Vrátí součet všech čísel v seznamu.", "MATH_ONLIST_OPERATOR_MIN": "nejmenší v seznamu", @@ -153,6 +164,7 @@ "MATH_ONLIST_TOOLTIP_AVERAGE": "Vrátí průměr (aritmetický průměr) číselných hodnot v seznamu.", "MATH_ONLIST_OPERATOR_MEDIAN": "medián v seznamu", "MATH_ONLIST_TOOLTIP_MEDIAN": "Vrátí medián seznamu.", + "MATH_ONLIST_OPERATOR_MODE": "nejčastější ze seznamu", "MATH_ONLIST_TOOLTIP_MODE": "Vrátí seznam nejčastějších položek seznamu.", "MATH_ONLIST_OPERATOR_STD_DEV": "směrodatná odchylka ze seznamu", "MATH_ONLIST_TOOLTIP_STD_DEV": "Vrátí směrodatnou odchylku seznamu.", @@ -183,7 +195,7 @@ "TEXT_LENGTH_TOOLTIP": "Vrátí počet písmen (včetně mezer) v zadaném textu.", "TEXT_ISEMPTY_TITLE": "%1 je prázdný", "TEXT_ISEMPTY_TOOLTIP": "Vrátí pravda pokud je zadaný text prázdný.", - "TEXT_INDEXOF_TOOLTIP": "Vrátí index prvního/posledního výskytu prvního textu v druhém textu. Pokud text není nalezen, vrátí hodnotu 0.", + "TEXT_INDEXOF_TOOLTIP": "Vrátí index prvního/posledního výskytu prvního textu v druhém textu. Pokud text není nalezen, vypíše %1.", "TEXT_INDEXOF_INPUT_INTEXT": "v textu", "TEXT_INDEXOF_OPERATOR_FIRST": "najít první výskyt textu", "TEXT_INDEXOF_OPERATOR_LAST": "najít poslední výskyt textu", @@ -232,6 +244,7 @@ "LISTS_INLIST": "v seznamu", "LISTS_INDEX_OF_FIRST": "najít první výskyt položky", "LISTS_INDEX_OF_LAST": "najít poslední výskyt položky", + "LISTS_INDEX_OF_TOOLTIP": "Vrací index prvního/posledního výskytu položky v seznamu. Vrací %1, pokud položka nebyla nalezena.", "LISTS_GET_INDEX_GET": "získat", "LISTS_GET_INDEX_GET_REMOVE": "získat a odstranit", "LISTS_GET_INDEX_REMOVE": "odstranit", @@ -240,31 +253,28 @@ "LISTS_GET_INDEX_FIRST": "první", "LISTS_GET_INDEX_LAST": "poslední", "LISTS_GET_INDEX_RANDOM": "náhodné", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Vrátí položku z určené pozice v seznamu. #1 je první položka.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Vrátí položku z určené pozice v seznamu. #1 je poslední položka.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 je první položka.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 je poslední položka.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Získá položku z určené pozice v seznamu.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Vrátí první položku v seznamu.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Vrátí poslední položku v seznamu.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Vrátí náhodnou položku ze seznamu.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Odstraní a vrátí položku z určené pozice v seznamu. #1 je první položka.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Odstraní a vrátí položku z určené pozice v seznamu. #1 je poslední položka.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Odstraní a získá položku z určené pozice v seznamu.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Odstraní a vrátí první položku v seznamu.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Odstraní a vrátí poslední položku v seznamu.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Odstraní a vrátí náhodnou položku v seznamu.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Odebere položku na konkrétním místě v seznamu. #1 je první položka.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Odstraní položku na konkrétním místu v seznamu. #1 je poslední položka.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Odebere položku na konkrétním místě v seznamu.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Odstraní první položku v seznamu.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Odstraní poslední položku v seznamu.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Odstraní náhodou položku v seznamu.", "LISTS_SET_INDEX_SET": "nastavit", "LISTS_SET_INDEX_INSERT": "vložit na", "LISTS_SET_INDEX_INPUT_TO": "jako", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Nastaví položku na konkrétní místo v seznamu. #1 je první položka.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Nastaví položku na konkrétní místo v seznamu. #1 je poslední položka.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Nastaví položku na konkrétní místo v seznamu.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Nastaví první položku v seznamu.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Nastaví poslední položku v seznamu.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Nastaví náhodnou položku v seznamu.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Vloží položku na určenou pozici v seznamu. #1 je první položka.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Vloží položku na určenou pozici v seznamu. #1 je poslední položka.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Vloží položku na určenou pozici v seznamu.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Vložit položku na začátek seznamu.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Připojí položku na konec seznamu.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Připojí položku náhodně do seznamu.", @@ -275,27 +285,47 @@ "LISTS_GET_SUBLIST_END_FROM_END": "do # od konce", "LISTS_GET_SUBLIST_END_LAST": "jako poslední", "LISTS_GET_SUBLIST_TOOLTIP": "Vytvoří kopii určené části seznamu.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "seřadit %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Seřadit kopii seznamu.", + "LISTS_SORT_ORDER_ASCENDING": "vzestupně", + "LISTS_SORT_ORDER_DESCENDING": "sestupně", + "LISTS_SORT_TYPE_NUMERIC": "číselné", + "LISTS_SORT_TYPE_TEXT": "abecedně", + "LISTS_SORT_TYPE_IGNORECASE": "abecedně, na velikosti písmen nezáleží", + "LISTS_SPLIT_LIST_FROM_TEXT": "udělat z textu seznam", + "LISTS_SPLIT_TEXT_FROM_LIST": "udělat ze seznamu text", + "LISTS_SPLIT_WITH_DELIMITER": "s oddělovačem", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Rozdělit text do seznamu textů, lámání na oddělovačích.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Spojit seznam textů do jednoho textu, rozdělaného oddělovači.", "VARIABLES_GET_TOOLTIP": "Vrátí hodnotu této proměnné.", "VARIABLES_GET_CREATE_SET": "Vytvořit \"nastavit %1\"", "VARIABLES_SET": "nastavit %1 na %2", "VARIABLES_SET_TOOLTIP": "Nastaví tuto proměnnou, aby se rovnala vstupu.", "VARIABLES_SET_CREATE_GET": "Vytvořit \"získat %1\"", + "PROCEDURES_DEFNORETURN_HELPURL": "https://cs.wikipedia.org/w/index.php?title=Funkce_(programování)", "PROCEDURES_DEFNORETURN_TITLE": "k provedení", "PROCEDURES_DEFNORETURN_PROCEDURE": "proveď něco", "PROCEDURES_BEFORE_PARAMS": "s:", "PROCEDURES_CALL_BEFORE_PARAMS": "s:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Vytvořit funkci bez výstupu.", + "PROCEDURES_DEFNORETURN_COMMENT": "Popište tuto funkci...", + "PROCEDURES_DEFRETURN_HELPURL": "https://cs.wikipedia.org/w/index.php?title=Funkce_(programování)", "PROCEDURES_DEFRETURN_RETURN": "navrátit", "PROCEDURES_DEFRETURN_TOOLTIP": "Vytvořit funkci s výstupem.", + "PROCEDURES_ALLOW_STATEMENTS": "povolit příkazy", "PROCEDURES_DEF_DUPLICATE_WARNING": "Upozornění: Tato funkce má duplicitní parametry.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://cs.wikipedia.org/wiki/Funkce_(programov%C3%A1n%C3%AD)", + "PROCEDURES_CALLNORETURN_HELPURL": "https://cs.wikipedia.org/wiki/Podprogram", "PROCEDURES_CALLNORETURN_TOOLTIP": "Spustí uživatelem definovanou funkci '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://cs.wikipedia.org/wiki/Funkce_(programov%C3%A1n%C3%AD)", + "PROCEDURES_CALLRETURN_HELPURL": "https://cs.wikipedia.org/wiki/Podprogram", "PROCEDURES_CALLRETURN_TOOLTIP": "Spustí uživatelem definovanou funkci '%1' a použije její výstup.", "PROCEDURES_MUTATORCONTAINER_TITLE": "vstupy", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Přidat, odebrat nebo změnit pořadí vstupů této funkce.", "PROCEDURES_MUTATORARG_TITLE": "vstupní jméno:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Přidat vstupy do funkce.", "PROCEDURES_HIGHLIGHT_DEF": "Zvýraznit definici funkce", "PROCEDURES_CREATE_DO": "Vytvořit '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Je-li hodnota pravda, pak vrátí druhou hodnotu.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Varování: Tento blok může být použit pouze uvnitř definici funkce." } diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/da.json b/src/opsoro/server/static/js/blockly/msg/json/da.json similarity index 91% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/da.json rename to src/opsoro/server/static/js/blockly/msg/json/da.json index 1a93c42..a77bd81 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/da.json +++ b/src/opsoro/server/static/js/blockly/msg/json/da.json @@ -3,7 +3,9 @@ "authors": [ "Christian List", "RickiRunge", - "MGA73" + "MGA73", + "Mads Haupt", + "Tjernobyl" ] }, "VARIABLES_DEFAULT_NAME": "element", @@ -15,6 +17,8 @@ "INLINE_INPUTS": "Indlejrede inputs", "DELETE_BLOCK": "Slet blok", "DELETE_X_BLOCKS": "Slet %1 blokke", + "DELETE_ALL_BLOCKS": "Slet alle %1 blokke?", + "CLEAN_UP": "Ryd op i blokke", "COLLAPSE_BLOCK": "Fold blokken sammen", "COLLAPSE_ALL": "Fold blokkene sammen", "EXPAND_BLOCK": "Fold blokken ud", @@ -22,14 +26,11 @@ "DISABLE_BLOCK": "Deaktivér blok", "ENABLE_BLOCK": "Aktivér blok", "HELP": "Hjælp", - "CHAT": "Chat med din samarbejdspartner ved at skrive i denne boks!", - "AUTH": "Tillad venligst at denne app muliggør at du kan gemme dit arbejde og at du kan dele det.", - "ME": "Mig", "CHANGE_VALUE_TITLE": "Skift værdi:", - "NEW_VARIABLE": "Ny variabel...", - "NEW_VARIABLE_TITLE": "Navn til den nye variabel:", "RENAME_VARIABLE": "Omdøb variabel...", "RENAME_VARIABLE_TITLE": "Omdøb alle '%1' variabler til:", + "NEW_VARIABLE": "Ny variabel...", + "NEW_VARIABLE_TITLE": "Navn til den nye variabel:", "COLOUR_PICKER_HELPURL": "https://da.wikipedia.org/wiki/Farve", "COLOUR_PICKER_TOOLTIP": "Vælg en farve fra paletten.", "COLOUR_RANDOM_TITLE": "tilfældig farve", @@ -178,7 +179,7 @@ "TEXT_LENGTH_TOOLTIP": "Returnerer antallet af bogstaver (herunder mellemrum) i den angivne tekst.", "TEXT_ISEMPTY_TITLE": "%1 er tom", "TEXT_ISEMPTY_TOOLTIP": "Returnerer sand, hvis den angivne tekst er tom.", - "TEXT_INDEXOF_TOOLTIP": "Returnerer indeks for første/sidste forekomst af første tekst i den anden tekst. Returnerer 0, hvis teksten ikke kan findes.", + "TEXT_INDEXOF_TOOLTIP": "Returnerer indeks for første/sidste forekomst af første tekst i den anden tekst. Returnerer %1, hvis teksten ikke kan findes.", "TEXT_INDEXOF_INPUT_INTEXT": "i teksten", "TEXT_INDEXOF_OPERATOR_FIRST": "find første forekomst af teksten", "TEXT_INDEXOF_OPERATOR_LAST": "find sidste forekomst af teksten", @@ -227,7 +228,7 @@ "LISTS_INLIST": "i listen", "LISTS_INDEX_OF_FIRST": "find første forekomst af elementet", "LISTS_INDEX_OF_LAST": "find sidste forekomst af elementet", - "LISTS_INDEX_OF_TOOLTIP": "Returnerer indeks for første/sidste forekomst af elementet i listen. Returnerer 0, hvis teksten ikke er fundet.", + "LISTS_INDEX_OF_TOOLTIP": "Returnerer indeks for første/sidste forekomst af elementet i listen. Returnerer %1, hvis elementet ikke kan findes.", "LISTS_GET_INDEX_GET": "hent", "LISTS_GET_INDEX_GET_REMOVE": "hent og fjern", "LISTS_GET_INDEX_REMOVE": "fjern", @@ -235,31 +236,28 @@ "LISTS_GET_INDEX_FIRST": "første", "LISTS_GET_INDEX_LAST": "sidste", "LISTS_GET_INDEX_RANDOM": "tilfældig", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Returnerer elementet på den angivne position på en liste. #1 er det første element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Returnerer elementet på den angivne position på en liste. #1 er det sidste element.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 er det første element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 er det sidste element.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Returnerer elementet på den angivne position på en liste.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Returnerer det første element i en liste.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Returnerer den sidste element i en liste.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Returnerer et tilfældigt element i en liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Fjerner og returnerer elementet på den angivne position på en liste. #1 er det første element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Fjerner og returnerer elementet på den angivne position på en liste. #1 er det sidste element.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Fjerner og returnerer elementet på den angivne position på en liste.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Fjerner og returnerer det første element i en liste.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Fjerner og returnerer det sidste element i en liste.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Fjerner og returnerer et tilfældigt element i en liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Fjerner elementet på den angivne position på en liste. #1 er det første element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Fjerner elementet på den angivne position på en liste. #1 er det sidste element.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Fjerner elementet på den angivne position på en liste.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Fjerner det første element i en liste.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Fjerner sidste element i en liste.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Fjerner et tilfældigt element i en liste.", "LISTS_SET_INDEX_SET": "sæt", "LISTS_SET_INDEX_INSERT": "indsæt ved", "LISTS_SET_INDEX_INPUT_TO": "som", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Sætter elementet på den angivne position i en liste. #1 er det første element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Sætter elementet på den angivne position i en liste. #1 er det sidste element.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Sætter elementet på den angivne position i en liste.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Sætter det første element i en liste.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Sætter det sidste element i en liste.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Sætter et tilfældigt element i en liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Indsætter elementet på den angivne position i en liste. #1 er det første element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Indsætter elementet på den angivne position i en liste. #1 er det sidste element.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Indsætter elementet på den angivne position i en liste.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Indsætter elementet i starten af en liste.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Føj elementet til slutningen af en liste.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Indsætter elementet tilfældigt i en liste.", @@ -270,6 +268,10 @@ "LISTS_GET_SUBLIST_END_FROM_END": "til # fra slutningen", "LISTS_GET_SUBLIST_END_LAST": "til sidste", "LISTS_GET_SUBLIST_TOOLTIP": "Opretter en kopi af den angivne del af en liste.", + "LISTS_SORT_ORDER_ASCENDING": "stigende", + "LISTS_SORT_ORDER_DESCENDING": "faldende", + "LISTS_SORT_TYPE_NUMERIC": "nummerorden", + "LISTS_SORT_TYPE_TEXT": "alfabetisk", "LISTS_SPLIT_LIST_FROM_TEXT": "lav tekst til liste", "LISTS_SPLIT_TEXT_FROM_LIST": "lav liste til tekst", "LISTS_SPLIT_WITH_DELIMITER": "med skilletegn", @@ -285,6 +287,7 @@ "PROCEDURES_BEFORE_PARAMS": "med:", "PROCEDURES_CALL_BEFORE_PARAMS": "med:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Opretter en funktion der ikke har nogen returværdi.", + "PROCEDURES_DEFNORETURN_COMMENT": "Beskriv denne funktion...", "PROCEDURES_DEFRETURN_RETURN": "returnér", "PROCEDURES_DEFRETURN_TOOLTIP": "Opretter en funktion der har en returværdi.", "PROCEDURES_ALLOW_STATEMENTS": "tillad erklæringer", @@ -300,5 +303,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Markér funktionsdefinitionen", "PROCEDURES_CREATE_DO": "Opret '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Hvis en værdi er sand, så returnér en anden værdi.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Advarsel: Denne blok kan kun anvendes inden for en funktionsdefinition." } diff --git a/src/opsoro/server/static/js/blockly/msg/json/de.json b/src/opsoro/server/static/js/blockly/msg/json/de.json new file mode 100644 index 0000000..6d9c122 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/de.json @@ -0,0 +1,363 @@ +{ + "@metadata": { + "authors": [ + "Metalhead64", + "M165437", + "Dan-yell", + "아라", + "Octycs", + "Cvanca", + "THINK", + "Zgtm" + ] + }, + "VARIABLES_DEFAULT_NAME": "etwas", + "TODAY": "Heute", + "DUPLICATE_BLOCK": "Kopieren", + "ADD_COMMENT": "Kommentar hinzufügen", + "REMOVE_COMMENT": "Kommentar entfernen", + "EXTERNAL_INPUTS": "externe Eingänge", + "INLINE_INPUTS": "interne Eingänge", + "DELETE_BLOCK": "Baustein löschen", + "DELETE_X_BLOCKS": "%1 Bausteine löschen", + "DELETE_ALL_BLOCKS": "Alle %1 Bausteine löschen?", + "CLEAN_UP": "Bausteine aufräumen", + "COLLAPSE_BLOCK": "Baustein zusammenfalten", + "COLLAPSE_ALL": "Alle Bausteine zusammenfalten", + "EXPAND_BLOCK": "Baustein entfalten", + "EXPAND_ALL": "Alle Bausteine entfalten", + "DISABLE_BLOCK": "Baustein deaktivieren", + "ENABLE_BLOCK": "Baustein aktivieren", + "HELP": "Hilfe", + "UNDO": "Rückgängig", + "REDO": "Wiederholen", + "CHANGE_VALUE_TITLE": "Wert ändern:", + "RENAME_VARIABLE": "Variable umbenennen …", + "RENAME_VARIABLE_TITLE": "Alle \"%1\" Variablen umbenennen in:", + "NEW_VARIABLE": "Variable erstellen …", + "NEW_VARIABLE_TITLE": "Name der neuen Variable:", + "VARIABLE_ALREADY_EXISTS": "Eine Variable namens „%1“ ist bereits vorhanden.", + "DELETE_VARIABLE_CONFIRMATION": "%1 Verwendungen der Variable „%2“ löschen?", + "DELETE_VARIABLE": "Die Variable „%1“ löschen", + "COLOUR_PICKER_HELPURL": "https://de.wikipedia.org/wiki/Farbe", + "COLOUR_PICKER_TOOLTIP": "Erzeugt eine Farbe aus der Palette.", + "COLOUR_RANDOM_TITLE": "zufällige Farbe", + "COLOUR_RANDOM_TOOLTIP": "Erzeugt eine Farbe nach dem Zufallsprinzip.", + "COLOUR_RGB_HELPURL": "https://de.wikipedia.org/wiki/RGB-Farbraum", + "COLOUR_RGB_TITLE": "Farbe aus", + "COLOUR_RGB_RED": "rot", + "COLOUR_RGB_GREEN": "grün", + "COLOUR_RGB_BLUE": "blau", + "COLOUR_RGB_TOOLTIP": "Erzeugt eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 100 liegen.", + "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", + "COLOUR_BLEND_TITLE": "mische", + "COLOUR_BLEND_COLOUR1": "Farbe 1", + "COLOUR_BLEND_COLOUR2": "und Farbe 2", + "COLOUR_BLEND_RATIO": "im Verhältnis", + "COLOUR_BLEND_TOOLTIP": "Vermischt 2 Farben mit konfigurierbarem Farbverhältnis (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://de.wikipedia.org/wiki/For-Schleife", + "CONTROLS_REPEAT_TITLE": "wiederhole %1 mal:", + "CONTROLS_REPEAT_INPUT_DO": "mache", + "CONTROLS_REPEAT_TOOLTIP": "Eine Anweisung mehrfach ausführen.", + "CONTROLS_WHILEUNTIL_HELPURL": "https://de.wikipedia.org/wiki/Schleife_%28Programmierung%29", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "wiederhole solange", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "wiederhole bis", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Führt Anweisungen aus solange die Bedingung wahr ist.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Führt Anweisungen aus solange die Bedingung unwahr ist.", + "CONTROLS_FOR_HELPURL": "https://de.wikipedia.org/wiki/For-Schleife", + "CONTROLS_FOR_TOOLTIP": "Zählt die Variable \"%1\" von einem Startwert bis zu einem Endwert und führt für jeden Wert eine Anweisung aus.", + "CONTROLS_FOR_TITLE": "zähle %1 von %2 bis %3 in Schritten von %4", + "CONTROLS_FOREACH_HELPURL": "https://de.wikipedia.org/wiki/For-Schleife", + "CONTROLS_FOREACH_TITLE": "für jeden Wert %1 aus der Liste %2", + "CONTROLS_FOREACH_TOOLTIP": "Führt eine Anweisung für jeden Wert in der Liste aus und setzt dabei die Variable \"%1\" auf den aktuellen Listenwert.", + "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://de.wikipedia.org/wiki/Kontrollstruktur", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "die Schleife abbrechen", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "sofort mit nächstem Schleifendurchlauf fortfahren", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Die umgebende Schleife beenden.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Diese Anweisung abbrechen und mit dem nächsten Schleifendurchlauf fortfahren.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Warnung: Dieser Baustein kann nur in einer Schleife verwendet werden.", + "CONTROLS_IF_TOOLTIP_1": "Führt eine Anweisung aus, falls eine Bedingung wahr ist.", + "CONTROLS_IF_TOOLTIP_2": "Führt die erste Anweisung aus, falls eine Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus.", + "CONTROLS_IF_TOOLTIP_3": "Führt die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist.", + "CONTROLS_IF_TOOLTIP_4": "Führe die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist. Führt die dritte Anweisung aus, falls keine der beiden Bedingungen wahr ist", + "CONTROLS_IF_MSG_IF": "falls", + "CONTROLS_IF_MSG_ELSEIF": "sonst falls", + "CONTROLS_IF_MSG_ELSE": "sonst", + "CONTROLS_IF_IF_TOOLTIP": "Hinzufügen, entfernen oder sortieren von Sektionen", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Eine weitere Bedingung hinzufügen.", + "CONTROLS_IF_ELSE_TOOLTIP": "Eine sonst-Bedingung hinzufügen. Führt eine Anweisung aus, falls keine Bedingung zutrifft.", + "LOGIC_COMPARE_HELPURL": "https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29", + "LOGIC_COMPARE_TOOLTIP_EQ": "Ist wahr, falls beide Werte gleich sind.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Ist wahr, falls beide Werte unterschiedlich sind.", + "LOGIC_COMPARE_TOOLTIP_LT": "Ist wahr, falls der erste Wert kleiner als der zweite Wert ist.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Ist wahr, falls der erste Wert kleiner als oder gleich groß wie der zweite Wert ist.", + "LOGIC_COMPARE_TOOLTIP_GT": "Ist wahr, falls der erste Wert größer als der zweite Wert ist.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Ist wahr, falls der erste Wert größer als oder gleich groß wie der zweite Wert ist.", + "LOGIC_OPERATION_TOOLTIP_AND": "Ist wahr, falls beide Werte wahr sind.", + "LOGIC_OPERATION_AND": "und", + "LOGIC_OPERATION_TOOLTIP_OR": "Ist wahr, falls einer der beiden Werte wahr ist.", + "LOGIC_OPERATION_OR": "oder", + "LOGIC_NEGATE_TITLE": "nicht %1", + "LOGIC_NEGATE_TOOLTIP": "Ist wahr, falls der Eingabewert unwahr ist. Ist unwahr, falls der Eingabewert wahr ist.", + "LOGIC_BOOLEAN_TRUE": "wahr", + "LOGIC_BOOLEAN_FALSE": "unwahr", + "LOGIC_BOOLEAN_TOOLTIP": "Ist entweder wahr oder unwahr", + "LOGIC_NULL_HELPURL": "https://de.wikipedia.org/wiki/Nullwert", + "LOGIC_NULL": "null", + "LOGIC_NULL_TOOLTIP": "Ist \"null\".", + "LOGIC_TERNARY_HELPURL": "https://de.wikipedia.org/wiki/%3F:#Auswahloperator", + "LOGIC_TERNARY_CONDITION": "prüfe", + "LOGIC_TERNARY_IF_TRUE": "falls wahr", + "LOGIC_TERNARY_IF_FALSE": "falls unwahr", + "LOGIC_TERNARY_TOOLTIP": "Überprüft eine Bedingung \"prüfe\". Falls die Bedingung wahr ist, wird der \"falls wahr\" Wert zurückgegeben, andernfalls der \"falls unwahr\" Wert", + "MATH_NUMBER_HELPURL": "https://de.wikipedia.org/wiki/Zahl", + "MATH_NUMBER_TOOLTIP": "Eine Zahl.", + "MATH_ARITHMETIC_HELPURL": "https://de.wikipedia.org/wiki/Grundrechenart", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Ist die Summe zweier Zahlen.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Ist die Differenz zweier Zahlen.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Ist das Produkt zweier Zahlen.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Ist der Quotient zweier Zahlen.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Ist die erste Zahl potenziert mit der zweiten Zahl.", + "MATH_SINGLE_HELPURL": "https://de.wikipedia.org/wiki/Quadratwurzel", + "MATH_SINGLE_OP_ROOT": "Quadratwurzel", + "MATH_SINGLE_TOOLTIP_ROOT": "Ist die Quadratwurzel einer Zahl.", + "MATH_SINGLE_OP_ABSOLUTE": "Betrag", + "MATH_SINGLE_TOOLTIP_ABS": "Ist der Betrag einer Zahl.", + "MATH_SINGLE_TOOLTIP_NEG": "Negiert eine Zahl.", + "MATH_SINGLE_TOOLTIP_LN": "Ist der natürliche Logarithmus einer Zahl.", + "MATH_SINGLE_TOOLTIP_LOG10": "Ist der dekadische Logarithmus einer Zahl.", + "MATH_SINGLE_TOOLTIP_EXP": "Ist Wert der Exponentialfunktion einer Zahl.", + "MATH_SINGLE_TOOLTIP_POW10": "Rechnet 10 hoch eine Zahl.", + "MATH_TRIG_HELPURL": "https://de.wikipedia.org/wiki/Trigonometrie", + "MATH_TRIG_TOOLTIP_SIN": "Ist der Sinus des Winkels.", + "MATH_TRIG_TOOLTIP_COS": "Ist der Kosinus des Winkels.", + "MATH_TRIG_TOOLTIP_TAN": "Ist der Tangens des Winkels.", + "MATH_TRIG_TOOLTIP_ASIN": "Ist der Arkussinus des Eingabewertes.", + "MATH_TRIG_TOOLTIP_ACOS": "Ist der Arkuskosinus des Eingabewertes.", + "MATH_TRIG_TOOLTIP_ATAN": "Ist der Arkustangens des Eingabewertes.", + "MATH_CONSTANT_HELPURL": "https://de.wikipedia.org/wiki/Mathematische_Konstante", + "MATH_CONSTANT_TOOLTIP": "Mathematische Konstanten wie: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) oder ∞ (unendlich).", + "MATH_IS_EVEN": "ist gerade", + "MATH_IS_ODD": "ist ungerade", + "MATH_IS_PRIME": "ist eine Primzahl", + "MATH_IS_WHOLE": "ist eine ganze Zahl", + "MATH_IS_POSITIVE": "ist positiv", + "MATH_IS_NEGATIVE": "ist negativ", + "MATH_IS_DIVISIBLE_BY": "ist teilbar durch", + "MATH_IS_TOOLTIP": "Überprüft ob eine Zahl gerade, ungerade, eine Primzahl, ganzzahlig, positiv, negativ oder durch eine zweite Zahl teilbar ist. Gibt wahr oder unwahr zurück.", + "MATH_CHANGE_HELPURL": "https://de.wikipedia.org/wiki/Inkrement_und_Dekrement", + "MATH_CHANGE_TITLE": "erhöhe %1 um %2", + "MATH_CHANGE_TOOLTIP": "Addiert eine Zahl zu \"%1\".", + "MATH_ROUND_HELPURL": "https://de.wikipedia.org/wiki/Runden", + "MATH_ROUND_TOOLTIP": "Eine Zahl auf- oder abrunden.", + "MATH_ROUND_OPERATOR_ROUND": "runde", + "MATH_ROUND_OPERATOR_ROUNDUP": "runde auf", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "runde ab", + "MATH_ONLIST_HELPURL": "http://www.sysplus.ch/einstieg.php?links=menu&seite=4125&grad=Crash&prog=Excel", + "MATH_ONLIST_OPERATOR_SUM": "Summe über die Liste", + "MATH_ONLIST_TOOLTIP_SUM": "Ist die Summe aller Zahlen in einer Liste.", + "MATH_ONLIST_OPERATOR_MIN": "Minimalwert der Liste", + "MATH_ONLIST_TOOLTIP_MIN": "Ist die kleinste Zahl in einer Liste.", + "MATH_ONLIST_OPERATOR_MAX": "Maximalwert der Liste", + "MATH_ONLIST_TOOLTIP_MAX": "Ist die größte Zahl in einer Liste.", + "MATH_ONLIST_OPERATOR_AVERAGE": "Mittelwert der Liste", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Ist der Durchschnittswert aller Zahlen in einer Liste.", + "MATH_ONLIST_OPERATOR_MEDIAN": "Median der Liste", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Ist der Median aller Zahlen in einer Liste.", + "MATH_ONLIST_OPERATOR_MODE": "am häufigsten in der Liste", + "MATH_ONLIST_TOOLTIP_MODE": "Findet die Werte mit dem häufigstem Vorkommen in der Liste.", + "MATH_ONLIST_OPERATOR_STD_DEV": "Standardabweichung der Liste", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Ist die Standardabweichung aller Werte in der Liste.", + "MATH_ONLIST_OPERATOR_RANDOM": "Zufallswert aus der Liste", + "MATH_ONLIST_TOOLTIP_RANDOM": "Gibt einen zufälligen Wert aus der Liste zurück.", + "MATH_MODULO_HELPURL": "https://de.wikipedia.org/wiki/Modulo", + "MATH_MODULO_TITLE": "Rest von %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Der Rest nach einer Division.", + "MATH_CONSTRAIN_TITLE": "begrenze %1 zwischen %2 und %3", + "MATH_CONSTRAIN_TOOLTIP": "Begrenzt eine Zahl auf den Wertebereich zwischen zwei anderen Zahlen (inklusiv).", + "MATH_RANDOM_INT_HELPURL": "https://de.wikipedia.org/wiki/Zufallszahlen", + "MATH_RANDOM_INT_TITLE": "ganzzahlige Zufallszahl zwischen %1 und %2", + "MATH_RANDOM_INT_TOOLTIP": "Erzeugt eine ganzzahlige Zufallszahl zwischen zwei Zahlen (inklusiv).", + "MATH_RANDOM_FLOAT_HELPURL": "https://de.wikipedia.org/wiki/Zufallszahlen", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "Zufallszahl (0.0 - 1.0)", + "MATH_RANDOM_FLOAT_TOOLTIP": "Erzeugt eine Zufallszahl zwischen 0.0 (inklusiv) und 1.0 (exklusiv).", + "TEXT_TEXT_HELPURL": "https://de.wikipedia.org/wiki/Zeichenkette", + "TEXT_TEXT_TOOLTIP": "Ein Buchstabe, Text oder Satz.", + "TEXT_JOIN_HELPURL": "", + "TEXT_JOIN_TITLE_CREATEWITH": "erstelle Text aus", + "TEXT_JOIN_TOOLTIP": "Erstellt einen Text durch das Verbinden von mehreren Textelementen.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "verbinden", + "TEXT_CREATE_JOIN_TOOLTIP": "Hinzufügen, entfernen und sortieren von Elementen.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Ein Element zum Text hinzufügen.", + "TEXT_APPEND_TO": "an", + "TEXT_APPEND_APPENDTEXT": "Text anhängen", + "TEXT_APPEND_TOOLTIP": "Text an die Variable \"%1\" anhängen.", + "TEXT_LENGTH_TITLE": "Länge von %1", + "TEXT_LENGTH_TOOLTIP": "Die Anzahl von Zeichen in einem Text (inkl. Leerzeichen).", + "TEXT_ISEMPTY_TITLE": "%1 ist leer", + "TEXT_ISEMPTY_TOOLTIP": "Ist wahr, falls der Text keine Zeichen enthält ist.", + "TEXT_INDEXOF_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", + "TEXT_INDEXOF_TOOLTIP": "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs zurück oder %1 falls der Suchbegriff nicht gefunden wurde.", + "TEXT_INDEXOF_INPUT_INTEXT": "im Text", + "TEXT_INDEXOF_OPERATOR_FIRST": "suche erstes Auftreten des Begriffs", + "TEXT_INDEXOF_OPERATOR_LAST": "suche letztes Auftreten des Begriffs", + "TEXT_INDEXOF_TAIL": "", + "TEXT_CHARAT_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", + "TEXT_CHARAT_INPUT_INTEXT": "vom Text", + "TEXT_CHARAT_FROM_START": "nimm", + "TEXT_CHARAT_FROM_END": "nimm von hinten", + "TEXT_CHARAT_FIRST": "nimm ersten", + "TEXT_CHARAT_LAST": "nimm letzten", + "TEXT_CHARAT_RANDOM": "nimm zufälligen", + "TEXT_CHARAT_TAIL": "Buchstaben", + "TEXT_CHARAT_TOOLTIP": "Extrahiert einen Buchstaben von einer bestimmten Position.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Gibt den angegebenen Textabschnitt zurück.", + "TEXT_GET_SUBSTRING_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "im Text", + "TEXT_GET_SUBSTRING_START_FROM_START": "nimm Teil ab", + "TEXT_GET_SUBSTRING_START_FROM_END": "nimm Teil ab von hinten", + "TEXT_GET_SUBSTRING_START_FIRST": "nimm Teil ab erster", + "TEXT_GET_SUBSTRING_END_FROM_START": "bis", + "TEXT_GET_SUBSTRING_END_FROM_END": "bis von hinten", + "TEXT_GET_SUBSTRING_END_LAST": "bis letzter", + "TEXT_GET_SUBSTRING_TAIL": "Buchstabe", + "TEXT_CHANGECASE_TOOLTIP": "Wandelt Schreibweise von Texten um, in Großbuchstaben, Kleinbuchstaben oder den ersten Buchstaben jedes Wortes groß und die anderen klein.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "wandel um in GROSSBUCHSTABEN", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "wandel um in kleinbuchstaben", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "wandel um in Substantive", + "TEXT_TRIM_TOOLTIP": "Entfernt Leerzeichen vom Anfang und / oder Ende eines Textes.", + "TEXT_TRIM_OPERATOR_BOTH": "entferne Leerzeichen vom Anfang und vom Ende (links und rechts)", + "TEXT_TRIM_OPERATOR_LEFT": "entferne Leerzeichen vom Anfang (links)", + "TEXT_TRIM_OPERATOR_RIGHT": "entferne Leerzeichen vom Ende (rechts)", + "TEXT_PRINT_TITLE": "gib aus %1", + "TEXT_PRINT_TOOLTIP": "Gibt den Text aus.", + "TEXT_PROMPT_TYPE_TEXT": "frage nach Text mit Hinweis", + "TEXT_PROMPT_TYPE_NUMBER": "frage nach Zahl mit Hinweis", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Fragt den Benutzer nach einer Zahl.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Fragt den Benutzer nach einem Text.", + "TEXT_COUNT_MESSAGE0": "zähle %1 in %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Zähle, wie oft ein Text innerhalb eines anderen Textes vorkommt.", + "TEXT_REPLACE_MESSAGE0": "ersetze %1 durch %2 in %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Ersetze alle Vorkommen eines Textes innerhalb eines anderen Textes.", + "TEXT_REVERSE_MESSAGE0": "kehre %1 um", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Kehre die Reihenfolge der Zeichen im Text um.", + "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", + "LISTS_CREATE_EMPTY_TITLE": "erzeuge eine leere Liste", + "LISTS_CREATE_EMPTY_TOOLTIP": "Erzeugt eine leere Liste ohne Inhalt.", + "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", + "LISTS_CREATE_WITH_TOOLTIP": "Erzeugt eine Liste aus den angegebenen Elementen.", + "LISTS_CREATE_WITH_INPUT_WITH": "erzeuge Liste mit", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "Liste", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Hinzufügen, entfernen und sortieren von Elementen.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Ein Element zur Liste hinzufügen.", + "LISTS_REPEAT_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", + "LISTS_REPEAT_TOOLTIP": "Erzeugt eine Liste mit einer variablen Anzahl von Elementen", + "LISTS_REPEAT_TITLE": "erzeuge Liste mit %2 mal dem Element %1​", + "LISTS_LENGTH_TITLE": "Länge von %1", + "LISTS_LENGTH_TOOLTIP": "Die Anzahl von Elementen in der Liste.", + "LISTS_ISEMPTY_TITLE": "%1 ist leer", + "LISTS_ISEMPTY_TOOLTIP": "Ist wahr, falls die Liste leer ist.", + "LISTS_INLIST": "in der Liste", + "LISTS_INDEX_OF_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", + "LISTS_INDEX_OF_FIRST": "suche erstes Auftreten von", + "LISTS_INDEX_OF_LAST": "suche letztes Auftreten von", + "LISTS_INDEX_OF_TOOLTIP": "Sucht die Position (Index) eines Elementes in der Liste. Gibt %1 zurück, falls kein Element gefunden wurde.", + "LISTS_GET_INDEX_GET": "nimm", + "LISTS_GET_INDEX_GET_REMOVE": "nimm und entferne", + "LISTS_GET_INDEX_REMOVE": "entferne", + "LISTS_GET_INDEX_FROM_START": "", + "LISTS_GET_INDEX_FROM_END": "von hinten", + "LISTS_GET_INDEX_FIRST": "erstes", + "LISTS_GET_INDEX_LAST": "letztes", + "LISTS_GET_INDEX_RANDOM": "zufälliges", + "LISTS_GET_INDEX_TAIL": "Element", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 ist das erste Element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 ist das letzte Element.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Extrahiert das Element an der angegebenen Position in der Liste.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Extrahiert das erste Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Extrahiert das letzte Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Extrahiert ein zufälliges Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Extrahiert und entfernt das Element an der angegebenen Position aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Extrahiert und entfernt das erste Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Extrahiert und entfernt das letzte Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Extrahiert und entfernt ein zufälliges Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Entfernt das Element an der angegebenen Position aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Entfernt das erste Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Entfernt das letzte Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Entfernt ein zufälliges Element aus der Liste.", + "LISTS_SET_INDEX_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", + "LISTS_SET_INDEX_SET": "setze für", + "LISTS_SET_INDEX_INSERT": "füge als", + "LISTS_SET_INDEX_INPUT_TO": "ein", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Setzt das Element an der angegebenen Position in der Liste.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Setzt das erste Element in der Liste.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Setzt das letzte Element in die Liste.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Setzt ein zufälliges Element in der Liste.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Fügt das Element an der angegebenen Position in die Liste ein.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Fügt das Element an den Anfang der Liste an.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Fügt das Element ans Ende der Liste an.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Fügt das Element zufällig in die Liste ein.", + "LISTS_GET_SUBLIST_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", + "LISTS_GET_SUBLIST_START_FROM_START": "nimm Teilliste ab", + "LISTS_GET_SUBLIST_START_FROM_END": "nimm Teilliste ab von hinten", + "LISTS_GET_SUBLIST_START_FIRST": "nimm Teilliste ab erstes", + "LISTS_GET_SUBLIST_END_FROM_START": "bis", + "LISTS_GET_SUBLIST_END_FROM_END": "bis von hinten", + "LISTS_GET_SUBLIST_END_LAST": "bis letztes", + "LISTS_GET_SUBLIST_TAIL": "Element", + "LISTS_GET_SUBLIST_TOOLTIP": "Erstellt eine Kopie mit dem angegebenen Abschnitt der Liste.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "%1 %2 %3 sortieren", + "LISTS_SORT_TOOLTIP": "Eine Kopie einer Liste sortieren.", + "LISTS_SORT_ORDER_ASCENDING": "aufsteigend", + "LISTS_SORT_ORDER_DESCENDING": "absteigend", + "LISTS_SORT_TYPE_NUMERIC": "numerisch", + "LISTS_SORT_TYPE_TEXT": "alphabetisch", + "LISTS_SORT_TYPE_IGNORECASE": "alphabetisch, Großschreibung ignorieren", + "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", + "LISTS_SPLIT_LIST_FROM_TEXT": "Liste aus Text erstellen", + "LISTS_SPLIT_TEXT_FROM_LIST": "Text aus Liste erstellen", + "LISTS_SPLIT_WITH_DELIMITER": "mit Trennzeichen", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Text in eine Liste mit Texten aufteilen, unterbrochen bei jedem Trennzeichen.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Liste mit Texten in einen Text vereinen, getrennt durch ein Trennzeichen.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "kehre %1 um", + "LISTS_REVERSE_TOOLTIP": "Kehre eine Kopie einer Liste um.", + "ORDINAL_NUMBER_SUFFIX": ".", + "VARIABLES_GET_HELPURL": "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29", + "VARIABLES_GET_TOOLTIP": "Gibt den Wert der Variable zurück.", + "VARIABLES_GET_CREATE_SET": "Erzeuge \"Schreibe %1\"", + "VARIABLES_SET_HELPURL": "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29", + "VARIABLES_SET": "setze %1 auf %2", + "VARIABLES_SET_TOOLTIP": "Setzt den Wert einer Variable.", + "VARIABLES_SET_CREATE_GET": "Erzeuge \"Lese %1\"", + "PROCEDURES_DEFNORETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", + "PROCEDURES_DEFNORETURN_TITLE": "", + "PROCEDURES_DEFNORETURN_PROCEDURE": "etwas tun", + "PROCEDURES_BEFORE_PARAMS": "mit:", + "PROCEDURES_CALL_BEFORE_PARAMS": "mit:", + "PROCEDURES_DEFNORETURN_DO": "", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Ein Funktionsblock ohne Rückgabewert.", + "PROCEDURES_DEFNORETURN_COMMENT": "Beschreibe diese Funktion …", + "PROCEDURES_DEFRETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", + "PROCEDURES_DEFRETURN_RETURN": "gib zurück", + "PROCEDURES_DEFRETURN_TOOLTIP": "Ein Funktionsblock mit Rückgabewert.", + "PROCEDURES_ALLOW_STATEMENTS": "Anweisungen erlauben", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Warnung: Dieser Funktionsblock hat zwei gleich benannte Parameter.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://de.wikipedia.org/wiki/Unterprogramm", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Rufe einen Funktionsblock ohne Rückgabewert auf.", + "PROCEDURES_CALLRETURN_HELPURL": "https://de.wikipedia.org/wiki/Unterprogramm", + "PROCEDURES_CALLRETURN_TOOLTIP": "Rufe einen Funktionsblock mit Rückgabewert auf.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "Parameter", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Die Eingaben zu dieser Funktion hinzufügen, entfernen oder neu anordnen.", + "PROCEDURES_MUTATORARG_TITLE": "Variable:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Eine Eingabe zur Funktion hinzufügen.", + "PROCEDURES_HIGHLIGHT_DEF": "Markiere Funktionsblock", + "PROCEDURES_CREATE_DO": "Erzeuge \"Aufruf %1\"", + "PROCEDURES_IFRETURN_TOOLTIP": "Gibt den zweiten Wert zurück und verlässt die Funktion, falls der erste Wert wahr ist.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Warnung: Dieser Block darf nur innerhalb eines Funktionsblocks genutzt werden." +} diff --git a/src/opsoro/server/static/js/blockly/msg/json/diq.json b/src/opsoro/server/static/js/blockly/msg/json/diq.json new file mode 100644 index 0000000..56d32cd --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/diq.json @@ -0,0 +1,185 @@ +{ + "@metadata": { + "authors": [ + "Kumkumuk", + "Marmase", + "Mirzali", + "Gırd" + ] + }, + "VARIABLES_DEFAULT_NAME": "unsur", + "TODAY": "Ewro", + "DUPLICATE_BLOCK": "Zewnc", + "ADD_COMMENT": "Tefsir cı ke", + "REMOVE_COMMENT": "Tefsiri Wedare", + "EXTERNAL_INPUTS": "Cıkewtışê xarıciy", + "INLINE_INPUTS": "Cıkerdışê xomiyani", + "DELETE_BLOCK": "Bloki bestere", + "DELETE_X_BLOCKS": "%1 blokan bestere", + "DELETE_ALL_BLOCKS": "Pêro %1 bloki besteriyê?", + "CLEAN_UP": "Blokan pak ke", + "COLLAPSE_BLOCK": "Bloki teng ke", + "COLLAPSE_ALL": "Blokan teng ke", + "EXPAND_BLOCK": "Bloki hera ke", + "EXPAND_ALL": "Blokan hera ke", + "DISABLE_BLOCK": "Çengi devre ra vec", + "ENABLE_BLOCK": "Bloki feal ke", + "HELP": "Peşti", + "UNDO": "Peyser biya", + "REDO": "Newe ke", + "CHANGE_VALUE_TITLE": "Erci bıvurne:", + "RENAME_VARIABLE": "Vuriyayey fına name ke...", + "RENAME_VARIABLE_TITLE": "Pêro vırnayışê '%1' reyna name ke:", + "NEW_VARIABLE": "Vuriyayeyo bıvıraz...", + "NEW_VARIABLE_TITLE": "Namey vuriyayeyê newi:", + "VARIABLE_ALREADY_EXISTS": "Yew vırnayış be namey '%1' xora est.", + "DELETE_VARIABLE_CONFIRMATION": "%1 ke vırnayışê '%2'i gırweneno, besteriyo?", + "DELETE_VARIABLE": "Şıma vırnaoğê '%1'i besterê", + "COLOUR_PICKER_HELPURL": "https://diq.wikipedia.org/wiki/Reng", + "COLOUR_PICKER_TOOLTIP": "Şıma palet ra yew reng weçinê.", + "COLOUR_RANDOM_TITLE": "rengo rastameye", + "COLOUR_RANDOM_TOOLTIP": "Tesadufi yu ren bıweçin", + "COLOUR_RGB_TITLE": "komponentên rengan", + "COLOUR_RGB_RED": "sur", + "COLOUR_RGB_GREEN": "kıho", + "COLOUR_RGB_BLUE": "kewe", + "COLOUR_RGB_TOOLTIP": "Şıma renganê sûr, aşıl u kohoy ra rengê do spesifik vırazê. Gani ê pêro 0 u 100 miyan de bıbê.", + "COLOUR_BLEND_TITLE": "tewde", + "COLOUR_BLEND_COLOUR1": "reng 1", + "COLOUR_BLEND_COLOUR2": "reng 2", + "COLOUR_BLEND_RATIO": "nısbet", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "%1 fıni tekrar ke", + "CONTROLS_REPEAT_INPUT_DO": "bıke", + "CONTROLS_REPEAT_TOOLTIP": "Şıma tayêna reyi akerdışi kerê.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "Tekrar kerdış de", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "hend tekrar ke", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Yew erc raşto se yu beyanat bıd.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Yew erc xırabo se tay beyanati bıd", + "CONTROLS_FOREACH_TITLE": "Lista %2 de her item %1 rê", + "CONTROLS_FOREACH_TOOLTIP": "Yew lista de her item rê, varyansê '%1' itemi rê vırazê, u dıma tayê akerdışi (beyani) bıdê", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "Çerxen ra vec", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "Gama bin da çerxeni ra dewam ke", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Öujtewada çerxeni ra bıvıci", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Diqat: No bloke şeno teyna yew çerxiyayış miyan de bıgırweyo.", + "CONTROLS_IF_TOOLTIP_1": "Eger yew vaye raşto, o taw şıma tayê akerdışi kerê.", + "CONTROLS_IF_MSG_IF": "se", + "CONTROLS_IF_MSG_ELSEIF": "niyose", + "CONTROLS_IF_MSG_ELSE": "çıniyose", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Bloq da if'i rê yu şert dekerê de.", + "LOGIC_OPERATION_TOOLTIP_AND": "Eger her dı cıkewtışi zi raştê, şıma ageyrê.", + "LOGIC_OPERATION_AND": "û", + "LOGIC_OPERATION_OR": "ya zi", + "LOGIC_NEGATE_TITLE": "%1 niyo", + "LOGIC_BOOLEAN_TRUE": "raşt", + "LOGIC_BOOLEAN_FALSE": "ğelet", + "LOGIC_BOOLEAN_TOOLTIP": "Raşt yana çep erc dano", + "LOGIC_NULL": "veng", + "LOGIC_NULL_TOOLTIP": "Veng çarneno ra.", + "LOGIC_TERNARY_CONDITION": "test", + "LOGIC_TERNARY_IF_TRUE": "eke raşto", + "LOGIC_TERNARY_IF_FALSE": "eke ğeleto", + "LOGIC_TERNARY_TOOLTIP": "Şerta'test'i test keno. Eger ke şert raşta se erca 'raşt'i çarneno, çepo se erca 'çep' çarneno.", + "MATH_NUMBER_HELPURL": "https://diq.wikipedia.org/wiki/Numre", + "MATH_NUMBER_TOOLTIP": "Yew numre.", + "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Aritmetik", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_OP_ROOT": "karekok", + "MATH_SINGLE_OP_ABSOLUTE": "mutlaq", + "MATH_SINGLE_TOOLTIP_NEG": "Ena amorer nêravêrde deyne çerx ke.", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "Heryen sabitan ra yewi çerx ke:π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (bêsonp).", + "MATH_IS_EVEN": "zewnco", + "MATH_IS_ODD": "kıto", + "MATH_IS_PRIME": "bıngehên", + "MATH_IS_WHOLE": "tamo", + "MATH_IS_POSITIVE": "pozitifo", + "MATH_IS_NEGATIVE": "negatifo", + "MATH_IS_DIVISIBLE_BY": "Leteyêno", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "%2, keno %1 vurneno", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Yu amorer loğê cêri yana cori ke", + "MATH_ROUND_OPERATOR_ROUND": "gılor ke", + "MATH_ROUND_OPERATOR_ROUNDUP": "Loğê cori ke", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "Loğê cêri ke", + "MATH_ONLIST_OPERATOR_SUM": "koma liste", + "MATH_ONLIST_OPERATOR_MIN": "Tewr qıcê lista", + "MATH_ONLIST_OPERATOR_MAX": "Tewr gırdê lista", + "MATH_ONLIST_OPERATOR_AVERAGE": "Averacê lista", + "MATH_ONLIST_OPERATOR_MEDIAN": "Wertey lista", + "MATH_ONLIST_OPERATOR_MODE": "listey modi", + "MATH_ONLIST_OPERATOR_RANDOM": "Raştamaye objeya lista", + "MATH_ONLIST_TOOLTIP_RANDOM": "Liste ra raştamaye yew elementi çerx ke", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "%1 ÷ %2 ra menden", + "MATH_MODULO_TOOLTIP": "Dı amoran ra amora menden çerx ke", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "Raştamaye nimande amor", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Yu herfa, satır yana çekuya metini", + "TEXT_JOIN_TITLE_CREATEWITH": "ya metin vıraz", + "TEXT_CREATE_JOIN_TITLE_JOIN": "gıre de", + "TEXT_APPEND_TO": "rê", + "TEXT_APPEND_APPENDTEXT": "Metin dek", + "TEXT_ISEMPTY_TITLE": "%1 vengo", + "TEXT_INDEXOF_INPUT_INTEXT": "metın de", + "TEXT_CHARAT_INPUT_INTEXT": "metın de", + "TEXT_CHARAT_FROM_START": "Herfa # bıgi", + "TEXT_CHARAT_FROM_END": "# ra tepya herfan bıgi", + "TEXT_CHARAT_FIRST": "Herfa sıfti bıgi", + "TEXT_CHARAT_LAST": "Herfa peyên bıgi", + "TEXT_CHARAT_RANDOM": "Raştamaye yu herf bıgi", + "TEXT_CHARAT_TOOLTIP": "Şınasnaye pozisyon de yu herfer çerğ keno", + "TEXT_GET_SUBSTRING_TOOLTIP": "Tay letey metini çerğ keno", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "metın de", + "TEXT_GET_SUBSTRING_START_FROM_START": "# ra substring gêno", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "HERFANÊ GIRDANA", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "Herfanê werdiyana", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "Ser herf gırd", + "LISTS_CREATE_EMPTY_TITLE": "lista venge vıraze", + "LISTS_CREATE_WITH_INPUT_WITH": "Liste ya vıraz", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "liste", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Yew nesne dekerê lista miyan", + "LISTS_LENGTH_TOOLTIP": "Derganiya yu lister dano.", + "LISTS_ISEMPTY_TITLE": "%1 vengo", + "LISTS_ISEMPTY_TOOLTIP": "Eger kı lista venga se raşt keno çerğ", + "LISTS_INLIST": "lista de", + "LISTS_INDEX_OF_FIRST": "Sıfte bıyayena cay obcey bıvin", + "LISTS_GET_INDEX_GET": "bıgê", + "LISTS_GET_INDEX_GET_REMOVE": "Bıgi u wedarne", + "LISTS_GET_INDEX_REMOVE": "wedare", + "LISTS_GET_INDEX_FROM_END": "# peyniye ra", + "LISTS_GET_INDEX_FIRST": "verên", + "LISTS_GET_INDEX_LAST": "peyên", + "LISTS_GET_INDEX_RANDOM": "raştameye", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 objeyo sıfteyên o", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 objeyo peyên o", + "LISTS_SET_INDEX_SET": "ca ke", + "LISTS_SET_INDEX_INSERT": "De fi", + "LISTS_SET_INDEX_INPUT_TO": "zey", + "LISTS_GET_SUBLIST_END_FROM_START": "#'ya", + "LISTS_GET_SUBLIST_END_FROM_END": "Peyni # ra hetana", + "LISTS_GET_SUBLIST_END_LAST": "Hetana pey", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "Kılm %1 %2 %3", + "LISTS_SORT_ORDER_ASCENDING": "zeydıyen", + "LISTS_SORT_ORDER_DESCENDING": "Kemeyen", + "LISTS_SORT_TYPE_NUMERIC": "Amoriyal", + "LISTS_SORT_TYPE_TEXT": "Alfabetik", + "LISTS_SPLIT_WITH_DELIMITER": "Hududoxi ya", + "VARIABLES_SET_CREATE_GET": "'get %1' vıraz", + "PROCEDURES_DEFNORETURN_TITLE": "rê", + "PROCEDURES_DEFNORETURN_PROCEDURE": "Çıyê bık", + "PROCEDURES_BEFORE_PARAMS": "ebe:", + "PROCEDURES_CALL_BEFORE_PARAMS": "ebe:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Yew fonksiyono çap nêdate vırazeno", + "PROCEDURES_DEFNORETURN_COMMENT": "Nê fonksiyoni beyan ke...", + "PROCEDURES_DEFRETURN_RETURN": "peyser biya", + "PROCEDURES_DEFRETURN_TOOLTIP": "Yew fonksiyono çap daye vırazeno", + "PROCEDURES_ALLOW_STATEMENTS": "Çıyan rê mısafe bıd", + "PROCEDURES_MUTATORCONTAINER_TITLE": "cıkewtışi", + "PROCEDURES_MUTATORARG_TITLE": "namey cıkewtışi:", + "PROCEDURES_CREATE_DO": "'%1' vıraze" +} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/el.json b/src/opsoro/server/static/js/blockly/msg/json/el.json similarity index 91% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/el.json rename to src/opsoro/server/static/js/blockly/msg/json/el.json index 8bb1b48..b520776 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/el.json +++ b/src/opsoro/server/static/js/blockly/msg/json/el.json @@ -8,18 +8,22 @@ "Sfyrakis", "Glavkos", "Gchr", - "아라" + "아라", + "Geraki", + "Ανώνυμος Βικιπαιδιστής", + "GR" ] }, "VARIABLES_DEFAULT_NAME": "αντικείμενο", "TODAY": "Σήμερα", - "DUPLICATE_BLOCK": "Αντίγραφο", - "ADD_COMMENT": "Πρόσθεσε Σχόλιο", + "DUPLICATE_BLOCK": "Διπλότυπο", + "ADD_COMMENT": "Πρόσθεσε Το Σχόλιο", "REMOVE_COMMENT": "Αφαίρεσε Το Σχόλιο", "EXTERNAL_INPUTS": "Εξωτερικές Είσοδοι", "INLINE_INPUTS": "Εσωτερικές Είσοδοι", "DELETE_BLOCK": "Διέγραψε Το Μπλοκ", "DELETE_X_BLOCKS": "Διέγραψε %1 Μπλοκ", + "DELETE_ALL_BLOCKS": "Να διαγραφούν και τα %1 μπλοκ?", "COLLAPSE_BLOCK": "Σύμπτυξε Το Μπλοκ", "COLLAPSE_ALL": "Σύμπτυξτε Όλα Τα Μπλοκ", "EXPAND_BLOCK": "Επέκτεινε Το Μπλοκ", @@ -27,14 +31,13 @@ "DISABLE_BLOCK": "Απενεργοποίησε Το Μπλοκ", "ENABLE_BLOCK": "Ενεργοποίησε Το Μπλοκ", "HELP": "Βοήθεια", - "CHAT": "Μπορείς να μιλήσεις με τον συνεργάτη σου πληκτρολογώντας σ'αυτό το πλαίσιο!", - "AUTH": "Παρακαλώ κάνε έγκριση της εφαρμογής για να επιτρέπεται η αποθήκευση και κοινοποίηση της εργασίας σου.", - "ME": "Εγώ", + "UNDO": "Αναίρεση", + "REDO": "Ακύρωση αναίρεσης", "CHANGE_VALUE_TITLE": "Άλλαξε την τιμή:", - "NEW_VARIABLE": "Νέα μεταβλητή...", - "NEW_VARIABLE_TITLE": "Νέο όνομα μεταβλητής:", "RENAME_VARIABLE": "Μετονόμασε τη μεταβλητή...", "RENAME_VARIABLE_TITLE": "Μετονόμασε όλες τις μεταβλητές «%1» σε:", + "NEW_VARIABLE": "Νέα μεταβλητή...", + "NEW_VARIABLE_TITLE": "Νέο όνομα μεταβλητής:", "COLOUR_PICKER_HELPURL": "https://el.wikipedia.org/wiki/%CE%A7%CF%81%CF%8E%CE%BC%CE%B1", "COLOUR_PICKER_TOOLTIP": "Επιτρέπει επιλογή χρώματος από την παλέτα.", "COLOUR_RANDOM_TITLE": "τυχαίο χρώμα", @@ -198,7 +201,7 @@ "TEXT_LENGTH_TOOLTIP": "Επιστρέφει το πλήθος των γραμμάτων (συμπεριλαμβανομένων και των κενών διαστημάτων) στο παρεχόμενο κείμενο.", "TEXT_ISEMPTY_TITLE": "το %1 είναι κενό", "TEXT_ISEMPTY_TOOLTIP": "Επιστρέφει αληθής αν το παρεχόμενο κείμενο είναι κενό.", - "TEXT_INDEXOF_TOOLTIP": "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του πρώτου κειμένου στο δεύτερο κείμενο. Επιστρέφει τιμή 0, αν δε βρει το κείμενο.", + "TEXT_INDEXOF_TOOLTIP": "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του πρώτου κειμένου στο δεύτερο κείμενο. Επιστρέφει τιμή %1, αν δε βρει το κείμενο.", "TEXT_INDEXOF_INPUT_INTEXT": "στο κείμενο", "TEXT_INDEXOF_OPERATOR_FIRST": "βρες την πρώτη εμφάνιση του κειμένου", "TEXT_INDEXOF_OPERATOR_LAST": "βρες την τελευταία εμφάνιση του κειμένου", @@ -231,6 +234,7 @@ "TEXT_PROMPT_TYPE_NUMBER": "πρότρεψε με μήνυμα για να δοθεί αριθμός", "TEXT_PROMPT_TOOLTIP_NUMBER": "Δημιουργεί προτροπή για τον χρήστη για να δώσει ένα αριθμό.", "TEXT_PROMPT_TOOLTIP_TEXT": "Δημιουργεί προτροπή για το χρήστη για να δώσει κάποιο κείμενο.", + "TEXT_COUNT_TOOLTIP": "Μετρά πόσες φορές κάποιο κείμενο εμφανίζεται μέσα σε ένα άλλο κείμενο.", "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "δημιούργησε κενή λίστα", "LISTS_CREATE_EMPTY_TOOLTIP": "Επιστρέφει μια λίστα, με μήκος 0, η οποία δεν περιέχει εγγραφές δεδομένων", @@ -251,7 +255,7 @@ "LISTS_INDEX_OF_HELPURL": "Blockly", "LISTS_INDEX_OF_FIRST": "βρες την πρώτη εμφάνιση του στοιχείου", "LISTS_INDEX_OF_LAST": "βρες την τελευταία εμφάνιση του στοιχείου", - "LISTS_INDEX_OF_TOOLTIP": "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του στοιχείου στη λίστα. Επιστρέφει τιμή 0, αν το κείμενο δεν βρεθεί.", + "LISTS_INDEX_OF_TOOLTIP": "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του στοιχείου στη λίστα. Επιστρέφει τιμή %1, αν το στοιχείο δεν βρεθεί.", "LISTS_GET_INDEX_GET": "πάρε", "LISTS_GET_INDEX_GET_REMOVE": "πάρε και αφαίρεσε", "LISTS_GET_INDEX_REMOVE": "αφαίρεσε", @@ -260,31 +264,28 @@ "LISTS_GET_INDEX_FIRST": "πρώτο", "LISTS_GET_INDEX_LAST": "τελευταίο", "LISTS_GET_INDEX_RANDOM": "τυχαίο", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το τελευταίο στοιχείο.", + "LISTS_INDEX_FROM_START_TOOLTIP": "Το %1 είναι το πρώτο στοιχείο.", + "LISTS_INDEX_FROM_END_TOOLTIP": "Το %1 είναι το τελευταίο στοιχείο.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Επιστρέφει το πρώτο στοιχείο σε μια λίστα.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Επιστρέφει το τελευταίο στοιχείο σε μια λίστα.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Επιστρέφει ένα τυχαίο στοιχείο σε μια λίστα.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Καταργεί και επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Καταργεί και επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το τελευταίο στοιχείο.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Καταργεί και επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Καταργεί και επιστρέφει το πρώτο στοιχείο σε μια λίστα.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Καταργεί και επιστρέφει το τελευταίο στοιχείο σε μια λίστα.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Καταργεί και επιστρέφει ένα τυχαίο στοιχείο σε μια λίστα.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Καταργεί το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Καταργεί το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το τελευταίο στοιχείο.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Καταργεί το στοιχείο στην καθορισμένη θέση σε μια λίστα.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Καταργεί το πρώτο στοιχείο σε μια λίστα.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Καταργεί το τελευταίο στοιχείο σε μια λίστα.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Καταργεί ένα τυχαίο στοιχείο σε μια λίστα.", "LISTS_SET_INDEX_SET": "όρισε", "LISTS_SET_INDEX_INSERT": "είσαγε στο", "LISTS_SET_INDEX_INPUT_TO": "σε", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Ορίζει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Ορίζει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το τελευταίο στοιχείο.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Ορίζει το στοιχείο στην καθορισμένη θέση σε μια λίστα.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Ορίζει το πρώτο στοιχείο σε μια λίστα.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Ορίζει το τελευταίο στοιχείο σε μια λίστα.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Ορίζει ένα τυχαίο στοιχείο σε μια λίστα.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Εισάγει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Εισάγει το στοιχείο σε συγκεκριμένη θέση σε μια λίστα. Το #1 είναι το τελευταίο στοιχείο.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Εισάγει το στοιχείο στην καθορισμένη θέση σε μια λίστα.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Εισάγει το στοιχείο στην αρχή μιας λίστας.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Αναθέτει το στοιχείο στο τέλος μιας λίστας.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Εισάγει το στοιχείο τυχαία σε μια λίστα.", @@ -296,6 +297,11 @@ "LISTS_GET_SUBLIST_END_FROM_END": "έως # από το τέλος", "LISTS_GET_SUBLIST_END_LAST": "έως το τελευταίο", "LISTS_GET_SUBLIST_TOOLTIP": "Δημιουργεί ένα αντίγραφο του καθορισμένου τμήματος μιας λίστας.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_ORDER_ASCENDING": "Αύξουσα", + "LISTS_SORT_ORDER_DESCENDING": "Φθίνουσα", + "LISTS_SORT_TYPE_NUMERIC": "αριθμητικό", + "LISTS_SORT_TYPE_TEXT": "Αλφαβητικά", "LISTS_SPLIT_LIST_FROM_TEXT": "κάνετε λίστα από το κείμενο", "LISTS_SPLIT_TEXT_FROM_LIST": "κάνετε κείμενο από τη λίστα", "LISTS_SPLIT_WITH_DELIMITER": "με διαχωριστικό", @@ -315,6 +321,7 @@ "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "επέστρεψε", "PROCEDURES_DEFRETURN_TOOLTIP": "Δημιουργεί μια συνάρτηση με μια έξοδο.", + "PROCEDURES_ALLOW_STATEMENTS": "να επιτρέπονται οι δηλώσεις", "PROCEDURES_DEF_DUPLICATE_WARNING": "Προειδοποίηση: Αυτή η συνάρτηση έχει διπλότυπες παραμέτρους.", "PROCEDURES_CALLNORETURN_HELPURL": "https://el.wikipedia.org/wiki/%CE%94%CE%B9%CE%B1%CE%B4%CE%B9%CE%BA%CE%B1%CF%83%CE%AF%CE%B1_%28%CF%85%CF%80%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CF%83%CF%84%CE%AD%CF%82%29", "PROCEDURES_CALLNORETURN_TOOLTIP": "Εκτελεί την ορισμένη από τον χρήστη συνάρτηση «%1».", diff --git a/src/opsoro/server/static/js/blockly/msg/json/en-gb.json b/src/opsoro/server/static/js/blockly/msg/json/en-gb.json new file mode 100644 index 0000000..a6a6621 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/en-gb.json @@ -0,0 +1,139 @@ +{ + "@metadata": { + "authors": [ + "Andibing", + "Codynguyen1116", + "Shirayuki" + ] + }, + "VARIABLES_DEFAULT_NAME": "item", + "TODAY": "Today", + "DUPLICATE_BLOCK": "Duplicate", + "ADD_COMMENT": "Add Comment", + "REMOVE_COMMENT": "Remove Comment", + "EXTERNAL_INPUTS": "External Inputs", + "INLINE_INPUTS": "Inline Inputs", + "DELETE_BLOCK": "Delete Block", + "DELETE_X_BLOCKS": "Delete %1 Blocks", + "DELETE_ALL_BLOCKS": "Delete all %1 blocks?", + "CLEAN_UP": "Clean up Blocks", + "COLLAPSE_BLOCK": "Collapse Block", + "COLLAPSE_ALL": "Collapse Blocks", + "EXPAND_BLOCK": "Expand Block", + "EXPAND_ALL": "Expand Blocks", + "DISABLE_BLOCK": "Disable Block", + "ENABLE_BLOCK": "Enable Block", + "HELP": "Help", + "UNDO": "Undo", + "REDO": "Redo", + "CHANGE_VALUE_TITLE": "Change value:", + "RENAME_VARIABLE": "Rename variable...", + "RENAME_VARIABLE_TITLE": "Rename all '%1' variables to:", + "NEW_VARIABLE": "New variable...", + "NEW_VARIABLE_TITLE": "New variable name:", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Colour", + "COLOUR_PICKER_TOOLTIP": "Choose a colour from the palette.", + "COLOUR_RANDOM_TITLE": "random colour", + "COLOUR_RANDOM_TOOLTIP": "Choose a colour at random.", + "COLOUR_RGB_TITLE": "colour with", + "COLOUR_RGB_RED": "red", + "COLOUR_RGB_GREEN": "green", + "COLOUR_RGB_BLUE": "blue", + "COLOUR_RGB_TOOLTIP": "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100.", + "COLOUR_BLEND_TITLE": "blend", + "COLOUR_BLEND_COLOUR1": "colour 1", + "COLOUR_BLEND_COLOUR2": "colour 2", + "COLOUR_BLEND_RATIO": "ratio", + "COLOUR_BLEND_TOOLTIP": "Blends two colours together with a given ratio (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "repeat %1 times", + "CONTROLS_REPEAT_INPUT_DO": "do", + "CONTROLS_REPEAT_TOOLTIP": "Do some statements several times.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repeat while", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "repeat until", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "While a value is true, then do some statements.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "While a value is false, then do some statements.", + "CONTROLS_FOR_TOOLTIP": "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks.", + "CONTROLS_FOR_TITLE": "count with %1 from %2 to %3 by %4", + "CONTROLS_FOREACH_TITLE": "for each item %1 in list %2", + "CONTROLS_FOREACH_TOOLTIP": "For each item in a list, set the variable '%1' to the item, and then do some statements.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "break out of loop", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "continue with next iteration of loop", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Break out of the containing loop.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Skip the rest of this loop, and continue with the next iteration.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Warning: This block may only be used within a loop.", + "CONTROLS_IF_TOOLTIP_1": "If a value is true, then do some statements.", + "CONTROLS_IF_TOOLTIP_2": "If a value is true, then do the first block of statements. Otherwise, do the second block of statements.", + "CONTROLS_IF_TOOLTIP_3": "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements.", + "CONTROLS_IF_TOOLTIP_4": "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements.", + "CONTROLS_IF_MSG_IF": "if", + "CONTROLS_IF_MSG_ELSEIF": "else if", + "CONTROLS_IF_MSG_ELSE": "else", + "CONTROLS_IF_IF_TOOLTIP": "Add, remove, or reorder sections to reconfigure this if block.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Add a condition to the if block.", + "CONTROLS_IF_ELSE_TOOLTIP": "Add a final, catch-all condition to the if block.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Return true if both inputs equal each other.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Return true if both inputs are not equal to each other.", + "LOGIC_COMPARE_TOOLTIP_LT": "Return true if the first input is smaller than the second input.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Return true if the first input is smaller than or equal to the second input.", + "LOGIC_COMPARE_TOOLTIP_GT": "Return true if the first input is greater than the second input.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Return true if the first input is greater than or equal to the second input.", + "LOGIC_OPERATION_TOOLTIP_AND": "Return true if both inputs are true.", + "LOGIC_OPERATION_AND": "and", + "LOGIC_OPERATION_TOOLTIP_OR": "Return true if at least one of the inputs is true.", + "LOGIC_OPERATION_OR": "or", + "LOGIC_NEGATE_TITLE": "not %1", + "LOGIC_NEGATE_TOOLTIP": "Returns true if the input is false. Returns false if the input is true.", + "LOGIC_BOOLEAN_TRUE": "true", + "LOGIC_BOOLEAN_FALSE": "false", + "LOGIC_BOOLEAN_TOOLTIP": "Returns either true or false.", + "LOGIC_NULL": "null", + "LOGIC_NULL_TOOLTIP": "Returns null.", + "LOGIC_TERNARY_CONDITION": "test", + "LOGIC_TERNARY_IF_TRUE": "if true", + "LOGIC_TERNARY_IF_FALSE": "if false", + "LOGIC_TERNARY_TOOLTIP": "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value.", + "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", + "MATH_NUMBER_TOOLTIP": "A number.", + "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Return the sum of the two numbers.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Return the difference of the two numbers.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Return the product of the two numbers.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Return the quotient of the two numbers.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Return the first number raised to the power of the second number.", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_OP_ROOT": "square root", + "MATH_SINGLE_TOOLTIP_ROOT": "Return the square root of a number.", + "MATH_SINGLE_OP_ABSOLUTE": "absolute", + "MATH_SINGLE_TOOLTIP_ABS": "Return the absolute value of a number.", + "MATH_SINGLE_TOOLTIP_NEG": "Return the negation of a number.", + "MATH_SINGLE_TOOLTIP_LN": "Return the natural logarithm of a number.", + "MATH_SINGLE_TOOLTIP_LOG10": "Return the base 10 logarithm of a number.", + "MATH_SINGLE_TOOLTIP_EXP": "Return e to the power of a number.", + "MATH_SINGLE_TOOLTIP_POW10": "Return 10 to the power of a number.", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "MATH_TRIG_TOOLTIP_SIN": "Return the sine of a degree (not radian).", + "MATH_TRIG_TOOLTIP_COS": "Return the cosine of a degree (not radian).", + "MATH_TRIG_TOOLTIP_TAN": "Return the tangent of a degree (not radian).", + "MATH_TRIG_TOOLTIP_ASIN": "Return the arcsine of a number.", + "MATH_TRIG_TOOLTIP_ACOS": "Return the arccosine of a number.", + "MATH_TRIG_TOOLTIP_ATAN": "Return the arctangent of a number.", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).", + "MATH_IS_EVEN": "is even", + "MATH_IS_ODD": "is odd", + "MATH_IS_PRIME": "is prime", + "MATH_IS_WHOLE": "is whole", + "MATH_IS_POSITIVE": "is positive", + "MATH_IS_NEGATIVE": "is negative", + "MATH_IS_DIVISIBLE_BY": "is divisible by", + "MATH_IS_TOOLTIP": "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false.", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "change %1 by %2", + "MATH_CHANGE_TOOLTIP": "Add a number to variable '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Round a number up or down.", + "MATH_ROUND_OPERATOR_ROUND": "round", + "LISTS_SORT_ORDER_DESCENDING": "descendente" +} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/en.json b/src/opsoro/server/static/js/blockly/msg/json/en.json similarity index 89% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/en.json rename to src/opsoro/server/static/js/blockly/msg/json/en.json index a57b6fe..89fbaba 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/en.json +++ b/src/opsoro/server/static/js/blockly/msg/json/en.json @@ -1,7 +1,7 @@ { "@metadata": { "author": "Ellen Spertus ", - "lastupdated": "2015-10-09 19:19:49.745918", + "lastupdated": "2017-03-22 09:28:54.332746", "locale": "en", "messagedocumentation" : "qqq" }, @@ -14,6 +14,7 @@ "INLINE_INPUTS": "Inline Inputs", "DELETE_BLOCK": "Delete Block", "DELETE_X_BLOCKS": "Delete %1 Blocks", + "DELETE_ALL_BLOCKS": "Delete all %1 blocks?", "CLEAN_UP": "Clean up Blocks", "COLLAPSE_BLOCK": "Collapse Block", "COLLAPSE_ALL": "Collapse Blocks", @@ -22,14 +23,16 @@ "DISABLE_BLOCK": "Disable Block", "ENABLE_BLOCK": "Enable Block", "HELP": "Help", - "CHAT": "Chat with your collaborator by typing in this box!", - "AUTH": "Please authorize this app to enable your work to be saved and to allow it to be shared by you.", - "ME": "Me", + "UNDO": "Undo", + "REDO": "Redo", "CHANGE_VALUE_TITLE": "Change value:", - "NEW_VARIABLE": "New variable...", - "NEW_VARIABLE_TITLE": "New variable name:", "RENAME_VARIABLE": "Rename variable...", "RENAME_VARIABLE_TITLE": "Rename all '%1' variables to:", + "NEW_VARIABLE": "Create variable...", + "NEW_VARIABLE_TITLE": "New variable name:", + "VARIABLE_ALREADY_EXISTS": "A variable named '%1' already exists.", + "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the '%2' variable?", + "DELETE_VARIABLE": "Delete the '%1' variable", "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Choose a colour from the palette.", "COLOUR_RANDOM_HELPURL": "http://randomcolour.com", @@ -180,7 +183,7 @@ "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "remainder of %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Return the remainder from dividing the two numbers.", - "MATH_CONSTRAIN_HELPURL": "https://en.wikipedia.org/wiki/Clamping_%28graphics%29", + "MATH_CONSTRAIN_HELPURL": "https://en.wikipedia.org/wiki/Clamping_(graphics)", "MATH_CONSTRAIN_TITLE": "constrain %1 low %2 high %3", "MATH_CONSTRAIN_TOOLTIP": "Constrain a number to be between the specified limits (inclusive).", "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", @@ -208,7 +211,7 @@ "TEXT_ISEMPTY_TITLE": "%1 is empty", "TEXT_ISEMPTY_TOOLTIP": "Returns true if the provided text is empty.", "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", - "TEXT_INDEXOF_TOOLTIP": "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found.", + "TEXT_INDEXOF_TOOLTIP": "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found.", "TEXT_INDEXOF_INPUT_INTEXT": "in text", "TEXT_INDEXOF_OPERATOR_FIRST": "find first occurrence of text", "TEXT_INDEXOF_OPERATOR_LAST": "find last occurrence of text", @@ -250,6 +253,15 @@ "TEXT_PROMPT_TYPE_NUMBER": "prompt for number with message", "TEXT_PROMPT_TOOLTIP_NUMBER": "Prompt for user for a number.", "TEXT_PROMPT_TOOLTIP_TEXT": "Prompt for user for some text.", + "TEXT_COUNT_MESSAGE0": "count %1 in %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Count how many times some text occurs within some other text.", + "TEXT_REPLACE_MESSAGE0": "replace %1 with %2 in %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Replace all occurances of some text within some other text.", + "TEXT_REVERSE_MESSAGE0": "reverse %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Reverses the order of the characters in the text.", "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "create empty list", "LISTS_CREATE_EMPTY_TOOLTIP": "Returns a list, of length 0, containing no data records", @@ -272,7 +284,7 @@ "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", "LISTS_INDEX_OF_FIRST": "find first occurrence of item", "LISTS_INDEX_OF_LAST": "find last occurrence of item", - "LISTS_INDEX_OF_TOOLTIP": "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found.", + "LISTS_INDEX_OF_TOOLTIP": "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found.", "LISTS_GET_INDEX_GET": "get", "LISTS_GET_INDEX_GET_REMOVE": "get and remove", "LISTS_GET_INDEX_REMOVE": "remove", @@ -282,18 +294,17 @@ "LISTS_GET_INDEX_LAST": "last", "LISTS_GET_INDEX_RANDOM": "random", "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Returns the item at the specified position in a list. #1 is the first item.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Returns the item at the specified position in a list. #1 is the last item.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 is the first item.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 is the last item.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Returns the item at the specified position in a list.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Returns the first item in a list.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Returns the last item in a list.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Returns a random item in a list.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Removes and returns the item at the specified position in a list. #1 is the first item.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Removes and returns the item at the specified position in a list. #1 is the last item.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Removes and returns the item at the specified position in a list.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Removes and returns the first item in a list.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Removes and returns the last item in a list.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Removes and returns a random item in a list.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Removes the item at the specified position in a list. #1 is the first item.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Removes the item at the specified position in a list. #1 is the last item.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Removes the item at the specified position in a list.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Removes the first item in a list.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Removes the last item in a list.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Removes a random item in a list.", @@ -301,13 +312,11 @@ "LISTS_SET_INDEX_SET": "set", "LISTS_SET_INDEX_INSERT": "insert at", "LISTS_SET_INDEX_INPUT_TO": "as", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Sets the item at the specified position in a list. #1 is the first item.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Sets the item at the specified position in a list. #1 is the last item.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Sets the item at the specified position in a list.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Sets the first item in a list.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Sets the last item in a list.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Sets a random item in a list.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Inserts the item at the specified position in a list. #1 is the first item.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Inserts the item at the specified position in a list. #1 is the last item.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Inserts the item at the specified position in a list.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Inserts the item at the start of a list.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Append the item to the end of a list.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Inserts the item randomly in a list.", @@ -320,12 +329,23 @@ "LISTS_GET_SUBLIST_END_LAST": "to last", "LISTS_GET_SUBLIST_TAIL": "", "LISTS_GET_SUBLIST_TOOLTIP": "Creates a copy of the specified portion of a list.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sort %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Sort a copy of a list.", + "LISTS_SORT_ORDER_ASCENDING": "ascending", + "LISTS_SORT_ORDER_DESCENDING": "descending", + "LISTS_SORT_TYPE_NUMERIC": "numeric", + "LISTS_SORT_TYPE_TEXT": "alphabetic", + "LISTS_SORT_TYPE_IGNORECASE": "alphabetic, ignore case", "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "make list from text", "LISTS_SPLIT_TEXT_FROM_LIST": "make text from list", "LISTS_SPLIT_WITH_DELIMITER": "with delimiter", "LISTS_SPLIT_TOOLTIP_SPLIT": "Split text into a list of texts, breaking at each delimiter.", "LISTS_SPLIT_TOOLTIP_JOIN": "Join a list of texts into one text, separated by a delimiter.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "reverse %1", + "LISTS_REVERSE_TOOLTIP": "Reverse a copy of a list.", "ORDINAL_NUMBER_SUFFIX": "", "VARIABLES_GET_HELPURL": "https://github.com/google/blockly/wiki/Variables#get", "VARIABLES_GET_TOOLTIP": "Returns the value of this variable.", @@ -334,22 +354,22 @@ "VARIABLES_SET": "set %1 to %2", "VARIABLES_SET_TOOLTIP": "Sets this variable to be equal to the input.", "VARIABLES_SET_CREATE_GET": "Create 'get %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_DEFNORETURN_TITLE": "to", "PROCEDURES_DEFNORETURN_PROCEDURE": "do something", "PROCEDURES_BEFORE_PARAMS": "with:", "PROCEDURES_CALL_BEFORE_PARAMS": "with:", "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "Creates a function with no output.", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFNORETURN_COMMENT": "Describe this function...", + "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_DEFRETURN_RETURN": "return", "PROCEDURES_DEFRETURN_TOOLTIP": "Creates a function with an output.", "PROCEDURES_ALLOW_STATEMENTS": "allow statements", "PROCEDURES_DEF_DUPLICATE_WARNING": "Warning: This function has duplicate parameters.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_CALL": "", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Run the user-defined function '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Run the user-defined function '%1' and use its output.", "PROCEDURES_MUTATORCONTAINER_TITLE": "inputs", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Add, remove, or reorder inputs to this function.", @@ -358,5 +378,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Highlight function definition", "PROCEDURES_CREATE_DO": "Create '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "If a value is true, then return a second value.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Warning: This block may be used only within a function definition." } diff --git a/src/opsoro/server/static/js/blockly/msg/json/eo.json b/src/opsoro/server/static/js/blockly/msg/json/eo.json new file mode 100644 index 0000000..9069735 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/eo.json @@ -0,0 +1,197 @@ +{ + "@metadata": { + "authors": [ + "Etrapani", + "Ochilov", + "Orikrin1998", + "Robin van der Vliet" + ] + }, + "VARIABLES_DEFAULT_NAME": "elemento", + "TODAY": "Hodiaŭ", + "DUPLICATE_BLOCK": "Duobligi", + "ADD_COMMENT": "Aldoni komenton", + "REMOVE_COMMENT": "Forigi komenton", + "EXTERNAL_INPUTS": "Eksteraj eniroj", + "INLINE_INPUTS": "Entekstaj eniroj", + "DELETE_BLOCK": "Forigi blokon", + "DELETE_X_BLOCKS": "Forigi %1 blokojn", + "DELETE_ALL_BLOCKS": "Ĉu forigi ĉiujn %1 blokojn?", + "CLEAN_UP": "Purigi blokojn", + "COLLAPSE_BLOCK": "Faldi blokon", + "COLLAPSE_ALL": "Faldi blokojn", + "EXPAND_BLOCK": "Malfaldi blokon", + "EXPAND_ALL": "Malfaldi blokojn", + "DISABLE_BLOCK": "Malŝalti blokon", + "ENABLE_BLOCK": "Ŝalti blokon", + "HELP": "Helpo", + "UNDO": "Malfari", + "REDO": "Refari", + "CHANGE_VALUE_TITLE": "Ŝangi valoron:", + "RENAME_VARIABLE": "Renomi varianton...", + "RENAME_VARIABLE_TITLE": "Renomi ĉiujn '%1' variantojn kiel:", + "NEW_VARIABLE": "Nova varianto...", + "NEW_VARIABLE_TITLE": "Nova nomo de varianto:", + "VARIABLE_ALREADY_EXISTS": "Jam ekzistas varianto kun la nomo '%1'.", + "DELETE_VARIABLE_CONFIRMATION": "Ĉu forigi %1 uzojn de la varianto '%2'?", + "DELETE_VARIABLE": "Forigi la varianton '%1'", + "COLOUR_PICKER_HELPURL": "https://eo.wikipedia.org/wiki/Koloro", + "COLOUR_PICKER_TOOLTIP": "Elekti koloron el la paletro.", + "COLOUR_RANDOM_TITLE": "hazarda koloro", + "COLOUR_RANDOM_TOOLTIP": "Elekti hazardan koloron.", + "COLOUR_RGB_TITLE": "kolorigi per", + "COLOUR_RGB_RED": "ruĝa", + "COLOUR_RGB_GREEN": "verda", + "COLOUR_RGB_BLUE": "blua", + "COLOUR_BLEND_COLOUR1": "koloro 1", + "COLOUR_BLEND_COLOUR2": "koloro 2", + "COLOUR_BLEND_RATIO": "proporcio", + "CONTROLS_REPEAT_TITLE": "ripeti %1 fojojn", + "CONTROLS_REPEAT_INPUT_DO": "fari", + "CONTROLS_REPEAT_TOOLTIP": "Plenumi kelkajn ordonojn plurfoje.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ripeti dum", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ripeti ĝis", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Plenumi ordonojn dum la valoro egalas vero.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Plenumi ordonojn dum valoro egalas malvero.", + "CONTROLS_FOREACH_TITLE": "por ĉiu elemento %1 en la listo %2", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "eliri el la ciklo", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "daŭrigi je la venonta ripeto de la ciklo", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Eliri el la enhava ciklo.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Pretersalti la ceteron de tiu ĉi ciklo kaj daŭrigi je la venonta ripeto.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Averto: tiu ĉi bloko uzeblas nur ene de ciklo.", + "CONTROLS_IF_TOOLTIP_1": "Plenumi ordonojn se la valoro estas vero.", + "CONTROLS_IF_TOOLTIP_2": "Plenumi la unuan blokon de ordonoj se la valoro estas vero, se ne, la duan.", + "CONTROLS_IF_MSG_IF": "se", + "CONTROLS_IF_MSG_ELSEIF": "alie se", + "CONTROLS_IF_MSG_ELSE": "alie", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Aldoni kondiĉon al la bloko 'se'", + "CONTROLS_IF_ELSE_TOOLTIP": "Aldoni 'aliokaze' kondiĉon al la 'se' bloko.", + "LOGIC_COMPARE_HELPURL": "https://eo.wikipedia.org/wiki/Neegala%C4%B5o_(pli_granda,_malpli_granda)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Vero estos liverita, se la du eniroj egalas.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Vero estos liverita, se la du eniroj ne egalas.", + "LOGIC_COMPARE_TOOLTIP_LT": "Vero estos liverita, se la unua eniro estas pli eta ol la dua.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Vero estos liverita, se la unua eniro estas pli eta aŭ egala al la dua.", + "LOGIC_COMPARE_TOOLTIP_GT": "Vero estos liverita, se la unua eniro estas pli granda ol la dua.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Vero estos liverita, se la unua eniro estas pli granda aŭ egala al la dua.", + "LOGIC_OPERATION_TOOLTIP_AND": "Vero estos liverita, se la du eniroj egalas veron.", + "LOGIC_OPERATION_AND": "kaj", + "LOGIC_OPERATION_TOOLTIP_OR": "Vero estos liverita, se almenaŭ unu el la eniroj egalas veron.", + "LOGIC_OPERATION_OR": "aŭ", + "LOGIC_NEGATE_TITLE": "maligi %1", + "LOGIC_NEGATE_TOOLTIP": "Se la eniro egalas vero, la rezulto egalas malvero. Se la eniro egalas malvero, la rezulto egalas vero.", + "LOGIC_BOOLEAN_TRUE": "vera", + "LOGIC_BOOLEAN_FALSE": "falsa", + "LOGIC_BOOLEAN_TOOLTIP": "La rezulto egalas ĉu vero, ĉu malvero.", + "LOGIC_TERNARY_CONDITION": "testi", + "LOGIC_TERNARY_IF_TRUE": "se estas vero", + "LOGIC_TERNARY_IF_FALSE": "se estas malvero", + "LOGIC_TERNARY_TOOLTIP": "Kontroli la kondiĉon en 'testo'. Se la kondiĉo egalas veron, liveri la valoron 'se estas vero', aliokaze liveri la valoron 'se estas malvero'.", + "MATH_NUMBER_HELPURL": "https://eo.wikipedia.org/wiki/Nombro", + "MATH_NUMBER_TOOLTIP": "Nombro.", + "MATH_ARITHMETIC_HELPURL": "https://eo.wikipedia.org/wiki/Aritmetiko", + "MATH_ARITHMETIC_TOOLTIP_ADD": "La sumo de la du nombroj estos liverita.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "La diferenco inter la du nombroj estos liverita.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "La produto de la du numeroj estos liverita.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "La kvociento de la du nombroj estos liverita.", + "MATH_SINGLE_HELPURL": "https://eo.wikipedia.org/wiki/Kvadrata_radiko", + "MATH_SINGLE_OP_ROOT": "kvadrata radiko", + "MATH_SINGLE_TOOLTIP_ROOT": "La kvadrata radiko de nombro estos liverita.", + "MATH_SINGLE_OP_ABSOLUTE": "absoluta", + "MATH_SINGLE_TOOLTIP_ABS": "La absoluta valoro de nombro estos liverita.", + "MATH_SINGLE_TOOLTIP_NEG": "La negativigo de numero estos liverita.", + "MATH_SINGLE_TOOLTIP_LN": "La natura logaritmo de nombro estos liverita.", + "MATH_SINGLE_TOOLTIP_LOG10": "La dekbaza logaritmo de numero estos liverita.", + "MATH_SINGLE_TOOLTIP_EXP": "La rezulto de la potenco de e je la nombro.", + "MATH_TRIG_HELPURL": "https://eo.wikipedia.org/wiki/Trigonometria_funkcio", + "MATH_TRIG_TOOLTIP_ASIN": "La sinusarko de nombro estos liverita.", + "MATH_TRIG_TOOLTIP_ATAN": "La targentarko de nombro estos liverita.", + "MATH_CONSTANT_HELPURL": "https://eo.wikipedia.org/wiki/Matematika_konstanto", + "MATH_IS_EVEN": "estas para", + "MATH_IS_ODD": "estas nepara", + "MATH_IS_PRIME": "estas primo", + "MATH_IS_WHOLE": "estas entjero", + "MATH_IS_POSITIVE": "estas pozitiva", + "MATH_IS_NEGATIVE": "estas negativa", + "MATH_IS_DIVISIBLE_BY": "estas dividebla de", + "MATH_IS_TOOLTIP": "Vero aŭ malvero estos liverita, depende de la rezulto de kontrolo, ĉu nombro estas para, nepara, pozitiva, negativa, aŭ dividebla de iu nombro.", + "MATH_CHANGE_TOOLTIP": "Aldoni nombro al varianto '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Rondigi nombroj, supren aŭ malsupren.", + "MATH_ROUND_OPERATOR_ROUND": "rondigi", + "MATH_ROUND_OPERATOR_ROUNDUP": "Rondigi supren", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "rondigi malsupren", + "MATH_ONLIST_OPERATOR_SUM": "sumo de listo", + "MATH_ONLIST_TOOLTIP_SUM": "La sumo de ĉiuj nombro en la listo estos liverita.", + "MATH_ONLIST_OPERATOR_MIN": "listminimumo", + "MATH_ONLIST_TOOLTIP_MIN": "La plej eta nombro en la listo estos redonita.", + "MATH_ONLIST_OPERATOR_MAX": "listmaksimumo", + "MATH_ONLIST_TOOLTIP_MAX": "La plej granda numero en la listo estos redonita.", + "MATH_ONLIST_OPERATOR_AVERAGE": "listmezumo", + "MATH_ONLIST_TOOLTIP_AVERAGE": "La aritmetika meznombro de la numeroj en la listo estos liverita.", + "MATH_ONLIST_OPERATOR_MODE": "reĝimoj de listo", + "MATH_ONLIST_OPERATOR_STD_DEV": "Norma devio de la listo", + "MATH_ONLIST_TOOLTIP_STD_DEV": "La norma devio de la listo estos liverita.", + "MATH_ONLIST_OPERATOR_RANDOM": "hazarda elemento el la listo", + "MATH_ONLIST_TOOLTIP_RANDOM": "Elemento el la listo estos hazarde liverita.", + "MATH_MODULO_HELPURL": "https://eo.wikipedia.org/wiki/Resto", + "MATH_MODULO_TITLE": "resto de %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "La resto de la divido de du nombroj estos liverita.", + "MATH_CONSTRAIN_TITLE": "limigi %1 inter %2 kaj %3", + "MATH_CONSTRAIN_TOOLTIP": "La nombro estos limigita tiel ke ĝi egalas la limojn aŭ troviĝas inter ili.", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "hazarda entjero inter %1 kaj %2", + "MATH_RANDOM_INT_TOOLTIP": "Nombro estos hazarde liverita, tiel ke ĝi egalas la limojn aŭ troviĝas inter ili.", + "TEXT_APPEND_APPENDTEXT": "aldoni tekston", + "TEXT_LENGTH_TITLE": "longo de %1", + "TEXT_ISEMPTY_TITLE": "%1 malplenas", + "TEXT_INDEXOF_INPUT_INTEXT": "en la teksto", + "TEXT_CHARAT_INPUT_INTEXT": "en la teksto", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "en la teksto", + "TEXT_TRIM_OPERATOR_RIGHT": "forigi spacojn el la dekstra flanko de", + "TEXT_PRINT_TITLE": "presi %1", + "TEXT_PRINT_TOOLTIP": "Presi la specifitan tekston, nombron aŭ alian valoron.", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Peti nombron al uzanto.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Peti tekston al uzanto.", + "LISTS_CREATE_EMPTY_TITLE": "krei malplenan liston", + "LISTS_CREATE_EMPTY_TOOLTIP": "Listo, de longo 0, sen datumaj registroj, estos liverita.", + "LISTS_CREATE_WITH_TOOLTIP": "Krei liston kun ajna nombro de elementoj.", + "LISTS_CREATE_WITH_INPUT_WITH": "krei liston kun", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "listo", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Aldoni, forigi aŭ oridigi sekciojn por reagordi tiun ĉi blokon de listo.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Aldoni elementon al la listo.", + "LISTS_REPEAT_TOOLTIP": "Listo kun la specifita nombro de elementoj, kiuj havos la donitan valoron, estos kreita.", + "LISTS_REPEAT_TITLE": "krei liston kun elemento %1 ripetita %2 fojojn", + "LISTS_LENGTH_TITLE": "longo de %1", + "LISTS_LENGTH_TOOLTIP": "La longo de listo estos liverita.", + "LISTS_ISEMPTY_TITLE": "%1 malplenas", + "LISTS_ISEMPTY_TOOLTIP": "Vero estos liverita, se la listo malplenas.", + "LISTS_INLIST": "en la listo", + "LISTS_INDEX_OF_FIRST": "trovi la unuan aperon de elemento", + "LISTS_INDEX_OF_LAST": "trovi la lastan aperon de elemento", + "LISTS_INDEX_OF_TOOLTIP": "La indekso de la unua/lasta apero de la elemento en la listo estos liverita. %1 estos liverita se la elemento ne estas trovita.", + "LISTS_GET_INDEX_GET": "akiri", + "LISTS_GET_INDEX_GET_REMOVE": "akiri kaj forigi", + "LISTS_GET_INDEX_REMOVE": "forigi", + "LISTS_GET_INDEX_FROM_END": "#el la fino", + "LISTS_GET_INDEX_FIRST": "unuan", + "LISTS_GET_INDEX_LAST": "lastan", + "LISTS_GET_INDEX_RANDOM": "hazardan", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 estas la unua elemento.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 estas la lasta elemento.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "La elemento en la specifita pozicio en la listo estos liverita.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "La unua elemento en la listo esto liverita.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "La lasta elemento en la listo estos liverita.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Hazarda elemento en la listo estos liverita.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "La elemento en la specifita pozicio de la listo estos liverita kaj forigita.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "La unua elemento en la listo estos liverita kaj forigita.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "La lasta elemento en la listo estos liverita kaj forigita.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Hazarda elemento en la listo estos liverita kaj forigita.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "La elemento en la specifita pozicio en la listo estos forigita.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "La unua elemento en la listo estos forigita.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "La lasta elemento en la listo estos forigita.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Hazarda elemento en la listo estos forigita.", + "LISTS_SET_INDEX_SET": "difini", + "LISTS_SET_INDEX_INSERT": "enmeti je", + "LISTS_SET_INDEX_INPUT_TO": "kiel", + "PROCEDURES_CREATE_DO": "Krei '%1'" +} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/es.json b/src/opsoro/server/static/js/blockly/msg/json/es.json similarity index 87% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/es.json rename to src/opsoro/server/static/js/blockly/msg/json/es.json index 108c437..609ddf6 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/es.json +++ b/src/opsoro/server/static/js/blockly/msg/json/es.json @@ -4,7 +4,12 @@ "Fitoschido", "VegaDark", "WeSiToS", - "Macofe" + "Macofe", + "Codynguyen1116", + "Indiralena", + "Rubentl134", + "Martineduardo", + "Julián L" ] }, "VARIABLES_DEFAULT_NAME": "elemento", @@ -16,6 +21,8 @@ "INLINE_INPUTS": "Entradas en línea", "DELETE_BLOCK": "Eliminar bloque", "DELETE_X_BLOCKS": "Eliminar %1 bloques", + "DELETE_ALL_BLOCKS": "¿Eliminar todos los %1 bloques?", + "CLEAN_UP": "Limpiar los bloques", "COLLAPSE_BLOCK": "Contraer bloque", "COLLAPSE_ALL": "Contraer bloques", "EXPAND_BLOCK": "Expandir bloque", @@ -23,14 +30,16 @@ "DISABLE_BLOCK": "Desactivar bloque", "ENABLE_BLOCK": "Activar bloque", "HELP": "Ayuda", - "CHAT": "¡Chatea con tu colaborador escribiendo en este cuadro!", - "AUTH": "Autoriza a esta aplicación para guardar tu trabajo y permitir que lo compartas.", - "ME": "Yo", + "UNDO": "Deshacer", + "REDO": "Rehacer", "CHANGE_VALUE_TITLE": "Cambiar el valor:", - "NEW_VARIABLE": "Variable nueva…", - "NEW_VARIABLE_TITLE": "Nombre de variable nueva:", "RENAME_VARIABLE": "Renombrar la variable…", "RENAME_VARIABLE_TITLE": "Renombrar todas las variables «%1» a:", + "NEW_VARIABLE": "Crear variable…", + "NEW_VARIABLE_TITLE": "Nombre de variable nueva:", + "VARIABLE_ALREADY_EXISTS": "Ya existe una variable llamada \"%1\".", + "DELETE_VARIABLE_CONFIRMATION": "¿Borrar %1 usos de la variable \"%2\"?", + "DELETE_VARIABLE": "Borrar la variable \"%1\"", "COLOUR_PICKER_HELPURL": "https://es.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Elige un color de la paleta.", "COLOUR_RANDOM_TITLE": "color aleatorio", @@ -131,7 +140,7 @@ "MATH_IS_DIVISIBLE_BY": "es divisible por", "MATH_IS_TOOLTIP": "Comprueba si un número es par, impar, primo, entero, positivo, negativo, o si es divisible por un número determinado. Devuelve verdadero o falso.", "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "cambiar %1 por %2", + "MATH_CHANGE_TITLE": "añadir %2 a %1", "MATH_CHANGE_TOOLTIP": "Añadir un número a la variable «%1».", "MATH_ROUND_HELPURL": "https://es.wikipedia.org/wiki/Redondeo", "MATH_ROUND_TOOLTIP": "Redondear un número hacia arriba o hacia abajo.", @@ -179,7 +188,7 @@ "TEXT_LENGTH_TOOLTIP": "Devuelve el número de letras (incluyendo espacios) en el texto proporcionado.", "TEXT_ISEMPTY_TITLE": "%1 está vacío", "TEXT_ISEMPTY_TOOLTIP": "Devuelve verdadero si el texto proporcionado está vacío.", - "TEXT_INDEXOF_TOOLTIP": "Devuelve el índice de la primera/última aparición del primer texto en el segundo texto. Devuelve 0 si el texto no se encuentra.", + "TEXT_INDEXOF_TOOLTIP": "Devuelve el índice de la primera/última aparición del primer texto en el segundo texto. Devuelve %1 si el texto no se encuentra.", "TEXT_INDEXOF_INPUT_INTEXT": "en el texto", "TEXT_INDEXOF_OPERATOR_FIRST": "encontrar la primera aparición del texto", "TEXT_INDEXOF_OPERATOR_LAST": "encontrar la última aparición del texto", @@ -198,7 +207,7 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "hasta la letra #", "TEXT_GET_SUBSTRING_END_FROM_END": "hasta la letra # del final", "TEXT_GET_SUBSTRING_END_LAST": "hasta la última letra", - "TEXT_CHANGECASE_TOOLTIP": "Devuelve una copia del texto en un caso diferente.", + "TEXT_CHANGECASE_TOOLTIP": "Devuelve una copia del texto en un tamaño diferente.", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "a MAYÚSCULAS", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "a minúsculas", "TEXT_CHANGECASE_OPERATOR_TITLECASE": "a Mayúsculas Cada Palabra", @@ -212,6 +221,15 @@ "TEXT_PROMPT_TYPE_NUMBER": "solicitar número con el mensaje", "TEXT_PROMPT_TOOLTIP_NUMBER": "Solicitar al usuario un número.", "TEXT_PROMPT_TOOLTIP_TEXT": "Solicitar al usuario un texto.", + "TEXT_COUNT_MESSAGE0": "contar %1 en %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Cuantas veces aparece un texto dentro de otro texto.", + "TEXT_REPLACE_MESSAGE0": "reemplazar %1 con %2 en %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Reemplazar todas las veces que un texto dentro de otro texto.", + "TEXT_REVERSE_MESSAGE0": "invertir %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Invierte el orden de los caracteres en el texto.", "LISTS_CREATE_EMPTY_TITLE": "crear lista vacía", "LISTS_CREATE_EMPTY_TOOLTIP": "Devuelve una lista, de longitud 0, sin ningún dato", "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", @@ -229,7 +247,7 @@ "LISTS_INLIST": "en la lista", "LISTS_INDEX_OF_FIRST": "encontrar la primera aparición del elemento", "LISTS_INDEX_OF_LAST": "encontrar la última aparición del elemento", - "LISTS_INDEX_OF_TOOLTIP": "Devuelve el índice de la primera/última aparición del elemento en la lista. Devuelve 0 si el texto no se encuentra.", + "LISTS_INDEX_OF_TOOLTIP": "Devuelve el índice de la primera/última aparición del elemento en la lista. Devuelve %1 si el elemento no se encuentra.", "LISTS_GET_INDEX_GET": "obtener", "LISTS_GET_INDEX_GET_REMOVE": "obtener y eliminar", "LISTS_GET_INDEX_REMOVE": "eliminar", @@ -237,31 +255,28 @@ "LISTS_GET_INDEX_FIRST": "primero", "LISTS_GET_INDEX_LAST": "último", "LISTS_GET_INDEX_RANDOM": "aleatorio", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Devuelve el elemento en la posición especificada en la lista. #1 es el primer elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Devuelve el elemento en la posición especificada en una lista. #1 es el último elemento.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 es el primer elemento.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 es el último elemento.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Devuelve el elemento en la posición especificada en una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Devuelve el primer elemento de una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Devuelve el último elemento de una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Devuelve un elemento aleatorio en una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Elimina y devuelve el elemento en la posición especificada en la lista. #1 es el primer elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Elimina y devuelve el elemento en la posición especificada en la lista. #1 es el último elemento.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Elimina y devuelve el elemento en la posición especificada en una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Elimina y devuelve el primer elemento de una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Elimina y devuelve el último elemento de una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Elimina y devuelve un elemento aleatorio en una lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Elimina el elemento en la posición especificada en la lista. #1 es el primer elemento.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Elimina el elemento en la posición especificada en la lista. #1 es el último elemento.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Elimina el elemento en la posición especificada en una lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Elimina el primer elemento de una lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Elimina el último elemento de una lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Elimina un elemento aleatorio en una lista.", "LISTS_SET_INDEX_SET": "establecer", "LISTS_SET_INDEX_INSERT": "insertar en", "LISTS_SET_INDEX_INPUT_TO": "como", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Establece el elemento en la posición especificada en una lista. #1 es el primer elemento.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Establece el elemento en la posición especificada en una lista. #1 es el último elemento.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Establece el elemento en la posición especificada en una lista.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Establece el primer elemento de una lista.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Establece el último elemento de una lista.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Establece un elemento aleatorio en una lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Inserta el elemento en la posición especificada en la lista. #1 es el primer elemento.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Inserta el elemento en la posición especificada en la lista. #1 es el último elemento.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Inserta el elemento en la posición especificada en una lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Inserta el elemento al inicio de una lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Añade el elemento al final de una lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Inserta el elemento aleatoriamente en una lista.", @@ -272,12 +287,23 @@ "LISTS_GET_SUBLIST_END_FROM_END": "hasta # del final", "LISTS_GET_SUBLIST_END_LAST": "hasta el último", "LISTS_GET_SUBLIST_TOOLTIP": "Crea una copia de la parte especificada de una lista.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "orden %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Ordenar una copia de una lista.", + "LISTS_SORT_ORDER_ASCENDING": "ascendente", + "LISTS_SORT_ORDER_DESCENDING": "descendente", + "LISTS_SORT_TYPE_NUMERIC": "numérico", + "LISTS_SORT_TYPE_TEXT": "alfabético", + "LISTS_SORT_TYPE_IGNORECASE": "alfabético, ignorar mayúscula/minúscula", "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "hacer lista a partir de texto", "LISTS_SPLIT_TEXT_FROM_LIST": "hacer texto a partir de lista", "LISTS_SPLIT_WITH_DELIMITER": "con delimitador", "LISTS_SPLIT_TOOLTIP_SPLIT": "Dividir el texto en una lista de textos, separando en cada delimitador.", "LISTS_SPLIT_TOOLTIP_JOIN": "Unir una lista de textos en un solo texto, separado por un delimitador.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "invertir %1", + "LISTS_REVERSE_TOOLTIP": "Invertir una copia de una lista.", "VARIABLES_GET_TOOLTIP": "Devuelve el valor de esta variable.", "VARIABLES_GET_CREATE_SET": "Crear 'establecer %1'", "VARIABLES_SET": "establecer %1 a %2", @@ -288,6 +314,7 @@ "PROCEDURES_BEFORE_PARAMS": "con:", "PROCEDURES_CALL_BEFORE_PARAMS": "con:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Crea una función sin salida.", + "PROCEDURES_DEFNORETURN_COMMENT": "Describe esta función...", "PROCEDURES_DEFRETURN_RETURN": "devuelve", "PROCEDURES_DEFRETURN_TOOLTIP": "Crea una función con una salida.", "PROCEDURES_ALLOW_STATEMENTS": "permitir declaraciones", diff --git a/src/opsoro/server/static/js/blockly/msg/json/et.json b/src/opsoro/server/static/js/blockly/msg/json/et.json new file mode 100644 index 0000000..b7e0413 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/et.json @@ -0,0 +1,314 @@ +{ + "@metadata": { + "authors": [ + "Aivarannamaa", + "Hasso" + ] + }, + "VARIABLES_DEFAULT_NAME": "objekt", + "TODAY": "Täna", + "DUPLICATE_BLOCK": "Tekita duplikaat", + "ADD_COMMENT": "Lisa kommentaar", + "REMOVE_COMMENT": "Eemalda kommentaar", + "EXTERNAL_INPUTS": "Sisendid ploki taga", + "INLINE_INPUTS": "Sisendid ploki sees", + "DELETE_BLOCK": "Kustuta plokk", + "DELETE_X_BLOCKS": "Kustuta %1 plokki", + "DELETE_ALL_BLOCKS": "Kas kustutada kõik %1 plokki?", + "CLEAN_UP": "Korista plokid kokku", + "COLLAPSE_BLOCK": "Tõmba plokk kokku", + "COLLAPSE_ALL": "Tõmba plokid kokku", + "EXPAND_BLOCK": "Laota plokk laiali", + "EXPAND_ALL": "Laota plokid laiali", + "DISABLE_BLOCK": "Keela ploki kasutamine", + "ENABLE_BLOCK": "Luba ploki kasutamine", + "HELP": "Abi", + "UNDO": "Võta tagasi", + "REDO": "Tee uuesti", + "CHANGE_VALUE_TITLE": "Muuda väärtust:", + "RENAME_VARIABLE": "Nimeta muutuja ümber ...", + "RENAME_VARIABLE_TITLE": "Muutuja „%1“ uus nimi:", + "NEW_VARIABLE": "Uus muutuja ...", + "NEW_VARIABLE_TITLE": "Uue muutuja nimi:", + "VARIABLE_ALREADY_EXISTS": "'%1'-nimeline muutuja on juba olemas.", + "DELETE_VARIABLE_CONFIRMATION": "Kas kustutada %1 kohas kasutatav muutuja '%2'?", + "DELETE_VARIABLE": "Kustuta muutuja '%1'", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", + "COLOUR_PICKER_TOOLTIP": "Valitud värv paletist.", + "COLOUR_RANDOM_TITLE": "juhuslik värv", + "COLOUR_RANDOM_TOOLTIP": "Juhuslikult valitud värv.", + "COLOUR_RGB_TITLE": "segu", + "COLOUR_RGB_RED": "punasest", + "COLOUR_RGB_GREEN": "rohelisest", + "COLOUR_RGB_BLUE": "sinisest", + "COLOUR_RGB_TOOLTIP": "Tekitab värvi määratud hulgast punasest, rohelisest ja sinisest. Kõik väärtused peavad olema 0 ja 100 vahel.", + "COLOUR_BLEND_TITLE": "segu", + "COLOUR_BLEND_COLOUR1": "1. värvist", + "COLOUR_BLEND_COLOUR2": "2. värvist", + "COLOUR_BLEND_RATIO": "suhtega", + "COLOUR_BLEND_TOOLTIP": "Segab kaks värvi määratud suhtega (0.0 - 1.0) kokku.", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "%1 korda", + "CONTROLS_REPEAT_INPUT_DO": "käivita", + "CONTROLS_REPEAT_TOOLTIP": "Plokis olevate käskude käivitamine määratud arv kordi.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "seni kuni on", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "seni kuni pole", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Plokis olevaid käske korratakse seni kui avaldis on tõene.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Plokis olevaid käske korratakse seni kui avaldis pole tõene.", + "CONTROLS_FOR_TOOLTIP": "Annab muutujale '%1' väärtused ühest numbrist teiseni, muutes seda intervalli kaupa ja käivitab igal muudatusel ploki sees oleva koodi.", + "CONTROLS_FOR_TITLE": "loendus muutujaga %1 alates %2 kuni %3, %4 kaupa", + "CONTROLS_FOREACH_TITLE": "iga elemendiga %1 loendis %2", + "CONTROLS_FOREACH_TOOLTIP": "Iga elemendiga loendis anna muutujale '%1' elemendi väärtus ja kõivita plokis olevad käsud.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "välju kordusest", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "katkesta see kordus ja liigu järgmisele", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Väljub kordusest ja liigub edasi korduse järel oleva koodi käivitamisele.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Katkestab korduses oleva koodi käivitamise ja käivitab järgmise korduse.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Hoiatus: Seda plokki saab kasutada ainult korduse sees.", + "CONTROLS_IF_TOOLTIP_1": "Kui avaldis on tõene, käivita ploki sees olevad käsud.", + "CONTROLS_IF_TOOLTIP_2": "Kui avaldis on tõene, käivita käsud esimesest plokist. Vastasel juhul käivita käsud teisest plokist.", + "CONTROLS_IF_TOOLTIP_3": "Kui esimene avaldis on tõene, käivita käsud esimesest plokist. Vastasel juhul, kui teine avaldis on tõene, käivita käsud teisest plokist.", + "CONTROLS_IF_TOOLTIP_4": "Kui esimene avaldis on tõene, käivita käsud esimesest plokist. Vastasel juhul, kui teine avaldis on tõene, käivita käsud teisest plokist. Kui ükski avaldistest pole tõene, käivita käsud viimasest plokist.", + "CONTROLS_IF_MSG_IF": "kui", + "CONTROLS_IF_MSG_ELSEIF": "vastasel juhul, kui", + "CONTROLS_IF_MSG_ELSE": "vastasel juhul", + "CONTROLS_IF_IF_TOOLTIP": "Selle „kui“ ploki muutmine sektsioonide lisamise, eemaldamise ja järjestamisega.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Lisab „kui“ plokile tingimuse.", + "CONTROLS_IF_ELSE_TOOLTIP": "Lisab „kui“ plokile lõpliku tingimuseta koodiploki.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Tagastab „tõene“, kui avaldiste väärtused on võrdsed.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Tagastab „tõene“, kui avaldiste väärtused pole võrdsed.", + "LOGIC_COMPARE_TOOLTIP_LT": "Tagastab „tõene“, kui esimese avaldise väärtus on väiksem kui teise väärtus.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Tagastab „tõene“, kui esimese avaldise väärtus on väiksem või võrdne teise väärtusega.", + "LOGIC_COMPARE_TOOLTIP_GT": "Tagastab „tõene“, kui esimese avaldise väärtus on suurem kui teise väärtus.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Tagastab „tõene“, kui esimese avaldise väärtus on suurem või võrdne teise väärtusega.", + "LOGIC_OPERATION_TOOLTIP_AND": "Tagastab „tõene“, kui mõlemad avaldised on tõesed.", + "LOGIC_OPERATION_AND": "ja", + "LOGIC_OPERATION_TOOLTIP_OR": "Tagastab „tõene“, kui vähemalt üks avaldistest on tõene.", + "LOGIC_OPERATION_OR": "või", + "LOGIC_NEGATE_TITLE": "pole %1", + "LOGIC_NEGATE_TOOLTIP": "Tagastab „tõene“, kui avaldis on väär. Tagastab „väär“, kui avaldis on tõene.", + "LOGIC_BOOLEAN_TRUE": "tõene", + "LOGIC_BOOLEAN_FALSE": "väär", + "LOGIC_BOOLEAN_TOOLTIP": "Tagastab tõeväärtuse – kas „tõene“ või „väär“.", + "LOGIC_NULL": "null", + "LOGIC_NULL_TOOLTIP": "Tagastab nulli.", + "LOGIC_TERNARY_CONDITION": "tingimus", + "LOGIC_TERNARY_IF_TRUE": "kui tõene", + "LOGIC_TERNARY_IF_FALSE": "kui väär", + "LOGIC_TERNARY_TOOLTIP": "Kui tingimuse väärtus on tõene, tagastab „kui tõene“ väärtuse, vastasel juhul „kui väär“ väärtuse.", + "MATH_NUMBER_HELPURL": "https://et.wikipedia.org/wiki/Arv", + "MATH_NUMBER_TOOLTIP": "Arv.", + "MATH_ARITHMETIC_HELPURL": "https://et.wikipedia.org/wiki/Aritmeetika", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Tagastab kahe arvu summa.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Tagastab kahe arvu vahe.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Tagastab kahe arvu korrutise.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Tagastab kahe arvu jagatise.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Tagastab esimese arvu teise arvu astmes.", + "MATH_SINGLE_HELPURL": "https://et.wikipedia.org/wiki/Ruutjuur", + "MATH_SINGLE_OP_ROOT": "ruutjuur", + "MATH_SINGLE_TOOLTIP_ROOT": "Tagastab arvu ruutjuure.", + "MATH_SINGLE_OP_ABSOLUTE": "absoluutväärtus", + "MATH_SINGLE_TOOLTIP_ABS": "Tagastab arvu absoluutväärtuse.", + "MATH_SINGLE_TOOLTIP_NEG": "Tagastab arvu vastandväärtuse.", + "MATH_SINGLE_TOOLTIP_LN": "Tagastab arvu naturaallogaritmi.", + "MATH_SINGLE_TOOLTIP_LOG10": "Tagastab arvu kümnendlogaritm.", + "MATH_SINGLE_TOOLTIP_EXP": "Tagasta e arvu astmes.", + "MATH_SINGLE_TOOLTIP_POW10": "Tagastab 10 arvu astmes.", + "MATH_TRIG_HELPURL": "https://et.wikipedia.org/wiki/Trigonomeetrilised_funktsioonid", + "MATH_TRIG_TOOLTIP_SIN": "Tagastab arvu (kraadid) siinuse.", + "MATH_TRIG_TOOLTIP_COS": "Tagastab arvu (kraadid) kosiinuse.", + "MATH_TRIG_TOOLTIP_TAN": "Tagastab arvu (kraadid) tangensi.", + "MATH_TRIG_TOOLTIP_ASIN": "Tagastab arvu arkussiinuse.", + "MATH_TRIG_TOOLTIP_ACOS": "Tagastab arvu arkuskoosiinuse.", + "MATH_TRIG_TOOLTIP_ATAN": "Tagastab arvu arkustangensi.", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "Tagastab ühe konstantidest: π (3,141…), e (2,718…), φ (1.618…), √2) (1,414…), √½ (0,707…), või ∞ (infinity).", + "MATH_IS_EVEN": "on paarisarv", + "MATH_IS_ODD": "on paaritu arv", + "MATH_IS_PRIME": "on algarv", + "MATH_IS_WHOLE": "on täisarv", + "MATH_IS_POSITIVE": "on positiivne arv", + "MATH_IS_NEGATIVE": "on negatiivne arv", + "MATH_IS_DIVISIBLE_BY": "jagub arvuga", + "MATH_IS_TOOLTIP": "Kontrollib kas arv on paarisarv, paaritu arv, algarv, täisarv, positiivne, negatiivne või jagub kindla arvuga. Tagastab „tõene“ või „väär“.", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "muuda %1 %2 võrra", + "MATH_CHANGE_TOOLTIP": "Lisab arvu muutujale '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Ümardab arvu üles või alla.", + "MATH_ROUND_OPERATOR_ROUND": "ümarda", + "MATH_ROUND_OPERATOR_ROUNDUP": "ümarda üles", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "ümarda alla", + "MATH_ONLIST_OPERATOR_SUM": "loendi summa", + "MATH_ONLIST_TOOLTIP_SUM": "Tagastab kõigi loendis olevate arvude summa.", + "MATH_ONLIST_OPERATOR_MIN": "loendi miinimum", + "MATH_ONLIST_TOOLTIP_MIN": "Tagastab väikseima loendis oleva arvu.", + "MATH_ONLIST_OPERATOR_MAX": "loendi maksimum", + "MATH_ONLIST_TOOLTIP_MAX": "Tagastab suurima loendis oleva arvu.", + "MATH_ONLIST_OPERATOR_AVERAGE": "loendi keskmine", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Tagastab loendis olevate arvväärtuste aritmeetilise keskmise.", + "MATH_ONLIST_OPERATOR_MEDIAN": "loendi mediaan", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Return the median number in the list.", + "MATH_ONLIST_OPERATOR_MODE": "loendi moodid", + "MATH_ONLIST_TOOLTIP_MODE": "Tagastab loendi kõige sagedamini esinevate loendi liikmetega.", + "MATH_ONLIST_OPERATOR_STD_DEV": "loendi standardhälve", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Tagastab loendi standardhälbe.", + "MATH_ONLIST_OPERATOR_RANDOM": "juhuslik element loendist", + "MATH_ONLIST_TOOLTIP_RANDOM": "Tagastab juhusliku elemendi loendist.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "%1 ÷ %2 jääk", + "MATH_MODULO_TOOLTIP": "Tagastab esimese numbri teisega jagamisel tekkiva jäägi.", + "MATH_CONSTRAIN_TITLE": "%1 piirang %2 ja %3 vahele", + "MATH_CONSTRAIN_TOOLTIP": "Piirab arvu väärtuse toodud piiridesse (piirarvud kaasa arvatud).", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "juhuslik täisarv %1 ja %2 vahel", + "MATH_RANDOM_INT_TOOLTIP": "Tagastab juhusliku täisarvu toodud piiride vahel (piirarvud kaasa arvatud).", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "juhuslik murdosa", + "MATH_RANDOM_FLOAT_TOOLTIP": "Tagastab juhusliku murdosa 0.0 (kaasa arvatud) and 1.0 (välja arvatud) vahel.", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Täht, sõna või rida teksti.", + "TEXT_JOIN_TITLE_CREATEWITH": "tekita tekst", + "TEXT_JOIN_TOOLTIP": "Tekitab teksti ühendades mistahes arvu elemente.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "ühenda", + "TEXT_CREATE_JOIN_TOOLTIP": "Tekstiploki muutmine sektsioonide lisamise, eemaldamise või järjestuse muutmisega.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Objekti lisamine tekstile.", + "TEXT_APPEND_TO": "lisa muutuja", + "TEXT_APPEND_APPENDTEXT": "lõppu tekst", + "TEXT_APPEND_TOOLTIP": "Lisab teksti muutuja „%1“ väärtuse lõppu.", + "TEXT_LENGTH_TITLE": "%1 pikkus", + "TEXT_LENGTH_TOOLTIP": "Tagastab sümbolite aru (ka tühikud) toodud tekstis.", + "TEXT_ISEMPTY_TITLE": "%1 on tühi", + "TEXT_ISEMPTY_TOOLTIP": "Tagastab „tõene“, kui tekstis pole ühtegi sümbolit.", + "TEXT_INDEXOF_TOOLTIP": "Tagastab esimesest tekstist esimese/viimase leitud teise teksti asukoha (indeksi). Kui teksti ei leita, tagastab %1.", + "TEXT_INDEXOF_INPUT_INTEXT": "tekstist", + "TEXT_INDEXOF_OPERATOR_FIRST": "esimese leitud tekstitüki", + "TEXT_INDEXOF_OPERATOR_LAST": "viimase leitud tekstitüki", + "TEXT_INDEXOF_TAIL": "asukoht", + "TEXT_CHARAT_INPUT_INTEXT": "tekstist", + "TEXT_CHARAT_FROM_START": "sümbol #", + "TEXT_CHARAT_FROM_END": "lõpust sümbol #", + "TEXT_CHARAT_FIRST": "esimene sümbol", + "TEXT_CHARAT_LAST": "viimane sümbol", + "TEXT_CHARAT_RANDOM": "juhuslik sümbol", + "TEXT_CHARAT_TOOLTIP": "Tagastab tekstis määratud asukohal oleva sümboli.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Tagastab määratud tüki tekstist.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "tekstist", + "TEXT_GET_SUBSTRING_START_FROM_START": "alates sümbolist #", + "TEXT_GET_SUBSTRING_START_FROM_END": "alates (lõpust) sümbolist #", + "TEXT_GET_SUBSTRING_START_FIRST": "alates esimesest sümbolist", + "TEXT_GET_SUBSTRING_END_FROM_START": "kuni sümbolini #", + "TEXT_GET_SUBSTRING_END_FROM_END": "kuni (lõpust) sümbolini #", + "TEXT_GET_SUBSTRING_END_LAST": "kuni viimase sümbolini", + "TEXT_CHANGECASE_TOOLTIP": "Tagastab muudetud tähesuurusega teksti koopia.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "SUURTE TÄHTEDEGA", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "väikeste tähtedega", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "Suurte Esitähtedega", + "TEXT_TRIM_TOOLTIP": "Tagastab koopia tekstist, millel on tühikud ühelt või mõlemalt poolt eemaldatud.", + "TEXT_TRIM_OPERATOR_BOTH": "mõlemalt poolt eemaldatud tühikutega", + "TEXT_TRIM_OPERATOR_LEFT": "algusest eemaldatud tühikutega", + "TEXT_TRIM_OPERATOR_RIGHT": "lõpust eemaldatud tühikutega", + "TEXT_PRINT_TITLE": "trüki %1", + "TEXT_PRINT_TOOLTIP": "Trükib määratud teksti, numbri või mõne muu objekti väärtuse.", + "TEXT_PROMPT_TYPE_TEXT": "kasutajalt küsitud tekst teatega", + "TEXT_PROMPT_TYPE_NUMBER": "kasutajalt küsitud arv teatega", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Küsib kasutajalt teadet näidates mingit arvu.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Küsib kasutajalt teadet näidates mingit teksti.", + "LISTS_CREATE_EMPTY_TITLE": "tühi loend", + "LISTS_CREATE_EMPTY_TOOLTIP": "Tagastab loendi, mille pikkus on 0 ja milles pole ühtegi elementi.", + "LISTS_CREATE_WITH_TOOLTIP": "Tekitab mistahes arvust elementidest loendi.", + "LISTS_CREATE_WITH_INPUT_WITH": "uus loend", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "loend", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Loendiploki elementide lisamine, eemaldamine või järjestuse muutmine.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Elemendi lisamine loendisse.", + "LISTS_REPEAT_TOOLTIP": "Tekitab uue loendi, millesse lisatakse ühte elementi pikkusega määratud arv kordi.", + "LISTS_REPEAT_TITLE": "loend pikkusega %2 elemendist %1", + "LISTS_LENGTH_TITLE": "%1 pikkus", + "LISTS_LENGTH_TOOLTIP": "Tagastab loendi pikkuse.", + "LISTS_ISEMPTY_TITLE": "%1 on tühi", + "LISTS_ISEMPTY_TOOLTIP": "Tagastab „tõene“ kui loend on tühi.", + "LISTS_INLIST": "loendis", + "LISTS_INDEX_OF_FIRST": "esimene leitud", + "LISTS_INDEX_OF_LAST": "viimase leitud", + "LISTS_INDEX_OF_TOOLTIP": "Tagastab esimese/viimase loendist leitud objekti asukoha (objekti järjekorranumbri loendis). Kui objekti ei leita, tagastab %1.", + "LISTS_GET_INDEX_GET": "võetud", + "LISTS_GET_INDEX_GET_REMOVE": "võetud ja eemaldatud", + "LISTS_GET_INDEX_REMOVE": "eemalda", + "LISTS_GET_INDEX_FROM_START": "element #", + "LISTS_GET_INDEX_FROM_END": "element # (lõpust)", + "LISTS_GET_INDEX_FIRST": "esimene element", + "LISTS_GET_INDEX_LAST": "viimane element", + "LISTS_GET_INDEX_RANDOM": "juhuslik element", + "LISTS_INDEX_FROM_START_TOOLTIP": "Esimene element on %1.", + "LISTS_INDEX_FROM_END_TOOLTIP": "Viimane element on %1.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Tagastab loendis määratud asukohal oleva elemendi.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Tagastab loendi esimese elemendi.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Tagastab loendi viimase elemendi.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Tagastab loendi juhusliku elemendi.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Tagastab ja eemaldab loendist määratud asukohal oleva elemendi.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Tagastab ja eemaldab loendist esimese elemendi.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Tagastab ja eemaldab loendist viimase elemendi.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Tagastab ja eemaldab loendist juhusliku elemendi.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Eemaldab loendist määratud asukohal oleva elemendi.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Eemaldab loendist esimese elemendi.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Eemaldab loendist viimase elemendi.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Eemaldab loendist juhusliku elemendi.", + "LISTS_SET_INDEX_SET": "asenda", + "LISTS_SET_INDEX_INSERT": "lisa asukohale", + "LISTS_SET_INDEX_INPUT_TO": ", väärtus", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Asendab loendis määratud kohal oleva elemendi.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Asendab loendis esimese elemendi.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Asendab loendis viimase elemendi.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Asendab loendis juhusliku elemendi.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Lisab määratud asukohale loendis uue elemendi.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Lisab loendi algusesse uue elemendi.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Lisab loendi lõppu uue elemendi.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Lisab juhuslikule kohale loendis uue elemendi.", + "LISTS_GET_SUBLIST_START_FROM_START": "alamloend elemendist #", + "LISTS_GET_SUBLIST_START_FROM_END": "alamloend elemendist # (lõpust)", + "LISTS_GET_SUBLIST_START_FIRST": "alamloend algusest", + "LISTS_GET_SUBLIST_END_FROM_START": "elemendini #", + "LISTS_GET_SUBLIST_END_FROM_END": "elemendini # (lõpust)", + "LISTS_GET_SUBLIST_END_LAST": "lõpuni", + "LISTS_GET_SUBLIST_TOOLTIP": "Tekitab loendi määratud osast koopia.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "%1 %2 sorteeritud %3", + "LISTS_SORT_TOOLTIP": "Loendi koopia sorteerimine.", + "LISTS_SORT_ORDER_ASCENDING": "kasvavalt", + "LISTS_SORT_ORDER_DESCENDING": "kahanevalt", + "LISTS_SORT_TYPE_NUMERIC": "arvväärtuste järgi", + "LISTS_SORT_TYPE_TEXT": "tähestiku järgi", + "LISTS_SORT_TYPE_IGNORECASE": "tähestiku järgi (tähesuurust eirates)", + "LISTS_SPLIT_LIST_FROM_TEXT": "loend, tekitatud tekstist", + "LISTS_SPLIT_TEXT_FROM_LIST": "tekst, tekitatud loendist", + "LISTS_SPLIT_WITH_DELIMITER": "eraldajaga", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Tükeldab teksti eraldajade kohalt ja asetab tükid tekstide loendisse.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Ühendab tekstide loendis olevad tükid üheks tekstiks, asetades tükkide vahele eraldaja.", + "VARIABLES_GET_TOOLTIP": "Tagastab selle muutuja väärtuse.", + "VARIABLES_GET_CREATE_SET": "Tekita 'määra „%1“ väärtuseks' plokk", + "VARIABLES_SET": "määra %1 väärtuseks %2", + "VARIABLES_SET_TOOLTIP": "Määrab selle muutuja väärtuse võrdseks sisendi väärtusega.", + "VARIABLES_SET_CREATE_GET": "Tekita '„%1“ väärtus' plokk", + "PROCEDURES_DEFNORETURN_TITLE": "funktsioon", + "PROCEDURES_DEFNORETURN_PROCEDURE": "teeme midagi", + "PROCEDURES_BEFORE_PARAMS": "sisenditega:", + "PROCEDURES_CALL_BEFORE_PARAMS": "sisenditega:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Tekitab funktsiooni, mis ei tagasta midagi.", + "PROCEDURES_DEFNORETURN_COMMENT": "Funktsiooni kirjeldus ...", + "PROCEDURES_DEFRETURN_RETURN": "tagasta", + "PROCEDURES_DEFRETURN_TOOLTIP": "Tekitab funktsiooni, mis tagastab midagi.", + "PROCEDURES_ALLOW_STATEMENTS": "kood plokis", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Hoiatus: Sel funktsioonil on mitu sama nimega sisendit.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Käivitab kasutaja defineeritud funktsiooni '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLRETURN_TOOLTIP": "Run the user-defined function '%1' and use its output.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "sisendid", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Funktsiooni sisendite lisamine, eemaldamine või järjestuse muutmine.", + "PROCEDURES_MUTATORARG_TITLE": "sisend nimega:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Lisab funktsioonile sisendi.", + "PROCEDURES_HIGHLIGHT_DEF": "Tõsta funktsiooni definitsioon esile", + "PROCEDURES_CREATE_DO": "Tekita '%1' plokk", + "PROCEDURES_IFRETURN_TOOLTIP": "Kui väärtus on tõene, tagastatakse teine väärtus.", + "PROCEDURES_IFRETURN_WARNING": "Hoiatus: Seda plokki saab kasutada ainult funktsiooni definitsioonis." +} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/fa.json b/src/opsoro/server/static/js/blockly/msg/json/fa.json similarity index 89% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/fa.json rename to src/opsoro/server/static/js/blockly/msg/json/fa.json index 43f7c29..80c55a8 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/fa.json +++ b/src/opsoro/server/static/js/blockly/msg/json/fa.json @@ -6,7 +6,8 @@ "Alirezaaa", "Mehran", "MohandesWiki", - "Dalba" + "Dalba", + "Hamisun" ] }, "VARIABLES_DEFAULT_NAME": "مورد", @@ -18,6 +19,8 @@ "INLINE_INPUTS": "ورودی‌های درون خطی", "DELETE_BLOCK": "حذف بلوک", "DELETE_X_BLOCKS": "حذف بلوک‌های %1", + "DELETE_ALL_BLOCKS": "حذف همهٔ بلاک‌های %1؟", + "CLEAN_UP": "تمیز کردن بلوک‌ها", "COLLAPSE_BLOCK": "فروپاشی بلوک", "COLLAPSE_ALL": "فروپاشی بلوک‌ها", "EXPAND_BLOCK": "گسترش بلوک", @@ -25,14 +28,13 @@ "DISABLE_BLOCK": "غیرفعال‌سازی بلوک", "ENABLE_BLOCK": "فعال‌سازی بلوک", "HELP": "راهنما", - "CHAT": "با همکارتان با نوشتن در این کادر چت کنید!", - "AUTH": "لطفا این اپلیکیشن را ثبت کنید و آثارتان را فعال کنید تا ذخیره شود و اجازهٔ اشتراک‌گذاری توسط شما داده شود.", - "ME": "من", + "UNDO": "واگردانی", + "REDO": "واگردانی", "CHANGE_VALUE_TITLE": "تغییر مقدار:", - "NEW_VARIABLE": "متغیر تازه...", - "NEW_VARIABLE_TITLE": "نام متغیر تازه:", "RENAME_VARIABLE": "تغییر نام متغیر...", "RENAME_VARIABLE_TITLE": "تغییر نام همهٔ متغیرهای «%1» به:", + "NEW_VARIABLE": "متغیر تازه...", + "NEW_VARIABLE_TITLE": "نام متغیر تازه:", "COLOUR_PICKER_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%D9%86%DA%AF", "COLOUR_PICKER_TOOLTIP": "انتخاب یک رنگ از تخته‌رنگ.", "COLOUR_RANDOM_TITLE": "رنگ تصادفی", @@ -73,7 +75,7 @@ "CONTROLS_IF_MSG_ELSE": "آنگاه", "CONTROLS_IF_IF_TOOLTIP": "افزودن، حذف یا بازمرتب‌سازی قسمت‌ها برای پیکربندی دوبارهٔ این بلوک اگر.", "CONTROLS_IF_ELSEIF_TOOLTIP": "افزودن یک شرط به بلوک اگر.", - "CONTROLS_IF_ELSE_TOOLTIP": "اضافه‌کردن نهایی، گرفتن همهٔ شرایط به بلوک اگر.", + "CONTROLS_IF_ELSE_TOOLTIP": "اضافه کردن نهایی، گرفتن همهٔ شرایط به بلوک اگر.", "LOGIC_COMPARE_HELPURL": "https://fa.wikipedia.org/wiki/%D9%86%D8%A7%D8%A8%D8%B1%D8%A7%D8%A8%D8%B1%DB%8C", "LOGIC_COMPARE_TOOLTIP_EQ": "بازگشت صحیح اگر هر دو ورودی با یکدیگر برابر باشد.", "LOGIC_COMPARE_TOOLTIP_NEQ": "برگرداندن صحیح اگر هر دو ورودی با یکدیگر برابر نباشند.", @@ -171,7 +173,7 @@ "TEXT_JOIN_TITLE_CREATEWITH": "ایجاد متن با", "TEXT_JOIN_TOOLTIP": "یک تکه‌ای از متن را با چسپاندن همهٔ تعداد از موارد ایجاد می‌کند.", "TEXT_CREATE_JOIN_TITLE_JOIN": "عضویت", - "TEXT_CREATE_JOIN_TOOLTIP": "اضافه‌کردن، حذف یا مرتب‌سازی بحش‌ها برای تنظیم مجدد این بلوک متنی.", + "TEXT_CREATE_JOIN_TOOLTIP": "اضافه کردن، حذف یا مرتب‌سازی بحش‌ها برای تنظیم مجدد این بلوک متنی.", "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "افزودن یک مورد به متن.", "TEXT_APPEND_TO": "به", "TEXT_APPEND_APPENDTEXT": "الحاق متن", @@ -179,8 +181,8 @@ "TEXT_LENGTH_TITLE": "طول %1", "TEXT_LENGTH_TOOLTIP": "بازگرداندن عددی از حروف (شامل فاصله‌ها) در متن فراهم‌شده.", "TEXT_ISEMPTY_TITLE": "%1 خالی است", - "TEXT_ISEMPTY_TOOLTIP": "اضافه‌کردن صحیح اگر متن فراهم‌شده خالی است.", - "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد ۰ باز می‌گرداند.", + "TEXT_ISEMPTY_TOOLTIP": "اضافه کردن صحیح اگر متن فراهم‌شده خالی است.", + "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد %1 باز می‌گرداند.", "TEXT_INDEXOF_INPUT_INTEXT": "در متن", "TEXT_INDEXOF_OPERATOR_FIRST": "اولین رخداد متن را بیاب", "TEXT_INDEXOF_OPERATOR_LAST": "آخرین رخداد متن را بیاب", @@ -218,8 +220,8 @@ "LISTS_CREATE_WITH_TOOLTIP": "فهرستی از هر عددی از موارد می‌سازد.", "LISTS_CREATE_WITH_INPUT_WITH": "ایجاد فهرست با", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "فهرست", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "اضافه‌کردن، حذف‌کردن یا ترتیب‌سازی مجدد بخش‌ها این بلوک فهرستی.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "اضافه‌کردن یک مورد به فهرست.", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "اضافه کردن، حذف کردن یا ترتیب‌سازی مجدد بخش‌ها این بلوک فهرستی.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "اضافه کردن یک مورد به فهرست.", "LISTS_REPEAT_TOOLTIP": "فهرستی شامل مقادیر داده‌شدهٔ تکرار شده عدد مشخص‌شده می‌سازد.", "LISTS_REPEAT_TITLE": "فهرستی با %1 تکرارشده به اندازهٔ %2 می‌سازد", "LISTS_LENGTH_TITLE": "طول %1", @@ -229,7 +231,7 @@ "LISTS_INLIST": "در فهرست", "LISTS_INDEX_OF_FIRST": "یافتن اولین رخ‌داد مورد", "LISTS_INDEX_OF_LAST": "یافتن آخرین رخ‌داد مورد", - "LISTS_INDEX_OF_TOOLTIP": "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. ۰ بر می‌گرداند اگر متن موجود نبود.", + "LISTS_INDEX_OF_TOOLTIP": "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. %1 بر می‌گرداند اگر آیتم موجود نبود.", "LISTS_GET_INDEX_GET": "گرفتن", "LISTS_GET_INDEX_GET_REMOVE": "گرفتن و حذف‌کردن", "LISTS_GET_INDEX_REMOVE": "حذف‌کردن", @@ -237,31 +239,28 @@ "LISTS_GET_INDEX_FIRST": "اولین", "LISTS_GET_INDEX_LAST": "آخرین", "LISTS_GET_INDEX_RANDOM": "تصادفی", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "موردی در محل مشخص‌شده بر می‌گرداند. #1 اولین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "موردی در محل مشخص در فهرست بر می‌گرداند. #1 آخرین مورد است.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 اولین مورد است.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 آخرین مورد است.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "موردی در محل مشخص‌شده بر می‌گرداند.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "اولین مورد یک فهرست را بر می‌گرداند.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "آخرین مورد در یک فهرست را بر می‌گرداند.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "یک مورد تصادفی در یک فهرست بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند. #1 اولین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند. #1 آخرین مورد است.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "اولین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "آخرین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "مورد تصادفی‌ای را در فهرست حذف و بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند. #1 اولین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند. #1 آخرین مورد است.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "اولین مورد را در یک فهرست حذف می‌کند.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "آخرین مورد را در یک فهرست حذف می‌کند.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "یک مورد تصادفی را یک فهرست حذف می‌کند.", "LISTS_SET_INDEX_SET": "مجموعه", "LISTS_SET_INDEX_INSERT": "درج در", "LISTS_SET_INDEX_INPUT_TO": "به عنوان", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 اولین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 آخرین مورد است.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "اولین مورد در یک فهرست را تعیین می‌کند.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "آخرین مورد در یک فهرست را تعیین می‌کند.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "یک مورد تصادفی در یک فهرست را تعیین می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند. #1 اولین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند. #1 آخرین مورد است.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "موردی به ته فهرست اضافه می‌کند.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "موردی به ته فهرست الحاق می‌کند.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "مورد را به صورت تصادفی در یک فهرست می‌افزاید.", @@ -272,6 +271,11 @@ "LISTS_GET_SUBLIST_END_FROM_END": "به # از انتها", "LISTS_GET_SUBLIST_END_LAST": "به آخرین", "LISTS_GET_SUBLIST_TOOLTIP": "کپی از قسمت مشخص‌شدهٔ لیست درست می‌کند.", + "LISTS_SORT_ORDER_ASCENDING": "صعودی", + "LISTS_SORT_ORDER_DESCENDING": "نزولی", + "LISTS_SORT_TYPE_NUMERIC": "عددی", + "LISTS_SORT_TYPE_TEXT": "حروفی ، الفبایی", + "LISTS_SORT_TYPE_IGNORECASE": "حروفی ، رد کردن مورد", "LISTS_SPLIT_LIST_FROM_TEXT": "ایجاد فهرست از متن", "LISTS_SPLIT_TEXT_FROM_LIST": "ایجاد متن از فهرست", "LISTS_SPLIT_WITH_DELIMITER": "همراه جداساز", @@ -285,6 +289,7 @@ "PROCEDURES_BEFORE_PARAMS": "با:", "PROCEDURES_CALL_BEFORE_PARAMS": "با:", "PROCEDURES_DEFNORETURN_TOOLTIP": "تابعی می‌سازد بدون هیچ خروجی.", + "PROCEDURES_DEFNORETURN_COMMENT": "توصیف این عملکرد...", "PROCEDURES_DEFRETURN_RETURN": "بازگشت", "PROCEDURES_DEFRETURN_TOOLTIP": "تابعی با یک خروجی می‌سازد.", "PROCEDURES_ALLOW_STATEMENTS": "اجازه اظهارات", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/fi.json b/src/opsoro/server/static/js/blockly/msg/json/fi.json similarity index 90% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/fi.json rename to src/opsoro/server/static/js/blockly/msg/json/fi.json index 81c503f..030d0f8 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/fi.json +++ b/src/opsoro/server/static/js/blockly/msg/json/fi.json @@ -6,7 +6,11 @@ "Espertus", "Pettevi", "McSalama", - "Espeox" + "Espeox", + "SNuutti", + "PStudios", + "Mikahama", + "Pyscowicz" ] }, "VARIABLES_DEFAULT_NAME": "kohde", @@ -18,6 +22,8 @@ "INLINE_INPUTS": "Tuo syötteet", "DELETE_BLOCK": "Poista lohko", "DELETE_X_BLOCKS": "Poista %1 lohkoa", + "DELETE_ALL_BLOCKS": "Poistetaanko kaikki %1 lohkoa?", + "CLEAN_UP": "Siivoa lohkot", "COLLAPSE_BLOCK": "Sulje lohko", "COLLAPSE_ALL": "Sulje lohkot", "EXPAND_BLOCK": "Laajenna lohko", @@ -25,14 +31,16 @@ "DISABLE_BLOCK": "Passivoi lohko", "ENABLE_BLOCK": "Aktivoi lohko", "HELP": "Apua", - "CHAT": "Keskustele yhteistyökumppanisi kanssa tässä laatikossa!", - "AUTH": "Valtuuta tämä ohjelma jotta voit tallettaa työsi ja jakaa sen.", - "ME": "Minä", + "UNDO": "Kumoa", + "REDO": "Tee uudelleen", "CHANGE_VALUE_TITLE": "Muuta arvoa:", - "NEW_VARIABLE": "Uusi muuttuja...", - "NEW_VARIABLE_TITLE": "Uuden muuttujan nimi:", "RENAME_VARIABLE": "Nimeä uudelleen muuttuja...", "RENAME_VARIABLE_TITLE": "Nimeä uudelleen kaikki '%1' muuttujaa:", + "NEW_VARIABLE": "Luo muuttuja...", + "NEW_VARIABLE_TITLE": "Uuden muuttujan nimi:", + "VARIABLE_ALREADY_EXISTS": "Muuttuja nimeltään '%1' jo olemassa.", + "DELETE_VARIABLE_CONFIRMATION": "Poistetaanko %1 käyttöä muuttujalta '%2'?", + "DELETE_VARIABLE": "Poista muuttuja '%1'", "COLOUR_PICKER_HELPURL": "https://fi.wikipedia.org/wiki/V%C3%A4ri", "COLOUR_PICKER_TOOLTIP": "Valitse väri paletista.", "COLOUR_RANDOM_TITLE": "satunnainen väri", @@ -93,7 +101,7 @@ "LOGIC_BOOLEAN_TOOLTIP": "Palauttaa joko tosi tai epätosi.", "LOGIC_NULL": "ei mitään", "LOGIC_NULL_TOOLTIP": "Palauttaa \"ei mitään\"-arvon.", - "LOGIC_TERNARY_CONDITION": "ehto", + "LOGIC_TERNARY_CONDITION": "testi", "LOGIC_TERNARY_IF_TRUE": "jos tosi", "LOGIC_TERNARY_IF_FALSE": "jos epätosi", "LOGIC_TERNARY_TOOLTIP": "Tarkistaa testin ehdon. Jos ehto on tosi, palauttaa \"jos tosi\" arvon, muuten palauttaa \"jos epätosi\" arvon.", @@ -192,7 +200,7 @@ "TEXT_LENGTH_TOOLTIP": "Palauttaa annetussa tekstissä olevien merkkien määrän (välilyönnit mukaan lukien).", "TEXT_ISEMPTY_TITLE": "%1 on tyhjä", "TEXT_ISEMPTY_TOOLTIP": "Palauttaa tosi, jos annettu teksti on tyhjä.", - "TEXT_INDEXOF_TOOLTIP": "Palauttaa ensin annetun tekstin ensimmäisen/viimeisen esiintymän osoitteen toisessa tekstissä. Palauttaa osoitteen 0 jos tekstiä ei löytynyt.", + "TEXT_INDEXOF_TOOLTIP": "Palauttaa ensin annetun tekstin ensimmäisen/viimeisen esiintymän osoitteen toisessa tekstissä. Palauttaa osoitteen %1 jos tekstiä ei löytynyt.", "TEXT_INDEXOF_INPUT_INTEXT": "tekstistä", "TEXT_INDEXOF_OPERATOR_FIRST": "etsi ensimmäinen esiintymä merkkijonolle", "TEXT_INDEXOF_OPERATOR_LAST": "etsi viimeinen esiintymä merkkijonolle", @@ -220,7 +228,7 @@ "TEXT_TRIM_OPERATOR_LEFT": "poistaa välilyönnit vasemmalta puolelta", "TEXT_TRIM_OPERATOR_RIGHT": "poistaa välilyönnit oikealta puolelta", "TEXT_PRINT_TITLE": "tulosta %1", - "TEXT_PRINT_TOOLTIP": "Tulostaa annetun tekstin, numeron tia muun arvon.", + "TEXT_PRINT_TOOLTIP": "Tulostaa annetun tekstin, numeron tai muun arvon.", "TEXT_PROMPT_TYPE_TEXT": "käyttäen annettua viestiä, kehottaa syöttämään tekstiä", "TEXT_PROMPT_TYPE_NUMBER": "käyttäen annettua viestiä, kehottaa syöttämään numeron", "TEXT_PROMPT_TOOLTIP_NUMBER": "Kehottaa käyttäjää syöttämään numeron.", @@ -241,7 +249,7 @@ "LISTS_INLIST": "listassa", "LISTS_INDEX_OF_FIRST": "etsi ensimmäinen esiintymä kohteelle", "LISTS_INDEX_OF_LAST": "etsi viimeinen esiintymä kohteelle", - "LISTS_INDEX_OF_TOOLTIP": "Palauttaa kohteen ensimmäisen/viimeisen esiintymän kohdan. Palauttaa 0 jos tekstiä ei löydy.", + "LISTS_INDEX_OF_TOOLTIP": "Palauttaa kohteen ensimmäisen/viimeisen esiintymän kohdan listassa. Palauttaa %1 jos kohdetta ei löydy.", "LISTS_GET_INDEX_GET": "hae", "LISTS_GET_INDEX_GET_REMOVE": "hae ja poista", "LISTS_GET_INDEX_REMOVE": "poista", @@ -250,31 +258,28 @@ "LISTS_GET_INDEX_FIRST": "ensimmäinen", "LISTS_GET_INDEX_LAST": "viimeinen", "LISTS_GET_INDEX_RANDOM": "satunnainen", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Palauta kohde annetusta kohdasta listaa. Numero 1 tarkoittaa listan ensimmäistä kohdetta.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Palauta kohde annetusta kohdasta listaa. Numero 1 tarkoittaa listan viimeistä kohdetta.", + "LISTS_INDEX_FROM_START_TOOLTIP": "Numero %1 tarkoittaa listan ensimmäistä kohdetta.", + "LISTS_INDEX_FROM_END_TOOLTIP": "Numero %1 tarkoittaa listan viimeistä kohdetta.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Palauta kohde annetusta kohdasta listaa.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Palauta ensimmäinen kohde listalta.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Palauttaa listan viimeisen kohteen.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Palauttaa satunnaisen kohteen listalta.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Poistaa ja palauttaa kohteen annetusta kohden listaa. Nro 1 on ensimmäinen kohde.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Poistaa ja palauttaa kohteen annetusta kohden listaa. Nro 1 on ensimmäinen kohde.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Poistaa ja palauttaa kohteen listan annetusta kohdasta.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Poistaa ja palauttaa ensimmäisen kohteen listalta.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Poistaa ja palauttaa viimeisen kohteen listalta.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Poistaa ja palauttaa satunnaisen kohteen listalta.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Poistaa kohteen listalta annetusta kohtaa. Nro 1 on ensimmäinen kohde.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Poistaa kohteen listalta annetusta kohtaa. Nro 1 on viimeinen kohde.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Poistaa kohteen listalta annetusta kohtaa.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Poistaa ensimmäisen kohteen listalta.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Poistaa viimeisen kohteen listalta.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Poistaa satunnaisen kohteen listalta.", "LISTS_SET_INDEX_SET": "aseta", "LISTS_SET_INDEX_INSERT": "lisää kohtaan", "LISTS_SET_INDEX_INPUT_TO": "kohteeksi", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Asettaa kohteen määrättyyn kohtaa listassa. Nro 1 on listan alku.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Asettaa listan määrätyssä kohtaa olevan kohteen. Nro 1 on listan loppu.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Asettaa kohteen annettuun kohtaan listassa.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Asettaa listan ensimmäisen kohteen.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Asettaa listan viimeisen kohteen.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Asettaa satunnaisen kohteen listassa.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Lisää kohteen listan annettuun kohtaan. Nro 1 on listan kärki.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Lisää kohteen annettuun kohtaan listaa. Nro 1 on listan häntä.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Lisää kohteen annettuun kohtaan listassa.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Lisää kohteen listan kärkeen.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Lisää kohteen listan loppuun.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Lisää kohteen satunnaiseen kohtaan listassa.", @@ -285,10 +290,19 @@ "LISTS_GET_SUBLIST_END_FROM_END": "päättyen kohtaan (lopusta laskien)", "LISTS_GET_SUBLIST_END_LAST": "viimeinen", "LISTS_GET_SUBLIST_TOOLTIP": "Luo kopio määrätystä kohden listaa.", - "LISTS_SPLIT_LIST_FROM_TEXT": "tee listasta tekstiä", - "LISTS_SPLIT_TEXT_FROM_LIST": "tee tekstistä lista", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "lajittele %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Lajittele kopio luettelosta.", + "LISTS_SORT_ORDER_ASCENDING": "nouseva", + "LISTS_SORT_ORDER_DESCENDING": "laskeva", + "LISTS_SORT_TYPE_NUMERIC": "numeerinen", + "LISTS_SORT_TYPE_TEXT": "aakkosjärjestys", + "LISTS_SORT_TYPE_IGNORECASE": "aakkosjärjestyksessä, ohita kapitaalit", + "LISTS_SPLIT_LIST_FROM_TEXT": "tee lista tekstistä", + "LISTS_SPLIT_TEXT_FROM_LIST": "tee listasta teksti", "LISTS_SPLIT_WITH_DELIMITER": "erottimen kanssa", "LISTS_SPLIT_TOOLTIP_SPLIT": "Jaa teksti osiin erotinmerkin perusteella ja järjestä osat listaksi.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Yhdistä luettelon tekstit yhdeksi tekstiksi, erotettuina välimerkillä.", "VARIABLES_GET_TOOLTIP": "Palauttaa muuttujan arvon.", "VARIABLES_GET_CREATE_SET": "Luo 'aseta %1'", "VARIABLES_SET": "aseta %1 arvoksi %2", @@ -299,6 +313,7 @@ "PROCEDURES_BEFORE_PARAMS": "parametrit:", "PROCEDURES_CALL_BEFORE_PARAMS": "parametrit:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Luo funktio, jolla ei ole tuotosta.", + "PROCEDURES_DEFNORETURN_COMMENT": "Kuvaile tämä funktio...", "PROCEDURES_DEFRETURN_RETURN": "palauta", "PROCEDURES_DEFRETURN_TOOLTIP": "Luo funktio, jolla ei ole tuotosta.", "PROCEDURES_ALLOW_STATEMENTS": "salli kommentit", @@ -314,5 +329,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Korosta funktion määritelmä", "PROCEDURES_CREATE_DO": "Luo '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Jos arvo on tosi, palauta toinen arvo.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Varoitus: tätä lohkoa voi käyttää vain funktion määrityksessä." } diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/fr.json b/src/opsoro/server/static/js/blockly/msg/json/fr.json similarity index 78% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/fr.json rename to src/opsoro/server/static/js/blockly/msg/json/fr.json index df84746..741670a 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/fr.json +++ b/src/opsoro/server/static/js/blockly/msg/json/fr.json @@ -3,7 +3,12 @@ "authors": [ "Espertus", "Gomoko", - "ProfGra" + "ProfGra", + "Wladek92", + "Fredlefred", + "Grimault", + "Rixed", + "Frigory" ] }, "VARIABLES_DEFAULT_NAME": "élément", @@ -15,6 +20,8 @@ "INLINE_INPUTS": "Entrées en ligne", "DELETE_BLOCK": "Supprimer le bloc", "DELETE_X_BLOCKS": "Supprimer %1 blocs", + "DELETE_ALL_BLOCKS": "Supprimer ces %1 blocs ?", + "CLEAN_UP": "Nettoyer les blocs", "COLLAPSE_BLOCK": "Réduire le bloc", "COLLAPSE_ALL": "Réduire les blocs", "EXPAND_BLOCK": "Développer le bloc", @@ -22,44 +29,46 @@ "DISABLE_BLOCK": "Désactiver le bloc", "ENABLE_BLOCK": "Activer le bloc", "HELP": "Aide", - "CHAT": "Discuter avec votre collaborateur en tapant dans cette zone !", - "AUTH": "Veuillez autoriser cette application à permettre la sauvegarde de votre travail et à l’autoriser à la partager.", - "ME": "Moi", + "UNDO": "Annuler", + "REDO": "Refaire", "CHANGE_VALUE_TITLE": "Modifier la valeur :", - "NEW_VARIABLE": "Nouvelle variable…", - "NEW_VARIABLE_TITLE": "Nom de la nouvelle variable :", "RENAME_VARIABLE": "Renommer la variable…", - "RENAME_VARIABLE_TITLE": "Renommer toutes les variables '%1' en :", + "RENAME_VARIABLE_TITLE": "Renommer toutes les variables « %1 » en :", + "NEW_VARIABLE": "Créer une variable...", + "NEW_VARIABLE_TITLE": "Nouveau nom de la variable :", + "VARIABLE_ALREADY_EXISTS": "Une variable appelée '%1' existe déjà.", + "DELETE_VARIABLE_CONFIRMATION": "Supprimer %1 utilisations de la variable '%2' ?", + "DELETE_VARIABLE": "Supprimer la variable '%1'", "COLOUR_PICKER_HELPURL": "https://fr.wikipedia.org/wiki/Couleur", - "COLOUR_PICKER_TOOLTIP": "Choisir une couleur dans la palette", + "COLOUR_PICKER_TOOLTIP": "Choisir une couleur dans la palette.", "COLOUR_RANDOM_TITLE": "couleur aléatoire", "COLOUR_RANDOM_TOOLTIP": "Choisir une couleur au hasard.", "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "colorer avec", + "COLOUR_RGB_TITLE": "colorier avec", "COLOUR_RGB_RED": "rouge", "COLOUR_RGB_GREEN": "vert", "COLOUR_RGB_BLUE": "bleu", - "COLOUR_RGB_TOOLTIP": "Créer une couleur avec la quantité de rouge, vert et bleu. Les valeurs doivent être comprises entre 0 et 100.", + "COLOUR_RGB_TOOLTIP": "Créer une couleur avec la quantité spécifiée de rouge, vert et bleu. Les valeurs doivent être comprises entre 0 et 100.", "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", "COLOUR_BLEND_TITLE": "mélanger", "COLOUR_BLEND_COLOUR1": "couleur 1", "COLOUR_BLEND_COLOUR2": "couleur 2", - "COLOUR_BLEND_RATIO": "ratio", - "COLOUR_BLEND_TOOLTIP": "Mélange deux couleurs avec un ratio donné (de 0.0 à 1.0).", + "COLOUR_BLEND_RATIO": "taux", + "COLOUR_BLEND_TOOLTIP": "Mélange deux couleurs dans une proportion donnée (de 0.0 à 1.0).", "CONTROLS_REPEAT_HELPURL": "http://fr.wikipedia.org/wiki/Boucle_for", "CONTROLS_REPEAT_TITLE": "répéter %1 fois", "CONTROLS_REPEAT_INPUT_DO": "faire", - "CONTROLS_REPEAT_TOOLTIP": "Exécuter certains ordres plusieurs fois.", + "CONTROLS_REPEAT_TOOLTIP": "Exécuter des instructions plusieurs fois.", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "répéter tant que", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "répéter jusqu’à", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Tant qu’une valeur est vraie, alors exécuter certains ordres.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Tant qu’une valeur est fausse, alors exécuter certains ordres.", - "CONTROLS_FOR_TOOLTIP": "Faire en sorte que la variable « %1 » prenne les valeurs depuis le numéro de début jusqu’au numéro de fin, en s’incrémentant de l’intervalle spécifié, et exécuter les ordres spécifiés.", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Tant qu’une valeur est vraie, alors exécuter des instructions.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Tant qu’une valeur est fausse, alors exécuter des instructions.", + "CONTROLS_FOR_TOOLTIP": "Faire prendre à la variable « %1 » les valeurs depuis le nombre de début jusqu’au nombre de fin, en s’incrémentant du pas spécifié, et exécuter les instructions spécifiées.", "CONTROLS_FOR_TITLE": "compter avec %1 de %2 à %3 par %4", "CONTROLS_FOREACH_TITLE": "pour chaque élément %1 dans la liste %2", - "CONTROLS_FOREACH_TOOLTIP": "Pour chaque élément dans une liste, donner la valeur de l’élément à la variable '%1', puis exécuter certains ordres.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "sortir de la boucle", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "continuer avec la prochaine itération de la boucle", + "CONTROLS_FOREACH_TOOLTIP": "Pour chaque élément d’une liste, assigner la valeur de l’élément à la variable '%1', puis exécuter des instructions.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "quitter la boucle", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "passer à l’itération de boucle suivante", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Sortir de la boucle englobante.", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Sauter le reste de cette boucle, et poursuivre avec l’itération suivante.", "CONTROLS_FLOW_STATEMENTS_WARNING": "Attention : Ce bloc ne devrait être utilisé que dans une boucle.", @@ -73,9 +82,9 @@ "CONTROLS_IF_IF_TOOLTIP": "Ajouter, supprimer ou réordonner les sections pour reconfigurer ce bloc si.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Ajouter une condition au bloc si.", "CONTROLS_IF_ELSE_TOOLTIP": "Ajouter une condition finale fourre-tout au bloc si.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_HELPURL": "https://fr.wikipedia.org/wiki/Inegalite_(mathematiques)", "LOGIC_COMPARE_TOOLTIP_EQ": "Renvoyer vrai si les deux entrées sont égales.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Renvoyer vrai si les deux entrées ne sont pas égales.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Renvoyer vrai si les deux entrées sont différentes.", "LOGIC_COMPARE_TOOLTIP_LT": "Renvoyer vrai si la première entrée est plus petite que la seconde.", "LOGIC_COMPARE_TOOLTIP_LTE": "Renvoyer vrai si la première entrée est plus petite ou égale à la seconde.", "LOGIC_COMPARE_TOOLTIP_GT": "Renvoyer vrai si la première entrée est plus grande que la seconde.", @@ -97,18 +106,18 @@ "LOGIC_TERNARY_IF_TRUE": "si vrai", "LOGIC_TERNARY_IF_FALSE": "si faux", "LOGIC_TERNARY_TOOLTIP": "Vérifier la condition dans 'test'. Si elle est vraie, renvoie la valeur 'si vrai' ; sinon renvoie la valeur 'si faux'.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", + "MATH_NUMBER_HELPURL": "https://fr.wikipedia.org/wiki/Nombre", "MATH_NUMBER_TOOLTIP": "Un nombre.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_ARITHMETIC_HELPURL": "https://fr.wikipedia.org/wiki/Arithmetique", "MATH_ARITHMETIC_TOOLTIP_ADD": "Renvoie la somme des deux nombres.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Renvoie la différence des deux nombres.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Renvoie le produit des deux nombres.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Renvoie le quotient des deux nombres.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Renvoie le premier nombre élevé à la puissance du second.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_HELPURL": "https://fr.wikipedia.org/wiki/Racine_carree", "MATH_SINGLE_OP_ROOT": "racine carrée", "MATH_SINGLE_TOOLTIP_ROOT": "Renvoie la racine carrée d’un nombre.", - "MATH_SINGLE_OP_ABSOLUTE": "absolu", + "MATH_SINGLE_OP_ABSOLUTE": "valeur absolue", "MATH_SINGLE_TOOLTIP_ABS": "Renvoie la valeur absolue d’un nombre.", "MATH_SINGLE_TOOLTIP_NEG": "Renvoie l’opposé d’un nombre", "MATH_SINGLE_TOOLTIP_LN": "Renvoie le logarithme naturel d’un nombre.", @@ -138,8 +147,8 @@ "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Arrondir un nombre au-dessus ou au-dessous.", "MATH_ROUND_OPERATOR_ROUND": "arrondir", - "MATH_ROUND_OPERATOR_ROUNDUP": "arrondir au supérieur", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "arrondir à l’inférieur", + "MATH_ROUND_OPERATOR_ROUNDUP": "arrondir par excès", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "arrondir par défaut", "MATH_ONLIST_OPERATOR_SUM": "somme de la liste", "MATH_ONLIST_TOOLTIP_SUM": "Renvoyer la somme de tous les nombres dans la liste.", "MATH_ONLIST_OPERATOR_MIN": "minimum de la liste", @@ -149,7 +158,7 @@ "MATH_ONLIST_OPERATOR_AVERAGE": "moyenne de la liste", "MATH_ONLIST_TOOLTIP_AVERAGE": "Renvoyer la moyenne (arithmétique) des valeurs numériques dans la liste.", "MATH_ONLIST_OPERATOR_MEDIAN": "médiane de la liste", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Renvoyer le nombre médian dans la liste.", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Renvoyer le nombre médian de la liste.", "MATH_ONLIST_OPERATOR_MODE": "majoritaires de la liste", "MATH_ONLIST_TOOLTIP_MODE": "Renvoyer une liste des élément(s) le(s) plus courant(s) dans la liste.", "MATH_ONLIST_OPERATOR_STD_DEV": "écart-type de la liste", @@ -158,7 +167,7 @@ "MATH_ONLIST_TOOLTIP_RANDOM": "Renvoyer un élément dans la liste au hasard.", "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "reste de %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Renvoyer le reste de la division des deux nombres.", + "MATH_MODULO_TOOLTIP": "Renvoyer le reste de la division euclidienne des deux nombres.", "MATH_CONSTRAIN_TITLE": "contraindre %1 entre %2 et %3", "MATH_CONSTRAIN_TOOLTIP": "Contraindre un nombre à être entre les limites spécifiées (incluses).", "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", @@ -169,7 +178,7 @@ "MATH_RANDOM_FLOAT_TOOLTIP": "Renvoyer une fraction aléatoire entre 0.0 (inclus) et 1.0 (exclus).", "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Une lettre, un mot ou une ligne de texte.", - "TEXT_JOIN_TITLE_CREATEWITH": "créer le texte avec", + "TEXT_JOIN_TITLE_CREATEWITH": "créer un texte avec", "TEXT_JOIN_TOOLTIP": "Créer un morceau de texte en agrégeant un nombre quelconque d’éléments.", "TEXT_CREATE_JOIN_TITLE_JOIN": "joindre", "TEXT_CREATE_JOIN_TOOLTIP": "Ajouter, supprimer, ou réordonner des sections pour reconfigurer ce bloc de texte.", @@ -181,7 +190,7 @@ "TEXT_LENGTH_TOOLTIP": "Renvoie le nombre de lettres (espaces compris) dans le texte fourni.", "TEXT_ISEMPTY_TITLE": "%1 est vide", "TEXT_ISEMPTY_TOOLTIP": "Renvoie vrai si le texte fourni est vide.", - "TEXT_INDEXOF_TOOLTIP": "Renvoie l’index de la première/dernière occurrence de la première chaîne dans la seconde. Renvoie 0 si la chaîne n’est pas trouvée.", + "TEXT_INDEXOF_TOOLTIP": "Renvoie l’index de la première/dernière occurrence de la première chaîne dans la seconde. Renvoie %1 si la chaîne n’est pas trouvée.", "TEXT_INDEXOF_INPUT_INTEXT": "dans le texte", "TEXT_INDEXOF_OPERATOR_FIRST": "trouver la première occurrence de la chaîne", "TEXT_INDEXOF_OPERATOR_LAST": "trouver la dernière occurrence de la chaîne", @@ -214,6 +223,15 @@ "TEXT_PROMPT_TYPE_NUMBER": "invite pour un nombre avec un message", "TEXT_PROMPT_TOOLTIP_NUMBER": "Demander un nombre à l’utilisateur.", "TEXT_PROMPT_TOOLTIP_TEXT": "Demander un texte à l’utilisateur.", + "TEXT_COUNT_MESSAGE0": "nombre %1 sur %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Compter combien de fois un texte donné apparait dans un autre.", + "TEXT_REPLACE_MESSAGE0": "remplacer %1 par %2 dans %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Remplacer toutes les occurrences d’un texte par un autre.", + "TEXT_REVERSE_MESSAGE0": "inverser %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Inverse l’ordre des caractères dans le texte.", "LISTS_CREATE_EMPTY_TITLE": "créer une liste vide", "LISTS_CREATE_EMPTY_TOOLTIP": "Renvoyer une liste, de longueur 0, ne contenant aucun enregistrement", "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", @@ -231,7 +249,7 @@ "LISTS_INLIST": "dans la liste", "LISTS_INDEX_OF_FIRST": "trouver la première occurrence de l’élément", "LISTS_INDEX_OF_LAST": "trouver la dernière occurrence de l’élément", - "LISTS_INDEX_OF_TOOLTIP": "Renvoie l’index de la première/dernière occurrence de l’élément dans la liste. Renvoie 0 si le texte n’est pas trouvé.", + "LISTS_INDEX_OF_TOOLTIP": "Renvoie l’index de la première/dernière occurrence de l’élément dans la liste. Renvoie %1 si l'élément n'est pas trouvé.", "LISTS_GET_INDEX_GET": "obtenir", "LISTS_GET_INDEX_GET_REMOVE": "obtenir et supprimer", "LISTS_GET_INDEX_REMOVE": "supprimer", @@ -239,31 +257,28 @@ "LISTS_GET_INDEX_FIRST": "premier", "LISTS_GET_INDEX_LAST": "dernier", "LISTS_GET_INDEX_RANDOM": "aléatoire", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Renvoie l’élément à la position indiquée dans une liste. #1 est le premier élément.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Renvoie l’élément à la position indiquée dans une liste. #1 est le dernier élément.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 est le premier élément.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 est le dernier élément.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Renvoie l’élément à la position indiquée dans une liste.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Renvoie le premier élément dans une liste.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Renvoie le dernier élément dans une liste.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Renvoie un élément au hasard dans une liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Supprime et renvoie l’élément à la position indiquée dans une liste. #1 est le premier élément.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Supprime et renvoie l’élément à la position indiquée dans une liste. #1 est le dernier élément.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Supprime et renvoie l’élément à la position indiquée dans une liste.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Supprime et renvoie le premier élément dans une liste.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Supprime et renvoie le dernier élément dans une liste.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Supprime et renvoie un élément au hasard dans une liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Supprime l’élément à la position indiquée dans une liste. #1 est le premier élément.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Supprime l’élément à la position indiquée dans une liste. #1 est le dernier élément.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Supprime l’élément à la position indiquée dans une liste.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Supprime le premier élément dans une liste.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Supprime le dernier élément dans une liste.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Supprime un élément au hasard dans une liste.", "LISTS_SET_INDEX_SET": "mettre", "LISTS_SET_INDEX_INSERT": "insérer en", "LISTS_SET_INDEX_INPUT_TO": "comme", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Fixe l’élément à la position indiquée dans une liste. #1 est le premier élément.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Fixe l’élément à la position indiquée dans une liste. #1 est le dernier élément.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Met à jour l’élément à la position indiquée dans une liste.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Fixe le premier élément dans une liste.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Fixe le dernier élément dans une liste.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Fixe un élément au hasard dans une liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Insère l’élément à la position indiquée dans une liste. #1 est le premier élément.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Insère l’élément à la position indiquée dans une liste. #1 est le dernier élément.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Insère l’élément à la position indiquée dans une liste.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Insère l’élément au début d’une liste.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Ajouter l’élément à la fin d’une liste.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Insère l’élément au hasard dans une liste.", @@ -274,29 +289,41 @@ "LISTS_GET_SUBLIST_END_FROM_END": "jusqu’à # depuis la fin", "LISTS_GET_SUBLIST_END_LAST": "jusqu’à la fin", "LISTS_GET_SUBLIST_TOOLTIP": "Crée une copie de la partie spécifiée d’une liste.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "trier %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Trier une copie d’une liste.", + "LISTS_SORT_ORDER_ASCENDING": "croissant", + "LISTS_SORT_ORDER_DESCENDING": "décroissant", + "LISTS_SORT_TYPE_NUMERIC": "numérique", + "LISTS_SORT_TYPE_TEXT": "alphabétique", + "LISTS_SORT_TYPE_IGNORECASE": "alphabétique, en ignorant la casse", "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "créer une liste depuis le texte", "LISTS_SPLIT_TEXT_FROM_LIST": "créer un texte depuis la liste", "LISTS_SPLIT_WITH_DELIMITER": "avec le séparateur", "LISTS_SPLIT_TOOLTIP_SPLIT": "Couper un texte en une liste de textes, en coupant à chaque séparateur.", "LISTS_SPLIT_TOOLTIP_JOIN": "Réunir une liste de textes en un seul, en les séparant par un séparateur.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "inverser %1", + "LISTS_REVERSE_TOOLTIP": "Inverser la copie d’une liste.", "VARIABLES_GET_TOOLTIP": "Renvoie la valeur de cette variable.", "VARIABLES_GET_CREATE_SET": "Créer 'fixer %1'", "VARIABLES_SET": "fixer %1 à %2", "VARIABLES_SET_TOOLTIP": "Fixe cette variable pour qu’elle soit égale à la valeur de l’entrée.", "VARIABLES_SET_CREATE_GET": "Créer 'obtenir %1'", - "PROCEDURES_DEFNORETURN_TITLE": "à", + "PROCEDURES_DEFNORETURN_TITLE": "pour", "PROCEDURES_DEFNORETURN_PROCEDURE": "faire quelque chose", "PROCEDURES_BEFORE_PARAMS": "avec :", "PROCEDURES_CALL_BEFORE_PARAMS": "avec :", "PROCEDURES_DEFNORETURN_TOOLTIP": "Crée une fonction sans sortie.", + "PROCEDURES_DEFNORETURN_COMMENT": "Décrire cette fonction…", "PROCEDURES_DEFRETURN_RETURN": "retour", "PROCEDURES_DEFRETURN_TOOLTIP": "Crée une fonction avec une sortie.", "PROCEDURES_ALLOW_STATEMENTS": "autoriser les ordres", "PROCEDURES_DEF_DUPLICATE_WARNING": "Attention : Cette fonction a des paramètres en double.", - "PROCEDURES_CALLNORETURN_HELPURL": "http://fr.wikipedia.org/wiki/Proc%C3%A9dure_%28informatique%29", + "PROCEDURES_CALLNORETURN_HELPURL": "https://fr.wikipedia.org/wiki/Sous-programme", "PROCEDURES_CALLNORETURN_TOOLTIP": "Exécuter la fonction '%1' définie par l’utilisateur.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLRETURN_HELPURL": "https://fr.wikipedia.org/wiki/Sous-programme", "PROCEDURES_CALLRETURN_TOOLTIP": "Exécuter la fonction '%1' définie par l’utilisateur et utiliser son résultat.", "PROCEDURES_MUTATORCONTAINER_TITLE": "entrées", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Ajouter, supprimer, ou réarranger les entrées de cette fonction.", @@ -305,5 +332,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Surligner la définition de la fonction", "PROCEDURES_CREATE_DO": "Créer '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Si une valeur est vraie, alors renvoyer une seconde valeur.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Attention : Ce bloc pourrait n’être utilisé que dans une définition de fonction." } diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/he.json b/src/opsoro/server/static/js/blockly/msg/json/he.json similarity index 82% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/he.json rename to src/opsoro/server/static/js/blockly/msg/json/he.json index f0d260b..69deb47 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/he.json +++ b/src/opsoro/server/static/js/blockly/msg/json/he.json @@ -9,18 +9,22 @@ "Noamrotem", "Dvb", "LaG roiL", - "아라" + "아라", + "Elyashiv", + "Guycn2" ] }, "VARIABLES_DEFAULT_NAME": "פריט", "TODAY": "היום", "DUPLICATE_BLOCK": "שכפל", "ADD_COMMENT": "הוסף תגובה", - "REMOVE_COMMENT": "הסר הערה", + "REMOVE_COMMENT": "הסר תגובה", "EXTERNAL_INPUTS": "קלטים חיצוניים", "INLINE_INPUTS": "קלטים פנימיים", "DELETE_BLOCK": "מחק קטע קוד", "DELETE_X_BLOCKS": "מחק %1 קטעי קוד", + "DELETE_ALL_BLOCKS": "האם למחוק את כל %1 קטעי הקוד?", + "CLEAN_UP": "סידור בלוקים", "COLLAPSE_BLOCK": "צמצם קטע קוד", "COLLAPSE_ALL": "צמצם קטעי קוד", "EXPAND_BLOCK": "הרחב קטע קוד", @@ -28,14 +32,13 @@ "DISABLE_BLOCK": "נטרל קטע קוד", "ENABLE_BLOCK": "הפעל קטע קוד", "HELP": "עזרה", - "CHAT": "שוחח עם משתף פעולה שלך על-ידי הקלדה בתיבה זו!", - "AUTH": "בבקשה נא לאשר את היישום הזה כדי לאפשר לעבודה שלך להישמר וכדי לאפשר את השיתוף על ידיך.", - "ME": "אותי", + "UNDO": "ביטול", + "REDO": "ביצוע חוזר", "CHANGE_VALUE_TITLE": "שנה ערך:", - "NEW_VARIABLE": "משתנה חדש...", - "NEW_VARIABLE_TITLE": "שם המשתנה החדש:", "RENAME_VARIABLE": "שנה את שם המשתנה...", "RENAME_VARIABLE_TITLE": "שנה את שם כל '%1' המשתנים ל:", + "NEW_VARIABLE": "משתנה חדש...", + "NEW_VARIABLE_TITLE": "שם המשתנה החדש:", "COLOUR_PICKER_HELPURL": "http://he.wikipedia.org/wiki/%D7%A6%D7%91%D7%A2", "COLOUR_PICKER_TOOLTIP": "בחר צבע מן הצבעים.", "COLOUR_RANDOM_TITLE": "צבע אקראי", @@ -50,6 +53,7 @@ "COLOUR_BLEND_COLOUR2": "צבע 2", "COLOUR_BLEND_RATIO": "יחס", "COLOUR_BLEND_TOOLTIP": "מערבב שני צבעים יחד עם יחס נתון(0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "http://he.wikipedia.org/wiki/בקרת_זרימה", "CONTROLS_REPEAT_TITLE": "חזור על הפעולה %1 פעמים", "CONTROLS_REPEAT_INPUT_DO": "תעשה", "CONTROLS_REPEAT_TOOLTIP": "לעשות כמה פעולות מספר פעמים.", @@ -86,6 +90,7 @@ "LOGIC_OPERATION_TOOLTIP_OR": "תחזיר נכון אם מתקיים לפחות אחד מהקלטים נכונים.", "LOGIC_OPERATION_OR": "או", "LOGIC_NEGATE_TITLE": "לא %1", + "LOGIC_NEGATE_TOOLTIP": "החזר אמת אם הקלט הוא שקר. החזר שקר אם הקלט אמת.", "LOGIC_BOOLEAN_TRUE": "נכון", "LOGIC_BOOLEAN_FALSE": "שגוי", "LOGIC_BOOLEAN_TOOLTIP": "תחזיר אם נכון או אם שגוי.", @@ -95,6 +100,7 @@ "LOGIC_TERNARY_IF_TRUE": "אם נכון", "LOGIC_TERNARY_IF_FALSE": "אם שגוי", "LOGIC_TERNARY_TOOLTIP": "בדוק את התנאי ב'מבחן'. אם התנאי נכון, תחזיר את הערך 'אם נכון'; אחרת תחזיר את הערך 'אם שגוי'.", + "MATH_NUMBER_HELPURL": "https://he.wikipedia.org/wiki/מספר_ממשי", "MATH_NUMBER_TOOLTIP": "מספר.", "MATH_ADDITION_SYMBOL": "+", "MATH_SUBTRACTION_SYMBOL": "-", @@ -111,11 +117,22 @@ "MATH_ARITHMETIC_TOOLTIP_ADD": "תחזיר את סכום שני המספרים.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "החזרת ההפרש בין שני מספרים.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "החזרת תוצאת הכפל בין שני מספרים.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "החזרת המנה של שני המספרים.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "החזרת המספר הראשון בחזקת המספר השני.", + "MATH_SINGLE_HELPURL": "https://he.wikipedia.org/wiki/שורש_ריבועי", "MATH_SINGLE_OP_ROOT": "שורש ריבועי", + "MATH_SINGLE_TOOLTIP_ROOT": "החזרת השורש הריבועי של מספר.", "MATH_SINGLE_OP_ABSOLUTE": "ערך מוחלט", "MATH_SINGLE_TOOLTIP_ABS": "החזרת הערך המוחלט של מספר.", "MATH_SINGLE_TOOLTIP_NEG": "החזרת הערך הנגדי של מספר.", "MATH_SINGLE_TOOLTIP_LN": "החזרת הלוגריתם הטבעי של מספר.", + "MATH_SINGLE_TOOLTIP_LOG10": "החזרת הלוגריתם לפי בסיס עשר של מספר.", + "MATH_SINGLE_TOOLTIP_EXP": "החזרת e בחזקת מספר.", + "MATH_SINGLE_TOOLTIP_POW10": "החזרת 10 בחזקת מספר.", + "MATH_TRIG_HELPURL": "https://he.wikipedia.org/wiki/פונקציות_טריגונומטריות", + "MATH_TRIG_TOOLTIP_SIN": "החזרת הסינוס של מעלה (לא רדיאן).", + "MATH_TRIG_TOOLTIP_COS": "החזרת הקוסינוס של מעלה (לא רדיאן).", + "MATH_TRIG_TOOLTIP_TAN": "החזרת הטנגס של מעלה (לא רדיאן).", "MATH_IS_EVEN": "זוגי", "MATH_IS_ODD": "אי-זוגי", "MATH_IS_PRIME": "ראשוני", @@ -123,12 +140,15 @@ "MATH_IS_POSITIVE": "חיובי", "MATH_IS_NEGATIVE": "שלילי", "MATH_IS_DIVISIBLE_BY": "מתחלק ב", + "MATH_CHANGE_TITLE": "שינוי %1 על־ידי %2", "MATH_CHANGE_TOOLTIP": "הוסף מספר למשתנה '%1'.", + "MATH_ROUND_HELPURL": "https://he.wikipedia.org/wiki/עיגול_(אריתמטיקה)", "MATH_ROUND_TOOLTIP": "עיגול מספר למעלה או למטה.", "MATH_ROUND_OPERATOR_ROUND": "עיגול", "MATH_ROUND_OPERATOR_ROUNDUP": "עיגול למעלה", "MATH_ROUND_OPERATOR_ROUNDDOWN": "עיגול למטה", "MATH_ONLIST_OPERATOR_SUM": "סכום של רשימה", + "MATH_ONLIST_TOOLTIP_SUM": "החזרת הסכום של המספרים ברשימה.", "MATH_ONLIST_OPERATOR_MIN": "מינימום של רשימה", "MATH_ONLIST_TOOLTIP_MIN": "תחזיר את המספר הקטן ביותר ברשימה.", "MATH_ONLIST_OPERATOR_MAX": "מקסימום של רשימה", @@ -137,15 +157,20 @@ "MATH_ONLIST_OPERATOR_MEDIAN": "חציון של רשימה", "MATH_ONLIST_TOOLTIP_MEDIAN": "תחזיר את המספר החיצוני ביותר ברשימה.", "MATH_ONLIST_OPERATOR_MODE": "שכיחי הרשימה", + "MATH_ONLIST_TOOLTIP_MODE": "החזרת רשימה של הפריטים הנפוצים ביותר ברשימה", "MATH_ONLIST_OPERATOR_RANDOM": "פריט אקראי מרשימה", "MATH_ONLIST_TOOLTIP_RANDOM": "תחזיר רכיב אקראי מרשימה.", "MATH_MODULO_TITLE": "שארית החילוק %1 ÷ %2", "MATH_MODULO_TOOLTIP": "החזרת השארית מחלוקת שני המספרים.", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "שבר אקראי", + "TEXT_TEXT_TOOLTIP": "אות, מילה, או שורת טקסט.", "TEXT_JOIN_TITLE_CREATEWITH": "יצירת טקסט עם", "TEXT_CREATE_JOIN_TITLE_JOIN": "צירוף", "TEXT_APPEND_TO": "אל", "TEXT_APPEND_APPENDTEXT": "הוספת טקסט", + "TEXT_INDEXOF_TOOLTIP": "מחזירה את האינדקס של המופע הראשון/האחרון בטקסט הראשון לתוך הטקסט השני. מחזירה %1 אם הטקסט אינו נמצא.", + "TEXT_GET_SUBSTRING_END_FROM_START": "לאות #", + "TEXT_GET_SUBSTRING_END_FROM_END": "לאות # מהסוף", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "לאותיות גדולות (עבור טקסט באנגלית)", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "לאותיות קטנות (עבור טקסט באנגלית)", "TEXT_CHANGECASE_OPERATOR_TITLECASE": "לאותיות גדולות בתחילת כל מילה (עבור טקסט באנגלית)", @@ -175,7 +200,7 @@ "LISTS_INLIST": "ברשימה", "LISTS_INDEX_OF_FIRST": "מחזירה את המיקום הראשון של פריט ברשימה", "LISTS_INDEX_OF_LAST": "מחזירה את המיקום האחרון של פריט ברשימה", - "LISTS_INDEX_OF_TOOLTIP": "מחזירה את האינדקס של המופע ראשון/אחרון של הפריט ברשימה. מחזירה 0 אם טקסט אינו נמצא.", + "LISTS_INDEX_OF_TOOLTIP": "מחזירה את האינדקס של המופע הראשון/האחרון של הפריט ברשימה. מחזירה %1 אם הפריט אינו נמצא.", "LISTS_GET_INDEX_GET": "לקבל", "LISTS_GET_INDEX_GET_REMOVE": "קבל ומחק", "LISTS_GET_INDEX_REMOVE": "הסרה", @@ -184,31 +209,28 @@ "LISTS_GET_INDEX_FIRST": "ראשון", "LISTS_GET_INDEX_LAST": "אחרון", "LISTS_GET_INDEX_RANDOM": "אקראי", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "מחזיר פריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "מחזיר פריט במיקום שצוין ברשימה. #1 הוא הפריט האחרון.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 הוא הפריט הראשון.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 הוא הפריט האחרון.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "מחזיר פריט במיקום שצוין ברשימה.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "מחזיר את הפריט הראשון ברשימה.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "מחזיר את הפריט האחרון ברשימה.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "מחזיר פריט אקראי מהרשימה.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "מסיר ומחזיר את הפריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "מסיר ומחזיר את הפריט במיקום שצוין ברשימה. #1 הוא הפריט האחרון.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "מסיר ומחזיר את הפריט במיקום שצוין ברשימה.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "מסיר ומחזיר את הפריט הראשון ברשימה.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "מסיר ומחזיר את הפריט האחרון ברשימה.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "מחק והחזר פריט אקראי מהרשימה.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "מחזיר פריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "מחזיר פריט במיקום שצוין ברשימה. #1 הוא הפריט האחרון.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "מחזיר פריט במיקום שצוין ברשימה.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "הסר את הפריט הראשון ברשימה.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "הסר את הפריט הראשון ברשימה.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "הסר פריט אקראי ברשימה.", "LISTS_SET_INDEX_SET": "הגדר", "LISTS_SET_INDEX_INSERT": "הכנס ב", "LISTS_SET_INDEX_INPUT_TO": "כמו", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "מגדיר את הפריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "מגדיר את הפריט במיקום שצוין ברשימה. #1 הוא הפריט האחרון.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "מגדיר את הפריט במיקום שצוין ברשימה.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "מגדיר את הפריט הראשון ברשימה.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "מגדיר את הפריט האחרון ברשימה.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "מגדיר פריט אקראי ברשימה.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "מכניס את הפריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "מכניס את הפריט במיקום שצוין ברשימה. #1 הוא הפריט האחרון.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "מכניס את הפריט במיקום שצוין ברשימה.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "מכניס את הפריט בתחילת רשימה.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "מוסיף את הפריט בסוף רשימה.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "הוסף פריט באופן אקראי ברשימה.", @@ -219,6 +241,11 @@ "LISTS_GET_SUBLIST_END_FROM_END": "ל # מהסוף", "LISTS_GET_SUBLIST_END_LAST": "לאחרון", "LISTS_GET_SUBLIST_TOOLTIP": "יוצרת עותק של חלק מסוים מהרשימה.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_ORDER_ASCENDING": "סדר עולה", + "LISTS_SORT_ORDER_DESCENDING": "סדר יורד", + "LISTS_SORT_TYPE_TEXT": "סדר אלפביתי", + "LISTS_SORT_TYPE_IGNORECASE": "סדר אלפביתי, לא תלוי רישיות", "LISTS_SPLIT_LIST_FROM_TEXT": "יצירת רשימה מטקסט", "LISTS_SPLIT_TEXT_FROM_LIST": "יצירת טקסט מרשימה", "VARIABLES_GET_TOOLTIP": "להחזיר את הערך של משתנה זה.", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/hi.json b/src/opsoro/server/static/js/blockly/msg/json/hi.json similarity index 94% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/hi.json rename to src/opsoro/server/static/js/blockly/msg/json/hi.json index f2d06f5..1fc937c 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/hi.json +++ b/src/opsoro/server/static/js/blockly/msg/json/hi.json @@ -3,7 +3,9 @@ "authors": [ "Bl707", "संजीव कुमार", - "Phoenix303" + "Phoenix303", + "Sfic", + "Earlyengineers" ] }, "VARIABLES_DEFAULT_NAME": "आइटम", @@ -22,14 +24,14 @@ "DISABLE_BLOCK": "ब्लॉक को अक्षम करें", "ENABLE_BLOCK": "ब्लॉक को सक्षम करें", "HELP": "सहायता", - "CHAT": "इस सन्दूक में लिखकर हमारे सहयोगी के साथ बातचीत करें!", - "AUTH": "अपने कार्य को सहेजना सक्षम करने और अपने साथ इसे साझा करने हेतु कृपया इस एप्प को अधिकृत करें।", - "ME": "मैं", + "UNDO": "पूर्ववत करें", + "REDO": "फिर से करें", "CHANGE_VALUE_TITLE": "मान परिवर्तित करें:", - "NEW_VARIABLE": "नया चर...", - "NEW_VARIABLE_TITLE": "नए चर का नाम:", "RENAME_VARIABLE": "चर का नाम बदलें...", "RENAME_VARIABLE_TITLE": "सभी '%1' चरों के नाम बदलें:", + "NEW_VARIABLE": "चर बनाएँ...", + "NEW_VARIABLE_TITLE": "नए चर का नाम:", + "VARIABLE_ALREADY_EXISTS": "प्राचल नाम '%1' पहले से मौजूद है।", "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "पैलेट से एक रंग चुनें।", "COLOUR_RANDOM_TITLE": "रैन्डम रंग", @@ -205,8 +207,8 @@ "LISTS_GET_INDEX_GET_REMOVE": "प्राप्त करे और हटाए", "LISTS_GET_INDEX_REMOVE": "निकालें", "LISTS_GET_INDEX_FROM_END": "अंत से #", - "LISTS_GET_INDEX_FIRST": "पहला", - "LISTS_GET_INDEX_LAST": "आखिरी", + "LISTS_GET_INDEX_FIRST": "%1 पहला आइटम है।", + "LISTS_GET_INDEX_LAST": "%1 आखरी आइटम है।", "LISTS_GET_INDEX_RANDOM": "रैन्डम", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "सूची का पहला आइटम रिटर्न करता है।", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "सूची का आखरी आइटम रिटर्न करता है।", @@ -218,17 +220,16 @@ "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "सूची का आखरी आइटम निकालता है।", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "सूची से रैन्डम आइटम निकालता है।", "LISTS_SET_INDEX_SET": "सैट करें", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "सूची मे बताए गये स्थान में आइटम सैट करता है। #1 पहला आइटम है।", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "सूची मे बताए गये स्थान में आइटम सैट करता है। #1 आखरी आइटम है।", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "सूची मे बताए गये स्थान में आइटम सैट करता है।", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "सूची में पहला आइटम सैट करता है।", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "सूची में आखरी आइटम सैट करता है।", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "सूची में रैन्डम आइटम सैट करता है।", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "सूची मे बताए गये स्थान में आइटम इनसर्ट करता है। #1 पहला आइटम है।", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "सूची मे बताए गये स्थान में आइटम इनसर्ट करता है। #1 आखरी आइटम है।", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "सूची मे बताए गये स्थान में आइटम इनसर्ट करता है।", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "आइटम को सूची के शुरू में इनसर्ट करता है।", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "आइटम को सूची के अंत में जोड़ता है।", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "आइटम को सूची में रैन्डम्ली इनसर्ट करता है।", "LISTS_GET_SUBLIST_TOOLTIP": "सूची के बताए गये भाग की कॉपी बनता है।", + "LISTS_SORT_TYPE_NUMERIC": "अंकीय", "VARIABLES_GET_TOOLTIP": "इस चर का मान रिटर्न करता है।", "VARIABLES_GET_CREATE_SET": "सेट '%1' बनाएँ", "VARIABLES_SET": "सेट करें %1 को %2", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/hrx.json b/src/opsoro/server/static/js/blockly/msg/json/hrx.json similarity index 93% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/hrx.json rename to src/opsoro/server/static/js/blockly/msg/json/hrx.json index 61748a5..8f9e8c7 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/hrx.json +++ b/src/opsoro/server/static/js/blockly/msg/json/hrx.json @@ -12,6 +12,7 @@ "INLINE_INPUTS": "interne Ingänge", "DELETE_BLOCK": "Block lösche", "DELETE_X_BLOCKS": "Block %1 lösche", + "DELETE_ALL_BLOCKS": "All %1 Bausten lösche?", "COLLAPSE_BLOCK": "Block zusammerfalte", "COLLAPSE_ALL": "Blocke zusammerfalte", "EXPAND_BLOCK": "Block entfalte", @@ -19,14 +20,11 @@ "DISABLE_BLOCK": "Block deaktivieren", "ENABLE_BLOCK": "Block aktivieren", "HELP": "Hellef", - "CHAT": "Sprech mit unsrem Mitoorweiter doorrich renschreiwe von Text hier in den Kaste!", - "AUTH": "Weart ännre:", - "ME": "Ich", "CHANGE_VALUE_TITLE": "Neie Variable...", - "NEW_VARIABLE": "Neie Variable...", - "NEW_VARIABLE_TITLE": "Die neie Variable sei Noome:", "RENAME_VARIABLE": "Die neie Variable sei Noome:", "RENAME_VARIABLE_TITLE": "All \"%1\" Variable umbenenne in:", + "NEW_VARIABLE": "Neie Variable...", + "NEW_VARIABLE_TITLE": "Die neie Variable sei Noome:", "COLOUR_PICKER_HELPURL": "https://hrx.wikipedia.org/wiki/Farreb", "COLOUR_PICKER_TOOLTIP": "Wähl en Farreb von der Palett.", "COLOUR_RANDOM_TITLE": "zufälliche Farwe", @@ -174,7 +172,7 @@ "TEXT_LENGTH_TOOLTIP": "Die Oonzoohl von Zeiche in enem Text. (inkl. Leerzeiche)", "TEXT_ISEMPTY_TITLE": "%1 ist leer?", "TEXT_ISEMPTY_TOOLTIP": "Ist woahr (true), wenn der Text leer ist.", - "TEXT_INDEXOF_TOOLTIP": "Findt das earste / letzte Voarkommniss von en Suchbegriffes in enem Text. Gebt die Position von dem Begriff orrer 0 zurück.", + "TEXT_INDEXOF_TOOLTIP": "Findt das earste / letzte Voarkommniss von en Suchbegriffes in enem Text. Gebt die Position von dem Begriff orrer %1 zurück.", "TEXT_INDEXOF_INPUT_INTEXT": "im Text", "TEXT_INDEXOF_OPERATOR_FIRST": "Such der Begriff sein earstes Voarkommniss", "TEXT_INDEXOF_OPERATOR_LAST": "Suche der Begriff sein letztes Vorkommniss.", @@ -223,7 +221,7 @@ "LISTS_INLIST": "in der List", "LISTS_INDEX_OF_FIRST": "Such earstes Voarkommniss", "LISTS_INDEX_OF_LAST": "Such letztes Voarkommniss", - "LISTS_INDEX_OF_TOOLTIP": "Sucht die Position (index) von en Element in der List Gebt 0 zurück wenn nixs gefunn woard.", + "LISTS_INDEX_OF_TOOLTIP": "Sucht die Position (index) von en Element in der List Gebt %1 zurück wenn nixs gefunn woard.", "LISTS_GET_INDEX_GET": "Nehm", "LISTS_GET_INDEX_GET_REMOVE": "Nehm und entfern", "LISTS_GET_INDEX_REMOVE": "Entfern", @@ -231,31 +229,28 @@ "LISTS_GET_INDEX_FIRST": "earste", "LISTS_GET_INDEX_LAST": "letzte", "LISTS_GET_INDEX_RANDOM": "zufälliches", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Extrahiert das #1te Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Extrahiert das #1te Element der List sei End.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 ist das earschte Element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 ist das letzte Element.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Extrahiert das Element zu en definierte Stell von der List.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Extrahiert das earste Element von der List.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Extrahiert das letzte Element von der List.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Extrahiert en zufälliches Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Extrahiert und entfernt das #1te Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Extrahiert und entfernt das #1te Element der List sei End.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Extrahiert und entfernt das Element zu en definierte Stell von der List.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Extrahiert und entfernt das earste Element von der List.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Extrahiert und entfernt das letzte Element von der List.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Extrahiert und entfernt en zufälliches Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Entfernt das #1te Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Entfernt das #1te Element der List sei End.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Entfernt das Element zu en definierte Stell von der List.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Entfernt das earste Element von der List.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Entfernt das letzte Element von der List.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Entfernt en zufälliches Element von der List.", "LISTS_SET_INDEX_SET": "setz", "LISTS_SET_INDEX_INSERT": "tue ren setz an", "LISTS_SET_INDEX_INPUT_TO": "uff", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Setzt das Element zu en definierte Stell in en List. #1 ist das earschte Element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Setzt das Element zu en definierte Position an en List. #1 ist das letzte Element.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Setzt das Element zu en definierte Stell in en List.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Sets the first item in a list.Setzt das earschte Element an en list.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Setzt das letzte Element an en List.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Setzt en zufälliches Element an en List.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Tut das Element ren setze an en definierte Position an en List. #1 ist das earschte Element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Tut das Element ren setze an en definierte Position an en List. #1 ist das letzte Element.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Tut das Element ren setze an en definierte Stell an en List.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Tut das Element an en Oonfang von en List ren setze.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Oonhängt das Element zu en List sei End.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Tut das Element zufällich an en List ren setze.", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/hu.json b/src/opsoro/server/static/js/blockly/msg/json/hu.json similarity index 90% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/hu.json rename to src/opsoro/server/static/js/blockly/msg/json/hu.json index 9cf6fe1..e5d0486 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/hu.json +++ b/src/opsoro/server/static/js/blockly/msg/json/hu.json @@ -9,7 +9,10 @@ "Csega", "Fitoschido", "Lajthabalazs", - "Tacsipacsi" + "Tacsipacsi", + "Rodrigo", + "Máté", + "BanKris" ] }, "VARIABLES_DEFAULT_NAME": "változó", @@ -21,6 +24,8 @@ "INLINE_INPUTS": "Belső kapcsolatok", "DELETE_BLOCK": "Blokk törlése", "DELETE_X_BLOCKS": "%1 blokk törlése", + "DELETE_ALL_BLOCKS": "Az összes %1 blokk törlése?", + "CLEAN_UP": "Blokkok kiürítése", "COLLAPSE_BLOCK": "Blokk összecsukása", "COLLAPSE_ALL": "Blokkok összecsukása", "EXPAND_BLOCK": "Blokk kibontása", @@ -28,14 +33,16 @@ "DISABLE_BLOCK": "Blokk letiltása", "ENABLE_BLOCK": "Blokk engedélyezése", "HELP": "Súgó", - "CHAT": "Ebben a mezőben tudsz a közreműködőkkel beszélgetni!", - "AUTH": "Kérjük, engedélyezd az alkalmazásnak munkád elmentését és megosztását.", - "ME": "Én", + "UNDO": "Visszavonás", + "REDO": "Újra", "CHANGE_VALUE_TITLE": "Érték módosítása:", - "NEW_VARIABLE": "Új változó...", - "NEW_VARIABLE_TITLE": "Az új változó neve:", "RENAME_VARIABLE": "Változó átnevezése...", "RENAME_VARIABLE_TITLE": "Minden \"%1\" változó átnevezése erre:", + "NEW_VARIABLE": "Változó létrehozása…", + "NEW_VARIABLE_TITLE": "Az új változó neve:", + "VARIABLE_ALREADY_EXISTS": "A(z) „%1” nevű változó már létezik.", + "DELETE_VARIABLE_CONFIRMATION": "A(z) „%2” változó %1 használatának törlése?", + "DELETE_VARIABLE": "A(z) „%1” változó törlése", "COLOUR_PICKER_HELPURL": "https://hu.wikipedia.org/wiki/Szín", "COLOUR_PICKER_TOOLTIP": "Válassz színt a palettáról.", "COLOUR_RANDOM_TITLE": "véletlen szín", @@ -55,7 +62,7 @@ "CONTROLS_REPEAT_INPUT_DO": "", "CONTROLS_REPEAT_TOOLTIP": "Megadott kódrészlet ismételt végrehajtása.", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ismételd amíg", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ismételd amíg nem", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ismételd amíg", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Amíg a feltétel igaz, végrehajtja az utasításokat.", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Amíg a feltétel hamis, végrehajtja az utasításokat.", "CONTROLS_FOR_TOOLTIP": "A(z) '%1' változó felveszi a kezdőérték és a végérték közötti értékeket a meghatározott lépésközzel. Eközben a meghatározott blokkokat hajtja végre.", @@ -161,7 +168,7 @@ "MATH_MODULO_HELPURL": "https://hu.wikipedia.org/wiki/Eg%C3%A9szr%C3%A9sz#Als.C3.B3_eg.C3.A9szr.C3.A9sz", "MATH_MODULO_TITLE": "%1 ÷ %2 maradéka", "MATH_MODULO_TOOLTIP": "Az egész osztás maradékát adja eredméynül.", - "MATH_CONSTRAIN_TITLE": "korlátozd %1 -t %2 és %3 közé", + "MATH_CONSTRAIN_TITLE": "korlátozd %1-t %2 és %3 közé", "MATH_CONSTRAIN_TOOLTIP": "Egy változó értékének korlátozása a megadott zárt intervallumra.", "MATH_RANDOM_INT_HELPURL": "https://hu.wikipedia.org/wiki/V%C3%A9letlen", "MATH_RANDOM_INT_TITLE": "véletlen egész szám %1 között %2", @@ -183,7 +190,7 @@ "TEXT_LENGTH_TOOLTIP": "A megadott szöveg karaktereinek számát adja eredményül (beleértve a szóközöket).", "TEXT_ISEMPTY_TITLE": "%1 üres", "TEXT_ISEMPTY_TOOLTIP": "Igaz, ha a vizsgált szöveg hossza 0.", - "TEXT_INDEXOF_TOOLTIP": "A keresett szöveg első vagy utolsó előfordulásával tér vissza. 0 esetén a szövegrészlet nem található.", + "TEXT_INDEXOF_TOOLTIP": "A keresett szöveg első vagy utolsó előfordulásával tér vissza. %1 esetén a szövegrészlet nem található.", "TEXT_INDEXOF_INPUT_INTEXT": "A(z)", "TEXT_INDEXOF_OPERATOR_FIRST": "szövegben az első előfordulásának helye", "TEXT_INDEXOF_OPERATOR_LAST": "szövegben az utolsó előfordulásának helye", @@ -235,7 +242,7 @@ "LISTS_INLIST": "A(z)", "LISTS_INDEX_OF_FIRST": "listában első előfordulásaː", "LISTS_INDEX_OF_LAST": "listában utolsó előfordulásaː", - "LISTS_INDEX_OF_TOOLTIP": "A megadtott elem eslő vagy utolsó előfordulásával tér vissza. 0 esetén nincs ilyen eleme a listának.", + "LISTS_INDEX_OF_TOOLTIP": "A megadott elem első vagy utolsó előfordulásával tér vissza. Ha nem talál ilyen elemet, akkor %1 a visszatérési érték.", "LISTS_GET_INDEX_GET": "listából értéke", "LISTS_GET_INDEX_GET_REMOVE": "listából kivétele", "LISTS_GET_INDEX_REMOVE": "listából törlése", @@ -245,31 +252,28 @@ "LISTS_GET_INDEX_LAST": "az utolsó", "LISTS_GET_INDEX_RANDOM": "bármely", "LISTS_GET_INDEX_TAIL": "elemnek", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "A lista megadott sorszámú elemét adja eredményül. 1 az első elemet jelenti.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "A lista megadott sorszámú elemét adja eredményül. 1 az utolsó elemet jelenti.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 az első elemet jelenti.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 az utolsó elemet jelenti.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "A lista megadott sorszámú elemét adja eredményül.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "A lista első elemét adja eredményül.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "A lista utolsó elemét adja eredményül.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "A lista véletlenszerűen választott elemét adja eredményül.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "A megadott sorszámú elem kivétele a listából 1 az első elemet jelenti.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "A megadott sorszámú elem kivétele a listából 1 az utolsó elemet jelenti.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "A megadott sorszámú elem kivétele a listából.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Az első elem kivétele a listából.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Az utolsó elem kivétele a listából.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Véletlenszerűen választott elem kivétele a listából.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "A megadott sorszámú elem törlése a listából 1 az első elemet jelenti.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "A megadott sorszámú elem törlése a listából 1 az utolsó elemet jelenti.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "A megadott sorszámú elem törlése a listából.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Az első elem törlése a listából.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Az utolsó elem törlése a listából.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Véletlenszerűen választott elem törlése a listából.", "LISTS_SET_INDEX_SET": "listába állítsd be", "LISTS_SET_INDEX_INSERT": "listába szúrd be", "LISTS_SET_INDEX_INPUT_TO": "elemkéntː", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "A megadott sorszámú elem cseréje a listában. 1 az első elemet jelenti.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "A megadott sorszámú elem cseréje a listában. 1 az utolsó elemet jelenti.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "A megadott sorszámú elem cseréje a listában.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Az első elem cseréje a listában.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Az utolsó elem cseréje a listában.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Véletlenszerűen választott elem cseréje a listában.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Beszúrás a megadott sorszámú elem elé a listában. 1 az első elemet jelenti.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Beszúrás a megadott sorszámú elem elé a listában. 1 az utolsó elemet jelenti.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Beszúrás a megadott sorszámú elem elé a listában.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Beszúrás a lista elejére.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Beszúrás a lista végére.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Beszúrás véletlenszerűen választott elem elé a listában.", @@ -281,6 +285,14 @@ "LISTS_GET_SUBLIST_END_LAST": "és az utolsó", "LISTS_GET_SUBLIST_TAIL": "elem között", "LISTS_GET_SUBLIST_TOOLTIP": "A lista adott részéről másolat.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "%1 %2 %3 rendezés", + "LISTS_SORT_TOOLTIP": "Egy lista egy másolatának rendezése.", + "LISTS_SORT_ORDER_ASCENDING": "növekvő", + "LISTS_SORT_ORDER_DESCENDING": "csökkenő", + "LISTS_SORT_TYPE_NUMERIC": "numerikus", + "LISTS_SORT_TYPE_TEXT": "betűrendben", + "LISTS_SORT_TYPE_IGNORECASE": "betűrendben nagybetű figyelmen kívül hagyásával", "LISTS_SPLIT_LIST_FROM_TEXT": "lista készítése szövegből", "LISTS_SPLIT_TEXT_FROM_LIST": "sztring készítése listából", "LISTS_SPLIT_WITH_DELIMITER": "határoló karakter", @@ -298,12 +310,12 @@ "PROCEDURES_CALL_BEFORE_PARAMS": "paraméterlistaː", "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "Eljárás (nem ad vissza eredményt).", + "PROCEDURES_DEFNORETURN_COMMENT": "Írj erről a funkcióról...", "PROCEDURES_DEFRETURN_RETURN": "eredménye", "PROCEDURES_DEFRETURN_TOOLTIP": "Függvény eredménnyel.", "PROCEDURES_ALLOW_STATEMENTS": "utasítások engedélyezése", "PROCEDURES_DEF_DUPLICATE_WARNING": "Figyelem: Az eljárásban azonos elnevezésű paramétert adtál meg.", "PROCEDURES_CALLNORETURN_HELPURL": "https://hu.wikipedia.org/wiki/F%C3%BCggv%C3%A9ny_(programoz%C3%A1s)", - "PROCEDURES_CALLNORETURN_CALL": "", "PROCEDURES_CALLNORETURN_TOOLTIP": "Végrehajtja az eljárást.", "PROCEDURES_CALLRETURN_HELPURL": "https://hu.wikipedia.org/wiki/F%C3%BCggv%C3%A9ny_(programoz%C3%A1s)", "PROCEDURES_CALLRETURN_TOOLTIP": "Meghívja a függvényt.", @@ -312,7 +324,8 @@ "PROCEDURES_MUTATORARG_TITLE": "változó:", "PROCEDURES_MUTATORARG_TOOLTIP": "Bemenet hozzáadása a függvényhez.", "PROCEDURES_HIGHLIGHT_DEF": "Függvénydefiníció kiemelése", - "PROCEDURES_CREATE_DO": "Create \"do %1\"", + "PROCEDURES_CREATE_DO": "„%1” létrehozása", "PROCEDURES_IFRETURN_TOOLTIP": "Ha az érték igaz, akkor visszatér a függvény értékével.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Figyelem: Ez a blokk csak függvénydefiníción belül használható." } diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ia.json b/src/opsoro/server/static/js/blockly/msg/json/ia.json similarity index 89% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/ia.json rename to src/opsoro/server/static/js/blockly/msg/json/ia.json index 71174bc..2580900 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ia.json +++ b/src/opsoro/server/static/js/blockly/msg/json/ia.json @@ -1,10 +1,12 @@ { "@metadata": { "authors": [ - "McDutchie" + "McDutchie", + "Karmwiki" ] }, "VARIABLES_DEFAULT_NAME": "cosa", + "TODAY": "Hodie", "DUPLICATE_BLOCK": "Duplicar", "ADD_COMMENT": "Adder commento", "REMOVE_COMMENT": "Remover commento", @@ -12,6 +14,8 @@ "INLINE_INPUTS": "Entrata interne", "DELETE_BLOCK": "Deler bloco", "DELETE_X_BLOCKS": "Deler %1 blocos", + "DELETE_ALL_BLOCKS": "Deler tote le %1 blocos?", + "CLEAN_UP": "Clarar le blocos", "COLLAPSE_BLOCK": "Plicar bloco", "COLLAPSE_ALL": "Plicar blocos", "EXPAND_BLOCK": "Displicar bloco", @@ -19,14 +23,13 @@ "DISABLE_BLOCK": "Disactivar bloco", "ENABLE_BLOCK": "Activar bloco", "HELP": "Adjuta", - "CHAT": "Conversa con tu collaborator scribente in iste quadro!", - "AUTH": "Per favor autorisa iste application pro permitter de salveguardar tu travalio e pro permitter que tu lo divide con alteres.", - "ME": "Io", + "UNDO": "Disfacer", + "REDO": "Refacer", "CHANGE_VALUE_TITLE": "Cambiar valor:", - "NEW_VARIABLE": "Nove variabile...", - "NEW_VARIABLE_TITLE": "Nomine del nove variabile:", "RENAME_VARIABLE": "Renominar variabile...", "RENAME_VARIABLE_TITLE": "Renominar tote le variabiles '%1' a:", + "NEW_VARIABLE": "Nove variabile...", + "NEW_VARIABLE_TITLE": "Nomine del nove variabile:", "COLOUR_PICKER_HELPURL": "https://ia.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Elige un color del paletta.", "COLOUR_RANDOM_TITLE": "color aleatori", @@ -49,7 +52,7 @@ "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "repeter usque a", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Durante que un valor es ver, exequer certe instructiones.", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Durante que un valor es false, exequer certe instructiones.", - "CONTROLS_FOR_TOOLTIP": "Mitter in le variabile \"%1\" le valores ab le numero initial usque al numero final, con passos secundo le intervallo specificate, e exequer le blocos specificate.", + "CONTROLS_FOR_TOOLTIP": "Mitter in le variabile '%1' le valores ab le numero initial usque al numero final, con passos secundo le intervallo specificate, e exequer le blocos specificate.", "CONTROLS_FOR_TITLE": "contar con %1 de %2 a %3 per %4", "CONTROLS_FOREACH_TITLE": "pro cata elemento %1 in lista %2", "CONTROLS_FOREACH_TOOLTIP": "Pro cata elemento in un lista, mitter lo in le variabile '%1' e exequer certe instructiones.", @@ -166,7 +169,7 @@ "TEXT_LENGTH_TOOLTIP": "Retorna le numero de litteras (incluse spatios) in le texto fornite.", "TEXT_ISEMPTY_TITLE": "%1 es vacue", "TEXT_ISEMPTY_TOOLTIP": "Retorna ver si le texto fornite es vacue.", - "TEXT_INDEXOF_TOOLTIP": "Retorna le indice del prime/ultime occurrentia del prime texto in le secunde texto. Retorna 0 si le texto non es trovate.", + "TEXT_INDEXOF_TOOLTIP": "Retorna le indice del prime/ultime occurrentia del prime texto in le secunde texto. Retorna %1 si le texto non es trovate.", "TEXT_INDEXOF_INPUT_INTEXT": "in le texto", "TEXT_INDEXOF_OPERATOR_FIRST": "cercar le prime occurrentia del texto", "TEXT_INDEXOF_OPERATOR_LAST": "cercar le ultime occurrentia del texto", @@ -215,7 +218,7 @@ "LISTS_INLIST": "in lista", "LISTS_INDEX_OF_FIRST": "cercar le prime occurrentia del elemento", "LISTS_INDEX_OF_LAST": "cercar le ultime occurrentia del elemento", - "LISTS_INDEX_OF_TOOLTIP": "Retorna le indice del prime/ultime occurrentia del elemento in le lista. Retorna 0 si le texto non es trovate.", + "LISTS_INDEX_OF_TOOLTIP": "Retorna le indice del prime/ultime occurrentia del elemento in le lista. Retorna %1 si le elemento non es trovate.", "LISTS_GET_INDEX_GET": "prender", "LISTS_GET_INDEX_GET_REMOVE": "prender e remover", "LISTS_GET_INDEX_REMOVE": "remover", @@ -223,31 +226,28 @@ "LISTS_GET_INDEX_FIRST": "prime", "LISTS_GET_INDEX_LAST": "ultime", "LISTS_GET_INDEX_RANDOM": "aleatori", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Retorna le elemento presente al position specificate in un lista. № 1 es le prime elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Retorna le elemento presente al position specificate in un lista. № 1 es le ultime elemento.", + "LISTS_INDEX_FROM_START_TOOLTIP": "№ %1 es le prime elemento.", + "LISTS_INDEX_FROM_END_TOOLTIP": "№ %1 es le ultime elemento.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Retorna le elemento presente al position specificate in un lista.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Retorna le prime elemento in un lista.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Retorna le ultime elemento in un lista.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Retorna un elemento aleatori in un lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Remove e retorna le elemento presente al position specificate in un lista. № 1 es le prime elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Remove e retorna le elemento presente al position specificate in un lista. № 1 es le ultime elemento.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Remove e retorna le elemento presente al position specificate in un lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Remove e retorna le prime elemento in un lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Remove e retorna le ultime elemento in un lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Remove e retorna un elemento aleatori in un lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Remove le elemento presente al position specificate in un lista. № 1 es le prime elemento.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Remove le elemento presente al position specificate in un lista. № 1 es le ultime elemento.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Remove le elemento presente al position specificate in un lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Remove le prime elemento in un lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Remove le ultime elemento in un lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Remove un elemento aleatori in un lista.", "LISTS_SET_INDEX_SET": "mitter", "LISTS_SET_INDEX_INSERT": "inserer in", "LISTS_SET_INDEX_INPUT_TO": "a", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Defini le valor del elemento al position specificate in un lista. № 1 es le prime elemento.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Defini le valor del elemento al position specificate in un lista. № 1 es le ultime elemento.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Defini le valor del elemento al position specificate in un lista.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Defini le valor del prime elemento in un lista.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Defini le valor del ultime elemento in un lista.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Defini le valor de un elemento aleatori in un lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Insere le elemento al position specificate in un lista. № 1 es le prime elemento.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Insere le elemento al position specificate in un lista. № 1 es le ultime elemento.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Insere le elemento al position specificate in un lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Insere le elemento al initio de un lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Adjunge le elemento al fin de un lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Insere le elemento a un position aleatori in un lista.", @@ -258,6 +258,18 @@ "LISTS_GET_SUBLIST_END_FROM_END": "usque al № ab fin", "LISTS_GET_SUBLIST_END_LAST": "usque al ultime", "LISTS_GET_SUBLIST_TOOLTIP": "Crea un copia del parte specificate de un lista.", + "LISTS_SORT_TITLE": "ordinamento %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Ordinar un copia de un lista.", + "LISTS_SORT_ORDER_ASCENDING": "ascendente", + "LISTS_SORT_ORDER_DESCENDING": "descendente", + "LISTS_SORT_TYPE_NUMERIC": "numeric", + "LISTS_SORT_TYPE_TEXT": "alphabetic", + "LISTS_SORT_TYPE_IGNORECASE": "alphabetic, ignorar majuscula/minuscula", + "LISTS_SPLIT_LIST_FROM_TEXT": "Crear un lista per un texto", + "LISTS_SPLIT_TEXT_FROM_LIST": "crear un texto per un lista", + "LISTS_SPLIT_WITH_DELIMITER": "con delimitator", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Divider texto in un lista de textos, separante lo a cata delimitator.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Unir un lista de textos, separate per un delimitator, in un sol texto.", "VARIABLES_GET_TOOLTIP": "Retorna le valor de iste variabile.", "VARIABLES_GET_CREATE_SET": "Crea 'mitter %1'", "VARIABLES_SET": "mitter %1 a %2", @@ -268,6 +280,7 @@ "PROCEDURES_BEFORE_PARAMS": "con:", "PROCEDURES_CALL_BEFORE_PARAMS": "con:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Crea un function que non retorna un valor.", + "PROCEDURES_DEFNORETURN_COMMENT": "Describe iste function...", "PROCEDURES_DEFRETURN_RETURN": "retornar", "PROCEDURES_DEFRETURN_TOOLTIP": "Crea un function que retorna un valor.", "PROCEDURES_ALLOW_STATEMENTS": "permitter declarationes", diff --git a/src/opsoro/server/static/js/blockly/msg/json/id.json b/src/opsoro/server/static/js/blockly/msg/json/id.json new file mode 100644 index 0000000..3f61ade --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/id.json @@ -0,0 +1,335 @@ +{ + "@metadata": { + "authors": [ + "Kenrick95", + "아라", + "Mirws", + "Marwan Mohamad", + "Kasimtan", + "Arifin.wijaya" + ] + }, + "VARIABLES_DEFAULT_NAME": "item", + "TODAY": "Hari ini", + "DUPLICATE_BLOCK": "Duplikat", + "ADD_COMMENT": "Tambahkan Komentar", + "REMOVE_COMMENT": "Hapus Komentar", + "EXTERNAL_INPUTS": "Input Eksternal", + "INLINE_INPUTS": "Input Inline", + "DELETE_BLOCK": "Hapus Blok", + "DELETE_X_BLOCKS": "Hapus %1 Blok", + "DELETE_ALL_BLOCKS": "Hapus semua %1 blok?", + "CLEAN_UP": "Bersihkan Blok", + "COLLAPSE_BLOCK": "Ciutkan Blok", + "COLLAPSE_ALL": "Ciutkan Blok", + "EXPAND_BLOCK": "Kembangkan Blok", + "EXPAND_ALL": "Kembangkan Blok", + "DISABLE_BLOCK": "Nonaktifkan Blok", + "ENABLE_BLOCK": "Aktifkan Blok", + "HELP": "Bantuan", + "UNDO": "Urungkan", + "REDO": "Lakukan ulang", + "CHANGE_VALUE_TITLE": "Ubah nilai:", + "RENAME_VARIABLE": "Ubah nama variabel...", + "RENAME_VARIABLE_TITLE": "Ubah nama semua variabel '%1' menjadi:", + "NEW_VARIABLE": "Buat variabel...", + "NEW_VARIABLE_TITLE": "Nama variabel baru:", + "VARIABLE_ALREADY_EXISTS": "Sebuah variabel dengan nama '%1' sudah ada.", + "DELETE_VARIABLE_CONFIRMATION": "Hapus %1 yang digunakan pada variabel '%2'?", + "DELETE_VARIABLE": "Hapus variabel '%1'", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", + "COLOUR_PICKER_TOOLTIP": "Pilih warna dari daftar warna.", + "COLOUR_RANDOM_TITLE": "Warna acak", + "COLOUR_RANDOM_TOOLTIP": "Pilih warna secara acak.", + "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", + "COLOUR_RGB_TITLE": "Dengan warna", + "COLOUR_RGB_RED": "merah", + "COLOUR_RGB_GREEN": "hijau", + "COLOUR_RGB_BLUE": "biru", + "COLOUR_RGB_TOOLTIP": "Buatlah warna dengan jumlah yang ditentukan dari merah, hijau dan biru. Semua nilai harus antarai 0 sampai 100.", + "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", + "COLOUR_BLEND_TITLE": "campur", + "COLOUR_BLEND_COLOUR1": "warna 1", + "COLOUR_BLEND_COLOUR2": "warna 2", + "COLOUR_BLEND_RATIO": "rasio", + "COLOUR_BLEND_TOOLTIP": "Campur dua warna secara bersamaan dengan perbandingan (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "ulangi %1 kali", + "CONTROLS_REPEAT_INPUT_DO": "kerjakan", + "CONTROLS_REPEAT_TOOLTIP": "Lakukan beberapa perintah beberapa kali.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ulangi jika", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ulangi sampai", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Selagi nilainya benar, maka lakukan beberapa perintah.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Selagi nilainya salah, maka lakukan beberapa perintah.", + "CONTROLS_FOR_TOOLTIP": "Menggunakan variabel \"%1\" dengan mengambil nilai dari batas awal hingga ke batas akhir, dengan interval tertentu, dan mengerjakan block tertentu.", + "CONTROLS_FOR_TITLE": "Cacah dengan %1 dari %2 ke %3 dengan step / penambahan %4", + "CONTROLS_FOREACH_TITLE": "untuk setiap item %1 di dalam list %2", + "CONTROLS_FOREACH_TOOLTIP": "Untuk tiap-tiap item di dalam list, tetapkan variabel '%1' ke dalam item, selanjutnya kerjakan beberapa statement.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "keluar dari perulangan", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "lanjutkan dengan langkah perulangan berikutnya", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Keluar dari perulangan.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Abaikan sisa dari perulangan ini, dan lanjutkan dengan langkah berikutnya.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Peringatan: Blok ini hanya dapat digunakan dalam perulangan.", + "CONTROLS_IF_TOOLTIP_1": "Jika nilainya benar, maka lakukan beberapa perintah.", + "CONTROLS_IF_TOOLTIP_2": "Jika nilainya benar, maka kerjakan perintah blok pertama. Jika tidak, kerjakan perintah blok kedua.", + "CONTROLS_IF_TOOLTIP_3": "Jika nilai pertama benar, maka kerjakan perintah blok pertama. Sebaliknya, jika nilai kedua benar, kerjakan perintah blok kedua.", + "CONTROLS_IF_TOOLTIP_4": "Jika nilai pertama benar, maka kerjakan perintah blok pertama. Sebaliknya, jika nilai kedua benar, kerjakan perintah blok kedua. Jika dua-duanya tidak benar, kerjakan perintah blok terakhir.", + "CONTROLS_IF_MSG_IF": "jika", + "CONTROLS_IF_MSG_ELSEIF": "atau jika", + "CONTROLS_IF_MSG_ELSE": "lainnya", + "CONTROLS_IF_IF_TOOLTIP": "Tambahkan, hapus, atau susun kembali bagian untuk mengkonfigurasi blok IF ini.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Tambahkan prasyarat ke dalam blok IF.", + "CONTROLS_IF_ELSE_TOOLTIP": "Terakhir, tambahkan kondisi tangkap-semua kedalam blok IF.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Kembalikan benar jika kedua input sama satu dengan lainnya.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Kembalikan benar jika kedua input tidak sama satu dengan lainnya.", + "LOGIC_COMPARE_TOOLTIP_LT": "Kembalikan benar jika input pertama lebih kecil dari input kedua.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Kembalikan benar jika input pertama lebih kecil atau sama dengan input kedua .", + "LOGIC_COMPARE_TOOLTIP_GT": "Kembalikan benar jika input pertama lebih besar dari input kedua.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Kembalikan benar jika input pertama lebih besar dari atau sama dengan input kedua.", + "LOGIC_OPERATION_TOOLTIP_AND": "Kembalikan benar jika kedua input adalah benar.", + "LOGIC_OPERATION_AND": "dan", + "LOGIC_OPERATION_TOOLTIP_OR": "Kembalikan benar jika minimal satu input nilainya benar.", + "LOGIC_OPERATION_OR": "atau", + "LOGIC_NEGATE_TITLE": "bukan (not) %1", + "LOGIC_NEGATE_TOOLTIP": "Kembalikan benar jika input salah. Kembalikan salah jika input benar.", + "LOGIC_BOOLEAN_TRUE": "benar", + "LOGIC_BOOLEAN_FALSE": "salah", + "LOGIC_BOOLEAN_TOOLTIP": "Kembalikan benar atau salah.", + "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", + "LOGIC_NULL": "null", + "LOGIC_NULL_TOOLTIP": "Kembalikan null.", + "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", + "LOGIC_TERNARY_CONDITION": "test", + "LOGIC_TERNARY_IF_TRUE": "jika benar", + "LOGIC_TERNARY_IF_FALSE": "jika salah", + "LOGIC_TERNARY_TOOLTIP": "Periksa kondisi di 'test'. Jika kondisi benar, kembalikan nilai 'if true'; jika sebaliknya kembalikan nilai 'if false'.", + "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", + "MATH_NUMBER_TOOLTIP": "Suatu angka.", + "MATH_ADDITION_SYMBOL": "+", + "MATH_SUBTRACTION_SYMBOL": "-", + "MATH_DIVISION_SYMBOL": "÷", + "MATH_MULTIPLICATION_SYMBOL": "×", + "MATH_POWER_SYMBOL": "^", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "asin", + "MATH_TRIG_ACOS": "acos", + "MATH_TRIG_ATAN": "atan", + "MATH_ARITHMETIC_HELPURL": "https://id.wikipedia.org/wiki/Aritmetika", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Kembalikan jumlah dari kedua angka.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Kembalikan selisih dari kedua angka.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Kembalikan perkalian dari kedua angka.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Kembalikan hasil bagi dari kedua angka.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Kembalikan angka pertama pangkat angka kedua.", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_OP_ROOT": "akar", + "MATH_SINGLE_TOOLTIP_ROOT": "Kembalikan akar dari angka.", + "MATH_SINGLE_OP_ABSOLUTE": "mutlak", + "MATH_SINGLE_TOOLTIP_ABS": "Kembalikan nilai absolut angka.", + "MATH_SINGLE_TOOLTIP_NEG": "Kembalikan penyangkalan terhadap angka.", + "MATH_SINGLE_TOOLTIP_LN": "Kembalikan logaritma natural dari angka.", + "MATH_SINGLE_TOOLTIP_LOG10": "Kembalikan dasar logaritma 10 dari angka.", + "MATH_SINGLE_TOOLTIP_EXP": "Kembalikan 10 pangkat angka.", + "MATH_SINGLE_TOOLTIP_POW10": "Kembalikan 10 pangkat angka.", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "MATH_TRIG_TOOLTIP_SIN": "Kembalikan sinus dari derajat (bukan radian).", + "MATH_TRIG_TOOLTIP_COS": "Kembalikan cosinus dari derajat (bukan radian).", + "MATH_TRIG_TOOLTIP_TAN": "Kembalikan tangen dari derajat (bukan radian).", + "MATH_TRIG_TOOLTIP_ASIN": "Kembalikan asin dari angka.", + "MATH_TRIG_TOOLTIP_ACOS": "Kembalikan acosine dari angka.", + "MATH_TRIG_TOOLTIP_ATAN": "Kembalikan atan dari angka.", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "Kembalikan salah satu konstanta: π (3,141…), e (2,718…), φ (1,618…), akar(2) (1,414…), akar(½) (0.707…), atau ∞ (tak terhingga).", + "MATH_IS_EVEN": "adalah bilangan genap", + "MATH_IS_ODD": "adalah bilangan ganjil", + "MATH_IS_PRIME": "adalah bilangan pokok", + "MATH_IS_WHOLE": "adalah bilangan bulat", + "MATH_IS_POSITIVE": "adalah bilangan positif", + "MATH_IS_NEGATIVE": "adalah bilangan negatif", + "MATH_IS_DIVISIBLE_BY": "dapat dibagi oleh", + "MATH_IS_TOOLTIP": "Periksa apakah angka adalah bilangan genap, bilangan ganjil, bilangan pokok, bilangan bulat, bilangan positif, bilangan negatif, atau apakan bisa dibagi oleh angka tertentu. Kembalikan benar atau salah.", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "ubah %1 oleh %2", + "MATH_CHANGE_TOOLTIP": "Tambahkan angka kedalam variabel '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Bulatkan suatu bilangan naik atau turun.", + "MATH_ROUND_OPERATOR_ROUND": "membulatkan", + "MATH_ROUND_OPERATOR_ROUNDUP": "membulatkan keatas", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "membulatkan kebawah", + "MATH_ONLIST_OPERATOR_SUM": "jumlah dari list", + "MATH_ONLIST_TOOLTIP_SUM": "Kembalikan jumlah dari seluruh bilangan dari list.", + "MATH_ONLIST_OPERATOR_MIN": "minimum dari list", + "MATH_ONLIST_TOOLTIP_MIN": "Kembalikan angka terkecil dari list.", + "MATH_ONLIST_OPERATOR_MAX": "maksimum dari list", + "MATH_ONLIST_TOOLTIP_MAX": "Kembalikan angka terbesar dari list.", + "MATH_ONLIST_OPERATOR_AVERAGE": "rata-rata dari list", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Kembalikan rata-rata (mean aritmetik) dari nilai numerik dari list.", + "MATH_ONLIST_OPERATOR_MEDIAN": "median dari list", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Kembalikan median dari list.", + "MATH_ONLIST_OPERATOR_MODE": "mode-mode dari list", + "MATH_ONLIST_TOOLTIP_MODE": "Kembalikan list berisi item yang paling umum dari dalam list.", + "MATH_ONLIST_OPERATOR_STD_DEV": "deviasi standar dari list", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Kembalikan standard deviasi dari list.", + "MATH_ONLIST_OPERATOR_RANDOM": "item acak dari list", + "MATH_ONLIST_TOOLTIP_RANDOM": "Kembalikan elemen acak dari list.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "sisa dari %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Kembalikan sisa dari pembagian ke dua angka.", + "MATH_CONSTRAIN_TITLE": "Batasi %1 rendah %2 tinggi %3", + "MATH_CONSTRAIN_TOOLTIP": "Batasi angka antara batas yang ditentukan (inklusif).", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "acak bulat dari %1 sampai %2", + "MATH_RANDOM_INT_TOOLTIP": "Kembalikan bilangan acak antara dua batas yang ditentukan, inklusif.", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "nilai pecahan acak", + "MATH_RANDOM_FLOAT_TOOLTIP": "Kembalikan nilai pecahan acak antara 0.0 (inklusif) dan 1.0 (eksklusif).", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Huruf, kata atau baris teks.", + "TEXT_JOIN_TITLE_CREATEWITH": "buat teks dengan", + "TEXT_JOIN_TOOLTIP": "Buat teks dengan cara gabungkan sejumlah item.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "join", + "TEXT_CREATE_JOIN_TOOLTIP": "Tambah, ambil, atau susun ulang teks blok.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Tambahkan suatu item ke dalam teks.", + "TEXT_APPEND_TO": "untuk", + "TEXT_APPEND_APPENDTEXT": "tambahkan teks", + "TEXT_APPEND_TOOLTIP": "Tambahkan beberapa teks ke variabel '%1'.", + "TEXT_LENGTH_TITLE": "panjang dari %1", + "TEXT_LENGTH_TOOLTIP": "Kembalikan sejumlah huruf (termasuk spasi) dari teks yang disediakan.", + "TEXT_ISEMPTY_TITLE": "%1 kosong", + "TEXT_ISEMPTY_TOOLTIP": "Kembalikan benar jika teks yang disediakan kosong.", + "TEXT_INDEXOF_TOOLTIP": "Kembalikan indeks pertama dan terakhir dari kejadian pertama/terakhir dari teks pertama dalam teks kedua. Kembalikan %1 jika teks tidak ditemukan.", + "TEXT_INDEXOF_INPUT_INTEXT": "dalam teks", + "TEXT_INDEXOF_OPERATOR_FIRST": "temukan kejadian pertama dalam teks", + "TEXT_INDEXOF_OPERATOR_LAST": "temukan kejadian terakhir dalam teks", + "TEXT_CHARAT_INPUT_INTEXT": "dalam teks", + "TEXT_CHARAT_FROM_START": "ambil huruf ke #", + "TEXT_CHARAT_FROM_END": "ambil huruf nomor # dari belakang", + "TEXT_CHARAT_FIRST": "ambil huruf pertama", + "TEXT_CHARAT_LAST": "ambil huruf terakhir", + "TEXT_CHARAT_RANDOM": "ambil huruf secara acak", + "TEXT_CHARAT_TOOLTIP": "Kembalikan karakter dari posisi tertentu.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Kembalikan spesifik bagian dari teks.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "in teks", + "TEXT_GET_SUBSTRING_START_FROM_START": "ambil bagian teks (substring) dari huruf no #", + "TEXT_GET_SUBSTRING_START_FROM_END": "ambil bagian teks (substring) dari huruf ke # dari terakhir", + "TEXT_GET_SUBSTRING_START_FIRST": "ambil bagian teks (substring) dari huruf pertama", + "TEXT_GET_SUBSTRING_END_FROM_START": "pada huruf #", + "TEXT_GET_SUBSTRING_END_FROM_END": "pada huruf nomer # dari terakhir", + "TEXT_GET_SUBSTRING_END_LAST": "pada huruf terakhir", + "TEXT_CHANGECASE_TOOLTIP": "Kembalikan kopi dari text dengan kapitalisasi yang berbeda.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "menjadi huruf kapital", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "menjadi huruf kecil", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "menjadi huruf pertama kapital", + "TEXT_TRIM_TOOLTIP": "Kembali salinan teks dengan spasi dihapus dari satu atau kedua ujungnya.", + "TEXT_TRIM_OPERATOR_BOTH": "pangkas ruang dari kedua belah sisi", + "TEXT_TRIM_OPERATOR_LEFT": "pangkas ruang dari sisi kiri", + "TEXT_TRIM_OPERATOR_RIGHT": "pangkas ruang dari sisi kanan", + "TEXT_PRINT_TITLE": "cetak %1", + "TEXT_PRINT_TOOLTIP": "Cetak teks yant ditentukan, angka atau ninlai lainnya.", + "TEXT_PROMPT_TYPE_TEXT": "meminta teks dengan pesan", + "TEXT_PROMPT_TYPE_NUMBER": "Meminta angka dengan pesan", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Meminta pengguna untuk memberi sebuah angka.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Meminta pengguna untuk memberi beberapa teks.", + "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", + "LISTS_CREATE_EMPTY_TITLE": "buat list kosong", + "LISTS_CREATE_EMPTY_TOOLTIP": "Kembalikan list, dengan panjang 0, tidak berisi data", + "LISTS_CREATE_WITH_TOOLTIP": "Buat sebuah list dengan sejumlah item.", + "LISTS_CREATE_WITH_INPUT_WITH": "buat list dengan", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "list", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Tambahkan, hapus, atau susun ulang bagian untuk mengkonfigurasi blok list ini.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Tambahkan sebuah item ke list.", + "LISTS_REPEAT_TOOLTIP": "Buat sebuah list yang terdiri dari nilai yang diberikan diulang sebanyak jumlah yang ditentukan.", + "LISTS_REPEAT_TITLE": "buat list dengan item %1 diulang %2 kali", + "LISTS_LENGTH_TITLE": "panjang dari %1", + "LISTS_LENGTH_TOOLTIP": "Kembalikan panjang list.", + "LISTS_ISEMPTY_TITLE": "%1 kosong", + "LISTS_ISEMPTY_TOOLTIP": "Kembalikan benar jika list kosong.", + "LISTS_INLIST": "dalam list", + "LISTS_INDEX_OF_FIRST": "cari kejadian pertama item", + "LISTS_INDEX_OF_LAST": "cari kejadian terakhir item", + "LISTS_INDEX_OF_TOOLTIP": "Kembalikan indeks dari item pertama/terakhir kali muncul dalam list. Kembalikan %1 jika item tidak ditemukan.", + "LISTS_GET_INDEX_GET": "dapatkan", + "LISTS_GET_INDEX_GET_REMOVE": "dapatkan dan hapus", + "LISTS_GET_INDEX_REMOVE": "Hapus", + "LISTS_GET_INDEX_FROM_START": "#", + "LISTS_GET_INDEX_FROM_END": "# dari akhir", + "LISTS_GET_INDEX_FIRST": "pertama", + "LISTS_GET_INDEX_LAST": "terakhir", + "LISTS_GET_INDEX_RANDOM": "acak", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 adalah item pertama.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 adalah item terakhir.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Kembalikan item di posisi tertentu dalam list.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Kembalikan item pertama dalam list.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Kembalikan item terakhir dalam list.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Kembalikan item acak dalam list.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Hapus dan kembalikan item di posisi tertentu dalam list.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Hapus dan kembalikan item pertama dalam list.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Hapus dan kembalikan item terakhir dalam list.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Hapus dan kembalikan item acak dalam list.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Hapus item di posisi tertentu dalam list.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Hapus item pertama dalam list.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Hapus item terakhir dalam list.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Hapus sebuah item acak dalam list.", + "LISTS_SET_INDEX_SET": "tetapkan", + "LISTS_SET_INDEX_INSERT": "sisipkan di", + "LISTS_SET_INDEX_INPUT_TO": "sebagai", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Tetapkan item ke dalam posisi yang telah ditentukan di dalam list.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Tetapkan item pertama di dalam list.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Menetapkan item terakhir dalam list.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Tetapkan secara acak sebuah item dalam list.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Sisipkan item ke dalam posisi yang telah ditentukan di dalam list.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Sisipkan item di bagian awal dari list.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Tambahkan item ke bagian akhir list.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Sisipkan item secara acak ke dalam list.", + "LISTS_GET_SUBLIST_START_FROM_START": "dapatkan sub-list dari #", + "LISTS_GET_SUBLIST_START_FROM_END": "dapatkan sub-list dari nomor # dari akhir", + "LISTS_GET_SUBLIST_START_FIRST": "dapatkan sub-list dari pertama", + "LISTS_GET_SUBLIST_END_FROM_START": "ke #", + "LISTS_GET_SUBLIST_END_FROM_END": "ke # dari akhir", + "LISTS_GET_SUBLIST_END_LAST": "ke yang paling akhir", + "LISTS_GET_SUBLIST_TOOLTIP": "Buat salinan bagian tertentu dari list.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "urutkan %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Urutkan salinan dari daftar", + "LISTS_SORT_ORDER_ASCENDING": "menaik", + "LISTS_SORT_ORDER_DESCENDING": "menurun", + "LISTS_SORT_TYPE_NUMERIC": "sesuai nomor", + "LISTS_SORT_TYPE_TEXT": "sesuai abjad", + "LISTS_SORT_TYPE_IGNORECASE": "sesuai abjad, abaikan kasus", + "LISTS_SPLIT_LIST_FROM_TEXT": "buat list dari teks", + "LISTS_SPLIT_TEXT_FROM_LIST": "buat teks dari list", + "LISTS_SPLIT_WITH_DELIMITER": "dengan pembatas", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Membagi teks ke dalam daftar teks, pisahkan pada setiap pembatas.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Gabung daftar teks menjadi satu teks, yang dipisahkan oleh pembatas.", + "VARIABLES_GET_TOOLTIP": "Kembalikan nilai variabel ini.", + "VARIABLES_GET_CREATE_SET": "Buat 'set %1'", + "VARIABLES_SET": "tetapkan %1 untuk %2", + "VARIABLES_SET_TOOLTIP": "tetapkan variabel ini dengan input yang sama.", + "VARIABLES_SET_CREATE_GET": "Buat 'get %1'", + "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFNORETURN_TITLE": "untuk", + "PROCEDURES_DEFNORETURN_PROCEDURE": "buat sesuatu", + "PROCEDURES_BEFORE_PARAMS": "dengan:", + "PROCEDURES_CALL_BEFORE_PARAMS": "dengan:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Buat sebuah fungsi tanpa output.", + "PROCEDURES_DEFNORETURN_COMMENT": "Jelaskan fungsi ini...", + "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFRETURN_RETURN": "kembali", + "PROCEDURES_DEFRETURN_TOOLTIP": "Buat sebuah fungsi dengan satu output.", + "PROCEDURES_ALLOW_STATEMENTS": "memungkinkan pernyataan", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Peringatan: Fungsi ini memiliki parameter duplikat.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Menjalankan fungsi '%1' yang ditetapkan pengguna.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLRETURN_TOOLTIP": "Menjalankan fungsi '%1' yang ditetapkan pengguna dan menggunakan outputnya.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "input", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Menambah, menghapus, atau menyusun ulang masukan untuk fungsi ini.", + "PROCEDURES_MUTATORARG_TITLE": "masukan Nama:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Tambahkan masukan ke fungsi.", + "PROCEDURES_HIGHLIGHT_DEF": "Sorot definisi fungsi", + "PROCEDURES_CREATE_DO": "Buat '%1'", + "PROCEDURES_IFRETURN_TOOLTIP": "Jika nilai yang benar, kemudian kembalikan nilai kedua.", + "PROCEDURES_IFRETURN_WARNING": "Peringatan: Blok ini dapat digunakan hanya dalam definisi fungsi." +} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/is.json b/src/opsoro/server/static/js/blockly/msg/json/is.json similarity index 91% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/is.json rename to src/opsoro/server/static/js/blockly/msg/json/is.json index 0a3235d..8bf3dc2 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/is.json +++ b/src/opsoro/server/static/js/blockly/msg/json/is.json @@ -3,7 +3,9 @@ "authors": [ "Jonbg", "아라", - "Gaddi00" + "Gaddi00", + "Sveinki", + "Sveinn í Felli" ] }, "VARIABLES_DEFAULT_NAME": "atriði", @@ -15,6 +17,8 @@ "INLINE_INPUTS": "Innri inntök", "DELETE_BLOCK": "Eyða kubbi", "DELETE_X_BLOCKS": "Eyða %1 kubbum", + "DELETE_ALL_BLOCKS": "Eyða öllum %1 kubbunum?", + "CLEAN_UP": "Hreinsa kubba", "COLLAPSE_BLOCK": "Loka kubbi", "COLLAPSE_ALL": "Loka kubbum", "EXPAND_BLOCK": "Opna kubb", @@ -22,14 +26,13 @@ "DISABLE_BLOCK": "Óvirkja kubb", "ENABLE_BLOCK": "Virkja kubb", "HELP": "Hjálp", - "CHAT": "Spjallaðu við félaga með því að skrifa í þennan reit!", - "AUTH": "Vinsamlegast heimilaðu þetta forrit svo að hægt sé að vista verk þitt og svo að þú megir deila því", - "ME": "Mig", + "UNDO": "Afturkalla", + "REDO": "Endurtaka", "CHANGE_VALUE_TITLE": "Breyta gildi:", - "NEW_VARIABLE": "Ný breyta...", - "NEW_VARIABLE_TITLE": "Heiti nýrrar breytu:", "RENAME_VARIABLE": "Endurnefna breytu...", "RENAME_VARIABLE_TITLE": "Endurnefna allar '%1' breyturnar:", + "NEW_VARIABLE": "Ný breyta...", + "NEW_VARIABLE_TITLE": "Heiti nýrrar breytu:", "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Velja lit úr litakorti.", "COLOUR_RANDOM_TITLE": "einhver litur", @@ -56,7 +59,7 @@ "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Endurtaka eitthvað á meðan gildi er satt.", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Endurtaka eitthvað á meðan gildi er ósatt.", "CONTROLS_FOR_HELPURL": "https://github.com/google/blockly/wiki/Loops#count-with", - "CONTROLS_FOR_TOOLTIP": "Láta breytuna \"%1\" taka inn gildi frá fyrstu tölu til síðustu tölu hlaupandi á bilinu og endurtaka kubbana fyrir hverja tölu.", + "CONTROLS_FOR_TOOLTIP": "Láta breytuna '%1' taka inn gildi frá fyrstu tölu til síðustu tölu, hlaupandi á tiltekna bilinu og gera tilteknu kubbana.", "CONTROLS_FOR_TITLE": "telja með %1 frá %2 til %3 um %4", "CONTROLS_FOREACH_TITLE": "fyrir hvert %1 í lista %2", "CONTROLS_FOREACH_TOOLTIP": "Fyrir hvert atriði í lista er breyta '%1' stillt á atriðið og skipanir gerðar.", @@ -204,7 +207,7 @@ "TEXT_ISEMPTY_TITLE": "%1 er tómur", "TEXT_ISEMPTY_TOOLTIP": "Skilar sönnu ef gefni textinn er tómur.", "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", - "TEXT_INDEXOF_TOOLTIP": "Finnur fyrsta/síðasta tilfelli fyrri textans í seinni textanum og skilar sæti hans. Skilar 0 ef textinn finnst ekki.", + "TEXT_INDEXOF_TOOLTIP": "Finnur fyrsta/síðasta tilfelli fyrri textans í seinni textanum og skilar sæti hans. Skilar %1 ef textinn finnst ekki.", "TEXT_INDEXOF_INPUT_INTEXT": "í texta", "TEXT_INDEXOF_OPERATOR_FIRST": "finna fyrsta tilfelli texta", "TEXT_INDEXOF_OPERATOR_LAST": "finna síðasta tilfelli texta", @@ -263,7 +266,7 @@ "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", "LISTS_INDEX_OF_FIRST": "finna fyrsta tilfelli atriðis", "LISTS_INDEX_OF_LAST": "finna síðasta tilfelli atriðis", - "LISTS_INDEX_OF_TOOLTIP": "Finnur hvar atriðið kemur fyrir fyrst/síðast í listanum og skilar sæti þess. Skilar 0 ef textinn finnst ekki.", + "LISTS_INDEX_OF_TOOLTIP": "Finnur hvar atriðið kemur fyrir fyrst/síðast í listanum og skilar sæti þess. Skilar %1 ef atriðið finnst ekki.", "LISTS_GET_INDEX_GET": "sækja", "LISTS_GET_INDEX_GET_REMOVE": "sækja og fjarlægja", "LISTS_GET_INDEX_REMOVE": "fjarlægja", @@ -272,18 +275,17 @@ "LISTS_GET_INDEX_FIRST": "fyrsta", "LISTS_GET_INDEX_LAST": "síðasta", "LISTS_GET_INDEX_RANDOM": "eitthvert", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Skilar atriðinu í hinum tiltekna stað í lista. #1 er fyrsta atriðið.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Skilar atriðinu á hinum tiltekna stað í lista. #1 er síðasta atriðið.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 er fyrsta atriðið.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 er síðasta atriðið.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Skilar atriðinu í hinum tiltekna stað í lista.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Skilar fyrsta atriði í lista.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Skilar síðasta atriði í lista.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Skilar einhverju atriði úr lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Fjarlægir og skilar atriðinu á hinum tiltekna stað í lista. #1 er fyrsta atriðið.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Fjarlægir og skilar atriðinu á hinum tiltekna stað í lista. #1 er síðasta atriðið.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Fjarlægir og skilar atriðinu á hinum tiltekna stað í lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Fjarlægir og skilar fyrsta atriðinu í lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Fjarlægir og skilar síðasta atriðinu í lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Fjarlægir og skilar einhverju atriði úr lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Fjarlægir atriðið á hinum tiltekna stað í lista. #1 er fyrsta atriðið.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Fjarlægir atriðið á hinum tiltekna stað í lista. #1 er síðasta atriðið.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Fjarlægir atriðið á hinum tiltekna stað í lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Fjarlægir fyrsta atriðið í lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Fjarlægir síðasta atriðið í lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Fjarlægir eitthvert atriði úr lista.", @@ -291,13 +293,11 @@ "LISTS_SET_INDEX_SET": "setja í", "LISTS_SET_INDEX_INSERT": "bæta við", "LISTS_SET_INDEX_INPUT_TO": "sem", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Setur atriðið í tiltekna sætið í listanum. #1 er fyrsta atriðið.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Setur atriðið í tiltekna sætið í listanum. #1 er síðasta atriðið.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Setur atriðið í tiltekna sætið í listanum.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Setur atriðið í fyrsta sæti lista.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Setur atriðið í síðasta sæti lista.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Setur atriðið í eitthvert sæti lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Bætir atriðinu í listann á tilteknum stað. #1 er fyrsta atriðið.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Bætir atriðinu í listann á tilteknum stað. #1 er síðasta atriðið.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Bætir atriðinu í listann á tilteknum stað.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Bætir atriðinu fremst í listann.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Bætir atriðinu aftan við listann.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Bætir atriðinu einhversstaðar við listann.", @@ -309,6 +309,14 @@ "LISTS_GET_SUBLIST_END_FROM_END": "til # frá enda", "LISTS_GET_SUBLIST_END_LAST": "til síðasta", "LISTS_GET_SUBLIST_TOOLTIP": "Býr til afrit af tilteknum hluta lista.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "raða %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Raða afriti lista.", + "LISTS_SORT_ORDER_ASCENDING": "hækkandi", + "LISTS_SORT_ORDER_DESCENDING": "lækkandi", + "LISTS_SORT_TYPE_NUMERIC": "í númeraröð", + "LISTS_SORT_TYPE_TEXT": "í stafrófsröð", + "LISTS_SORT_TYPE_IGNORECASE": "í stafrófsröð án tillits til stafstöðu", "LISTS_SPLIT_LIST_FROM_TEXT": "gera lista úr texta", "LISTS_SPLIT_TEXT_FROM_LIST": "gera texta úr lista", "LISTS_SPLIT_WITH_DELIMITER": "með skiltákni", @@ -327,6 +335,7 @@ "PROCEDURES_BEFORE_PARAMS": "með:", "PROCEDURES_CALL_BEFORE_PARAMS": "með:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Býr til fall sem skilar engu.", + "PROCEDURES_DEFNORETURN_COMMENT": "Lýstu þessari aðgerð/falli...", "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "skila", "PROCEDURES_DEFRETURN_TOOLTIP": "Býr til fall sem skilar úttaki.", @@ -343,5 +352,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Sýna skilgreiningu falls", "PROCEDURES_CREATE_DO": "Búa til '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Ef gildi er satt, skal skila öðru gildi.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Aðvörun: Þennan kubb má aðeins nota í skilgreiningu falls." } diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/it.json b/src/opsoro/server/static/js/blockly/msg/json/it.json similarity index 88% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/it.json rename to src/opsoro/server/static/js/blockly/msg/json/it.json index 17ee1f7..122bad3 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/it.json +++ b/src/opsoro/server/static/js/blockly/msg/json/it.json @@ -6,7 +6,9 @@ "Nerimic", "Gbonanome", "Gianfranco", - "Federico Mugnaini" + "Federico Mugnaini", + "JackLantern", + "Selven" ] }, "VARIABLES_DEFAULT_NAME": "elemento", @@ -18,6 +20,8 @@ "INLINE_INPUTS": "Ingressi in linea", "DELETE_BLOCK": "Cancella blocco", "DELETE_X_BLOCKS": "Cancella %1 blocchi", + "DELETE_ALL_BLOCKS": "Cancellare tutti i %1 blocchi?", + "CLEAN_UP": "Pulisci i blocchi", "COLLAPSE_BLOCK": "Comprimi blocco", "COLLAPSE_ALL": "Comprimi blocchi", "EXPAND_BLOCK": "Espandi blocco", @@ -25,14 +29,16 @@ "DISABLE_BLOCK": "Disattiva blocco", "ENABLE_BLOCK": "Attiva blocco", "HELP": "Aiuto", - "CHAT": "Chatta con il tuo collaboratore scrivendo in questo box!", - "AUTH": "Autorizza questa applicazione per consentire di salvare il tuo lavoro e per essere condiviso.", - "ME": "Me", + "UNDO": "Annulla", + "REDO": "Ripeti", "CHANGE_VALUE_TITLE": "Modifica valore:", - "NEW_VARIABLE": "Nuova variabile...", - "NEW_VARIABLE_TITLE": "Nome della nuova variabile:", "RENAME_VARIABLE": "Rinomina variabile...", "RENAME_VARIABLE_TITLE": "Rinomina tutte le variabili '%1' in:", + "NEW_VARIABLE": "Crea variabile...", + "NEW_VARIABLE_TITLE": "Nome della nuova variabile:", + "VARIABLE_ALREADY_EXISTS": "Una variabile denominata '%1' esiste già.", + "DELETE_VARIABLE_CONFIRMATION": "Cancella %1 usi della variabile '%2'?", + "DELETE_VARIABLE": "Cancella la variabile '%1'", "COLOUR_PICKER_HELPURL": "https://it.wikipedia.org/wiki/Colore", "COLOUR_PICKER_TOOLTIP": "Scegli un colore dalla tavolozza.", "COLOUR_RANDOM_TITLE": "colore casuale", @@ -180,7 +186,7 @@ "TEXT_LENGTH_TOOLTIP": "Restituisce il numero di lettere (inclusi gli spazi) nel testo fornito.", "TEXT_ISEMPTY_TITLE": "%1 è vuoto", "TEXT_ISEMPTY_TOOLTIP": "Restituisce vero se il testo fornito è vuoto.", - "TEXT_INDEXOF_TOOLTIP": "Restituisce l'indice della prima occorrenza del primo testo all'interno del secondo testo. Restituisce 0 se il testo non viene trovato.", + "TEXT_INDEXOF_TOOLTIP": "Restituisce l'indice della prima occorrenza del primo testo all'interno del secondo testo. Restituisce %1 se il testo non viene trovato.", "TEXT_INDEXOF_INPUT_INTEXT": "nel testo", "TEXT_INDEXOF_OPERATOR_FIRST": "trova la prima occorrenza del testo", "TEXT_INDEXOF_OPERATOR_LAST": "trova l'ultima occorrenza del testo", @@ -213,6 +219,12 @@ "TEXT_PROMPT_TYPE_NUMBER": "richiedi numero con messaggio", "TEXT_PROMPT_TOOLTIP_NUMBER": "Richiedi un numero all'utente.", "TEXT_PROMPT_TOOLTIP_TEXT": "Richiede del testo da parte dell'utente.", + "TEXT_COUNT_MESSAGE0": "conta %1 in %2", + "TEXT_COUNT_TOOLTIP": "Contare quante volte una parte di testo si ripete all'interno di qualche altro testo.", + "TEXT_REPLACE_MESSAGE0": "sostituisci %1 con %2 in %3", + "TEXT_REPLACE_TOOLTIP": "sostituisci tutte le occorrenze di un certo testo con qualche altro testo.", + "TEXT_REVERSE_MESSAGE0": "inverti %1", + "TEXT_REVERSE_TOOLTIP": "Inverte l'ordine dei caratteri nel testo.", "LISTS_CREATE_EMPTY_TITLE": "crea lista vuota", "LISTS_CREATE_EMPTY_TOOLTIP": "Restituisce una lista, di lunghezza 0, contenente nessun record di dati", "LISTS_CREATE_WITH_TOOLTIP": "Crea una lista con un certo numero di elementi.", @@ -229,7 +241,7 @@ "LISTS_INLIST": "nella lista", "LISTS_INDEX_OF_FIRST": "trova la prima occorrenza dell'elemento", "LISTS_INDEX_OF_LAST": "trova l'ultima occorrenza dell'elemento", - "LISTS_INDEX_OF_TOOLTIP": "Restituisce l'indice della prima/ultima occorrenza dell'elemento nella lista. Restituisce 0 se il testo non viene trovato.", + "LISTS_INDEX_OF_TOOLTIP": "Restituisce l'indice della prima/ultima occorrenza dell'elemento nella lista. Restituisce %1 se l'elemento non viene trovato.", "LISTS_GET_INDEX_GET": "prendi", "LISTS_GET_INDEX_GET_REMOVE": "prendi e rimuovi", "LISTS_GET_INDEX_REMOVE": "rimuovi", @@ -237,31 +249,28 @@ "LISTS_GET_INDEX_FIRST": "primo", "LISTS_GET_INDEX_LAST": "ultimo", "LISTS_GET_INDEX_RANDOM": "casuale", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Restituisce l'elemento nella posizione indicata della lista. 1 corrisponde al primo elemento della lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Restituisce l'elemento nella posizione indicata della lista. 1 corrisponde all'ultimo elemento.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 corrisponde al primo elemento.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 corrisponde all'ultimo elemento.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Restituisce l'elemento nella posizione indicata della lista.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Restituisce il primo elemento in una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Restituisce l'ultimo elemento in una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Restituisce un elemento casuale in una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Rimuove e restituisce l'elemento nella posizione indicata in una lista. 1 corrisponde al primo elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Rimuove e restituisce l'elemento nella posizione indicata in una lista. 1 corrisponde all'ultimo elemento.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Rimuove e restituisce l'elemento nella posizione indicata in una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Rimuove e restituisce il primo elemento in una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Restituisce e rimuove l'ultimo elemento in una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Restituisce e rimuove un elemento casuale in una lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Rimuove l'elemento nella posizione indicata in una lista. 1 corrisponde al primo elemento.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Rimuove l'elemento nella posizione indicata in una lista. 1 corrisponde all'ultimo elemento.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Rimuove l'elemento nella posizione indicata in una lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Rimuove il primo elemento in una lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Rimuove l'ultimo elemento in una lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Rimuove un elemento casuale in una lista.", "LISTS_SET_INDEX_SET": "imposta", "LISTS_SET_INDEX_INSERT": "inserisci in", "LISTS_SET_INDEX_INPUT_TO": "come", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Imposta l'elemento nella posizione indicata di una lista. 1 corrisponde al primo elemento.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Imposta l'elemento nella posizione indicata di una lista. 1 corrisponde all'ultimo elemento.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Imposta l'elemento nella posizione indicata di una lista.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Imposta il primo elemento in una lista.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Imposta l'ultimo elemento in una lista.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Imposta un elemento casuale in una lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Inserisci un elemento nella posizione indicata in una lista. #1 corrisponde al primo elemento.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Inserisci l'elemento nella posizione indicata in una lista. #1 corrisponde all'ultimo elemento.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Inserisci un elemento nella posizione indicata in una lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Inserisci l'elemento all'inizio della lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Aggiungi un elemento alla fine di una lista", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Inserisce l'elemento casualmente in una lista.", @@ -272,11 +281,21 @@ "LISTS_GET_SUBLIST_END_FROM_END": "da # dalla fine", "LISTS_GET_SUBLIST_END_LAST": "dagli ultimi", "LISTS_GET_SUBLIST_TOOLTIP": "Crea una copia della porzione specificata di una lista.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "ordinamento %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Ordina una copia di un elenco.", + "LISTS_SORT_ORDER_ASCENDING": "crescente", + "LISTS_SORT_ORDER_DESCENDING": "decrescente", + "LISTS_SORT_TYPE_NUMERIC": "numerico", + "LISTS_SORT_TYPE_TEXT": "alfabetico", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetico, ignorare differenze maiuscole e minuscole", "LISTS_SPLIT_LIST_FROM_TEXT": "crea lista da testo", "LISTS_SPLIT_TEXT_FROM_LIST": "crea testo da lista", "LISTS_SPLIT_WITH_DELIMITER": "con delimitatore", "LISTS_SPLIT_TOOLTIP_SPLIT": "Dividi il testo in un elenco di testi, interrompendo ad ogni delimitatore.", "LISTS_SPLIT_TOOLTIP_JOIN": "Unisci una lista di testi in un unico testo, separato da un delimitatore.", + "LISTS_REVERSE_MESSAGE0": "inverti %1", + "LISTS_REVERSE_TOOLTIP": "Inverti una copia di un elenco.", "VARIABLES_GET_TOOLTIP": "Restituisce il valore di una variabile.", "VARIABLES_GET_CREATE_SET": "Crea 'imposta %1'", "VARIABLES_SET": "imposta %1 a %2", @@ -287,13 +306,14 @@ "PROCEDURES_BEFORE_PARAMS": "conː", "PROCEDURES_CALL_BEFORE_PARAMS": "conː", "PROCEDURES_DEFNORETURN_TOOLTIP": "Crea una funzione senza output.", + "PROCEDURES_DEFNORETURN_COMMENT": "Descrivi questa funzione...", "PROCEDURES_DEFRETURN_RETURN": "ritorna", "PROCEDURES_DEFRETURN_TOOLTIP": "Crea una funzione con un output.", "PROCEDURES_ALLOW_STATEMENTS": "consenti dichiarazioni", "PROCEDURES_DEF_DUPLICATE_WARNING": "Attenzioneː Questa funzione ha parametri duplicati.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://it.wikipedia.org/wiki/Funzione_(informatica)", + "PROCEDURES_CALLNORETURN_HELPURL": "https://it.wikipedia.org/wiki/Funzione_%28informatica%29", "PROCEDURES_CALLNORETURN_TOOLTIP": "Esegue la funzione definita dall'utente '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://it.wikipedia.org/wiki/Funzione_(informatica)", + "PROCEDURES_CALLRETURN_HELPURL": "https://it.wikipedia.org/wiki/Funzione_%28informatica%29", "PROCEDURES_CALLRETURN_TOOLTIP": "Esegue la funzione definita dall'utente '%1' ed usa il suo output.", "PROCEDURES_MUTATORCONTAINER_TITLE": "input", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Aggiungi, rimuovi o riordina input alla funzione.", @@ -302,5 +322,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Evidenzia definizione di funzione", "PROCEDURES_CREATE_DO": "Crea '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Se un valore è vero allora restituisce un secondo valore.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Attenzioneː Questo blocco può essere usato solo all'interno di una definizione di funzione." } diff --git a/src/opsoro/server/static/js/blockly/msg/json/ja.json b/src/opsoro/server/static/js/blockly/msg/json/ja.json new file mode 100644 index 0000000..3a187a7 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/ja.json @@ -0,0 +1,359 @@ +{ + "@metadata": { + "authors": [ + "Shirayuki", + "Oda", + "아라", + "Otokoume", + "Sujiniku", + "Sgk", + "TAKAHASHI Shuuji", + "Suiato", + "ネイ" + ] + }, + "VARIABLES_DEFAULT_NAME": "項目", + "TODAY": "今日", + "DUPLICATE_BLOCK": "複製", + "ADD_COMMENT": "コメントを追加", + "REMOVE_COMMENT": "コメントを削除", + "EXTERNAL_INPUTS": "外部入力", + "INLINE_INPUTS": "インライン入力", + "DELETE_BLOCK": "ブロックを削除", + "DELETE_X_BLOCKS": "%1 個のブロックを削除", + "DELETE_ALL_BLOCKS": "%1件のすべてのブロックを削除しますか?", + "CLEAN_UP": "ブロックを整理する", + "COLLAPSE_BLOCK": "ブロックを折りたたむ", + "COLLAPSE_ALL": "ブロックを折りたたむ", + "EXPAND_BLOCK": "ブロックを展開する", + "EXPAND_ALL": "ブロックを展開する", + "DISABLE_BLOCK": "ブロックを無効にする", + "ENABLE_BLOCK": "ブロックを有効にする", + "HELP": "ヘルプ", + "UNDO": "取り消す", + "REDO": "やり直す", + "CHANGE_VALUE_TITLE": "値を変える:", + "RENAME_VARIABLE": "変数の名前を変える…", + "RENAME_VARIABLE_TITLE": "選択した%1の変数すべての名前を変える:", + "NEW_VARIABLE": "変数の作成…", + "NEW_VARIABLE_TITLE": "新しい変数の名前:", + "VARIABLE_ALREADY_EXISTS": "変数名 '%1' は既に存在しています。", + "DELETE_VARIABLE_CONFIRMATION": "%1か所で使われている変数 '%2' を削除しますか?", + "DELETE_VARIABLE": "変数 '%1' を削除", + "COLOUR_PICKER_HELPURL": "https://ja.wikipedia.org/wiki/色", + "COLOUR_PICKER_TOOLTIP": "パレットから色を選んでください。", + "COLOUR_RANDOM_TITLE": "ランダムな色", + "COLOUR_RANDOM_TOOLTIP": "ランダムな色を選ぶ。", + "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", + "COLOUR_RGB_TITLE": "色づけ", + "COLOUR_RGB_RED": "赤", + "COLOUR_RGB_GREEN": "緑", + "COLOUR_RGB_BLUE": "青", + "COLOUR_RGB_TOOLTIP": "赤、緑、および青の指定された量で色を作成します。すべての値は 0 ~ 100 の間でなければなりません。", + "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", + "COLOUR_BLEND_TITLE": "ブレンド", + "COLOUR_BLEND_COLOUR1": "色 1", + "COLOUR_BLEND_COLOUR2": "色 2", + "COLOUR_BLEND_RATIO": "比率", + "COLOUR_BLEND_TOOLTIP": "2色を与えられた比率(0.0~1.0)で混ぜます。", + "CONTROLS_REPEAT_HELPURL": "https://ja.wikipedia.org/wiki/for文", + "CONTROLS_REPEAT_TITLE": "%1 回繰り返します", + "CONTROLS_REPEAT_INPUT_DO": "実行", + "CONTROLS_REPEAT_TOOLTIP": "いくつかのステートメントを数回実行します。", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "繰り返す:続ける条件", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "繰り返す:終わる条件", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "値がtrueの間、いくつかのステートメントを実行する。", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "値がfalseの間、いくつかのステートメントを実行する。", + "CONTROLS_FOR_TOOLTIP": "変数 '%1' が開始番号から終了番号まで指定した間隔での値をとって、指定したブロックを実行する。", + "CONTROLS_FOR_TITLE": "カウントする( 変数: %1 範囲: %2 ~ %3 間隔: %4 )", + "CONTROLS_FOREACH_TITLE": "リスト%2の各項目%1について", + "CONTROLS_FOREACH_TOOLTIP": "リストの各項目について、その項目を変数'%1'として、いくつかのステートメントを実行します。", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ループから抜け出します", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "ループの次の反復処理を続行します", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "入っているループから抜け出します。", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "このループの残りの部分をスキップして、ループの繰り返しを続けます。", + "CONTROLS_FLOW_STATEMENTS_WARNING": "注意: このブロックは、ループ内でのみ使用できます。", + "CONTROLS_IF_TOOLTIP_1": "値が true の場合、ステートメントを実行します。", + "CONTROLS_IF_TOOLTIP_2": "値が true 場合は、ステートメントの最初のブロックを行います。それ以外の場合は、ステートメントの 2 番目のブロックを行います。", + "CONTROLS_IF_TOOLTIP_3": "最初の値が true 場合は、ステートメントの最初のブロックを行います。それ以外の場合は、2 番目の値が true の場合、ステートメントの 2 番目のブロックをします。", + "CONTROLS_IF_TOOLTIP_4": "最初の値が true 場合は、ステートメントの最初のブロックを行います。2 番目の値が true の場合は、ステートメントの 2 番目のブロックを行います。それ以外の場合は最後のブロックのステートメントを行います。", + "CONTROLS_IF_MSG_IF": "もしも", + "CONTROLS_IF_MSG_ELSEIF": "他でもしも", + "CONTROLS_IF_MSG_ELSE": "他", + "CONTROLS_IF_IF_TOOLTIP": "追加、削除、またはセクションを順序変更して、ブロックをこれを再構成します。", + "CONTROLS_IF_ELSEIF_TOOLTIP": "「もしも」のブロックに条件を追加します。", + "CONTROLS_IF_ELSE_TOOLTIP": "Ifブロックに、すべてをキャッチする条件を追加。", + "LOGIC_COMPARE_HELPURL": "https://ja.wikipedia.org/wiki/不等式", + "LOGIC_COMPARE_TOOLTIP_EQ": "もし両方がお互いに等しく入力した場合は true を返します。", + "LOGIC_COMPARE_TOOLTIP_NEQ": "両方の入力が互いに等しくない場合に true を返します。", + "LOGIC_COMPARE_TOOLTIP_LT": "最初の入力が 2 番目の入力よりも小さいい場合は true を返します。", + "LOGIC_COMPARE_TOOLTIP_LTE": "もし、最初の入力が二つ目入力より少ないか、おなじであったらTRUEをかえしてください", + "LOGIC_COMPARE_TOOLTIP_GT": "最初の入力が 2 番目の入力よりも大きい場合は true を返します。", + "LOGIC_COMPARE_TOOLTIP_GTE": "もし入力がふたつめの入よりも大きかったらtrueをり返します。", + "LOGIC_OPERATION_TOOLTIP_AND": "両方の入力が true のときに true を返します。", + "LOGIC_OPERATION_AND": "かつ", + "LOGIC_OPERATION_TOOLTIP_OR": "少なくとも 1 つの入力が true のときに true を返します。", + "LOGIC_OPERATION_OR": "または", + "LOGIC_NEGATE_HELPURL": "https://ja.wikipedia.org/wiki/否定", + "LOGIC_NEGATE_TITLE": "%1ではない", + "LOGIC_NEGATE_TOOLTIP": "入力が false の場合は、true を返します。入力が true の場合は false を返します。", + "LOGIC_BOOLEAN_TRUE": "true", + "LOGIC_BOOLEAN_FALSE": "false", + "LOGIC_BOOLEAN_TOOLTIP": "True または false を返します。", + "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", + "LOGIC_NULL": "null", + "LOGIC_NULL_TOOLTIP": "null を返します。", + "LOGIC_TERNARY_HELPURL": "https://ja.wikipedia.org/wiki/%3F:", + "LOGIC_TERNARY_CONDITION": "テスト", + "LOGIC_TERNARY_IF_TRUE": "true の場合", + "LOGIC_TERNARY_IF_FALSE": "false の場合", + "LOGIC_TERNARY_TOOLTIP": "'テスト' の条件をチェックします。条件が true の場合、'true' の値を返します。それ以外の場合 'false' のを返します。", + "MATH_NUMBER_HELPURL": "https://ja.wikipedia.org/wiki/数", + "MATH_NUMBER_TOOLTIP": "数です。", + "MATH_ADDITION_SYMBOL": "+", + "MATH_SUBTRACTION_SYMBOL": "-", + "MATH_DIVISION_SYMBOL": "÷", + "MATH_MULTIPLICATION_SYMBOL": "×", + "MATH_POWER_SYMBOL": "^", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "asin", + "MATH_TRIG_ACOS": "acos", + "MATH_TRIG_ATAN": "atan", + "MATH_ARITHMETIC_HELPURL": "https://ja.wikipedia.org/wiki/算術", + "MATH_ARITHMETIC_TOOLTIP_ADD": "2 つの数の合計を返します。", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "2 つの数の差を返します。", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "2 つの数の積を返します。", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "2 つの数の商を返します。", + "MATH_ARITHMETIC_TOOLTIP_POWER": "最初の数を2 番目の値で累乗した結果を返します。", + "MATH_SINGLE_HELPURL": "https://ja.wikipedia.org/wiki/平方根", + "MATH_SINGLE_OP_ROOT": "平方根", + "MATH_SINGLE_TOOLTIP_ROOT": "平方根を返す。", + "MATH_SINGLE_OP_ABSOLUTE": "絶対値", + "MATH_SINGLE_TOOLTIP_ABS": "絶対値を返す。", + "MATH_SINGLE_TOOLTIP_NEG": "負の数を返す。", + "MATH_SINGLE_TOOLTIP_LN": "数値の自然対数を返す。", + "MATH_SINGLE_TOOLTIP_LOG10": "底が10の対数を返す。", + "MATH_SINGLE_TOOLTIP_EXP": "ネイピア数eの数値乗を返す。", + "MATH_SINGLE_TOOLTIP_POW10": "10の数値乗を返す。", + "MATH_TRIG_HELPURL": "https://ja.wikipedia.org/wiki/三角関数", + "MATH_TRIG_TOOLTIP_SIN": "(ラジアンではなく)度数の正弦(sin)を返す。", + "MATH_TRIG_TOOLTIP_COS": "(ラジアンではなく)度数の余弦(cosin)を返す。", + "MATH_TRIG_TOOLTIP_TAN": "(ラジアンではなく)度数の正接(tan)を返す。", + "MATH_TRIG_TOOLTIP_ASIN": "アークサイン(arcsin)を返す。", + "MATH_TRIG_TOOLTIP_ACOS": "アークコサイン(arccosin)を返す。", + "MATH_TRIG_TOOLTIP_ATAN": "アークタンジェント(arctan)を返す。", + "MATH_CONSTANT_HELPURL": "https://ja.wikipedia.org/wiki/数学定数", + "MATH_CONSTANT_TOOLTIP": "いずれかの共通の定数のを返す: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (無限).", + "MATH_IS_EVEN": "は偶数", + "MATH_IS_ODD": "は奇数", + "MATH_IS_PRIME": "は素数", + "MATH_IS_WHOLE": "は整数", + "MATH_IS_POSITIVE": "は正", + "MATH_IS_NEGATIVE": "は負", + "MATH_IS_DIVISIBLE_BY": "は以下で割りきれる:", + "MATH_IS_TOOLTIP": "数字が、偶数、奇数、素数、整数、正数、負数、または特定の数で割り切れるかどうかを判定し、true か false を返します。", + "MATH_CHANGE_HELPURL": "https://ja.wikipedia.org/wiki/加法", + "MATH_CHANGE_TITLE": "変更 %1 に %2", + "MATH_CHANGE_TOOLTIP": "変数'%1'に数をたす。", + "MATH_ROUND_HELPURL": "https://ja.wikipedia.org/wiki/端数処理", + "MATH_ROUND_TOOLTIP": "数値を切り上げるか切り捨てる", + "MATH_ROUND_OPERATOR_ROUND": "四捨五入", + "MATH_ROUND_OPERATOR_ROUNDUP": "切り上げ", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "切り捨て", + "MATH_ONLIST_HELPURL": "", + "MATH_ONLIST_OPERATOR_SUM": "リストの合計", + "MATH_ONLIST_TOOLTIP_SUM": "リストの数値を足して返す。", + "MATH_ONLIST_OPERATOR_MIN": "リストの最小値", + "MATH_ONLIST_TOOLTIP_MIN": "リストの最小値を返す。", + "MATH_ONLIST_OPERATOR_MAX": "リストの最大値", + "MATH_ONLIST_TOOLTIP_MAX": "リストの最大値を返す。", + "MATH_ONLIST_OPERATOR_AVERAGE": "リストの平均", + "MATH_ONLIST_TOOLTIP_AVERAGE": "リストの数値の平均 (算術平均) を返す。", + "MATH_ONLIST_OPERATOR_MEDIAN": "リストの中央値", + "MATH_ONLIST_TOOLTIP_MEDIAN": "リストの中央値を返す。", + "MATH_ONLIST_OPERATOR_MODE": "一覧モード", + "MATH_ONLIST_TOOLTIP_MODE": "リスト中の最頻項目のリストを返す。", + "MATH_ONLIST_OPERATOR_STD_DEV": "リストの標準偏差", + "MATH_ONLIST_TOOLTIP_STD_DEV": "リストの標準偏差を返す。", + "MATH_ONLIST_OPERATOR_RANDOM": "リストからランダムに選ばれた項目", + "MATH_ONLIST_TOOLTIP_RANDOM": "リストからランダムに選ばれた要素を返す。", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "%1÷%2の余り", + "MATH_MODULO_TOOLTIP": "2つの数値の割り算の余りを返す。", + "MATH_CONSTRAIN_TITLE": "%1の下限を%2に上限を%3に制限", + "MATH_CONSTRAIN_TOOLTIP": "指定した上限と下限の間に値を制限する(上限と下限の値を含む)。", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "%1から%2までのランダムな整数", + "MATH_RANDOM_INT_TOOLTIP": "指定された(上下限を含む)範囲のランダムな整数を返します。", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "1未満の正の乱数", + "MATH_RANDOM_FLOAT_TOOLTIP": "0.0以上で1.0未満の範囲の乱数を返します。", + "TEXT_TEXT_HELPURL": "https://ja.wikipedia.org/wiki/文字列", + "TEXT_TEXT_TOOLTIP": "文字、単語、または行のテキスト。", + "TEXT_JOIN_TITLE_CREATEWITH": "テキストの作成:", + "TEXT_JOIN_TOOLTIP": "任意の数の項目一部を一緒に接合してテキストを作成。", + "TEXT_CREATE_JOIN_TITLE_JOIN": "結合", + "TEXT_CREATE_JOIN_TOOLTIP": "セクションを追加、削除、または順序変更して、ブロックを再構成。", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "テキストへ項目を追加。", + "TEXT_APPEND_TO": "項目", + "TEXT_APPEND_APPENDTEXT": "へテキストを追加", + "TEXT_APPEND_TOOLTIP": "変数 '%1' にテキストを追加。", + "TEXT_LENGTH_TITLE": "%1の長さ", + "TEXT_LENGTH_TOOLTIP": "与えられたテキストの(スペースを含む)文字数を返す。", + "TEXT_ISEMPTY_TITLE": "%1が空", + "TEXT_ISEMPTY_TOOLTIP": "与えられたテキストが空の場合は true を返す。", + "TEXT_INDEXOF_TOOLTIP": "二番目のテキストの中で一番目のテキストが最初/最後に出現したインデックスを返す。テキストが見つからない場合は%1を返す。", + "TEXT_INDEXOF_INPUT_INTEXT": "テキスト", + "TEXT_INDEXOF_OPERATOR_FIRST": "で以下のテキストの最初の出現箇所を検索:", + "TEXT_INDEXOF_OPERATOR_LAST": "テキストの最後の出現箇所を検索", + "TEXT_INDEXOF_TAIL": "", + "TEXT_CHARAT_INPUT_INTEXT": "テキスト", + "TEXT_CHARAT_FROM_START": "で、文字# を取得", + "TEXT_CHARAT_FROM_END": "一番最後の言葉、キャラクターを所得", + "TEXT_CHARAT_FIRST": "最初の文字を得る", + "TEXT_CHARAT_LAST": "最後の文字を得る", + "TEXT_CHARAT_RANDOM": "ランダムな文字を得る", + "TEXT_CHARAT_TAIL": "", + "TEXT_CHARAT_TOOLTIP": "指定された位置に文字を返します。", + "TEXT_GET_SUBSTRING_TOOLTIP": "テキストの指定部分を返します。", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "テキストで", + "TEXT_GET_SUBSTRING_START_FROM_START": "文字列からの部分文字列を取得 #", + "TEXT_GET_SUBSTRING_START_FROM_END": "部分文字列を取得する #端から得る", + "TEXT_GET_SUBSTRING_START_FIRST": "部分文字列を取得する。", + "TEXT_GET_SUBSTRING_END_FROM_START": "# の文字", + "TEXT_GET_SUBSTRING_END_FROM_END": "文字列の# 終わりからの#", + "TEXT_GET_SUBSTRING_END_LAST": "最後のの文字", + "TEXT_GET_SUBSTRING_TAIL": "", + "TEXT_CHANGECASE_TOOLTIP": "別のケースに、テキストのコピーを返します。", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "大文字に変換する", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "小文字に", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "タイトル ケースに", + "TEXT_TRIM_TOOLTIP": "スペースを 1 つまたは両方の端から削除したのち、テキストのコピーを返します。", + "TEXT_TRIM_OPERATOR_BOTH": "両端のスペースを取り除く", + "TEXT_TRIM_OPERATOR_LEFT": "左端のスペースを取り除く", + "TEXT_TRIM_OPERATOR_RIGHT": "右端のスペースを取り除く", + "TEXT_PRINT_TITLE": "%1 を印刷します。", + "TEXT_PRINT_TOOLTIP": "指定したテキスト、番号または他の値を印刷します。", + "TEXT_PROMPT_TYPE_TEXT": "メッセージでテキスト入力を求める", + "TEXT_PROMPT_TYPE_NUMBER": "メッセージで番号の入力を求める", + "TEXT_PROMPT_TOOLTIP_NUMBER": "ユーザーに数値のインプットを求める。", + "TEXT_PROMPT_TOOLTIP_TEXT": "ユーザーにテキスト入力を求める。", + "TEXT_COUNT_MESSAGE0": "%2に含まれる%1の数を数える", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "とある文が別の文のなかに使われた回数を数える。", + "TEXT_REPLACE_MESSAGE0": "%3に含まれる%1を%2に置換", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "文に含まれるキーワードを置換する。", + "TEXT_REVERSE_MESSAGE0": "%1を逆順に", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "文の文字を逆順にする。", + "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", + "LISTS_CREATE_EMPTY_TITLE": "空のリストを作成", + "LISTS_CREATE_EMPTY_TOOLTIP": "長さ0でデータ・レコードを含まない空のリストを返す", + "LISTS_CREATE_WITH_TOOLTIP": "項目数が不定のリストを作成。", + "LISTS_CREATE_WITH_INPUT_WITH": "以下を使ってリストを作成:", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "リスト", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "追加、削除、またはセクションの順序変更をして、このリスト・ブロックを再構成する。", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "リストに項目を追加。", + "LISTS_REPEAT_TOOLTIP": "与えられた値を指定された回数繰り返してリストを作成。", + "LISTS_REPEAT_TITLE": "項目%1を%2回繰り返したリストを作成", + "LISTS_LENGTH_TITLE": "%1の長さ", + "LISTS_LENGTH_TOOLTIP": "リストの長さを返します。", + "LISTS_ISEMPTY_TITLE": "%1が空", + "LISTS_ISEMPTY_TOOLTIP": "リストが空の場合は、true を返します。", + "LISTS_INLIST": "リストで", + "LISTS_INDEX_OF_FIRST": "最初に見つかった項目を検索します。", + "LISTS_INDEX_OF_LAST": "最後に見つかったアイテムを見つける", + "LISTS_INDEX_OF_TOOLTIP": "リスト項目の最初/最後に出現するインデックス位置を返します。項目が見つからない場合は %1 を返します。", + "LISTS_GET_INDEX_GET": "取得", + "LISTS_GET_INDEX_GET_REMOVE": "取得と削除", + "LISTS_GET_INDEX_REMOVE": "削除", + "LISTS_GET_INDEX_FROM_START": "#", + "LISTS_GET_INDEX_FROM_END": "後ろから #", + "LISTS_GET_INDEX_FIRST": "最初", + "LISTS_GET_INDEX_LAST": "最後", + "LISTS_GET_INDEX_RANDOM": "ランダム", + "LISTS_GET_INDEX_TAIL": "", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 は、最初の項目です。", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 は、最後の項目です。", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "リスト内の指定位置にある項目を返します。", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "リストの最初の項目を返します。", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "リストの最後の項目を返します。", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "ランダム アイテム リストを返します。", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "リスト内の指定位置にある項目を削除し、返します。", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "リスト内の最初の項目を削除し返します。", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "リスト内の最後の項目を削除したあと返します。", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "リストのランダムなアイテムを削除し返します。", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "リスト内の指定された項目を削除します。", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "リスト内の最初の項目を削除します。", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "リスト内の最後の項目を削除します。", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "リスト内にあるアイテムをランダムに削除します。", + "LISTS_SET_INDEX_SET": "セット", + "LISTS_SET_INDEX_INSERT": "挿入位置:", + "LISTS_SET_INDEX_INPUT_TO": "として", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "リスト内の指定された位置に項目を設定します。", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "リスト内に最初の項目を設定します。", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "リスト内の最後の項目を設定します。", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "リスト内にランダムなアイテムを設定します。", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "リスト内の指定位置に項目を挿入します。", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "リストの先頭に項目を挿入します。", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "リストの末尾に項目を追加します。", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "リストに項目をランダムに挿入します。", + "LISTS_GET_SUBLIST_START_FROM_START": "# からサブディレクトリのリストを取得します。", + "LISTS_GET_SUBLIST_START_FROM_END": "端から #のサブリストを取得します。", + "LISTS_GET_SUBLIST_START_FIRST": "最初からサブリストを取得する。", + "LISTS_GET_SUBLIST_END_FROM_START": "#へ", + "LISTS_GET_SUBLIST_END_FROM_END": "最後から#へ", + "LISTS_GET_SUBLIST_END_LAST": "最後へ", + "LISTS_GET_SUBLIST_TAIL": "", + "LISTS_GET_SUBLIST_TOOLTIP": "リストの指定された部分のコピーを作成してくださ。", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "並べ替え(タイプ:%1、順番:%2、項目のリスト:%3)", + "LISTS_SORT_TOOLTIP": "リストのコピーを並べ替え", + "LISTS_SORT_ORDER_ASCENDING": "昇順", + "LISTS_SORT_ORDER_DESCENDING": "降順", + "LISTS_SORT_TYPE_NUMERIC": "数値順", + "LISTS_SORT_TYPE_TEXT": "アルファベット順", + "LISTS_SORT_TYPE_IGNORECASE": "アルファベット順(大文字・小文字の区別無し)", + "LISTS_SPLIT_LIST_FROM_TEXT": "テキストからリストを作る", + "LISTS_SPLIT_TEXT_FROM_LIST": "リストからテキストを作る", + "LISTS_SPLIT_WITH_DELIMITER": "区切り記号", + "LISTS_SPLIT_TOOLTIP_SPLIT": "テキストを区切り記号で分割したリストにする", + "LISTS_SPLIT_TOOLTIP_JOIN": "テキストのリストを区切り記号で区切られた一つのテキストにする", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "%1を逆順に", + "LISTS_REVERSE_TOOLTIP": "リストのコピーを逆順にする。", + "ORDINAL_NUMBER_SUFFIX": "", + "VARIABLES_GET_TOOLTIP": "この変数の値を返します。", + "VARIABLES_GET_CREATE_SET": "'セット%1を作成します。", + "VARIABLES_SET": "セット %1 宛先 %2", + "VARIABLES_SET_TOOLTIP": "この入力を変数と等しくなるように設定します。", + "VARIABLES_SET_CREATE_GET": "'%1 を取得' を作成します。", + "PROCEDURES_DEFNORETURN_HELPURL": "https://ja.wikipedia.org/wiki/サブルーチン", + "PROCEDURES_DEFNORETURN_TITLE": "宛先", + "PROCEDURES_DEFNORETURN_PROCEDURE": "何かしてください", + "PROCEDURES_BEFORE_PARAMS": "対象:", + "PROCEDURES_CALL_BEFORE_PARAMS": "対象:", + "PROCEDURES_DEFNORETURN_DO": "", + "PROCEDURES_DEFNORETURN_TOOLTIP": "出力なしの関数を作成します。", + "PROCEDURES_DEFNORETURN_COMMENT": "この関数の説明…", + "PROCEDURES_DEFRETURN_HELPURL": "https://ja.wikipedia.org/wiki/サブルーチン", + "PROCEDURES_DEFRETURN_RETURN": "返す", + "PROCEDURES_DEFRETURN_TOOLTIP": "一つの出力を持つ関数を作成します。", + "PROCEDURES_ALLOW_STATEMENTS": "ステートメントを許可", + "PROCEDURES_DEF_DUPLICATE_WARNING": "警告: この関数には重複するパラメーターがあります。", + "PROCEDURES_CALLNORETURN_HELPURL": "https://ja.wikipedia.org/wiki/サブルーチン", + "PROCEDURES_CALLNORETURN_TOOLTIP": "ユーザー定義関数 '%1' を実行します。", + "PROCEDURES_CALLRETURN_HELPURL": "https://ja.wikipedia.org/wiki/サブルーチン", + "PROCEDURES_CALLRETURN_TOOLTIP": "ユーザー定義関数 '%1' を実行し、その出力を使用します。", + "PROCEDURES_MUTATORCONTAINER_TITLE": "入力", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "この関数への入力の追加、削除、順番変更。", + "PROCEDURES_MUTATORARG_TITLE": "入力名:", + "PROCEDURES_MUTATORARG_TOOLTIP": "関数への入力の追加。", + "PROCEDURES_HIGHLIGHT_DEF": "関数の内容を強調表示します。", + "PROCEDURES_CREATE_DO": "'%1' を作成", + "PROCEDURES_IFRETURN_TOOLTIP": "1番目の値が true の場合、2番目の値を返します。", + "PROCEDURES_IFRETURN_WARNING": "警告: このブロックは、関数定義内でのみ使用できます。" +} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ko.json b/src/opsoro/server/static/js/blockly/msg/json/ko.json similarity index 75% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/ko.json rename to src/opsoro/server/static/js/blockly/msg/json/ko.json index a499ba1..0482856 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ko.json +++ b/src/opsoro/server/static/js/blockly/msg/json/ko.json @@ -7,7 +7,10 @@ "Revi", "SeoJeongHo", "Alex00728", - "Kurousagi" + "Kurousagi", + "Lemondoge", + "Ykhwong", + "Jerrykim306" ] }, "VARIABLES_DEFAULT_NAME": "항목", @@ -18,7 +21,9 @@ "EXTERNAL_INPUTS": "외부 입력", "INLINE_INPUTS": "내부 입력", "DELETE_BLOCK": "블록 삭제", - "DELETE_X_BLOCKS": "블록 %1 삭제", + "DELETE_X_BLOCKS": "블록 %1개 삭제", + "DELETE_ALL_BLOCKS": "모든 블록 %1개를 삭제하겠습니까?", + "CLEAN_UP": "블록 정리", "COLLAPSE_BLOCK": "블록 축소", "COLLAPSE_ALL": "블록 축소", "EXPAND_BLOCK": "블록 확장", @@ -26,20 +31,22 @@ "DISABLE_BLOCK": "블록 비활성화", "ENABLE_BLOCK": "블록 활성화", "HELP": "도움말", - "CHAT": "이 상자에 입력하여 당신의 동료와 채팅하세요!", - "AUTH": "당신의 작업을 저장하고 다른 사람과 공유할 수 있도록 이 애플리케이션을 인증해 주십시오.", - "ME": "나", + "UNDO": "실행 취소", + "REDO": "다시 실행", "CHANGE_VALUE_TITLE": "값 바꾸기:", - "NEW_VARIABLE": "새 변수", - "NEW_VARIABLE_TITLE": "새 변수 이름:", "RENAME_VARIABLE": "변수 이름 바꾸기:", "RENAME_VARIABLE_TITLE": "'%1' 변수 이름을 바꾸기:", + "NEW_VARIABLE": "변수 만들기...", + "NEW_VARIABLE_TITLE": "새 변수 이름:", + "VARIABLE_ALREADY_EXISTS": "'%1' 변수는 이미 존재합니다.", + "DELETE_VARIABLE_CONFIRMATION": "'%2' 변수에서 %1을(를) 삭제하시겠습니까?", + "DELETE_VARIABLE": "'%1' 변수를 삭제합니다", "COLOUR_PICKER_HELPURL": "https://ko.wikipedia.org/wiki/색", "COLOUR_PICKER_TOOLTIP": "팔레트에서 색을 고릅니다", "COLOUR_RANDOM_TITLE": "임의 색상", "COLOUR_RANDOM_TOOLTIP": "무작위로 색을 고릅니다.", "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "RGB 색", + "COLOUR_RGB_TITLE": "색", "COLOUR_RGB_RED": "빨강", "COLOUR_RGB_GREEN": "초록", "COLOUR_RGB_BLUE": "파랑", @@ -57,8 +64,8 @@ "CONTROLS_WHILEUNTIL_HELPURL": "https://ko.wikipedia.org/wiki/While_%EB%A3%A8%ED%94%84", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "동안 반복", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "다음까지 반복", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "값이 참일 때, 몇가지 선언을 합니다.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "값이 거짓일 때, 몇가지 선언을 합니다.", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "값이 참일 때, 몇 가지 선언을 합니다.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "값이 거짓일 때, 몇 가지 선언을 합니다.", "CONTROLS_FOR_HELPURL": "https://ko.wikipedia.org/wiki/For_%EB%A3%A8%ED%94%84", "CONTROLS_FOR_TOOLTIP": "변수 \"%1\"은 지정된 간격으로 시작 수에서 끝 수까지를 세어 지정된 블록을 수행해야 합니다.", "CONTROLS_FOR_TITLE": "으로 계산 %1 %2에서 %4을 이용하여 %3로", @@ -69,20 +76,20 @@ "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "반복 중단", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "다음 반복", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "현재 반복 실행 블럭을 빠져나갑니다.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "나머지 반복 부분을 더이상 실행하지 않고, 다음 반복을 수행합니다.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "나머지 반복 부분을 더 이상 실행하지 않고, 다음 반복을 수행합니다.", "CONTROLS_FLOW_STATEMENTS_WARNING": "경고 : 이 블록은 반복 실행 블럭 안에서만 사용됩니다.", "CONTROLS_IF_HELPURL": "https://ko.wikipedia.org/wiki/%EC%A1%B0%EA%B1%B4%EB%AC%B8", "CONTROLS_IF_TOOLTIP_1": "조건식의 계산 결과가 참이면, 명령을 실행합니다.", - "CONTROLS_IF_TOOLTIP_2": "조건식의 계산 결과가 참이면, 첫번째 블럭의 명령을 실행하고, 그렇지 않으면 두번째 블럭의 명령을 실행합니다.", - "CONTROLS_IF_TOOLTIP_3": "첫번째 조건식의 계산 결과가 참이면, 첫번째 블럭의 명령을 실행하고, 두번째 조건식의 계산 결과가 참이면, 두번째 블럭의 명령을 실행합니다.", - "CONTROLS_IF_TOOLTIP_4": "첫번째 조건식의 계산 결과가 참이면, 첫번째 블럭의 명령을 실행하고, 두번째 조건식의 계산 결과가 참이면, 두번째 블럭의 명령을 실행하고, ... , 어떤 조건식의 계산 결과도 참이 아니면, 마지막 블럭의 명령을 실행합니다.", + "CONTROLS_IF_TOOLTIP_2": "조건식의 계산 결과가 참이면, 첫 번째 블럭의 명령을 실행하고, 그렇지 않으면 두 번째 블럭의 명령을 실행합니다.", + "CONTROLS_IF_TOOLTIP_3": "첫 번째 조건식의 계산 결과가 참이면, 첫 번째 블럭의 명령을 실행하고, 두 번째 조건식의 계산 결과가 참이면, 두 번째 블럭의 명령을 실행합니다.", + "CONTROLS_IF_TOOLTIP_4": "첫 번째 조건식의 계산 결과가 참이면, 첫 번째 블럭의 명령을 실행하고, 두 번째 조건식의 계산 결과가 참이면, 두 번째 블럭의 명령을 실행하고, ... , 어떤 조건식의 계산 결과도 참이 아니면, 마지막 블럭의 명령을 실행합니다.", "CONTROLS_IF_MSG_IF": "만약", "CONTROLS_IF_MSG_ELSEIF": "다른 경우", "CONTROLS_IF_MSG_ELSE": "아니라면", - "CONTROLS_IF_IF_TOOLTIP": "\"만약\" 블럭의 내용을 추가, 삭제, 재구성 합니다.", + "CONTROLS_IF_IF_TOOLTIP": "섹션을 추가, 제거하거나 순서를 변경하여 이 if 블럭을 재구성합니다.", "CONTROLS_IF_ELSEIF_TOOLTIP": "\"만약\" 블럭에 조건 검사를 추가합니다.", "CONTROLS_IF_ELSE_TOOLTIP": "\"만약\" 블럭의 마지막에, 모든 검사 결과가 거짓인 경우 실행할 부분을 추가합니다.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_HELPURL": "https://ko.wikipedia.org/wiki/부등식", "LOGIC_COMPARE_TOOLTIP_EQ": "두 값이 같으면, 참(true) 값을 돌려줍니다.", "LOGIC_COMPARE_TOOLTIP_NEQ": "두 값이 서로 다르면, 참(true) 값을 돌려줍니다.", "LOGIC_COMPARE_TOOLTIP_LT": "첫 번째 값이 두 번째 값보다 작으면, 참(true) 값을 돌려줍니다.", @@ -95,7 +102,7 @@ "LOGIC_OPERATION_TOOLTIP_OR": "적어도 하나의 값이 참일 경우 참을 반환합니다.", "LOGIC_OPERATION_OR": "또는", "LOGIC_NEGATE_HELPURL": "https://ko.wikipedia.org/wiki/%EB%B6%80%EC%A0%95", - "LOGIC_NEGATE_TITLE": "%1 의 반대", + "LOGIC_NEGATE_TITLE": "%1가 아닙니다", "LOGIC_NEGATE_TOOLTIP": "입력값이 거짓이라면 참을 반환합니다. 참이라면 거짓을 반환합니다.", "LOGIC_BOOLEAN_HELPURL": "https://ko.wikipedia.org/wiki/%EC%A7%84%EB%A6%BF%EA%B0%92", "LOGIC_BOOLEAN_TRUE": "참", @@ -104,12 +111,12 @@ "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "빈 값", "LOGIC_NULL_TOOLTIP": "빈 값을 반환합니다.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", + "LOGIC_TERNARY_HELPURL": "https://ko.wikipedia.org/wiki/물음표", "LOGIC_TERNARY_CONDITION": "테스트", "LOGIC_TERNARY_IF_TRUE": "만약 참이라면", "LOGIC_TERNARY_IF_FALSE": "만약 거짓이라면", - "LOGIC_TERNARY_TOOLTIP": "'검사' 를 진행해, 결과가 참(true)이면 '참이면' 부분의 값을 돌려줍니다. ; 결과가 참이 아니면, '거짓이면' 부분의 값을 돌려줍니다.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", + "LOGIC_TERNARY_TOOLTIP": "'test'의 조건을 검사합니다. 조건이 참이면 'if true' 값을 반환합니다. 거짓이면 'if false' 값을 반환합니다.", + "MATH_NUMBER_HELPURL": "https://ko.wikipedia.org/wiki/수_(수학)", "MATH_NUMBER_TOOLTIP": "수", "MATH_ADDITION_SYMBOL": "+", "MATH_SUBTRACTION_SYMBOL": "-", @@ -122,13 +129,13 @@ "MATH_TRIG_ASIN": "asin", "MATH_TRIG_ACOS": "acos", "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_ARITHMETIC_HELPURL": "https://ko.wikipedia.org/wiki/산술", "MATH_ARITHMETIC_TOOLTIP_ADD": "두 수의 합을 반환합니다.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "두 수간의 차이를 반환합니다.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "두 수의 곱을 반환합니다.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "두 수의 나눈 결과를 반환합니다.", "MATH_ARITHMETIC_TOOLTIP_POWER": "첫 번째 수를 두 번째 수 만큼, 거듭제곱 한 결과값을 돌려줍니다.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_HELPURL": "https://ko.wikipedia.org/wiki/제곱근", "MATH_SINGLE_OP_ROOT": "제곱근", "MATH_SINGLE_TOOLTIP_ROOT": "숫자의 제곱근을 반환합니다.", "MATH_SINGLE_OP_ABSOLUTE": "절대값", @@ -136,16 +143,16 @@ "MATH_SINGLE_TOOLTIP_NEG": "음(-)/양(+), 부호를 반대로 하여 값을 돌려줍니다.", "MATH_SINGLE_TOOLTIP_LN": "어떤 수의, 자연로그(natural logarithm) 값을 돌려줍니다.(밑 e, 예시 log e x)", "MATH_SINGLE_TOOLTIP_LOG10": "어떤 수의, 기본로그(logarithm) 값을 돌려줍니다.(밑 10, 예시 log 10 x)", - "MATH_SINGLE_TOOLTIP_EXP": "e 의, 거듭제곱(power) 값을 돌려줍니다.", - "MATH_SINGLE_TOOLTIP_POW10": "10 의, 거듭제곱(power) 값을 돌려줍니다.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "어떤 각도(degree, radian 아님)의, sin(sine) 값을 계산해 돌려줍니다.", - "MATH_TRIG_TOOLTIP_COS": "어떤 각도(degree, radian 아님)의, cos(cosine) 값을 계산해 돌려줍니다.", - "MATH_TRIG_TOOLTIP_TAN": "어떤 각도(degree, radian 아님)의, tan(tangent) 값을 계산해 돌려줍니다.", + "MATH_SINGLE_TOOLTIP_EXP": "e의 거듭제곱 값을 반환합니다.", + "MATH_SINGLE_TOOLTIP_POW10": "10의 거듭제곱 값을 반환합니다.", + "MATH_TRIG_HELPURL": "https://ko.wikipedia.org/wiki/삼각함수", + "MATH_TRIG_TOOLTIP_SIN": "각도의 사인을 반환합니다. (라디안 아님)", + "MATH_TRIG_TOOLTIP_COS": "각도의 코사인을 반환합니다. (라디안 아님)", + "MATH_TRIG_TOOLTIP_TAN": "각도의 탄젠트를 반환합니다. (라디안 아님)", "MATH_TRIG_TOOLTIP_ASIN": "어떤 수에 대한, asin(arcsine) 값을 돌려줍니다.", "MATH_TRIG_TOOLTIP_ACOS": "어떤 수에 대한, acos(arccosine) 값을 돌려줍니다.", "MATH_TRIG_TOOLTIP_ATAN": "어떤 수에 대한, atan(arctangent) 값을 돌려줍니다.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_HELPURL": "https://ko.wikipedia.org/wiki/수학_상수", "MATH_CONSTANT_TOOLTIP": "일반적인 상수 값들 중 하나를 돌려줍니다. : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).", "MATH_IS_EVEN": "가 짝수(even) 이면", "MATH_IS_ODD": "가 홀수(odd) 이면", @@ -158,7 +165,7 @@ "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "바꾸기 %1 만큼 %2", "MATH_CHANGE_TOOLTIP": "변수 '%1' 에 저장되어있는 값에, 어떤 수를 더해, 변수에 다시 저장합니다.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_HELPURL": "https://ko.wikipedia.org/wiki/반올림", "MATH_ROUND_TOOLTIP": "어떤 수를 반올림/올림/버림한 결과를, 정수값으로 돌려줍니다.", "MATH_ROUND_OPERATOR_ROUND": "반올림", "MATH_ROUND_OPERATOR_ROUNDUP": "올림", @@ -177,14 +184,14 @@ "MATH_ONLIST_OPERATOR_MODE": "가장 여러 개 있는 값", "MATH_ONLIST_TOOLTIP_MODE": "리스트에 들어있는 아이템들 중에서, 가장 여러 번 들어있는 아이템들을 리스트로 만들어 돌려줍니다. (최빈값, modes)", "MATH_ONLIST_OPERATOR_STD_DEV": "표준 편차", - "MATH_ONLIST_TOOLTIP_STD_DEV": "리스트에 들어있는 수(값)들에 대해, 표준 편차(standard deviation) 를 구해 돌려줍니다.", - "MATH_ONLIST_OPERATOR_RANDOM": "목록의 임의 아이템", + "MATH_ONLIST_TOOLTIP_STD_DEV": "이 리스트의 표준 편차를 반환합니다.", + "MATH_ONLIST_OPERATOR_RANDOM": "목록의 임의 항목", "MATH_ONLIST_TOOLTIP_RANDOM": "목록에서 임의의 아이템을 돌려줍니다.", "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "%1 를 %2 로 나눈 나머지", + "MATH_MODULO_TITLE": "%1 ÷ %2의 나머지", "MATH_MODULO_TOOLTIP": "첫 번째 수를 두 번째 수로 나눈, 나머지 값을 돌려줍니다.", "MATH_CONSTRAIN_HELPURL": "https://ko.wikipedia.org/wiki/%ED%81%B4%EB%9E%A8%ED%95%91_(%EA%B7%B8%EB%9E%98%ED%94%BD)", - "MATH_CONSTRAIN_TITLE": "%1 의 값을, 최소 %2 최대 %3 으로 조정", + "MATH_CONSTRAIN_TITLE": "%1의 값을, 최소 %2 최대 %3으로 조정", "MATH_CONSTRAIN_TOOLTIP": "어떤 수를, 특정 범위의 값이 되도록 강제로 조정합니다.", "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "랜덤정수(%1<= n <=%2)", @@ -192,18 +199,18 @@ "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "임의 분수", "MATH_RANDOM_FLOAT_TOOLTIP": "0.0 (포함)과 1.0 (배타적) 사이의 임의 분수 값을 돌려줍니다.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_HELPURL": "https://ko.wikipedia.org/wiki/문자열", "TEXT_TEXT_TOOLTIP": "문자, 단어, 문장.", "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", "TEXT_JOIN_TITLE_CREATEWITH": "텍스트 만들기", "TEXT_JOIN_TOOLTIP": "여러 개의 아이템들을 연결해(묶어), 새로운 문장을 만듭니다.", "TEXT_CREATE_JOIN_TITLE_JOIN": "가입", - "TEXT_CREATE_JOIN_TOOLTIP": "이 문장 블럭의 구성을 추가, 삭제, 재구성 합니다.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "문장을 만들 조각 아이템", + "TEXT_CREATE_JOIN_TOOLTIP": "섹션을 추가, 제거하거나 순서를 변경하여 이 텍스트 블럭을 재구성합니다.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "텍스트에 항목을 추가합니다.", "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_APPEND_TO": "다음", "TEXT_APPEND_APPENDTEXT": "내용 덧붙이기", - "TEXT_APPEND_TOOLTIP": "'%1' 의 마지막에 문장을 덧붙입니다.", + "TEXT_APPEND_TOOLTIP": "'%1' 변수의 끝에 일부 텍스트를 덧붙입니다.", "TEXT_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_LENGTH_TITLE": "다음 문장의 문자 개수 %1", "TEXT_LENGTH_TOOLTIP": "입력된 문장의, 문자 개수를 돌려줍니다.(공백문자 포함)", @@ -211,7 +218,7 @@ "TEXT_ISEMPTY_TITLE": "%1이 비어 있습니다", "TEXT_ISEMPTY_TOOLTIP": "입력된 문장이, 빈 문장(\"\")이면 참(true) 값을 돌려줍니다.", "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", - "TEXT_INDEXOF_TOOLTIP": "어떤 문장이 가장 처음 나타난 위치 또는, 가장 마지막으로 나타난 위치를 찾아 돌려줍니다. 찾는 문장이 없는 경우는 0 값을 돌려줌.", + "TEXT_INDEXOF_TOOLTIP": "두 번째 텍스트에서 첫 번째 텍스트가 처음 또는 마지막으로 발생한 색인 위치를 반환합니다. 텍스트가 없으면 %1을 반환합니다.", "TEXT_INDEXOF_INPUT_INTEXT": "문장", "TEXT_INDEXOF_OPERATOR_FIRST": "에서 다음 문장이 처음으로 나타난 위치 찾기 :", "TEXT_INDEXOF_OPERATOR_LAST": "에서 다음 문장이 마지막으로 나타난 위치 찾기 :", @@ -249,25 +256,28 @@ "TEXT_PRINT_TITLE": "다음 내용 출력 %1", "TEXT_PRINT_TOOLTIP": "원하는 문장, 수, 값 등을 출력합니다.", "TEXT_PROMPT_HELPURL": "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user", - "TEXT_PROMPT_TYPE_TEXT": "다음 안내 멘트를 활용해 문장 입력", - "TEXT_PROMPT_TYPE_NUMBER": "다음 안내 멘트를 활용해 수 입력", - "TEXT_PROMPT_TOOLTIP_NUMBER": "수 입력 받음.", - "TEXT_PROMPT_TOOLTIP_TEXT": "문장 입력 받음.", + "TEXT_PROMPT_TYPE_TEXT": "메시지를 활용해 문장 입력", + "TEXT_PROMPT_TYPE_NUMBER": "메시지를 활용해 수 입력", + "TEXT_PROMPT_TOOLTIP_NUMBER": "수에 대해 사용자의 입력을 받습니다.", + "TEXT_PROMPT_TOOLTIP_TEXT": "문장에 대해 사용자의 입력을 받습니다.", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "빈 리스트 생성", - "LISTS_CREATE_EMPTY_TOOLTIP": "아이템이 없는, 빈 리스트를 만들어 돌려줍니다.", + "LISTS_CREATE_EMPTY_TOOLTIP": "데이터 레코드가 없는, 길이가 0인 목록을 반환합니다.", "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_CREATE_WITH_TOOLTIP": "원하는 아이템 갯수로 리스트를 생성합니다.", + "LISTS_CREATE_WITH_TOOLTIP": "원하는 수의 항목들로 목록을 생성합니다.", "LISTS_CREATE_WITH_INPUT_WITH": "리스트 만들기", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "리스트", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "리스트 블럭의 내용을 추가, 삭제, 재구성 합니다.", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "섹션을 추가, 제거하거나 순서를 변경하여 이 리스트 블럭을 재구성합니다.", "LISTS_CREATE_WITH_ITEM_TOOLTIP": "아이템을 리스트에 추가합니다.", "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_REPEAT_TOOLTIP": "원하는 값을, 원하는 갯수 만큼 넣어, 새로운 리스트를 생성합니다.", - "LISTS_REPEAT_TITLE": "%1 을 %2 번 넣어, 리스트 생성", + "LISTS_REPEAT_TOOLTIP": "원하는 값을, 원하는 갯수 만큼 넣어, 목록을 생성합니다.", + "LISTS_REPEAT_TITLE": "%1을 %2번 넣어, 리스트 생성", "LISTS_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", "LISTS_LENGTH_TITLE": "%1의 길이", - "LISTS_LENGTH_TOOLTIP": "리스트에 포함되어있는, 아이템 갯수를 돌려줍니다.", + "LISTS_LENGTH_TOOLTIP": "목록의 길이를 반환합니다.", "LISTS_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#is-empty", "LISTS_ISEMPTY_TITLE": "%1이 비어 있습니다", "LISTS_ISEMPTY_TOOLTIP": "목록이 비었을 때 참을 반환합니다.", @@ -275,28 +285,27 @@ "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", "LISTS_INDEX_OF_FIRST": "처음으로 나타난 위치", "LISTS_INDEX_OF_LAST": "마지막으로 나타난 위치", - "LISTS_INDEX_OF_TOOLTIP": "아이템이 나타난, 처음 또는 마지막 위치를 찾아 돌려줍니다. 아이템이 없으면 0 돌려줌.", - "LISTS_GET_INDEX_GET": "아이템 가져오기", + "LISTS_INDEX_OF_TOOLTIP": "목록에서 항목이 처음 또는 마지막으로 발생한 색인 위치를 반환합니다. 항목이 없으면 %1을 반환합니다.", + "LISTS_GET_INDEX_GET": "가져오기", "LISTS_GET_INDEX_GET_REMOVE": "잘라 내기", "LISTS_GET_INDEX_REMOVE": "삭제", "LISTS_GET_INDEX_FROM_START": "#", "LISTS_GET_INDEX_FROM_END": "마지막 번째 위치부터, # 번째", - "LISTS_GET_INDEX_FIRST": "첫번째", + "LISTS_GET_INDEX_FIRST": "첫 번째", "LISTS_GET_INDEX_LAST": "마지막", "LISTS_GET_INDEX_RANDOM": "임의로", "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "특정 위치의 아이템을 찾아 돌려줍니다. #1 은 첫번째 아이템.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "특정 위치의 아이템을 찾아 돌려줍니다. #1 은 마지막 아이템.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1은 첫 번째 항목입니다.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1은(는) 마지막 항목입니다.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "목록에서 특정 위치의 항목을 반환합니다.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "첫 번째 아이템을 찾아 돌려줍니다.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "마지막 아이템을 찾아 돌려줍니다.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "리스트의 아이템들 중, 랜덤으로 선택해 돌려줍니다.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "특정 위치의 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다. #1 는 첫번째 아이템.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "특정 위치의 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다. #1 는 마지막 아이템.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "목록의 특정 위치에 있는 항목을 제거하고 반환합니다.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "첫 번째 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "마지막 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "목록에서 임의 위치의 아이템을 찾아내 삭제하고 돌려줍니다.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "특정 위치의 아이템을 찾아내 삭제합니다. #1 는 첫번째 아이템.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "특정 위치의 아이템을 찾아내 삭제합니다. #1 는 마지막 아이템.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "목록에서 특정 위치의 항목을 삭제합니다.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "리스트에서 첫 번째 아이템을 삭제합니다.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "리스트에서 마지막 아이템을 찾아 삭제합니다.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "리스트에서 랜덤하게 아이템을 삭제합니다.", @@ -304,14 +313,12 @@ "LISTS_SET_INDEX_SET": "에서 설정", "LISTS_SET_INDEX_INSERT": "에서 원하는 위치에 삽입", "LISTS_SET_INDEX_INPUT_TO": "에", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "특정 번째 위치의 아이템으로 설정합니다. #1 는 첫번째 아이템.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "특정 번째 위치의 아이템으로 설정합니다. #1 는 마지막 아이템.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "목록의 특정 위치에 있는 항목으로 설정합니다.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "첫 번째 위치의 아이템으로 설정합니다.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "마지막 아이템으로 설정합니다.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "목록에서 임의 위치의 아이템을 설정합니다.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "아이템을 리스트의 특정 위치에 삽입합니다. 첫번째 아이템은 #1.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "아이템을 리스트의 특정 위치에 삽입합니다. 마지막 아이템은 #1.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "아이템을 리스트의 첫번째 위치에 삽입합니다.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "목록의 특정 위치에 항목을 삽입합니다.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "항목을 목록의 처음 위치에 삽입합니다.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "리스트의 마지막에 아이템을 추가합니다.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "목록에서 임의 위치에 아이템을 삽입합니다.", "LISTS_GET_SUBLIST_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-a-sublist", @@ -322,19 +329,28 @@ "LISTS_GET_SUBLIST_END_FROM_END": "끝에서부터 # 번째로", "LISTS_GET_SUBLIST_END_LAST": "마지막으로", "LISTS_GET_SUBLIST_TAIL": "", - "LISTS_GET_SUBLIST_TOOLTIP": "특정 부분을 복사해 새로운 리스트로 생성합니다.", + "LISTS_GET_SUBLIST_TOOLTIP": "목록의 특정 부분에 대한 복사본을 만듭니다.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "정렬 %1 %2 %3", + "LISTS_SORT_TOOLTIP": "목록의 사본을 정렬합니다.", + "LISTS_SORT_ORDER_ASCENDING": "오름차순", + "LISTS_SORT_ORDER_DESCENDING": "내림차순", + "LISTS_SORT_TYPE_NUMERIC": "숫자순", + "LISTS_SORT_TYPE_TEXT": "알파벳순", + "LISTS_SORT_TYPE_IGNORECASE": "알파벳순 (대소문자 구분 안 함)", "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "텍스트에서 목록 만들기", "LISTS_SPLIT_TEXT_FROM_LIST": "목록에서 텍스트 만들기", "LISTS_SPLIT_WITH_DELIMITER": "분리와", "LISTS_SPLIT_TOOLTIP_SPLIT": "각 속보, 텍스트의 목록들에서 텍스트를 분할합니다.", - "LISTS_SPLIT_TOOLTIP_JOIN": "구분 기호로 분리 된 하나의 텍스트에 텍스트 의 목록을 넣으세요.", + "LISTS_SPLIT_TOOLTIP_JOIN": "구분 기호로 구분하여 텍스트 목록을 하나의 텍스트에 병합합니다.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "ORDINAL_NUMBER_SUFFIX": "", "VARIABLES_GET_HELPURL": "https://ko.wikipedia.org/wiki/%EB%B3%80%EC%88%98_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)", "VARIABLES_GET_TOOLTIP": "변수에 저장 되어있는 값을 돌려줍니다.", "VARIABLES_GET_CREATE_SET": "'집합 %1' 생성", "VARIABLES_SET_HELPURL": "https://ko.wikipedia.org/wiki/%EB%B3%80%EC%88%98_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)", - "VARIABLES_SET": "바꾸기 %1 를 다음 값으로 바꾸기 %2", + "VARIABLES_SET": "%1를 %2로 설정", "VARIABLES_SET_TOOLTIP": "변수의 값을 입력한 값으로 변경해 줍니다.", "VARIABLES_SET_CREATE_GET": "'%1 값 읽기' 블럭 생성", "PROCEDURES_DEFNORETURN_HELPURL": "https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98_%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29", @@ -344,15 +360,15 @@ "PROCEDURES_CALL_BEFORE_PARAMS": "사용:", "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "실행 후, 결과 값을 돌려주지 않는 함수를 만듭니다.", + "PROCEDURES_DEFNORETURN_COMMENT": "이 함수를 설명하세요...", "PROCEDURES_DEFRETURN_HELPURL": "https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98_%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29", "PROCEDURES_DEFRETURN_RETURN": "다음을 돌려줌", "PROCEDURES_DEFRETURN_TOOLTIP": "실행 후, 결과 값을 돌려주는 함수를 만듭니다.", "PROCEDURES_ALLOW_STATEMENTS": "서술 허가", "PROCEDURES_DEF_DUPLICATE_WARNING": "경고: 이 함수에는, 같은 이름을 사용하는 매개 변수들이 있습니다.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_CALL": "", + "PROCEDURES_CALLNORETURN_HELPURL": "https://ko.wikipedia.org/wiki/함수_(프로그래밍)", "PROCEDURES_CALLNORETURN_TOOLTIP": "미리 정의해 둔 '%1' 함수를 실행합니다.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLRETURN_HELPURL": "https://ko.wikipedia.org/wiki/함수_(프로그래밍)", "PROCEDURES_CALLRETURN_TOOLTIP": "미리 정의해 둔 '%1' 함수를 실행하고, 함수를 실행한 결과 값을 돌려줍니다.", "PROCEDURES_MUTATORCONTAINER_TITLE": "매개 변수들", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "이 함수를 추가, 삭제, 혹은 재정렬합니다.", @@ -360,6 +376,7 @@ "PROCEDURES_MUTATORARG_TOOLTIP": "함수에 값을 더합니다.", "PROCEDURES_HIGHLIGHT_DEF": "함수 정의 찾기", "PROCEDURES_CREATE_DO": "'%1' 생성", - "PROCEDURES_IFRETURN_TOOLTIP": "값이 참이라면, 두번째 값을 반환합니다.", + "PROCEDURES_IFRETURN_TOOLTIP": "값이 참이라면, 두 번째 값을 반환합니다.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "경고: 이 블럭은, 함수 정의 블럭 안에서만 사용할 수 있습니다." } diff --git a/src/opsoro/server/static/js/blockly/msg/json/lb.json b/src/opsoro/server/static/js/blockly/msg/json/lb.json new file mode 100644 index 0000000..472195c --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/lb.json @@ -0,0 +1,132 @@ +{ + "@metadata": { + "authors": [ + "Robby", + "Soued031", + "Les Meloures" + ] + }, + "VARIABLES_DEFAULT_NAME": "Element", + "TODAY": "Haut", + "DUPLICATE_BLOCK": "Eng Kopie maachen", + "ADD_COMMENT": "Bemierkung derbäisetzen", + "REMOVE_COMMENT": "Bemierkung ewechhuelen", + "DELETE_BLOCK": "Block läschen", + "DELETE_X_BLOCKS": "%1 Bléck läschen", + "CLEAN_UP": "Bléck opraumen", + "COLLAPSE_BLOCK": "Block zesummeklappen", + "COLLAPSE_ALL": "Bléck zesummeklappen", + "EXPAND_BLOCK": "Block opklappen", + "EXPAND_ALL": "Bléck opklappen", + "DISABLE_BLOCK": "Block desaktivéieren", + "ENABLE_BLOCK": "Block aktivéieren", + "HELP": "Hëllef", + "UNDO": "Réckgängeg maachen", + "REDO": "Widderhuelen", + "CHANGE_VALUE_TITLE": "Wäert änneren:", + "RENAME_VARIABLE": "Variabel ëmbenennen...", + "RENAME_VARIABLE_TITLE": "All '%1' Variabelen ëmbenennen op:", + "NEW_VARIABLE": "Variabel uleeën...", + "NEW_VARIABLE_TITLE": "Neie variabelen Numm:", + "COLOUR_PICKER_TOOLTIP": "Sicht eng Faarf an der Palette eraus.", + "COLOUR_RANDOM_TITLE": "zoufälleg Faarf", + "COLOUR_RANDOM_TOOLTIP": "Eng zoufälleg Faarf eraussichen.", + "COLOUR_RGB_TITLE": "fierwe mat", + "COLOUR_RGB_RED": "rout", + "COLOUR_RGB_GREEN": "gréng", + "COLOUR_RGB_BLUE": "blo", + "COLOUR_BLEND_TITLE": "mëschen", + "COLOUR_BLEND_COLOUR1": "Faarf 1", + "COLOUR_BLEND_COLOUR2": "Faarf 2", + "COLOUR_BLEND_RATIO": "ratio", + "CONTROLS_REPEAT_TITLE": "%1-mol widderhuelen", + "CONTROLS_REPEAT_INPUT_DO": "maach", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "Widderhuel soulaang", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "widderhuele bis", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Féiert d'Uweisungen aus, soulaang wéi de Wäert richteg ass", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Féiert d'Uweisungen aus, soulaang wéi de Wäert falsch ass.", + "CONTROLS_FOR_TITLE": "zielt mat %1 vun %2 bis %3 mat %4", + "CONTROLS_FOREACH_TITLE": "fir all Element %1 an der Lëscht %2", + "CONTROLS_IF_MSG_IF": "wann", + "CONTROLS_IF_MSG_ELSE": "soss", + "LOGIC_OPERATION_AND": "an", + "LOGIC_OPERATION_OR": "oder", + "LOGIC_NEGATE_TITLE": "net %1", + "LOGIC_BOOLEAN_TRUE": "wouer", + "LOGIC_BOOLEAN_FALSE": "falsch", + "LOGIC_BOOLEAN_TOOLTIP": "Schéckt entweder richteg oder falsch zréck.", + "LOGIC_NULL": "null", + "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", + "LOGIC_TERNARY_CONDITION": "Test", + "LOGIC_TERNARY_IF_TRUE": "wa wouer", + "LOGIC_TERNARY_IF_FALSE": "wa falsch", + "MATH_NUMBER_TOOLTIP": "Eng Zuel.", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Den Total vun den zwou Zuelen zréckginn.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "D'Produkt vun den zwou Zuelen zréckginn.", + "MATH_SINGLE_HELPURL": "https://lb.wikipedia.org/wiki/Racine carrée", + "MATH_SINGLE_OP_ROOT": "Quadratwuerzel", + "MATH_SINGLE_OP_ABSOLUTE": "absolut", + "MATH_IS_EVEN": "ass gerued", + "MATH_IS_ODD": "ass ongerued", + "MATH_IS_PRIME": "ass eng Primzuel", + "MATH_IS_WHOLE": "ass eng ganz Zuel", + "MATH_IS_POSITIVE": "ass positiv", + "MATH_IS_NEGATIVE": "ass negativ", + "MATH_CHANGE_TITLE": "änneren %1 ëm %2", + "MATH_ROUND_TOOLTIP": "Eng Zuel op- oder ofrënnen.", + "MATH_ROUND_OPERATOR_ROUND": "opronnen", + "MATH_ROUND_OPERATOR_ROUNDUP": "oprënnen", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "ofrënnen", + "MATH_ONLIST_OPERATOR_MAX": "Maximum aus der Lëscht", + "MATH_ONLIST_TOOLTIP_MAX": "Schéckt de gréisste Wäert aus enger Lëscht zréck.", + "MATH_ONLIST_OPERATOR_AVERAGE": "Moyenne vun der Lëscht", + "MATH_ONLIST_OPERATOR_RANDOM": "zoufällegt Element vun enger Lëscht", + "MATH_MODULO_TITLE": "Rescht vu(n) %1 ÷ %2", + "MATH_RANDOM_INT_TITLE": "zoufälleg ganz Zuel tëscht %1 a(n) %2", + "TEXT_TEXT_TOOLTIP": "E Buschtaf, e Wuert oder eng Textzeil.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "En Element bei den Text derbäisetzen.", + "TEXT_APPEND_APPENDTEXT": "Text drunhänken", + "TEXT_LENGTH_TITLE": "Längt vu(n) %1", + "TEXT_ISEMPTY_TITLE": "%1 ass eidel", + "TEXT_INDEXOF_INPUT_INTEXT": "am Text", + "TEXT_CHARAT_INPUT_INTEXT": "am Text", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "am Text", + "TEXT_GET_SUBSTRING_END_FROM_START": "bis bei de Buschtaf #", + "TEXT_GET_SUBSTRING_END_LAST": "bis bei de leschte Buschtaw", + "TEXT_PRINT_TITLE": "%1 drécken", + "TEXT_PROMPT_TOOLTIP_TEXT": "Frot de Benotzer no engem Text.", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_REPLACE_MESSAGE0": "%1 duerch %2 a(n) %3 ersetzen", + "TEXT_REPLACE_TOOLTIP": "All Kéiers wou e bestëmmten Text do ass duerch en aneren Text ersetzen.", + "TEXT_REVERSE_TOOLTIP": "Dréint d'Reiefolleg vun den Zeechen am Text ëm.", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "Lëscht", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "En Element op d'Lëscht derbäisetzen.", + "LISTS_LENGTH_TITLE": "Längt vu(n) %1", + "LISTS_ISEMPTY_TITLE": "%1 ass eidel", + "LISTS_INLIST": "an der Lëscht", + "LISTS_GET_INDEX_REMOVE": "ewechhuelen", + "LISTS_GET_INDEX_FROM_START": "#", + "LISTS_GET_INDEX_FROM_END": "# vun hannen", + "LISTS_GET_INDEX_FIRST": "éischt", + "LISTS_GET_INDEX_LAST": "lescht", + "LISTS_GET_INDEX_RANDOM": "Zoufall", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 ass dat éischt Element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 ass dat éischt Element.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Schéckt en zoufällegt Element aus enger Lëscht zréck.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Hëlt dat lescht Element aus enger Lëscht eraus.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Hëlt en zoufällegt Element aus enger Lëscht eraus.", + "LISTS_SET_INDEX_INSERT": "asetzen op", + "LISTS_SET_INDEX_INPUT_TO": "als", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Setzt en zoufällegt Element an eng Lëscht.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Setzt d'Element um Enn vun enger Lëscht derbäi.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Setzt d'Element op eng zoufälleg Plaz an d'Lëscht derbäi.", + "LISTS_SORT_TYPE_NUMERIC": "numeresch", + "LISTS_SORT_TYPE_TEXT": "alphabetesch", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "%1 ëmdréinen", + "PROCEDURES_DEFNORETURN_PROCEDURE": "eppes maachen", + "PROCEDURES_BEFORE_PARAMS": "mat:", + "PROCEDURES_CALL_BEFORE_PARAMS": "mat:", + "PROCEDURES_DEFNORETURN_COMMENT": "Dës Funktioun beschreiwen...", + "PROCEDURES_DEFRETURN_RETURN": "zréck" +} diff --git a/src/opsoro/server/static/js/blockly/msg/json/lki.json b/src/opsoro/server/static/js/blockly/msg/json/lki.json new file mode 100644 index 0000000..ca97a89 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/lki.json @@ -0,0 +1,296 @@ +{ + "@metadata": { + "authors": [ + "Hosseinblue", + "Lakzon" + ] + }, + "VARIABLES_DEFAULT_NAME": "آیتم", + "TODAY": "ایمڕۆ", + "DUPLICATE_BLOCK": "کؤپی کردن", + "ADD_COMMENT": "گةپ دائن", + "REMOVE_COMMENT": "پاک کردن گةپةل/قِسةل", + "EXTERNAL_INPUTS": "ورودیةل خروجی", + "INLINE_INPUTS": "ورودیةل نوم جا", + "DELETE_BLOCK": "پاک کردن بلاک", + "DELETE_X_BLOCKS": "حةذف %1 بلاکةل", + "DELETE_ALL_BLOCKS": "حةذف کؤل %1 بلاکةل?", + "CLEAN_UP": "تمیزکردن بلاکةل", + "COLLAPSE_BLOCK": "چؤیچانن/پشکانن بلاک", + "COLLAPSE_ALL": "چؤیچانن/پشکانن بلاکةل", + "EXPAND_BLOCK": "کةلنگآ کردِن بلاک", + "EXPAND_ALL": "کةلنگآ کردِن بلاکةل", + "DISABLE_BLOCK": "إ کار کةتن(غیرفعال‌سازی) بلاک", + "ENABLE_BLOCK": "إ کارآشتن(فعال)بلاک", + "HELP": "کؤمةک", + "CHANGE_VALUE_TITLE": "تةغییر مقدار:", + "RENAME_VARIABLE": "تغییر نام متغیر...", + "RENAME_VARIABLE_TITLE": "تغییر نام همهٔ متغیرهای «%1» به:", + "NEW_VARIABLE": "متغیر تازه...", + "NEW_VARIABLE_TITLE": "نام متغیر تازه:", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/رةنگ", + "COLOUR_PICKER_TOOLTIP": "رةنگێ إژ تةختة رةنگ انتخاب کةن", + "COLOUR_RANDOM_TITLE": "رةنگ بةختةکی", + "COLOUR_RANDOM_TOOLTIP": ".رةنگئ بةختةکی انتخاب کةن", + "COLOUR_RGB_TITLE": "رةنگ وة", + "COLOUR_RGB_RED": "سۆر", + "COLOUR_RGB_GREEN": "سؤز", + "COLOUR_RGB_BLUE": "کاوو", + "COLOUR_RGB_TOOLTIP": "ساخت یک رنگ با مقدار مشخص‌شده‌ای از سۆر، سؤز و کاوو. همهٔ مقادیر باید بین ۰ تا ۱۰۰ باشند.", + "COLOUR_BLEND_TITLE": "قاتی پاتی", + "COLOUR_BLEND_COLOUR1": "رةنگ 1", + "COLOUR_BLEND_COLOUR2": "رةنگ 2", + "COLOUR_BLEND_RATIO": "نسبت", + "COLOUR_BLEND_TOOLTIP": "دو رنگ را با نسبت مشخص‌شده مخلوط می‌کند (۰٫۰ - ۱٫۰)", + "CONTROLS_REPEAT_HELPURL": "https://lki.wikipedia.org/wiki/حلقه_فور", + "CONTROLS_REPEAT_TITLE": "%بار تکرار 1", + "CONTROLS_REPEAT_INPUT_DO": "انجوم بی", + "CONTROLS_REPEAT_TOOLTIP": "انجام چةن عبارت چندین گِل.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "تکرار در حالی که", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "تکرار تا وةختێ گإ", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "تا زمانی که یک مقدار صحیح است، چند عبارت را انجام بده.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "تا زمانی که یک مقدار ناصحیح است، چند عبارت را انجام بده.", + "CONTROLS_FOR_TOOLTIP": "متغیر %1 را در مقادیر شروع‌شده از عدد انتهای به عدد انتهایی را دارد، با فواصل مشخص‌شده می‌شمارد و این بلوک مشخص‌شده را انجام می‌دهد.", + "CONTROLS_FOR_TITLE": "با تعداد %1 از %2 به %3 با گام‌های %4", + "CONTROLS_FOREACH_TITLE": "ئةرا هر مورد %1 وۀ نام لیست%2", + "CONTROLS_FOREACH_TOOLTIP": "برای هر مورد در این فهرست، تنظیم متغیر «%1» به مورد و انجام تعدادی عبارت.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "شکانِن حلقه", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "ادامه با تکرار بعدی حلقه", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "شکستن حلقهٔ شامل.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "پریدن از بقیهٔ حلقه و ادامه با تکرار بعدی.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "اخطار: این بلوک ممکن است فقط داخل یک حلقه استفاده شود.", + "CONTROLS_IF_TOOLTIP_1": "اگر یک مقدار صحیح است، سپس چند عبارت را انجام بده.", + "CONTROLS_IF_TOOLTIP_2": "اگر یک مقدار صحیح است، اول بلوک اول عبارات را انجام بده. در غیر این صورت بلوک دوم عبارات انجام بده.", + "CONTROLS_IF_TOOLTIP_3": "اگر مقدار اول صحیح بود، از آن بلوک اول عبارات را انجام بده. در غیر این صورت، اگر مقدار دوم صحیح است، بلوک دوم عبارات را انجام بده.", + "CONTROLS_IF_TOOLTIP_4": "اگر مقدار اول درست است، بلوک اول عبارات را انجام بده. در غیر این صورت، اگر مقدار دوم درست باشد بلوک دوم عبارات را انجام بده. اگر هیچ از مقادیر درست نبود، آخرین بلوک عبارات را انجام بده.", + "CONTROLS_IF_MSG_IF": "اگر", + "CONTROLS_IF_MSG_ELSEIF": "اگر آنگاه", + "CONTROLS_IF_MSG_ELSE": "آنگاه", + "CONTROLS_IF_IF_TOOLTIP": "افزودن، حذف یا بازمرتب‌سازی قسمت‌ها برای پیکربندی دوبارهٔ این بلوک اگر.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "افزودن یک شرط به بلوک اگر.", + "CONTROLS_IF_ELSE_TOOLTIP": "اضافه‌کردن نهایی، گرفتن همهٔ شرایط به بلوک اگر.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "بازگشت صحیح اگر هر دو ورودی با یکدیگر برابر باشد.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "برگرداندن صحیح اگر هر دو ورودی با یکدیگر برابر نباشند.", + "LOGIC_COMPARE_TOOLTIP_LT": "بازگرداندن صحیح اگر ورودی اول کوچکتر از ورودی دوم باشد.", + "LOGIC_COMPARE_TOOLTIP_LTE": "بازگرداندن صحیح اگر ورودی اول کوچکتر یا مساوی با ورودی دوم باشد.", + "LOGIC_COMPARE_TOOLTIP_GT": "بازگرداندن صحیح اگر ورودی اول بزرگتر از ورودی دوم باشد.", + "LOGIC_COMPARE_TOOLTIP_GTE": "بازگرداندن صحیح اگر ورودی اول بزرگتر یا مساوی یا ورودی دوم باشد.", + "LOGIC_OPERATION_TOOLTIP_AND": "بازگرداندن صحیح اگر هر دو ورودی صحیح باشد.", + "LOGIC_OPERATION_AND": "و", + "LOGIC_OPERATION_TOOLTIP_OR": "بازگرداندن صحیح اگر یکی از دو ورودی صحیح باشد.", + "LOGIC_OPERATION_OR": "یا", + "LOGIC_NEGATE_TITLE": "نه %1", + "LOGIC_NEGATE_TOOLTIP": "صجیج باز می‌گرداند اگر ورودی نا صحیح باشند. ناصحیح بازمی‌گرداند اگر ورودی صحیح باشد.", + "LOGIC_BOOLEAN_TRUE": "درست", + "LOGIC_BOOLEAN_FALSE": "نادرست", + "LOGIC_BOOLEAN_TOOLTIP": "بازگرداندن یکی از صحیح یا ناصحیح.", + "LOGIC_NULL": "پةتی/خالی", + "LOGIC_NULL_TOOLTIP": "تهی باز می گرداند", + "LOGIC_TERNARY_CONDITION": "آزمائشت", + "LOGIC_TERNARY_IF_TRUE": "اگر درست", + "LOGIC_TERNARY_IF_FALSE": "اگر نادرست", + "LOGIC_TERNARY_TOOLTIP": "بررسی وضعیت در «آزمایش». اگر وضعیت صحیح باشد، مقدار «اگر صحیح» را بر می‌گرداند در غیر اینصورت مقدار «اگر ناصحیح» را.", + "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", + "MATH_NUMBER_TOOLTIP": "شؤمارە یەک", + "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_ARITHMETIC_TOOLTIP_ADD": "بازگرداندن مقدار جمع دو عدد.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "بازگرداندن تفاوت دو عدد.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "بازگرداندن حاصلضرب دو عدد.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "بازگرداندن باقی‌ماندهٔ دو عدد.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "بازگرداندن اولین عددی که از توان عدد دوم حاصل شده باشد.", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_OP_ROOT": "ریشهٔ دوم", + "MATH_SINGLE_TOOLTIP_ROOT": "ریشهٔ دوم یک عدد را باز می‌گرداند.", + "MATH_SINGLE_OP_ABSOLUTE": "مطلق", + "MATH_SINGLE_TOOLTIP_ABS": "قدر مطلق یک عدد را بازمی‌گرداند.", + "MATH_SINGLE_TOOLTIP_NEG": "منفی‌شدهٔ یک عدد را باز می‌گرداند.", + "MATH_SINGLE_TOOLTIP_LN": "لوگاریتم طبیعی یک عدد را باز می‌گرداند.", + "MATH_SINGLE_TOOLTIP_LOG10": "بازگرداندن لگاریتم بر پایهٔ ۱۰ یک عدد.", + "MATH_SINGLE_TOOLTIP_EXP": "بازگرداندن توان e یک عدد.", + "MATH_SINGLE_TOOLTIP_POW10": "بازگرداندن توان ۱۰ یک عدد.", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "MATH_TRIG_TOOLTIP_SIN": "بازگرداندن سینوس درجه (نه رادیان).", + "MATH_TRIG_TOOLTIP_COS": "بازگرداندن کسینوس درجه (نه رادیان).", + "MATH_TRIG_TOOLTIP_TAN": "بازگرداندن تانژانت یک درجه (نه رادیان).", + "MATH_TRIG_TOOLTIP_ASIN": ".(بازگرداندن آرک‌سینوس درجه (نه رادیان", + "MATH_TRIG_TOOLTIP_ACOS": "بازگرداندن آرک‌کسینوس درجه (نه رادیان).", + "MATH_TRIG_TOOLTIP_ATAN": "بازگرداندن آرک‌تانژانت درجه (نه رادیان).", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "یکی از مقادیر مشترک را برمی‌گرداند: π (۳٫۱۴۱…)، e (۲٫۷۱۸...)، φ (۱٫۶۱۸)، sqrt(۲) (۱٫۴۱۴)، sqrt(۱/۲) (۰٫۷۰۷...) و یا ∞ (بی‌نهایت).", + "MATH_IS_EVEN": "زوج است", + "MATH_IS_ODD": "فرد است", + "MATH_IS_PRIME": "عدد اول است", + "MATH_IS_WHOLE": "کامل است", + "MATH_IS_POSITIVE": "مثبت است", + "MATH_IS_NEGATIVE": "منفی است", + "MATH_IS_DIVISIBLE_BY": "تقسیم شده بر", + "MATH_IS_TOOLTIP": "بررسی می‌کند که آیا یک عدد زوج، فرد، اول، کامل، مثبت، منفی یا بخش‌پذیر عدد خاصی باشد را بررسی می‌کند. درست یا نادرست باز می‌گرداند.", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "تغییر %1 با %2", + "MATH_CHANGE_TOOLTIP": "افزودن یک عدد به متغیر '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "گردکردن یک عدد به بالا یا پایین.", + "MATH_ROUND_OPERATOR_ROUND": "گردکردن", + "MATH_ROUND_OPERATOR_ROUNDUP": "گرد به بالا", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "گرد به پایین", + "MATH_ONLIST_OPERATOR_SUM": "جمع لیست", + "MATH_ONLIST_TOOLTIP_SUM": "جمع همهٔ عددهای فهرست را باز می‌گرداند.", + "MATH_ONLIST_OPERATOR_MIN": "گوجةرتةرین لیست", + "MATH_ONLIST_TOOLTIP_MIN": "کوچک‌ترین عدد در فهرست را باز می‌گرداند.", + "MATH_ONLIST_OPERATOR_MAX": "بزرگ‌ترین فهرست", + "MATH_ONLIST_TOOLTIP_MAX": "بزرگ‌ترین عدد در فهرست را باز می‌گرداند.", + "MATH_ONLIST_OPERATOR_AVERAGE": "میانگین فهرست", + "MATH_ONLIST_TOOLTIP_AVERAGE": "میانگین (میانگین ریاضی) مقادیر عددی فهرست را بر می‌گرداند.", + "MATH_ONLIST_OPERATOR_MEDIAN": "میانهٔ فهرست", + "MATH_ONLIST_TOOLTIP_MEDIAN": "میانهٔ عدد در فهرست را بر می‌گرداند.", + "MATH_ONLIST_OPERATOR_MODE": "مد فهرست", + "MATH_ONLIST_TOOLTIP_MODE": "شایع‌ترین قلم(های) در فهرست را بر می‌گرداند.", + "MATH_ONLIST_OPERATOR_STD_DEV": "انحراف معیار فهرست", + "MATH_ONLIST_TOOLTIP_STD_DEV": "انحراف معیار فهرست را بر می‌گرداند.", + "MATH_ONLIST_OPERATOR_RANDOM": "مورد تصادفی از فهرست", + "MATH_ONLIST_TOOLTIP_RANDOM": "موردی تصادفی از فهرست را بر می‌گرداند.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "باقی‌ماندهٔ %1 + %2", + "MATH_MODULO_TOOLTIP": "باقی‌ماندهٔ تقسیم دو عدد را بر می‌گرداند.", + "MATH_CONSTRAIN_TITLE": "محدودکردن %1 پایین %2 بالا %3", + "MATH_CONSTRAIN_TOOLTIP": "محدودکردن یک عدد بین محدودیت‌های مشخص‌شده (بسته).", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "عدد صحیح تصادفی بین %1 تا %2", + "MATH_RANDOM_INT_TOOLTIP": "یک عدد تصادفی بین دو مقدار مشخص‌شده به صورت بسته باز می‌گرداند.", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "کسر تصادفی", + "MATH_RANDOM_FLOAT_TOOLTIP": "بازگرداندن کسری تصادفی بین ۰٫۰ (بسته) تا ۱٫۰ (باز).", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "یک حرف، کلمه یا خطی از متن.", + "TEXT_JOIN_TITLE_CREATEWITH": "ایجاد متن با", + "TEXT_JOIN_TOOLTIP": "یک تکه‌ای از متن را با چسپاندن همهٔ تعداد از موارد ایجاد می‌کند.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "نام نؤیسی", + "TEXT_CREATE_JOIN_TOOLTIP": "اضافه‌کردن، حذف یا مرتب‌سازی بحش‌ها برای تنظیم مجدد این بلوک متنی.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "افزودن یک مورد به متن.", + "TEXT_APPEND_TO": "به", + "TEXT_APPEND_APPENDTEXT": "چسباندن متن", + "TEXT_APPEND_TOOLTIP": "الحاق متنی به متغیر «%1».", + "TEXT_LENGTH_TITLE": "طول %1", + "TEXT_LENGTH_TOOLTIP": "بازگرداندن عددی از حروف (شامل فاصله‌ها) در متن فراهم‌شده.", + "TEXT_ISEMPTY_TITLE": "%1 خالی است", + "TEXT_ISEMPTY_TOOLTIP": "اضافه‌کردن صحیح اگر متن فراهم‌شده خالی است.", + "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد %1 باز می‌گرداند.", + "TEXT_INDEXOF_INPUT_INTEXT": "در متن", + "TEXT_INDEXOF_OPERATOR_FIRST": "اولین رخداد متن را بیاب", + "TEXT_INDEXOF_OPERATOR_LAST": "آخرین رخداد متن را بیاب", + "TEXT_CHARAT_INPUT_INTEXT": "در متن", + "TEXT_CHARAT_FROM_START": "گرفتن حرف #", + "TEXT_CHARAT_FROM_END": "گرفتن حرف # از آخر", + "TEXT_CHARAT_FIRST": "گرفتن اولین حرف", + "TEXT_CHARAT_LAST": "گرفتن آخرین حرف", + "TEXT_CHARAT_RANDOM": "گرفتن حرف تصادفی", + "TEXT_CHARAT_TOOLTIP": "حرفی در موقعیت مشخص‌شده بر می‌گرداند.", + "TEXT_GET_SUBSTRING_TOOLTIP": "قسمت مشخصی‌شده‌ای از متن را بر می‌گرداند.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "در متن", + "TEXT_GET_SUBSTRING_START_FROM_START": "گرفتن زیرمتن از حرف #", + "TEXT_GET_SUBSTRING_START_FROM_END": "گرفتن زیرمتن از حرف # به انتها", + "TEXT_GET_SUBSTRING_START_FIRST": "گرفتن زیرمتن از اولین حرف", + "TEXT_GET_SUBSTRING_END_FROM_START": "به حرف #", + "TEXT_GET_SUBSTRING_END_FROM_END": "به حرف # از انتها", + "TEXT_GET_SUBSTRING_END_LAST": "به آخرین حرف", + "TEXT_CHANGECASE_TOOLTIP": "بازگرداندن کپی متن در حالتی متفاوت.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "به حروف بزرگ", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "به حروف کوچک", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "به حروف بزرگ عنوان", + "TEXT_TRIM_TOOLTIP": "کپی از متن با فاصله‌های حذف‌شده از یک یا هر دو پایان باز می‌گرداند.", + "TEXT_TRIM_OPERATOR_BOTH": "تراشیدن فاصله‌ها از هر دو طرف", + "TEXT_TRIM_OPERATOR_LEFT": "تراشیدن فاصله‌ها از طرف چپ", + "TEXT_TRIM_OPERATOR_RIGHT": "تراشیدن فاصله‌ها از طرف چپ", + "TEXT_PRINT_TITLE": "چاپ %1", + "TEXT_PRINT_TOOLTIP": "چاپ متن، عدد یا هر مقدار دیگر مشخص‌شده.", + "TEXT_PROMPT_TYPE_TEXT": "اعلان برای متن با پیام", + "TEXT_PROMPT_TYPE_NUMBER": "اعلان برای عدد با پیام", + "TEXT_PROMPT_TOOLTIP_NUMBER": "اعلان برای کاربر با یک عدد.", + "TEXT_PROMPT_TOOLTIP_TEXT": "اعلان برای کاربر برای یک متن.", + "LISTS_CREATE_EMPTY_TITLE": "ایجاد فهرست خالی", + "LISTS_CREATE_EMPTY_TOOLTIP": "فهرستی با طول صفر شامل هیچ رکورد داده‌ای بر می‌گرداند.", + "LISTS_CREATE_WITH_TOOLTIP": "فهرستی از هر عددی از موارد می‌سازد.", + "LISTS_CREATE_WITH_INPUT_WITH": "ایجاد فهرست با", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "لیست", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "اضافه‌کردن، حذف‌کردن یا ترتیب‌سازی مجدد بخش‌ها این بلوک فهرستی.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "اضافه‌کردن یک مورد به فهرست.", + "LISTS_REPEAT_TOOLTIP": "فهرستی شامل مقادیر داده‌شدهٔ تکرار شده عدد مشخص‌شده می‌سازد.", + "LISTS_REPEAT_TITLE": "فهرستی با %1 تکرارشده به اندازهٔ %2 می‌سازد", + "LISTS_LENGTH_TITLE": "طول %1", + "LISTS_LENGTH_TOOLTIP": "طول یک فهرست را برمی‌گرداند.", + "LISTS_ISEMPTY_TITLE": "%1 خالی است", + "LISTS_ISEMPTY_TOOLTIP": "اگر فهرست خالی است مقدار صجیج بر می‌گرداند.", + "LISTS_INLIST": "در فهرست", + "LISTS_INDEX_OF_FIRST": "یافتن اولین رخ‌داد مورد", + "LISTS_INDEX_OF_LAST": "یافتن آخرین رخ‌داد مورد", + "LISTS_INDEX_OF_TOOLTIP": "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. %1 بر می‌گرداند اگر آیتم موجود نبود.", + "LISTS_GET_INDEX_GET": "گِرتِن", + "LISTS_GET_INDEX_GET_REMOVE": "گِرتِن و حةذف کردن", + "LISTS_GET_INDEX_REMOVE": "حةذف کردن", + "LISTS_GET_INDEX_FROM_END": "# إژ دؤما آخر", + "LISTS_GET_INDEX_FIRST": "إژ أؤةل", + "LISTS_GET_INDEX_LAST": "دؤمائن/آخرین", + "LISTS_GET_INDEX_RANDOM": "بةختةکی", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 اولین مورد است.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 آخرین مورد است.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "موردی در محل مشخص‌شده بر می‌گرداند.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "اولین مورد یک فهرست را بر می‌گرداند.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "آخرین مورد در یک فهرست را بر می‌گرداند.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "یک مورد تصادفی در یک فهرست بر می‌گرداند.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "اولین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "آخرین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "مورد تصادفی‌ای را در فهرست حذف و بر می‌گرداند.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "اولین مورد را در یک فهرست حذف می‌کند.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "آخرین مورد را در یک فهرست حذف می‌کند.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "یک مورد تصادفی را یک فهرست حذف می‌کند.", + "LISTS_SET_INDEX_SET": "مجموعه", + "LISTS_SET_INDEX_INSERT": "درج در", + "LISTS_SET_INDEX_INPUT_TO": "به عنوان", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "اولین مورد در یک فهرست را تعیین می‌کند.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "آخرین مورد در یک فهرست را تعیین می‌کند.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "یک مورد تصادفی در یک فهرست را تعیین می‌کند.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "موردی به ته فهرست اضافه می‌کند.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "موردی به ته فهرست الحاق می‌کند.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "مورد را به صورت تصادفی در یک فهرست می‌افزاید.", + "LISTS_GET_SUBLIST_START_FROM_START": "گرفتن زیرمجموعه‌ای از #", + "LISTS_GET_SUBLIST_START_FROM_END": "گرفتن زیرمجموعه‌ای از # از انتها", + "LISTS_GET_SUBLIST_START_FIRST": "گرفتن زیرمجموعه‌ای از ابتدا", + "LISTS_GET_SUBLIST_END_FROM_START": "به #", + "LISTS_GET_SUBLIST_END_FROM_END": "به # از انتها", + "LISTS_GET_SUBLIST_END_LAST": "به آخرین", + "LISTS_GET_SUBLIST_TOOLTIP": "کپی از قسمت مشخص‌شدهٔ لیست درست می‌کند.", + "LISTS_SPLIT_LIST_FROM_TEXT": "ساخت لیست إژ متن", + "LISTS_SPLIT_TEXT_FROM_LIST": "ساخت متن إژ لیست", + "LISTS_SPLIT_WITH_DELIMITER": "همراه جداساز", + "VARIABLES_GET_TOOLTIP": "مقدار این متغیر را بر می‌گرداند.", + "VARIABLES_GET_CREATE_SET": "درست‌کردن «تنظیم %1»", + "VARIABLES_SET": "مجموعه %1 به %2", + "VARIABLES_SET_TOOLTIP": "متغیر برابر با خروجی را مشخص می‌کند.", + "VARIABLES_SET_CREATE_GET": "درست‌کردن «گرفتن %1»", + "PROCEDURES_DEFNORETURN_TITLE": "به", + "PROCEDURES_DEFNORETURN_PROCEDURE": "انجام چیزی", + "PROCEDURES_BEFORE_PARAMS": "با:", + "PROCEDURES_CALL_BEFORE_PARAMS": "با:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "تابعی می‌سازد بدون هیچ خروجی.", + "PROCEDURES_DEFRETURN_RETURN": "بازگشت", + "PROCEDURES_DEFRETURN_TOOLTIP": "تابعی با یک خروجی می‌سازد.", + "PROCEDURES_ALLOW_STATEMENTS": "اجازه اظهارات", + "PROCEDURES_DEF_DUPLICATE_WARNING": "اخطار: این تابعی پارامتر تکراری دارد.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLNORETURN_TOOLTIP": "اجرای تابع تعریف‌شده توسط کاربر «%1».", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLRETURN_TOOLTIP": "اجرای تابع تعریف‌شده توسط کاربر «%1» و استفاده از خروجی آن.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "ورودی‌ها", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "افزودن، حذف یا دوباره مرتب‌کردن ورودی این تابع.", + "PROCEDURES_MUTATORARG_TITLE": "نام ورودی:", + "PROCEDURES_MUTATORARG_TOOLTIP": "اضافه کردن ورودی به تابع.", + "PROCEDURES_HIGHLIGHT_DEF": "برجسته‌سازی تعریف تابع", + "PROCEDURES_CREATE_DO": "ساختن «%1»", + "PROCEDURES_IFRETURN_TOOLTIP": "اگر یک مقدار صحیح است، مقدار دوم را برگردان.", + "PROCEDURES_IFRETURN_WARNING": "اخطار: این بلوک احتمالاً فقط داخل یک تابع استفاده می‌شود." +} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/lrc.json b/src/opsoro/server/static/js/blockly/msg/json/lrc.json similarity index 99% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/lrc.json rename to src/opsoro/server/static/js/blockly/msg/json/lrc.json index 52e432b..6877555 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/lrc.json +++ b/src/opsoro/server/static/js/blockly/msg/json/lrc.json @@ -20,12 +20,11 @@ "DISABLE_BLOCK": "ناکشتگر کردن برشت", "ENABLE_BLOCK": "کنشتگر کردن برشت", "HELP": "هومياری", - "ME": "مه", "CHANGE_VALUE_TITLE": "ارزشت آلشت کو:", - "NEW_VARIABLE": "آلشتگر تازه...", - "NEW_VARIABLE_TITLE": "نوم آلشتگر تازه:", "RENAME_VARIABLE": "د نو نوم نیائن آلشتگر...", "RENAME_VARIABLE_TITLE": "د نو نوم نیائن %1 د تموم آلشتگریا د:", + "NEW_VARIABLE": "آلشتگر تازه...", + "NEW_VARIABLE_TITLE": "نوم آلشتگر تازه:", "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "یه رن د رنگ دو انتخاو بکید", "COLOUR_RANDOM_TITLE": "رن بختکی", diff --git a/src/opsoro/server/static/js/blockly/msg/json/lt.json b/src/opsoro/server/static/js/blockly/msg/json/lt.json new file mode 100644 index 0000000..6de43f7 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/lt.json @@ -0,0 +1,296 @@ +{ + "@metadata": { + "authors": [ + "Eitvys200", + "Jurgis", + "Zygimantus", + "Nuodas" + ] + }, + "VARIABLES_DEFAULT_NAME": "elementas", + "TODAY": "Šiandien", + "DUPLICATE_BLOCK": "Kopijuoti", + "ADD_COMMENT": "Palikti komentarą", + "REMOVE_COMMENT": "Pašalinti komentarą", + "EXTERNAL_INPUTS": "Išdėstyti stulpeliu, kai daug parametrų", + "INLINE_INPUTS": "Išdėstyti vienoje eilutėje", + "DELETE_BLOCK": "Ištrinti bloką", + "DELETE_X_BLOCKS": "Ištrinti %1 blokus", + "DELETE_ALL_BLOCKS": "Ištrinti visus %1 blokus?", + "CLEAN_UP": "Išvalyti blokus", + "COLLAPSE_BLOCK": "Suskleisti bloką", + "COLLAPSE_ALL": "Suskleisti blokus", + "EXPAND_BLOCK": "Išskleisti bloką", + "EXPAND_ALL": "Išskleisti blokus", + "DISABLE_BLOCK": "Išjungti bloką", + "ENABLE_BLOCK": "Įjungti bloką", + "HELP": "Pagalba", + "UNDO": "Anuliuoti", + "REDO": "Atkurti", + "CHANGE_VALUE_TITLE": "Keisti reikšmę:", + "RENAME_VARIABLE": "Pervardyti kintamajį...", + "RENAME_VARIABLE_TITLE": "Pervadinti visus '%1' kintamuosius į:", + "NEW_VARIABLE": "Naujas kintamasis...", + "NEW_VARIABLE_TITLE": "Naujo kintamojo pavadinimas:", + "DELETE_VARIABLE": "Ištrinti „%1“ kintamąjį", + "COLOUR_PICKER_HELPURL": "https://lt.wikipedia.org/wiki/Spalva", + "COLOUR_PICKER_TOOLTIP": "Pasirinkti spalvą iš paletės.", + "COLOUR_RANDOM_TITLE": "atsitiktinė spalva", + "COLOUR_RANDOM_TOOLTIP": "Pasirinkti spalvą atsitiktinai.", + "COLOUR_RGB_TITLE": "spalva su", + "COLOUR_RGB_RED": "raudona", + "COLOUR_RGB_GREEN": "žalia", + "COLOUR_RGB_BLUE": "mėlyna", + "COLOUR_RGB_TOOLTIP": "Spalvą galima sudaryti iš raudonos, žalios ir mėlynos dedamųjų. Kiekvienos intensyvumas nuo 0 iki 100.", + "COLOUR_BLEND_TITLE": "sumaišyk", + "COLOUR_BLEND_COLOUR1": "1 spalva", + "COLOUR_BLEND_COLOUR2": "2 spalva", + "COLOUR_BLEND_RATIO": "santykis", + "COLOUR_BLEND_TOOLTIP": "Sumaišo dvi spalvas su pateiktu santykiu (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "pakartokite %1 kartus", + "CONTROLS_REPEAT_INPUT_DO": "daryti", + "CONTROLS_REPEAT_TOOLTIP": "Leidžia atlikti išvardintus veiksmus kelis kartus.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "kartok kol", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "kartok, kol pasieksi", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Kartoja veiksmus, kol sąlyga tenkinama.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Kartoja veiksmus, kol bus pasiekta nurodyta sąlyga.", + "CONTROLS_FOR_TOOLTIP": "Imama kintamoji '%1' reikšmė nuo pradinio skaičiaus iki pabaigos skaičiaus, skaičiuojant nustatytais intervalais ir atliekant nustatytus blokus.", + "CONTROLS_FOR_TITLE": "kartok, kai %1 kinta nuo %2 iki %3 po %4", + "CONTROLS_FOREACH_TITLE": "kartok su kiekvienu %1 iš sąrašo %2", + "CONTROLS_FOREACH_TOOLTIP": "Kartok veiksmus, kol kintamasis \"%1\" paeiliui gauna kiekvieną sąrašo reikšmę.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "nutraukti kartojimą", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "šį kartą praleisti likusius veiksmus ir tęsti kartojimą", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Nutraukia (artimiausią) vykstantį kartojimą.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Praleidžia žemiau išvardintus kartojimo veiksmus (ir tęsia darbą nuo kartojimo pradinio veiksmo).", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Atsargiai: šis blokas gali būt naudojamas tik kartojimo bloko viduje.", + "CONTROLS_IF_TOOLTIP_1": "Jeigu sąlyga tenkinama, tai atlik veiksmus.", + "CONTROLS_IF_TOOLTIP_2": "Jei sąlyga tenkinama, atlikti jai priklausančius veiksmus, o jei ne -- atlikti kitus nurodytus veiksmus.", + "CONTROLS_IF_TOOLTIP_3": "Jei pirma sąlyga tenkinama, atlikti jai priklausančius veiksmus, O jei ne, tikrinti antrą sąlygą -- ir jei ši tenkinama, atlikti jos veiksmus.", + "CONTROLS_IF_TOOLTIP_4": "Jei pirma sąlyga tenkinama, atlikti jai priklausančius veiksmus, O jei ne, tikrinti antrą sąlygą -- ir jei ši tenkinama, atlikti jos veiksmus. Kitais atvejais -- atlikti paskutinio bloko veiksmus.", + "CONTROLS_IF_MSG_IF": "jei", + "CONTROLS_IF_MSG_ELSEIF": "arba jei", + "CONTROLS_IF_MSG_ELSE": "kitu atveju", + "CONTROLS_IF_IF_TOOLTIP": "Galite pridėt/pašalinti/pertvarkyti sąlygų \"šakas\".", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Pridėti sąlygą „jei“ blokui.", + "CONTROLS_IF_ELSE_TOOLTIP": "Pridėti veiksmų vykdymo variantą/\"šaką\", kai netenkinama nė viena sąlyga.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Tenkinama, jei abu reiškiniai lygūs.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Grįžti tiesa, jeigu abi įvestys ne lygios tarpusavyje.", + "LOGIC_COMPARE_TOOLTIP_LT": "Grįžti tiesa, jei pirma įvestis mažesnė nei antra įvestis.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Grįžti tiesa, jei pirma įvestis mažesnė arba lygi antrajai įvesčiai.", + "LOGIC_COMPARE_TOOLTIP_GT": "Grįžti tiesa, jei pirmoji įvestis didesnė nei antroji įvestis.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Grįžti tiesa, jei pirma įvestis didesnė arba lygi antrajai įvesčiai.", + "LOGIC_OPERATION_TOOLTIP_AND": "Bus teisinga, kai abi sąlygos bus tenkinamos.", + "LOGIC_OPERATION_AND": "ir", + "LOGIC_OPERATION_TOOLTIP_OR": "Grįžti tiesa, jei bent viena įvestis teisinga.", + "LOGIC_OPERATION_OR": "arba", + "LOGIC_NEGATE_TITLE": "ne %1", + "LOGIC_NEGATE_TOOLTIP": "Grįžti tiesa, jei įvestis klaidinga. Grįžti klaidinga, jei įvestis teisinga.", + "LOGIC_BOOLEAN_TRUE": "tiesa", + "LOGIC_BOOLEAN_FALSE": "klaidinga", + "LOGIC_BOOLEAN_TOOLTIP": "Reikšmė gali būti \"teisinga\"/\"Taip\" arba \"klaidinga\"/\"Ne\".", + "LOGIC_NULL": "nieko", + "LOGIC_NULL_TOOLTIP": "Reikšmė nebuvo nurodyta...", + "LOGIC_TERNARY_CONDITION": "sąlyga", + "LOGIC_TERNARY_IF_TRUE": "jei taip", + "LOGIC_TERNARY_IF_FALSE": "jei ne", + "LOGIC_TERNARY_TOOLTIP": "Jeigu sąlygą tenkinama, grąžina pirmą reikšmę, o jei ne - antrąją.", + "MATH_NUMBER_HELPURL": "https://lt.wikipedia.org/wiki/Skaičius", + "MATH_NUMBER_TOOLTIP": "Skaičius.", + "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Grąžina dviejų skaičių sumą.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Grąžina dviejų skaičių skirtumą.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Grąžina dviejų skaičių sandaugą.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Grąžina dviejų skaičių dalmenį.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Grąžina pirmą skaičių pakeltą laipsniu pagal antrą skaičių.", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_OP_ROOT": "kvadratinė šaknis", + "MATH_SINGLE_TOOLTIP_ROOT": "Grįžti kvadratinę šaknį iš skaičiaus.", + "MATH_SINGLE_OP_ABSOLUTE": "modulis", + "MATH_SINGLE_TOOLTIP_ABS": "Skaičiaus modulis - reikšmė be ženklo (panaikina minusą).", + "MATH_SINGLE_TOOLTIP_NEG": "Grąžina skaičiui priešingą skaičių.", + "MATH_SINGLE_TOOLTIP_LN": "Grąžinti skaičiaus natūrinį logaritmą.", + "MATH_SINGLE_TOOLTIP_LOG10": "Grįžti 10 pagrindinių logaritmų iš skaičiaus.", + "MATH_SINGLE_TOOLTIP_EXP": "Grąžinti skaičių laipsniu e.", + "MATH_SINGLE_TOOLTIP_POW10": "Grąžinti skaičių laipsniu 10.", + "MATH_TRIG_HELPURL": "https://lt.wikipedia.org/wiki/Trigonometrinės_funkcijos", + "MATH_TRIG_TOOLTIP_SIN": "Grąžinti laipsnio sinusą (ne radiano).", + "MATH_TRIG_TOOLTIP_COS": "Grąžinti laipsnio kosinusą (ne radiano).", + "MATH_TRIG_TOOLTIP_TAN": "Grąžinti laipsnio tangentą (ne radiano).", + "MATH_TRIG_TOOLTIP_ASIN": "Grąžinti skaičiaus arksinusą.", + "MATH_TRIG_TOOLTIP_ACOS": "Grąžinti skaičiaus arkkosinusą.", + "MATH_TRIG_TOOLTIP_ATAN": "Grąžinti skaičiaus arktangentą.", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "Grįžti viena iš pagrindinių konstantų: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (begalybė).", + "MATH_IS_EVEN": "yra lyginis", + "MATH_IS_ODD": "yra nelyginis", + "MATH_IS_PRIME": "yra pirminis", + "MATH_IS_WHOLE": "yra sveikasis", + "MATH_IS_POSITIVE": "yra teigiamas", + "MATH_IS_NEGATIVE": "yra neigiamas", + "MATH_IS_DIVISIBLE_BY": "yra dalus iš", + "MATH_IS_TOOLTIP": "Patikrina skaičiaus savybę: (ne)lyginis/pirminis/sveikasis/teigiamas/neigiamas/dalus iš x.", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "padidink %1 (emptypage) %2", + "MATH_CHANGE_TOOLTIP": "Prideda skaičių prie kintamojo '%1'. Kai skaičius neigiamas - gaunasi atimtis.", + "MATH_ROUND_HELPURL": "https://lt.wikipedia.org/wiki/Apvalinimas", + "MATH_ROUND_TOOLTIP": "Suapvalinti skaičių į žemesnę ar aukštesnę reikšmę.", + "MATH_ROUND_OPERATOR_ROUND": "apvalink", + "MATH_ROUND_OPERATOR_ROUNDUP": "apvalink aukštyn", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "apvalink žemyn", + "MATH_ONLIST_OPERATOR_SUM": "suma", + "MATH_ONLIST_TOOLTIP_SUM": "didžiausia reikšmė", + "MATH_ONLIST_OPERATOR_MIN": "mažiausia reikšmė sąraše", + "MATH_ONLIST_TOOLTIP_MIN": "Grįžti mažiausiu skaičiumi sąraše.", + "MATH_ONLIST_OPERATOR_MAX": "didžiausia reikšmė sąraše", + "MATH_ONLIST_TOOLTIP_MAX": "Grįžti didžiausiu skaičiumi sąraše.", + "MATH_ONLIST_OPERATOR_AVERAGE": "vidurkis", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Grįžti vidurkiu (aritmetinis vidurkis) iš skaitinių reikšmių sąraše.", + "MATH_ONLIST_OPERATOR_MEDIAN": "mediana sąrašui", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Grąžinti sąrašo medianą.", + "MATH_ONLIST_OPERATOR_MODE": "statistinė moda sąrašui", + "MATH_ONLIST_TOOLTIP_MODE": "Grąžinti sąrašą dažniausių elementų sąraše.", + "MATH_ONLIST_OPERATOR_STD_DEV": "standartinis nuokrypis sąraše", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Grįžti standartine pakraipa iš sąrašo.", + "MATH_ONLIST_OPERATOR_RANDOM": "atsitiktinis elementas iš sąrašo", + "MATH_ONLIST_TOOLTIP_RANDOM": "Grąžinti atsitiktinį elementą iš sąrašo.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "dalybos liekana %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Grįžti likučiu nuo dviejų skaičių dalybos.", + "MATH_CONSTRAIN_TITLE": "apribok %1 tarp %2 ir %3", + "MATH_CONSTRAIN_TOOLTIP": "Apriboti skaičių, kad būtų tarp nustatytų ribų (imtinai).", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "atsitiktinis sveikas sk. nuo %1 iki %2", + "MATH_RANDOM_INT_TOOLTIP": "Grįžti atsitiktinį sveikąjį skaičių tarp dviejų nustatytų ribų, imtinai.", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "atsitiktinė trupmena", + "MATH_RANDOM_FLOAT_TOOLTIP": "Atsitiktinė trupmena nuo 0 (imtinai) iki 1 (neimtinai).", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Tekstas (arba žodis, ar raidė)", + "TEXT_JOIN_TITLE_CREATEWITH": "sukurti tekstą su", + "TEXT_JOIN_TOOLTIP": "Sukurti teksto fragmentą sujungiant bet kokį skaičių fragmentų.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "sujunk", + "TEXT_CREATE_JOIN_TOOLTIP": "Pridėti, pašalinti arba paskirstyti skyrius, kad pertvarkyti šį teksto bloką.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Pridėti teksto elementą.", + "TEXT_APPEND_TO": "prie", + "TEXT_APPEND_APPENDTEXT": "pridėk tekstą", + "TEXT_APPEND_TOOLTIP": "Pridėti tekstą prie kintamojo '%1'.", + "TEXT_LENGTH_TITLE": "teksto %1 ilgis", + "TEXT_LENGTH_TOOLTIP": "Suranda teksto simbolių kiekį (įskaitant ir tarpus)", + "TEXT_ISEMPTY_TITLE": "%1 yra tuščias", + "TEXT_ISEMPTY_TOOLTIP": "Grįžti tiesa, jei numatytas tekstas tuščias.", + "TEXT_INDEXOF_TOOLTIP": "Grąžina pirmą/paskutinę pirmo teksto reikšmę antrame tekste. Grąžina %1, jei tekstas nerastas.", + "TEXT_INDEXOF_INPUT_INTEXT": "tekste", + "TEXT_INDEXOF_OPERATOR_FIRST": "rask,kur pirmą kartą paminėta", + "TEXT_INDEXOF_OPERATOR_LAST": "rask,kur paskutinį kartą paminėta", + "TEXT_CHARAT_INPUT_INTEXT": "tekste", + "TEXT_CHARAT_FROM_START": "gauti raidę #", + "TEXT_CHARAT_FROM_END": "raidė nuo galo #", + "TEXT_CHARAT_FIRST": "gauti pirmą raidę", + "TEXT_CHARAT_LAST": "gauti paskutinę raidę", + "TEXT_CHARAT_RANDOM": "gauti atsitiktinę raidę", + "TEXT_CHARAT_TOOLTIP": "Grąžina raidę į tam tikrą poziciją.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Grąžina tam tikrą teksto dalį.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "tekste", + "TEXT_GET_SUBSTRING_START_FROM_START": "dalis nuo raidės #", + "TEXT_GET_SUBSTRING_START_FROM_END": "dalis nuo raidės #", + "TEXT_GET_SUBSTRING_START_FIRST": "dalis nuo pradžios", + "TEXT_GET_SUBSTRING_END_FROM_START": "iki raidės #", + "TEXT_GET_SUBSTRING_END_FROM_END": "iki raidės nuo galo #", + "TEXT_GET_SUBSTRING_END_LAST": "iki pabaigos", + "TEXT_CHANGECASE_TOOLTIP": "Kitu atvėju, grąžina teksto kopiją.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": " DIDŽIOSIOM RAIDĖM", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": " mažosiom raidėm", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": " Pavadinimo Raidėmis", + "TEXT_TRIM_TOOLTIP": "Grąžina teksto kopiją, pašalinus tarpus iš vieno ar abiejų kraštų.", + "TEXT_TRIM_OPERATOR_BOTH": "išvalyk tarpus šonuose", + "TEXT_TRIM_OPERATOR_LEFT": "išvalyk tarpus pradžioje", + "TEXT_TRIM_OPERATOR_RIGHT": "išvalyk tarpus pabaigoje", + "TEXT_PRINT_TITLE": "spausdinti %1", + "TEXT_PRINT_TOOLTIP": "Spausdinti nurodytą tekstą, skaičių ar kitą reikšmę.", + "TEXT_PROMPT_TYPE_TEXT": "paprašyk įvesti tekstą :", + "TEXT_PROMPT_TYPE_NUMBER": "paprašyk įvesti skaičių :", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Prašyti vartotoją įvesti skaičių.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Prašyti vartotoją įvesti tekstą.", + "TEXT_COUNT_MESSAGE0": "skaičius %1 iš %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Suskaičiuoti, kiek kartų šis tekstas kartojasi kitame tekste.", + "TEXT_REPLACE_MESSAGE0": "pakeisti %1 į %2 šiame %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Pašalinti visas teksto dalis kitame tekste.", + "TEXT_REVERSE_MESSAGE0": "atbulai %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REVERSE_TOOLTIP": "Apversti teksto simbolių tvarką.", + "LISTS_CREATE_EMPTY_TITLE": "tuščias sąrašas", + "LISTS_CREATE_EMPTY_TOOLTIP": "Grąžina sąrašą, ilgio 0, neturintį duomenų", + "LISTS_CREATE_WITH_TOOLTIP": "Sukurti sąrašą iš bet kokio skaičiaus elementų.", + "LISTS_CREATE_WITH_INPUT_WITH": "sukurti sąrašą su", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "sąrašas", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Pridėti, pašalinti arba paskirstyti skyrius, kad pertvarkyti šį teksto bloką.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Pridėti elementą į sąrašą.", + "LISTS_REPEAT_TITLE": "sukurk sąrašą, kuriame %1 bus %2 kartus", + "LISTS_LENGTH_TITLE": "ilgis %1", + "LISTS_LENGTH_TOOLTIP": "Grąžina sąrašo ilgį.", + "LISTS_ISEMPTY_TITLE": "%1 yra tuščias", + "LISTS_ISEMPTY_TOOLTIP": "Grąžina „true“, jeigu sąrašas tuščias.", + "LISTS_INLIST": "sąraše", + "LISTS_INDEX_OF_FIRST": "rask pirmą reikšmę", + "LISTS_INDEX_OF_LAST": "rask paskutinę reikšmę", + "LISTS_INDEX_OF_TOOLTIP": "Grąžina pirmos/paskutinės reikšmės eilės nr. sąraše. Grąžina %1, jei reikšmės neranda.", + "LISTS_GET_INDEX_GET": "paimk", + "LISTS_GET_INDEX_GET_REMOVE": "paimk ir ištrink", + "LISTS_GET_INDEX_REMOVE": "pašalinti", + "LISTS_GET_INDEX_FROM_END": "# nuo galo", + "LISTS_GET_INDEX_FIRST": "pirmas", + "LISTS_GET_INDEX_LAST": "paskutinis", + "LISTS_GET_INDEX_RANDOM": "atsitiktinis", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 yra pirmasis objektas.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 yra paskutinis objektas.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Gražina objektą į nurodyta poziciją sąraše.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Grąžina pirmąjį sąrašo elementą.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Grąžina paskutinį elementą iš sąrašo.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Grąžina atsitiktinį elementą iš sąrašo.", + "LISTS_SET_INDEX_SET": "priskirk elementui", + "LISTS_SET_INDEX_INSERT": "įterpk į vietą", + "LISTS_SET_INDEX_INPUT_TO": "kaip", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Įterpią objektą į nurodytą poziciją sąraše.", + "LISTS_GET_SUBLIST_START_FROM_START": "sąrašo dalis nuo #", + "LISTS_GET_SUBLIST_START_FROM_END": "sąrašo dalis nuo # nuo galo", + "LISTS_GET_SUBLIST_START_FIRST": "sąrašo dalis nuo pradžios", + "LISTS_GET_SUBLIST_END_FROM_START": "iki #", + "LISTS_GET_SUBLIST_END_FROM_END": "iki # nuo galo", + "LISTS_GET_SUBLIST_END_LAST": "iki galo", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "rūšiuoti %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Rūšiuoti sąrašo kopiją.", + "LISTS_SORT_ORDER_ASCENDING": "didėjančia tvarka", + "LISTS_SORT_ORDER_DESCENDING": "mažėjančia tvarka", + "LISTS_SORT_TYPE_NUMERIC": "skaitmeninis", + "LISTS_SORT_TYPE_TEXT": "abėcėlės", + "LISTS_SORT_TYPE_IGNORECASE": "abecėlės, ignoruoti raidžių dydį", + "LISTS_SPLIT_WITH_DELIMITER": "su dalikliu", + "VARIABLES_GET_CREATE_SET": "Sukurk \"priskirk %1\"", + "VARIABLES_SET": "priskirk %1 = %2", + "VARIABLES_SET_CREATE_GET": "Sukurti 'kintamasis %1'", + "PROCEDURES_DEFNORETURN_TITLE": "komanda:", + "PROCEDURES_DEFNORETURN_PROCEDURE": "daryk kažką", + "PROCEDURES_BEFORE_PARAMS": "pagal:", + "PROCEDURES_CALL_BEFORE_PARAMS": "su:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Sukuria procedūrą - komandą, kuri nepateikia jokio rezultato (tik atlieka veiksmus).", + "PROCEDURES_DEFRETURN_RETURN": "duok", + "PROCEDURES_DEFRETURN_TOOLTIP": "Sukuria funkciją - komandą, kuri ne tik atlieka veiksmus bet ir pateikia (grąžina/duoda) rezultatą.", + "PROCEDURES_ALLOW_STATEMENTS": "leisti vidinius veiksmus", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Ši komanda turi du vienodus gaunamų duomenų pavadinimus.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Vykdyti sukurtą komandą \"%1\".", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLRETURN_TOOLTIP": "Įvykdyti komandą \"%1\" ir naudoti jos suskaičiuotą (atiduotą) reikšmę.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "gaunami duomenys (parametrai)", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Tvarkyti komandos gaunamus duomenis (parametrus).", + "PROCEDURES_MUTATORARG_TITLE": "parametro pavadinimas:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Pridėti funkcijos parametrą (gaunamų duomenų pavadinimą).", + "PROCEDURES_CREATE_DO": "Sukurti \"%1\"", + "PROCEDURES_IFRETURN_TOOLTIP": "Jeigu pirma reikšmė yra teisinga (sąlyga tenkinama), grąžina antrą reikšmę.", + "PROCEDURES_IFRETURN_WARNING": "Perspėjimas: šis blokas gali būti naudojamas tik aprašant funkciją." +} diff --git a/src/opsoro/server/static/js/blockly/msg/json/lv.json b/src/opsoro/server/static/js/blockly/msg/json/lv.json new file mode 100644 index 0000000..df4d8aa --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/lv.json @@ -0,0 +1,313 @@ +{ + "@metadata": { + "authors": [ + "Elomage", + "Janis", + "Papuass", + "Silraks" + ] + }, + "VARIABLES_DEFAULT_NAME": "objekts", + "TODAY": "Šodiena", + "DUPLICATE_BLOCK": "Dublēt", + "ADD_COMMENT": "Pievienot komentāru", + "REMOVE_COMMENT": "Noņemt komentāru", + "EXTERNAL_INPUTS": "Ārējie ievaddati", + "INLINE_INPUTS": "Iekšējie ievaddati", + "DELETE_BLOCK": "Izmest bloku", + "DELETE_X_BLOCKS": "Izmest %1 blokus", + "DELETE_ALL_BLOCKS": "Izdzēst visus %1 blokus?", + "CLEAN_UP": "Sakopt blokus", + "COLLAPSE_BLOCK": "Sakļaut bloku", + "COLLAPSE_ALL": "Sakļaut blokus", + "EXPAND_BLOCK": "Izvērst bloku", + "EXPAND_ALL": "Izvērst blokus", + "DISABLE_BLOCK": "Atspējot bloku", + "ENABLE_BLOCK": "Iespējot bloku", + "HELP": "Palīdzība", + "UNDO": "Atsaukt", + "REDO": "Atcelt atsaukšanu", + "CHANGE_VALUE_TITLE": "Mainīt vērtību:", + "RENAME_VARIABLE": "Pārdēvēt mainīgo...", + "RENAME_VARIABLE_TITLE": "Pārdēvējiet visus '%1' mainīgos:", + "NEW_VARIABLE": "Izveidot mainīgo...", + "NEW_VARIABLE_TITLE": "Jaunā mainīgā vārds:", + "VARIABLE_ALREADY_EXISTS": "Mainīgais '%1' jau eksistē.", + "DELETE_VARIABLE_CONFIRMATION": "Mainīgais \"%2\" tiek izmantots %1 vietās. Dzēst?", + "DELETE_VARIABLE": "Izdzēst mainīgo \"%1\"", + "COLOUR_PICKER_HELPURL": "https://lv.wikipedia.org/wiki/Krāsa", + "COLOUR_PICKER_TOOLTIP": "Izvēlēties krāsu no paletes.", + "COLOUR_RANDOM_TITLE": "nejauša krāsa", + "COLOUR_RANDOM_TOOLTIP": "Izvēlēties krāsu pēc nejaušības principa.", + "COLOUR_RGB_TITLE": "veido krāsu no", + "COLOUR_RGB_RED": "sarkana", + "COLOUR_RGB_GREEN": "zaļa", + "COLOUR_RGB_BLUE": "zila", + "COLOUR_RGB_TOOLTIP": "Izveidot krāsu ar norādīto daudzumu sarkanā, zaļā un zilā toņu. Visas vērtības ir starp 0 un 100.", + "COLOUR_BLEND_TITLE": "sajaukt", + "COLOUR_BLEND_COLOUR1": "1. krāsa", + "COLOUR_BLEND_COLOUR2": "2. krāsa", + "COLOUR_BLEND_RATIO": "attiecība", + "COLOUR_BLEND_TOOLTIP": "Sajauc kopā divas krāsas ar doto attiecību (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://lv.wikipedia.org/wiki/Cikls", + "CONTROLS_REPEAT_TITLE": "atkārtot %1 reizes", + "CONTROLS_REPEAT_INPUT_DO": "izpildi", + "CONTROLS_REPEAT_TOOLTIP": "Izpildīt komandas vairākas reizes.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "atkārtot kamēr", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "atkārtot līdz", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Izpildīt komandas, kamēr vērtība ir patiesa.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Izpildīt komandas, kamēr vērtība ir nepatiesa.", + "CONTROLS_FOR_TOOLTIP": "Ļauj mainīgajam '%1' pieņemt vērtības no sākuma līdz beigu vērtībai, un izpildīt iekļautos blokus katrai no šīm pieņemtajām vērtībām.", + "CONTROLS_FOR_TITLE": "skaitīt %1 no %2 līdz %3 ar soli %4", + "CONTROLS_FOREACH_TITLE": "visiem %1 no saraksta %2", + "CONTROLS_FOREACH_TOOLTIP": "Katram objektam no saraksta piešķirt mainīgajam '%1' šo objektu un izpildīt komandas.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "iet ārā no cikla", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "turpināt ar cikla nākamo iterāciju", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Iet ārā no iekļaujošā cikla", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Nepildīt atlikušo cikla daļu bet sākt nākamo iterāciju.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Brīdinājums: šo bloku drīkst izmantot tikai cikla iekšienē.", + "CONTROLS_IF_TOOLTIP_1": "Ja vērtība ir patiesa, tad izpildīt komandas.", + "CONTROLS_IF_TOOLTIP_2": "Ja vērtība ir patiesa, tad izpildīt pirmo bloku ar komandām. Citādi izpildīt otro bloku ar komandām.", + "CONTROLS_IF_TOOLTIP_3": "Ja pirmā vērtība ir patiesa, tad izpildīt pirmo bloku ar komandām. Citādi, ja otrā vērtība ir patiesa, izpildīt otro bloku ar komandām.", + "CONTROLS_IF_TOOLTIP_4": "Ja pirmā vērtība ir patiesa, tad izpildīt pirmo bloku ar komandām. Citādi, ja otrā vērtība ir patiesa, izpildīt otro bloku ar komandām. Ja neviena no vertībām nav patiesa, tad izpildīt pēdējo bloku ar komandām.", + "CONTROLS_IF_MSG_IF": "ja", + "CONTROLS_IF_MSG_ELSEIF": "citādi, ja", + "CONTROLS_IF_MSG_ELSE": "citādi", + "CONTROLS_IF_IF_TOOLTIP": "Pievienot, noņemt vai mainīt sekciju secību šim \"ja\" blokam.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Pievienot nosacījumu \"ja\" blokam.", + "CONTROLS_IF_ELSE_TOOLTIP": "Pievienot gala nosacījumu \"ja\" blokam.", + "LOGIC_COMPARE_HELPURL": "https://lv.wikipedia.org/wiki/Nevien%C4%81d%C4%ABba", + "LOGIC_COMPARE_TOOLTIP_EQ": "Patiess, ja abas puses ir vienādas.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Patiess, ja abas puses nav vienādas.", + "LOGIC_COMPARE_TOOLTIP_LT": "Patiess, ja kreisā puse ir mazāka par labo pusi.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Patiess, ja kreisā puse ir mazāka vai vienāda ar labo pusi.", + "LOGIC_COMPARE_TOOLTIP_GT": "Patiess, ja kreisā puse ir lielāka par labo pusi.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Patiess, ja kreisā puse ir lielāka vai vienāda ar labo pusi.", + "LOGIC_OPERATION_TOOLTIP_AND": "Patiess, ja abas puses ir patiesas.", + "LOGIC_OPERATION_AND": "un", + "LOGIC_OPERATION_TOOLTIP_OR": "Patiess, ja vismaz viena puse ir patiesa.", + "LOGIC_OPERATION_OR": "vai", + "LOGIC_NEGATE_TITLE": "ne %1", + "LOGIC_NEGATE_TOOLTIP": "Patiess, ja arguments ir aplams.", + "LOGIC_BOOLEAN_TRUE": "patiess", + "LOGIC_BOOLEAN_FALSE": "aplams", + "LOGIC_BOOLEAN_TOOLTIP": "Atgriež rezultātu \"patiess\" vai \"aplams\".", + "LOGIC_NULL": "nekas", + "LOGIC_NULL_TOOLTIP": "Atgriež neko.", + "LOGIC_TERNARY_CONDITION": "nosacījums", + "LOGIC_TERNARY_IF_TRUE": "ja patiess", + "LOGIC_TERNARY_IF_FALSE": "ja aplams", + "LOGIC_TERNARY_TOOLTIP": "Pārbaudīt nosacījumu. Ja 'nosacījums' ir patiess, atgriež vērtību 'ja patiess', pretējā gadījumā vērtību 'ja aplams'.", + "MATH_NUMBER_HELPURL": "https://lv.wikipedia.org/wiki/Skaitlis", + "MATH_NUMBER_TOOLTIP": "Skaitlis.", + "MATH_ARITHMETIC_HELPURL": "https://lv.wikipedia.org/wiki/Aritm%C4%93tika", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Atgriež divu skaitļu summu.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Atgriež divu skaitļu starpību.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Atgriež divu skaitļu reizinājumu.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Atgriež divu skaitļu dalījumu.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Atgriež pirmo skaitli kāpinātu pakāpē otrais skaitlis.", + "MATH_SINGLE_HELPURL": "https://lv.wikipedia.org/wiki/Kvadr%C4%81tsakne", + "MATH_SINGLE_OP_ROOT": "kvadrātsakne", + "MATH_SINGLE_TOOLTIP_ROOT": "Atgriež skaitļa kvadrātsakni.", + "MATH_SINGLE_OP_ABSOLUTE": "absolūtā vērtība", + "MATH_SINGLE_TOOLTIP_ABS": "Atgriež skaitļa absolūto vērtību.", + "MATH_SINGLE_TOOLTIP_NEG": "Atgriež pretējo skaitli.", + "MATH_SINGLE_TOOLTIP_LN": "Atgriež skaitļa naturālo logaritmu.", + "MATH_SINGLE_TOOLTIP_LOG10": "Atgriež skaitļa logaritmu pie bāzes 10.", + "MATH_SINGLE_TOOLTIP_EXP": "Atgriež e pakāpē dotais skaitlis.", + "MATH_SINGLE_TOOLTIP_POW10": "Atgriež 10 pakāpē dotais skaitlis.", + "MATH_TRIG_HELPURL": "https://lv.wikipedia.org/wiki/Trigonometrisk%C4%81s_funkcijas", + "MATH_TRIG_TOOLTIP_SIN": "Sinuss no grādiem (nevis radiāniem).", + "MATH_TRIG_TOOLTIP_COS": "Kosinuss no grādiem (nevis radiāniem).", + "MATH_TRIG_TOOLTIP_TAN": "Tangenss no grādiem (nevis radiāniem).", + "MATH_TRIG_TOOLTIP_ASIN": "Arksinuss (grādos).", + "MATH_TRIG_TOOLTIP_ACOS": "Arkkosinuss (grādos).", + "MATH_TRIG_TOOLTIP_ATAN": "Arktangenss (grādos).", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "Atgriež kādu no matemātikas konstantēm: π (3.141…), e (2.718…), φ (1.618…), √(2) (1.414…), √(½) (0.707…), ∞ (bezgalība).", + "MATH_IS_EVEN": "ir pāra", + "MATH_IS_ODD": "ir nepāra", + "MATH_IS_PRIME": "ir pirmskaitlis", + "MATH_IS_WHOLE": "ir vesels", + "MATH_IS_POSITIVE": "ir pozitīvs", + "MATH_IS_NEGATIVE": "ir negatīvs", + "MATH_IS_DIVISIBLE_BY": "dalās bez atlikuma ar", + "MATH_IS_TOOLTIP": "Pārbauda, vai skaitlis ir pāra, nepāra, vesels, pozitīvs, negatīvs vai dalās ar noteiktu skaitli. Atgriež \"patiess\" vai \"aplams\".", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "izmainīt %1 par %2", + "MATH_CHANGE_TOOLTIP": "Pieskaitīt doto skaitli mainīgajam '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Noapaļot skaitli uz augšu vai uz leju.", + "MATH_ROUND_OPERATOR_ROUND": "noapaļot", + "MATH_ROUND_OPERATOR_ROUNDUP": "apaļot uz augšu", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "apaļot uz leju", + "MATH_ONLIST_OPERATOR_SUM": "summa", + "MATH_ONLIST_TOOLTIP_SUM": "Saskaitīt visus skaitļus no dotā saraksta.", + "MATH_ONLIST_OPERATOR_MIN": "mazākais", + "MATH_ONLIST_TOOLTIP_MIN": "Atgriež mazāko vērtību no saraksta.", + "MATH_ONLIST_OPERATOR_MAX": "lielākais", + "MATH_ONLIST_TOOLTIP_MAX": "Atgriež lielāko vērtību no saraksta.", + "MATH_ONLIST_OPERATOR_AVERAGE": "vidējais", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Atgriež dotā saraksta vidējo aritmētisko vērtību.", + "MATH_ONLIST_OPERATOR_MEDIAN": "mediāna", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Atgriež dotā saraksta mediānas vērtību.", + "MATH_ONLIST_OPERATOR_MODE": "moda", + "MATH_ONLIST_TOOLTIP_MODE": "Atgriež dotā saraksta biežāk sastopamās vērtības (modas).", + "MATH_ONLIST_OPERATOR_STD_DEV": "standartnovirze", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Atgriež dotā saraksta standartnovirzi.", + "MATH_ONLIST_OPERATOR_RANDOM": "nejaušs", + "MATH_ONLIST_TOOLTIP_RANDOM": "Atgriež nejauši izvēlētu vērtību no dotā saraksta.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "atlikums no %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Atlikums no divu skaitļu dalījuma.", + "MATH_CONSTRAIN_TITLE": "ierobežot %1 no %2 līdz %3", + "MATH_CONSTRAIN_TOOLTIP": "Ierobežo skaitli no noteiktajās robežās (ieskaitot galapunktus).", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "nejaušs vesels skaitlis no %1 līdz %2", + "MATH_RANDOM_INT_TOOLTIP": "Atgriež nejaušu veselu skaitli dotajās robežās (iekļaujot galapunktus)", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "nejaušs skaitlis [0..1)", + "MATH_RANDOM_FLOAT_TOOLTIP": "Atgriež nejaušu reālo skaitli robežās no 0 (iekļaujot) līdz 1 (neiekļaujot).", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Burts, vārds vai jebkāda teksta rinda.", + "TEXT_JOIN_TITLE_CREATEWITH": "veidot tekstu no", + "TEXT_JOIN_TOOLTIP": "Izveidot tekstu savienojot dotos argumentus.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "savienot", + "TEXT_CREATE_JOIN_TOOLTIP": "Pievienot, noņemt vai mainīt sekciju secību šim \"teksta\" blokam.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Pievienot tekstam objektu.", + "TEXT_APPEND_TO": "tekstam", + "TEXT_APPEND_APPENDTEXT": "pievienot tekstu", + "TEXT_APPEND_TOOLTIP": "Pievienot tekstu mainīgajam '%1'.", + "TEXT_LENGTH_TITLE": "garums tekstam %1", + "TEXT_LENGTH_TOOLTIP": "Atgriež burtu skaitu (ieskaitot atstarpes) dotajā tekstā.", + "TEXT_ISEMPTY_TITLE": "%1 ir tukšs", + "TEXT_ISEMPTY_TOOLTIP": "Patiess, ja teksts ir tukšs.", + "TEXT_INDEXOF_TOOLTIP": "Meklē pirmā teksta rindu otrajā tekstā.\nAtgriež pozīciju otrajā tekstā, kurā sākas pirmais teksts.\nAtgriež %1 ja pirmā teksta rinda nav atrasta.", + "TEXT_INDEXOF_INPUT_INTEXT": "tekstā", + "TEXT_INDEXOF_OPERATOR_FIRST": "meklēt pirmo vietu, kur sākas teksts", + "TEXT_INDEXOF_OPERATOR_LAST": "meklēt pēdējo vietu, kur sākas teksts", + "TEXT_CHARAT_INPUT_INTEXT": "tekstā", + "TEXT_CHARAT_FROM_START": "paņemt burtu #", + "TEXT_CHARAT_FROM_END": "paņemt no beigām burtu #", + "TEXT_CHARAT_FIRST": "paņemt pirmo burtu", + "TEXT_CHARAT_LAST": "paņemt pēdējo burtu", + "TEXT_CHARAT_RANDOM": "paņemt nejaušu burtu", + "TEXT_CHARAT_TOOLTIP": "Atgriež burtu dotajā pozīcijā.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Atgriež norādīto teksta daļu.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "no teksta", + "TEXT_GET_SUBSTRING_START_FROM_START": "paņemt apakšvirkni sākot no burta nr", + "TEXT_GET_SUBSTRING_START_FROM_END": "paņemt apakšvirkni no beigām sākot ar burta nr", + "TEXT_GET_SUBSTRING_START_FIRST": "paņemt apakšvirkni no sākuma", + "TEXT_GET_SUBSTRING_END_FROM_START": "līdz burtam nr", + "TEXT_GET_SUBSTRING_END_FROM_END": "līdz burtam nr (no beigām)", + "TEXT_GET_SUBSTRING_END_LAST": "līdz pēdējam burtam", + "TEXT_CHANGECASE_TOOLTIP": "Atgriež teksta kopiju ar mainītiem lielajiem/mazajiem burtiem.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "kā LIELIE BURTI", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "kā mazie burti", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "kā Nosaukuma Burti", + "TEXT_TRIM_TOOLTIP": "Atgriež teksta kopiju ar noņemtām atstarpēm vienā vai otrā galā.", + "TEXT_TRIM_OPERATOR_BOTH": "Dzēst atstarpes no abām pusēm", + "TEXT_TRIM_OPERATOR_LEFT": "Dzēst atstarpes no sākuma", + "TEXT_TRIM_OPERATOR_RIGHT": "Dzēst atstarpes no beigām", + "TEXT_PRINT_TITLE": "parādīt %1", + "TEXT_PRINT_TOOLTIP": "Parādīt norādīto tekstu vai skaitli.", + "TEXT_PROMPT_TYPE_TEXT": "palūgt ievadīt tekstu ar ziņu", + "TEXT_PROMPT_TYPE_NUMBER": "palūgt ievadīt skaitli ar ziņu", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Palūgt lietotāju ievadīt skaitli.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Palūgt lietotāju ievadīt tekstu.", + "LISTS_CREATE_EMPTY_TITLE": "izveidot tukšu sarakstu", + "LISTS_CREATE_EMPTY_TOOLTIP": "Izveidot sarakstu bez elementiem tajā.", + "LISTS_CREATE_WITH_TOOLTIP": "Izveidot sarakstu no jebkura skaita vienību.", + "LISTS_CREATE_WITH_INPUT_WITH": "izveidot sarakstu no", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "saraksts", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Pievienot, noņemt vai mainīt sekciju secību šim \"saraksta\" blokam.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Pievienot objektu sarakstam.", + "LISTS_REPEAT_TOOLTIP": "Izveido sarakstu, kas sastāv no dotās vērtības noteiktu reižu skaita.", + "LISTS_REPEAT_TITLE": "saraksts no %1 atkārtots %2 reizes", + "LISTS_LENGTH_TITLE": "%1 garums", + "LISTS_LENGTH_TOOLTIP": "Atgriež elementu skaitu srakstā.", + "LISTS_ISEMPTY_TITLE": "%1 ir tukšs", + "LISTS_ISEMPTY_TOOLTIP": "Patiess, ja saraksts ir tukšs.", + "LISTS_INLIST": "sarakstā", + "LISTS_INDEX_OF_FIRST": "atrast pirmo elementu, kas vienāds ar", + "LISTS_INDEX_OF_LAST": "atrast pēdējo elementu, kas vienāds ar", + "LISTS_INDEX_OF_TOOLTIP": "Atgriež pozīciju sarakstā, kurā atrodas dotais objekts.\nAtgriež %1 ja objekts neatrodas sarakstā.", + "LISTS_GET_INDEX_GET": "paņemt", + "LISTS_GET_INDEX_GET_REMOVE": "paņemt uz dzēst", + "LISTS_GET_INDEX_REMOVE": "dzēst", + "LISTS_GET_INDEX_FROM_END": "no beigām numur", + "LISTS_GET_INDEX_FIRST": "pirmo", + "LISTS_GET_INDEX_LAST": "pēdējo", + "LISTS_GET_INDEX_RANDOM": "nejauši izvēlētu", + "LISTS_INDEX_FROM_START_TOOLTIP": "Saraksta elementu numerācija sākas no %1", + "LISTS_INDEX_FROM_END_TOOLTIP": "Saraksta elementu numerācija no beigām sākas no %1", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Atgriež norādīto elementu no saraksta.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Atgriež pirmo saraksta elementu.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Atgriež pēdējo saraksta elementu.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Atgriež nejauši izvēlētu saraksta elementu", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Atgriež un izdzēš no saraksta norādīto elementu.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Atgriež un izdzēš saraksta pirmo elementu.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Atgriež un izdzēš saraksta pēdējo elementu.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Atgriež un izdzēš no saraksta nejauši izvēlētu elementu.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Izdēš norādīto elementu no saraksta.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Izdēš pirmo saraksta elementu.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Izdēš pēdējo saraksta elementu.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Izdzēš no saraksta nejauši izvēlētu elementu.", + "LISTS_SET_INDEX_SET": "aizvieto", + "LISTS_SET_INDEX_INSERT": "ievieto", + "LISTS_SET_INDEX_INPUT_TO": "kā", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Aizvieto sarakstā elementu norādītajā pozīcijā.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Aizvieto elementu saraksta sākumā.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Aizvieto elementu saraksta beigās.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Aizvieto sarakstā elementu nejauši izvēlētā pozīcijā.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Ievieto sarakstā elementu norādītajā pozīcijā.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Ievieto elementu saraksta sākumā.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Pievieno elementu saraksta beigās.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Ievieto sarakstā jaunu elementu nejauši izvēlētā pozīcijā.", + "LISTS_GET_SUBLIST_START_FROM_START": "paņemt apakšsarakstu no pozīcijas", + "LISTS_GET_SUBLIST_START_FROM_END": "paņemt apakšsarakstu no beigām no pozīcijas", + "LISTS_GET_SUBLIST_START_FIRST": "paņemt apakšsarakstu no sākuma", + "LISTS_GET_SUBLIST_END_FROM_START": "līdz pozīcijai", + "LISTS_GET_SUBLIST_END_FROM_END": "līdz pozīcijai no beigām", + "LISTS_GET_SUBLIST_END_LAST": "līdz beigām", + "LISTS_GET_SUBLIST_TOOLTIP": "Nokopēt daļu no dotā saraksta.", + "LISTS_SORT_TITLE": "Sakārtot sarakstu no %3 elementiem %2 secībā %1", + "LISTS_SORT_TOOLTIP": "Saraksta sakārtota kopija.", + "LISTS_SORT_ORDER_ASCENDING": "augošā", + "LISTS_SORT_ORDER_DESCENDING": "dilstošā", + "LISTS_SORT_TYPE_NUMERIC": "skaitliski", + "LISTS_SORT_TYPE_TEXT": "pēc alfabēta", + "LISTS_SORT_TYPE_IGNORECASE": "pēc alfabēta, ignorēt mazos/lielos burtus", + "LISTS_SPLIT_LIST_FROM_TEXT": "vārdu saraksts no teksta", + "LISTS_SPLIT_TEXT_FROM_LIST": "izveidot tekstu no saraksta", + "LISTS_SPLIT_WITH_DELIMITER": "ar atdalītāju", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Sadalīt tekstu vārdos izmantojot atdalītāju.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Apvienot tekstu izmantojot atdalītāju.", + "VARIABLES_GET_TOOLTIP": "Atgriež mainīgā vērtību.", + "VARIABLES_GET_CREATE_SET": "Izveidot piešķiršanu mainīgajam %1", + "VARIABLES_SET": "piešķirt mainīgajam %1 vērtību %2", + "VARIABLES_SET_TOOLTIP": "Piešķirt mainīgajam vērtību.", + "VARIABLES_SET_CREATE_GET": "Izveidot 'ņem %1'", + "PROCEDURES_DEFNORETURN_TITLE": "funkcija", + "PROCEDURES_DEFNORETURN_PROCEDURE": "darīt kaut ko", + "PROCEDURES_BEFORE_PARAMS": "ar:", + "PROCEDURES_CALL_BEFORE_PARAMS": "ar:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Izveido funkciju, kas neatgriež rezultātu.", + "PROCEDURES_DEFNORETURN_COMMENT": "Funkcijas apraksts...", + "PROCEDURES_DEFRETURN_RETURN": "atgriezt", + "PROCEDURES_DEFRETURN_TOOLTIP": "Izveido funkciju, kas atgriež rezultātu.", + "PROCEDURES_ALLOW_STATEMENTS": "atļaut apakškomandas", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Brīdinājums: funkcijai ir vienādi argumenti.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Izpildīt iepriekš definētu funkcju '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLRETURN_TOOLTIP": "Izpildīt iepriekš definētu funkcju '%1' un izmantot tās rezultātu.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "argumenti", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Pievienot, pārkārtot vai dzēst funkcijas argumentus.", + "PROCEDURES_MUTATORARG_TITLE": "arguments:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Pievienot funkcijai argumentu.", + "PROCEDURES_HIGHLIGHT_DEF": "Izcelt funkcijas definīciju", + "PROCEDURES_CREATE_DO": "Izveidot '%1' izsaukumu", + "PROCEDURES_IFRETURN_TOOLTIP": "Ja pirmā vērtība ir \"patiesa\", tad atgriezt otro vērtību.", + "PROCEDURES_IFRETURN_WARNING": "Brīdinājums: Šo bloku var izmantot tikai funkcijas definīcijā." +} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/mk.json b/src/opsoro/server/static/js/blockly/msg/json/mk.json similarity index 96% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/mk.json rename to src/opsoro/server/static/js/blockly/msg/json/mk.json index ed1d2d1..c9f8a86 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/mk.json +++ b/src/opsoro/server/static/js/blockly/msg/json/mk.json @@ -12,6 +12,7 @@ "INLINE_INPUTS": "Внатрешен внос", "DELETE_BLOCK": "Избриши блок", "DELETE_X_BLOCKS": "Избриши %1 блока", + "DELETE_ALL_BLOCKS": "Да ги избришам сите %1 блокчиња?", "COLLAPSE_BLOCK": "Собери блок", "COLLAPSE_ALL": "Собери блокови", "EXPAND_BLOCK": "Рашири го блокови", @@ -19,9 +20,6 @@ "DISABLE_BLOCK": "Исклучи блок", "ENABLE_BLOCK": "Вклучи блок", "HELP": "Помош", - "CHAT": "Разговарајте со вашиот соработник во ова поле!", - "AUTH": "Овластете го извршников за да можете да ја зачувате вашата работа и да можете да ја споделувате.", - "ME": "Мене", "CHANGE_VALUE_TITLE": "Смена на вредност:", "NEW_VARIABLE": "Нова променлива...", "NEW_VARIABLE_TITLE": "Назив на новата променлива:", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ms.json b/src/opsoro/server/static/js/blockly/msg/json/ms.json similarity index 90% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/ms.json rename to src/opsoro/server/static/js/blockly/msg/json/ms.json index 092276a..cd7d828 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ms.json +++ b/src/opsoro/server/static/js/blockly/msg/json/ms.json @@ -14,6 +14,8 @@ "INLINE_INPUTS": "Input Sebaris", "DELETE_BLOCK": "Hapuskan Blok", "DELETE_X_BLOCKS": "Hapuskan %1 Blok", + "DELETE_ALL_BLOCKS": "Hapuskan kesemua %1 blok?", + "CLEAN_UP": "Kemaskan Blok", "COLLAPSE_BLOCK": "Lipat Blok", "COLLAPSE_ALL": "Lipat Blok²", "EXPAND_BLOCK": "Buka Blok", @@ -21,14 +23,11 @@ "DISABLE_BLOCK": "Matikan Blok", "ENABLE_BLOCK": "Hidupkan Blok", "HELP": "Bantuan", - "CHAT": "Bersembang dengan rakan kerjasama anda dengan menaip di dalam petak ini!", - "AUTH": "Sila benarkan aplikasi ini untuk membolehkan hasil kerja anda disimpan, malah dikongsikan oleh anda.", - "ME": "Saya", "CHANGE_VALUE_TITLE": "Ubah nilai:", - "NEW_VARIABLE": "Pembolehubah baru...", - "NEW_VARIABLE_TITLE": "Nama pembolehubah baru:", "RENAME_VARIABLE": "Tukar nama pembolehubah...", "RENAME_VARIABLE_TITLE": "Tukar nama semua pembolehubah '%1' kepada:", + "NEW_VARIABLE": "Pembolehubah baru...", + "NEW_VARIABLE_TITLE": "Nama pembolehubah baru:", "COLOUR_PICKER_HELPURL": "https://ms.wikipedia.org/wiki/Warna", "COLOUR_PICKER_TOOLTIP": "Pilih satu warna daripada palet.", "COLOUR_RANDOM_TITLE": "warna rawak", @@ -51,7 +50,7 @@ "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ulangi sehingga", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Lakukan beberapa perintah apabila nilainya benar (true).", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Lakukan beberapa perintah apabila nilainya palsu (false).", - "CONTROLS_FOR_TOOLTIP": "Gunakan pembolehubah \"%1\" pada nilai-nilai dari nombor pangkal hingga nombor hujung, mengira mengikut selang yang ditentukan, dan lakukan blok-blok yang tertentu.", + "CONTROLS_FOR_TOOLTIP": "Gunakan pembolehubah '%1' pada nilai-nilai dari nombor pangkal hingga nombor hujung, mengira mengikut selang yang ditentukan, dan lakukan blok-blok yang tertentu.", "CONTROLS_FOR_TITLE": "kira dengan %1 dari %2 hingga %3 selang %4", "CONTROLS_FOREACH_TITLE": "untuk setiap perkara %1 dalam senarai %2", "CONTROLS_FOREACH_TOOLTIP": "Untuk setiap perkara dalam senarai, tetapkan pembolehubah '%1' pada perkara, kemudian lakukan beberapa perintah.", @@ -187,7 +186,7 @@ "TEXT_LENGTH_TOOLTIP": "Kembalikan jumlah huruf (termasuk ruang) dalam teks yang disediakan.", "TEXT_ISEMPTY_TITLE": "%1 adalah kosong", "TEXT_ISEMPTY_TOOLTIP": "Kembalikan benar jika teks yang disediakan adalah kosong.", - "TEXT_INDEXOF_TOOLTIP": "Kembalikan Indeks kejadian pertama/terakhir dari teks pertama ke dalam teks kedua. Kembalikan 0 Jika teks tidak ditemui.", + "TEXT_INDEXOF_TOOLTIP": "Kembalikan Indeks kejadian pertama/terakhir dari teks pertama ke dalam teks kedua. Kembalikan %1 Jika teks tidak ditemui.", "TEXT_INDEXOF_INPUT_INTEXT": "dalam teks", "TEXT_INDEXOF_OPERATOR_FIRST": "mencari kejadian pertama teks", "TEXT_INDEXOF_OPERATOR_LAST": "mencari kejadian terakhir teks", @@ -237,7 +236,7 @@ "LISTS_INLIST": "dalam senarai", "LISTS_INDEX_OF_FIRST": "cari pertama item kejadian", "LISTS_INDEX_OF_LAST": "cari kejadian akhir item", - "LISTS_INDEX_OF_TOOLTIP": "Kembalikan indeks kejadian pertama/terakhir item dalam senarai. Kembalikan 0 jika teks tidak ditemui.", + "LISTS_INDEX_OF_TOOLTIP": "Menyatakan indeks kejadian pertama/terakhir item berkenaan dalam senarai. Menyatakan %1 jika item berkenaan tidak ditemui.", "LISTS_GET_INDEX_GET": "dapatkan", "LISTS_GET_INDEX_GET_REMOVE": "dapat dan alihkan", "LISTS_GET_INDEX_REMOVE": "alihkan", @@ -246,31 +245,28 @@ "LISTS_GET_INDEX_FIRST": "pertama", "LISTS_GET_INDEX_LAST": "terakhir", "LISTS_GET_INDEX_RANDOM": "rawak", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Kembalikan item dalam kedudukan yang ditetapkan dalam senarai. #1 ialah item terakhir.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Kembalikan item dalam kedudukan yang ditetapkan dalam senarai. #1 ialah item terakhir.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 ialah item pertama.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 ialah item terakhir.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Kembalikan item dalam kedudukan yang ditetapkan dalam senarai.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Kembalikan item pertama dalam senarai.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Kembalikan item pertama dalam senarai.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Kembalikan item rawak dalam senarai.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Alihkan dan kembalikan item mengikut spesifikasi posisi dalam senarai. #1 ialah item pertama.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Alihkan dan kembalikan item mengikut spesifikasi posisi dalam senarai. #1 ialah item terakhir.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Alihkan dan kembalikan item mengikut spesifikasi posisi dalam senarai.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Alihkan dan kembalikan item pertama dalam senarai.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Alihkan dan kembalikan item terakhir dalam senarai.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Alihkan dan kembalikan item rawak dalam senarai.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Alihkan item pada posisi mengikut spesifikasi dalam senarai. #1 ialah item pertama.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Alihkan item mengikut spesifikasi posisi dalam senarai. #1 ialah item terakhir.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Alihkan item pada posisi mengikut spesifikasi dalam senarai.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Alihkan item pertama dalam senarai.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Alihkan item terakhir dalam senarai.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Alihkan item rawak dalam senarai.", "LISTS_SET_INDEX_SET": "set", "LISTS_SET_INDEX_INSERT": "masukkan pada", "LISTS_SET_INDEX_INPUT_TO": "sebagai", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Masukkan item pada posisi yang ditentukan dalam senarai. #1 ialah item terakhir.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Masukkan item pada posisi yang ditentukan dalam senarai. #1 ialah item terakhir.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Masukkan item pada posisi yang ditentukan dalam senarai.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Set item pertama dalam senarai.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Set item terakhir dalam senarai.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Set item rawak dalam senarai.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Masukkan item pada posisi yand ditentukan dalam senarai. #1 ialah item terakhir.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Masukkan item pada posisi yang ditentukan dalam senarai. #1 ialah item terakhir.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Masukkan item pada posisi yand ditentukan dalam senarai.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Selit item pada permulaan senarai.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Tambahkan item dalam senarai akhir.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Selit item secara rawak di dalam senarai.", @@ -297,6 +293,7 @@ "PROCEDURES_BEFORE_PARAMS": "dengan:", "PROCEDURES_CALL_BEFORE_PARAMS": "dengan:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Menghasilkan suatu fungsi tanpa output.", + "PROCEDURES_DEFNORETURN_COMMENT": "Terangkan fungsi ini...", "PROCEDURES_DEFRETURN_RETURN": "kembali", "PROCEDURES_DEFRETURN_TOOLTIP": "Mencipta satu fungsi dengan pengeluaran.", "PROCEDURES_ALLOW_STATEMENTS": "bolehkan kenyataan", @@ -312,5 +309,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Serlahkan definisi fungsi", "PROCEDURES_CREATE_DO": "Hasilkan '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "If a value is true, then return a second value.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Amaran: Blok ini hanya boleh digunakan dalam fungsi definisi." } diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/nb.json b/src/opsoro/server/static/js/blockly/msg/json/nb.json similarity index 90% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/nb.json rename to src/opsoro/server/static/js/blockly/msg/json/nb.json index 1283be5..d41566c 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/nb.json +++ b/src/opsoro/server/static/js/blockly/msg/json/nb.json @@ -3,7 +3,9 @@ "authors": [ "Cocu", "Kingu", - "아라" + "아라", + "SuperPotato", + "Jon Harald Søby" ] }, "VARIABLES_DEFAULT_NAME": "element", @@ -14,7 +16,9 @@ "EXTERNAL_INPUTS": "Eksterne kilder", "INLINE_INPUTS": "Interne kilder", "DELETE_BLOCK": "Slett blokk", - "DELETE_X_BLOCKS": "Slett %1 blokk(er)", + "DELETE_X_BLOCKS": "Slett %1 blokker", + "DELETE_ALL_BLOCKS": "Slett alle %1 blokker?", + "CLEAN_UP": "Rydd opp Blocks", "COLLAPSE_BLOCK": "Skjul blokk", "COLLAPSE_ALL": "Skjul blokker", "EXPAND_BLOCK": "Utvid blokk", @@ -22,14 +26,16 @@ "DISABLE_BLOCK": "Deaktiver blokk", "ENABLE_BLOCK": "Aktiver blokk", "HELP": "Hjelp", - "CHAT": "Chat med din medarbeider ved å skrive i dette feltet!", - "AUTH": "Vennligst godkjenn at denne appen gjør det mulig for deg å lagre arbeidet slik at du kan dele det.", - "ME": "Jeg", + "UNDO": "Angre", + "REDO": "Gjør om", "CHANGE_VALUE_TITLE": "Bytt verdi:", - "NEW_VARIABLE": "Ny variabel...", - "NEW_VARIABLE_TITLE": "Nytt variabelnavn:", "RENAME_VARIABLE": "Gi nytt navn til variabel...", "RENAME_VARIABLE_TITLE": "Endre navnet til alle '%1' variabler til:", + "NEW_VARIABLE": "Opprett variabel...", + "NEW_VARIABLE_TITLE": "Nytt variabelnavn:", + "VARIABLE_ALREADY_EXISTS": "En variabel med navn «%1» finnes allerede.", + "DELETE_VARIABLE_CONFIRMATION": "Slett %1 bruk av variabelen «%2»?", + "DELETE_VARIABLE": "Slett variabelen «%1»", "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Velg en farge fra paletten.", "COLOUR_RANDOM_TITLE": "tilfeldig farge", @@ -193,7 +199,7 @@ "TEXT_LENGTH_TOOLTIP": "Returnerer antall bokstaver (inkludert mellomrom) i den angitte teksten.", "TEXT_ISEMPTY_TITLE": "%1 er tom", "TEXT_ISEMPTY_TOOLTIP": "Returnerer sann hvis den angitte teksten er tom.", - "TEXT_INDEXOF_TOOLTIP": "Returnerer posisjonen for første/siste forekomsten av den første tekst i den andre teksten. Returnerer 0 hvis teksten ikke blir funnet.", + "TEXT_INDEXOF_TOOLTIP": "Returnerer posisjonen for første/siste forekomsten av den første tekst i den andre teksten. Returnerer %1 hvis teksten ikke blir funnet.", "TEXT_INDEXOF_INPUT_INTEXT": "i tekst", "TEXT_INDEXOF_OPERATOR_FIRST": "finn første forekomst av tekst", "TEXT_INDEXOF_OPERATOR_LAST": "finn siste forekomst av tekst", @@ -246,7 +252,7 @@ "LISTS_INLIST": "i listen", "LISTS_INDEX_OF_FIRST": "finn første forekomst av elementet", "LISTS_INDEX_OF_LAST": "finn siste forekomst av elementet", - "LISTS_INDEX_OF_TOOLTIP": "Returnerer posisjonen til den første/siste forekomsten av elementet i en liste. Returnerer 0 hvis ikke funnet.", + "LISTS_INDEX_OF_TOOLTIP": "Returnerer indeksen av den første/siste forekomsten av elementet i lista. Returnerer %1 hvis ikke funnet.", "LISTS_GET_INDEX_GET": "hent", "LISTS_GET_INDEX_GET_REMOVE": "hent og fjern", "LISTS_GET_INDEX_REMOVE": "fjern", @@ -256,31 +262,28 @@ "LISTS_GET_INDEX_LAST": "siste", "LISTS_GET_INDEX_RANDOM": "tilfeldig", "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Returner elementet på den angitte posisjonen i en liste. #1 er det første elementet.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Returner elementet på den angitte posisjonen i en liste. #1 er det siste elementet.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 er det første elementet.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 er det siste elementet.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Returner elementet på den angitte posisjonen i en liste.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Returnerer det første elementet i en liste.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Returnerer det siste elementet i en liste.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Returnerer et tilfeldig element i en liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Fjerner og returnerer elementet ved en gitt posisjon i en liste. #1 er det første elementet.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Fjerner og returnerer elementet ved en gitt posisjon i en liste. #1 er det siste elementet.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Fjerner og returnerer elementet ved en gitt posisjon i en liste.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Fjerner og returnerer det første elementet i en liste.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Fjerner og returnerer det siste elementet i en liste.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Fjerner og returnerer et tilfeldig element i en liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Fjerner et element ved en gitt posisjon i en liste. #1 er det første elementet.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Fjerner et element ved en gitt posisjon i en liste. #1 er det siste elementet.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Fjerner et element ved en gitt posisjon i en liste.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Fjerner det første elementet i en liste.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Fjerner det siste elementet i en liste.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Fjerner et tilfeldig element i en liste.", "LISTS_SET_INDEX_SET": "sett", "LISTS_SET_INDEX_INSERT": "sett inn ved", "LISTS_SET_INDEX_INPUT_TO": "som", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Setter inn elementet ved den angitte posisjonen i en liste. #1 er det første elementet.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Setter inn elementet ved den angitte posisjonen i en liste. #1 er det siste elementet.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Setter inn elementet ved den angitte posisjonen i en liste.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Angir det første elementet i en liste.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Angir det siste elementet i en liste.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Angir et tilfeldig element i en liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Setter inn elementet ved den angitte posisjonen i en liste. #1 er det første elementet.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Setter inn elementet ved den angitte posisjonen i en liste. #1 er det siste elementet.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Setter inn elementet ved den angitte posisjonen i en liste.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Setter inn elementet i starten av en liste.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Tilføy elementet til slutten av en liste.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Setter inn elementet ved en tilfeldig posisjon i en liste.", @@ -292,6 +295,19 @@ "LISTS_GET_SUBLIST_END_LAST": "til siste", "LISTS_GET_SUBLIST_TAIL": "", "LISTS_GET_SUBLIST_TOOLTIP": "Kopiérer en ønsket del av en liste.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sorter %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Sorter en kopi av en liste.", + "LISTS_SORT_ORDER_ASCENDING": "stigende", + "LISTS_SORT_ORDER_DESCENDING": "synkende", + "LISTS_SORT_TYPE_NUMERIC": "numerisk", + "LISTS_SORT_TYPE_TEXT": "alfabetisk", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetisk, ignorert store/små bokstaver", + "LISTS_SPLIT_LIST_FROM_TEXT": "lag liste av tekst", + "LISTS_SPLIT_TEXT_FROM_LIST": "lag tekst av liste", + "LISTS_SPLIT_WITH_DELIMITER": "med avgrenser", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Splitt teksten til en liste med tekster, brutt ved hver avgrenser.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Føy sammen en liste tekster til én tekst, avskilt av en avgrenser.", "ORDINAL_NUMBER_SUFFIX": "", "VARIABLES_GET_TOOLTIP": "Returnerer verdien av denne variabelen.", "VARIABLES_GET_CREATE_SET": "Opprett 'sett %1'", @@ -305,13 +321,13 @@ "PROCEDURES_CALL_BEFORE_PARAMS": "med:", "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "Opprett en funksjon som ikke har noe resultat.", + "PROCEDURES_DEFNORETURN_COMMENT": "Beskriv denne funksjonen...", "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "returner", "PROCEDURES_DEFRETURN_TOOLTIP": "Oppretter en funksjon som har et resultat.", "PROCEDURES_ALLOW_STATEMENTS": "tillat uttalelser", "PROCEDURES_DEF_DUPLICATE_WARNING": "Advarsel: Denne funksjonen har duplikate parametere.", "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_CALL": "", "PROCEDURES_CALLNORETURN_TOOLTIP": "Kjør den brukerdefinerte funksjonen '%1'.", "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_CALLRETURN_TOOLTIP": "Kjør den brukerdefinerte funksjonen'%1' og bruk resultatet av den.", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/nl.json b/src/opsoro/server/static/js/blockly/msg/json/nl.json similarity index 89% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/nl.json rename to src/opsoro/server/static/js/blockly/msg/json/nl.json index bb92c17..686c001 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/nl.json +++ b/src/opsoro/server/static/js/blockly/msg/json/nl.json @@ -5,7 +5,11 @@ "McDutchie", "Ribert", "MedShot", - "아라" + "아라", + "JaapDeKleine", + "Sjoerddebruin", + "Lemondoge", + "Jeleniccz" ] }, "VARIABLES_DEFAULT_NAME": "item", @@ -17,21 +21,25 @@ "INLINE_INPUTS": "Inline invoer", "DELETE_BLOCK": "Blok verwijderen", "DELETE_X_BLOCKS": "%1 blokken verwijderen", - "COLLAPSE_BLOCK": "Blok inklappen", - "COLLAPSE_ALL": "Blokken inklappen", + "DELETE_ALL_BLOCKS": "Alle %1 blokken verwijderen?", + "CLEAN_UP": "Blokken opschonen", + "COLLAPSE_BLOCK": "Blok samenvouwen", + "COLLAPSE_ALL": "Blokken samenvouwen", "EXPAND_BLOCK": "Blok uitvouwen", "EXPAND_ALL": "Blokken uitvouwen", "DISABLE_BLOCK": "Blok uitschakelen", "ENABLE_BLOCK": "Blok inschakelen", "HELP": "Hulp", - "CHAT": "Chat met iemand die ook aan het werk is via dit venster!", - "AUTH": "Sta deze app toe om uw werk op te slaan het uw werk te delen.", - "ME": "Ik", + "UNDO": "Ongedaan maken", + "REDO": "Opnieuw", "CHANGE_VALUE_TITLE": "Waarde wijzigen:", - "NEW_VARIABLE": "Nieuwe variabele...", - "NEW_VARIABLE_TITLE": "Nieuwe variabelenaam:", "RENAME_VARIABLE": "Variabele hernoemen...", "RENAME_VARIABLE_TITLE": "Alle variabelen \"%1\" hernoemen naar:", + "NEW_VARIABLE": "Variabele maken...", + "NEW_VARIABLE_TITLE": "Nieuwe variabelenaam:", + "VARIABLE_ALREADY_EXISTS": "Er bestaat al een variabele met de naam \"%1\".", + "DELETE_VARIABLE_CONFIRMATION": "%1 gebruiken van de variabele \"%2\" verwijderen?", + "DELETE_VARIABLE": "Verwijder de variabele \"%1\"", "COLOUR_PICKER_HELPURL": "https://nl.wikipedia.org/wiki/Kleur", "COLOUR_PICKER_TOOLTIP": "Kies een kleur in het palet.", "COLOUR_RANDOM_TITLE": "willekeurige kleur", @@ -76,7 +84,7 @@ "CONTROLS_IF_MSG_IF": "als", "CONTROLS_IF_MSG_ELSEIF": "anders als", "CONTROLS_IF_MSG_ELSE": "anders", - "CONTROLS_IF_IF_TOOLTIP": "Voeg stukken toe, verwijder of verander de volgorde om dit \"als\"-blok te wijzigen.", + "CONTROLS_IF_IF_TOOLTIP": "Voeg stukken toe, verwijder of wijzig de volgorde om dit \"als\"-blok te wijzigen.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Voeg een voorwaarde toe aan het als-blok.", "CONTROLS_IF_ELSE_TOOLTIP": "Voeg een laatste, vang-alles conditie toe aan het als-statement.", "LOGIC_COMPARE_HELPURL": "https://nl.wikipedia.org/wiki/Ongelijkheid_(wiskunde)", @@ -193,7 +201,7 @@ "TEXT_JOIN_TITLE_CREATEWITH": "maak tekst met", "TEXT_JOIN_TOOLTIP": "Maakt een stuk tekst door één of meer items samen te voegen.", "TEXT_CREATE_JOIN_TITLE_JOIN": "samenvoegen", - "TEXT_CREATE_JOIN_TOOLTIP": "Toevoegen, verwijderen of volgorde veranderen van secties om dit tekstblok opnieuw in te stellen.", + "TEXT_CREATE_JOIN_TOOLTIP": "Toevoegen, verwijderen of volgorde wijzigen van secties om dit tekstblok opnieuw in te stellen.", "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Voegt een item aan de tekst toe.", "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_APPEND_TO": "voeg toe aan", @@ -206,7 +214,7 @@ "TEXT_ISEMPTY_TITLE": "%1 is leeg", "TEXT_ISEMPTY_TOOLTIP": "Geeft \"waar\" terug, als de opgegeven tekst leeg is.", "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", - "TEXT_INDEXOF_TOOLTIP": "Geeft de index terug van de eerste/laatste aanwezigheid van de eerste tekst in de tweede tekst. Geeft 0 terug als de tekst niet gevonden is.", + "TEXT_INDEXOF_TOOLTIP": "Geeft de index terug van het eerste of laatste voorkomen van de eerste tekst in de tweede tekst. Geeft %1 terug als de tekst niet gevonden is.", "TEXT_INDEXOF_INPUT_INTEXT": "in tekst", "TEXT_INDEXOF_OPERATOR_FIRST": "zoek eerste voorkomen van tekst", "TEXT_INDEXOF_OPERATOR_LAST": "zoek het laatste voorkomen van tekst", @@ -251,7 +259,7 @@ "LISTS_CREATE_WITH_TOOLTIP": "Maak een lijst met een willekeurig aantal items.", "LISTS_CREATE_WITH_INPUT_WITH": "maak een lijst met", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lijst", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Voeg stukken toe, verwijder ze of verander de volgorde om dit lijstblok aan te passen.", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Voeg stukken toe, verwijder ze of wijzig de volgorde om dit lijstblok aan te passen.", "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Voeg iets toe aan de lijst.", "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_REPEAT_TOOLTIP": "Maakt een lijst die bestaat uit de opgegeven waarde, het opgegeven aantal keer herhaald.", @@ -265,7 +273,7 @@ "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", "LISTS_INDEX_OF_FIRST": "zoek eerste voorkomen van item", "LISTS_INDEX_OF_LAST": "zoek laatste voorkomen van item", - "LISTS_INDEX_OF_TOOLTIP": "Geeft de index van het eerste of laatste voorkomen van een item in de lijst terug. Geeft 0 terug als de tekst niet is gevonden.", + "LISTS_INDEX_OF_TOOLTIP": "Geeft de index terug van het eerste of laatste voorkomen van een item in de lijst. Geeft %1 terug als het item niet is gevonden.", "LISTS_GET_INDEX_GET": "haal op", "LISTS_GET_INDEX_GET_REMOVE": "haal op en verwijder", "LISTS_GET_INDEX_REMOVE": "verwijder", @@ -274,18 +282,17 @@ "LISTS_GET_INDEX_FIRST": "eerste", "LISTS_GET_INDEX_LAST": "laatste", "LISTS_GET_INDEX_RANDOM": "willekeurig", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Geeft het item op de opgegeven positie in een lijst. Item 1 is het eerste item.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Geeft het item op de opgegeven positie in een lijst terug. Item 1 is het laatste item.", + "LISTS_INDEX_FROM_START_TOOLTIP": "Item %1 is het eerste item.", + "LISTS_INDEX_FROM_END_TOOLTIP": "Item %1 is het laatste item.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Geeft het item op de opgegeven positie in een lijst.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Geeft het eerste item in een lijst terug.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Geeft het laatste item in een lijst terug.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Geeft een willekeurig item uit een lijst.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Geeft het item op de opgegeven positie in een lijst terug en verwijdert het. Item 1 is het eerste item.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Verwijdert en geeft het item op de opgegeven positie in de lijst. Item 1 is het laatste item.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Geeft het item op de opgegeven positie in een lijst terug en verwijdert het.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Geeft het laatste item in een lijst terug en verwijdert het.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Geeft het laatste item uit een lijst terug en verwijdert het.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Geeft een willekeurig item in een lijst terug en verwijdert het.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Verwijdert het item op de opgegeven positie in een lijst. Item 1 is het eerste item.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Verwijdert een item op de opgegeven positie in een lijst. Item 1 is het laatste item.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Verwijdert het item op de opgegeven positie in een lijst.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Verwijdert het eerste item in een lijst.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Verwijdert het laatste item uit een lijst.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Verwijdert een willekeurig item uit een lijst.", @@ -293,13 +300,11 @@ "LISTS_SET_INDEX_SET": "stel in", "LISTS_SET_INDEX_INSERT": "tussenvoegen op", "LISTS_SET_INDEX_INPUT_TO": "als", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Stelt het item op de opgegeven positie in de lijst in. Item 1 is het eerste item.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Stelt het item op een opgegeven positie in de lijst in. Item 1 is het laatste item.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Zet het item op de opgegeven positie in de lijst.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Stelt het eerste item in een lijst in.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Stelt het laatste item van een lijst in.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Stelt een willekeurig item uit de lijst in.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Voegt het item op een opgegeven positie in een lijst in. Item 1 is het eerste item.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Voegt het item op de opgegeven positie toe aan een lijst in. Item 1 is het laatste item.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Voegt het item op een opgegeven positie in een lijst in.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Voegt het item toe aan het begin van de lijst.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Voeg het item aan het einde van een lijst toe.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Voegt het item op een willekeurige positie in de lijst in.", @@ -311,10 +316,18 @@ "LISTS_GET_SUBLIST_END_FROM_END": "naar # vanaf einde", "LISTS_GET_SUBLIST_END_LAST": "naar laatste", "LISTS_GET_SUBLIST_TOOLTIP": "Maakt een kopie van het opgegeven deel van de lijst.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sorteer %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Sorteer een kopie van een lijst.", + "LISTS_SORT_ORDER_ASCENDING": "oplopend", + "LISTS_SORT_ORDER_DESCENDING": "aflopend", + "LISTS_SORT_TYPE_NUMERIC": "numeriek", + "LISTS_SORT_TYPE_TEXT": "alfabetisch", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetisch, negeer hoofd-/kleine letters", "LISTS_SPLIT_LIST_FROM_TEXT": "lijst maken van tekst", "LISTS_SPLIT_TEXT_FROM_LIST": "tekst maken van lijst", "LISTS_SPLIT_WITH_DELIMITER": "met scheidingsteken", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Tekst splitsen in een tekst van tekst op basis van een scheidingsteken.", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Tekst splitsen in een lijst van teksten op basis van een scheidingsteken.", "LISTS_SPLIT_TOOLTIP_JOIN": "Lijst van tekstdelen samenvoegen in één stuk tekst, waarbij de tekstdelen gescheiden zijn door een scheidingsteken.", "VARIABLES_GET_HELPURL": "https://github.com/google/blockly/wiki/Variables#get", "VARIABLES_GET_TOOLTIP": "Geeft de waarde van deze variabele.", @@ -329,6 +342,7 @@ "PROCEDURES_BEFORE_PARAMS": "met:", "PROCEDURES_CALL_BEFORE_PARAMS": "met:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Maakt een functie zonder uitvoer.", + "PROCEDURES_DEFNORETURN_COMMENT": "Deze functie beschrijven...", "PROCEDURES_DEFRETURN_HELPURL": "https://nl.wikipedia.org/wiki/Subprogramma", "PROCEDURES_DEFRETURN_RETURN": "uitvoeren", "PROCEDURES_DEFRETURN_TOOLTIP": "Maakt een functie met een uitvoer.", @@ -345,5 +359,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Accentueer functiedefinitie", "PROCEDURES_CREATE_DO": "Maak \"%1\"", "PROCEDURES_IFRETURN_TOOLTIP": "Als de eerste waarde \"waar\" is, geef dan de tweede waarde terug.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Waarschuwing: dit blok mag alleen gebruikt worden binnen de definitie van een functie." } diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/oc.json b/src/opsoro/server/static/js/blockly/msg/json/oc.json similarity index 85% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/oc.json rename to src/opsoro/server/static/js/blockly/msg/json/oc.json index 1532f3a..ea20c94 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/oc.json +++ b/src/opsoro/server/static/js/blockly/msg/json/oc.json @@ -5,6 +5,7 @@ ] }, "VARIABLES_DEFAULT_NAME": "element", + "TODAY": "Uèi", "DUPLICATE_BLOCK": "Duplicar", "ADD_COMMENT": "Apondre un comentari", "REMOVE_COMMENT": "Suprimir un comentari", @@ -12,6 +13,8 @@ "INLINE_INPUTS": "Entradas en linha", "DELETE_BLOCK": "Suprimir lo blòt", "DELETE_X_BLOCKS": "Suprimir %1 blòts", + "DELETE_ALL_BLOCKS": "Suprimir totes los %1 blòts ?", + "CLEAN_UP": "Netejar los blòts", "COLLAPSE_BLOCK": "Redusir lo blòt", "COLLAPSE_ALL": "Redusir los blòts", "EXPAND_BLOCK": "Desvolopar lo blòt", @@ -19,15 +22,17 @@ "DISABLE_BLOCK": "Desactivar lo blòt", "ENABLE_BLOCK": "Activar lo blòt", "HELP": "Ajuda", - "ME": "Ieu", + "UNDO": "Anullar", + "REDO": "Refar", "CHANGE_VALUE_TITLE": "Modificar la valor :", - "NEW_VARIABLE": "Variabla novèla…", - "NEW_VARIABLE_TITLE": "Nom de la novèla variabla :", "RENAME_VARIABLE": "Renomenar la variabla…", + "RENAME_VARIABLE_TITLE": "Renomenar totas las variablas « %1 » a :", + "NEW_VARIABLE": "Crear una variabla...", + "NEW_VARIABLE_TITLE": "Nom de la novèla variabla :", "COLOUR_PICKER_HELPURL": "https://oc.wikipedia.org/wiki/Color", "COLOUR_RANDOM_TITLE": "color aleatòria", "COLOUR_RANDOM_TOOLTIP": "Causir una color a l'azard.", - "COLOUR_RGB_TITLE": "colorar amb", + "COLOUR_RGB_TITLE": "coloriar amb", "COLOUR_RGB_RED": "roge", "COLOUR_RGB_GREEN": "verd", "COLOUR_RGB_BLUE": "blau", @@ -45,6 +50,9 @@ "CONTROLS_IF_MSG_IF": "se", "CONTROLS_IF_MSG_ELSEIF": "siquenon se", "CONTROLS_IF_MSG_ELSE": "siquenon", + "LOGIC_COMPARE_TOOLTIP_EQ": "Renviar verai se las doas entradas son egalas.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Renviar verai se las doas entradas son diferentas.", + "LOGIC_OPERATION_TOOLTIP_AND": "Renviar verai se las doas entradas son vertadièras.", "LOGIC_OPERATION_AND": "e", "LOGIC_OPERATION_OR": "o", "LOGIC_NEGATE_TITLE": "pas %1", @@ -76,6 +84,7 @@ "MATH_ONLIST_OPERATOR_MAX": "maximum de la lista", "MATH_ONLIST_OPERATOR_AVERAGE": "mejana de la lista", "MATH_ONLIST_OPERATOR_MEDIAN": "mediana de la lista", + "TEXT_CREATE_JOIN_TITLE_JOIN": "jónher", "TEXT_APPEND_TO": "a", "TEXT_APPEND_APPENDTEXT": "apondre lo tèxte", "TEXT_LENGTH_TITLE": "longor de %1", @@ -109,6 +118,11 @@ "LISTS_GET_SUBLIST_END_FROM_START": "fins a #", "LISTS_GET_SUBLIST_END_FROM_END": "fins a # dempuèi la fin", "LISTS_GET_SUBLIST_END_LAST": "fins a la fin", + "LISTS_SORT_ORDER_ASCENDING": "creissent", + "LISTS_SORT_ORDER_DESCENDING": "descreissent", + "LISTS_SORT_TYPE_NUMERIC": "numeric", + "LISTS_SORT_TYPE_TEXT": "alfabetic", + "LISTS_SPLIT_WITH_DELIMITER": "amb lo separador", "VARIABLES_GET_CREATE_SET": "Crear 'fixar %1'", "VARIABLES_SET": "fixar %1 a %2", "PROCEDURES_DEFNORETURN_TITLE": "a", diff --git a/src/opsoro/server/static/js/blockly/msg/json/pl.json b/src/opsoro/server/static/js/blockly/msg/json/pl.json new file mode 100644 index 0000000..8c22503 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/pl.json @@ -0,0 +1,348 @@ +{ + "@metadata": { + "authors": [ + "Cotidianis", + "Faren", + "Vengir", + "Pbz", + "Pio387", + "아라", + "Mateon1", + "Expert3222", + "Cirasean", + "Fringoo", + "Chrumps", + "Woytecr", + "Liuxinyu970226" + ] + }, + "VARIABLES_DEFAULT_NAME": "element", + "TODAY": "Dzisiaj", + "DUPLICATE_BLOCK": "Duplikuj", + "ADD_COMMENT": "Dodaj komentarz", + "REMOVE_COMMENT": "Usuń komentarz", + "EXTERNAL_INPUTS": "Zewnętrzne wejścia", + "INLINE_INPUTS": "Wbudowane wejścia", + "DELETE_BLOCK": "Usuń blok", + "DELETE_X_BLOCKS": "Usuń %1 bloki(ów)", + "DELETE_ALL_BLOCKS": "Usunąć wszystkie %1 bloki(ów)?", + "CLEAN_UP": "Uporządkuj bloki", + "COLLAPSE_BLOCK": "Zwiń blok", + "COLLAPSE_ALL": "Zwiń bloki", + "EXPAND_BLOCK": "Rozwiń blok", + "EXPAND_ALL": "Rozwiń bloki", + "DISABLE_BLOCK": "Wyłącz blok", + "ENABLE_BLOCK": "Włącz blok", + "HELP": "Pomoc", + "UNDO": "Cofnij", + "REDO": "Ponów", + "CHANGE_VALUE_TITLE": "Zmień wartość:", + "RENAME_VARIABLE": "Zmień nazwę zmiennej...", + "RENAME_VARIABLE_TITLE": "Zmień nazwy wszystkich '%1' zmiennych na:", + "NEW_VARIABLE": "Stwórz zmienną...", + "NEW_VARIABLE_TITLE": "Nowa nazwa zmiennej:", + "VARIABLE_ALREADY_EXISTS": "Zmienna o nazwie '%1' już istnieje.", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", + "COLOUR_PICKER_TOOLTIP": "Wybierz kolor z palety.", + "COLOUR_RANDOM_TITLE": "losowy kolor", + "COLOUR_RANDOM_TOOLTIP": "Wybierz kolor w sposób losowy.", + "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", + "COLOUR_RGB_TITLE": "kolor z", + "COLOUR_RGB_RED": "czerwony", + "COLOUR_RGB_GREEN": "zielony", + "COLOUR_RGB_BLUE": "niebieski", + "COLOUR_RGB_TOOLTIP": "Połącz czerwony, zielony i niebieski w odpowiednich proporcjach, tak aby powstał nowy kolor. Zawartość każdego z nich określa liczba z przedziału od 0 do 100.", + "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", + "COLOUR_BLEND_TITLE": "wymieszaj", + "COLOUR_BLEND_COLOUR1": "kolor 1", + "COLOUR_BLEND_COLOUR2": "kolor 2", + "COLOUR_BLEND_RATIO": "proporcja", + "COLOUR_BLEND_TOOLTIP": "Miesza dwa kolory w danej proporcji (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "powtórz %1 razy", + "CONTROLS_REPEAT_INPUT_DO": "wykonaj", + "CONTROLS_REPEAT_TOOLTIP": "Wykonaj niektóre instrukcje kilka razy.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "powtarzaj dopóki", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "powtarzaj aż", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Gdy wartość jest prawdziwa, wykonaj kilka instrukcji.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Gdy wartość jest nieprawdziwa, wykonaj kilka instrukcji.", + "CONTROLS_FOR_TOOLTIP": "Przypisuje zmiennej %1 wartości od numeru startowego do numeru końcowego, licząc co określony interwał, wykonując określone bloki.", + "CONTROLS_FOR_TITLE": "licz z %1 od %2 do %3 co %4 (wartość kroku)", + "CONTROLS_FOREACH_TITLE": "dla każdego elementu %1 na liście %2", + "CONTROLS_FOREACH_TOOLTIP": "Dla każdego elementu listy ustaw zmienną %1 na ten element, a następnie wykonaj kilka instrukcji.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "wyjdź z pętli", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "przejdź do kolejnej iteracji pętli", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Wyjdź z zawierającej pętli.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Pomiń resztę pętli i kontynuuj w kolejnej iteracji.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Uwaga: Ten blok może być użyty tylko w pętli.", + "CONTROLS_IF_TOOLTIP_1": "Jeśli wartość jest prawdziwa, to wykonaj kilka instrukcji.", + "CONTROLS_IF_TOOLTIP_2": "Jeśli wartość jest prawdziwa, to wykonaj pierwszy blok instrukcji. W przeciwnym razie, wykonaj drugi blok instrukcji.", + "CONTROLS_IF_TOOLTIP_3": "Jeśli pierwsza wartość jest prawdziwa, to wykonaj pierwszy blok instrukcji. W przeciwnym razie, jeśli druga wartość jest prawdziwa, to wykonaj drugi blok instrukcji.", + "CONTROLS_IF_TOOLTIP_4": "Jeśli pierwsza wartość jest prawdziwa, wykonaj pierwszy blok instrukcji. W przeciwnym razie jeśli druga wartość jest prawdziwa, wykonaj drugi blok instrukcji. Jeżeli żadna z wartości nie jest prawdziwa, wykonaj ostatni blok instrukcji.", + "CONTROLS_IF_MSG_IF": "jeśli", + "CONTROLS_IF_MSG_ELSEIF": "w przeciwnym razie, jeśli", + "CONTROLS_IF_MSG_ELSE": "w przeciwnym razie", + "CONTROLS_IF_IF_TOOLTIP": "Dodaj, usuń lub zmień kolejność bloków, żeby zmodyfikować ten blok „jeśli”.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Dodaj warunek do bloku „jeśli”.", + "CONTROLS_IF_ELSE_TOOLTIP": "Dodaj ostatni warunek do bloku „jeśli”, gdy żaden wcześniejszy nie był spełniony.", + "LOGIC_COMPARE_HELPURL": "https://pl.wikipedia.org/wiki/Nierówność", + "LOGIC_COMPARE_TOOLTIP_EQ": "Zwróć \"prawda\", jeśli oba wejścia są sobie równe.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Zwróć \"prawda\", jeśli oba wejścia są sobie nierówne.", + "LOGIC_COMPARE_TOOLTIP_LT": "Zwróć \"prawda\" jeśli pierwsze wejście jest większe od drugiego.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Zwróć \"prawda\", jeśli pierwsze wejście jest większe lub równe drugiemu.", + "LOGIC_COMPARE_TOOLTIP_GT": "Zwróć \"prawda\" jeśli pierwsze wejście jest większe od drugiego.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Zwróć \"prawda\", jeśli pierwsze wejście jest większe lub równe drugiemu.", + "LOGIC_OPERATION_TOOLTIP_AND": "Zwróć \"prawda\" jeśli oba dane elementy mają wartość \"prawda\".", + "LOGIC_OPERATION_AND": "i", + "LOGIC_OPERATION_TOOLTIP_OR": "Zwróć \"prawda\" jeśli co najmniej jeden dany element ma wartość \"prawda\".", + "LOGIC_OPERATION_OR": "lub", + "LOGIC_NEGATE_TITLE": "nie %1", + "LOGIC_NEGATE_TOOLTIP": "Zwraca \"prawda\", jeśli dane wejściowe są fałszywe. Zwraca \"fałsz\", jeśli dana wejściowa jest prawdziwa.", + "LOGIC_BOOLEAN_TRUE": "prawda", + "LOGIC_BOOLEAN_FALSE": "fałsz", + "LOGIC_BOOLEAN_TOOLTIP": "Zwraca 'prawda' lub 'fałsz'.", + "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", + "LOGIC_NULL": "nic", + "LOGIC_NULL_TOOLTIP": "Zwraca nic.", + "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", + "LOGIC_TERNARY_CONDITION": "test", + "LOGIC_TERNARY_IF_TRUE": "jeśli prawda", + "LOGIC_TERNARY_IF_FALSE": "jeśli fałsz", + "LOGIC_TERNARY_TOOLTIP": "Sprawdź warunek w „test”. Jeśli warunek jest prawdziwy, to zwróci „jeśli prawda”; jeśli nie jest prawdziwy to zwróci „jeśli fałsz”.", + "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", + "MATH_NUMBER_TOOLTIP": "Liczba.", + "MATH_ADDITION_SYMBOL": "+", + "MATH_SUBTRACTION_SYMBOL": "-", + "MATH_DIVISION_SYMBOL": "/", + "MATH_MULTIPLICATION_SYMBOL": "×", + "MATH_POWER_SYMBOL": "^", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tg", + "MATH_TRIG_ASIN": "arcsin", + "MATH_TRIG_ACOS": "arccos", + "MATH_TRIG_ATAN": "arctg", + "MATH_ARITHMETIC_HELPURL": "https://pl.wikipedia.org/wiki/Arytmetyka", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Zwróć sumę dwóch liczb.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Zwróć różnicę dwóch liczb.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Zwróć iloczyn dwóch liczb.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Zwróć iloraz dwóch liczb.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Zwróć pierwszą liczbę podniesioną do potęgi o wykładniku drugiej liczby.", + "MATH_SINGLE_HELPURL": "https://pl.wikipedia.org/wiki/Pierwiastek_kwadratowy", + "MATH_SINGLE_OP_ROOT": "pierwiastek kwadratowy", + "MATH_SINGLE_TOOLTIP_ROOT": "Zwróć pierwiastek kwadratowy danej liczby.", + "MATH_SINGLE_OP_ABSOLUTE": "wartość bezwzględna", + "MATH_SINGLE_TOOLTIP_ABS": "Zwróć wartość bezwzględną danej liczby.", + "MATH_SINGLE_TOOLTIP_NEG": "Zwróć negację danej liczby.", + "MATH_SINGLE_TOOLTIP_LN": "Zwróć logarytm naturalny danej liczby.", + "MATH_SINGLE_TOOLTIP_LOG10": "Zwraca logarytm dziesiętny danej liczby.", + "MATH_SINGLE_TOOLTIP_EXP": "Zwróć e do potęgi danej liczby.", + "MATH_SINGLE_TOOLTIP_POW10": "Zwróć 10 do potęgi danej liczby.", + "MATH_TRIG_HELPURL": "https://pl.wikipedia.org/wiki/Funkcje_trygonometryczne", + "MATH_TRIG_TOOLTIP_SIN": "Zwróć wartość sinusa o stopniu (nie w radianach).", + "MATH_TRIG_TOOLTIP_COS": "Zwróć wartość cosinusa o stopniu (nie w radianach).", + "MATH_TRIG_TOOLTIP_TAN": "Zwróć tangens o stopniu (nie w radianach).", + "MATH_TRIG_TOOLTIP_ASIN": "Zwróć arcus sinus danej liczby.", + "MATH_TRIG_TOOLTIP_ACOS": "Zwróć arcus cosinus danej liczby.", + "MATH_TRIG_TOOLTIP_ATAN": "Zwróć arcus tangens danej liczby.", + "MATH_CONSTANT_HELPURL": "https://pl.wikipedia.org/wiki/Stała_(matematyka)", + "MATH_CONSTANT_TOOLTIP": "Zwróć jedną wspólną stałą: π (3.141), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) lub ∞ (nieskończoność).", + "MATH_IS_EVEN": "jest parzysta", + "MATH_IS_ODD": "jest nieparzysta", + "MATH_IS_PRIME": "jest liczbą pierwszą", + "MATH_IS_WHOLE": "jest liczbą całkowitą", + "MATH_IS_POSITIVE": "jest dodatnia", + "MATH_IS_NEGATIVE": "jest ujemna", + "MATH_IS_DIVISIBLE_BY": "jest podzielna przez", + "MATH_IS_TOOLTIP": "Sprawdź, czy liczba jest parzysta, nieparzysta, pierwsza, całkowita, dodatnia, ujemna, lub czy jest podzielna przez podaną liczbę. Zwraca wartość \"prawda\" lub \"fałsz\".", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "zmień %1 o %2", + "MATH_CHANGE_TOOLTIP": "Dodaj liczbę do zmiennej '%1'.", + "MATH_ROUND_HELPURL": "https://pl.wikipedia.org/wiki/Zaokrąglanie", + "MATH_ROUND_TOOLTIP": "Zaokrąglij w górę lub w dół.", + "MATH_ROUND_OPERATOR_ROUND": "zaokrąglij", + "MATH_ROUND_OPERATOR_ROUNDUP": "zaokrąglij w górę", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "zaokrąglij w dół", + "MATH_ONLIST_HELPURL": "", + "MATH_ONLIST_OPERATOR_SUM": "suma elementów listy", + "MATH_ONLIST_TOOLTIP_SUM": "Zwróć sumę wszystkich liczb z listy.", + "MATH_ONLIST_OPERATOR_MIN": "minimalna wartość z listy", + "MATH_ONLIST_TOOLTIP_MIN": "Zwróć najmniejszą liczbę w liście.", + "MATH_ONLIST_OPERATOR_MAX": "maksymalna wartość z listy", + "MATH_ONLIST_TOOLTIP_MAX": "Zwróć największą liczbę w liście.", + "MATH_ONLIST_OPERATOR_AVERAGE": "średnia elementów listy", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Zwróć średnią (średnią arytmetyczną) wartości liczbowych z listy.", + "MATH_ONLIST_OPERATOR_MEDIAN": "mediana listy", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Zwróć medianę listy.", + "MATH_ONLIST_OPERATOR_MODE": "dominanty listy", + "MATH_ONLIST_TOOLTIP_MODE": "Zwróć listę najczęściej występujących elementów w liście.", + "MATH_ONLIST_OPERATOR_STD_DEV": "odchylenie standardowe listy", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Zwróć odchylenie standardowe listy.", + "MATH_ONLIST_OPERATOR_RANDOM": "losowy element z listy", + "MATH_ONLIST_TOOLTIP_RANDOM": "Zwróć losowy element z listy.", + "MATH_MODULO_HELPURL": "https://pl.wikipedia.org/wiki/Modulo", + "MATH_MODULO_TITLE": "reszta z dzielenia %1 przez %2", + "MATH_MODULO_TOOLTIP": "Zwróć resztę z dzielenia dwóch liczb przez siebie.", + "MATH_CONSTRAIN_TITLE": "ogranicz %1 z dołu %2 z góry %3", + "MATH_CONSTRAIN_TOOLTIP": "Ogranicz liczbę, aby była w określonych granicach (włącznie).", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "losowa liczba całkowita od %1 do %2", + "MATH_RANDOM_INT_TOOLTIP": "Zwróć losową liczbę całkowitą w ramach dwóch wyznaczonych granic, włącznie.", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "losowy ułamek", + "MATH_RANDOM_FLOAT_TOOLTIP": "Zwróć losowy ułamek między 0.0 (włącznie), a 1.0 (wyłącznie).", + "TEXT_TEXT_HELPURL": "https://pl.wikipedia.org/wiki/Tekstowy_typ_danych", + "TEXT_TEXT_TOOLTIP": "Litera, wyraz lub linia tekstu.", + "TEXT_JOIN_TITLE_CREATEWITH": "utwórz tekst z", + "TEXT_JOIN_TOOLTIP": "Tworzy fragment tekstu, łącząc ze sobą dowolną liczbę tekstów.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "połącz", + "TEXT_CREATE_JOIN_TOOLTIP": "Dodaj, usuń lub zmień kolejność sekcji, aby zmodyfikować blok tekstowy.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Dodaj element do tekstu.", + "TEXT_APPEND_TO": "do", + "TEXT_APPEND_APPENDTEXT": "dołącz tekst", + "TEXT_APPEND_TOOLTIP": "Dołącz tekst do zmiennej '%1'.", + "TEXT_LENGTH_TITLE": "długość %1", + "TEXT_LENGTH_TOOLTIP": "Zwraca liczbę liter (łącznie ze spacjami) w podanym tekście.", + "TEXT_ISEMPTY_TITLE": "%1 jest pusty", + "TEXT_ISEMPTY_TOOLTIP": "Zwraca prawda (true), jeśli podany tekst jest pusty.", + "TEXT_INDEXOF_TOOLTIP": "Zwraca indeks pierwszego/ostatniego wystąpienia pierwszego tekstu w drugim tekście. Zwraca wartość %1, jeśli tekst nie został znaleziony.", + "TEXT_INDEXOF_INPUT_INTEXT": "w tekście", + "TEXT_INDEXOF_OPERATOR_FIRST": "znajdź pierwsze wystąpienie tekstu", + "TEXT_INDEXOF_OPERATOR_LAST": "znajdź ostatnie wystąpienie tekstu", + "TEXT_INDEXOF_TAIL": "", + "TEXT_CHARAT_INPUT_INTEXT": "z tekstu", + "TEXT_CHARAT_FROM_START": "pobierz literę #", + "TEXT_CHARAT_FROM_END": "pobierz literę # od końca", + "TEXT_CHARAT_FIRST": "pobierz pierwszą literę", + "TEXT_CHARAT_LAST": "pobierz ostatnią literę", + "TEXT_CHARAT_RANDOM": "pobierz losową literę", + "TEXT_CHARAT_TAIL": "", + "TEXT_CHARAT_TOOLTIP": "Zwraca literę z określonej pozycji.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Zwraca określoną część tekstu.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "w tekście", + "TEXT_GET_SUBSTRING_START_FROM_START": "pobierz podciąg od # litery", + "TEXT_GET_SUBSTRING_START_FROM_END": "pobierz podciąg od # litery od końca", + "TEXT_GET_SUBSTRING_START_FIRST": "pobierz podciąg od pierwszej litery", + "TEXT_GET_SUBSTRING_END_FROM_START": "do # litery", + "TEXT_GET_SUBSTRING_END_FROM_END": "do # litery od końca", + "TEXT_GET_SUBSTRING_END_LAST": "do ostatniej litery", + "TEXT_GET_SUBSTRING_TAIL": "", + "TEXT_CHANGECASE_TOOLTIP": "Zwraca kopię tekstu z inną wielkością liter.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "zmień na WIELKIE LITERY", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "zmień na małe litery", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "zmień na od Wielkich Liter", + "TEXT_TRIM_TOOLTIP": "Zwraca kopię tekstu z usuniętymi spacjami z jednego lub z obu końców tekstu.", + "TEXT_TRIM_OPERATOR_BOTH": "usuń spacje po obu stronach", + "TEXT_TRIM_OPERATOR_LEFT": "usuń spacje z lewej strony", + "TEXT_TRIM_OPERATOR_RIGHT": "usuń spacje z prawej strony", + "TEXT_PRINT_TITLE": "wydrukuj %1", + "TEXT_PRINT_TOOLTIP": "Drukuj określony tekst, liczbę lub inną wartość.", + "TEXT_PROMPT_TYPE_TEXT": "poproś o tekst z tą wiadomością", + "TEXT_PROMPT_TYPE_NUMBER": "poproś o liczbę z tą wiadomością", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Zapytaj użytkownika o liczbę.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Zapytaj użytkownika o jakiś tekst.", + "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", + "LISTS_CREATE_EMPTY_TITLE": "utwórz pustą listę", + "LISTS_CREATE_EMPTY_TOOLTIP": "Zwraca listę, o długości 0, nie zawierającą rekordów z danymi", + "LISTS_CREATE_WITH_TOOLTIP": "Utwórz listę z dowolną ilością elementów.", + "LISTS_CREATE_WITH_INPUT_WITH": "Tworzenie listy z", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Dodaj, usuń lub zmień kolejność sekcji żeby skonfigurować ten blok listy.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Dodaj element do listy.", + "LISTS_REPEAT_TOOLTIP": "Tworzy listę składającą się z podanej wartości powtórzonej odpowiednią liczbę razy.", + "LISTS_REPEAT_TITLE": "stwórz listę, powtarzając element %1 %2 razy", + "LISTS_LENGTH_TITLE": "długość %1", + "LISTS_LENGTH_TOOLTIP": "Zwraca długość listy.", + "LISTS_ISEMPTY_TITLE": "%1 jest pusty", + "LISTS_ISEMPTY_TOOLTIP": "Zwraca \"prawda\" jeśli lista jest pusta.", + "LISTS_INLIST": "na liście", + "LISTS_INDEX_OF_FIRST": "znaleźć pierwsze wystąpienie elementu", + "LISTS_INDEX_OF_LAST": "znajduje ostatanie wystąpienie elementu", + "LISTS_INDEX_OF_TOOLTIP": "Zwraca indeks pierwszego/ostatniego wystąpienia elementu na liście. Zwraca wartość %1, jeśli tekst nie zostanie znaleziony.", + "LISTS_GET_INDEX_GET": "pobierz", + "LISTS_GET_INDEX_GET_REMOVE": "Pobierz i usuń", + "LISTS_GET_INDEX_REMOVE": "usuń", + "LISTS_GET_INDEX_FROM_START": "#", + "LISTS_GET_INDEX_FROM_END": "# od końca", + "LISTS_GET_INDEX_FIRST": "pierwszy", + "LISTS_GET_INDEX_LAST": "ostatni", + "LISTS_GET_INDEX_RANDOM": "losowy", + "LISTS_GET_INDEX_TAIL": "", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 to pierwszy element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 to ostatni element.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Zwraca element z konkretnej pozycji na liście.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Zwraca pierwszy element z listy.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Zwraca ostatni element z listy.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Zwraca losowy element z listy.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Usuwa i zwraca element z określonej pozycji na liście.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Usuwa i zwraca pierwszy element z listy.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Usuwa i zwraca ostatni element z listy.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Usuwa i zwraca losowy element z listy.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Usuwa element z określonej pozycji na liście.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Usuwa pierwszy element z listy.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Usuwa ostatni element z listy.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Usuwa losowy element z listy.", + "LISTS_SET_INDEX_SET": "ustaw", + "LISTS_SET_INDEX_INSERT": "wstaw w", + "LISTS_SET_INDEX_INPUT_TO": "jako", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Ustawia element w określonym miejscu na liście.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Ustawia pierwszy element na liście.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Ustawia ostatni element na liście.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Ustawia losowy element na liście.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Wstawia element w odpowiednim miejscu na liście.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Wstawia element na początku listy.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Dodaj element na koniec listy.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Wstawia element w losowym miejscu na liście.", + "LISTS_GET_SUBLIST_START_FROM_START": "Pobierz listę podrzędną z #", + "LISTS_GET_SUBLIST_START_FROM_END": "Pobierz listę podrzędną z # od końca", + "LISTS_GET_SUBLIST_START_FIRST": "Pobierz listę podrzędną z pierwszego", + "LISTS_GET_SUBLIST_END_FROM_START": "do #", + "LISTS_GET_SUBLIST_END_FROM_END": "do # od końca", + "LISTS_GET_SUBLIST_END_LAST": "do ostatniego", + "LISTS_GET_SUBLIST_TAIL": "", + "LISTS_GET_SUBLIST_TOOLTIP": "Tworzy kopię z określoną część listy.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sortuj %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Sortuj kopię listy.", + "LISTS_SORT_ORDER_ASCENDING": "rosnąco", + "LISTS_SORT_ORDER_DESCENDING": "malejąco", + "LISTS_SORT_TYPE_NUMERIC": "numerycznie", + "LISTS_SORT_TYPE_TEXT": "alfabetycznie", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetycznie, bez uwzględniania wielkości liter", + "LISTS_SPLIT_LIST_FROM_TEXT": "stwórz listę z tekstu", + "LISTS_SPLIT_TEXT_FROM_LIST": "stwórz tekst z listy", + "LISTS_SPLIT_WITH_DELIMITER": "z separatorem", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Rozdziela tekst na listę mniejszych tekstów, dzieląc na każdym separatorze.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Łączy listę tekstów w jeden tekst, rozdzielany separatorem.", + "ORDINAL_NUMBER_SUFFIX": "", + "VARIABLES_GET_TOOLTIP": "Zwraca wartość tej zmiennej.", + "VARIABLES_GET_CREATE_SET": "Utwórz blok 'ustaw %1'", + "VARIABLES_SET": "przypisz %1 wartość %2", + "VARIABLES_SET_TOOLTIP": "Nadaj tej zmiennej wartość.", + "VARIABLES_SET_CREATE_GET": "Utwórz blok 'pobierz %1'", + "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFNORETURN_TITLE": "do", + "PROCEDURES_DEFNORETURN_PROCEDURE": "zrób coś", + "PROCEDURES_BEFORE_PARAMS": "z:", + "PROCEDURES_CALL_BEFORE_PARAMS": "z:", + "PROCEDURES_DEFNORETURN_DO": "", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Tworzy funkcję bez wyniku.", + "PROCEDURES_DEFNORETURN_COMMENT": "Opisz tę funkcję...", + "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFRETURN_RETURN": "zwróć", + "PROCEDURES_DEFRETURN_TOOLTIP": "Tworzy funkcję z wynikiem.", + "PROCEDURES_ALLOW_STATEMENTS": "zezwól na instrukcje", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Uwaga: Ta funkcja ma powtórzone parametry.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://pl.wikipedia.org/wiki/Podprogram", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Uruchom funkcję zdefiniowaną przez użytkownika '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://pl.wikipedia.org/wiki/Podprogram", + "PROCEDURES_CALLRETURN_TOOLTIP": "Uruchom funkcję zdefiniowaną przez użytkownika '%1' i skorzystaj z jej wyniku.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "wejścia", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Dodaj, usuń lub zmień kolejność danych wejściowych dla tej funkcji.", + "PROCEDURES_MUTATORARG_TITLE": "nazwa wejścia:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Dodaj dane wejściowe do funkcji.", + "PROCEDURES_HIGHLIGHT_DEF": "Podświetl definicję funkcji", + "PROCEDURES_CREATE_DO": "Stwórz '%1'", + "PROCEDURES_IFRETURN_TOOLTIP": "Jeśli wartość jest prawdziwa, zwróć drugą wartość.", + "PROCEDURES_IFRETURN_WARNING": "Uwaga: Ten blok może być używany tylko w definicji funkcji." +} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/pms.json b/src/opsoro/server/static/js/blockly/msg/json/pms.json similarity index 87% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/pms.json rename to src/opsoro/server/static/js/blockly/msg/json/pms.json index 892ded0..771b141 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/pms.json +++ b/src/opsoro/server/static/js/blockly/msg/json/pms.json @@ -13,6 +13,8 @@ "INLINE_INPUTS": "Imission an linia", "DELETE_BLOCK": "Scancelé ël blòch", "DELETE_X_BLOCKS": "Scancelé %1 blòch", + "DELETE_ALL_BLOCKS": "Scancelé tuti ij %1 blòch?", + "CLEAN_UP": "Dëscancelé ij blòch", "COLLAPSE_BLOCK": "Arduve ël blòch", "COLLAPSE_ALL": "Arduve ij blòch", "EXPAND_BLOCK": "Dësvlupé ël blòch", @@ -20,14 +22,16 @@ "DISABLE_BLOCK": "Disativé ël blòch", "ENABLE_BLOCK": "Ativé ël blòch", "HELP": "Agiut", - "CHAT": "Ch'a ciaciara con sò colaborator an scrivend an costa casela!", - "AUTH": "Për piasì, ch'a autorisa costa aplicassion a përmëtte ëd salvé sò travaj e a autoriselo a esse partagià da chiel.", - "ME": "Mi", + "UNDO": "Anulé", + "REDO": "Fé torna", "CHANGE_VALUE_TITLE": "Modifiché ël valor:", - "NEW_VARIABLE": "Neuva variàbil...", - "NEW_VARIABLE_TITLE": "Nòm ëd la neuva variàbil:", "RENAME_VARIABLE": "Arnomé la variàbil...", "RENAME_VARIABLE_TITLE": "Arnomé tute le variàbij '%1' 'me:", + "NEW_VARIABLE": "Creé na variàbil...", + "NEW_VARIABLE_TITLE": "Nòm ëd la neuva variàbil:", + "VARIABLE_ALREADY_EXISTS": "Na variàbil con ël nòm '%1' a esist già.", + "DELETE_VARIABLE_CONFIRMATION": "Eliminé %1 utilisassion ëd la variàbil '%2'?", + "DELETE_VARIABLE": "Eliminé la variàbil '%1'", "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Serne un color ant la taulòssa.", "COLOUR_RANDOM_TITLE": "color a asar", @@ -175,7 +179,7 @@ "TEXT_LENGTH_TOOLTIP": "A smon ël nùmer ëd litre (spassi comprèis) ant ël test fornì.", "TEXT_ISEMPTY_TITLE": "%1 a l'é veuid", "TEXT_ISEMPTY_TOOLTIP": "A smon ver se ël test fornì a l'é veuid.", - "TEXT_INDEXOF_TOOLTIP": "A smon l'ìndes dla prima/ùltima ocorensa dël prim test ant ël second test. A smon 0 se ël test a l'é nen trovà.", + "TEXT_INDEXOF_TOOLTIP": "A smon l'ìndes dla prima/ùltima ocorensa dël prim test ant ël second test. A smon %1 se ël test a l'é nen trovà.", "TEXT_INDEXOF_INPUT_INTEXT": "ant ël test", "TEXT_INDEXOF_OPERATOR_FIRST": "trové la prima ocorensa dël test", "TEXT_INDEXOF_OPERATOR_LAST": "trové l'ùltima ocorensa dël test", @@ -208,6 +212,15 @@ "TEXT_PROMPT_TYPE_NUMBER": "anvit për un nùmer con un mëssagi", "TEXT_PROMPT_TOOLTIP_NUMBER": "Ciamé un nùmer a l'utent.", "TEXT_PROMPT_TOOLTIP_TEXT": "Ciamé un test a l'utent.", + "TEXT_COUNT_MESSAGE0": "nùmer %1 su %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Conté vàire vire un test dàit a compariss an n'àutr test.", + "TEXT_REPLACE_MESSAGE0": "rampiassé %1 con %2 an %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Rampiassé tute j'ocorense d'un test con n'àutr.", + "TEXT_REVERSE_MESSAGE0": "Anversé %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Anversé l'òrdin dij caràter ant ël test.", "LISTS_CREATE_EMPTY_TITLE": "creé na lista veuida", "LISTS_CREATE_EMPTY_TOOLTIP": "Smon-e na lista, ëd longheur 0, ch'a conten gnun-a argistrassion", "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", @@ -225,7 +238,7 @@ "LISTS_INLIST": "ant la lista", "LISTS_INDEX_OF_FIRST": "trové la prima ocorensa dl'element", "LISTS_INDEX_OF_LAST": "trové l'ùltima ocorensa dl'element", - "LISTS_INDEX_OF_TOOLTIP": "A smon l'ìndes ëd la prima/ùltima ocorensa dl'element ant la lista. A smon 0 se ël test a l'é nen trovà.", + "LISTS_INDEX_OF_TOOLTIP": "A smon l'ìndes ëd la prima/ùltima ocorensa dl'element ant la lista. A smon %1 se l'element a l'é nen trovà.", "LISTS_GET_INDEX_GET": "oten-e", "LISTS_GET_INDEX_GET_REMOVE": "oten-e e eliminé", "LISTS_GET_INDEX_REMOVE": "eliminé", @@ -233,31 +246,28 @@ "LISTS_GET_INDEX_FIRST": "prim", "LISTS_GET_INDEX_LAST": "ùltim", "LISTS_GET_INDEX_RANDOM": "a l'ancàpit", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "A smon l'element a la posission ëspessificà an na lista. #1 a l'é ël prim element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "A smon l'element a la posission ëspessificà an na lista. #1 a l'é l'ùltim element.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 a l'é ël prim element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 a l'é l'ùltim element.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "A smon l'element a la posission ëspessificà an na lista.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "A smon ël prim element an na lista.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "A smon l'ùltim element an na lista.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "A smon n'element a l'ancàpit an na lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "A gava e a smon l'element a la posission ëspessificà an na lista. #1 a l'é 'l prim element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "A gava e a smon l'element a la posission ëspessificà an na lista. #1 a l'é l'ùltim element.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "A gava e a smon l'element a la posission ëspessificà an na lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "A gava e a smon ël prim element an na lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "A gava e a smon l'ùltim element an na lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "A gava e a smon n'element a l'ancàpit an na lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "A gava l'element a la posission ëspessificà an na lista. #1 a l'é ël prim element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "A gava l'element a la posission ëspessificà an na lista. #1 a l'é l'ùltim element.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "A gava l'element a la posission ëspessificà an na lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "A gava ël prim element an na lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "A gava l'ùltim element an na lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "A gava n'element a l'ancàpit da na lista.", "LISTS_SET_INDEX_SET": "buté", "LISTS_SET_INDEX_INSERT": "anserì an", "LISTS_SET_INDEX_INPUT_TO": "tanme", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "A fissa l'element a la posission ëspessificà an na lista. #1 a l'é ël prim element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "A fissa l'element a la posission ëspessificà an na lista. #1 a l'é l'ùltim element.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "A fissa l'element a la posission ëspessificà an na lista.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "A fissa ël prim element an na lista.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "A fissa l'ùltim element an na lista.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "A fissa n'element a l'ancàpit an na lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "A anseriss l'element a la posission ëspessificà an na lista. #1 a l'é ël prim element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "A anseriss l'element a la posission ëspessificà an na lista. #1 a l'é l'ùltim element.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "A anseriss l'element a la posission ëspessificà an na lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "A anseriss l'element al prinsipi ëd na lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Gionté l'element a la fin ëd na lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "A anseriss l'element a l'ancàpit an na lista.", @@ -268,12 +278,23 @@ "LISTS_GET_SUBLIST_END_FROM_END": "fin-a a # da la fin", "LISTS_GET_SUBLIST_END_LAST": "fin-a a l'ùltim", "LISTS_GET_SUBLIST_TOOLTIP": "A crea na còpia dël tòch ëspessificà ëd na lista.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "ordiné %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Ordiné na còpia ëd na lista.", + "LISTS_SORT_ORDER_ASCENDING": "chërsent", + "LISTS_SORT_ORDER_DESCENDING": "calant", + "LISTS_SORT_TYPE_NUMERIC": "numérich", + "LISTS_SORT_TYPE_TEXT": "alfabétich", + "LISTS_SORT_TYPE_IGNORECASE": "alfabétich, ignorand ël caràter minùscol o majùscol", "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "fé na lista da 'n test", "LISTS_SPLIT_TEXT_FROM_LIST": "fé 'n test da na lista", "LISTS_SPLIT_WITH_DELIMITER": "con ël separator", "LISTS_SPLIT_TOOLTIP_SPLIT": "Divide un test an na lista ëd test, tajand a minca 'n separator.", "LISTS_SPLIT_TOOLTIP_JOIN": "Gionze na lista ëd test ant un test sol, separandje con un separator.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "anversé %1", + "LISTS_REVERSE_TOOLTIP": "Anversé na còpia ëd na lista", "VARIABLES_GET_TOOLTIP": "A smon ël valor ëd sa variàbil.", "VARIABLES_GET_CREATE_SET": "Creé 'fissé %1'", "VARIABLES_SET": "fissé %1 a %2", @@ -284,13 +305,14 @@ "PROCEDURES_BEFORE_PARAMS": "con:", "PROCEDURES_CALL_BEFORE_PARAMS": "con:", "PROCEDURES_DEFNORETURN_TOOLTIP": "A crea na fonsion sensa surtìa.", + "PROCEDURES_DEFNORETURN_COMMENT": "Descrive sa fonsion...", "PROCEDURES_DEFRETURN_RETURN": "artorn", "PROCEDURES_DEFRETURN_TOOLTIP": "A crea na fonsion con na surtìa.", "PROCEDURES_ALLOW_STATEMENTS": "përmëtte le diciairassion", "PROCEDURES_DEF_DUPLICATE_WARNING": "Atension: Costa fonsion a l'ha dij paràmeter duplicà.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Eseguì la fonsion '%1' definìa da l'utent.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Eseguì la fonsion '%1' definìa da l'utent e dovré sò arzultà.", "PROCEDURES_MUTATORCONTAINER_TITLE": "imission", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Gionté, gavé o riordiné j'imission ëd sa fonsion.", @@ -299,5 +321,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Sot-ligné la definission dla fonsion", "PROCEDURES_CREATE_DO": "Creé '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Se un valor a l'é ver, antlora smon-e un second valor.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Atension: Ës blòch a podria esse dovrà mach an na definission ëd fonsion." } diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/pt-br.json b/src/opsoro/server/static/js/blockly/msg/json/pt-br.json similarity index 88% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/pt-br.json rename to src/opsoro/server/static/js/blockly/msg/json/pt-br.json index b589edd..a400ef6 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/pt-br.json +++ b/src/opsoro/server/static/js/blockly/msg/json/pt-br.json @@ -11,7 +11,12 @@ "Rodrigo codignoli", "Webysther", "Fasouzafreitas", - "Almondega" + "Almondega", + "Rogerio Melfi", + "Caçador de Palavras", + "Luk3", + "Cristofer Alves", + "EVinente" ] }, "VARIABLES_DEFAULT_NAME": "item", @@ -21,23 +26,27 @@ "REMOVE_COMMENT": "Remover comentário", "EXTERNAL_INPUTS": "Entradas externas", "INLINE_INPUTS": "Entradas incorporadas", - "DELETE_BLOCK": "Remover bloco", - "DELETE_X_BLOCKS": "Remover %1 blocos", - "COLLAPSE_BLOCK": "Recolher bloco", - "COLLAPSE_ALL": "Recolher blocos", + "DELETE_BLOCK": "Deletar bloco", + "DELETE_X_BLOCKS": "Deletar %1 blocos", + "DELETE_ALL_BLOCKS": "Deletar todos os blocos %1?", + "CLEAN_UP": "Limpar blocos", + "COLLAPSE_BLOCK": "Colapsar Bloco", + "COLLAPSE_ALL": "Colapsar Bloco", "EXPAND_BLOCK": "Expandir bloco", "EXPAND_ALL": "Expandir blocos", "DISABLE_BLOCK": "Desabilitar bloco", "ENABLE_BLOCK": "Habilitar bloco", "HELP": "Ajuda", - "CHAT": "Converse com o seu colaborador digitando nesta caixa!", - "AUTH": "Por favor autorize este aplicativo para permitir que o seu trabalho seja gravado e que ele seja compartilhado por você.", - "ME": "Eu", + "UNDO": "Desfazer", + "REDO": "Refazer", "CHANGE_VALUE_TITLE": "Mudar valor:", - "NEW_VARIABLE": "Nova variável...", - "NEW_VARIABLE_TITLE": "Nome da nova variável:", "RENAME_VARIABLE": "Renomear variável...", "RENAME_VARIABLE_TITLE": "Renomear todas as variáveis '%1' para:", + "NEW_VARIABLE": "Criar variável...", + "NEW_VARIABLE_TITLE": "Nome da nova variável:", + "VARIABLE_ALREADY_EXISTS": "A variável chamada '%1' já existe.", + "DELETE_VARIABLE_CONFIRMATION": "Deletar %1 usos da variável '%2'?", + "DELETE_VARIABLE": "Deletar a variável '%1'", "COLOUR_PICKER_HELPURL": "https://pt.wikipedia.org/wiki/Cor", "COLOUR_PICKER_TOOLTIP": "Escolher uma cor da palheta de cores.", "COLOUR_RANDOM_TITLE": "cor aleatória", @@ -46,7 +55,7 @@ "COLOUR_RGB_RED": "vermelho", "COLOUR_RGB_GREEN": "verde", "COLOUR_RGB_BLUE": "azul", - "COLOUR_RGB_TOOLTIP": "Cria uma cor de acordo com a quantidade especificada de vermelho, verde e azul. Todos os valores devem estar entre 0 e 100.", + "COLOUR_RGB_TOOLTIP": "Criar uma cor com a quantidade especificada de vermelho, verde e azul. Todos os valores devem estar entre 0 e 100.", "COLOUR_BLEND_TITLE": "misturar", "COLOUR_BLEND_COLOUR1": "cor 1", "COLOUR_BLEND_COLOUR2": "cor 2", @@ -63,7 +72,7 @@ "CONTROLS_FOR_TOOLTIP": "Faz com que a variável '%1' assuma os valores do número inicial ao número final, contando de acordo com o intervalo especificado e executa os blocos especificados.", "CONTROLS_FOR_TITLE": "contar com %1 de %2 até %3 por %4", "CONTROLS_FOREACH_TITLE": "para cada item %1 na lista %2", - "CONTROLS_FOREACH_TOOLTIP": "Para cada item em uma lista, atribui o item à variável '%1' e então realiza algumas instruções.", + "CONTROLS_FOREACH_TOOLTIP": "Para cada item em uma lista, atribuir o item à variável '%1' e então realiza algumas instruções.", "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "encerra o laço", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "continua com a próxima iteração do laço", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Encerra o laço.", @@ -185,7 +194,7 @@ "TEXT_LENGTH_TOOLTIP": "Retorna o número de letras (incluindo espaços) no texto fornecido.", "TEXT_ISEMPTY_TITLE": "%1 é vazio", "TEXT_ISEMPTY_TOOLTIP": "Retorna verdadeiro se o texto fornecido for vazio.", - "TEXT_INDEXOF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna 0 se o texto não for encontrado.", + "TEXT_INDEXOF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna %1 se o texto não for encontrado.", "TEXT_INDEXOF_INPUT_INTEXT": "no texto", "TEXT_INDEXOF_OPERATOR_FIRST": "encontre a primeira ocorrência do item", "TEXT_INDEXOF_OPERATOR_LAST": "encontre a última ocorrência do texto", @@ -218,6 +227,8 @@ "TEXT_PROMPT_TYPE_NUMBER": "Pede um número com uma mensagem", "TEXT_PROMPT_TOOLTIP_NUMBER": "Pede ao usuário um número.", "TEXT_PROMPT_TOOLTIP_TEXT": "Pede ao usuário um texto.", + "TEXT_COUNT_MESSAGE0": "Contar %1 em %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "LISTS_CREATE_EMPTY_TITLE": "criar lista vazia", "LISTS_CREATE_EMPTY_TOOLTIP": "Retorna uma lista, de tamanho 0, contendo nenhum registro", "LISTS_CREATE_WITH_TOOLTIP": "Cria uma lista com a quantidade de itens informada.", @@ -230,11 +241,11 @@ "LISTS_LENGTH_TITLE": "tamanho de %1", "LISTS_LENGTH_TOOLTIP": "Retorna o tamanho de uma lista.", "LISTS_ISEMPTY_TITLE": "%1 é vazia", - "LISTS_ISEMPTY_TOOLTIP": "Retona verdadeiro se a lista estiver vazia.", + "LISTS_ISEMPTY_TOOLTIP": "Retorna ao verdadeiro se a lista estiver vazia.", "LISTS_INLIST": "na lista", "LISTS_INDEX_OF_FIRST": "encontre a primeira ocorrência do item", "LISTS_INDEX_OF_LAST": "encontre a última ocorrência do item", - "LISTS_INDEX_OF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do item na lista. Retorna 0 se o texto não for encontrado.", + "LISTS_INDEX_OF_TOOLTIP": "Retorna o índice da primeira/última ocorrência do item na lista. Retorna %1 se o item não for encontrado.", "LISTS_GET_INDEX_GET": "obter", "LISTS_GET_INDEX_GET_REMOVE": "obter e remover", "LISTS_GET_INDEX_REMOVE": "remover", @@ -243,31 +254,28 @@ "LISTS_GET_INDEX_FIRST": "primeiro", "LISTS_GET_INDEX_LAST": "último", "LISTS_GET_INDEX_RANDOM": "aleatório", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Retorna o item da lista na posição especificada. #1 é o primeiro item.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Retorna o item da lista na posição especificada. #1 é o último item.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 é o primeiro item.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 é o último item.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Retorna o item da lista na posição especificada.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Retorna o primeiro item em uma lista.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Retorna o último item em uma lista.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Retorna um item aleatório de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Remove e retorna o item na posição especificada em uma lista. #1 é o primeiro item.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Remove e retorna o item na posição especificada em uma lista. #1 é o último item.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Remove e retorna o item na posição especificada em uma lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Remove e retorna o primeiro item de uma lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Remove e retorna o último item de uma lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Remove e retorna um item aleatório de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Remove o item na posição especificada em uma lista. #1 é o primeiro item.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Remove o item na posição especificada em uma lista. #1 é o último item.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Remove o item na posição especificada em uma lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Remove o primeiro item de uma lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Remove o último item de uma lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Remove um item aleatório de uma lista.", "LISTS_SET_INDEX_SET": "definir", "LISTS_SET_INDEX_INSERT": "inserir em", "LISTS_SET_INDEX_INPUT_TO": "como", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Define o item da posição especificada de uma lista. #1 é o primeiro item.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Define o item da posição especificada de uma lista. #1 é o último item.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Define o item da posição especificada de uma lista.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Define o primeiro item de uma lista.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Define o último item de uma lista.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Define um item aleatório de uma lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Insere o item na posição especificada em uma lista. #1 é o primeiro item.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Insere o item na posição especificada em uma lista. #1 é o último item.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Insere o item na posição especificada em uma lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Insere o item no início de uma lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Insere o item no final de uma lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Insere o item em uma posição qualquer de uma lista.", @@ -278,6 +286,14 @@ "LISTS_GET_SUBLIST_END_FROM_END": "até nº a partir do final", "LISTS_GET_SUBLIST_END_LAST": "até último", "LISTS_GET_SUBLIST_TOOLTIP": "Cria uma cópia da porção especificada de uma lista.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "ordenar %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Ordenar uma cópia de uma lista.", + "LISTS_SORT_ORDER_ASCENDING": "ascendente", + "LISTS_SORT_ORDER_DESCENDING": "descendente", + "LISTS_SORT_TYPE_NUMERIC": "numérico", + "LISTS_SORT_TYPE_TEXT": "alfabético", + "LISTS_SORT_TYPE_IGNORECASE": "alfabético, ignorar maiúscula/minúscula", "LISTS_SPLIT_LIST_FROM_TEXT": "Fazer uma lista a partir do texto", "LISTS_SPLIT_TEXT_FROM_LIST": "fazer um texto a partir da lista", "LISTS_SPLIT_WITH_DELIMITER": "com delimitador", @@ -293,6 +309,7 @@ "PROCEDURES_BEFORE_PARAMS": "com:", "PROCEDURES_CALL_BEFORE_PARAMS": "com:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Cria uma função que não tem retorno.", + "PROCEDURES_DEFNORETURN_COMMENT": "Descreva esta função...", "PROCEDURES_DEFRETURN_RETURN": "retorna", "PROCEDURES_DEFRETURN_TOOLTIP": "Cria uma função que possui um valor de retorno.", "PROCEDURES_ALLOW_STATEMENTS": "permitir declarações", @@ -308,5 +325,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Destacar definição da função", "PROCEDURES_CREATE_DO": "Criar \"%1\"", "PROCEDURES_IFRETURN_TOOLTIP": "Se um valor é verdadeiro, então retorna um valor.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Atenção: Este bloco só pode ser utilizado dentro da definição de uma função." } diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/pt.json b/src/opsoro/server/static/js/blockly/msg/json/pt.json similarity index 87% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/pt.json rename to src/opsoro/server/static/js/blockly/msg/json/pt.json index 47d4713..031ca87 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/pt.json +++ b/src/opsoro/server/static/js/blockly/msg/json/pt.json @@ -5,7 +5,11 @@ "Waldir", "Vitorvicentevalente", "아라", - "Nicola Nascimento" + "Nicola Nascimento", + "Önni", + "Diniscoelho", + "Fúlvio", + "Mansil" ] }, "VARIABLES_DEFAULT_NAME": "item", @@ -13,29 +17,33 @@ "DUPLICATE_BLOCK": "Duplicar", "ADD_COMMENT": "Adicionar Comentário", "REMOVE_COMMENT": "Remover Comentário", - "EXTERNAL_INPUTS": "Entradas externas", - "INLINE_INPUTS": "Entradas Internas", - "DELETE_BLOCK": "Remover Bloco", - "DELETE_X_BLOCKS": "Remover %1 Blocos", - "COLLAPSE_BLOCK": "Colapsar Bloco", - "COLLAPSE_ALL": "Recolher Blocos", + "EXTERNAL_INPUTS": "Entradas Externas", + "INLINE_INPUTS": "Entradas Em Linhas", + "DELETE_BLOCK": "Eliminar Bloco", + "DELETE_X_BLOCKS": "Eliminar %1 Blocos", + "DELETE_ALL_BLOCKS": "Eliminar todos os %1 blocos?", + "CLEAN_UP": "Limpar Blocos", + "COLLAPSE_BLOCK": "Ocultar Bloco", + "COLLAPSE_ALL": "Ocultar Blocos", "EXPAND_BLOCK": "Expandir Bloco", "EXPAND_ALL": "Expandir Blocos", - "DISABLE_BLOCK": "Desabilitar Bloco", - "ENABLE_BLOCK": "Habilitar Bloco", + "DISABLE_BLOCK": "Desativar Bloco", + "ENABLE_BLOCK": "Ativar Bloco", "HELP": "Ajuda", - "CHAT": "Converse com o seu colaborador, ao digitar nesta caixa!", - "AUTH": "Por favor autorize esta aplicação para permitir que o seu trabalho seja gravado e que o possa partilhar.", - "ME": "Eu", + "UNDO": "Anular", + "REDO": "Refazer", "CHANGE_VALUE_TITLE": "Alterar valor:", - "NEW_VARIABLE": "Nova variável...", - "NEW_VARIABLE_TITLE": "Nome da nova variável:", "RENAME_VARIABLE": "Renomear variável...", "RENAME_VARIABLE_TITLE": "Renomear todas as variáveis '%1' para:", + "NEW_VARIABLE": "Criar variável…", + "NEW_VARIABLE_TITLE": "Nome da nova variável:", + "VARIABLE_ALREADY_EXISTS": "Já existe uma variável com o nome de '%1'.", + "DELETE_VARIABLE_CONFIRMATION": "Eliminar %1 utilizações da variável '%2'?", + "DELETE_VARIABLE": "Eliminar a variável '%1'", "COLOUR_PICKER_HELPURL": "http://pt.wikipedia.org/wiki/Cor", - "COLOUR_PICKER_TOOLTIP": "Escolhe uma cor da paleta de cores.", + "COLOUR_PICKER_TOOLTIP": "Escolha uma cor da paleta de cores.", "COLOUR_RANDOM_TITLE": "cor aleatória", - "COLOUR_RANDOM_TOOLTIP": "Escolher cor de forma aleatória.", + "COLOUR_RANDOM_TOOLTIP": "Escolha uma cor aleatoriamente.", "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "pinte com", "COLOUR_RGB_RED": "vermelho", @@ -47,13 +55,13 @@ "COLOUR_BLEND_COLOUR1": "cor 1", "COLOUR_BLEND_COLOUR2": "cor 2", "COLOUR_BLEND_RATIO": "proporção", - "COLOUR_BLEND_TOOLTIP": "Mistura duas cores dada uma proporção (0.0 - 1.0).", + "COLOUR_BLEND_TOOLTIP": "Mistura duas cores com a proporção indicada (0.0 - 1.0).", "CONTROLS_REPEAT_HELPURL": "http://pt.wikipedia.org/wiki/Estrutura_de_repeti%C3%A7%C3%A3o#Repeti.C3.A7.C3.A3o_com_vari.C3.A1vel_de_controle", - "CONTROLS_REPEAT_TITLE": "repita %1 vez", + "CONTROLS_REPEAT_TITLE": "repetir %1 vez", "CONTROLS_REPEAT_INPUT_DO": "faça", "CONTROLS_REPEAT_TOOLTIP": "Faça algumas instruções várias vezes.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repita enquanto", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "repita até", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repetir enquanto", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "repetir até", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Enquanto um valor for verdadeiro, então faça algumas instruções.", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Enquanto um valor for falso, então faça algumas instruções.", "CONTROLS_FOR_TOOLTIP": "Faz com que a variável \"%1\" assuma os valores desde o número inicial até ao número final, contando de acordo com o intervalo especificado e executa os blocos especificados.", @@ -63,7 +71,7 @@ "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "sair do ciclo", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "continuar com a próxima iteração do ciclo", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Sair do ciclo que está contido.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Ignora o resto deste ciclo e continua na próxima iteração.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Ignorar o resto deste ciclo, e continuar com a próxima iteração.", "CONTROLS_FLOW_STATEMENTS_WARNING": "Atenção: Este bloco só pode ser usado dentro de um ciclo.", "CONTROLS_IF_TOOLTIP_1": "Se um valor é verdadeiro, então realize alguns passos.", "CONTROLS_IF_TOOLTIP_2": "Se um valor é verdadeiro, então realize o primeiro bloco de instruções. Senão, realize o segundo bloco de instruções", @@ -194,7 +202,7 @@ "TEXT_LENGTH_TOOLTIP": "Devolve o número de letras (incluindo espaços) do texto fornecido.", "TEXT_ISEMPTY_TITLE": "%1 está vazio", "TEXT_ISEMPTY_TOOLTIP": "Retorna verdadeiro se o texto fornecido estiver vazio.", - "TEXT_INDEXOF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna 0 se o texto não for encontrado.", + "TEXT_INDEXOF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna %1 se o texto não for encontrado.", "TEXT_INDEXOF_INPUT_INTEXT": "no texto", "TEXT_INDEXOF_OPERATOR_FIRST": "primeira ocorrência do texto", "TEXT_INDEXOF_OPERATOR_LAST": "última ocorrência do texto", @@ -244,7 +252,7 @@ "LISTS_INLIST": "na lista", "LISTS_INDEX_OF_FIRST": "encontre a primeira ocorrência do item", "LISTS_INDEX_OF_LAST": "encontre a última ocorrência do item", - "LISTS_INDEX_OF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do item na lista. Retorna 0 se o texto não for encontrado.", + "LISTS_INDEX_OF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do item na lista. Retorna %1 se o item não for encontrado.", "LISTS_GET_INDEX_GET": "obter", "LISTS_GET_INDEX_GET_REMOVE": "obter e remover", "LISTS_GET_INDEX_REMOVE": "remover", @@ -253,31 +261,28 @@ "LISTS_GET_INDEX_FIRST": "primeiro", "LISTS_GET_INDEX_LAST": "último", "LISTS_GET_INDEX_RANDOM": "aleatório", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Retorna o item na posição especificada da lista . #1 é o primeiro item.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Retorna o item da lista na posição especificada. #1 é o último item.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 é o primeiro item.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 é o último item.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Retorna o item na posição especificada da lista.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Retorna o primeiro item de uma lista.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Retorna o último item de uma lista.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Retorna um item aleatório de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Remove e retorna o item na posição especificada de uma lista. #1 é o primeiro item.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Remove e retorna o item na posição especificada de uma lista. #1 é o último item.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Remove e retorna o item na posição especificada de uma lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Remove e retorna o primeiro item de uma lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Remove e retorna o último item de uma lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Remove e retorna um item aleatório de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Remove o item de uma posição especifica da lista. #1 é o primeiro item.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Remove o item na posição especificada de uma lista. #1 é o ultimo item.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Remove o item de uma posição especifica da lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Remove o primeiro item de uma lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Remove o último item de uma lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Remove um item aleatório de uma lista.", "LISTS_SET_INDEX_SET": "definir", "LISTS_SET_INDEX_INSERT": "inserir em", "LISTS_SET_INDEX_INPUT_TO": "como", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Define o item na posição especificada de uma lista. #1 é o primeiro item.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Define o item na posição especificada de uma lista. #1 é o último item.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Define o item na posição especificada de uma lista.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Define o primeiro item de uma lista.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Define o último item de uma lista.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Define um item aleatório de uma lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Insere o item numa posição especificada numa lista. #1 é o primeiro item.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Insere o item numa posição especificada de uma lista. #1 é o último item.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Insere o item numa posição especificada numa lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Insere o item no início da lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Insere o item no final da lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Insere o item numa posição aleatória de uma lista.", @@ -288,6 +293,14 @@ "LISTS_GET_SUBLIST_END_FROM_END": "até #, a partir do final", "LISTS_GET_SUBLIST_END_LAST": "para o último", "LISTS_GET_SUBLIST_TOOLTIP": "Cria uma cópia da porção especificada de uma lista.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "ordenar %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Ordenar uma cópia de uma lista.", + "LISTS_SORT_ORDER_ASCENDING": "ascendente", + "LISTS_SORT_ORDER_DESCENDING": "descendente", + "LISTS_SORT_TYPE_NUMERIC": "numérica", + "LISTS_SORT_TYPE_TEXT": "alfabética", + "LISTS_SORT_TYPE_IGNORECASE": "alfabética, ignorar maiúsculas/minúsculas", "LISTS_SPLIT_LIST_FROM_TEXT": "fazer lista a partir de texto", "LISTS_SPLIT_TEXT_FROM_LIST": "fazer texto a partir da lista", "LISTS_SPLIT_WITH_DELIMITER": "com delimitador", @@ -304,14 +317,15 @@ "PROCEDURES_BEFORE_PARAMS": "com:", "PROCEDURES_CALL_BEFORE_PARAMS": "com:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Cria uma função que não tem retorno.", + "PROCEDURES_DEFNORETURN_COMMENT": "Descreva esta função...", "PROCEDURES_DEFRETURN_HELPURL": "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "retorna", "PROCEDURES_DEFRETURN_TOOLTIP": "Cria uma função que possui um valor de retorno.", "PROCEDURES_ALLOW_STATEMENTS": "permitir declarações", "PROCEDURES_DEF_DUPLICATE_WARNING": "Atenção: Esta função tem parâmetros duplicados.", - "PROCEDURES_CALLNORETURN_HELPURL": "http://pt.wikipedia.org/wiki/Sub-rotina", + "PROCEDURES_CALLNORETURN_HELPURL": "https://pt.wikipedia.org/wiki/Sub-rotina", "PROCEDURES_CALLNORETURN_TOOLTIP": "Executa a função \"%1\".", - "PROCEDURES_CALLRETURN_HELPURL": "http://pt.wikipedia.org/wiki/Sub-rotina", + "PROCEDURES_CALLRETURN_HELPURL": "https://pt.wikipedia.org/wiki/Sub-rotina", "PROCEDURES_CALLRETURN_TOOLTIP": "Executa a função \"%1\" e usa o seu retorno.", "PROCEDURES_MUTATORCONTAINER_TITLE": "entradas", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Adicionar, remover ou reordenar as entradas para esta função.", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/qqq.json b/src/opsoro/server/static/js/blockly/msg/json/qqq.json similarity index 91% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/qqq.json rename to src/opsoro/server/static/js/blockly/msg/json/qqq.json index efb73e0..1a9fc4e 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/qqq.json +++ b/src/opsoro/server/static/js/blockly/msg/json/qqq.json @@ -1,6 +1,13 @@ { + "@metadata": { + "authors": [ + "Espertus", + "Liuxinyu970226", + "Shirayuki" + ] + }, "VARIABLES_DEFAULT_NAME": "default name - A simple, general default name for a variable, preferably short. For more context, see [[Translating:Blockly#infrequent_message_types]].\n{{Identical|Item}}", - "TODAY": "button text - Botton that sets a calendar to today's date.\n{{Identical|Today}}", + "TODAY": "button text - Button that sets a calendar to today's date.\n{{Identical|Today}}", "DUPLICATE_BLOCK": "context menu - Make a copy of the selected block (and any blocks it contains).\n{{Identical|Duplicate}}", "ADD_COMMENT": "context menu - Add a descriptive comment to the selected block.", "REMOVE_COMMENT": "context menu - Remove the descriptive comment from the selected block.", @@ -8,6 +15,7 @@ "INLINE_INPUTS": "context menu - Change from 'internal' to 'external' mode for displaying blocks used as inputs to the selected block. See [[Translating:Blockly#context_menus]].", "DELETE_BLOCK": "context menu - Permanently delete the selected block.", "DELETE_X_BLOCKS": "context menu - Permanently delete the %1 selected blocks.\n\nParameters:\n* %1 - an integer greater than 1.", + "DELETE_ALL_BLOCKS": "confirmation prompt - Question the user if they really wanted to permanently delete all %1 blocks.\n\nParameters:\n* %1 - an integer greater than 1.", "CLEAN_UP": "context menu - Reposition all the blocks so that they form a neat line.", "COLLAPSE_BLOCK": "context menu - Make the appearance of the selected block smaller by hiding some information about it.", "COLLAPSE_ALL": "context menu - Make the appearance of all blocks smaller by hiding some information about it. Use the same terminology as in the previous message.", @@ -16,14 +24,16 @@ "DISABLE_BLOCK": "context menu - Make the selected block have no effect (unless reenabled).", "ENABLE_BLOCK": "context menu - Make the selected block have effect (after having been disabled earlier).", "HELP": "context menu - Provide helpful information about the selected block.\n{{Identical|Help}}", - "CHAT": "collaboration instruction - Tell the user that they can talk with other users.", - "AUTH": "authorization instruction - Ask the user to authorize this app so it can be saved and shared by them.", - "ME": "First person singular - objective case", + "UNDO": "context menu - Undo the previous action.\n{{Identical|Undo}}", + "REDO": "context menu - Undo the previous undo action.\n{{Identical|Redo}}", "CHANGE_VALUE_TITLE": "prompt - This message is only seen in the Opera browser. With most browsers, users can edit numeric values in blocks by just clicking and typing. Opera does not allows this, so we have to open a new window and prompt users with this message to chanage a value.", - "NEW_VARIABLE": "dropdown choice - When the user clicks on a variable block, this is one of the dropdown menu choices. It is used to define a new variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu].", - "NEW_VARIABLE_TITLE": "prompt - Prompts the user to enter the name for a new variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu].", "RENAME_VARIABLE": "dropdown choice - When the user clicks on a variable block, this is one of the dropdown menu choices. It is used to rename the current variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu].", "RENAME_VARIABLE_TITLE": "prompt - Prompts the user to enter the new name for the selected variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu].\n\nParameters:\n* %1 - the name of the variable to be renamed.", + "NEW_VARIABLE": "button text - Text on the button used to launch the variable creation dialogue.", + "NEW_VARIABLE_TITLE": "prompt - Prompts the user to enter the name for a new variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu].", + "VARIABLE_ALREADY_EXISTS": "alert - Tells the user that the name they entered is already in use.", + "DELETE_VARIABLE_CONFIRMATION": "confirm - Ask the user to confirm their deletion of multiple uses of a variable.", + "DELETE_VARIABLE": "alert - Tell the user that they can't delete a variable because it's part of the definition of a procedure. dropdown choice - Delete the currently selected variable.", "COLOUR_PICKER_HELPURL": "url - Information about colour.", "COLOUR_PICKER_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Colour#picking-a-colour-from-a-palette https://github.com/google/blockly/wiki/Colour#picking-a-colour-from-a-palette].", "COLOUR_RANDOM_HELPURL": "url - A link that displays a random colour each time you visit it.", @@ -67,7 +77,7 @@ "CONTROLS_IF_TOOLTIP_2": "tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-else-blocks if-else blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present.", "CONTROLS_IF_TOOLTIP_3": "tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-else-if-blocks if-else-if blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present.", "CONTROLS_IF_TOOLTIP_4": "tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-else-if-else-blocks if-else-if-else blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present.", - "CONTROLS_IF_MSG_IF": "block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. It is recommended, but not essential, that this have text in common with the translation of 'else if'", + "CONTROLS_IF_MSG_IF": "block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. It is recommended, but not essential, that this have text in common with the translation of 'else if'\n{{Identical|If}}", "CONTROLS_IF_MSG_ELSEIF": "block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. The English words 'otherwise if' would probably be clearer than 'else if', but the latter is used because it is traditional and shorter.", "CONTROLS_IF_MSG_ELSE": "block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. The English word 'otherwise' would probably be superior to 'else', but the latter is used because it is traditional and shorter.", "CONTROLS_IF_IF_TOOLTIP": "tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#block-modification if block modification].", @@ -82,18 +92,18 @@ "LOGIC_COMPARE_TOOLTIP_GTE": "tooltip - Describes the greater than or equals (≥) block.", "LOGIC_OPERATION_HELPURL": "url - Information about the Boolean conjunction ('and') and disjunction ('or') operators. Consider using the translation of [https://en.wikipedia.org/wiki/Boolean_logic https://en.wikipedia.org/wiki/Boolean_logic], if it exists in your language.", "LOGIC_OPERATION_TOOLTIP_AND": "tooltip - See [https://en.wikipedia.org/wiki/Logical_conjunction https://en.wikipedia.org/wiki/Logical_conjunction].", - "LOGIC_OPERATION_AND": "block text - See [https://en.wikipedia.org/wiki/Logical_conjunction https://en.wikipedia.org/wiki/Logical_conjunction].", + "LOGIC_OPERATION_AND": "block text - See [https://en.wikipedia.org/wiki/Logical_conjunction https://en.wikipedia.org/wiki/Logical_conjunction].\n{{Identical|And}}", "LOGIC_OPERATION_TOOLTIP_OR": "block text - See [https://en.wikipedia.org/wiki/Disjunction https://en.wikipedia.org/wiki/Disjunction].", - "LOGIC_OPERATION_OR": "block text - See [https://en.wikipedia.org/wiki/Disjunction https://en.wikipedia.org/wiki/Disjunction].", + "LOGIC_OPERATION_OR": "block text - See [https://en.wikipedia.org/wiki/Disjunction https://en.wikipedia.org/wiki/Disjunction].\n{{Identical|Or}}", "LOGIC_NEGATE_HELPURL": "url - Information about logical negation. The translation of [https://en.wikipedia.org/wiki/Logical_negation https://en.wikipedia.org/wiki/Logical_negation] is recommended if it exists in the target language.", "LOGIC_NEGATE_TITLE": "block text - This is a unary operator that returns ''false'' when the input is ''true'', and ''true'' when the input is ''false''. \n\nParameters:\n* %1 - the input (which should be either the value 'true' or 'false')", "LOGIC_NEGATE_TOOLTIP": "tooltip - See [https://en.wikipedia.org/wiki/Logical_negation https://en.wikipedia.org/wiki/Logical_negation].", "LOGIC_BOOLEAN_HELPURL": "url - Information about the logic values ''true'' and ''false''. Consider using the translation of [https://en.wikipedia.org/wiki/Truth_value https://en.wikipedia.org/wiki/Truth_value] if it exists in your language.", - "LOGIC_BOOLEAN_TRUE": "block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''true''.", - "LOGIC_BOOLEAN_FALSE": "block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''false''.", + "LOGIC_BOOLEAN_TRUE": "block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''true''.\n{{Identical|True}}", + "LOGIC_BOOLEAN_FALSE": "block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''false''.\n{{Identical|False}}", "LOGIC_BOOLEAN_TOOLTIP": "tooltip - Indicates that the block returns either of the two possible [https://en.wikipedia.org/wiki/Truth_value logical values].", "LOGIC_NULL_HELPURL": "url - Provide a link to the translation of [https://en.wikipedia.org/wiki/Nullable_type https://en.wikipedia.org/wiki/Nullable_type], if it exists in your language; otherwise, do not worry about translating this advanced concept.", - "LOGIC_NULL": "block text - In computer languages, ''null'' is a special value that indicates that no value has been set. You may use your language's word for 'nothing' or 'invalid'.", + "LOGIC_NULL": "block text - In computer languages, ''null'' is a special value that indicates that no value has been set. You may use your language's word for 'nothing' or 'invalid'.\n{{Identical|Null}}", "LOGIC_NULL_TOOLTIP": "tooltip - This should use the word from the previous message.", "LOGIC_TERNARY_HELPURL": "url - Describes the programming language operator known as the ''ternary'' or ''conditional'' operator. It is recommended that you use the translation of [https://en.wikipedia.org/wiki/%3F: https://en.wikipedia.org/wiki/%3F:] if it exists.", "LOGIC_TERNARY_CONDITION": "block input text - Label for the input whose value determines which of the other two inputs is returned. In some programming languages, this is called a ''''predicate''''.", @@ -127,7 +137,7 @@ "MATH_SINGLE_TOOLTIP_NEG": "tooltip - Calculates '''0-n''', where '''n''' is the single numeric input.", "MATH_SINGLE_TOOLTIP_LN": "tooltip - Calculates the [https://en.wikipedia.org/wiki/Natural_logarithm|natural logarithm] of its single numeric input.", "MATH_SINGLE_TOOLTIP_LOG10": "tooltip - Calculates the [https://en.wikipedia.org/wiki/Common_logarithm common logarithm] of its single numeric input.", - "MATH_SINGLE_TOOLTIP_EXP": "tooltip - Multiplies [https://en.wikipedia.org/wiki/E_%28mathematical_constant%29 e] by itself n times, where n is the single numeric input.", + "MATH_SINGLE_TOOLTIP_EXP": "tooltip - Multiplies [https://en.wikipedia.org/wiki/E_(mathematical_constant) e] by itself n times, where n is the single numeric input.", "MATH_SINGLE_TOOLTIP_POW10": "tooltip - Multiplies 10 by itself n times, where n is the single numeric input.", "MATH_TRIG_HELPURL": "url - Information about the trigonometric functions sine, cosine, tangent, and their inverses (ideally using degrees, not radians).", "MATH_TRIG_TOOLTIP_SIN": "tooltip - Return the [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent sine] of an [https://en.wikipedia.org/wiki/Degree_(angle) angle in degrees], not radians.", @@ -202,7 +212,7 @@ "TEXT_ISEMPTY_TITLE": "block text - See [https://github.com/google/blockly/wiki/Text#checking-for-empty-text https://github.com/google/blockly/wiki/Text#checking-for-empty-text]. \n\nParameters:\n* %1 - the piece of text to test for emptiness", "TEXT_ISEMPTY_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text#checking-for-empty-text https://github.com/google/blockly/wiki/Text#checking-for-empty-text].", "TEXT_INDEXOF_HELPURL": "url - Information about finding a character in a piece of text.", - "TEXT_INDEXOF_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text].", + "TEXT_INDEXOF_TOOLTIP": "tooltip - %1 will be replaced by either the number 0 or -1 depending on the indexing mode. See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text].", "TEXT_INDEXOF_INPUT_INTEXT": "block text - Title of blocks allowing users to find text. See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text]. [[File:Blockly-find-text.png]].", "TEXT_INDEXOF_OPERATOR_FIRST": "dropdown - See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text]. [[File:Blockly-find-text.png]].", "TEXT_INDEXOF_OPERATOR_LAST": "dropdown - See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text]. This would replace 'find first occurrence of text' below. (For more information on how common text is factored out of dropdown menus, see [https://translatewiki.net/wiki/Translating:Blockly#Drop-Down_Menus https://translatewiki.net/wiki/Translating:Blockly#Drop-Down_Menus)].) [[File:Blockly-find-text.png]].", @@ -244,6 +254,15 @@ "TEXT_PROMPT_TYPE_NUMBER": "dropdown - Specifies that a number should be requested from the user with the following message. See [https://github.com/google/blockly/wiki/Text#printing-text https://github.com/google/blockly/wiki/Text#printing-text].", "TEXT_PROMPT_TOOLTIP_NUMBER": "dropdown - Precedes the message with which the user should be prompted for a number. See [https://github.com/google/blockly/wiki/Text#printing-text https://github.com/google/blockly/wiki/Text#printing-text].", "TEXT_PROMPT_TOOLTIP_TEXT": "dropdown - Precedes the message with which the user should be prompted for some text. See [https://github.com/google/blockly/wiki/Text#printing-text https://github.com/google/blockly/wiki/Text#printing-text].", + "TEXT_COUNT_MESSAGE0": "block text - Title of a block that counts the number of instances of a smaller pattern (%1) inside a longer string (%2).", + "TEXT_COUNT_HELPURL": "url - Information about counting how many times a string appears in another string.", + "TEXT_COUNT_TOOLTIP": "tooltip - Short description of a block that counts how many times some text occurs within some other text.", + "TEXT_REPLACE_MESSAGE0": "block text - Title of a block that returns a copy of text (%3) with all instances of some smaller text (%1) replaced with other text (%2).", + "TEXT_REPLACE_HELPURL": "url - Information about replacing each copy text (or string, in computer lingo) with other text.", + "TEXT_REPLACE_TOOLTIP": "tooltip - Short description of a block that replaces copies of text in a large text with other text.", + "TEXT_REVERSE_MESSAGE0": "block text - Title of block that returns a copy of text (%1) with the order of letters and characters reversed.\n{{Identical|Reverse}}", + "TEXT_REVERSE_HELPURL": "url - Information about reversing a letters/characters in text.", + "TEXT_REVERSE_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text].", "LISTS_CREATE_EMPTY_HELPURL": "url - Information on empty lists.", "LISTS_CREATE_EMPTY_TITLE": "block text - See [https://github.com/google/blockly/wiki/Lists#create-empty-list https://github.com/google/blockly/wiki/Lists#create-empty-list].", "LISTS_CREATE_EMPTY_TOOLTIP": "block text - See [https://github.com/google/blockly/wiki/Lists#create-empty-list https://github.com/google/blockly/wiki/Lists#create-empty-list].", @@ -266,7 +285,7 @@ "LISTS_INDEX_OF_HELPURL": "url - See [https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list].", "LISTS_INDEX_OF_FIRST": "dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list Lists#finding-items-in-a-list]. [[File:Blockly-list-find.png]]", "LISTS_INDEX_OF_LAST": "dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list]. [[File:Blockly-list-find.png]]", - "LISTS_INDEX_OF_TOOLTIP": "dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list]. [[File:Blockly-list-find.png]]", + "LISTS_INDEX_OF_TOOLTIP": "tooltip - %1 will be replaced by either the number 0 or -1 depending on the indexing mode. See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list]. [[File:Blockly-list-find.png]]", "LISTS_GET_INDEX_GET": "dropdown - Indicates that the user wishes to [https://github.com/google/blockly/wiki/Lists#getting-a-single-item get an item from a list] without removing it from the list.", "LISTS_GET_INDEX_GET_REMOVE": "dropdown - Indicates that the user wishes to [https://github.com/google/blockly/wiki/Lists#getting-a-single-item get and remove an item from a list], as opposed to merely getting it without modifying the list.", "LISTS_GET_INDEX_REMOVE": "dropdown - Indicates that the user wishes to [https://github.com/google/blockly/wiki/Lists#removing-an-item remove an item from a list].\n{{Identical|Remove}}", @@ -276,18 +295,17 @@ "LISTS_GET_INDEX_LAST": "dropdown - Indicates that the '''last''' item should be [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. [[File:Blockly-list-get-item.png]]", "LISTS_GET_INDEX_RANDOM": "dropdown - Indicates that a '''random''' item should be [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. [[File:Blockly-list-get-item.png]]", "LISTS_GET_INDEX_TAIL": "block text - Text that should go after the rightmost block/dropdown when [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessing an item from a list]. In most languages, this will be the empty string. [[File:Blockly-list-get-item.png]]", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information.", + "LISTS_INDEX_FROM_START_TOOLTIP": "tooltip - Indicates the ordinal number that the first item in a list is referenced by. %1 will be replaced by either '#0' or '#1' depending on the indexing mode.", + "LISTS_INDEX_FROM_END_TOOLTIP": "tooltip - Indicates the ordinal number that the last item in a list is referenced by. %1 will be replaced by either '#0' or '#1' depending on the indexing mode.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '# from start'.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '# from end'.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '#' or '# from end'.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'first'.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'last'.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'random'.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '# from start'.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '# from end'.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '#' or '# from end'.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'first'.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'last'.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'random'.", @@ -295,13 +313,11 @@ "LISTS_SET_INDEX_SET": "block text - [https://github.com/google/blockly/wiki/Lists#in-list--set Replaces an item in a list]. [[File:Blockly-in-list-set-insert.png]]", "LISTS_SET_INDEX_INSERT": "block text - [https://github.com/google/blockly/wiki/Lists#in-list--insert-at Inserts an item into a list]. [[File:Blockly-in-list-set-insert.png]]", "LISTS_SET_INDEX_INPUT_TO": "block text - The word(s) after the position in the list and before the item to be set/inserted. [[File:Blockly-in-list-set-insert.png]]", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'set' block).", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'set' block).", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'set' block).", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'set' block).", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'set' block).", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'set' block).", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'insert' block).", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'insert' block).", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'insert' block).", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'insert' block).", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'insert' block).", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'insert' block).", @@ -314,12 +330,23 @@ "LISTS_GET_SUBLIST_END_LAST": "dropdown - Indicates that the '''last''' item in the given list should be [https://github.com/google/blockly/wiki/Lists#getting-a-sublist the end of the selected sublist]. [[File:Blockly-get-sublist.png]]", "LISTS_GET_SUBLIST_TAIL": "block text - This appears in the rightmost position ('tail') of the sublist block, as described at [https://github.com/google/blockly/wiki/Lists#getting-a-sublist https://github.com/google/blockly/wiki/Lists#getting-a-sublist]. In English and most other languages, this is the empty string. [[File:Blockly-get-sublist.png]]", "LISTS_GET_SUBLIST_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-sublist https://github.com/google/blockly/wiki/Lists#getting-a-sublist] for more information. [[File:Blockly-get-sublist.png]]", + "LISTS_SORT_HELPURL": "{{optional}}\nurl - Information describing sorting a list.", + "LISTS_SORT_TITLE": "Sort as type %1 (numeric or alphabetic) in order %2 (ascending or descending) a list of items %3.\n{{Identical|Sort}}", + "LISTS_SORT_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Lists#sorting-a-list].", + "LISTS_SORT_ORDER_ASCENDING": "sorting order or direction from low to high value for numeric, or A-Z for alphabetic.\n{{Identical|Ascending}}", + "LISTS_SORT_ORDER_DESCENDING": "sorting order or direction from high to low value for numeric, or Z-A for alphabetic.\n{{Identical|Descending}}", + "LISTS_SORT_TYPE_NUMERIC": "sort by treating each item as a number.", + "LISTS_SORT_TYPE_TEXT": "sort by treating each item alphabetically, case-sensitive.", + "LISTS_SORT_TYPE_IGNORECASE": "sort by treating each item alphabetically, ignoring differences in case.", "LISTS_SPLIT_HELPURL": "url - Information describing splitting text into a list, or joining a list into text.", "LISTS_SPLIT_LIST_FROM_TEXT": "dropdown - Indicates that text will be split up into a list (e.g. 'a-b-c' -> ['a', 'b', 'c']).", "LISTS_SPLIT_TEXT_FROM_LIST": "dropdown - Indicates that a list will be joined together to form text (e.g. ['a', 'b', 'c'] -> 'a-b-c').", "LISTS_SPLIT_WITH_DELIMITER": "block text - Prompts for a letter to be used as a separator when splitting or joining text.", "LISTS_SPLIT_TOOLTIP_SPLIT": "tooltip - See [https://github.com/google/blockly/wiki/Lists#make-list-from-text https://github.com/google/blockly/wiki/Lists#make-list-from-text] for more information.", "LISTS_SPLIT_TOOLTIP_JOIN": "tooltip - See [https://github.com/google/blockly/wiki/Lists#make-text-from-list https://github.com/google/blockly/wiki/Lists#make-text-from-list] for more information.", + "LISTS_REVERSE_HELPURL": "url - Information describing reversing a list.", + "LISTS_REVERSE_MESSAGE0": "block text - Title of block that returns a copy of a list (%1) with the order of items reversed.\n{{Identical|Reverse}}", + "LISTS_REVERSE_TOOLTIP": "tooltip - Short description for a block that reverses a copy of a list.", "ORDINAL_NUMBER_SUFFIX": "grammar - Text that follows an ordinal number (a number that indicates position relative to other numbers). In most languages, such text appears before the number, so this should be blank. An exception is Hungarian. See [[Translating:Blockly#Ordinal_numbers]] for more information.", "VARIABLES_GET_HELPURL": "url - Information about ''variables'' in computer programming. Consider using your language's translation of [https://en.wikipedia.org/wiki/Variable_(computer_science) https://en.wikipedia.org/wiki/Variable_(computer_science)], if it exists.", "VARIABLES_GET_TOOLTIP": "tooltip - This gets the value of the named variable without modifying it.", @@ -328,22 +355,22 @@ "VARIABLES_SET": "block text - Change the value of a mathematical variable: '''set [the value of] x to 7'''.\n\nParameters:\n* %1 - the name of the variable.\n* %2 - the value to be assigned.", "VARIABLES_SET_TOOLTIP": "tooltip - This initializes or changes the value of the named variable.", "VARIABLES_SET_CREATE_GET": "context menu - Selecting this creates a block to get (change) the value of this variable.\n\nParameters:\n* %1 - the name of the variable.", - "PROCEDURES_DEFNORETURN_HELPURL": "url - Information about defining [https://en.wikipedia.org/wiki/Procedure_(computer_science) functions] that do not have return values.", + "PROCEDURES_DEFNORETURN_HELPURL": "url - Information about defining [https://en.wikipedia.org/wiki/Subroutine functions] that do not have return values.", "PROCEDURES_DEFNORETURN_TITLE": "block text - This precedes the name of the function when defining it. See [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#c84aoc this sample function definition].", "PROCEDURES_DEFNORETURN_PROCEDURE": "default name - This acts as a placeholder for the name of a function on a function definition block, as shown on [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#w7cfju this block]. The user will replace it with the function's name.", "PROCEDURES_BEFORE_PARAMS": "block text - This precedes the list of parameters on a function's defiition block. See [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample function with parameters].", "PROCEDURES_CALL_BEFORE_PARAMS": "block text - This precedes the list of parameters on a function's caller block. See [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample function with parameters].", "PROCEDURES_DEFNORETURN_DO": "block text - This appears next to the function's 'body', the blocks that should be run when the function is called, as shown in [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample function definition].", "PROCEDURES_DEFNORETURN_TOOLTIP": "tooltip", - "PROCEDURES_DEFRETURN_HELPURL": "url - Information about defining [https://en.wikipedia.org/wiki/Procedure_(computer_science) functions] that have return values.", + "PROCEDURES_DEFNORETURN_COMMENT": "Placeholder text that the user is encouraged to replace with a description of what their function does.", + "PROCEDURES_DEFRETURN_HELPURL": "url - Information about defining [https://en.wikipedia.org/wiki/Subroutine functions] that have return values.", "PROCEDURES_DEFRETURN_RETURN": "block text - This imperative or infinite verb precedes the value that is used as the return value (output) of this function. See [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#6ot5y5 this sample function that returns a value].", "PROCEDURES_DEFRETURN_TOOLTIP": "tooltip", "PROCEDURES_ALLOW_STATEMENTS": "Label for a checkbox that controls if statements are allowed in a function.", "PROCEDURES_DEF_DUPLICATE_WARNING": "alert - The user has created a function with two parameters that have the same name. Every parameter must have a different name.", - "PROCEDURES_CALLNORETURN_HELPURL": "url - Information about calling [https://en.wikipedia.org/wiki/Procedure_(computer_science) functions] that do not return values.", - "PROCEDURES_CALLNORETURN_CALL": "block text - In most (if not all) languages, this will be the empty string. It precedes the name of the function that should be run. See, for example, the 'draw square' block in [https://blockly-demo.appspot.com/static/apps/turtle/index.html#ztz96g].", + "PROCEDURES_CALLNORETURN_HELPURL": "url - Information about calling [https://en.wikipedia.org/wiki/Subroutine functions] that do not return values.", "PROCEDURES_CALLNORETURN_TOOLTIP": "tooltip - This block causes the body (blocks inside) of the named function definition to be run.", - "PROCEDURES_CALLRETURN_HELPURL": "url - Information about calling [https://en.wikipedia.org/wiki/Procedure_(computer_science) functions] that return values.", + "PROCEDURES_CALLRETURN_HELPURL": "url - Information about calling [https://en.wikipedia.org/wiki/Subroutine functions] that return values.", "PROCEDURES_CALLRETURN_TOOLTIP": "tooltip - This block causes the body (blocks inside) of the named function definition to be run.\n\nParameters:\n* %1 - the name of the function.", "PROCEDURES_MUTATORCONTAINER_TITLE": "block text - This text appears on a block in a window that appears when the user clicks on the plus sign or star on a function definition block. It refers to the set of parameters (referred to by the simpler term 'inputs') to the function. See [[Translating:Blockly#function_definitions]].", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "tooltip", @@ -352,5 +379,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "context menu - This appears on the context menu for function calls. Selecting it causes the corresponding function definition to be highlighted (as shown at [[Translating:Blockly#context_menus]].", "PROCEDURES_CREATE_DO": "context menu - This appears on the context menu for function definitions. Selecting it creates a block to call the function.\n\nParameters:\n* %1 - the name of the function.\n{{Identical|Create}}", "PROCEDURES_IFRETURN_TOOLTIP": "tooltip - If the first value is true, this causes the second value to be returned immediately from the enclosing function.", + "PROCEDURES_IFRETURN_HELPURL": "{{optional}}\nurl - Information about guard clauses.", "PROCEDURES_IFRETURN_WARNING": "warning - This appears if the user tries to use this block outside of a function definition." } diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ro.json b/src/opsoro/server/static/js/blockly/msg/json/ro.json similarity index 90% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/ro.json rename to src/opsoro/server/static/js/blockly/msg/json/ro.json index 945e44a..ce4fb1e 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ro.json +++ b/src/opsoro/server/static/js/blockly/msg/json/ro.json @@ -4,10 +4,12 @@ "Minisarm", "Ely en", "Hugbear", - "아라" + "아라", + "Ykhwong" ] }, "VARIABLES_DEFAULT_NAME": "element", + "TODAY": "Astăzi", "DUPLICATE_BLOCK": "Duplicati", "ADD_COMMENT": "Adaugă un comentariu", "REMOVE_COMMENT": "Elimină comentariu", @@ -15,6 +17,7 @@ "INLINE_INPUTS": "Intrări în linie", "DELETE_BLOCK": "Șterge Bloc", "DELETE_X_BLOCKS": "Ștergeți %1 Blocuri", + "DELETE_ALL_BLOCKS": "Ștergi toate cele %1 (de) blocuri?", "COLLAPSE_BLOCK": "Restrange blocul", "COLLAPSE_ALL": "Restrange blocurile", "EXPAND_BLOCK": "Extinde bloc", @@ -22,14 +25,11 @@ "DISABLE_BLOCK": "Dezactivaţi bloc", "ENABLE_BLOCK": "Permite bloc", "HELP": "Ajutor", - "CHAT": "Discută cu colaboratorul tău tastând în cadrul acestei zone!", - "AUTH": "Va rugăm să autorizați această aplicație să permită salvarea activității dumneavoastră și să permită distribuirea acesteia de către dumneavoastră.", - "ME": "Eu", "CHANGE_VALUE_TITLE": "Schimbaţi valoarea:", - "NEW_VARIABLE": "Variabilă nouă...", - "NEW_VARIABLE_TITLE": "Noul nume de variabilă:", "RENAME_VARIABLE": "Redenumirea variabilei...", "RENAME_VARIABLE_TITLE": "Redenumeşte toate variabilele '%1' în:", + "NEW_VARIABLE": "Variabilă nouă...", + "NEW_VARIABLE_TITLE": "Noul nume de variabilă:", "COLOUR_PICKER_HELPURL": "https://ro.wikipedia.org/wiki/Culoare", "COLOUR_PICKER_TOOLTIP": "Alege o culoare din paleta de culori.", "COLOUR_RANDOM_TITLE": "culoare aleatorie", @@ -126,7 +126,7 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Returnează logaritmul în baza 10 a unui număr.", "MATH_SINGLE_TOOLTIP_EXP": "Returnează e la puterea unui număr.", "MATH_SINGLE_TOOLTIP_POW10": "Returnează 10 la puterea unui număr.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "MATH_TRIG_HELPURL": "https://ko.wikipedia.org/wiki/삼각함수", "MATH_TRIG_TOOLTIP_SIN": "Întoarce cosinusul unui grad (nu radianul).", "MATH_TRIG_TOOLTIP_COS": "Întoarce cosinusul unui grad (nu radianul).", "MATH_TRIG_TOOLTIP_TAN": "Întoarce tangenta unui grad (nu radianul).", @@ -192,7 +192,7 @@ "TEXT_LENGTH_TOOLTIP": "Returnează numărul de litere (inclusiv spaţiile) în textul furnizat.", "TEXT_ISEMPTY_TITLE": "%1 este gol", "TEXT_ISEMPTY_TOOLTIP": "Returnează adevărat dacă textul furnizat este gol.", - "TEXT_INDEXOF_TOOLTIP": "Returnează indicele primei/ultimei apariţii din primul text în al doilea text. Returnează 0 dacă textul nu este găsit.", + "TEXT_INDEXOF_TOOLTIP": "Returnează indicele primei/ultimei apariţii din primul text în al doilea text. Returnează %1 dacă textul nu este găsit.", "TEXT_INDEXOF_INPUT_INTEXT": "în text", "TEXT_INDEXOF_OPERATOR_FIRST": "găseşte prima apariţie a textului", "TEXT_INDEXOF_OPERATOR_LAST": "găseşte ultima apariţie a textului", @@ -242,7 +242,7 @@ "LISTS_INLIST": "în listă", "LISTS_INDEX_OF_FIRST": "Găseşte prima apariţie a elementului", "LISTS_INDEX_OF_LAST": "găseşte ultima apariţie a elementului", - "LISTS_INDEX_OF_TOOLTIP": "Returneaza indexul de la prima/ultima aparitie a elementuli din lista. Returneaza 0 daca textul nu este gasit.", + "LISTS_INDEX_OF_TOOLTIP": "Revine la indexul de la prima/ultima apariție a elementului din listă. Returnează %1 dacă elementul nu este găsit.", "LISTS_GET_INDEX_GET": "obţine", "LISTS_GET_INDEX_GET_REMOVE": "obţine şi elimină", "LISTS_GET_INDEX_REMOVE": "elimină", @@ -251,31 +251,28 @@ "LISTS_GET_INDEX_FIRST": "primul", "LISTS_GET_INDEX_LAST": "ultimul", "LISTS_GET_INDEX_RANDOM": "aleator", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Returneaza elementul la poziţia specificată într-o listă. #1 este primul element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Returneaza elementul la poziţia specificată într-o listă. #1 este ultimul element.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 este primul element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 este ultimul element.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Returneaza elementul la poziţia specificată într-o listă.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Returnează primul element dintr-o listă.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Returnează ultimul element într-o listă.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Returneaza un element aleatoriu într-o listă.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Elimină şi returneaza elementul la poziţia specificată într-o listă. #1 este primul element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Elimină şi returneaza elementul la poziţia specificată într-o listă. #1 este ultimul element.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Elimină şi returneaza elementul la poziţia specificată într-o listă.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Elimină şi returnează primul element într-o listă.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Elimină şi returnează ultimul element într-o listă.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Elimină şi returnează un element aleatoriu într-o listă.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Elimină elementul la poziţia specificată într-o listă. #1 este primul element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Elimină elementul la poziţia specificată într-o listă. #1 este ultimul element.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Elimină elementul la poziţia specificată într-o listă.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Elimină primul element într-o listă.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Elimină ultimul element într-o listă.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Elimină un element aleatoriu într-o listă.", "LISTS_SET_INDEX_SET": "seteaza", "LISTS_SET_INDEX_INSERT": "introduceţi la", "LISTS_SET_INDEX_INPUT_TO": "ca", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Setează elementul la poziţia specificată într-o listă. #1 este primul element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Setează elementul la poziţia specificată într-o listă. #1 este ultimul element.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Setează elementul la poziţia specificată într-o listă.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Setează primul element într-o listă.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Setează ultimul element într-o listă.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Setează un element aleator într-o listă.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Inserează elementul la poziţia specificată într-o listă. #1 este primul element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Inserează elementul la poziţia specificată într-o listă. #1 este ultimul element.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Inserează elementul la poziţia specificată într-o listă.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Inserează elementul la începutul unei liste.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Adăugă elementul la sfârşitul unei liste.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Inserează elementul aleatoriu într-o listă.", @@ -302,7 +299,7 @@ "PROCEDURES_BEFORE_PARAMS": "cu:", "PROCEDURES_CALL_BEFORE_PARAMS": "cu:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Crează o funcţie cu nici o ieşire.", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFRETURN_HELPURL": "https://ko.wikipedia.org/wiki/함수_(프로그래밍)", "PROCEDURES_DEFRETURN_RETURN": "returnează", "PROCEDURES_DEFRETURN_TOOLTIP": "Creează o funcţie cu o ieşire.", "PROCEDURES_ALLOW_STATEMENTS": "permite declarațiile", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ru.json b/src/opsoro/server/static/js/blockly/msg/json/ru.json similarity index 87% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/ru.json rename to src/opsoro/server/static/js/blockly/msg/json/ru.json index 3a97d7d..b431f91 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ru.json +++ b/src/opsoro/server/static/js/blockly/msg/json/ru.json @@ -4,7 +4,10 @@ "Espertus", "MS", "Okras", - "RedFox" + "RedFox", + "Mailman", + "Silovan", + "Redredsonia" ] }, "VARIABLES_DEFAULT_NAME": "элемент", @@ -16,6 +19,8 @@ "INLINE_INPUTS": "Вставки внутри", "DELETE_BLOCK": "Удалить блок", "DELETE_X_BLOCKS": "Удалить %1 блоков", + "DELETE_ALL_BLOCKS": "Удалить все блоки (%1)?", + "CLEAN_UP": "Убрать блоки", "COLLAPSE_BLOCK": "Свернуть блок", "COLLAPSE_ALL": "Свернуть блоки", "EXPAND_BLOCK": "Развернуть блок", @@ -23,14 +28,16 @@ "DISABLE_BLOCK": "Отключить блок", "ENABLE_BLOCK": "Включить блок", "HELP": "Справка", - "CHAT": "Общайтесь со своим коллегой, печатая в этом поле!", - "AUTH": "Пожалуйста, авторизуйте это приложение, чтоб можно было сохранять вашу работу и чтобы дать возможность вам делиться ей.", - "ME": "Мне", + "UNDO": "Отменить", + "REDO": "Повторить", "CHANGE_VALUE_TITLE": "Измените значение:", - "NEW_VARIABLE": "Новая переменная…", - "NEW_VARIABLE_TITLE": "Имя новой переменной:", "RENAME_VARIABLE": "Переименовать переменную…", "RENAME_VARIABLE_TITLE": "Переименовать все переменные '%1' в:", + "NEW_VARIABLE": "Создать переменную…", + "NEW_VARIABLE_TITLE": "Имя новой переменной:", + "VARIABLE_ALREADY_EXISTS": "Переменная с именем '%1' уже существует.", + "DELETE_VARIABLE_CONFIRMATION": "Удалить %1 использований переменной '%2'?", + "DELETE_VARIABLE": "Удалить переменную '%1'", "COLOUR_PICKER_HELPURL": "https://ru.wikipedia.org/wiki/Цвет", "COLOUR_PICKER_TOOLTIP": "Выберите цвет из палитры.", "COLOUR_RANDOM_TITLE": "случайный цвет", @@ -72,10 +79,10 @@ "CONTROLS_IF_IF_TOOLTIP": "Добавьте, удалите, переставьте фрагменты для переделки блока \"если\".", "CONTROLS_IF_ELSEIF_TOOLTIP": "Добавляет условие к блоку \"если\"", "CONTROLS_IF_ELSE_TOOLTIP": "Добавить заключительный подблок для случая, когда все условия ложны.", - "LOGIC_COMPARE_HELPURL": "https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE", - "LOGIC_COMPARE_TOOLTIP_EQ": "Возвращает значение истина, если вставки равны.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Возвращает значение истина, если вставки не равны.", - "LOGIC_COMPARE_TOOLTIP_LT": "Возвращает значение истина, если первая вставка меньше второй.", + "LOGIC_COMPARE_HELPURL": "https://ru.wikipedia.org/wiki/Неравенство", + "LOGIC_COMPARE_TOOLTIP_EQ": "Возвращает положительное значение, если вводы равны.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Возвращает положительное значение, если вводы не равны.", + "LOGIC_COMPARE_TOOLTIP_LT": "Возвращает положительное значение, если первый ввод меньше второго.", "LOGIC_COMPARE_TOOLTIP_LTE": "Возвращает значение истина, если первая вставка меньше или равна второй.", "LOGIC_COMPARE_TOOLTIP_GT": "Возвращает значение истина, если первая вставка больше второй.", "LOGIC_COMPARE_TOOLTIP_GTE": "Возвращает значение истина, если первая вставка больше или равна второй.", @@ -180,7 +187,7 @@ "TEXT_LENGTH_TOOLTIP": "Возвращает число символов (включая пробелы) в заданном тексте.", "TEXT_ISEMPTY_TITLE": "%1 пуст", "TEXT_ISEMPTY_TOOLTIP": "Возвращает значение истина, если предоставленный текст пуст.", - "TEXT_INDEXOF_TOOLTIP": "Возвращает номер позиции первого/последнего вхождения первого текста во втором. Возвращает 0, если текст не найден.", + "TEXT_INDEXOF_TOOLTIP": "Возвращает номер позиции первого/последнего вхождения первого текста во втором. Возвращает %1, если текст не найден.", "TEXT_INDEXOF_INPUT_INTEXT": "в тексте", "TEXT_INDEXOF_OPERATOR_FIRST": "найти первое вхождение текста", "TEXT_INDEXOF_OPERATOR_LAST": "найти последнее вхождение текста", @@ -213,6 +220,14 @@ "TEXT_PROMPT_TYPE_NUMBER": "запросить число с подсказкой", "TEXT_PROMPT_TOOLTIP_NUMBER": "Запросить у пользователя число.", "TEXT_PROMPT_TOOLTIP_TEXT": "Запросить у пользователя текст.", + "TEXT_COUNT_MESSAGE0": "подсчитать количество %1 в %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Подсчитать, сколько раз отрывок текста появляется в другом тексте.", + "TEXT_REPLACE_MESSAGE0": "заменить %1 на %2 в %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REVERSE_MESSAGE0": "изменить порядок на обратный %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Меняет порядок символов в тексте на обратный.", "LISTS_CREATE_EMPTY_TITLE": "создать пустой список", "LISTS_CREATE_EMPTY_TOOLTIP": "Возвращает список длины 0, не содержащий данных", "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", @@ -230,7 +245,7 @@ "LISTS_INLIST": "в списке", "LISTS_INDEX_OF_FIRST": "найти первое вхождение элемента", "LISTS_INDEX_OF_LAST": "найти последнее вхождение элемента", - "LISTS_INDEX_OF_TOOLTIP": "Возвращает номер позиции первого/последнего вхождения элемента в списке. Возвращает 0, если текст не найден.", + "LISTS_INDEX_OF_TOOLTIP": "Возвращает номер позиции первого/последнего вхождения элемента в списке. Возвращает %1, если элемент не найден.", "LISTS_GET_INDEX_GET": "взять", "LISTS_GET_INDEX_GET_REMOVE": "взять и удалить", "LISTS_GET_INDEX_REMOVE": "удалить", @@ -238,31 +253,28 @@ "LISTS_GET_INDEX_FIRST": "первый", "LISTS_GET_INDEX_LAST": "последний", "LISTS_GET_INDEX_RANDOM": "произвольный", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Возвращает элемент в указанной позиции списка (№1 - первый элемент).", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Возвращает элемент в указанной позиции списка (№1 - последний элемент).", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 - первый элемент.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 - последний элемент.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Возвращает элемент в указанной позиции списка.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Возвращает первый элемент списка.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Возвращает последний элемент списка.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Возвращает случайный элемент списка.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Удаляет и возвращает элемент в указанной позиции списка (№1 - первый элемент).", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Удаляет и возвращает элемент в указанной позиции списка (№1 - последний элемент).", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Удаляет и возвращает элемент в указанной позиции списка.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Удаляет и возвращает первый элемент списка.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Удаляет и возвращает последний элемент списка.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Удаляет и возвращает случайный элемент списка.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Удаляет элемент в указанной позиции списка (№1 - первый элемент).", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Удаляет элемент в указанной позиции списка (№1 - последний элемент).", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Удаляет элемент в указанной позиции списка.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Удаляет первый элемент списка.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Удаляет последний элемент списка.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Удаляет случайный элемент списка.", "LISTS_SET_INDEX_SET": "присвоить", "LISTS_SET_INDEX_INSERT": "вставить в", "LISTS_SET_INDEX_INPUT_TO": "=", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Присваивает значение элементу в указанной позиции списка (№1 - первый элемент).", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Присваивает значение элементу в указанной позиции списка (№1 - последний элемент).", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Присваивает значение элементу в указанной позиции списка.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Присваивает значение первому элементу списка.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Присваивает значение последнему элементу списка.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Присваивает значение случайному элементу списка.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Вставляет элемент в указанной позиции списка (№1 - первый элемент).", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Вставляет элемент в указанной позиции списка (№1 - последний элемент).", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Вставляет элемент в указанной позиции списка.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Вставляет элемент в начало списка.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Добавляет элемент в конец списка.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Вставляет элемент в случайное место в списке.", @@ -273,12 +285,23 @@ "LISTS_GET_SUBLIST_END_FROM_END": "по № с конца", "LISTS_GET_SUBLIST_END_LAST": "по последний", "LISTS_GET_SUBLIST_TOOLTIP": "Создаёт копию указанной части списка.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "сортировать %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Сортировать копию списка.", + "LISTS_SORT_ORDER_ASCENDING": "по возрастанию", + "LISTS_SORT_ORDER_DESCENDING": "по убыванию", + "LISTS_SORT_TYPE_NUMERIC": "числовая", + "LISTS_SORT_TYPE_TEXT": "по алфавиту", + "LISTS_SORT_TYPE_IGNORECASE": "по алфавиту, без учёта регистра", "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "сделать список из текста", "LISTS_SPLIT_TEXT_FROM_LIST": "собрать текст из списка", "LISTS_SPLIT_WITH_DELIMITER": "с разделителем", "LISTS_SPLIT_TOOLTIP_SPLIT": "Разбивает текст в список текстов, по разделителям.", "LISTS_SPLIT_TOOLTIP_JOIN": "Соединяет сптсок текстов в один текст с разделителями.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "изменить порядок на обратный %1", + "LISTS_REVERSE_TOOLTIP": "Изменить порядок списка на обратный.", "VARIABLES_GET_TOOLTIP": "Возвращает значение этой переменной.", "VARIABLES_GET_CREATE_SET": "Создать блок \"присвоить\" для %1", "VARIABLES_SET": "присвоить %1 = %2", @@ -289,13 +312,14 @@ "PROCEDURES_BEFORE_PARAMS": "с:", "PROCEDURES_CALL_BEFORE_PARAMS": "с:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Создаёт процедуру, не возвращающую значение.", + "PROCEDURES_DEFNORETURN_COMMENT": "Опишите эту функцию…", "PROCEDURES_DEFRETURN_RETURN": "вернуть", "PROCEDURES_DEFRETURN_TOOLTIP": "Создаёт процедуру, возвращающую значение.", "PROCEDURES_ALLOW_STATEMENTS": "разрешить операторы", "PROCEDURES_DEF_DUPLICATE_WARNING": "Предупреждение: эта функция имеет повторяющиеся параметры.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://ru.wikipedia.org/wiki/Функция_%28программирование%29", + "PROCEDURES_CALLNORETURN_HELPURL": "https://ru.wikipedia.org/wiki/Подпрограмма", "PROCEDURES_CALLNORETURN_TOOLTIP": "Исполняет определённую пользователем процедуру '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://ru.wikipedia.org/wiki/Функция_%28программирование%29", + "PROCEDURES_CALLRETURN_HELPURL": "https://ru.wikipedia.org/wiki/Подпрограмма", "PROCEDURES_CALLRETURN_TOOLTIP": "Исполняет определённую пользователем процедуру '%1' и возвращает вычисленное значение.", "PROCEDURES_MUTATORCONTAINER_TITLE": "параметры", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Добавить, удалить или изменить порядок входных параметров для этой функции.", @@ -304,5 +328,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Выделить определение процедуры", "PROCEDURES_CREATE_DO": "Создать вызов '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Если первое значение истинно, возвращает второе значение.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Предупреждение: Этот блок может использоваться только внутри определения функции." } diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/sc.json b/src/opsoro/server/static/js/blockly/msg/json/sc.json similarity index 91% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/sc.json rename to src/opsoro/server/static/js/blockly/msg/json/sc.json index 5967886..12396ec 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/sc.json +++ b/src/opsoro/server/static/js/blockly/msg/json/sc.json @@ -15,21 +15,20 @@ "INLINE_INPUTS": "Intradas in lìnia", "DELETE_BLOCK": "Fùlia Blocu", "DELETE_X_BLOCKS": "Fulia %1 Blocus", - "COLLAPSE_BLOCK": "Serra e astringhe Blocu", - "COLLAPSE_ALL": "Serra e astringhe Boocos", - "EXPAND_BLOCK": "Aberi Blocu", - "EXPAND_ALL": "Aberi Brocos", + "DELETE_ALL_BLOCKS": "Scancellu su %1 de is brocus?", + "CLEAN_UP": "Lìmpia is brocus", + "COLLAPSE_BLOCK": "Serra e stringi Brocu", + "COLLAPSE_ALL": "Serra e stringi Brocus", + "EXPAND_BLOCK": "Aberi Brocu", + "EXPAND_ALL": "Aberi Brocus", "DISABLE_BLOCK": "Disabìlita Blocu", "ENABLE_BLOCK": "Abìlita Blocu", "HELP": "Agiudu", - "CHAT": "Faedda cun su cumpàngiu tuo iscriende inoghe!", - "AUTH": "Permiti a custa app de sarvare su traballu tuo e de ti lu fàghere cumpartzire.", - "ME": "Deo", "CHANGE_VALUE_TITLE": "Muda valori:", - "NEW_VARIABLE": "Variabili noa...", - "NEW_VARIABLE_TITLE": "Nòmini de sa variabili noa:", "RENAME_VARIABLE": "Muda nòmini a variabili...", "RENAME_VARIABLE_TITLE": "A is variabilis '%1' muda nòmini a:", + "NEW_VARIABLE": "Variabili noa...", + "NEW_VARIABLE_TITLE": "Nòmini de sa variabili noa:", "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Scebera unu colori de sa tauledda.", "COLOUR_RANDOM_TITLE": "Unu colori a brítiu", @@ -177,7 +176,7 @@ "TEXT_LENGTH_TOOLTIP": "Torrat su numeru de lìteras (cun is spàtzius) in su testu giau.", "TEXT_ISEMPTY_TITLE": "%1 est buidu", "TEXT_ISEMPTY_TOOLTIP": "Torrat berus si su testu giau est buidu.", - "TEXT_INDEXOF_TOOLTIP": "Torrat s'indixi de sa primu/urtima ocasioni de su primu testu in su segundu testu. Torrat 0 si su testu no ddu agatat.", + "TEXT_INDEXOF_TOOLTIP": "Torrat s'indixi de sa primu/urtima ocasioni de su primu testu in su segundu testu. Torrat %1 si su testu no ddu agatat.", "TEXT_INDEXOF_INPUT_INTEXT": "in su testu", "TEXT_INDEXOF_OPERATOR_FIRST": "circa prima ocasioni de su testu", "TEXT_INDEXOF_OPERATOR_LAST": "circa urtima ocasioni de su testu", @@ -226,7 +225,7 @@ "LISTS_INLIST": "in lista", "LISTS_INDEX_OF_FIRST": "circa prima ocasioni de s'item", "LISTS_INDEX_OF_LAST": "circa urtima ocasioni de s'item", - "LISTS_INDEX_OF_TOOLTIP": "Torrat s'indixi de sa primu/urtima ocasioni de s'item in sa lista. Torrat 0 si su testu no ddu agatat.", + "LISTS_INDEX_OF_TOOLTIP": "Torrat s'indixi de sa primu/urtima ocasioni de s'item in sa lista. Torrat %1 si s'item non s'agatat.", "LISTS_GET_INDEX_GET": "piga", "LISTS_GET_INDEX_GET_REMOVE": "piga e fùlia", "LISTS_GET_INDEX_REMOVE": "fùlia", @@ -234,31 +233,28 @@ "LISTS_GET_INDEX_FIRST": "primu", "LISTS_GET_INDEX_LAST": "urtimu", "LISTS_GET_INDEX_RANDOM": "a brìtiu (random)", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Torrat s'elementu de su postu inditau de una lista. #1 est po su primu elementu.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Torrat s'elementu de su postu inditau de una lista. Postu #1 est po s'urtimu elementu.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 est po su primu elementu.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 est po s'urtimu elementu.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Torrat s'elementu de su postu inditau de una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Torrat su primu elementu de una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Torrat s'urtimu elementu de una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Torrat un'elementu a brìtiu de una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Fùliat e torrat s'elementu de su postu inditau de una lista. #1 est po su primu elementu.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Fùliat e torrat s'elementu de su postu inditau de una lista. #1 est po s'urtimu elementu.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Fùliat e torrat s'elementu de su postu inditau de una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Fùliat e torrat su primu elementu de una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Fùliat e torrat s'urtimu elementu de una lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Fùliat e torrat un'elementu a brìtiu de una lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Fùliat s'elementu de su postu inditau de una lista. #1 est po su primu elementu.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Fùliat s'elementu de su postu inditau de una lista. #1 est po s'urtimu elementu.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Fùliat s'elementu de su postu inditau de una lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Fùliat su primu elementu de una lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Fùliat s'urtimu elementu de una lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Fùliat unu elementu a brìtiu de una lista.", "LISTS_SET_INDEX_SET": "imposta", "LISTS_SET_INDEX_INSERT": "inserta a", "LISTS_SET_INDEX_INPUT_TO": "a", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Impostat s'elementu in su postu inditau de una lista. Postu 1 est po su primu elementu.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Impostat s'elementu in su postu inditau de una lista. Postu #1 est po s'urtimu elementu.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Impostat s'elementu in su postu inditau de una lista.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Impostat su primu elementu in una lista.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Impostat s'urtimu elementu in una lista.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Impostat unu elementu random in una lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Insertat s'elementu in su postu inditau in una lista. Postu #1 est po su primu elementu.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Insertat s'elementu in su postu inditau de una lista. Postu #1 est po s'urtimu elementu.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Insertat s'elementu in su postu inditau in una lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Insertat s'elementu a su cumintzu de sa lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Aciungit s'elementu a sa fini de sa lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Aciungit s'elementu a brítiu in sa lista.", diff --git a/src/opsoro/server/static/js/blockly/msg/json/sd.json b/src/opsoro/server/static/js/blockly/msg/json/sd.json new file mode 100644 index 0000000..a02573f --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/sd.json @@ -0,0 +1,134 @@ +{ + "@metadata": { + "authors": [ + "Aursani", + "Mehtab ahmed", + "Indus Asia" + ] + }, + "VARIABLES_DEFAULT_NAME": "اسم", + "TODAY": "اڄ", + "DUPLICATE_BLOCK": "نقل", + "ADD_COMMENT": "تاثرات ڏيو", + "REMOVE_COMMENT": "تاثرات مِٽايو", + "EXTERNAL_INPUTS": "خارجي ڄاڻ", + "DELETE_BLOCK": "بلاڪ ڊاهيو", + "DELETE_X_BLOCKS": "1٪ بلاڪ ڊاهيو", + "CLEAN_UP": "بندشون هٽايو", + "COLLAPSE_BLOCK": "بلاڪ ڍڪيو", + "COLLAPSE_ALL": "بلاڪَ ڍڪيو", + "EXPAND_BLOCK": "بلاڪ نمايو", + "EXPAND_ALL": "بلاڪَ نمايو", + "DISABLE_BLOCK": "بلاڪ کي غيرفعال بڻايو", + "ENABLE_BLOCK": "بلاڪ کي فعال بڻايو", + "HELP": "مدد", + "REDO": "ٻيهر ڪريو", + "CHANGE_VALUE_TITLE": "قدر بدلايو", + "RENAME_VARIABLE": "ڦرڻي کي نئون نالو ڏيو...", + "NEW_VARIABLE": "نئون ڦرڻو...", + "NEW_VARIABLE_TITLE": "ڦرڻي جو نئون نالو:", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", + "COLOUR_PICKER_TOOLTIP": "رنگ دٻيءَ مان رنگ چونڊيو.", + "COLOUR_RANDOM_TITLE": "بلا ترتيب رنگ", + "COLOUR_RANDOM_TOOLTIP": "ڪو بہ ‌ڃڳ چونڊيو.", + "COLOUR_RGB_TITLE": "سان رڱيو", + "COLOUR_RGB_RED": "ڳاڙهو", + "COLOUR_RGB_GREEN": "سائو", + "COLOUR_RGB_BLUE": "نيرو", + "COLOUR_RGB_TOOLTIP": "ڳاڙهي، سائي، ۽ نيري جو مقدار ڄاڻائي گھربل رنگ ٺاهيو. سمورا قدر 0 ۽ 100 جي وچ ۾ هجن.", + "COLOUR_BLEND_COLOUR1": "رنگ 1", + "COLOUR_BLEND_COLOUR2": "رنگ 2", + "COLOUR_BLEND_RATIO": "تناسب", + "COLOUR_BLEND_TOOLTIP": "ڄاڻايل تناسب سان ٻہ رنگ پاڻ ۾ ملايو (0.0-1.0).", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "1٪ ڀيرا ورجايو", + "CONTROLS_REPEAT_INPUT_DO": "ڪريو", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ورجايو جڏهن", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ورجايو جيستائين", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "چڪر مان ٻاهر نڪرو", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "چڪر جاري رکندر نئين ڦيري پايو", + "CONTROLS_IF_MSG_IF": "جيڪڏهن", + "CONTROLS_IF_MSG_ELSEIF": "نہ تہ جي", + "CONTROLS_IF_MSG_ELSE": "نہ تہ", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "جيڪڏهن ٻئي ان پُٽس برابر آهن تہ درست وراڻيو", + "LOGIC_COMPARE_TOOLTIP_NEQ": "جيڪڏهن ٻئي ان پُٽس اڻ برابر آهن تہ درست وراڻيو", + "LOGIC_COMPARE_TOOLTIP_LT": "جيڪڏهن پهريون ان پُٽ ٻين ان پُٽ کان ننڍو آهي تہ درست وراڻيو", + "LOGIC_COMPARE_TOOLTIP_LTE": "جيڪڏهن پهريون ان پُٽ ٻين ان پُٽ کان ننڍو آهي يا ٻئي برابر آهن تہ درست وراڻيو", + "LOGIC_COMPARE_TOOLTIP_GT": "جيڪڏهن پهريون ان پُٽ ٻين ان پُٽ کان وڏو آهي تہ درست وراڻيو.", + "LOGIC_COMPARE_TOOLTIP_GTE": "جيڪڏهن پهريون ان پُٽ ٻين ان پُٽ کان وڏو آهي يا ٻئي برابر آهن تہ درست وراڻيو.", + "LOGIC_OPERATION_TOOLTIP_AND": "جيڪڏهن ٻئي ان پُٽ درست آهن تہ درست وراڻيو.", + "LOGIC_OPERATION_AND": "۽", + "LOGIC_OPERATION_TOOLTIP_OR": "جيڪڏهن ٻنهي ان پُٽس مان ڪو هڪ بہ درست آهي تہ درست وراڻيو.", + "LOGIC_OPERATION_OR": "يا", + "LOGIC_NEGATE_TITLE": "نڪي %1", + "LOGIC_NEGATE_TOOLTIP": "ان پُٽ غير درست آهي تہ درست وراڻيو. ان پُٽ درست آهي تہ غير درست وراڻيو.", + "LOGIC_BOOLEAN_TRUE": "سچ", + "LOGIC_BOOLEAN_FALSE": "ڪُوڙ", + "LOGIC_BOOLEAN_TOOLTIP": "درست يا غير درست وراڻي ٿو.", + "LOGIC_TERNARY_IF_TRUE": "جيڪڏهن سچو", + "LOGIC_TERNARY_IF_FALSE": "جيڪڏهن ڪوڙو", + "MATH_NUMBER_TOOLTIP": "ڪو انگ.", + "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_ARITHMETIC_TOOLTIP_ADD": "ٻن انگن جي جوڙ اپت ڏيو.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "ٻنهي انگن جو تفاوت ڏيو.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "ٻنهي انگن جي ضرب اُپت ڏيو.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "ٻنهي انگن جي ونڊ ڏيو.", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/ٻيون مول", + "MATH_SINGLE_OP_ROOT": "ٻيون مول", + "MATH_SINGLE_TOOLTIP_ROOT": "ڪنهن انگ جو ٻيون مول ڄاڻايو.", + "MATH_SINGLE_OP_ABSOLUTE": "ٺپ", + "MATH_SINGLE_TOOLTIP_NEG": "ڪنهن انگ جو ڪاٽو ڄاڻايو.", + "MATH_SINGLE_TOOLTIP_LN": "ڪنهن انگ جو قدرتي لاگ ڄاڻايو.", + "MATH_SINGLE_TOOLTIP_LOG10": "ڪنهن انگ جو 10 بنيادي لاگ ڄاڻايو.", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/ٽڪنڊور ڪاڄ", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/رياضياتي استقلال", + "MATH_IS_EVEN": "ٻڌي آهي", + "MATH_IS_ODD": "اِڪي آهي", + "MATH_IS_PRIME": "مفرد آهي", + "MATH_IS_WHOLE": "سڄو آهي", + "MATH_IS_POSITIVE": "واڌو آهي", + "MATH_IS_NEGATIVE": "ڪاٽو آهي", + "MATH_IS_DIVISIBLE_BY": "سان ونڊجندڙ آهي", + "MATH_CHANGE_TITLE": "%1 کي %2 سان مَٽايو", + "MATH_ROUND_OPERATOR_ROUNDUP": "ويڙهيو (رائونڊ اَپ)", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "هيٺ ڦيرايو (رائونڊ ڊائون)", + "MATH_ONLIST_OPERATOR_SUM": "فهرست جو وچور", + "MATH_ONLIST_OPERATOR_MIN": "لسٽ جو ننڍي ۾ ننڍو قدر", + "MATH_ONLIST_TOOLTIP_MIN": "لسٽ ۾ ننڍي کان ننڍو قدر ڄاڻايو.", + "MATH_ONLIST_OPERATOR_MAX": "لسٽ جو وڏي ۾ وڏو قدر", + "MATH_ONLIST_TOOLTIP_MAX": "لسٽ ۾ وڏي کان وڏو قدر ڄاڻايو.", + "MATH_ONLIST_OPERATOR_AVERAGE": "لسٽ جي سراسري", + "MATH_ONLIST_OPERATOR_MEDIAN": "لسٽ جو مڌيان", + "MATH_ONLIST_TOOLTIP_MEDIAN": "لسٽ جو مڌيان انگ ڄاڻايو.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "شامل ٿيو", + "TEXT_INDEXOF_INPUT_INTEXT": "متن ۾", + "TEXT_CHARAT_INPUT_INTEXT": "متن ۾", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "متن ۾", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "وڏن اکرن ڏانهن", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "ننڍن اکر ڏانهن", + "TEXT_PRINT_TITLE": "ڇاپيو %1", + "TEXT_PRINT_TOOLTIP": "ڄاڻايل تحرير، انگ يا ڪو ٻيو قدر ڇاپيو.", + "LISTS_CREATE_EMPTY_TITLE": "خالي فهرست تخليق ڪريو", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "لسٽ", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "فهرست ۾ ڪا شي شامل ڪريو.", + "LISTS_INLIST": "فهرست ۾", + "LISTS_GET_INDEX_REMOVE": "هٽايو", + "LISTS_GET_INDEX_FROM_END": "# آخر کان", + "LISTS_GET_INDEX_FIRST": "پهريون", + "LISTS_GET_INDEX_LAST": "آخري", + "LISTS_GET_INDEX_RANDOM": "بي ترتيب", + "LISTS_SET_INDEX_SET": "ميڙ", + "LISTS_SET_INDEX_INSERT": "تي داخل ڪريو", + "LISTS_SET_INDEX_INPUT_TO": "جيان", + "LISTS_GET_SUBLIST_END_FROM_START": "ڏانهن #", + "LISTS_GET_SUBLIST_END_FROM_END": "ڏانهن # آخر کان", + "LISTS_GET_SUBLIST_END_LAST": "آخري ڏانهن", + "PROCEDURES_DEFNORETURN_TITLE": "ڏانهن", + "PROCEDURES_DEFNORETURN_PROCEDURE": "ڪجھ ڪريو", + "PROCEDURES_BEFORE_PARAMS": "سان:", + "PROCEDURES_CALL_BEFORE_PARAMS": "سان:", + "PROCEDURES_DEFRETURN_RETURN": "واپس ورو", + "PROCEDURES_MUTATORCONTAINER_TITLE": "ان پُٽس", + "PROCEDURES_CREATE_DO": "تخليق ڪريو '%1'" +} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/shn.json b/src/opsoro/server/static/js/blockly/msg/json/shn.json similarity index 96% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/shn.json rename to src/opsoro/server/static/js/blockly/msg/json/shn.json index 9fa21e1..0f747e5 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/shn.json +++ b/src/opsoro/server/static/js/blockly/msg/json/shn.json @@ -20,9 +20,6 @@ "DISABLE_BLOCK": "ဢမ်ႇၸၢင်ႈပလွၵ်ႉ", "ENABLE_BLOCK": "ၵမ်ႉထႅမ်ပၼ် ပလွၵ်ႉ", "HELP": "ၸွႆႈထႅမ်", - "CHAT": "​ပေႃႉလိၵ်ႈ ၼႂ်းလွၵ်းၼႆႉသေ ၶျၢတ်ႉၸူး ၵေႃႉႁူမ်ႈႁဵတ်းႁူမ်ႈသၢင်ႈ ၸဝ်ႈၵဝ်ႇ", - "AUTH": "ၶွပ်ႈၸႂ် ပၼ်ၶႂၢင်ႉႁပ်ႉဢဝ် ဢႅပ်ႉၼႆႉ တီႈၼႂ်းၵၢၼ်ၸဝ်ႈၵဝ်ႇသေယဝ်ႉ ၸဝ်ႈၵဝ်ႇ ႁႂ်ႈလႆႈသိမ်း ႁႂ်ႈလႆႈပိုၼ်ပၼ်သေၵမ်း", - "ME": "ၸဝ်ႈၵဝ်ႇ", "CHANGE_VALUE_TITLE": "လႅၵ်ႈလၢႆႈၼမ်ႉၵတ်ႉ", "NEW_VARIABLE": "လၢႆႈဢၼ်မႂ်ႇ", "NEW_VARIABLE_TITLE": "ၸိုဝ်ႈဢၼ်လၢႆႈမႂ်ႇ", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/sk.json b/src/opsoro/server/static/js/blockly/msg/json/sk.json similarity index 89% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/sk.json rename to src/opsoro/server/static/js/blockly/msg/json/sk.json index 5be412a..1c9be9e 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/sk.json +++ b/src/opsoro/server/static/js/blockly/msg/json/sk.json @@ -3,7 +3,11 @@ "authors": [ "Jaroslav.micek", "Marian.stano", - "Mark" + "Mark", + "Kusavica", + "Genhis", + "Lexected", + "Adams" ] }, "VARIABLES_DEFAULT_NAME": "prvok", @@ -15,6 +19,8 @@ "INLINE_INPUTS": "Riadkové vstupy", "DELETE_BLOCK": "Odstrániť blok", "DELETE_X_BLOCKS": "Odstrániť %1 blokov", + "DELETE_ALL_BLOCKS": "Zmazať všetkých %1 dielcov?", + "CLEAN_UP": "Narovnať bloky", "COLLAPSE_BLOCK": "Zvinúť blok", "COLLAPSE_ALL": "Zvinúť bloky", "EXPAND_BLOCK": "Rozvinúť blok", @@ -22,14 +28,16 @@ "DISABLE_BLOCK": "Vypnúť blok", "ENABLE_BLOCK": "Povoliť blok", "HELP": "Pomoc", - "CHAT": "Písaním do tohto políčka komunikujte so spolupracovníkmi!", - "AUTH": "Autorizujte prosím túto aplikáciu, aby ste mohli uložiť a zdieľať vašu prácu.", - "ME": "Ja", + "UNDO": "Späť", + "REDO": "Znova", "CHANGE_VALUE_TITLE": "Zmeniť hodnotu:", - "NEW_VARIABLE": "Nová premenná...", - "NEW_VARIABLE_TITLE": "Názov novej premennej:", "RENAME_VARIABLE": "Premenovať premennú...", "RENAME_VARIABLE_TITLE": "Premenovať všetky premenné '%1' na:", + "NEW_VARIABLE": "Vytvoriť premennú...", + "NEW_VARIABLE_TITLE": "Názov novej premennej:", + "VARIABLE_ALREADY_EXISTS": "Premenná s názvom %1 už existuje.", + "DELETE_VARIABLE_CONFIRMATION": "Odstrániť %1 použití premennej '%2'?", + "DELETE_VARIABLE": "Odstrániť premennú '%1'", "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Zvoľte farbu z palety.", "COLOUR_RANDOM_TITLE": "náhodná farba", @@ -95,6 +103,9 @@ "LOGIC_TERNARY_TOOLTIP": "Skontroluj podmienku testom. Ak je podmienka pravda, vráť hodnotu \"ak pravda\", inak vráť hodnotu \"ak nepravda\".", "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Číslo.", + "MATH_TRIG_ASIN": "arcsin", + "MATH_TRIG_ACOS": "arccos", + "MATH_TRIG_ATAN": "arctan", "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_ARITHMETIC_TOOLTIP_ADD": "Vráť súčet dvoch čísel.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Vráť rozdiel dvoch čísel.", @@ -177,7 +188,7 @@ "TEXT_LENGTH_TOOLTIP": "Vráti počet písmen (s medzerami) v zadanom texte.", "TEXT_ISEMPTY_TITLE": "%1 je prázdny", "TEXT_ISEMPTY_TOOLTIP": "Vráti hodnotu pravda, ak zadaný text je prázdny.", - "TEXT_INDEXOF_TOOLTIP": "Vráti index prvého/posledného výskytu prvého textu v druhom texte. Ak nenájde, vráti 0.", + "TEXT_INDEXOF_TOOLTIP": "Vráti index prvého/posledného výskytu prvého textu v druhom texte. Ak nenájde, vráti %1.", "TEXT_INDEXOF_INPUT_INTEXT": "v texte", "TEXT_INDEXOF_OPERATOR_FIRST": "nájdi prvý výskyt textu", "TEXT_INDEXOF_OPERATOR_LAST": "nájdi posledný výskyt textu", @@ -210,6 +221,12 @@ "TEXT_PROMPT_TYPE_NUMBER": "výzva na zadanie čísla so správou", "TEXT_PROMPT_TOOLTIP_NUMBER": "Výzva pre používateľa na zadanie čísla.", "TEXT_PROMPT_TOOLTIP_TEXT": "Výzva pre používateľa na zadanie textu.", + "TEXT_COUNT_MESSAGE0": "počet výskytov %1 v %2", + "TEXT_COUNT_TOOLTIP": "Počet výskytov textu nachádzajúcom sa v inom texte.", + "TEXT_REPLACE_MESSAGE0": "zameniť %1 za %2 v reťazci %3", + "TEXT_REPLACE_TOOLTIP": "Zameniť všetky výskyty textu za iný text.", + "TEXT_REVERSE_MESSAGE0": "text odzadu %1", + "TEXT_REVERSE_TOOLTIP": "Obrátiť poradie písmen v texte.", "LISTS_CREATE_EMPTY_TITLE": "prázdny zoznam", "LISTS_CREATE_EMPTY_TOOLTIP": "Vráti zoznam nulovej dĺžky, ktorý neobsahuje žiadne prvky.", "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", @@ -227,7 +244,7 @@ "LISTS_INLIST": "v zozname", "LISTS_INDEX_OF_FIRST": "nájdi prvý výskyt prvku", "LISTS_INDEX_OF_LAST": "nájdi posledný výskyt prvku", - "LISTS_INDEX_OF_TOOLTIP": "Vráti index prvého/posledného výskytu prvku v zozname. Ak nenašiel, vráti 0.", + "LISTS_INDEX_OF_TOOLTIP": "Vráti index prvého/posledného výskytu prvku v zozname. Ak sa nič nenašlo, vráti %1.", "LISTS_GET_INDEX_GET": "zisti", "LISTS_GET_INDEX_GET_REMOVE": "zisti a odstráň", "LISTS_GET_INDEX_REMOVE": "odstráň", @@ -235,31 +252,28 @@ "LISTS_GET_INDEX_FIRST": "prvý", "LISTS_GET_INDEX_LAST": "posledný", "LISTS_GET_INDEX_RANDOM": "náhodný", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Vráti prvok na určenej pozícii v zozname. #1 je počiatočný prvok.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Vráti prvok na určenej pozícii v zozname. #1 je posledný prvok.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 je počiatočný prvok.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 je posledný prvok.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Vráti prvok na určenej pozícii v zozname.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Vráti počiatočný prvok zoznamu.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Vráti posledný prvok zoznamu.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Vráti náhodný prvok zoznamu.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Odstráni a vráti prvok z určenej pozície v zozname. #1 je prvý prvok.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Odstráni a vráti prvok z určenej pozície v zozname. #1 je posledný prvok.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Odstráni a vráti prvok z určenej pozície v zozname.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Odstráni a vráti prvý prvok v zozname.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Odstráni a vráti posledný prvok v zozname.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Odstráni a vráti náhodný prvok v zozname.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Odstráni prvok na určenej pozícii v zozname. #1 je prvý prvok.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Odstráni prvok na určenej pozícii v zozname. #1 je posledný prvok.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Odstráni prvok na určenej pozícii v zozname.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Odstráni prvý prvok v zozname.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Odstráni posledný prvok v zozname.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Odstráni náhodný prvok v zozname.", "LISTS_SET_INDEX_SET": "nastaviť", "LISTS_SET_INDEX_INSERT": "vložiť na", "LISTS_SET_INDEX_INPUT_TO": "ako", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Nastaví prvok na určenej pozícii v zozname. #1 je prvý prvok.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Nastaví prvok na určenej pozícii v zozname. #1 je posledný prvok.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Nastaví prvok na určenej pozícii v zozname.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Nastaví prvý prvok v zozname.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Nastaví posledný prvok v zozname.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Nastaví posledný prvok v zozname.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Vsunie prvok na určenú pozíciu v zozname. #1 je prvý prvok.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Vsunie prvok na určenú pozíciu v zozname. #1 je posledný prvok.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Vsunie prvok na určenú pozíciu v zozname.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Vsunie prvok na začiatok zoznamu.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Pripojí prvok na koniec zoznamu.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Vsunie prvok na náhodné miesto v zozname.", @@ -270,6 +284,14 @@ "LISTS_GET_SUBLIST_END_FROM_END": "po # od konca", "LISTS_GET_SUBLIST_END_LAST": "po koniec", "LISTS_GET_SUBLIST_TOOLTIP": "Skopíruje určený úsek zoznamu.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "zoradiť %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Zoradiť kópiu zoznamu.", + "LISTS_SORT_ORDER_ASCENDING": "Vzostupne", + "LISTS_SORT_ORDER_DESCENDING": "Zostupne", + "LISTS_SORT_TYPE_NUMERIC": "numericky", + "LISTS_SORT_TYPE_TEXT": "abecedne", + "LISTS_SORT_TYPE_IGNORECASE": "abecedne, ignorovať veľkosť písmen", "LISTS_SPLIT_LIST_FROM_TEXT": "vytvoriť zoznam z textu", "LISTS_SPLIT_TEXT_FROM_LIST": "vytvoriť text zo zoznamu", "LISTS_SPLIT_WITH_DELIMITER": "s oddeľovačom", @@ -285,6 +307,7 @@ "PROCEDURES_BEFORE_PARAMS": "s:", "PROCEDURES_CALL_BEFORE_PARAMS": "s:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Vytvorí funciu bez výstupu.", + "PROCEDURES_DEFNORETURN_COMMENT": "Doplň, čo robí táto funkcia...", "PROCEDURES_DEFRETURN_RETURN": "vrátiť", "PROCEDURES_DEFRETURN_TOOLTIP": "Vytvorí funkciu s výstupom.", "PROCEDURES_ALLOW_STATEMENTS": "povoliť príkazy", diff --git a/src/opsoro/server/static/js/blockly/msg/json/sl.json b/src/opsoro/server/static/js/blockly/msg/json/sl.json new file mode 100644 index 0000000..0fbb18a --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/sl.json @@ -0,0 +1,363 @@ +{ + "@metadata": { + "authors": [ + "Anzeljg", + "Miloš Košir", + "Dbc334" + ] + }, + "VARIABLES_DEFAULT_NAME": "element", + "TODAY": "Danes", + "DUPLICATE_BLOCK": "Podvoji", + "ADD_COMMENT": "Dodaj komentar", + "REMOVE_COMMENT": "Odstrani komentar", + "EXTERNAL_INPUTS": "Vnosi zunaj", + "INLINE_INPUTS": "Vnosi v vrsti", + "DELETE_BLOCK": "Izbriši kocko", + "DELETE_X_BLOCKS": "Izbriši kocke", + "DELETE_ALL_BLOCKS": "Izbrišem vseh %1 kock?", + "CLEAN_UP": "Ponastavi kocke", + "COLLAPSE_BLOCK": "Skrči kocko", + "COLLAPSE_ALL": "Skrči kocke", + "EXPAND_BLOCK": "Razširi kocko", + "EXPAND_ALL": "Razširi kocke", + "DISABLE_BLOCK": "Onemogoči kocko", + "ENABLE_BLOCK": "Omogoči kocko", + "HELP": "Pomoč", + "UNDO": "Razveljavi", + "REDO": "Ponovi", + "CHANGE_VALUE_TITLE": "Spremeni vrednost:", + "RENAME_VARIABLE": "Preimenuj spremenljivko...", + "RENAME_VARIABLE_TITLE": "Preimenuj vse spremenljivke '%1' v:", + "NEW_VARIABLE": "Ustvari spremenljivko ...", + "NEW_VARIABLE_TITLE": "Ime nove spremenljivke:", + "VARIABLE_ALREADY_EXISTS": "Spremenljivka »%1« že obstaja.", + "DELETE_VARIABLE_CONFIRMATION": "Izbrišem %1 uporab spremenljivke »%2«?", + "DELETE_VARIABLE": "Izbriši spremenljivko »%1«", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", + "COLOUR_PICKER_TOOLTIP": "Izberi barvo s palete.", + "COLOUR_RANDOM_TITLE": "naključna barva", + "COLOUR_RANDOM_TOOLTIP": "Izbere naključno barvo.", + "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", + "COLOUR_RGB_TITLE": "določena barva", + "COLOUR_RGB_RED": "rdeča", + "COLOUR_RGB_GREEN": "zelena", + "COLOUR_RGB_BLUE": "modra", + "COLOUR_RGB_TOOLTIP": "Ustvari barvo z določeno količino rdeče, zelene in modre. Vse vrednosti morajo biti med 0 in 100.", + "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", + "COLOUR_BLEND_TITLE": "mešanica", + "COLOUR_BLEND_COLOUR1": "barva 1", + "COLOUR_BLEND_COLOUR2": "barva 2", + "COLOUR_BLEND_RATIO": "razmerje", + "COLOUR_BLEND_TOOLTIP": "Zmeša dve barvi v danem razmerju (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "ponavljaj %1 krat", + "CONTROLS_REPEAT_INPUT_DO": "izvedi", + "CONTROLS_REPEAT_TOOLTIP": "Kocke se izvedejo večkrat.", + "CONTROLS_WHILEUNTIL_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ponavljaj", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ponavljaj dokler", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Kocke se izvajajo dokler je vrednost resnična.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Kocke se izvajajo dokler je vrednost neresnična.", + "CONTROLS_FOR_HELPURL": "https://github.com/google/blockly/wiki/Loops#count-with", + "CONTROLS_FOR_TOOLTIP": "Vrednost spremenljivke '%1' se spreminja od začetnega števila do končnega števila, z določenim korakom. Pri tem se izvedejo določene kocke.", + "CONTROLS_FOR_TITLE": "štej s/z %1 od %2 do %3 s korakom %4", + "CONTROLS_FOREACH_HELPURL": "https://github.com/google/blockly/wiki/Loops#for-each", + "CONTROLS_FOREACH_TITLE": "za vsak element %1 v seznamu %2", + "CONTROLS_FOREACH_TOOLTIP": "Za vsak element v seznamu, nastavi spremenljivko '%1' na ta element. Pri tem se izvedejo določene kocke.", + "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "izstopi iz zanke", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "nadaljuj z naslednjo ponovitvijo zanke", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Izstopi iz trenutne zanke.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Preskoči preostanek te zanke in nadaljuje z naslednjo ponovitvijo.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Pozor: To kocko lahko uporabiš samo znotraj zanke.", + "CONTROLS_IF_HELPURL": "https://github.com/google/blockly/wiki/IfElse", + "CONTROLS_IF_TOOLTIP_1": "Če je vrednost resnična, izvedi določene kocke.", + "CONTROLS_IF_TOOLTIP_2": "Če je vrednost resnična, izvedi prvo skupino kock. Sicer izvedi drugo skupino kock.", + "CONTROLS_IF_TOOLTIP_3": "Če je prva vrednost resnična, izvedi prvo skupino kock. Sicer, če je resnična druga vrednost, izvedi drugo skupino kock.", + "CONTROLS_IF_TOOLTIP_4": "Če je prva vrednost resnična, izvedi prvo skupino kock. Sicer, če je resnična druga vrednost, izvedi drugo skupino kock. Če nobena izmed vrednosti ni resnična, izvedi zadnjo skupino kock.", + "CONTROLS_IF_MSG_IF": "če", + "CONTROLS_IF_MSG_ELSEIF": "sicer če", + "CONTROLS_IF_MSG_ELSE": "sicer", + "CONTROLS_IF_IF_TOOLTIP": "Dodaj, odstrani ali spremeni vrstni red odsekov za ponovno nastavitev »če« kocke.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Dodaj pogoj »če« kocki.", + "CONTROLS_IF_ELSE_TOOLTIP": "Dodaj končni pogoj »če« kocki.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Vrne resnično, če sta vnosa enaka.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Vrne resnično, če vnosa nista enaka.", + "LOGIC_COMPARE_TOOLTIP_LT": "Vrne resnično, če je prvi vnos manjši od drugega.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Vrne resnično, če je prvi vnos manjši ali enak drugemu.", + "LOGIC_COMPARE_TOOLTIP_GT": "Vrne resnično, če je prvi vnos večji od drugega.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Vrne resnično, če je prvi vnos večji ali enak drugemu.", + "LOGIC_OPERATION_HELPURL": "https://github.com/google/blockly/wiki/Logic#logical-operations", + "LOGIC_OPERATION_TOOLTIP_AND": "Vrne resnično, če sta oba vnosa resnična.", + "LOGIC_OPERATION_AND": "in", + "LOGIC_OPERATION_TOOLTIP_OR": "Vrne resnično, če je vsaj eden od vnosov resničen.", + "LOGIC_OPERATION_OR": "ali", + "LOGIC_NEGATE_HELPURL": "https://github.com/google/blockly/wiki/Logic#not", + "LOGIC_NEGATE_TITLE": "ne %1", + "LOGIC_NEGATE_TOOLTIP": "Vrne resnično, če je vnos neresničen. Vrne neresnično, če je vnos resničen.", + "LOGIC_BOOLEAN_HELPURL": "https://github.com/google/blockly/wiki/Logic#values", + "LOGIC_BOOLEAN_TRUE": "resnično", + "LOGIC_BOOLEAN_FALSE": "neresnično", + "LOGIC_BOOLEAN_TOOLTIP": "Vrne resnično ali neresnično.", + "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", + "LOGIC_NULL": "prazno", + "LOGIC_NULL_TOOLTIP": "Vrne prazno.", + "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", + "LOGIC_TERNARY_CONDITION": "test", + "LOGIC_TERNARY_IF_TRUE": "če resnično", + "LOGIC_TERNARY_IF_FALSE": "če neresnično", + "LOGIC_TERNARY_TOOLTIP": "Preveri pogoj v »testu«. Če je pogoj resničen, potem vrne vrednost »če resnično«; sicer vrne vrednost »če neresnično«.", + "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", + "MATH_NUMBER_TOOLTIP": "Število.", + "MATH_ADDITION_SYMBOL": "+", + "MATH_SUBTRACTION_SYMBOL": "-", + "MATH_DIVISION_SYMBOL": "÷", + "MATH_MULTIPLICATION_SYMBOL": "×", + "MATH_POWER_SYMBOL": "^", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "asin", + "MATH_TRIG_ACOS": "acos", + "MATH_TRIG_ATAN": "atan", + "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Vrne vsoto dveh števil.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Vrne razliko dveh števil.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Vrne zmnožek dveh števil.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Vrne kvocient dveh števil.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Vrne prvo število na potenco drugega števila.", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_OP_ROOT": "kvadratni koren", + "MATH_SINGLE_TOOLTIP_ROOT": "Vrne kvadratni koren števila.", + "MATH_SINGLE_OP_ABSOLUTE": "absolutno", + "MATH_SINGLE_TOOLTIP_ABS": "Vrne absolutno vrednost števila.", + "MATH_SINGLE_TOOLTIP_NEG": "Vrne negacijo števila.", + "MATH_SINGLE_TOOLTIP_LN": "Vrne naravni logaritem števila.", + "MATH_SINGLE_TOOLTIP_LOG10": "Vrne desetiški logaritem števila.", + "MATH_SINGLE_TOOLTIP_EXP": "Vrne e na potenco števila.", + "MATH_SINGLE_TOOLTIP_POW10": "Vrne 10 na potenco števila.", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "MATH_TRIG_TOOLTIP_SIN": "Vrne sinus kota v stopinjah (ne radianih).", + "MATH_TRIG_TOOLTIP_COS": "Vrne kosinus kota v stopinjah (ne radianih).", + "MATH_TRIG_TOOLTIP_TAN": "Vrne tangens kota v stopinjah (ne radianih).", + "MATH_TRIG_TOOLTIP_ASIN": "Vrne arkus sinus števila.", + "MATH_TRIG_TOOLTIP_ACOS": "Vrne arkus kosinus števila.", + "MATH_TRIG_TOOLTIP_ATAN": "Vrne arkus tangens števila.", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "Vrne eno izmed običajnih konstant: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ali ∞ (neskončno).", + "MATH_IS_EVEN": "je sodo", + "MATH_IS_ODD": "je liho", + "MATH_IS_PRIME": "je praštevilo", + "MATH_IS_WHOLE": "je celo", + "MATH_IS_POSITIVE": "je pozitivno", + "MATH_IS_NEGATIVE": "je negativno", + "MATH_IS_DIVISIBLE_BY": "je deljivo s/z", + "MATH_IS_TOOLTIP": "Preveri, če je število sodo, liho, praštevilo, celo, pozitivno, negativno ali, če je deljivo z določenim številom. Vrne resnično ali neresnično.", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "spremeni %1 za %2", + "MATH_CHANGE_TOOLTIP": "Prišteje število k spremenljivki '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Zaokroži število navzgor ali navzdol.", + "MATH_ROUND_OPERATOR_ROUND": "zaokroži", + "MATH_ROUND_OPERATOR_ROUNDUP": "zaokroži navzgor", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "zaokroži navzdol", + "MATH_ONLIST_OPERATOR_SUM": "vsota seznama", + "MATH_ONLIST_TOOLTIP_SUM": "Vrne vsoto vseh števil na seznamu.", + "MATH_ONLIST_OPERATOR_MIN": "minimum seznama", + "MATH_ONLIST_TOOLTIP_MIN": "Vrne najmanjše število na seznamu.", + "MATH_ONLIST_OPERATOR_MAX": "maksimum seznama", + "MATH_ONLIST_TOOLTIP_MAX": "Vrne največje število na seznamu.", + "MATH_ONLIST_OPERATOR_AVERAGE": "povprečje seznama", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Vrne povprečje (aritmetično sredino) števil na seznamu.", + "MATH_ONLIST_OPERATOR_MEDIAN": "mediana seznama", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Vrne mediano števil na seznamu.", + "MATH_ONLIST_OPERATOR_MODE": "modus seznama", + "MATH_ONLIST_TOOLTIP_MODE": "Vrne seznam najpogostejšega elementa(-ov) na seznamu.", + "MATH_ONLIST_OPERATOR_STD_DEV": "standardni odklon seznama", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Vrne standardni odklon seznama.", + "MATH_ONLIST_OPERATOR_RANDOM": "naključni element seznama", + "MATH_ONLIST_TOOLTIP_RANDOM": "Vrne naključno število izmed števil na seznamu.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "ostanek pri %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Vrne ostanek pri deljenju dveh števil.", + "MATH_CONSTRAIN_HELPURL": "https://en.wikipedia.org/wiki/Clamping_%28graphics%29", + "MATH_CONSTRAIN_TITLE": "omeji %1 na najmanj %2 in največ %3", + "MATH_CONSTRAIN_TOOLTIP": "Omeji število, da bo med določenima (vključenima) mejama.", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "naključno število med %1 in %2", + "MATH_RANDOM_INT_TOOLTIP": "Vrne naključno število med dvema določenima mejama, vključno z mejama.", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "naključni ulomek", + "MATH_RANDOM_FLOAT_TOOLTIP": "Vrne naključni ulomek med (vključno) 0.0 in 1.0 (izključno).", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Črka, beseda ali vrstica besedila.", + "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", + "TEXT_JOIN_TITLE_CREATEWITH": "ustvari besedilo iz", + "TEXT_JOIN_TOOLTIP": "Ustvari besedilo tako, da združi poljubno število elementov.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "združi", + "TEXT_CREATE_JOIN_TOOLTIP": "Doda, odstrani ali spremeni vrstni red elementov tega besedila.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Doda element k besedilu.", + "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", + "TEXT_APPEND_TO": "k", + "TEXT_APPEND_APPENDTEXT": "dodaj besedilo", + "TEXT_APPEND_TOOLTIP": "Doda besedilo k spremenljivki '%1'.", + "TEXT_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", + "TEXT_LENGTH_TITLE": "dolžina %1", + "TEXT_LENGTH_TOOLTIP": "Vrne število črk oz. znakov (vključno s presledki) v določenem besedilu.", + "TEXT_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Text#checking-for-empty-text", + "TEXT_ISEMPTY_TITLE": "%1 je prazno", + "TEXT_ISEMPTY_TOOLTIP": "Vrne resnično, če je določeno besedilo prazno.", + "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", + "TEXT_INDEXOF_TOOLTIP": "Vrne mesto (indeks) prve/zadnje pojavitve drugega besedila v prvem besedilu. Če besedila ne najde, vrne %1.", + "TEXT_INDEXOF_INPUT_INTEXT": "v besedilu", + "TEXT_INDEXOF_OPERATOR_FIRST": "najdi prvo pojavitev besedila", + "TEXT_INDEXOF_OPERATOR_LAST": "najdi zadnjo pojavitev besedila", + "TEXT_CHARAT_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-text", + "TEXT_CHARAT_INPUT_INTEXT": "iz besedila", + "TEXT_CHARAT_FROM_START": "vrni črko št.", + "TEXT_CHARAT_FROM_END": "vrni črko št. od konca", + "TEXT_CHARAT_FIRST": "vrni prvo črko", + "TEXT_CHARAT_LAST": "vrni zadnjo črko", + "TEXT_CHARAT_RANDOM": "vrni naključno črko", + "TEXT_CHARAT_TOOLTIP": "Vrne črko na določenem mestu v besedilu.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Vrne določen del besedila.", + "TEXT_GET_SUBSTRING_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "iz besedila", + "TEXT_GET_SUBSTRING_START_FROM_START": "vrni del od črke št.", + "TEXT_GET_SUBSTRING_START_FROM_END": "vrni del od črke št. od konca", + "TEXT_GET_SUBSTRING_START_FIRST": "vrni del od prve črke", + "TEXT_GET_SUBSTRING_END_FROM_START": "do črke št.", + "TEXT_GET_SUBSTRING_END_FROM_END": "do črke št. od konca", + "TEXT_GET_SUBSTRING_END_LAST": "do zadnje črke", + "TEXT_CHANGECASE_HELPURL": "https://github.com/google/blockly/wiki/Text#adjusting-text-case", + "TEXT_CHANGECASE_TOOLTIP": "Vrne kopijo besedila v drugi obliki.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "v VELIKE ČRKE", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "v male črke", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "v Velike Začetnice", + "TEXT_TRIM_HELPURL": "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces", + "TEXT_TRIM_TOOLTIP": "Vrne kopijo besedila z odstranjenimi presledki z ene ali obeh strani.", + "TEXT_TRIM_OPERATOR_BOTH": "odstrani presledke z obeh strani", + "TEXT_TRIM_OPERATOR_LEFT": "odstrani presledke z leve strani", + "TEXT_TRIM_OPERATOR_RIGHT": "odstrani presledke z desne strani", + "TEXT_PRINT_HELPURL": "https://github.com/google/blockly/wiki/Text#printing-text", + "TEXT_PRINT_TITLE": "izpiši %1", + "TEXT_PRINT_TOOLTIP": "Izpiše določeno besedilo, število ali drugo vrednost.", + "TEXT_PROMPT_HELPURL": "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user", + "TEXT_PROMPT_TYPE_TEXT": "vprašaj za besedilo s sporočilom", + "TEXT_PROMPT_TYPE_NUMBER": "vprašaj za število s sporočilom", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Vpraša uporabnika za vnos števila.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Vpraša uporabnika za vnos besedila.", + "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", + "LISTS_CREATE_EMPTY_TITLE": "ustvari prazen seznam", + "LISTS_CREATE_EMPTY_TOOLTIP": "Vrne seznam, dolžine 0, ki ne vsebuje nobenih podatkov.", + "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", + "LISTS_CREATE_WITH_TOOLTIP": "Ustvari seznam s poljubnim številom elementov.", + "LISTS_CREATE_WITH_INPUT_WITH": "ustvari seznam s/z", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "seznam", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Doda, odstrani ali spremeni vrstni red elementov tega seznama.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Doda element seznamu.", + "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", + "LISTS_REPEAT_TOOLTIP": "Ustvari seznam z danim elementom, ki se poljubno mnogo krat ponovi.", + "LISTS_REPEAT_TITLE": "ustvari seznam z elementom %1, ki se ponovi %2 krat", + "LISTS_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", + "LISTS_LENGTH_TITLE": "dolžina %1", + "LISTS_LENGTH_TOOLTIP": "Vrne dolžino seznama.", + "LISTS_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#is-empty", + "LISTS_ISEMPTY_TITLE": "%1 je prazen", + "LISTS_ISEMPTY_TOOLTIP": "Vrne resnično, če je seznam prazen.", + "LISTS_INLIST": "v seznamu", + "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", + "LISTS_INDEX_OF_FIRST": "najdi prvo pojavitev elementa", + "LISTS_INDEX_OF_LAST": "najdi zadnjo pojavitev elementa", + "LISTS_INDEX_OF_TOOLTIP": "Vrne mesto (indeks) prve/zadnje pojavitve elementa v seznamu. Če elementa ne najde, vrne %1.", + "LISTS_GET_INDEX_GET": "vrni", + "LISTS_GET_INDEX_GET_REMOVE": "odstrani in vrni", + "LISTS_GET_INDEX_REMOVE": "odstrani", + "LISTS_GET_INDEX_FROM_START": "št.", + "LISTS_GET_INDEX_FROM_END": "mesto št. od konca", + "LISTS_GET_INDEX_FIRST": "prvo mesto", + "LISTS_GET_INDEX_LAST": "zadnje mesto", + "LISTS_GET_INDEX_RANDOM": "naključno mesto", + "LISTS_INDEX_FROM_START_TOOLTIP": "Prvi element je št. %1.", + "LISTS_INDEX_FROM_END_TOOLTIP": "Zadnji element je št. %1.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Vrne element na določenem mestu v seznamu.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Vrne prvi element seznama.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Vrne zadnji element seznama.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Vrne naključni element seznama.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Odstrani in vrne element na določenem mestu v seznamu.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Odstrani in vrne prvi element seznama.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Odstrani in vrne zadnji element seznama.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Odstrani in vrne naključni element seznama.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Odstrani element na določenem mestu v seznamu.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Odstrani prvi element seznama.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Odstrani zadnji element seznama.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Odstrani naključni element seznama.", + "LISTS_SET_INDEX_HELPURL": "https://github.com/google/blockly/wiki/Lists#in-list--set", + "LISTS_SET_INDEX_SET": "nastavi na", + "LISTS_SET_INDEX_INSERT": "vstavi na", + "LISTS_SET_INDEX_INPUT_TO": "element", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Nastavi element na določenem mestu v seznamu.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Nastavi prvi element seznama.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Nastavi zadnji element seznama.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Nastavi naključni element seznama.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Vstavi element na določeno mesto v seznamu.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Vstavi element na začetek seznama.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Doda element na konec seznama.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Vstavi element na naključno mesto v seznamu.", + "LISTS_GET_SUBLIST_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-a-sublist", + "LISTS_GET_SUBLIST_START_FROM_START": "ustvari podseznam od mesta št.", + "LISTS_GET_SUBLIST_START_FROM_END": "ustvari podseznam od mesta št. od konca", + "LISTS_GET_SUBLIST_START_FIRST": "ustvari podseznam od prvega mesta", + "LISTS_GET_SUBLIST_END_FROM_START": "do mesta št.", + "LISTS_GET_SUBLIST_END_FROM_END": "do mesta št. od konca", + "LISTS_GET_SUBLIST_END_LAST": "do zadnjega mesta", + "LISTS_GET_SUBLIST_TOOLTIP": "Ustvari nov seznam, kot kopijo določenega dela seznama.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "uredi %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Uredi kopijo seznama.", + "LISTS_SORT_ORDER_ASCENDING": "naraščajoče", + "LISTS_SORT_ORDER_DESCENDING": "padajoče", + "LISTS_SORT_TYPE_NUMERIC": "številčno", + "LISTS_SORT_TYPE_TEXT": "abecedno", + "LISTS_SORT_TYPE_IGNORECASE": "abecedno, brez velikosti črk", + "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", + "LISTS_SPLIT_LIST_FROM_TEXT": "ustvari seznam iz besedila", + "LISTS_SPLIT_TEXT_FROM_LIST": "ustvari besedilo iz seznama", + "LISTS_SPLIT_WITH_DELIMITER": "z ločilom", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Razdruži besedilo v seznam besedil. Za razdruževanje besedila uporabi ločilo.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Združi seznam besedil v eno besedilo, ločeno z ločilom.", + "VARIABLES_GET_HELPURL": "https://github.com/google/blockly/wiki/Variables#get", + "VARIABLES_GET_TOOLTIP": "Vrne vrednost spremenljivke.", + "VARIABLES_GET_CREATE_SET": "Ustvari 'nastavi %1'", + "VARIABLES_SET_HELPURL": "https://github.com/google/blockly/wiki/Variables#set", + "VARIABLES_SET": "nastavi %1 na %2", + "VARIABLES_SET_TOOLTIP": "Nastavi, da je vrednost spremenljivke enaka vnosu.", + "VARIABLES_SET_CREATE_GET": "Ustvari 'vrni %1'", + "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFNORETURN_TITLE": "izvedi", + "PROCEDURES_DEFNORETURN_PROCEDURE": "nekaj", + "PROCEDURES_BEFORE_PARAMS": "s/z:", + "PROCEDURES_CALL_BEFORE_PARAMS": "s/z:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Ustvari funkcijo brez izhoda.", + "PROCEDURES_DEFNORETURN_COMMENT": "Opišite funkcijo ...", + "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFRETURN_RETURN": "vrni", + "PROCEDURES_DEFRETURN_TOOLTIP": "Ustvari funkcijo z izhodom.", + "PROCEDURES_ALLOW_STATEMENTS": "dovoli korake", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Pozor: Ta funkcija ima podvojene parametre.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Izvede uporabniško funkcijo '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLRETURN_TOOLTIP": "Izvede uporabniško funkcijo '%1' in uporabi njen izhod.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "vnosi", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Doda, odstrani ali spremeni vrstni red vnosov te funkcije.", + "PROCEDURES_MUTATORARG_TITLE": "ime vnosa:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Funkciji doda vnos.", + "PROCEDURES_HIGHLIGHT_DEF": "Označi definicijo funkcije", + "PROCEDURES_CREATE_DO": "Ustvari '%1'", + "PROCEDURES_IFRETURN_TOOLTIP": "Če je vrednost resnična, vrne drugo vrednost.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Pozor: To kocko lahko uporabiš samo znotraj definicije funkcije." +} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/sq.json b/src/opsoro/server/static/js/blockly/msg/json/sq.json similarity index 91% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/sq.json rename to src/opsoro/server/static/js/blockly/msg/json/sq.json index 74b0555..0cd7936 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/sq.json +++ b/src/opsoro/server/static/js/blockly/msg/json/sq.json @@ -1,10 +1,13 @@ { "@metadata": { "authors": [ - "아라" + "아라", + "Liridon", + "Arianit" ] }, "VARIABLES_DEFAULT_NAME": "send", + "TODAY": "Sot", "DUPLICATE_BLOCK": "Kopjo", "ADD_COMMENT": "Vendos nje Koment", "REMOVE_COMMENT": "Fshij komentin", @@ -12,6 +15,8 @@ "INLINE_INPUTS": "Hyrjet e brendshme", "DELETE_BLOCK": "Fshij bllokun", "DELETE_X_BLOCKS": "Fshij %1 blloqe", + "DELETE_ALL_BLOCKS": "Fshijë të gjitha %1 të blloqeve?", + "CLEAN_UP": "Pastro blloqet", "COLLAPSE_BLOCK": "Mbyll bllokun", "COLLAPSE_ALL": "Mbyll blloqet", "EXPAND_BLOCK": "Zmadho bllokun", @@ -19,11 +24,16 @@ "DISABLE_BLOCK": "Çaktivizo bllokun", "ENABLE_BLOCK": "Aktivizo bllokun", "HELP": "Ndihmë", + "UNDO": "Zhbëj", + "REDO": "Ribëj", "CHANGE_VALUE_TITLE": "Ndrysho Vlerat:", - "NEW_VARIABLE": "Identifikatorë i ri...", - "NEW_VARIABLE_TITLE": "Emri i identifikatorit të ri:", "RENAME_VARIABLE": "Ndrysho emrin variables...", "RENAME_VARIABLE_TITLE": "Ndrysho emrin e te gjitha '%1' variablave ne :", + "NEW_VARIABLE": "Krijo variabël...", + "NEW_VARIABLE_TITLE": "Emri i identifikatorit të ri:", + "VARIABLE_ALREADY_EXISTS": "Një variabël e quajtur '%1' tashmë ekziston.", + "DELETE_VARIABLE_CONFIRMATION": "Fshi përdorimin %1 të variablës '%2'?", + "DELETE_VARIABLE": "Fshi variablën '%1'", "COLOUR_PICKER_HELPURL": "http://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Zgjidh nje ngjyre nga nje game ngjyrash.", "COLOUR_RANDOM_TITLE": "ngjyre e rastesishme", @@ -186,7 +196,7 @@ "TEXT_LENGTH_TOOLTIP": "Pergjigjet me nje numer shkronjash (duke perfshire hapesire) ne tekstin e dhene.", "TEXT_ISEMPTY_TITLE": "%1 eshte bosh", "TEXT_ISEMPTY_TOOLTIP": "Kthehet e vertete neqoftese teksti i dhene eshte bosh.", - "TEXT_INDEXOF_TOOLTIP": "Pergjigjet me indeksin e pare/fundit te rastisjes se tekstit te pare ne tekstin e dyte. Pergjigjet me 0 ne qofte se teksti nuk u gjet.", + "TEXT_INDEXOF_TOOLTIP": "Pergjigjet me indeksin e pare/fundit te rastisjes se tekstit te pare ne tekstin e dyte. Pergjigjet me %1 ne qofte se teksti nuk u gjet.", "TEXT_INDEXOF_INPUT_INTEXT": "ne tekst", "TEXT_INDEXOF_OPERATOR_FIRST": "gjej rastisjen e pare te tekstit", "TEXT_INDEXOF_OPERATOR_LAST": "gjej rastisjen e fundit te tekstit", @@ -219,6 +229,8 @@ "TEXT_PROMPT_TYPE_NUMBER": "kerko nje numer me njoftim", "TEXT_PROMPT_TOOLTIP_NUMBER": "Kerkoji perdoruesit nje numer.", "TEXT_PROMPT_TOOLTIP_TEXT": "Kerkoji perdoruesit ca tekst.", + "TEXT_COUNT_MESSAGE0": "numro %1 në %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "krijo një listë të zbrazët", "LISTS_CREATE_EMPTY_TOOLTIP": "Kthen një listë, te gjatësisë 0, duke mos përmbajtur asnjë regjistrim të të dhënave", @@ -236,7 +248,7 @@ "LISTS_INLIST": "në listë", "LISTS_INDEX_OF_FIRST": "gjen ndodhjen e parë të sendit", "LISTS_INDEX_OF_LAST": "gjen ndodhjen e fundit të sendit", - "LISTS_INDEX_OF_TOOLTIP": "Kthen indeksin e ndodhjes së parë/fudit të sendit në listë. Kthen 0 nëse teksti nuk është gjetur.", + "LISTS_INDEX_OF_TOOLTIP": "Kthen indeksin e ndodhjes së parë/fudit të sendit në listë. Kthen %1 nëse teksti nuk është gjetur.", "LISTS_GET_INDEX_GET": "merr", "LISTS_GET_INDEX_GET_REMOVE": "merr dhe fshij", "LISTS_GET_INDEX_REMOVE": "largo", @@ -245,31 +257,28 @@ "LISTS_GET_INDEX_FIRST": "i parë", "LISTS_GET_INDEX_LAST": "i fundit", "LISTS_GET_INDEX_RANDOM": "i rastësishëm", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Kthen një send në pozicionin e specifikuar në listë. #1 është sendi i parë.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Kthen një send në pozicionin e specifikuar në listë. #1 është sendi i fundit.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 është sendi i parë.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 është sendi i fundit.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Kthen një send në pozicionin e specifikuar në listë.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Rikthen tek artikulli i par në list.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Kthen artikullin e fundit në list.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Kthen një send të rastësishëm në listë.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Fshin dhe kthen sendin në pozicionin e specifikuar në listë. #1 është sendi i parë.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Fshin dhe kthen sendin në pozicionin e specifikuar në listë. #1 është sendi i fundit.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Fshin dhe kthen sendin në pozicionin e specifikuar në listë.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Fshin dhe kthen sendin e parë në listë.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Fshin dhe kthen sendin e fundit në listë.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Fshin dhe kthen një send të rastësishëm në listë.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Fshin sendin në pozicionin e specifikuar në listë. #1 është sendi i parë.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Fshin sendin në pozicionin e specifikuar në listë. #1 është sendi i fundit.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Fshin sendin në pozicionin e specifikuar në listë.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Fshin sendin e parë në listë.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Fshin sendin e fundit në listë.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Kthen një send të rastësishëm në listë.", "LISTS_SET_INDEX_SET": "vendos", "LISTS_SET_INDEX_INSERT": "fut në", "LISTS_SET_INDEX_INPUT_TO": "sikurse", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Vendos sendin në pozicionin e specifikuar në listë. #1 është sendi i parë.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Vendos sendin ne pozicionin e specifikuar në listë. #1 është sendi i fundit.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Vendos sendin në pozicionin e specifikuar në listë.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Vendos sendin e parë në listë.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Vendos sendin e fundit në listë.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Vendos një send të rastësishëm në listë.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Fut sendin në pozicionin e specifikuar të listës. #1 është sendi i parë.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Fut sendin në pozicionin e specifikuar të listës. #1 është sendi i fundit.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Fut sendin në pozicionin e specifikuar të listës.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Fut sendin në fillim të listës.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Bashkangjit sendin në fund të listës.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Fut sendin rastësisht në listë.", @@ -280,6 +289,16 @@ "LISTS_GET_SUBLIST_END_FROM_END": "tek # nga fundi", "LISTS_GET_SUBLIST_END_LAST": "tek i fundit", "LISTS_GET_SUBLIST_TOOLTIP": "Krijon në kopje të pjesës së specifikuar të listës.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "rendit %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Rendit një kopje të listës.", + "LISTS_SORT_ORDER_ASCENDING": "ngjitje", + "LISTS_SORT_ORDER_DESCENDING": "zbritje", + "LISTS_SORT_TYPE_NUMERIC": "numerike", + "LISTS_SORT_TYPE_TEXT": "alfabetike", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetike, injoro madhësinë e shkronjave", + "LISTS_SPLIT_LIST_FROM_TEXT": "bëj listë nga teksti", + "LISTS_SPLIT_TEXT_FROM_LIST": "bëj tekst nga lista", "VARIABLES_GET_TOOLTIP": "Pergjigjet me nje vlere te kesaj variable.", "VARIABLES_GET_CREATE_SET": "Krijo 'vendos %1", "VARIABLES_SET": "vendos %1 ne %2", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/sr.json b/src/opsoro/server/static/js/blockly/msg/json/sr.json similarity index 87% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/sr.json rename to src/opsoro/server/static/js/blockly/msg/json/sr.json index 6c71943..bc5b34c 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/sr.json +++ b/src/opsoro/server/static/js/blockly/msg/json/sr.json @@ -2,10 +2,13 @@ "@metadata": { "authors": [ "Rancher", - "아라" + "아라", + "Perevod16", + "Nikola Smolenski" ] }, "VARIABLES_DEFAULT_NAME": "ставка", + "TODAY": "Данас", "DUPLICATE_BLOCK": "Дуплирај", "ADD_COMMENT": "Додај коментар", "REMOVE_COMMENT": "Уклони коментар", @@ -13,6 +16,8 @@ "INLINE_INPUTS": "Унутрашњи улази", "DELETE_BLOCK": "Обриши блок", "DELETE_X_BLOCKS": "Обриши %1 блокова", + "DELETE_ALL_BLOCKS": "Да обришем свих %1 блокова?", + "CLEAN_UP": "Уклони блокове", "COLLAPSE_BLOCK": "Скупи блок", "COLLAPSE_ALL": "Скупи блокове", "EXPAND_BLOCK": "Прошири блок", @@ -20,11 +25,16 @@ "DISABLE_BLOCK": "Онемогући блок", "ENABLE_BLOCK": "Омогући блок", "HELP": "Помоћ", + "UNDO": "Опозови", + "REDO": "Понови", "CHANGE_VALUE_TITLE": "Промените вредност:", - "NEW_VARIABLE": "Нова променљива…", - "NEW_VARIABLE_TITLE": "Име нове променљиве:", "RENAME_VARIABLE": "Преименуј променљиву…", "RENAME_VARIABLE_TITLE": "Преименујте све „%1“ променљиве у:", + "NEW_VARIABLE": "Направи променљиву…", + "NEW_VARIABLE_TITLE": "Име нове променљиве:", + "VARIABLE_ALREADY_EXISTS": "Променљива под именом '%1' већ постоји.", + "DELETE_VARIABLE_CONFIRMATION": "Да обришем %1 употреба променљиве '%2'?", + "DELETE_VARIABLE": "Обриши променљиву '%1'", "COLOUR_PICKER_HELPURL": "https://sr.wikipedia.org/wiki/Боја", "COLOUR_PICKER_TOOLTIP": "Изаберите боју са палете.", "COLOUR_RANDOM_TITLE": "случајна боја", @@ -83,12 +93,12 @@ "LOGIC_NEGATE_TOOLTIP": "Враћа вредност „тачно“ ако је улаз нетачан. Враћа вредност „нетачно“ ако је улаз тачан.", "LOGIC_BOOLEAN_TRUE": "тачно", "LOGIC_BOOLEAN_FALSE": "нетачно", - "LOGIC_BOOLEAN_TOOLTIP": "враћа вредност или тачно или нетачно.", + "LOGIC_BOOLEAN_TOOLTIP": "Враћа или тачно или нетачно.", "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "без вредности", "LOGIC_NULL_TOOLTIP": "Враћа „без вредности“.", "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "тест", + "LOGIC_TERNARY_CONDITION": "проба", "LOGIC_TERNARY_IF_TRUE": "ако је тачно", "LOGIC_TERNARY_IF_FALSE": "ако је нетачно", "LOGIC_TERNARY_TOOLTIP": "Провери услов у 'test'. Ако је услов тачан, тада враћа 'if true' вредност; у другом случају враћа 'if false' вредност.", @@ -188,7 +198,7 @@ "TEXT_LENGTH_TOOLTIP": "Враћа број слова (уклјучујући размаке) у датом тексту.", "TEXT_ISEMPTY_TITLE": "%1 је празан", "TEXT_ISEMPTY_TOOLTIP": "Враћа тачно ако је доставлјени текст празан.", - "TEXT_INDEXOF_TOOLTIP": "Враћа однос првог/заднјег појавлјиванја текста у другом тексту. Врађа 0 ако текст није пронађен.", + "TEXT_INDEXOF_TOOLTIP": "Враћа однос првог/заднјег појавлјиванја текста у другом тексту. Врађа %1 ако текст није пронађен.", "TEXT_INDEXOF_INPUT_INTEXT": "у тексту", "TEXT_INDEXOF_OPERATOR_FIRST": "пронађи прво појављивање текста", "TEXT_INDEXOF_OPERATOR_LAST": "пронађи последње појављивање текста", @@ -215,7 +225,7 @@ "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "малим словима", "TEXT_CHANGECASE_OPERATOR_TITLECASE": "свака реч великим словом", "TEXT_TRIM_TOOLTIP": "Враћа копију текста са уклонјеним простором са једног од два краја.", - "TEXT_TRIM_OPERATOR_BOTH": "скратити простор са обе стране", + "TEXT_TRIM_OPERATOR_BOTH": "трим празнине са обе стране", "TEXT_TRIM_OPERATOR_LEFT": "скратити простор са леве стране", "TEXT_TRIM_OPERATOR_RIGHT": "скратити простор са десне стране", "TEXT_PRINT_TITLE": "прикажи %1", @@ -241,7 +251,7 @@ "LISTS_INLIST": "на списку", "LISTS_INDEX_OF_FIRST": "пронађи прво појављивање ставке", "LISTS_INDEX_OF_LAST": "пронађи последње појављивање ставке", - "LISTS_INDEX_OF_TOOLTIP": "Враћа однос првог/последнјег појавлјиванја ставке у листи. Враћа 0 ако се текст не наће.", + "LISTS_INDEX_OF_TOOLTIP": "Враћа број првог и/последњег уласка елемента у листу. Враћа %1 Ако елемент није пронађен.", "LISTS_GET_INDEX_GET": "преузми", "LISTS_GET_INDEX_GET_REMOVE": "преузми и уклони", "LISTS_GET_INDEX_REMOVE": "уклони", @@ -251,31 +261,28 @@ "LISTS_GET_INDEX_LAST": "последња", "LISTS_GET_INDEX_RANDOM": "случајна", "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Враћа ставку на одређену позицију на листи. #1 је прва ставка.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Враћа ставку на одређену позицију на листи. #1 је последња ставка.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 је прва ставка.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 је последња ставка.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Враћа ставку на одређену позицију на листи.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Враћа прву ставку на списку.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Враћа последњу ставку на списку.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Враћа случајну ставку са списка.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Уклања и враћа ставку са одређеног положаја на списку. #1 је прва ставка.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Уклања и враћа ставку са одређеног положаја на списку. #1 је последња ставка.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Уклања и враћа ставку са одређеног положаја на списку.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Уклања и враћа прву ставку са списка.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Уклања и враћа последњу ставку са списка.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Уклања и враћа случајну ставку са списка.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Уклања ставку са одређеног положаја на списку. #1 је прва ставка.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Уклања ставку са одређеног положаја на списку. #1 је последња ставка.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Уклања ставку са одређеног положаја на списку.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Уклања прву ставку са списка.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Уклања последњу ставку са списка.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Уклања случајну ставку са списка.", "LISTS_SET_INDEX_SET": "постави", "LISTS_SET_INDEX_INSERT": "убаци на", "LISTS_SET_INDEX_INPUT_TO": "као", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Поставља ставку на одређени положај на списку. #1 је прва ставка.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Поставља ставку на одређени положај на списку. #1 је последња ставка.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Поставља ставку на одређени положај на списку.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Поставља прву ставку на списку.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Поставља последњу ставку на списку.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Поставља случајну ставку на списку.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Убацује ставку на одређени положај на списку. #1 је прва ставка.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Убацује ставку на одређени положај на списку. #1 је последња ставка.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Убацује ставку на одређени положај на списку.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Убацује ставку на почетак списка.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Додајте ставку на крај списка.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Убацује ставку на случајно место на списку.", @@ -287,6 +294,19 @@ "LISTS_GET_SUBLIST_END_LAST": "до последње", "LISTS_GET_SUBLIST_TAIL": "", "LISTS_GET_SUBLIST_TOOLTIP": "Прави копију одређеног дела листе.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "сортирај %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Сортирајте копију списка.", + "LISTS_SORT_ORDER_ASCENDING": "растуће", + "LISTS_SORT_ORDER_DESCENDING": "опадајуће", + "LISTS_SORT_TYPE_NUMERIC": "као бројеве", + "LISTS_SORT_TYPE_TEXT": "азбучно", + "LISTS_SORT_TYPE_IGNORECASE": "азбучно, игнориши мала и велика слова", + "LISTS_SPLIT_LIST_FROM_TEXT": "направите листу са текста", + "LISTS_SPLIT_TEXT_FROM_LIST": "да текст из листе", + "LISTS_SPLIT_WITH_DELIMITER": "са раздвајање", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Поделити текст у листу текстова, разбијање на сваком граничник.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Да се придружи листу текстова у један текст, подељених за раздвајање.", "ORDINAL_NUMBER_SUFFIX": "", "VARIABLES_GET_TOOLTIP": "Враћа вредност ове променљиве.", "VARIABLES_GET_CREATE_SET": "Направи „постави %1“", @@ -300,17 +320,20 @@ "PROCEDURES_CALL_BEFORE_PARAMS": "са:", "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "Прави функцију без излаза.", + "PROCEDURES_DEFNORETURN_COMMENT": "Описати ову функцију...", "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "врати", "PROCEDURES_DEFRETURN_TOOLTIP": "Прави функцију са излазом.", + "PROCEDURES_ALLOW_STATEMENTS": "дозволити изреке", "PROCEDURES_DEF_DUPLICATE_WARNING": "Упозорење: Ова функција има дупликате параметара.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://sr.wikipedia.org/wiki/Функција_(програмирање)", - "PROCEDURES_CALLNORETURN_CALL": "", + "PROCEDURES_CALLNORETURN_HELPURL": "https://sr.wikipedia.org/sr-ec/Potprogram?%2", "PROCEDURES_CALLNORETURN_TOOLTIP": "Покрените прилагођену функцију „%1“.", - "PROCEDURES_CALLRETURN_HELPURL": "https://sr.wikipedia.org/wiki/Функција_(програмирање)", + "PROCEDURES_CALLRETURN_HELPURL": "https://sr.wikipedia.org/sr-ec/Potprogram?%2", "PROCEDURES_CALLRETURN_TOOLTIP": "Покрените прилагођену функцију „%1“ и користи њен излаз.", "PROCEDURES_MUTATORCONTAINER_TITLE": "улази", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Да додате, уклоните или переупорядочить улаза за ову функцију.", "PROCEDURES_MUTATORARG_TITLE": "назив улаза:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Додајте улазна функција.", "PROCEDURES_HIGHLIGHT_DEF": "Истакни дефиницију функције", "PROCEDURES_CREATE_DO": "Направи „%1“", "PROCEDURES_IFRETURN_TOOLTIP": "Уколико је вредност тачна, врати другу вредност.", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/sv.json b/src/opsoro/server/static/js/blockly/msg/json/sv.json similarity index 87% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/sv.json rename to src/opsoro/server/static/js/blockly/msg/json/sv.json index e1cd002..f6b66b2 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/sv.json +++ b/src/opsoro/server/static/js/blockly/msg/json/sv.json @@ -17,6 +17,8 @@ "INLINE_INPUTS": "Radinmatning", "DELETE_BLOCK": "Radera block", "DELETE_X_BLOCKS": "Radera %1 block", + "DELETE_ALL_BLOCKS": "Radera alla %1 block?", + "CLEAN_UP": "Rada upp block", "COLLAPSE_BLOCK": "Fäll ihop block", "COLLAPSE_ALL": "Fäll ihop block", "EXPAND_BLOCK": "Fäll ut block", @@ -24,14 +26,16 @@ "DISABLE_BLOCK": "Inaktivera block", "ENABLE_BLOCK": "Aktivera block", "HELP": "Hjälp", - "CHAT": "Chatta med din medarbetare genom att skriva i detta fält.", - "AUTH": "Var god godkänn denna app för att du ska kunna spara och dela den.", - "ME": "Jag", + "UNDO": "Ångra", + "REDO": "Gör om", "CHANGE_VALUE_TITLE": "Ändra värde:", - "NEW_VARIABLE": "Ny variabel...", - "NEW_VARIABLE_TITLE": "Nytt variabelnamn:", "RENAME_VARIABLE": "Byt namn på variabel...", "RENAME_VARIABLE_TITLE": "Byt namn på alla'%1'-variabler till:", + "NEW_VARIABLE": "Skapa variabel...", + "NEW_VARIABLE_TITLE": "Nytt variabelnamn:", + "VARIABLE_ALREADY_EXISTS": "En variabel som heter \"%1\" finns redan.", + "DELETE_VARIABLE_CONFIRMATION": "Radera %1 användningar av variabeln \"%2\"?", + "DELETE_VARIABLE": "Radera variabeln \"%1\"", "COLOUR_PICKER_HELPURL": "https://sv.wikipedia.org/wiki/Färg", "COLOUR_PICKER_TOOLTIP": "Välj en färg från paletten.", "COLOUR_RANDOM_TITLE": "slumpfärg", @@ -62,7 +66,7 @@ "CONTROLS_FOREACH_TOOLTIP": "För varje objekt i en lista, ange variabeln '%1' till objektet, och utför sedan några kommandon.", "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "bryt ut ur loop", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "fortsätta med nästa upprepning av loop", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Bryta ut ur den innehållande upprepningen.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Bryt ut ur den innehållande upprepningen.", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Hoppa över resten av denna loop och fortsätt med nästa loop.", "CONTROLS_FLOW_STATEMENTS_WARNING": "Varning: Detta block kan endast användas i en loop.", "CONTROLS_IF_TOOLTIP_1": "Om ett värde är sant, utför några kommandon.", @@ -173,10 +177,10 @@ "MATH_MODULO_TITLE": "resten av %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Returnerar kvoten från divisionen av de två talen.", "MATH_CONSTRAIN_TITLE": "begränsa %1 till mellan %2 och %3", - "MATH_CONSTRAIN_TOOLTIP": "Begränsa ett tal till att mellan de angivna gränsvärden (inklusive).", + "MATH_CONSTRAIN_TOOLTIP": "Begränsa ett tal till att mellan de angivna gränsvärden (inkluderande).", "MATH_RANDOM_INT_HELPURL": "https://sv.wikipedia.org/wiki/Slumptalsgenerator", "MATH_RANDOM_INT_TITLE": "slumpartat heltal från %1 till %2", - "MATH_RANDOM_INT_TOOLTIP": "Ger tillbaka ett slumpat heltal mellan två värden (inklusive).", + "MATH_RANDOM_INT_TOOLTIP": "Ger tillbaka ett slumpat heltal mellan två värden, inkluderande.", "MATH_RANDOM_FLOAT_HELPURL": "https://sv.wikipedia.org/wiki/Slumptalsgenerator", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "slumpat decimaltal", "MATH_RANDOM_FLOAT_TOOLTIP": "Ger tillbaka ett slumpat decimaltal mellan 0.0 (inkluderat) och 1.0 (exkluderat).", @@ -194,7 +198,7 @@ "TEXT_LENGTH_TOOLTIP": "Ger tillbaka antalet bokstäver (inklusive mellanslag) i den angivna texten.", "TEXT_ISEMPTY_TITLE": "%1 är tom", "TEXT_ISEMPTY_TOOLTIP": "Returnerar sant om den angivna texten är tom.", - "TEXT_INDEXOF_TOOLTIP": "Ger tillbaka indexet för den första/sista förekomsten av första texten i den andra texten. Ger tillbaka 0 om texten inte hittas.", + "TEXT_INDEXOF_TOOLTIP": "Ger tillbaka indexet för den första/sista förekomsten av första texten i den andra texten. Ger tillbaka %1 om texten inte hittas.", "TEXT_INDEXOF_INPUT_INTEXT": "i texten", "TEXT_INDEXOF_OPERATOR_FIRST": "hitta första förekomsten av texten", "TEXT_INDEXOF_OPERATOR_LAST": "hitta sista förekomsten av texten", @@ -227,6 +231,15 @@ "TEXT_PROMPT_TYPE_NUMBER": "fråga efter ett tal med meddelande", "TEXT_PROMPT_TOOLTIP_NUMBER": "Fråga användaren efter ett tal.", "TEXT_PROMPT_TOOLTIP_TEXT": "Fråga användaren efter lite text.", + "TEXT_COUNT_MESSAGE0": "räkna %1 i %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Räkna hur många gånger en text förekommer inom en annan text.", + "TEXT_REPLACE_MESSAGE0": "ersätt %1 med %2 i %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Ersätt alla förekomster av en text inom en annan text.", + "TEXT_REVERSE_MESSAGE0": "vänd på %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Vänder på teckenordningen i texten.", "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "skapa tom lista", "LISTS_CREATE_EMPTY_TOOLTIP": "Ger tillbaka en lista utan någon data, alltså med längden 0", @@ -245,7 +258,7 @@ "LISTS_INLIST": "i listan", "LISTS_INDEX_OF_FIRST": "hitta första förekomsten av objektet", "LISTS_INDEX_OF_LAST": "hitta sista förekomsten av objektet", - "LISTS_INDEX_OF_TOOLTIP": "Ger tillbaka den första/sista förekomsten av objektet i listan. Ger tillbaka 0 om texten inte hittas.", + "LISTS_INDEX_OF_TOOLTIP": "Ger tillbaka den första/sista förekomsten av objektet i listan. Returnerar %1 om objektet inte hittas.", "LISTS_GET_INDEX_GET": "hämta", "LISTS_GET_INDEX_GET_REMOVE": "hämta och ta bort", "LISTS_GET_INDEX_REMOVE": "ta bort", @@ -254,31 +267,28 @@ "LISTS_GET_INDEX_FIRST": "första", "LISTS_GET_INDEX_LAST": "sista", "LISTS_GET_INDEX_RANDOM": "slumpad", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Ger tillbaka objektet på den efterfrågade positionen i en lista. #1 är det första objektet.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Ger tillbaka objektet på den efterfrågade positionen i en lista. #1 är det sista objektet.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 är det första objektet.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 är det sista objektet.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Ger tillbaka objektet på den efterfrågade positionen i en lista.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Returnerar det första objektet i en lista.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Returnerar det sista objektet i en lista.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Returnerar ett slumpmässigt objekt i en lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Tar bort och återställer objektet på den specificerade positionen i en lista. #1 är det första objektet.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Tar bort och återställer objektet på den specificerade positionen i en lista. #1 är det sista objektet.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Tar bort och återställer objektet på den specificerade positionen i en lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Tar bort och återställer det första objektet i en lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Tar bort och återställer det sista objektet i en lista.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Tar bort och återställer ett slumpmässigt objekt i en lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Tar bort objektet på den specificerade positionen i en lista. #1 är det första objektet.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Tar bort objektet på den efterfrågade positionen i en lista. #1 är det sista objektet.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Tar bort objektet på den specificerade positionen i en lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Tar bort det första objektet i en lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Tar bort det sista objektet i en lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Tar bort en slumpmässig post i en lista.", "LISTS_SET_INDEX_SET": "ange", "LISTS_SET_INDEX_INSERT": "Sätt in vid", "LISTS_SET_INDEX_INPUT_TO": "som", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Sätter in objektet vid en specificerad position i en lista. #1 är det första objektet.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Sätter in objektet vid en specificerad position i en lista. #1 är det sista objektet.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Sätter in objektet vid en specificerad position i en lista.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Anger det första objektet i en lista.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Anger det sista elementet i en lista.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Sätter in ett slumpat objekt i en lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Sätter in objektet vid en specificerad position i en lista. #1 är det första objektet.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "sätter in objektet vid en specificerad position i en lista. #1 är det sista objektet.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Sätter in objektet vid en specificerad position i en lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "sätter in objektet i början av en lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Lägg till objektet i slutet av en lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "sätter in objektet på en slumpad position i en lista.", @@ -289,15 +299,26 @@ "LISTS_GET_SUBLIST_END_FROM_END": "till # från slutet", "LISTS_GET_SUBLIST_END_LAST": "till sista", "LISTS_GET_SUBLIST_TOOLTIP": "Skapar en kopia av den specificerade delen av en lista.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sortera %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Sortera en kopia av en lista.", + "LISTS_SORT_ORDER_ASCENDING": "stigande", + "LISTS_SORT_ORDER_DESCENDING": "fallande", + "LISTS_SORT_TYPE_NUMERIC": "numeriskt", + "LISTS_SORT_TYPE_TEXT": "alfabetiskt", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetiskt, ignorera skiftläge", "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "skapa lista från text", "LISTS_SPLIT_TEXT_FROM_LIST": "skapa text från lista", "LISTS_SPLIT_WITH_DELIMITER": "med avgränsare", "LISTS_SPLIT_TOOLTIP_SPLIT": "Dela upp text till en textlista och bryt vid varje avgränsare.", "LISTS_SPLIT_TOOLTIP_JOIN": "Sammanfoga en textlista till en text, som separeras av en avgränsare.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "vänd på %1", + "LISTS_REVERSE_TOOLTIP": "Vänd på en kopia av en lista.", "VARIABLES_GET_TOOLTIP": "Returnerar värdet av denna variabel.", "VARIABLES_GET_CREATE_SET": "Skapa \"välj %1\"", - "VARIABLES_SET": "välj %1 till %2", + "VARIABLES_SET": "ange %1 till %2", "VARIABLES_SET_TOOLTIP": "Gör så att den här variabeln blir lika med inputen.", "VARIABLES_SET_CREATE_GET": "Skapa 'hämta %1'", "PROCEDURES_DEFNORETURN_HELPURL": "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29", @@ -306,14 +327,15 @@ "PROCEDURES_BEFORE_PARAMS": "med:", "PROCEDURES_CALL_BEFORE_PARAMS": "med:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Skapar en funktion utan output.", + "PROCEDURES_DEFNORETURN_COMMENT": "Beskriv denna funktion...", "PROCEDURES_DEFRETURN_HELPURL": "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29", "PROCEDURES_DEFRETURN_RETURN": "returnera", "PROCEDURES_DEFRETURN_TOOLTIP": "Skapar en funktion med output.", "PROCEDURES_ALLOW_STATEMENTS": "tillåta uttalanden", "PROCEDURES_DEF_DUPLICATE_WARNING": "Varning: Denna funktion har dubbla parametrar.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Kör den användardefinierade funktionen \"%1\".", - "PROCEDURES_CALLRETURN_HELPURL": "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Kör den användardefinierade funktionen \"%1\" och använd resultatet av den.", "PROCEDURES_MUTATORCONTAINER_TITLE": "inmatningar", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Lägg till, ta bort och ändra ordningen för inmatningar till denna funktion.", @@ -322,5 +344,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Markera funktionsdefinition", "PROCEDURES_CREATE_DO": "Skapa '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Om ett värde är sant returneras ett andra värde.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Varning: Detta block får användas endast i en funktionsdefinition." } diff --git a/src/opsoro/server/static/js/blockly/msg/json/synonyms.json b/src/opsoro/server/static/js/blockly/msg/json/synonyms.json new file mode 100644 index 0000000..944aa9b --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/synonyms.json @@ -0,0 +1 @@ +{"PROCEDURES_DEFRETURN_TITLE": "PROCEDURES_DEFNORETURN_TITLE", "CONTROLS_IF_IF_TITLE_IF": "CONTROLS_IF_MSG_IF", "CONTROLS_WHILEUNTIL_INPUT_DO": "CONTROLS_REPEAT_INPUT_DO", "CONTROLS_IF_MSG_THEN": "CONTROLS_REPEAT_INPUT_DO", "LISTS_GET_SUBLIST_INPUT_IN_LIST": "LISTS_INLIST", "CONTROLS_IF_ELSE_TITLE_ELSE": "CONTROLS_IF_MSG_ELSE", "PROCEDURES_DEFRETURN_PROCEDURE": "PROCEDURES_DEFNORETURN_PROCEDURE", "TEXT_CREATE_JOIN_ITEM_TITLE_ITEM": "VARIABLES_DEFAULT_NAME", "LISTS_GET_INDEX_INPUT_IN_LIST": "LISTS_INLIST", "PROCEDURES_DEFRETURN_COMMENT": "PROCEDURES_DEFNORETURN_COMMENT", "CONTROLS_IF_ELSEIF_TITLE_ELSEIF": "CONTROLS_IF_MSG_ELSEIF", "PROCEDURES_DEFRETURN_DO": "PROCEDURES_DEFNORETURN_DO", "CONTROLS_FOR_INPUT_DO": "CONTROLS_REPEAT_INPUT_DO", "LISTS_GET_INDEX_HELPURL": "LISTS_INDEX_OF_HELPURL", "LISTS_INDEX_OF_INPUT_IN_LIST": "LISTS_INLIST", "CONTROLS_FOREACH_INPUT_DO": "CONTROLS_REPEAT_INPUT_DO", "LISTS_CREATE_WITH_ITEM_TITLE": "VARIABLES_DEFAULT_NAME", "TEXT_APPEND_VARIABLE": "VARIABLES_DEFAULT_NAME", "MATH_CHANGE_TITLE_ITEM": "VARIABLES_DEFAULT_NAME", "LISTS_SET_INDEX_INPUT_IN_LIST": "LISTS_INLIST"} \ No newline at end of file diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ta.json b/src/opsoro/server/static/js/blockly/msg/json/ta.json similarity index 92% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/ta.json rename to src/opsoro/server/static/js/blockly/msg/json/ta.json index 2383ac4..84b90bb 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/ta.json +++ b/src/opsoro/server/static/js/blockly/msg/json/ta.json @@ -17,6 +17,7 @@ "INLINE_INPUTS": "சூழமைவில் உள்ளீடு", "DELETE_BLOCK": "உறுப்பை நீக்கு", "DELETE_X_BLOCKS": "%1 உறுப்பை நீக்கு", + "DELETE_ALL_BLOCKS": "அனைத்து %1 நிரல் துண்டுகளையும் அழிக்கவா??", "COLLAPSE_BLOCK": "உறுப்பை மரை", "COLLAPSE_ALL": "உறுப்புகளை மரை", "EXPAND_BLOCK": "உறுப்பை காட்டு", @@ -24,14 +25,11 @@ "DISABLE_BLOCK": "உறுப்பை இயங்காது செய்", "ENABLE_BLOCK": "உறுப்பை இயங்குமாரு செய்", "HELP": "உதவி", - "CHAT": "இந்தப் பெட்டியில் தட்டச்சு செய்வதன் மூலம் கூட்டுப்பணியாளருடன் உரையாடலாம்!", - "AUTH": "தயவுச்செய்து இச்செயலியை அங்கீகரித்து உங்கள் வேலையைச் சேமித்து பகிரரும்படி அனுமதிக்கவும்.", - "ME": "எனக்கு", "CHANGE_VALUE_TITLE": "மதிப்பை மாற்றவும்:", - "NEW_VARIABLE": "புதிய மாறிலி...", - "NEW_VARIABLE_TITLE": "புதிய மாறிலியின் பெயர்:", "RENAME_VARIABLE": "மாறிலியை மறுபெயரிடுக...", "RENAME_VARIABLE_TITLE": "அனைத்து '%1' மாறிலிகளையும் பின்வருமாறு மறுபெயரிடுக:", + "NEW_VARIABLE": "புதிய மாறிலி...", + "NEW_VARIABLE_TITLE": "புதிய மாறிலியின் பெயர்:", "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "வண்ண தட்டிலிருந்து ஒரு நிறத்தைத் தேர்ந்தெடுக்கவும்.", "COLOUR_RANDOM_TITLE": "தற்போக்கு நிறம்", @@ -227,7 +225,7 @@ "LISTS_INLIST": "பட்டியலில் உள்ள", "LISTS_INDEX_OF_FIRST": "உரையில் முதல் தோற்ற இடத்தை காட்டு", "LISTS_INDEX_OF_LAST": "உரையில் கடைசி தோற்ற இடத்தை காட்டு", - "LISTS_INDEX_OF_TOOLTIP": "பட்டியலில் மதிப்பின் முதல், கடைசி தோற்ற இடத்தை பின்கொடு. காணாவிட்டால் 0 பின்கொடு.", + "LISTS_INDEX_OF_TOOLTIP": "பட்டியலில் மதிப்பின் முதல், கடைசி தோற்ற இடத்தை பின்கொடு. காணாவிட்டால் %1 பின்கொடு.", "LISTS_GET_INDEX_GET": "எடு", "LISTS_GET_INDEX_GET_REMOVE": "பெற்று நீக்குக", "LISTS_GET_INDEX_REMOVE": "நீக்குக", @@ -235,31 +233,28 @@ "LISTS_GET_INDEX_FIRST": "முதல்", "LISTS_GET_INDEX_LAST": "கடைசி", "LISTS_GET_INDEX_RANDOM": "ஏதோ ஒன்று", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "பட்டியலில் இடத்தில் உருப்படி பின்கொடு. #1 முதல் உருப்படி.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "பட்டியலில் இடத்தில் உருப்படி பின்கொடு. #1 முதல் உருப்படி.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 முதல் உருப்படி.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 கடைசி உருப்படி.ி", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "பட்டியலில் இடத்தில் உருப்படி பின்கொடு.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "பட்டியல் முதல் உருப்படியை பின்கொடு,", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "பட்டியல் கடைசி உருப்படியை பின்கொடு,", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "பட்டியல் சீரற்ற உருப்படியை பின்கொடு,", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கி பின்கொடு. #1 கடைசி உருப்படி.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கி பின்கொடு. #1 கடைசி உருப்படி.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கி பின்கொடு.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "பட்டியல் முதல் உருப்படியை நீக்கியபின் பின்கொடு,", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "பட்டியல் இறுதி உருப்படியை நீக்கியபின் பின்கொடு,", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "பட்டியல் சீரற்ற உருப்படியை நீக்கியபின் பின்கொடு,", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கு. #1 முதல் உருப்படி.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "பட்டியலில் கேட்ட இடத்தின் உருப்படியை நீக்கு. #1 கடைசி உருப்படி.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கு.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "பட்டியலில் முதல் உருப்படியை நீக்கு", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "பட்டியலில் கடைசி உருப்படியை நீக்கு", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "பட்டியல் சீரற்ற உருப்படியை நீக்கு,", "LISTS_SET_INDEX_SET": "நியமி", "LISTS_SET_INDEX_INSERT": "அவ்விடத்தில் நுழை", "LISTS_SET_INDEX_INPUT_TO": "இதுபொல", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "பட்டியலில் கேட்ட இடத்தில் உருப்படியை வை. #1, முதல் உருப்படி.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "பட்டியலில் கேட்ட இடத்தில் உருப்படியை வை. #1, கடைசி உருப்படி.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "பட்டியலில் கேட்ட இடத்தில் உருப்படியை வை.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "மதிப்பை பட்டியலில் முதல் உருப்படியில் வை", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "மதிப்பை பட்டியலில் கடைசி உருப்படியில் வை", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "மதிப்பை பட்டியலில் சீரற்ற உருப்படியில் வை", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "பட்டியலில் கேட்ட இடத்தில் உருப்படியை நுழை. #1, முதல் உருப்படி.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "பட்டியலில் கேட்ட இடத்தில் உருப்படியை நுழை. #1, கடைசி உருப்படி.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "பட்டியலில் கேட்ட இடத்தில் உருப்படியை நுழை.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "மதிப்பை பட்டியலின் முதலில் நுழை", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "மதிப்பை பட்டியலின் முடிவில் நுழை", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "மதிப்பை பட்டியலின் சீற்ற இடத்தில் நுழை", diff --git a/src/opsoro/server/static/js/blockly/msg/json/tcy.json b/src/opsoro/server/static/js/blockly/msg/json/tcy.json new file mode 100644 index 0000000..15a2e14 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/tcy.json @@ -0,0 +1,312 @@ +{ + "@metadata": { + "authors": [ + "Vishwanatha Badikana", + "Bharathesha Alasandemajalu" + ] + }, + "VARIABLES_DEFAULT_NAME": "ವಸ್ತು", + "TODAY": "ಇನಿ", + "DUPLICATE_BLOCK": "ನಕಲ್", + "ADD_COMMENT": "ಟಿಪ್ಪಣಿ ಸೇರ್ಸಲೆ", + "REMOVE_COMMENT": "ಟಿಪ್ಪಣಿನ್ ದೆತ್ತ್‌ಪಾಡ್ಲೆ", + "EXTERNAL_INPUTS": "ಬಾಹ್ಯೊ ಪರಿಕರೊ", + "INLINE_INPUTS": "ಉಳಸಾಲ್‍ದ ಉಳಪರಿಪು", + "DELETE_BLOCK": "ಮಾಜಯರ ತಡೆಯಾತ್ಂಡ್", + "DELETE_X_BLOCKS": "ಮಾಜಯರ ಶೇಕಡಾ ೧ ತಡೆಯಾತ್ಂಡ್", + "DELETE_ALL_BLOCKS": "ಮಾತ %1 ನಿರ್ಬಂದೊಲೆನ್ ದೆತ್ತ್ ಪಾಡ್ಲೆ ?", + "CLEAN_UP": "ನಿರ್ಬಂದೊಲೆನ್ ಸ್ವೊಚ್ಚೊ ಮಲ್ಪುಲೆ", + "COLLAPSE_BLOCK": "ಕುಗ್ಗಿಸಾದ್ ತಡೆಪತ್ತುನೆ", + "COLLAPSE_ALL": "ಕುಗ್ಗಿಸಾದ್ ನಿರ್ಬಂಧಿಸಾಪುನೆ", + "EXPAND_BLOCK": "ವಿಸ್ತರಿಸಾದ್ ತಡೆಪತ್ತುನೆ", + "EXPAND_ALL": "ವಿಸ್ತರಿಸಾದ್ ನಿರ್ಬಂದಿಸಾಪುನೆ", + "DISABLE_BLOCK": "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಾದ್ ತಡೆಪತ್ತುನೆ", + "ENABLE_BLOCK": "ಸಕ್ರಿಯಗೊಳಿಸಾದ್ ತಡೆಪತ್ತುನೆ", + "HELP": "ಸಹಾಯೊ", + "UNDO": "ದುಂಬುದಲೆಕೊ", + "REDO": "ಪಿರವುದಂಚ", + "CHANGE_VALUE_TITLE": "ಮೌಲ್ಯೊದ ಬದಲಾವಣೆ", + "RENAME_VARIABLE": "ಬದಲಾವಣೆ ಆಯಿನ ಪುದರ್‍ನ್ ನಾನೊರೊ ಪನ್ಲೆ", + "RENAME_VARIABLE_TITLE": "ನಾನೊರೊ ಪುದರ್ ಬದಲಾವಣೆ ಆಯಿನ ಮಾಂತ '% 1':", + "NEW_VARIABLE": "ಬದಲ್ ಮಲ್ಪೊಡಾಯಿನೆನ್ ರಚಿಸಲೆ", + "NEW_VARIABLE_TITLE": "ಪುದರ್‍ದ ಪೊಸ ಬದಲಾವಣೆ:", + "VARIABLE_ALREADY_EXISTS": "ಬದಲ್ ಮಲ್ಪೊಡಾಯಿನ '%1' ಇತ್ತೆನೆ ಅಸ್ತಿತ್ವೊಡು ಉಂಡು.", + "DELETE_VARIABLE_CONFIRMATION": "ಗಳಸ್‍ನ '%2' ಬದಲಾವನೆಡ್ %1 ಮಾಜಲೆ?", + "DELETE_VARIABLE": "ಬದಲಾಯಿನೆಡ್ದ್ %1 ಮಾಜಲೆ", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/ಬಣ್ಣೊ", + "COLOUR_PICKER_TOOLTIP": "ವರ್ಣಫಲಕೊದ ಒಂಜಿ ಬಣ್ಣೊದ ಆಯ್ಕೆ.", + "COLOUR_RANDOM_TITLE": "ಯಾದೃಚ್ಛಿಕೊ ಬಣ್ಣೊ", + "COLOUR_RANDOM_TOOLTIP": "ಯಾದೃಚ್ಛಿಕವಾಯಿನ ಬಣ್ಣೊದ ಆಯ್ಕೆ.", + "COLOUR_RGB_TITLE": "ಬಣ್ಣೊದೊಟ್ಟುಗೆ", + "COLOUR_RGB_RED": "ಕೆಂಪು ಬಣ್ಣೊ", + "COLOUR_RGB_GREEN": "ಪಚ್ಚೆ", + "COLOUR_RGB_BLUE": "ನೀಲಿ", + "COLOUR_RGB_TOOLTIP": "ತೋಜಿಪಾಯಿನ ಕೆಂಪು, ಪಚ್ಚೆ ಬುಕ್ಕೊ ನೀಲಿ ಬಣ್ಣೊದ ಪ್ರಮಾಣೊನು ರಚಿಸಲೆ. ಮಾಂತ ಮೌಲ್ಯೊಲು 0 ಬುಕ್ಕೊ 100 ನಡುಟೆ ಇಪ್ಪೊಡು.", + "COLOUR_BLEND_TITLE": "ಮಿಸ್ರನೊ", + "COLOUR_BLEND_COLOUR1": "ಬಣ್ಣೊ ೧(ಒಂಜಿ)", + "COLOUR_BLEND_COLOUR2": "ಬಣ್ಣೊ ೨(ರಡ್ಡ್)", + "COLOUR_BLEND_RATIO": "ಅನುಪಾತೊ", + "COLOUR_BLEND_TOOLTIP": "ಕೊರ್‍ನ ಅನುಪಾತೊದ ಒಟ್ಟುಗೆ (0.0- 1.0 ) ರಡ್ಡ್ ಬಣ್ಣೊಲೆನ್ ಜೊತೆಟ್ ಒಂಜಿ ಮಲ್ಪುಂಡು.", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "ನಾನೊರೊ %1 ಸಮಯೊಗು", + "CONTROLS_REPEAT_INPUT_DO": "ಮಲ್ಪು / ಅಂಚನೆ", + "CONTROLS_REPEAT_TOOLTIP": "ಕೆಲವು ಹೇಳಿಕೆಲೆನ್ ಮಸ್ತ್ ಸಮಯೊ ಮಲ್ಪೊಡು", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ಬುಕ್ಕೊ ಅಂಚನೇ", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ಬುಕ್ಕೊ ಮುಟ್ಟೊ", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "ಈ ತಿರ್ತ್‌ದ ಸರಿ ಇತ್ತ್ಂಡಲಾ, ಬುಕ್ಕೊದ ಕೆಲವು ಹೇಳಿಕೆಲೆನ್ ಮಲ್ಪುಲ", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "ಈ ತಿರ್ತ್‍ದ ತಪ್ಪಾದುಂಡು, ಬುಕ್ಕೊದ ಕೆಲವು ಹೇಳಿಕೆಲೆನ್ ಮಲ್ಪಪುಲ", + "CONTROLS_FOR_TOOLTIP": "ಸುರೂತ ನಂಬ್ರೊಡ್ದು ಅಕೇರಿದ ನಂಬ್ರೊಗು ಬಿಲೆಟ್ ಮಸ್ತ್ ಹೆಚ್ಚ್‌ಕಮ್ಮಿ ಇತ್ತ್ಂಡಲಾ %1 ದೆತೊಂದ್, ನಿರ್ದಿಸ್ಟೊ ಮಧ್ಯಂತರೊದ ಮೂಲಕೊ ಲೆಕ್ಕೊದೆತೊಂದು ಬುಕ್ಕೊ ನಿಗಂಟ್ ಮಲ್ತ್‌ನ ಬ್ಲಾಕ್‍ಲೆನ್ ಲೆಕ್ಕೊ ಮಲ್ಪುಲ.", + "CONTROLS_FOR_TITLE": "%1ಡ್ದ್ %2ಗ್ ಮುಟ್ಟ %3 ಬುಕ್ಕೊ %4ನ್ ಒಟ್ಟೂಗು ಗೆನ್ಪಿ", + "CONTROLS_FOREACH_TITLE": "ಅತ್ತಂದೆ ಪ್ರತೀ ಅಂಸೊ %1ದ ಉಲಯಿ %2ದ ಪಟ್ಟಿ", + "CONTROLS_FOREACH_TOOLTIP": "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಪ್ರತಿ ವಸ್ತುಗು, ಜೋಡಾಯಿನ ವಸ್ತು ಬದಲಾಪುನಂಚ '% 1', ಬುಕ್ಕೊ ಒಂತೆ ಹೇಳಿಕೆಲೆನ್ ಮಲ್ಲಪುಲೆ.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ಕುಣಿಕೆದ ಪಿದಯಿ ತುಂಡಾಪುಂಡು", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "ದುಂಬುದ ಆದೇಸೊಡೆ ಪುನರಾವರ್ತನೆ ದುಂಬರಿಪ್ಪುಂಡು", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "ಬಳಕೆಡುಪ್ಪುನ ಕೊಲಿಕೆಡ್ದ್ ಪಿದಯಿ ಪಾಡ್‍ಲೆ", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "ದುಂಬುದ ಆವೃತಿಡ್ ಉಪ್ಪುನಂಚನೆ ಮಾಂತ ಕೊಲಿಕೆಲೆನ್ ದೆತ್ಪುಲೆ ಬುಕ್ಕೊ ದುಂಬರಿಲೆ", + "CONTROLS_FLOW_STATEMENTS_WARNING": "ಎಚ್ಚರೊ: ಈ ನಿರ್ಬಂದೊನು ಕೇವಲ ಒಂಜಿ ಕೊಲಿಕೆದಾಕಾರೊದ ಮುಕ್ತಮಾರ್ಗೊದ ಪರಿಮಿತಿದುಲಯಿಡ್ ಬಳಸೊಲಿ", + "CONTROLS_IF_TOOLTIP_1": "ಇಂದೆತ ಮೌಲ್ಯೊ ನಿಜವಾದಿತ್ತ್‌ಂಡ, ಬುಕ್ಕೊ ಒಂತೆ ನಿರೂಪಣೆಲೆನ್ ಮಲ್ಪುಲೆ", + "CONTROLS_IF_TOOLTIP_2": "ಇಂದೆತ ಮೌಲ್ಯೊ ನಿಜವಾದಿತ್ತ್‌ಂಡ, ಬುಕ್ಕೊದ ನಿರೂಪಣೆಲೆನ್ ಸುರೂಕು ಮಲ್ಪುಲೆ. ಅತ್ತಂಡ ರಡ್ಡನೆದ ನಿರೂಪಣೆನ್ ತಡೆ ಪತ್ತುನಂಚನೆ ಮಲ್ಲಪುಲೆ", + "CONTROLS_IF_TOOLTIP_3": "ಸುರೂತ ಮೌಲ್ಯೊ ನಿಜವಾದಿತ್ತ್‌ಂಡ, ಬುಕ್ಕೊದ ನಿರೂಪಣೆಲೆನ್ ಸುರೂಕು ತಡೆ ಮಲ್ಪುಲೆ. ಅತ್ತಂಡ ರಡ್ಡನೆದ ನಿರೂಪಣೆನ್ ನಿಜವಾದಿತ್ತ್‌ಂಡ ಬುಕ್ಕೊ ಒಂತೆ ನಿರೂಪಣೆಲೆನ್ ಮಲ್ಪುಲೆ", + "CONTROLS_IF_TOOLTIP_4": "ಸುರೂತ ಮೌಲ್ಯೊ ನಿಜವಾದಿತ್ತ್‌ಂಡ, ಸುರೂತ ನಿರೂಪಣೆನ್ ತಡೆ ಮಲ್ಪುಲೆ. ರಡ್ಡನೆದ ನಿರೂಪಣೆ ನಿಜವಾದಿತ್ತ್ಂಡ, ರಡ್ಡನೆದ ನಿರೂಪಣೆನ್ ತಡೆ ಮಲ್ಪುಲೆ. ಉಂದು ಒವ್ವೇ ಮೌಲ್ಯೊ ನಿಜವಾದಿದ್ಯಂಡ, ಅಕೇರಿದ ನಿರೂಪಣೆನ್ ತಡೆ ಮಲ್ಪುಲೆ.", + "CONTROLS_IF_MSG_IF": "ಒಂಜಿ ವೇಲೆ", + "CONTROLS_IF_MSG_ELSEIF": "ಬೇತೆ ಸಮಯೊ", + "CONTROLS_IF_MSG_ELSE": "ಬೇತೆ", + "CONTROLS_IF_IF_TOOLTIP": "ಸೇರಲ, ದೆತ್ತ್‌ ಪಾಡ್‌ಲ, ಅತ್ತಂಡ ಒಂಜಿ ವೇಲೆ ಈ ರಚನೆನ್ ತಡೆದ್, ಇಂದೆತ ಇಬಾಗೊಲೆನ್ ಬೇತೆ ಕ್ರಮೊಟು ಮಲ್ಪುಲೆ", + "CONTROLS_IF_ELSEIF_TOOLTIP": "ಒಂಜಿ ವೇಲೆ ಒಂಜಿ ತಡೆಕ್ ಈ ಪರಿಸ್ಥಿತಿನ್ ಸೇರಲೆ", + "CONTROLS_IF_ELSE_TOOLTIP": "ಒಂಜಿ ವೇಲೆ ಮಾಂತೆನ್ಲಾ ದೀಡೊಂದು ಅಕೇರಿದ ಪರಿಸ್ಥಿಡ್ ಸೇರಲೆ", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "ರಡ್ಡ್ ಅತ್ತಂದೆ ಬೇತೆ ಸೂಚನೆಲು ನಿಜೊಕ್ಕುಲಾ ಸಮೊ ಇತ್ತ್ಂಡ ಪಿರ ಕೊರ್ಲೆ.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "ರಡ್ಡ್ ಅತ್ತಂದೆ ಬೇತೆ ಸೂಚನೆಲು ನಿಜೊಕ್ಕುಲಾ ಸಮೊ ಆತಿಜಂಡ ಪಿರ ಕೊರ್ಲೆ", + "LOGIC_COMPARE_TOOLTIP_LT": "ಸುರುತ ಅತ್ತಂದೆ ರಡ್ಡನೆದ ಸೂಚನೆ ನಿಜೊಕ್ಕುಲಾ ಒಂಜಿ ವೇಲೆ ಎಲ್ಯೆ ಆದಿತ್ತ್ಂಡ ಪಿರ ಕೊರ್ಲೆ", + "LOGIC_COMPARE_TOOLTIP_LTE": "ಸುರುತ ಅತ್ತಂದೆ ರಡ್ಡನೆದ ಸೂಚನೆ ನಿಜೊಕ್ಕುಲಾ ದಿಂಜ ಎಲ್ಯೆ ಅತ್ತಂಡ ಸಮೊ ಆದಿತ್ತ್ಂಡ ಪಿರ ಕೊರ್ಲೆ", + "LOGIC_COMPARE_TOOLTIP_GT": "ಸುರುತ ಅತ್ತಂದೆ ರಡ್ಡನೆದ ಸೂಚನೆಡ್ದ್ ನಿಜೊಕ್ಕುಲಾ ಮಲ್ಲೆ ಆದಿತ್ತ್ಂಡ ಪಿರ ಕೊರ್ಲೆ", + "LOGIC_COMPARE_TOOLTIP_GTE": "ಸುರುತ ಅತ್ತಂದೆ ರಡ್ಡನೆದ ಸೂಚನೆ ನಿಜೊಕ್ಕುಲಾ ದಿಂಜ ಮಲ್ಲೆ ಅತ್ತಂಡ ಸಮೊ ಆದಿತ್ತ್ಂಡ ಪಿರ ಕೊರ್ಲೆ", + "LOGIC_OPERATION_TOOLTIP_AND": "ರಡ್ಡ್ ಸೂಚನೆಲಾ ನಿಜೊ ಆದಿತ್ತ್ಂಡ ನಿಜವಾತ್ ಪಿರಕೊರ್ಲೆ", + "LOGIC_OPERATION_AND": "ಬುಕ್ಕೊ", + "LOGIC_OPERATION_TOOLTIP_OR": "ನಿಜವಾದ್‍ಲ ಒಂಜಿವೇಳೆ ಇನ್‍ಪುಟ್ ಒಂತೆ ನಿಜವಾದಿತ್ತ್ಂಡ ಪಿರಕೊರು", + "LOGIC_OPERATION_OR": "ಅತ್ತಂಡ", + "LOGIC_NEGATE_TITLE": "%1 ಇದ್ದಿ", + "LOGIC_NEGATE_TOOLTIP": "ನಿಜವಾದ್‍ ಇನ್‍ಪುಟ್ ಸುಲ್ಲಾದಿತ್ತ್‌ಂಡ ಪಿರಕೊರು. ನಿಜವಾದ್ ಸುಲ್ಲು ಇನ್‍ಪುಟ್ ಇತ್ತ್‌ಂಡ ಪಿರಕೊರು", + "LOGIC_BOOLEAN_TRUE": "ಸತ್ಯೊ", + "LOGIC_BOOLEAN_FALSE": "ಸುಲ್ಲು", + "LOGIC_BOOLEAN_TOOLTIP": "ಪೂರ ಸತ್ಯೊ ಅತ್ತಂಡ ಸುಲ್ಲು ಆಂಡ ಪಿರಕೊರು", + "LOGIC_NULL": "ಸೊನ್ನೆ", + "LOGIC_NULL_TOOLTIP": "ಸೊನ್ನೆನ್ ಪರಿಕೊರ್ಪುಂಡು", + "LOGIC_TERNARY_CONDITION": "ಪರೀಕ್ಷೆ", + "LOGIC_TERNARY_IF_TRUE": "ಒಂಜಿ ವೇಲೆ ಸತ್ಯೊ", + "LOGIC_TERNARY_IF_FALSE": "ಒಂಜಿ ವೇಲೆ ಸುಳ್ಳು", + "LOGIC_TERNARY_TOOLTIP": "ಪರೀಕ್ಷೆದ ಸ್ಥಿತಿನ್ ಪರಿಶೀಲನೆ ಮಲ್ಲಪುಲೆ. ಪರಿಸ್ಥಿತಿ ನಿಜವಾದಿತ್ತ್ಂಡ, ನಿಜವಾಯಿನ ಮೌಲ್ಯೊನು ಪಿರಕೊರ್ಲೆ; ಅತ್ತಂಡ ತಪ್ಪು ಮೌಲ್ಯೊನೇ ಪಿರ ಕೊರ್ಲೆ.", + "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/ಸಂಖ್ಯೆ", + "MATH_NUMBER_TOOLTIP": "ಅ ನಂಬ್ರೊ", + "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/ಅಂಕಗಣಿತ", + "MATH_ARITHMETIC_TOOLTIP_ADD": "ಸಂಖ್ಯೆದ ಮೊತ್ತನ್ ಪಿರ ಕೊರು.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "ಸಂಖ್ಯೆದ ವ್ಯತ್ಯಾಸೊನು ಪರಕೊರು.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "ಸಂಖ್ಯೆದ ಉತ್ಪನ್ನೊನು ಪಿರ ಕೊರು.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "ಸಂಖ್ಯೆದ ಭಾಗಲಬ್ದೊನು ಪಿರ ಕೊರು.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "ಒಂಜನೆ ಸಂಖ್ಯೆದ ಶಕ್ತಿನ್ ರಡ್ಡನೆ ಸಂಖ್ಯೆಡ್ದ್ ಪಿರ ಹೆಚ್ಚಿಗೆ ಮಲ್ಪುಲೆ.", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/ವರ್ಗೊಮೂಲೊ", + "MATH_SINGLE_OP_ROOT": "ವರ್ಗಮೂಲೊ", + "MATH_SINGLE_TOOLTIP_ROOT": "ಸಂಖ್ಯೆದ ವರ್ಗಮೂಲೊನು ಪಿರ ಕೊರು.", + "MATH_SINGLE_OP_ABSOLUTE": "ಸಂಪೂರ್ನೊ", + "MATH_SINGLE_TOOLTIP_ABS": "ಸಂಖ್ಯೆದ ಸರಿಯಾಯಿನ ಮೌಲ್ಯೊನು ಕೊರು", + "MATH_SINGLE_TOOLTIP_NEG": "ಸಂಖ್ಯೆದ ನಿರಾಕರಣೆನ್ ಪಿರಕೊರು", + "MATH_SINGLE_TOOLTIP_LN": "ಸಂಖ್ಯೆದ ನಿಜವಾಯಿನ ಕ್ರಮಾವಳಿನ್ ಪಿರಕೊರು", + "MATH_SINGLE_TOOLTIP_LOG10": "ಸಂಖ್ಯೆದ ೧೦ ಮೂಲೊ ಕ್ರಮಾವಳಿನ್ ಪಿರಕೊರು", + "MATH_SINGLE_TOOLTIP_EXP": "ಸಂಖ್ಯೆದ ಇ ಗ್ ಅಧಿಕಾರೊನು ಪಿರಕೊರು", + "MATH_SINGLE_TOOLTIP_POW10": "ಸಂಖ್ಯೆದ ೧೦ಗ್ ಅಧಿಕಾರೊನು ಪಿರಕೊರು", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/ತ್ರಿಕೋನಮಿತಿದ_ಕಾರ್ಯೊಲು", + "MATH_TRIG_TOOLTIP_SIN": "ಪದವಿದ ಚಿಹ್ನೆನ್ ಪಿರಕೊರು", + "MATH_TRIG_TOOLTIP_COS": "ಪದವಿದ ಸಹ ಚಿಹ್ನೆನ್ ಪಿರಕೊರು", + "MATH_TRIG_TOOLTIP_TAN": "ಪದವಿದ ಸ್ಪರ್ಶಕೊನು ಪಿರಕೊರು", + "MATH_TRIG_TOOLTIP_ASIN": "ಪದವಿದ ಆರ್ಕ್ಸೈನ್ ಪಿರಕೊರು", + "MATH_TRIG_TOOLTIP_ACOS": "ಸಂಖ್ಯೆದ ಆರ್ಕ್ಕೊಸಿನ್ ಪಿರಕೊರು", + "MATH_TRIG_TOOLTIP_ATAN": "ಸಂಖ್ಯೆದ ಆರ್ಕ್ಟ್ಯಾಂಜೆಂಟ್ ಪಿರಕೊರು", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/ಗಣಿತ_ನಿರಂತರ", + "MATH_CONSTANT_TOOLTIP": "ಸಾಮಾನ್ಯವಾದ್ ಒಂಜಿ ಸ್ಥಿರವಾದಿತ್ತ್‌ಂಡ ಪಿರಕೊರು: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).", + "MATH_IS_EVEN": "ಸಮೊ ಆತ್ಂಡ್", + "MATH_IS_ODD": "ಬೆಸೊ ಆತ್ಂಡ್", + "MATH_IS_PRIME": "ಎಡ್ಡೆ ಆತ್ಂಡ್", + "MATH_IS_WHOLE": "ಮಾಂತ ಆತ್ಂಡ್", + "MATH_IS_POSITIVE": "ಗುನೊ ಆತ್ಂಡ್", + "MATH_IS_NEGATIVE": "ರುನೊ ಆತ್ಂಡ್", + "MATH_IS_DIVISIBLE_BY": "ಭಾಗಿಸವೊಲಿಯ", + "MATH_IS_TOOLTIP": "ಒಂಜಿ ವೇಲ್ಯೊ ಸಂಖ್ಯೆ ಸರಿ, ಬೆಸ, ಅವಿಭಾಜ್ಯ, ಇಡೀ, ಕೂಡಬುನ, ಕಲೆವುನ, ಅತ್ತಂಡ ನಿರ್ದಿಷ್ಟ ಸಂಖ್ಯೆಡ್ದ್ ಭಾಗಿಸವುಂಡಂದ್ ಪರಿಶೀಲಿಸ. ಸರಿ ಅತ್ತಂಡ ತಪ್ಪುನು ಪಿರಕೊರು.", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "%1 ಡ್ದ್ %2 ಬದಲಾಯಿಸವೊಲಿ", + "MATH_CHANGE_TOOLTIP": "'%1' ಬದಲ್ ಮಲ್ಪುನಂಚಿನ ಒಂಜಿ ನಂಬರ್‍ನ್ ಸೇರಾವು", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/ಪೂರ್ಣಾಂಕೊ", + "MATH_ROUND_TOOLTIP": "ಸಂಖ್ಯೆನ್ ಮಿತ್ತ್ ಅತ್ತಂಡ ತಿರ್ತ್ ರೌಂಡ್ ಮಲ್ಪು", + "MATH_ROUND_OPERATOR_ROUND": "ಸುತ್ತು", + "MATH_ROUND_OPERATOR_ROUNDUP": "ಮುಗಿಪುನ ಸಮಯೊ", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "ಸುತ್ತು ಕಡಮೆ", + "MATH_ONLIST_OPERATOR_SUM": "ಒಟ್ಟು ಕೂಡಯಿನಾ ಪಟ್ಟಿ", + "MATH_ONLIST_TOOLTIP_SUM": "ಪಟ್ಟಿದಾ ಮಾಂತ ಸಂಕ್ಯೆಲೆನ್ ಪಿರಕೊರ್ಲೆ", + "MATH_ONLIST_OPERATOR_MIN": "ಕಿನ್ಯ ಪಟ್ಟಿ", + "MATH_ONLIST_TOOLTIP_MIN": "ಪಟ್ಟಿದಾ ಕಿನ್ಯ ಸಂಕ್ಯೆನ್ ಪಿರಕೊರು", + "MATH_ONLIST_OPERATOR_MAX": "ಪಟ್ಟಿನ್ ಮಿಸ್ರೊ ಮಲ್ಪು", + "MATH_ONLIST_TOOLTIP_MAX": "ಪಟ್ಟಿದಾ ಮಲ್ಲ ಸಂಕ್ಯೆನ್ ಪಿರಕೊರು", + "MATH_ONLIST_OPERATOR_AVERAGE": "ಸರಾಸರಿ ಪಟ್ಟಿ", + "MATH_ONLIST_TOOLTIP_AVERAGE": "ಪಟ್ಟಿಡುಪ್ಪುನ ಸರ್ವಸಾಧಾರಣ ಬಿಲೆನ್ ಪಿರಕೋರ್ಲೆ", + "MATH_ONLIST_OPERATOR_MEDIAN": "ನಡುತ ಪಟ್ಟಿ", + "MATH_ONLIST_TOOLTIP_MEDIAN": "ಪಟ್ಟಿದಾ ನಡುತ ಸಂಕ್ಯೆನ್ ಪಿರಕೊರು", + "MATH_ONLIST_OPERATOR_MODE": "ಪಟ್ಟಿದ ಇದಾನೊಲು", + "MATH_ONLIST_TOOLTIP_MODE": "ಪಟ್ಟಿದ ಸಾಮಾನ್ಯೊ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ಪಿರಕೊರು", + "MATH_ONLIST_OPERATOR_STD_DEV": "ಕಬರ್ ಪಟ್ಟಿದ ಪ್ರಮಾನೊ", + "MATH_ONLIST_TOOLTIP_STD_DEV": "ಪಟ್ಟಿದ ಗುಣಮಟ್ಟೊದ ವರ್ಗೀಕರಣೊನು ಪಿರಕೊರು", + "MATH_ONLIST_OPERATOR_RANDOM": "ಗೊತ್ತುಗುರಿ ದಾಂತಿನ ಅಂಸೊದ ಪಟ್ಟಿ", + "MATH_ONLIST_TOOLTIP_RANDOM": "ಪಟ್ಟಿದ ಗೊತ್ತು ಗುರಿದಾಂತಿನ ಅಂಸೊಲೆನ್ ಪಿರಕೊರು", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/ಮೋಡ್ಯುಲೊ_ಒಪರೇಶನ್", + "MATH_MODULO_TITLE": " %1 ÷ %2 ಒರಿನ ಬಾಗೊ", + "MATH_MODULO_TOOLTIP": "ರಡ್ಡ್ ಸಂಖ್ಯೆದ ಇಬಾಗೊಡ್ದು ಒರಿನ ಬಾಗೊನು ಪಿರಕೊರು", + "MATH_CONSTRAIN_TITLE": " %1 ಕಮ್ಮಿ %2 ಜಾಸ್ತಿ %3 ಕಡ್ಡಾಯ ಮಲ್ಪು", + "MATH_CONSTRAIN_TOOLTIP": "ನಿಗದಿತ ನಿಯಮೊಗು ನಡುಟು ದಿಂಜ ನಿರ್ಬಂದೊ(ಸೇರ್‍ನಂಚ)", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/ರಾಂಡಮ್_ನಂಬರ್_ಜನರೇಶನ್", + "MATH_RANDOM_INT_TITLE": " %1 ಡ್ದ್ %2 ಯಾದೃಚ್ಛಿಕ ಪೂರ್ಣಾಂಕೊ", + "MATH_RANDOM_INT_TOOLTIP": "ರಡ್ಡ್ ನಿಗದಿತ ನಿಯಮೊದ ನಡುತ ಯಾದೃಚ್ಛಿಕ ಪೂರ್ಣಾಂಕೊನು ಪಿರಕೊರು", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/ರಾಂಡಮ್_ನಂಬರ್_ಜನರೇಶನ್", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "ಗೊತ್ತುಗುರಿ ದಾಂತಿನ ಬಾಗೊ", + "MATH_RANDOM_FLOAT_TOOLTIP": "0.0 (ಸೇರ್ನಂಚಿನ) and 1.0 (ಸೇರಂದಿನಂಚಿನ) ನಡುತ ಗೊತ್ತು ಗುರಿದಾಂತಿನ ಬಾಗೊನು ಪಿರಕೊರು.", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/ಸ್ಟ್ರಿಂಗ್_(ಕಂಪ್ಯೂಟರ್_ಸೈನ್ಸ್)", + "TEXT_TEXT_TOOLTIP": "ಒಂಜಿ ಅಕ್ಷರೊ, ಪದೊ ಅತ್ತಂಡ ಪಾಟೊದ ಒಂಜಿ ಸಾಲ್", + "TEXT_JOIN_TITLE_CREATEWITH": "ಪಟ್ಯೊನು ರಚನೆ ಮಲ್ಪು", + "TEXT_JOIN_TOOLTIP": "ಒವ್ವೇ ಸಂಖ್ಯೆದ ಪಟ್ಯೊದ ತುಂಡುಲೆನ್ ಒಟ್ಟೂಗೆ ಸೇರಯರ ರಚಿಸಲೆ", + "TEXT_CREATE_JOIN_TITLE_JOIN": "ಸೇರೊಲಿ", + "TEXT_CREATE_JOIN_TOOLTIP": "ಸೇರಯರ, ದೆತ್ತ್‌ ಪಾಡೆರೆ ಅತ್ತಂಡ ಈ ಪಟ್ಯೊಲೆನ್ ತಡೆದ್ ಪತ್ತ್‌ದ್ ಪಿರ ರಚಿಸಯರ ಇಬಾಗೊ ಮಲ್ಪುಲೆ.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "ಪಟ್ಯೊಡು ಅಂಸೊಲೆನ್ ಸೇರಲೆ", + "TEXT_APPEND_TO": "ಇಂದೆಕ್", + "TEXT_APPEND_APPENDTEXT": "ಪಟ್ಯೊನು ಸೇರವೆ", + "TEXT_APPEND_TOOLTIP": "%1 ಬದಲಾಪುನ ಕೆಲವು ಪಟ್ಯೊಲೆನ್ ಸೇರಾವೊಂಡು.", + "TEXT_LENGTH_TITLE": "೧% ಉದ್ದೊ", + "TEXT_LENGTH_TOOLTIP": "ಕೊರ್‌ನ ಪಟ್ಯೊದ ಅಕ್ಷರೊಲೆನ(ಅಂತರೊಲು ಸೇರ್‌ನಂಚ) ಸಂಖ್ಯೆನ್ ಪಿರಕೊರು.", + "TEXT_ISEMPTY_TITLE": "%1 ಕಾಲಿ", + "TEXT_ISEMPTY_TOOLTIP": "ಕೊರ್‌ನ ಪಟ್ಯೊ ಕಾಲಿಂದ್ ಸತ್ಯೊ ಆಂಡ ಪಿರಕೊರು", + "TEXT_INDEXOF_TOOLTIP": "ಸುರುತ ಪಟ್ಯೊದ ಸೂಚ್ಯಿ/ಅಕೇರಿಟ್ ಸಂಭವಿಸವುನ ಸುರುತ ಪಟ್ಟಯೊದುಲಯಿದ ರಡ್ಡನೆ ಪಟ್ಯೊನು ಪಿರಕೊರು. %1 ಪಟ್ಯೊ ತಿಕಂದಿತ್ತ್‌ಂಡ ಪಿರಕೊರು.", + "TEXT_INDEXOF_INPUT_INTEXT": "ಪಟ್ಯೊಡು", + "TEXT_INDEXOF_OPERATOR_FIRST": "ಸುರುಟು ಸಂಭವಿಸಯಿನ ಪಟ್ಯೊನು ನಾಡ್‍ಲ", + "TEXT_INDEXOF_OPERATOR_LAST": "ದುಂಬು ಕರಿನ ಪಟ್ಯೊನು ನಾಡ್‍ಲೆ", + "TEXT_CHARAT_INPUT_INTEXT": "ಪಟ್ಯೊಡು", + "TEXT_CHARAT_FROM_START": "ಅಕ್ಸರೊನು ದೆತೊನುಲೆ#", + "TEXT_CHARAT_FROM_END": "ಅಕ್ಷರೊ ನಟೊನ್#ಅಕೇರಿಡ್ದ್", + "TEXT_CHARAT_FIRST": "ಸುರುಡ್ದ್ ಅಕ್ಷರೊನು ನಟೊನ್ಲ", + "TEXT_CHARAT_LAST": "ಅಕೇರಿದ ಅಕ್ಷರೊನು ನಟೊನ್ಲ", + "TEXT_CHARAT_RANDOM": "ಗೊತ್ತುಗುರಿದಾಂತಿ ಅಕ್ಷರೊನು ನಟೊನ್ಲ", + "TEXT_CHARAT_TOOLTIP": "ಅಕ್ಷರೊನು ನಿರ್ದಿಷ್ಟ ಜಾಗೆಡ್ ಪಿರಕೊರು.", + "TEXT_GET_SUBSTRING_TOOLTIP": "ಪಟ್ಯೊನು ನಿರ್ದಿಷ್ಟ ಬಾಗೊಡು ಪಿರಕೊರು", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "ಪಟ್ಯೊಡು", + "TEXT_GET_SUBSTRING_START_FROM_START": "ಉಪ ವಾಕ್ಯೊಡ್ದು ಅಕ್ಷರೊನು ನಟೊನ್ಲ", + "TEXT_GET_SUBSTRING_START_FROM_END": "ಉಪ ವಾಕ್ಯೊಡ್ದು ಅಕ್ಷರೊನು ನಟೊನ್ಲ#ಅಕೇರಿಡ್ದ್", + "TEXT_GET_SUBSTRING_START_FIRST": "ಉಪ ವಾಕ್ಯೊಡ್ದು ಸುರುತ ಅಕ್ಷರೊನು ನಟೊನ್ಲ", + "TEXT_GET_SUBSTRING_END_FROM_START": "ಅಕ್ಷರೊಗು#", + "TEXT_GET_SUBSTRING_END_FROM_END": "ಅಕ್ಷರೊಗು#ಅಕೇರಿಡ್ದ್", + "TEXT_GET_SUBSTRING_END_LAST": "ಅಕೇರಿದ ಅಕ್ಷರೊಗು", + "TEXT_CHANGECASE_TOOLTIP": "ಪಟ್ಯೊದ ಒಂಜಿ ನಕಲ್‍ನ್ ಬೇತೆ ಸಮಯೊಡು ಪಿರಕೊರು", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "ಮಲ್ಲ ಅಕ್ಷರೊಗು", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "ಎಲ್ಯ ಅಕ್ಷರೊಗು", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "ತರೆಬರವುಗು", + "TEXT_TRIM_TOOLTIP": "ಒಂಜಿ ಅತ್ತಂಡ ರಡ್ಡ್ ಕೊಡಿಡ್ದ್ ದೆತ್ತ್‌ನ ಕಅಲಿ ಪಟ್ಯೊದ ಪ್ರತಿನ್ ಪಿರಕೊರು.", + "TEXT_TRIM_OPERATOR_BOTH": "ರಡ್ಡ್ ಬರಿತ ಜಾಗೆನ್ಲ ಕತ್ತೆರಿಪುಲೆ.", + "TEXT_TRIM_OPERATOR_LEFT": "ಎಡತ ಬರಿತ ಜಾಗೆನ್ ಕತ್ತೆರಿಪುಲೆ.", + "TEXT_TRIM_OPERATOR_RIGHT": "ಬಲತ ಬರಿತ ಜಾಗೆನ್ ಕತ್ತೆರಿಪುಲೆ.", + "TEXT_PRINT_TITLE": "%1 ಮುದ್ರಿತ", + "TEXT_PRINT_TOOLTIP": "ನಿರ್ದಿಷ್ಟ ಪಟ್ಯೊ, ಸಂಖ್ಯೆ ಅತ್ತಂಡ ಬೇತೆ ಮೌಲ್ಯೊನು ಮುದ್ರಿಸಲೆ.", + "TEXT_PROMPT_TYPE_TEXT": "ಪಟ್ಯೊದೊಟ್ಟುಗೆ ಸಂದೇಸೊನು ಕೇನುಂಡು.", + "TEXT_PROMPT_TYPE_NUMBER": "ಸಂಖ್ಯೆದೊಟ್ಟುಗೆ ಸಂದೇಸೊನು ಕೇನುಂಡು", + "TEXT_PROMPT_TOOLTIP_NUMBER": "ದಿಂಜ ಬಳಕೆದಾರೆರೆನ್ ಕೇನುಂಡು.", + "TEXT_PROMPT_TOOLTIP_TEXT": "ಕೆಲವು ಪಟ್ಯೊದ ಬಳಕೆದಾರೆರೆನ್ ಕೇನುಂಡು.", + "LISTS_CREATE_EMPTY_TITLE": "ಕಾಲಿ ಪಟ್ಟಿನ್ ಸ್ರಿಸ್ಟಿಸಲೆ", + "LISTS_CREATE_EMPTY_TOOLTIP": "ಒಂಜಿ ಪಟ್ಟಿ, ೦ದ ಉದ್ದೊ, ಒವ್ವೇ ಅಂಕಿಅಂಸೊ ಇದ್ಯಾಂತಿನ ದಾಖಲೆ ಪಿರಕೊರು.", + "LISTS_CREATE_WITH_TOOLTIP": "ಒವ್ವೇ ಸಂಖ್ಯೆದ ಪಟ್ಟಿಲೆ ಅಂಸೊದೊಟ್ಟುಗೆ ರಚಿಸಲೆ", + "LISTS_CREATE_WITH_INPUT_WITH": "ಜತೆ ಪಟ್ಟಿನ್ ರಚಿಸಲೆ", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "ಪಟ್ಟಿ", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "ಸೇರಯರ, ದೆತ್ತ್‌ ಪಾಡೆರೆ ಅತ್ತಂಡ ಈ ಪಟ್ಯೊಲೆನ್ ತಡೆದ್ ಪತ್ತ್‌ದ್ ಇಬಾಗೊ ಮಲ್ಪುಲೆ.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "ಪಟ್ಟಿಡ್ ಕೆಲವು ಅಂಸೊಲೆನ್ ಸೇರಲೆ.", + "LISTS_REPEAT_TOOLTIP": "ಕೊರ್‍ನ ಮೌಲ್ಯಡು ನಿರ್ದಿಷ್ಟ ಕಾಲೊಡು ಪಿರೊತ ಪಟ್ಟಿನ್ ರಚಿಸಲೆ.", + "LISTS_REPEAT_TITLE": "%1 ಪಿರೊರ %2 ಕಾಲೊಡು ಪಟ್ಟಿಲೆನ ಅಂಸೊನು ರಚಿಸಲೆ.", + "LISTS_LENGTH_TITLE": "%1 ಉದ್ದೊ", + "LISTS_LENGTH_TOOLTIP": "ಪಟ್ಟಿದ ಉದ್ದೊನು ಪಿರಕೊರು.", + "LISTS_ISEMPTY_TITLE": "%1 ಕಾಲಿ", + "LISTS_ISEMPTY_TOOLTIP": "ಪಟ್ಯೊ ಕಾಲಿ ಪನ್ಪುನವು ಸತ್ಯೊ ಆಂಡ ಪಿರಕೊರು.", + "LISTS_INLIST": "ಪಟ್ಟಿಡ್", + "LISTS_INDEX_OF_FIRST": "ದುಂಬು ಕರಿನ ಪಟ್ಯೊನು ನಾಡ್‍ಲೆ", + "LISTS_INDEX_OF_LAST": "ಅಕೆರಿಗ್ ಕರಿನ ಪಟ್ಯೊನು ನಾಡ್‍ಲೆ", + "LISTS_INDEX_OF_TOOLTIP": "ಸುರುತ ಪಟ್ಯೊದ ಸೂಚ್ಯಿ/ಅಕೇರಿಟ್ ಸಂಭವಿಸವುನ ಸುರುತ ಪಟ್ಟಯೊದುಲಯಿದ ರಡ್ಡನೆ ಪಟ್ಯೊನು ಪಿರಕೊರು. %1 ಪಟ್ಯೊ ತಿಕಂದಿತ್ತ್‌ಂಡ ಪಿರಕೊರು.", + "LISTS_GET_INDEX_GET": "ದೆತೊನು", + "LISTS_GET_INDEX_GET_REMOVE": "ದೆತೊನಿಯರ ಬುಕ್ಕೊ ದೆಪ್ಪೆರೆ", + "LISTS_GET_INDEX_REMOVE": "ದೆಪ್ಪುಲೆ", + "LISTS_GET_INDEX_FROM_END": "# ಅಕೇರಿಡ್ದ್", + "LISTS_GET_INDEX_FIRST": "ಸುರುತ", + "LISTS_GET_INDEX_LAST": "ಕಡೆತ", + "LISTS_GET_INDEX_RANDOM": "ಗೊತ್ತು ಗುರಿದಾಂತಿನ", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 ಸುರುತ ಅಂಸೊ", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 ಅಕೇರಿತ ಅಂಸೊ", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "ನಿರ್ದಸ್ಟೊ ಜಾಗೆಡುಪ್ಪುನ ಅಂಸೊಲೆ ಪಟ್ಟಿನ್ ಪಿರಕೊರು", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "ಸುರುತ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ಪಿರಕೊರು.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "ಅಕೇರಿದ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ಪಿರಕೊರು.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "ಗೊತ್ತುಗುರಿದಾಂತಿನ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ಪಿರಕೊರು.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "ನಿರ್ದಿಸ್ಟೊ ಜಾಗೆಡುಪ್ಪುನ ಅಂಸೊಲೆ ಪಟ್ಟಿನ್ ದೆಪ್ಪು ಅತ್ತಂಡ ಪಿರಕೊರು", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "ಸುರುತ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ದೆಪ್ಪು ಅತ್ತಂಡ ಪಿರಕೊರು.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "ಅಕೇರಿದ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ದೆಪ್ಪು ಅತ್ತಂಡ ಪಿರಕೊರು.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "ಗೊತ್ತುಗುರಿದಾಂತಿನ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ದೆಪ್ಪು ಅತ್ತಂಡ ಪಿರಕೊರು.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "ನಿರ್ದಿಸ್ಟೊ ಜಾಗೆಡುಪ್ಪುನ ಅಂಸೊಲೆ ಪಟ್ಟಿನ್ ದೆಪ್ಪುಲೆ", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "ಸುರುತ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ದೆಪ್ಪು.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "ಅಕೇರಿದ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ದೆಪ್ಪು.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "ಗೊತ್ತುಗುರಿದಾಂತಿನ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ದೆಪ್ಪು.", + "LISTS_SET_INDEX_SET": "ಮಾಲ್ಪು", + "LISTS_SET_INDEX_INSERT": "ಸೇರಲ", + "LISTS_SET_INDEX_INPUT_TO": "ಅಂಚ", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "ನಿರ್ದಿಸ್ಟೊ ಜಾಗೆಡುಪ್ಪುನ ಅಂಸೊಲೆ ಪಟ್ಟಿನ್ ಮಾಲ್ಪು", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "ಸುರುತ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ಮಾಲ್ಪು.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "ಅಕೇರಿದ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ಮಾಲ್ಪು.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "ಗೊತ್ತುಗುರಿದಾಂತಿನ ಅಂಸೊಲೆನ ಪಟ್ಟಿನ್ ಮಾಲ್ಪು.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "ನಿರ್ದಿಸ್ಟೊ ಜಾಗೆಡುಪ್ಪುನ ಅಂಸೊಲೆ ಪಟ್ಟಿನ್ ಸೇರಲ", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "ಸುರುತ ಅಂಸೊಲೆ ಪಟ್ಟಿನ್ ಸೇರಲ.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "ಪಟ್ಟಿದ ಅಕೇರಿಗ್ ಈ ಅಂಸೊಲೆನ್ ಸೇರಲ.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "ಪಟ್ಟಿಗ್ ಗೊತ್ತುಗುರಿದಾಂತೆ ಅಂಸೊಲೆನ್ ಸೇರಲ.", + "LISTS_GET_SUBLIST_START_FROM_START": "ಉಪ-ಪಟ್ಯೊನು ದೆತೊನು#", + "LISTS_GET_SUBLIST_START_FROM_END": "ಉಪ-ಪಟ್ಯೊನು ದೆತೊನು#ಅಕೇರಿಡ್ದ್", + "LISTS_GET_SUBLIST_START_FIRST": "ಉಪ-ಪಟ್ಯೊನು ಸುರುಡ್ದು ದೆತೊನು", + "LISTS_GET_SUBLIST_END_FROM_START": "ಡ್ದ್", + "LISTS_GET_SUBLIST_END_FROM_END": "ಡ್ದ್ # ಅಕೇರಿಗ್", + "LISTS_GET_SUBLIST_END_LAST": "ಅಕೇರಿಡ್ದ್", + "LISTS_GET_SUBLIST_TOOLTIP": "ಪಟ್ಯೊದ ನಿರ್ದಿಷ್ಟ ಬಾಗೊದ ಪ್ರತಿನ್ ಸ್ರಸ್ಟಿಸವುಂಡು.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "%1 %2 %3 ಇಂಗಡಿಪು", + "LISTS_SORT_TOOLTIP": "ಪಟ್ಟಿಲೆ ಪ್ರತಿನ್ ಇಂಗಡಿಪುಲೆ", + "LISTS_SORT_ORDER_ASCENDING": "ಮಿತ್ತ್ ಪೋಪುನೆ", + "LISTS_SORT_ORDER_DESCENDING": "ತಿರ್ತ್ ಪೋಪುನೆ", + "LISTS_SORT_TYPE_NUMERIC": "ಸಂಕೇತೊ", + "LISTS_SORT_TYPE_TEXT": "ಅಕ್ಷರೊಲು", + "LISTS_SORT_TYPE_IGNORECASE": "ಅಕ್ಷರೊಲು, ಸಂದರ್ಭೊಡು ನಿರ್ಲಕ್ಷಿಸಲೆ", + "LISTS_SPLIT_LIST_FROM_TEXT": "ಪಟ್ಯೊಲೆ ಪಟ್ಟಿನ್ ತಯಾರ್ ಮಲ್ಪುಲೆ", + "LISTS_SPLIT_TEXT_FROM_LIST": "ಪಟ್ಟಿದ ಪಟ್ಯೊನು ತಯಾರ್ ಮಲ್ಪುಲೆ", + "LISTS_SPLIT_WITH_DELIMITER": "ಮಿತಿಸೂಚಕೊದ ಒಟ್ಟುಗು", + "LISTS_SPLIT_TOOLTIP_SPLIT": "ಗ್ರಂತೊಲೆನ ಪಟ್ಟಿಡ್ದ್ ಪಟ್ಯೊಲೆನ್ ಬೇತೆ ಮಾಲ್ತ್‌ಂಡ,ಪ್ರತಿ ಮಿತಿಸೂಚಕೊಡು ಬೇತೆ ಆಪುಂಡು.", + "LISTS_SPLIT_TOOLTIP_JOIN": "ಒಂಜಿ ಗ್ರಂತೊಡ್ದು ಒಂಜಿ ಪಟ್ಯೊದ ಪಟ್ಟಿಗ್ ಸೇರಾದ್, ಮಿತಿಸೂಚಕೊದ ಮೂಲಕೊ ಬೇತೆ ಮಲ್ಪುಲೆ.", + "VARIABLES_GET_TOOLTIP": "ಈ ವ್ಯತ್ಯಯೊದ ಮೌಲ್ಯೊನು ಪಿರಕೊರು.", + "VARIABLES_GET_CREATE_SET": "'%1' ರಚನೆ ಮಲ್ಪುಲೆ", + "VARIABLES_SET": "%1 ಡ್ದು %2 ಮಲ್ಪುಲೆ", + "VARIABLES_SET_TOOLTIP": "ಉಲಯಿ ಬರ್ಪುನವು ಸಮಪಾಲ್ ಇಪ್ಪುನಂಚ ವ್ಯತ್ಯಾಸೊ ಮಾಲ್ಪು", + "VARIABLES_SET_CREATE_GET": "'%1' ರಚನೆ ಮಲ್ಪುಲೆ", + "PROCEDURES_DEFNORETURN_TITLE": "ಇಂದೆಕ್", + "PROCEDURES_DEFNORETURN_PROCEDURE": "ಎಂಚಿನಾಂಡಲ ಮಲ್ಪು", + "PROCEDURES_BEFORE_PARAMS": "ಜೊತೆ:", + "PROCEDURES_CALL_BEFORE_PARAMS": "ಜೊತೆ:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "ಉತ್ಪಾದನೆ ದಾಂತಿನ ಕಾರ್ಯೊನು ಸ್ರಿಸ್ಟಿಸಲೆ.", + "PROCEDURES_DEFNORETURN_COMMENT": "ಈ ಕಾರ್ಯೊನು ಇವರಿಸಲೆ...", + "PROCEDURES_DEFRETURN_RETURN": "ಪಿರಪೋ", + "PROCEDURES_DEFRETURN_TOOLTIP": "ಉತ್ಪಾದನೆ ದಾಂತಿನ ಕಾರ್ಯೊನು ಸ್ರಿಸ್ಟಿಸಲೆ.", + "PROCEDURES_ALLOW_STATEMENTS": "ಹೇಳಿಕೆಗ್ ಅವಕಾಸೊ", + "PROCEDURES_DEF_DUPLICATE_WARNING": "ಎಚ್ಚರಿಕೆ: ಈ ಕಾರ್ಯೊ ನಕಲಿ ಮಾನದಂಡೊನು ಹೊಂದ್‍ದ್ಂಡ್.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/ಪ್ರೊಸಿಜರ್_%28ಕಂಪ್ಯೂಟರ್_ಸೈನ್ಸ್%29", + "PROCEDURES_CALLNORETURN_TOOLTIP": "'%1' ಬಳಕೆದಾರೆರೆ ಕಾರ್ಯೊನು ನಡಪಾಲೆ.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/ಪ್ರೊಸಿಜರ್_%28ಕಂಪ್ಯೂಟರ್_ಸೈನ್ಸ್%29", + "PROCEDURES_CALLRETURN_TOOLTIP": " '%1' ಬಳಕೆದಾರೆರೆ ಕಾರ್ಯೊನು ನಡಪಾಲೆ ಬುಕ್ಕೊ ಅಯಿತ ಉತ್ಪಾದನೆನ್ ಉಪಯೋಗಿಸಲೆ.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "ಉಲಪರಿಪು", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "ಸೇರಯರ, ದೆತ್ತ್‌ ಪಾಡೆರೆ ಅತ್ತಂಡ ಪಿರಕೋರಿಕೆದ ಉಲಪರಿಪುದ ಕಾರ್ಯೊನು ಮಲ್ಪುಲೆ.", + "PROCEDURES_MUTATORARG_TITLE": "ಉಲಪರಿಪುದ ಪುದರ್:", + "PROCEDURES_MUTATORARG_TOOLTIP": "ಕಾರ್ಯೊದ ಉಲಪರಿಪುನು ಸೇರಲೆ.", + "PROCEDURES_HIGHLIGHT_DEF": "ದೇರ್ತ್ ತೋಜುನ ಕಾರ್ಯೊದ ವ್ಯಾಕ್ಯಾನೊ", + "PROCEDURES_CREATE_DO": " '%1'ನ್ ರಚಿಸಲೆ", + "PROCEDURES_IFRETURN_TOOLTIP": "ಮೌಲ್ಯೊ ಸತ್ಯೊ ಆಯಿನೆಡ್ದ್ ಬುಕ್ಕೊನೆ ರಡ್ಡನೆ ಮೌಲ್ಯೊನು ಪಿರಕೊರು.", + "PROCEDURES_IFRETURN_WARNING": "ಎಚ್ಚರಿಕೆ:ವ್ಯಾಕ್ಯಾನೊದ ಕಾರ್ಯೊನು ತಡೆ ಮಲ್ಪೆರೆ ಮಾತ್ರೊ ಇಂದೆತ ಉಪಯೊಗ." +} diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/th.json b/src/opsoro/server/static/js/blockly/msg/json/th.json similarity index 86% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/th.json rename to src/opsoro/server/static/js/blockly/msg/json/th.json index 17780cc..4955576 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/th.json +++ b/src/opsoro/server/static/js/blockly/msg/json/th.json @@ -2,18 +2,22 @@ "@metadata": { "authors": [ "Azpirin", - "Octahedron80" + "Octahedron80", + "Horus", + "Roysheng" ] }, "VARIABLES_DEFAULT_NAME": "รายการ", "TODAY": "วันนี้", - "DUPLICATE_BLOCK": "ทำซ้ำ", + "DUPLICATE_BLOCK": "ทำสำเนา", "ADD_COMMENT": "ใส่คำอธิบาย", "REMOVE_COMMENT": "เอาคำอธิบายออก", "EXTERNAL_INPUTS": "อินพุตภายนอก", "INLINE_INPUTS": "อินพุตในบรรทัด", "DELETE_BLOCK": "ลบบล็อก", "DELETE_X_BLOCKS": "ลบ %1 บล็อก", + "DELETE_ALL_BLOCKS": "ลบ %1 บล็อกทั้งหมด?", + "CLEAN_UP": "จัดเรียงบล็อกให้เป็นแถว", "COLLAPSE_BLOCK": "ย่อบล็อก", "COLLAPSE_ALL": "ย่อบล็อก", "EXPAND_BLOCK": "ขยายบล็อก", @@ -21,14 +25,13 @@ "DISABLE_BLOCK": "ปิดใช้งานบล็อก", "ENABLE_BLOCK": "เปิดใช้งานบล็อก", "HELP": "ช่วยเหลือ", - "CHAT": "คุยกับผู้ร่วมงานของคุณโดยพิมพ์ลงในกล่องนี้!", - "AUTH": "กรุณาอนุญาตแอปนี้เพื่อเปิดใช้งาน การบันทึกงานของคุณ และยินยอมให้คุณแบ่งปันงานของคุณได้", - "ME": "ฉัน", + "UNDO": "ย้อนกลับ", + "REDO": "ทำซ้ำ", "CHANGE_VALUE_TITLE": "เปลี่ยนค่า:", - "NEW_VARIABLE": "สร้างตัวแปร...", - "NEW_VARIABLE_TITLE": "ชื่อตัวแปรใหม่:", "RENAME_VARIABLE": "เปลี่ยนชื่อตัวแปร...", "RENAME_VARIABLE_TITLE": "เปลี่ยนชื่อตัวแปร '%1' ทั้งหมดเป็น:", + "NEW_VARIABLE": "สร้างตัวแปร...", + "NEW_VARIABLE_TITLE": "ชื่อตัวแปรใหม่:", "COLOUR_PICKER_HELPURL": "https://th.wikipedia.org/wiki/สี", "COLOUR_PICKER_TOOLTIP": "เลือกสีจากจานสี", "COLOUR_RANDOM_TITLE": "สุ่มสี", @@ -47,19 +50,19 @@ "CONTROLS_REPEAT_TITLE": "ทำซ้ำ %1 ครั้ง", "CONTROLS_REPEAT_INPUT_DO": "ทำ:", "CONTROLS_REPEAT_TOOLTIP": "ทำซ้ำบางคำสั่งหลายครั้ง", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ทำซ้ำตราบเท่าที่", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ทำซ้ำขณะที่", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ทำซ้ำจนกระทั่ง", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "ตราบเท่าที่ค่าเป็นจริง ก็จะทำบางคำสั่ง", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "ตราบเท่าที่ค่าเป็นเท็จ ก็จะทำบางคำสั่ง", - "CONTROLS_FOR_TOOLTIP": "ตัวแปร \"%1\" จะมีค่าตั้งแต่จำนวนเริ่มต้น ไปจนถึงจำนวนสิ้นสุด โดยมีการเปลี่ยนแปลงตามจำนวนที่กำหนด", - "CONTROLS_FOR_TITLE": "นับ %1 จาก %2 จนถึง %3 เปลี่ยนค่าทีละ %4", - "CONTROLS_FOREACH_TITLE": "วนซ้ำทุกรายการ %1 ในรายการ %2", - "CONTROLS_FOREACH_TOOLTIP": "ทำซ้ำทุกรายการ กำหนดค่าตัวแปร \"%1\" ตามรายการ และทำตามคำสั่งที่กำหนดไว้", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "ขณะที่ค่าเป็นจริง ก็จะทำบางคำสั่ง", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "ขณะที่ค่าเป็นเท็จ ก็จะทำบางคำสั่ง", + "CONTROLS_FOR_TOOLTIP": "ตัวแปร '%1' จะเริ่มจากจำนวนเริ่มต้น ไปจนถึงจำนวนสุดท้าย ตามระยะที่กำหนด และ ทำบล็อกที่กำหนดไว้", + "CONTROLS_FOR_TITLE": "นับด้วย %1 จาก %2 จนถึง %3 เปลี่ยนค่าทีละ %4", + "CONTROLS_FOREACH_TITLE": "จากทุกรายการ %1 ในรายชื่อ %2", + "CONTROLS_FOREACH_TOOLTIP": "จากทุกรายการในรายชื่อ ตั้งค่าตัวแปร \"%1\" เป็นรายการ และทำตามคำสั่งที่กำหนดไว้", "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ออกจากการวนซ้ำ", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "เริ่มการวนซ้ำรอบต่อไป", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "ออกจากการวนซ้ำที่มีอยู่", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "ข้ามสิ่งที่เหลืออยู่ และไปเริ่มวนซ้ำรอบต่อไปทันที", - "CONTROLS_FLOW_STATEMENTS_WARNING": "ระวัง: บล็อกชนิดนี้สามารถใช้งานได้เมื่ออยู่ภายในการวนซ้ำเท่านั้น", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "ออกจากการวนซ้ำที่อยู่", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "ข้ามคำสั่งที่เหลืออยู่ และเริ่มต้นวนซ้ำรอบต่อไป", + "CONTROLS_FLOW_STATEMENTS_WARNING": "คำเตือน: บล็อกนี้ใช้งานได้ภายในการวนซ้ำเท่านั้น", "CONTROLS_IF_TOOLTIP_1": "ว่าเงื่อนไขเป็นจริง ก็จะ \"ทำ\" ตามที่กำหนด", "CONTROLS_IF_TOOLTIP_2": "ถ้าเงื่อนไขเป็นจริง ก็จะ \"ทำ\" ตามที่กำหนด แต่ถ้าเงื่อนไขเป็นเท็จก็จะทำ \"นอกเหนือจากนี้\"", "CONTROLS_IF_TOOLTIP_3": "ถ้าเงื่อนไขแรกเป็นจริง ก็จะทำตามคำสั่งในบล็อกแรก แต่ถ้าไม่ก็จะไปตรวจเงื่อนไขที่สอง ถ้าเงื่อนไขที่สองเป็นจริง ก็จะทำตามเงื่อนไขในบล็อกที่สองนี้", @@ -176,7 +179,7 @@ "TEXT_LENGTH_TOOLTIP": "คืนค่าความยาวของข้อความ (รวมช่องว่าง)", "TEXT_ISEMPTY_TITLE": "%1 ว่าง", "TEXT_ISEMPTY_TOOLTIP": "คืนค่าจริง ถ้าข้อความยังว่าง", - "TEXT_INDEXOF_TOOLTIP": "คืนค่าตำแหน่งที่พบข้อความแรกอยู่ในข้อความที่สอง คืนค่า 0 ถ้าหาไม่พบ", + "TEXT_INDEXOF_TOOLTIP": "คืนค่าตำแหน่งที่พบข้อความแรกอยู่ในข้อความที่สอง คืนค่า %1 ถ้าหาไม่พบ", "TEXT_INDEXOF_INPUT_INTEXT": "ในข้อความ", "TEXT_INDEXOF_OPERATOR_FIRST": "หาข้อความแรกที่พบ", "TEXT_INDEXOF_OPERATOR_LAST": "หาข้อความสุดท้ายที่พบ", @@ -225,7 +228,7 @@ "LISTS_INLIST": "ในรายการ", "LISTS_INDEX_OF_FIRST": "หาอันแรกที่พบ", "LISTS_INDEX_OF_LAST": "หาอันสุดท้ายที่พบ", - "LISTS_INDEX_OF_TOOLTIP": "คืนค่าตำแหน่งของไอเท็มอันแรก/สุดท้ายที่พบในรายการ คืนค่า 0 ถ้าหาไม่พบ", + "LISTS_INDEX_OF_TOOLTIP": "คืนค่าตำแหน่งของไอเท็มอันแรก/สุดท้ายที่พบในรายการ คืนค่า %1 ถ้าหาไม่พบ", "LISTS_GET_INDEX_GET": "เรียกดู", "LISTS_GET_INDEX_GET_REMOVE": "เรียกดูและเอาออก", "LISTS_GET_INDEX_REMOVE": "เอาออก", @@ -233,31 +236,28 @@ "LISTS_GET_INDEX_FIRST": "แรกสุด", "LISTS_GET_INDEX_LAST": "ท้ายสุด", "LISTS_GET_INDEX_RANDOM": "สุ่ม", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ #1 คือไอเท็มอันแรกสุด", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ #1 คือไอเท็มอันท้ายสุด", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 คือไอเท็มอันแรกสุด", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 คือไอเท็มอันท้ายสุด", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "คืนค่าไอเท็มอันแรกในรายการ", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "คืนค่าไอเท็มอันสุดท้ายในรายการ", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "คืนค่าไอเท็มแบบสุ่มจากรายการ", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "เอาออก และคืนค่าไอเท็มในตำแหน่งที่ระบุจากรายการ #1 คือไอเท็มอันแรก", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "เอาออก และคืนค่าไอเท็มในตำแหน่งที่ระบุจากรายการ #1 คือไอเท็มอันสุดท้าย", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "เอาออก และคืนค่าไอเท็มในตำแหน่งที่ระบุจากรายการ", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "เอาออก และคืนค่าไอเท็มอันแรกในรายการ", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "เอาออก และคืนค่าไอเท็มอันสุดท้ายในรายการ", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "เอาออก และคืนค่าไอเท็มแบบสุ่มจากรายการ", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ #1 คือไอเท็มอันแรกสุด", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ #1 คือไอเท็มอันท้ายสุด", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "เอาไอเท็มแรกสุดในรายการออก", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "เอาไอเท็มอันท้ายสุดในรายการออก", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "เอาไอเท็มแบบสุ่มจากรายการออก", "LISTS_SET_INDEX_SET": "กำหนด", "LISTS_SET_INDEX_INSERT": "แทรกที่", "LISTS_SET_INDEX_INPUT_TO": "เป็น", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "กำหนดไอเท็มในตำแหน่งที่ระบุในรายการ #1 คือไอเท็มอันแรกสุด", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "กำหนดไอเท็มในตำแหน่งที่ระบุในรายการ #1 คือไอเท็มอันท้ายสุด", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "กำหนดไอเท็มในตำแหน่งที่ระบุในรายการ", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "กำหนดไอเท็มอันแรกในรายการ", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "กำหนดไอเท็มอันสุดท้ายในรายการ", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "กำหนดไอเท็มแบบสุ่มในรายการ", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "แทรกไอเท็มเข้าไปในตำแหน่งที่กำหนด #1 คือไอเท็มอันแรก", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "แทรกไอเท็มเข้าไปในตำแหน่งที่กำหนด #1 คือไอเท็มอันสุดท้าย", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "แทรกไอเท็มเข้าไปในตำแหน่งที่กำหนด", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "แทรกไอเท็มเข้าไปเป็นอันแรกสุดของรายการ", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "เพิ่มไอเท็มเข้าไปท้ายสุดของรายการ", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "เพิ่มไอเท็มเข้าไปในรายการแบบสุ่ม", @@ -268,6 +268,14 @@ "LISTS_GET_SUBLIST_END_FROM_END": "ถึง # จากท้ายสุด", "LISTS_GET_SUBLIST_END_LAST": "ถึง ท้ายสุด", "LISTS_GET_SUBLIST_TOOLTIP": "สร้างสำเนารายการในช่วงที่กำหนด", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "เรียงลำดับ %1 %2 %3", + "LISTS_SORT_TOOLTIP": "เรียงลำดับสำเนาของรายชื่อ", + "LISTS_SORT_ORDER_ASCENDING": "น้อยไปหามาก", + "LISTS_SORT_ORDER_DESCENDING": "มากไปหาน้อย", + "LISTS_SORT_TYPE_NUMERIC": "ตัวเลข", + "LISTS_SORT_TYPE_TEXT": "ตัวอักษร", + "LISTS_SORT_TYPE_IGNORECASE": "ตัวอักษร", "LISTS_SPLIT_LIST_FROM_TEXT": "สร้างรายการจากข้อความ", "LISTS_SPLIT_TEXT_FROM_LIST": "สร้างข้อความจากรายการ", "LISTS_SPLIT_WITH_DELIMITER": "ด้วยตัวคั่น", @@ -283,15 +291,19 @@ "PROCEDURES_BEFORE_PARAMS": "ด้วย:", "PROCEDURES_CALL_BEFORE_PARAMS": "ด้วย:", "PROCEDURES_DEFNORETURN_TOOLTIP": "สร้างฟังก์ชันที่ไม่มีผลลัพธ์", + "PROCEDURES_DEFNORETURN_COMMENT": "อธิบายฟังก์ชันนี้", "PROCEDURES_DEFRETURN_RETURN": "คืนค่า", "PROCEDURES_DEFRETURN_TOOLTIP": "สร้างฟังก์ชันที่มีผลลัพธ์", + "PROCEDURES_ALLOW_STATEMENTS": "ข้อความที่ใช้ได้", "PROCEDURES_DEF_DUPLICATE_WARNING": "ระวัง: ฟังก์ชันนี้มีพารามิเตอร์ที่มีชื่อซ้ำกัน", "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_(computer_science)", "PROCEDURES_CALLNORETURN_TOOLTIP": "เรียกใช้ฟังก์ชันที่สร้างโดยผู้ใช้ \"%1\"", "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_(computer_science)", "PROCEDURES_CALLRETURN_TOOLTIP": "เรียกใช้ฟังก์ชันที่สร้างโดยผู้ใช้ \"%1\" และใช้ผลลัพธ์ของมัน", "PROCEDURES_MUTATORCONTAINER_TITLE": "นำเข้า", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "เพิ่ม, ลบ, หรือจัดเรียง ข้อมูลที่ป้อนเข้าฟังก์ชันนี้", "PROCEDURES_MUTATORARG_TITLE": "ชื่อนำเข้า:", + "PROCEDURES_MUTATORARG_TOOLTIP": "เพิ่มค่าป้อนเข้าฟังก์ชัน", "PROCEDURES_HIGHLIGHT_DEF": "เน้นฟังก์ชันนิยาม", "PROCEDURES_CREATE_DO": "สร้าง \"%1\"", "PROCEDURES_IFRETURN_TOOLTIP": "ถ้ามีค่าเป็นจริง ให้คืนค่าที่สอง", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/tl.json b/src/opsoro/server/static/js/blockly/msg/json/tl.json similarity index 93% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/tl.json rename to src/opsoro/server/static/js/blockly/msg/json/tl.json index 5c1233b..57988fa 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/tl.json +++ b/src/opsoro/server/static/js/blockly/msg/json/tl.json @@ -20,10 +20,10 @@ "ENABLE_BLOCK": "Bigyan ng bisa ang Block", "HELP": "Tulong", "CHANGE_VALUE_TITLE": "pagbago ng value:", - "NEW_VARIABLE": "New variable...", - "NEW_VARIABLE_TITLE": "New variable name:", "RENAME_VARIABLE": "Rename variable...", "RENAME_VARIABLE_TITLE": "Rename all '%1' variables to:", + "NEW_VARIABLE": "New variable...", + "NEW_VARIABLE_TITLE": "New variable name:", "COLOUR_PICKER_HELPURL": "http://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "pagpili ng kulay sa paleta.", "COLOUR_RANDOM_TITLE": "iba ibang kulay", @@ -186,7 +186,7 @@ "TEXT_LENGTH_TOOLTIP": "Returns the number of letters (including spaces) in the provided text.", "TEXT_ISEMPTY_TITLE": "%1 is empty", "TEXT_ISEMPTY_TOOLTIP": "Returns true if the provided text is empty.", - "TEXT_INDEXOF_TOOLTIP": "Returns the index of the first/last occurrence of first text in the second text. Returns 0 if text is not found.", + "TEXT_INDEXOF_TOOLTIP": "Returns the index of the first/last occurrence of first text in the second text. Returns %1 if text is not found.", "TEXT_INDEXOF_INPUT_INTEXT": "in text", "TEXT_INDEXOF_OPERATOR_FIRST": "find first occurrence of text", "TEXT_INDEXOF_OPERATOR_LAST": "find last occurrence of text", @@ -236,7 +236,7 @@ "LISTS_INLIST": "sa list", "LISTS_INDEX_OF_FIRST": "Hanapin ang unang pangyayari ng item", "LISTS_INDEX_OF_LAST": "hanapin ang huling pangyayari ng item", - "LISTS_INDEX_OF_TOOLTIP": "Pagbalik ng index ng una/huli pangyayari ng item sa list. Pagbalik ng 0 kung ang item ay hindi makita.", + "LISTS_INDEX_OF_TOOLTIP": "Pagbalik ng index ng una/huli pangyayari ng item sa list. Pagbalik ng %1 kung ang item ay hindi makita.", "LISTS_GET_INDEX_GET": "kunin", "LISTS_GET_INDEX_GET_REMOVE": "kunin at tanggalin", "LISTS_GET_INDEX_REMOVE": "tanggalin", @@ -245,31 +245,28 @@ "LISTS_GET_INDEX_FIRST": "Una", "LISTS_GET_INDEX_LAST": "huli", "LISTS_GET_INDEX_RANDOM": "nang hindi pinipili", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Ibalik ang item sa itinakdang posisyon sa list. #1 ay ang unang item.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Ibalik ang item sa tinakdang posisyon sa list. #1 ay ang huling item.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 ay ang unang item.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 ay ang huling item.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Ibalik ang item sa itinakdang posisyon sa list.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Ibalik ang unang item sa list.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Ibalik ang huling item sa list.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Nag babalik ng hindi pinipiling item sa list.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Nag tatanggal at nag babalik ng mga items sa tinukoy na posisyon sa list. #1 ang unang item.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Nag tatanggal at nag babalik ng items sa tinukoy na posisyon sa list. #1 ay ang huling item.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Nag tatanggal at nag babalik ng mga items sa tinukoy na posisyon sa list.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Nag tatanggal at nag babalik ng mga unang item sa list.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Nag tatanggal at nag babalik ng huling item sa list.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Nag tatanggal at nag babalik ng mga hindi pinipiling item sa list.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Nag tatanggal ng item sa tinukoy na posisyon sa list. #1 ay ang unang item.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Nag tatanggal ng item sa tinukoy na posisyon sa list. #1 ay ang huling item.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Nag tatanggal ng item sa tinukoy na posisyon sa list.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Nag tatanggal ng unang item sa list.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Nag tatanggal ng huling item sa list.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Nag tatanggal ng item mula sa walang pinipiling list.", "LISTS_SET_INDEX_SET": "set", "LISTS_SET_INDEX_INSERT": "isingit sa", "LISTS_SET_INDEX_INPUT_TO": "gaya ng", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Pag set ng item sa tinukoy na position sa isang list. #1 ay ang unang item.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Pag set ng item sa tinukoy na posisyon sa isang list. #1 ay ang huling item.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Pag set ng item sa tinukoy na position sa isang list.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Pag set ng unang item sa isang list.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Pag set sa huling item sa isang list.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Pag set ng walang pinipiling item sa isang list.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Nag singit ng item sa tinukoy na posistion sa list. #1 ay ang unang item.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Nag singit ng item sa tinukoy na posisyon sa list. #1 ay ang huling item.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Nag singit ng item sa tinukoy na posistion sa list.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Nag singit ng item sa simula ng list.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Idagdag ang item sa huli ng isang list.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Isingit ang item ng walang pinipili sa isang list.", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/tlh.json b/src/opsoro/server/static/js/blockly/msg/json/tlh.json similarity index 94% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/tlh.json rename to src/opsoro/server/static/js/blockly/msg/json/tlh.json index be9cfe6..8be1d1d 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/tlh.json +++ b/src/opsoro/server/static/js/blockly/msg/json/tlh.json @@ -6,6 +6,7 @@ "messagedocumentation" : "qqq" }, "VARIABLES_DEFAULT_NAME": "Doch", + "TODAY": "DaHjaj", "DUPLICATE_BLOCK": "velqa' chenmoH", "ADD_COMMENT": "QInHom chel", "REMOVE_COMMENT": "QInHom chelHa'", @@ -13,6 +14,8 @@ "INLINE_INPUTS": "qoD rar", "DELETE_BLOCK": "ngogh Qaw'", "DELETE_X_BLOCKS": "%1 ngoghmey Qaw'", + "DELETE_ALL_BLOCKS": "Hoch %1 ngoghmey Qaw'?", + "CLEAN_UP": "ngoghmeyvaD tlhegh rurmoH", "COLLAPSE_BLOCK": "ngogh DejmoH", "COLLAPSE_ALL": "ngoghmey DejmoH", "EXPAND_BLOCK": "ngogh DejHa'moH", @@ -20,8 +23,8 @@ "DISABLE_BLOCK": "ngogh Qotlh", "ENABLE_BLOCK": "ngogh QotlhHa'", "HELP": "QaH", - "CHAT": "beqpu'lI'vaD bIjawmeH naDev yIrI'!", - "AUTH": "ngogh nablIj DapollaHmeH qoj latlhvaD DangeHlaHmeH chaw' yInob.", + "UNDO": "vangHa'", + "REDO": "vangqa'", "CHANGE_VALUE_TITLE": "choH:", "NEW_VARIABLE": "lIw chu'...", "NEW_VARIABLE_TITLE": "lIw chu' pong:", @@ -155,6 +158,9 @@ "LISTS_GET_SUBLIST_END_FROM_END": "mojaQ # Qav", "LISTS_GET_SUBLIST_END_LAST": "mojaQ Qav", "LISTS_GET_SUBLIST_TAIL": "Suq", + "LISTS_SPLIT_LIST_FROM_TEXT": "tetlh ghermeH ghItlh wav", + "LISTS_SPLIT_TEXT_FROM_LIST": "ghItlh chenmoHmeH tetlh gherHa'", + "LISTS_SPLIT_WITH_DELIMITER": "rarwI'Hom lo'", "ORDINAL_NUMBER_SUFFIX": "", "VARIABLES_GET_CREATE_SET": "chel 'choH %1'", "VARIABLES_SET": "choH %1 %2", @@ -164,9 +170,10 @@ "PROCEDURES_BEFORE_PARAMS": "qel:", "PROCEDURES_CALL_BEFORE_PARAMS": "qel:", "PROCEDURES_DEFNORETURN_DO": "", + "PROCEDURES_DEFNORETURN_COMMENT": "mIw yIDel...", "PROCEDURES_DEFRETURN_RETURN": "chegh", + "PROCEDURES_ALLOW_STATEMENTS": "mu'tlhegh chaw'", "PROCEDURES_DEF_DUPLICATE_WARNING": "ghuHmoHna': qelwI' cha'logh chen.", - "PROCEDURES_CALLNORETURN_CALL": "", "PROCEDURES_MUTATORCONTAINER_TITLE": "qelwI'mey", "PROCEDURES_MUTATORARG_TITLE": "pong:", "PROCEDURES_HIGHLIGHT_DEF": "mIwna' wew", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/tr.json b/src/opsoro/server/static/js/blockly/msg/json/tr.json similarity index 88% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/tr.json rename to src/opsoro/server/static/js/blockly/msg/json/tr.json index bc67ff1..1db02bd 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/tr.json +++ b/src/opsoro/server/static/js/blockly/msg/json/tr.json @@ -8,7 +8,12 @@ "아라", "Watermelon juice", "Uğurkent", - "McAang" + "McAang", + "Gurkanht", + "HakanIST", + "Imabadplayer", + "Kumkumuk", + "Alpkant" ] }, "VARIABLES_DEFAULT_NAME": "öge", @@ -20,6 +25,8 @@ "INLINE_INPUTS": "Satır içi girdiler", "DELETE_BLOCK": "Bloğu Sil", "DELETE_X_BLOCKS": "%1 Blokları Sil", + "DELETE_ALL_BLOCKS": "Tüm %1 blok silinsin mi?", + "CLEAN_UP": "Blokları temizle", "COLLAPSE_BLOCK": "Blok'u Daralt", "COLLAPSE_ALL": "Blokları Daralt", "EXPAND_BLOCK": "Bloğu Genişlet", @@ -27,14 +34,16 @@ "DISABLE_BLOCK": "Bloğu Devre Dışı Bırak", "ENABLE_BLOCK": "Bloğu Etkinleştir", "HELP": "Yardım", - "CHAT": "Bu kutuya yazarak iş birlikçin ile sohbet et!", - "AUTH": "Çalışmanızın kaydedilmesi ve sizinle paylaşılmasına izin verilmesi için lütfen bu uygulamaya yetki verin.", - "ME": "Beni", + "UNDO": "Geri al", + "REDO": "Yinele", "CHANGE_VALUE_TITLE": "Değeri değiştir:", - "NEW_VARIABLE": "Yeni değişken...", - "NEW_VARIABLE_TITLE": "Yeni değişken ismi :", "RENAME_VARIABLE": "Değişkeni yeniden adlandır...", "RENAME_VARIABLE_TITLE": "Tüm '%1' değişkenlerini yeniden isimlendir:", + "NEW_VARIABLE": "Değişken oluştur...", + "NEW_VARIABLE_TITLE": "Yeni değişken ismi :", + "VARIABLE_ALREADY_EXISTS": "'%1' isimli değişken adı zaten var.", + "DELETE_VARIABLE_CONFIRMATION": "'%2' değişkeninin %1 kullanımını silmek istiyor musunuz?", + "DELETE_VARIABLE": "'%1' değişkenini silmek istiyor musunuz?", "COLOUR_PICKER_HELPURL": "https://tr.wikipedia.org/wiki/Renk", "COLOUR_PICKER_TOOLTIP": "Paletten bir renk seçin.", "COLOUR_RANDOM_TITLE": "rastgele renk", @@ -59,7 +68,7 @@ "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "kadar tekrarla", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Bir değer doğru olduğunda bazı beyanlarda bulun.", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Bir değer yanlış olduğunda bazı beyanlarda bulun.", - "CONTROLS_FOR_TOOLTIP": "\"%1\" değişkenini başlangıç numarasından bitiş numarasına kadar tanımlı farkla değerler verirken tanımlı blokları yap.", + "CONTROLS_FOR_TOOLTIP": "Başlangıç sayısından bitiş sayısına kadar belirtilen aralık ve belirtilen engeller ile devam eden değerler alan '%1' değişkeni oluştur.", "CONTROLS_FOR_TITLE": "ile sayılır %1 %2 den %3 ye, her adımda %4 değişim", "CONTROLS_FOREACH_TITLE": "her öğe için %1 listede %2", "CONTROLS_FOREACH_TOOLTIP": "Bir listedeki her öğe için '%1' değişkenini maddeye atayın ve bundan sonra bazı açıklamalar yapın.", @@ -151,6 +160,7 @@ "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "%1'i %2 kadar değiştir", "MATH_CHANGE_TOOLTIP": "'%1' değişkenine bir sayı ekle.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding Yuvarlama fonksiyonu için araştırma yapınız, sayfanın Türkçe çevirisi henüz mevcut değil.", "MATH_ROUND_TOOLTIP": "Bir sayı yı yukarı yada aşağı yuvarla .", "MATH_ROUND_OPERATOR_ROUND": "Yuvarla", "MATH_ROUND_OPERATOR_ROUNDUP": "yukarı yuvarla", @@ -197,7 +207,7 @@ "TEXT_LENGTH_TOOLTIP": "Yazı içerisinde verilen harflerin ( harf arasındaki boşluklar dahil) sayısını verir .", "TEXT_ISEMPTY_TITLE": "%1 boş", "TEXT_ISEMPTY_TOOLTIP": "Verilen metin boşsa true(doğru) değerini verir.", - "TEXT_INDEXOF_TOOLTIP": "İlk metnin ikinci metnin içindeki ilk ve son varoluşlarının indeksini döndürür.Metin bulunamadıysa 0 döndürür.", + "TEXT_INDEXOF_TOOLTIP": "İlk metnin ikinci metnin içindeki ilk ve son varoluşlarının indeksini döndürür.Metin bulunamadıysa %1 döndürür.", "TEXT_INDEXOF_INPUT_INTEXT": "metinde", "TEXT_INDEXOF_OPERATOR_FIRST": "Metnin ilk varolduğu yeri bul", "TEXT_INDEXOF_OPERATOR_LAST": "Metnin son varolduğu yeri bul", @@ -250,7 +260,7 @@ "LISTS_INLIST": "Listede", "LISTS_INDEX_OF_FIRST": "Öğenin ilk varolduğu yeri bul", "LISTS_INDEX_OF_LAST": "Öğenin son varolduğu yeri bul", - "LISTS_INDEX_OF_TOOLTIP": "Öğenin listede , ilk ve son görüldüğü dizinleri döndürür . Öğe bulunmassa , 0 döndürür .", + "LISTS_INDEX_OF_TOOLTIP": "Listedeki öğenin ilk/son oluşumunun indeksini döndürür. Eğer öğe bulunamaz ise %1 döndürür.", "LISTS_GET_INDEX_GET": "Al", "LISTS_GET_INDEX_GET_REMOVE": "al ve kaldır", "LISTS_GET_INDEX_REMOVE": "kaldır", @@ -260,31 +270,28 @@ "LISTS_GET_INDEX_LAST": "son", "LISTS_GET_INDEX_RANDOM": "rastgele", "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Listede belirli pozisyondaki bir öğeyi verir.#1 ilk öğedir.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Listede belirli pozisyondaki bir öğeyi verir.#1 son öğedir.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 ilk öğedir.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 son öğedir.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Listede belirli pozisyondaki bir öğeyi verir.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Listedeki ilk öğeyi verir.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Listedeki son öğeyi verir.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Listedeki rastgele bir öğeyi verir.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Kaldırır ve listede belirtilen konumdaki bir öğeyi döndürür. #1 son öğedir.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Kaldırır ve listede belirtilen konumdaki bir ögeyi döndürür. #1 son ögedir.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Kaldırır ve listede belirtilen konumdaki bir öğeyi döndürür.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Kaldırır ve listedeki ilk öğeyi döndürür.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Kaldırır ve listedeki son öğeyi döndürür.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Kaldırır ve listedeki rastgele bir öğeyi verir.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Bir liste içerisinde , tanımlanan pozisyonda ki öğeyi kaldırır.#1 ilk öğedir.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Liste içerisinde , tanımlanan pozisyondaki bir öğeyi kaldırır . #1 son öğe dir .", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Bir liste içerisinde , tanımlanan pozisyonda ki öğeyi kaldırır.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Listedeki ilk nesneyi kaldırır.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Listedeki son nesneyi kaldırır.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Listedeki rastgele bir nesneyi kaldırır.", "LISTS_SET_INDEX_SET": "yerleştir", "LISTS_SET_INDEX_INSERT": "e yerleştir", "LISTS_SET_INDEX_INPUT_TO": "olarak", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Bir öğeyi belirtilen yere göre listeye yerleştirir . #1 ilk öğedir .", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Bir öğeyi belirtilen yere göre listeye yerleştirir . #1 son öğedir .", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Bir öğeyi belirtilen yere göre listeye yerleştirir .", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Bir listenin ilk öğesini yerleştirir .", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Bir listedeki son öğeyi yerleştirir .", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Listeye rast gele bir öğe yerleştirir .", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Bir öğeyi belirtilen pozisyona göre listeye yerleştirir . #1 ilk öğedir .", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Bir öğeyi , belirtilen yer pozisyonuna göre , listeye yerleştirir . #1 son öğedir .", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Bir öğeyi belirtilen pozisyona göre listeye yerleştirir .", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Nesneyi listenin başlangıcına ekler.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Öğeyi listenin sonuna ekle .", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Bir öğeyi listeye rast gele ekler .", @@ -296,6 +303,19 @@ "LISTS_GET_SUBLIST_END_LAST": "Sona kadar", "LISTS_GET_SUBLIST_TAIL": "", "LISTS_GET_SUBLIST_TOOLTIP": "Listenin belirli bir kısmının kopyasını yaratır.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "kısa %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Listenin kısa bir kopyası.", + "LISTS_SORT_ORDER_ASCENDING": "artan", + "LISTS_SORT_ORDER_DESCENDING": "azalan", + "LISTS_SORT_TYPE_NUMERIC": "sayısal", + "LISTS_SORT_TYPE_TEXT": "alfabetik", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetik, gözardı et", + "LISTS_SPLIT_LIST_FROM_TEXT": "metinden liste yap", + "LISTS_SPLIT_TEXT_FROM_LIST": "listeden metin yap", + "LISTS_SPLIT_WITH_DELIMITER": "sınırlayıcı ile", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Her sınırlayıcıda kesen metinleri bir metin listesine ayır.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Bir sınırlayıcı tarafından kesilen metinlerin listesini bir metine ekle.", "ORDINAL_NUMBER_SUFFIX": "", "VARIABLES_GET_TOOLTIP": "Bu değişkenin değerini verir.", "VARIABLES_GET_CREATE_SET": "'set %1' oluştur", @@ -309,12 +329,13 @@ "PROCEDURES_CALL_BEFORE_PARAMS": "ile :", "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "Çıktı vermeyen bir fonksiyon yaratır .", + "PROCEDURES_DEFNORETURN_COMMENT": "Bu işlevi açıkla...", "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "Geri dön", "PROCEDURES_DEFRETURN_TOOLTIP": "Çıktı veren bir fonksiyon oluşturur.", "PROCEDURES_ALLOW_STATEMENTS": "Eğer ifadelerine izin ver", "PROCEDURES_DEF_DUPLICATE_WARNING": "Uyarı: Bu fonksiyon yinelenen parametreler vardır.", - "PROCEDURES_CALLNORETURN_CALL": "", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_CALLNORETURN_TOOLTIP": "Kullanıcı tanımlı fonksiyonu çalıştır '%1' .", "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_CALLRETURN_TOOLTIP": "Kullanıcı tanımlı fonksiyonu çalıştır '%1' ve çıktısını kullan .", @@ -325,5 +346,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Fonksiyon tanımı vurgulamak", "PROCEDURES_CREATE_DO": "'%1' oluştur", "PROCEDURES_IFRETURN_TOOLTIP": "Eğer değer doğruysa, ikinci değere geri dön.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Uyarı: Bu blok yalnızca bir fonksiyon tanımı içinde kullanılır." } diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/uk.json b/src/opsoro/server/static/js/blockly/msg/json/uk.json similarity index 91% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/uk.json rename to src/opsoro/server/static/js/blockly/msg/json/uk.json index 277a5b9..dca2fa7 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/uk.json +++ b/src/opsoro/server/static/js/blockly/msg/json/uk.json @@ -5,7 +5,9 @@ "Base", "Igor Zavadsky", "Lxlalexlxl", - "아라" + "아라", + "Visem", + "Piramidion" ] }, "VARIABLES_DEFAULT_NAME": "елемент", @@ -17,6 +19,8 @@ "INLINE_INPUTS": "Вбудовані входи", "DELETE_BLOCK": "Видалити блок", "DELETE_X_BLOCKS": "Видалити %1 блоків", + "DELETE_ALL_BLOCKS": "Вилучити всі блоки %1?", + "CLEAN_UP": "Вирівняти блоки", "COLLAPSE_BLOCK": "Згорнути блок", "COLLAPSE_ALL": "Згорнути блоки", "EXPAND_BLOCK": "Розгорнути блок", @@ -24,14 +28,16 @@ "DISABLE_BLOCK": "Вимкнути блок", "ENABLE_BLOCK": "Увімкнути блок", "HELP": "Довідка", - "CHAT": "Спілкуйтеся з вашими співавторами, набираючи у цьому полі!", - "AUTH": "Будь ласка, авторизуйте цю програму, аби можна було зберігати вашу роботу і для надання можливості вам поширювати її.", - "ME": "Я", + "UNDO": "Скасувати", + "REDO": "Повторити", "CHANGE_VALUE_TITLE": "Змінити значення:", - "NEW_VARIABLE": "Нова змінна...", - "NEW_VARIABLE_TITLE": "Нова назва змінної:", "RENAME_VARIABLE": "Перейменувати змінну...", "RENAME_VARIABLE_TITLE": "Перейменувати усі змінні \"%1\" до:", + "NEW_VARIABLE": "Створити змінну...", + "NEW_VARIABLE_TITLE": "Нова назва змінної:", + "VARIABLE_ALREADY_EXISTS": "Змінна з назвою '%1' вже існує.", + "DELETE_VARIABLE_CONFIRMATION": "Вилучити %1 використання змінної '%2'?", + "DELETE_VARIABLE": "Вилучити змінну '%1'", "COLOUR_PICKER_HELPURL": "https://uk.wikipedia.org/wiki/Колір", "COLOUR_PICKER_TOOLTIP": "Вибрати колір з палітри.", "COLOUR_RANDOM_TITLE": "випадковий колір", @@ -185,7 +191,7 @@ "TEXT_LENGTH_TOOLTIP": "Повертає число символів (включно з пропусками) у даному тексті.", "TEXT_ISEMPTY_TITLE": "%1 є порожнім", "TEXT_ISEMPTY_TOOLTIP": "Повертає істину, якщо вказаний текст порожній.", - "TEXT_INDEXOF_TOOLTIP": "Повертає індекс першого/останнього входження першого тексту в другий. Повертає 0, якщо текст не знайдено.", + "TEXT_INDEXOF_TOOLTIP": "Повертає індекс першого/останнього входження першого тексту в другий. Повертає %1, якщо текст не знайдено.", "TEXT_INDEXOF_INPUT_INTEXT": "у тексті", "TEXT_INDEXOF_OPERATOR_FIRST": "знайти перше входження тексту", "TEXT_INDEXOF_OPERATOR_LAST": "знайти останнє входження тексту", @@ -239,7 +245,7 @@ "LISTS_INLIST": "у списку", "LISTS_INDEX_OF_FIRST": "знайти перше входження елемента", "LISTS_INDEX_OF_LAST": "знайти останнє входження елемента", - "LISTS_INDEX_OF_TOOLTIP": "Повертає індекс першого/останнього входження елемента у списку. Повертає 0, якщо текст не знайдено.", + "LISTS_INDEX_OF_TOOLTIP": "Повертає індекс першого/останнього входження елемента у списку. Повертає %1, якщо елемент не знайдено.", "LISTS_GET_INDEX_GET": "отримати", "LISTS_GET_INDEX_GET_REMOVE": "отримати і вилучити", "LISTS_GET_INDEX_REMOVE": "вилучити", @@ -249,31 +255,28 @@ "LISTS_GET_INDEX_LAST": "останній", "LISTS_GET_INDEX_RANDOM": "випадковий", "LISTS_GET_INDEX_TAIL": "-ий.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Повертає елемент у заданій позиції у списку. #1 - це перший елемент.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Повертає елемент у заданій позиції у списку. #1 - це останній елемент.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 - це перший елемент.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 - це останній елемент.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Повертає елемент у заданій позиції у списку.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Повертає перший елемент списку.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Повертає останній елемент списку.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Повертає випадковий елемент списку.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Видаляє і повертає елемент у заданій позиції у списку. #1 - це перший елемент.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Видаляє і повертає елемент у заданій позиції у списку. #1 - це останній елемент.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Видаляє і повертає елемент у заданій позиції у списку.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Видаляє і повертає перший елемент списку.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Видаляє і повертає останній елемент списку.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Видаляє і повертає випадковий елемент списоку.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Вилучає зі списку елемент у вказаній позиції. #1 - це перший елемент.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Вилучає зі списку елемент у вказаній позиції. #1 - це останній елемент.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Вилучає зі списку елемент у вказаній позиції.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Вилучає перший елемент списку.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Вилучає останній елемент списку.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Вилучає випадковий елемент списку.", "LISTS_SET_INDEX_SET": "встановити", "LISTS_SET_INDEX_INSERT": "вставити в", "LISTS_SET_INDEX_INPUT_TO": "як", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Задає елемент списку у вказаній позиції. #1 - це перший елемент.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Задає елемент списку у вказаній позиції. #1 - це останній елемент.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Задає елемент списку у вказаній позиції.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Задає перший елемент списку.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Задає останній елемент списку.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Задає випадковий елемент у списку.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Вставка елемента у вказану позицію списку. #1 - перший елемент.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Вставляє елемент у вказану позицію списку. #1 - це останній елемент.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Вставка елемента у вказану позицію списку.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Вставляє елемент на початок списку.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Додає елемент у кінці списку.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Випадковим чином вставляє елемент у список.", @@ -285,6 +288,14 @@ "LISTS_GET_SUBLIST_END_LAST": "до останнього", "LISTS_GET_SUBLIST_TAIL": "символу.", "LISTS_GET_SUBLIST_TOOLTIP": "Створює копію вказаної частини списку.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "сортувати %3 %1 %2", + "LISTS_SORT_TOOLTIP": "Сортувати копію списку.", + "LISTS_SORT_ORDER_ASCENDING": "за зростанням", + "LISTS_SORT_ORDER_DESCENDING": "за спаданням", + "LISTS_SORT_TYPE_NUMERIC": "як числа", + "LISTS_SORT_TYPE_TEXT": "за абеткою", + "LISTS_SORT_TYPE_IGNORECASE": "за абеткою, ігноруючи регістр", "LISTS_SPLIT_LIST_FROM_TEXT": "зробити з тексту список", "LISTS_SPLIT_TEXT_FROM_LIST": "зробити зі списку текст", "LISTS_SPLIT_WITH_DELIMITER": "з розділювачем", @@ -303,13 +314,13 @@ "PROCEDURES_CALL_BEFORE_PARAMS": "з:", "PROCEDURES_DEFNORETURN_DO": "блок тексту", "PROCEDURES_DEFNORETURN_TOOLTIP": "Створює функцію без виводу.", + "PROCEDURES_DEFNORETURN_COMMENT": "Опишіть цю функцію...", "PROCEDURES_DEFRETURN_HELPURL": "https://uk.wikipedia.org/wiki/Підпрограма", "PROCEDURES_DEFRETURN_RETURN": "повернути", "PROCEDURES_DEFRETURN_TOOLTIP": "Створює функцію з виводом.", "PROCEDURES_ALLOW_STATEMENTS": "дозволити дії", "PROCEDURES_DEF_DUPLICATE_WARNING": "Увага: ця функція має дубльовані параметри.", "PROCEDURES_CALLNORETURN_HELPURL": "https://uk.wikipedia.org/wiki/Підпрограма", - "PROCEDURES_CALLNORETURN_CALL": "блок тексту", "PROCEDURES_CALLNORETURN_TOOLTIP": "Запустити користувацьку функцію \"%1\".", "PROCEDURES_CALLRETURN_HELPURL": "https://uk.wikipedia.org/wiki/Підпрограма", "PROCEDURES_CALLRETURN_TOOLTIP": "Запустити користувацьку функцію \"%1\" і використати її вивід.", @@ -320,5 +331,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Підсвітити визначення функції", "PROCEDURES_CREATE_DO": "Створити \"%1\"", "PROCEDURES_IFRETURN_TOOLTIP": "Якщо значення істинне, то повернути друге значення.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Попередження: цей блок може використовуватися лише в межах визначення функції." } diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/vi.json b/src/opsoro/server/static/js/blockly/msg/json/vi.json similarity index 91% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/vi.json rename to src/opsoro/server/static/js/blockly/msg/json/vi.json index 8fbe001..cfe6c7d 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/vi.json +++ b/src/opsoro/server/static/js/blockly/msg/json/vi.json @@ -16,6 +16,7 @@ "INLINE_INPUTS": "Chỗ Gắn Cùng Dòng", "DELETE_BLOCK": "Xóa Mảnh Này", "DELETE_X_BLOCKS": "Xóa %1 Mảnh", + "DELETE_ALL_BLOCKS": "Xóa hết %1 mảnh?", "COLLAPSE_BLOCK": "Thu Nhỏ Mảnh", "COLLAPSE_ALL": "Thu Nhỏ Mọi Mảnh", "EXPAND_BLOCK": "Mở Lớn Mảnh", @@ -23,14 +24,11 @@ "DISABLE_BLOCK": "Ngưng Tác Dụng", "ENABLE_BLOCK": "Phục Hồi Tác Dụng", "HELP": "Trợ Giúp", - "CHAT": "Trò chuyện với cộng tác viên của bạn bằng cách gõ vào hộp này!", - "AUTH": "Vui lòng cho phép ứng dụng được lưu dữ liệu của bạn và tự động chia sẻ bằng tên của bạn", - "ME": "Tôi", "CHANGE_VALUE_TITLE": "Thay giá trị thành:", - "NEW_VARIABLE": "Biến mới...", - "NEW_VARIABLE_TITLE": "Tên của biến mới:", "RENAME_VARIABLE": "Thay tên biến...", "RENAME_VARIABLE_TITLE": "Thay tên tất cả \"%1\" biến này thành:", + "NEW_VARIABLE": "Biến mới...", + "NEW_VARIABLE_TITLE": "Tên của biến mới:", "COLOUR_PICKER_HELPURL": "https://vi.wikipedia.org/wiki/M%C3%A0u_s%E1%BA%AFc", "COLOUR_PICKER_TOOLTIP": "Chọn một màu từ bảng màu.", "COLOUR_RANDOM_TITLE": "màu bất kỳ", @@ -180,7 +178,7 @@ "TEXT_LENGTH_TOOLTIP": "Hoàn trả số lượng ký tự (kể cả khoảng trắng) trong văn bản đầu vào.", "TEXT_ISEMPTY_TITLE": "%1 trống không", "TEXT_ISEMPTY_TOOLTIP": "Hoàn trả “đúng nếu văn bản không có ký tự nào.", - "TEXT_INDEXOF_TOOLTIP": "Hoàn trả vị trí xuất hiện đầu/cuối của văn bản thứ nhất trong văn bản thứ hai. Nếu không tìm thấy thì hoàn trả số 0.", + "TEXT_INDEXOF_TOOLTIP": "Hoàn trả vị trí xuất hiện đầu/cuối của văn bản thứ nhất trong văn bản thứ hai. Nếu không tìm thấy thì hoàn trả số %1.", "TEXT_INDEXOF_INPUT_INTEXT": "trong văn bản", "TEXT_INDEXOF_OPERATOR_FIRST": "tìm sự có mặt đầu tiên của", "TEXT_INDEXOF_OPERATOR_LAST": "tìm sự có mặt cuối cùng của", @@ -231,7 +229,7 @@ "LISTS_INLIST": "trong dánh sách", "LISTS_INDEX_OF_FIRST": "tìm sự có mặt đầu tiên của vật", "LISTS_INDEX_OF_LAST": "tìm sự có mặt cuối cùng của vật", - "LISTS_INDEX_OF_TOOLTIP": "Hoàn trả vị trí xuất hiện đầu/cuối của vật trong danh sách. Nếu không tìm thấy thì hoàn trả số 0.", + "LISTS_INDEX_OF_TOOLTIP": "Hoàn trả vị trí xuất hiện đầu/cuối của vật trong danh sách. Nếu không tìm thấy thì hoàn trả số %1.", "LISTS_GET_INDEX_GET": "lấy thành tố", "LISTS_GET_INDEX_GET_REMOVE": "lấy và xóa thành tố", "LISTS_GET_INDEX_REMOVE": "xóa thành tố", @@ -240,31 +238,28 @@ "LISTS_GET_INDEX_FIRST": "đầu tiên", "LISTS_GET_INDEX_LAST": "cuối cùng", "LISTS_GET_INDEX_RANDOM": "bất kỳ", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Hoàn trả thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố đầu tiên.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Hoàn trả thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố cuối cùng.", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 là thành tố đầu tiên.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 là thành tố cuối cùng.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Hoàn trả thành tố trong danh sách ở vị trí ấn định.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Hoàn trả thành tố đầu tiên trong danh sách.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Hoàn trả thành tố cuối cùng trong danh sách.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Hoàn trả một thành tố bất kỳ trong danh sách.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Hoàn trả và xóa thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố đầu tiên.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Hoàn trả và xóa thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố cuối cùng.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Hoàn trả và xóa thành tố trong danh sách ở vị trí ấn định.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Hoàn trả và xóa thành tố đầu tiên trong danh sách.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Hoàn trả và xóa thành tố cuối cùng trong danh sách.", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Hoàn trả và xóa mộtthành tố bất kỳ trong danh sách.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Xóa thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố đầu tiên.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Xóa thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố cuối cùng.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Xóa thành tố trong danh sách ở vị trí ấn định.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Xóa thành tố đầu tiên trong danh sách.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Xóa thành tố cuối cùng trong danh sách.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Xóa thành tố bất kỳ trong danh sách.", "LISTS_SET_INDEX_SET": "đặt thành tố", "LISTS_SET_INDEX_INSERT": "gắn chèn vào vị trí", "LISTS_SET_INDEX_INPUT_TO": "giá trị", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Đặt giá trị của thành tố ở vị trí ấn định trong một danh sách. #1 là thành tố đầu tiên.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Đặt giá trị của thành tố trong một danh sách ở vị trí ấn định từ phía cuối. #1 là thành tố cuối cùng.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Đặt giá trị của thành tố ở vị trí ấn định trong một danh sách.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Đặt giá trị của thành tố đầu tiên trong danh sách.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Đặt giá trị của thành tố cuối cùng trong danh sách.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Đặt giá trị của thành tố ngẫu nhiên trong danh sách.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Gắn chèn vật vào danh sách theo vị trí ấn định. #1 là thành tố đầu tiên.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Gắn chèn vật vào danh sách theo vị trí ấn định từ phía cuối. #1 là thành tố cuối cùng.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Gắn chèn vật vào danh sách theo vị trí ấn định.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Gắn chèn vật vào đầu danh sách.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Gắn thêm vật vào cuối danh sách.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Gắn chèn vật vào danh sách ở vị trí ngẫu nhiên.", @@ -290,7 +285,6 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Một thủ tục có giá trị hoàn trả.", "PROCEDURES_ALLOW_STATEMENTS": "cho phép báo cáo", "PROCEDURES_DEF_DUPLICATE_WARNING": "Chú ý: Thủ tục này có lặp lại tên các tham số.", - "PROCEDURES_CALLNORETURN_CALL": "thực hiện", "PROCEDURES_CALLNORETURN_TOOLTIP": "Chạy một thủ tục không có giá trị hoàn trả.", "PROCEDURES_CALLRETURN_TOOLTIP": "Chạy một thủ tục có giá trị hoàn trả.", "PROCEDURES_MUTATORCONTAINER_TITLE": "các tham số", diff --git a/src/opsoro/apps/visual_programming/static/blockly/msg/json/zh-hans.json b/src/opsoro/server/static/js/blockly/msg/json/zh-hans.json similarity index 80% rename from src/opsoro/apps/visual_programming/static/blockly/msg/json/zh-hans.json rename to src/opsoro/server/static/js/blockly/msg/json/zh-hans.json index 68bef54..50cb182 100644 --- a/src/opsoro/apps/visual_programming/static/blockly/msg/json/zh-hans.json +++ b/src/opsoro/server/static/js/blockly/msg/json/zh-hans.json @@ -7,7 +7,11 @@ "Qiyue2001", "Xiaomingyan", "Yfdyh000", - "아라" + "아라", + "Hudafu", + "Shatteredwind", + "Duzc2", + "Tonylianlong" ] }, "VARIABLES_DEFAULT_NAME": "项目", @@ -19,6 +23,8 @@ "INLINE_INPUTS": "单行输入", "DELETE_BLOCK": "删除块", "DELETE_X_BLOCKS": "删除 %1 块", + "DELETE_ALL_BLOCKS": "删除所有%1块吗?", + "CLEAN_UP": "整理块", "COLLAPSE_BLOCK": "折叠块", "COLLAPSE_ALL": "折叠块", "EXPAND_BLOCK": "展开块", @@ -26,14 +32,16 @@ "DISABLE_BLOCK": "禁用块", "ENABLE_BLOCK": "启用块", "HELP": "帮助", - "CHAT": "通过在此框输入与您的合作者沟通!", - "AUTH": "请授权这个应用程序以保存您的作品并共享。", - "ME": "我", + "UNDO": "撤销", + "REDO": "重做", "CHANGE_VALUE_TITLE": "更改值:", - "NEW_VARIABLE": "新变量...", - "NEW_VARIABLE_TITLE": "新变量的名称:", "RENAME_VARIABLE": "重命名变量...", "RENAME_VARIABLE_TITLE": "将所有“%1”变量重命名为:", + "NEW_VARIABLE": "创建变量...", + "NEW_VARIABLE_TITLE": "新变量的名称:", + "VARIABLE_ALREADY_EXISTS": "已存在名为“%1”的变量。", + "DELETE_VARIABLE_CONFIRMATION": "删除“%2”变量的%1用途么?", + "DELETE_VARIABLE": "删除“%1”变量", "COLOUR_PICKER_HELPURL": "https://zh.wikipedia.org/wiki/颜色", "COLOUR_PICKER_TOOLTIP": "从调色板中选择一种颜色。", "COLOUR_RANDOM_TITLE": "随机颜色", @@ -42,7 +50,7 @@ "COLOUR_RGB_RED": "红色", "COLOUR_RGB_GREEN": "绿色", "COLOUR_RGB_BLUE": "蓝色", - "COLOUR_RGB_TOOLTIP": "通过指定红色、绿色和蓝色的量创建一种颜色。所有的值必须介于0和100之间。", + "COLOUR_RGB_TOOLTIP": "通过指定红色、绿色和蓝色的量创建一种颜色。所有的值必须在0和100之间。", "COLOUR_BLEND_TITLE": "混合", "COLOUR_BLEND_COLOUR1": "颜色1", "COLOUR_BLEND_COLOUR2": "颜色2", @@ -66,9 +74,9 @@ "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "跳过这个循环的剩余部分,并继续下一次迭代。", "CONTROLS_FLOW_STATEMENTS_WARNING": "警告:此块仅可用于在一个循环内。", "CONTROLS_IF_TOOLTIP_1": "如果值为真,执行一些语句。", - "CONTROLS_IF_TOOLTIP_2": "如果值为真,则执行语句的第一块;否则,则执行语句的第二块。", - "CONTROLS_IF_TOOLTIP_3": "如果第一个值为真,则执行语句的第一个块;否则,如果第二个值为真,则执行语句的第二块。", - "CONTROLS_IF_TOOLTIP_4": "如果第一个值为真,则执行语句的第一块;否则,如果第二个值为真,则执行语句的第二块;如果没有值为真,则执行语句的最后一块。", + "CONTROLS_IF_TOOLTIP_2": "如果值为真,则执行第一块语句。否则,则执行第二块语句。", + "CONTROLS_IF_TOOLTIP_3": "如果第一个值为真,则执行第一块的语句。否则,如果第二个值为真,则执行第二块的语句。", + "CONTROLS_IF_TOOLTIP_4": "如果第一个值为真,则执行第一块对语句。否则,如果第二个值为真,则执行语句的第二块。如果没有值为真,则执行最后一块的语句。", "CONTROLS_IF_MSG_IF": "如果", "CONTROLS_IF_MSG_ELSEIF": "否则如果", "CONTROLS_IF_MSG_ELSE": "否则", @@ -86,12 +94,12 @@ "LOGIC_OPERATION_AND": "和", "LOGIC_OPERATION_TOOLTIP_OR": "如果至少有一个输入结果为真,则返回真。", "LOGIC_OPERATION_OR": "或", - "LOGIC_NEGATE_HELPURL": "https://zh.wikipedia.org/wiki/逻辑非", - "LOGIC_NEGATE_TITLE": "并非%1", + "LOGIC_NEGATE_HELPURL": "https://github.com/google/blockly/wiki/Logic#not", + "LOGIC_NEGATE_TITLE": "非%1", "LOGIC_NEGATE_TOOLTIP": "如果输入结果为假,则返回真;如果输入结果为真,则返回假。", "LOGIC_BOOLEAN_TRUE": "真", - "LOGIC_BOOLEAN_FALSE": "错", - "LOGIC_BOOLEAN_TOOLTIP": "同时返回真或假。", + "LOGIC_BOOLEAN_FALSE": "假", + "LOGIC_BOOLEAN_TOOLTIP": "返回真或假。", "LOGIC_NULL": "空", "LOGIC_NULL_TOOLTIP": "返回空值。", "LOGIC_TERNARY_HELPURL": "https://zh.wikipedia.org/wiki/条件运算符", @@ -109,14 +117,14 @@ "MATH_ARITHMETIC_TOOLTIP_POWER": "返回第一个数的第二个数次幂。", "MATH_SINGLE_HELPURL": "https://zh.wikipedia.org/wiki/平方根", "MATH_SINGLE_OP_ROOT": "平方根", - "MATH_SINGLE_TOOLTIP_ROOT": "返回数的平方根。", + "MATH_SINGLE_TOOLTIP_ROOT": "返回一个数的平方根。", "MATH_SINGLE_OP_ABSOLUTE": "绝对", "MATH_SINGLE_TOOLTIP_ABS": "返回一个数的绝对值。", - "MATH_SINGLE_TOOLTIP_NEG": "返回数的逻辑非。", + "MATH_SINGLE_TOOLTIP_NEG": "返回一个数的逻辑非。", "MATH_SINGLE_TOOLTIP_LN": "返回一个数的自然对数。", - "MATH_SINGLE_TOOLTIP_LOG10": "返回数字的对数。", - "MATH_SINGLE_TOOLTIP_EXP": "返回数的e次幂。", - "MATH_SINGLE_TOOLTIP_POW10": "返回数的10次幂。", + "MATH_SINGLE_TOOLTIP_LOG10": "返回一个数的对数。", + "MATH_SINGLE_TOOLTIP_EXP": "返回一个数的e次幂。", + "MATH_SINGLE_TOOLTIP_POW10": "返回一个数的10次幂。", "MATH_TRIG_HELPURL": "https://zh.wikipedia.org/wiki/三角函数", "MATH_TRIG_TOOLTIP_SIN": "返回指定角度的正弦值(非弧度)。", "MATH_TRIG_TOOLTIP_COS": "返回指定角度的余弦值(非弧度)。", @@ -130,12 +138,12 @@ "MATH_IS_ODD": "是奇数", "MATH_IS_PRIME": "是质数", "MATH_IS_WHOLE": "为整数", - "MATH_IS_POSITIVE": "是正值", + "MATH_IS_POSITIVE": "为正", "MATH_IS_NEGATIVE": "为负", "MATH_IS_DIVISIBLE_BY": "可被整除", "MATH_IS_TOOLTIP": "如果数字是偶数、奇数、非负整数、正数、负数或如果它可被某数字整除,则返回真或假。", - "MATH_CHANGE_HELPURL": "https://zh.wikipedia.org/wiki/%E5%8A%A0%E6%B3%95", - "MATH_CHANGE_TITLE": "更改 %1 由 %2", + "MATH_CHANGE_HELPURL": "https://zh.wikipedia.org/wiki/加法", + "MATH_CHANGE_TITLE": "更改 %1 从 %2", "MATH_CHANGE_TOOLTIP": "将一个数添加到变量“%1”。", "MATH_ROUND_HELPURL": "https://zh.wikipedia.org/wiki/数值修约", "MATH_ROUND_TOOLTIP": "数字向上或向下舍入。", @@ -183,7 +191,7 @@ "TEXT_LENGTH_TOOLTIP": "返回提供文本的字母数(包括空格)。", "TEXT_ISEMPTY_TITLE": "%1是空的", "TEXT_ISEMPTY_TOOLTIP": "如果提供的文本为空,则返回真。", - "TEXT_INDEXOF_TOOLTIP": "返回在第二个字串中的第一/最后一个匹配项的索引值。如果未找到则返回 0。", + "TEXT_INDEXOF_TOOLTIP": "返回在第二个字串中的第一/最后一个匹配项的索引值。如果未找到则返回%1。", "TEXT_INDEXOF_INPUT_INTEXT": "自文本", "TEXT_INDEXOF_OPERATOR_FIRST": "寻找第一个出现的文本", "TEXT_INDEXOF_OPERATOR_LAST": "寻找最后一个出现的文本", @@ -199,16 +207,16 @@ "TEXT_GET_SUBSTRING_TOOLTIP": "返回指定的部分文本。", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "自文本", "TEXT_GET_SUBSTRING_START_FROM_START": "取得一段字串自#", - "TEXT_GET_SUBSTRING_START_FROM_END": "取得一段字串自#到末尾", + "TEXT_GET_SUBSTRING_START_FROM_END": "取得一段字串自倒数第#个字符", "TEXT_GET_SUBSTRING_START_FIRST": "取得一段字串自第一个字符", "TEXT_GET_SUBSTRING_END_FROM_START": "到字符#", "TEXT_GET_SUBSTRING_END_FROM_END": "到倒数第#个字符", "TEXT_GET_SUBSTRING_END_LAST": "到最后一个字符", "TEXT_GET_SUBSTRING_TAIL": "空白", - "TEXT_CHANGECASE_TOOLTIP": "使用不同的大小写复制这段文字。", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "为大写", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "为小写", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "为首字母大写", + "TEXT_CHANGECASE_TOOLTIP": "在不同大小写下复制并返回这段文字。", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "转为大写", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "转为小写", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "将首字母大写", "TEXT_TRIM_TOOLTIP": "复制这段文字的同时删除两端多余的空格。", "TEXT_TRIM_OPERATOR_BOTH": "消除两侧空格", "TEXT_TRIM_OPERATOR_LEFT": "消除左侧空格", @@ -219,12 +227,21 @@ "TEXT_PROMPT_TYPE_NUMBER": "输入数字并显示提示消息", "TEXT_PROMPT_TOOLTIP_NUMBER": "提示用户输入数字。", "TEXT_PROMPT_TOOLTIP_TEXT": "提示用户输入一些文本。", + "TEXT_COUNT_MESSAGE0": "将%1计算在%2之内", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "计算在一些其他文本中,部分文本重现了多少次。", + "TEXT_REPLACE_MESSAGE0": "在%3中,将%1替换为%2", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "在某些其他文本中,替换部分文本的所有事件。", + "TEXT_REVERSE_MESSAGE0": "倒转%1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "倒转文本中字符的排序。", "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "创建空列表", "LISTS_CREATE_EMPTY_TOOLTIP": "返回一个列表,长度为 0,不包含任何数据记录", "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "建立一个具有任意数量项目的列表。", - "LISTS_CREATE_WITH_INPUT_WITH": "建立字串使用", + "LISTS_CREATE_WITH_INPUT_WITH": "建立列表使用", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "列表", "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "增加、删除或重新排列各部分以此重新配置这个列表块。", "LISTS_CREATE_WITH_ITEM_TOOLTIP": "将一个项添加到列表中。", @@ -237,8 +254,8 @@ "LISTS_INLIST": "在列表中", "LISTS_INDEX_OF_FIRST": "找出第一个项出现", "LISTS_INDEX_OF_LAST": "找出最后一个项出现", - "LISTS_INDEX_OF_TOOLTIP": "返回在列表中的第一/最后一个匹配项的索引值。如果未找到则返回 0。", - "LISTS_GET_INDEX_GET": "获得", + "LISTS_INDEX_OF_TOOLTIP": "返回在列表中的第一/最后一个匹配项的索引值。如果找不到项目则返回%1。", + "LISTS_GET_INDEX_GET": "取得", "LISTS_GET_INDEX_GET_REMOVE": "取出并移除", "LISTS_GET_INDEX_REMOVE": "移除", "LISTS_GET_INDEX_FROM_START": "#", @@ -247,31 +264,28 @@ "LISTS_GET_INDEX_LAST": "最后", "LISTS_GET_INDEX_RANDOM": "随机", "LISTS_GET_INDEX_TAIL": "空白", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "返回在列表中的指定位置的项。#1是第一个项目。", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "返回在列表中的指定位置的项。#1是最后一项。", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1是第一个项目。", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1是最后一项。", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "返回在列表中的指定位置的项。", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "返回列表中的第一个项目。", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "返回列表中的最后一项。", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "随机返回列表中的一个项目。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "移除并返回列表中的指定位置的项。#1 是第一项。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "移除并返回列表中的指定位置的项。#1 是最后一项。", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "移除并返回列表中的指定位置的项。", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "移除并返回列表中的第一个项目。", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "移除并返回列表中的最后一个项目。", "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "移除并返回列表中的一个随机项目中。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "移除在列表中的指定位置的项。#1 是第一项。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "删除在列表中的指定位置的项。#1是最后一项。", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "移除在列表中的指定位置的项。", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "移除列表中的第一项", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "移除列表中的最后一项", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "删除列表中的一个随机的项。", "LISTS_SET_INDEX_SET": "设置", "LISTS_SET_INDEX_INSERT": "插入在", "LISTS_SET_INDEX_INPUT_TO": "为", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "设置在列表中指定位置的项。#1是第一项。", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "设置在列表中指定位置的项。#1是最后一项。", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "设置在列表中指定位置的项。", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "设置列表中的第一个项目。", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "设置列表中的最后一项。", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "设置列表中一个随机的项目。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "插入在列表中指定位置的项。#1是第一项。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "插入在列表中的指定位置的项。#1是最后一项。", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "插入在列表中指定位置的项。", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "在列表的起始处添加该项。", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "将该项追加到列表的末尾。", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "在列表中随机插入项。", @@ -283,12 +297,23 @@ "LISTS_GET_SUBLIST_END_LAST": "到最后", "LISTS_GET_SUBLIST_TAIL": "空白", "LISTS_GET_SUBLIST_TOOLTIP": "复制列表中指定的部分。", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "排序%1 %2 %3", + "LISTS_SORT_TOOLTIP": "排序一个列表的拷贝。", + "LISTS_SORT_ORDER_ASCENDING": "升序", + "LISTS_SORT_ORDER_DESCENDING": "降序", + "LISTS_SORT_TYPE_NUMERIC": "按数字排序", + "LISTS_SORT_TYPE_TEXT": "按字母排序", + "LISTS_SORT_TYPE_IGNORECASE": "按字母排序,忽略大小写", "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "从文本制作列表", "LISTS_SPLIT_TEXT_FROM_LIST": "从列表拆出文本", "LISTS_SPLIT_WITH_DELIMITER": "用分隔符", "LISTS_SPLIT_TOOLTIP_SPLIT": "拆分文本到文本列表,按每个分隔符拆分。", "LISTS_SPLIT_TOOLTIP_JOIN": "加入文本列表至一个文本,由分隔符分隔。", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "倒转%1", + "LISTS_REVERSE_TOOLTIP": "倒转一个列表的拷贝。", "ORDINAL_NUMBER_SUFFIX": "空白", "VARIABLES_GET_TOOLTIP": "返回此变量的值。", "VARIABLES_GET_CREATE_SET": "创建“设定%1”", @@ -302,13 +327,13 @@ "PROCEDURES_CALL_BEFORE_PARAMS": "与:", "PROCEDURES_DEFNORETURN_DO": "空白", "PROCEDURES_DEFNORETURN_TOOLTIP": "创建一个不带输出值的函数。", + "PROCEDURES_DEFNORETURN_COMMENT": "描述该功能...", "PROCEDURES_DEFRETURN_HELPURL": "https://zh.wikipedia.org/wiki/子程序", "PROCEDURES_DEFRETURN_RETURN": "返回", "PROCEDURES_DEFRETURN_TOOLTIP": "创建一个有输出值的函数。", "PROCEDURES_ALLOW_STATEMENTS": "允许声明", "PROCEDURES_DEF_DUPLICATE_WARNING": "警告: 此函数具有重复参数。", "PROCEDURES_CALLNORETURN_HELPURL": "https://zh.wikipedia.org/wiki/子程序", - "PROCEDURES_CALLNORETURN_CALL": "空白", "PROCEDURES_CALLNORETURN_TOOLTIP": "运行用户定义的函数“%1”。", "PROCEDURES_CALLRETURN_HELPURL": "https://zh.wikipedia.org/wiki/子程序", "PROCEDURES_CALLRETURN_TOOLTIP": "运行用户定义的函数“%1”,并使用它的输出值。", @@ -319,5 +344,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "突出显示函数定义", "PROCEDURES_CREATE_DO": "创建“%1”", "PROCEDURES_IFRETURN_TOOLTIP": "如果值为真,则返回第二个值。", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "警告: 仅在定义函数内可使用此块。" } diff --git a/src/opsoro/server/static/js/blockly/msg/json/zh-hant.json b/src/opsoro/server/static/js/blockly/msg/json/zh-hant.json new file mode 100644 index 0000000..3738bee --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/json/zh-hant.json @@ -0,0 +1,335 @@ +{ + "@metadata": { + "authors": [ + "Gasolin", + "Wehwei", + "Liuxinyu970226", + "LNDDYL", + "Cwlin0416", + "Kasimtan", + "Kly", + "Dnowba", + "Dnow" + ] + }, + "VARIABLES_DEFAULT_NAME": "變數", + "TODAY": "今天", + "DUPLICATE_BLOCK": "複製", + "ADD_COMMENT": "加入註解", + "REMOVE_COMMENT": "移除註解", + "EXTERNAL_INPUTS": "多行輸入", + "INLINE_INPUTS": "單行輸入", + "DELETE_BLOCK": "刪除積木", + "DELETE_X_BLOCKS": "刪除 %1 個積木", + "DELETE_ALL_BLOCKS": "刪除共 %1 個積木?", + "CLEAN_UP": "整理積木", + "COLLAPSE_BLOCK": "收合積木", + "COLLAPSE_ALL": "收合積木", + "EXPAND_BLOCK": "展開積木", + "EXPAND_ALL": "展開積木", + "DISABLE_BLOCK": "停用積木", + "ENABLE_BLOCK": "啟用積木", + "HELP": "幫助", + "UNDO": "復原", + "REDO": "重試", + "CHANGE_VALUE_TITLE": "修改值:", + "RENAME_VARIABLE": "重新命名變數...", + "RENAME_VARIABLE_TITLE": "將所有「%1」變數重新命名為:", + "NEW_VARIABLE": "建立變數...", + "NEW_VARIABLE_TITLE": "新變數名稱:", + "VARIABLE_ALREADY_EXISTS": "一個名為「%1」的變數已存在。", + "DELETE_VARIABLE_CONFIRMATION": "刪除%1使用的「%2」變數?", + "DELETE_VARIABLE": "刪除變數「%1」", + "COLOUR_PICKER_HELPURL": "https://zh.wikipedia.org/wiki/顏色", + "COLOUR_PICKER_TOOLTIP": "從調色板中選擇一種顏色。", + "COLOUR_RANDOM_TITLE": "隨機顏色", + "COLOUR_RANDOM_TOOLTIP": "隨機選擇一種顏色。", + "COLOUR_RGB_TITLE": "顏色", + "COLOUR_RGB_RED": "紅", + "COLOUR_RGB_GREEN": "綠", + "COLOUR_RGB_BLUE": "藍", + "COLOUR_RGB_TOOLTIP": "透過指定紅、綠、 藍色的值來建立一種顏色。所有的值必須介於 0 和 100 之間。", + "COLOUR_BLEND_TITLE": "混合", + "COLOUR_BLEND_COLOUR1": "顏色 1", + "COLOUR_BLEND_COLOUR2": "顏色 2", + "COLOUR_BLEND_RATIO": "比例", + "COLOUR_BLEND_TOOLTIP": "用一個給定的比率(0.0-1.0)混合兩種顏色。", + "CONTROLS_REPEAT_HELPURL": "https://zh.wikipedia.org/wiki/For迴圈", + "CONTROLS_REPEAT_TITLE": "重複 %1 次", + "CONTROLS_REPEAT_INPUT_DO": "執行", + "CONTROLS_REPEAT_TOOLTIP": "重複執行指定的陳述式多次。", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "重複 當", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "重複 直到", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "當值為 true 時,執行一些陳述式。", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "當值為 false 時,執行一些陳述式。", + "CONTROLS_FOR_TOOLTIP": "從起始數到結尾數中取出變數「%1」的值,按指定的時間間隔,執行指定的積木。", + "CONTROLS_FOR_TITLE": "循環計數 %1 從 %2 到 %3 間隔數 %4", + "CONTROLS_FOREACH_TITLE": "取出每個 %1 自清單 %2", + "CONTROLS_FOREACH_TOOLTIP": "遍歷每個清單中的項目,將變數「%1」設定到該項目中,然後執行某些陳述式。", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "中斷循環", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "繼續下一個循環", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "中斷當前的循環。", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "跳過這個循環的其餘步驟,並繼續下一次的循環。", + "CONTROLS_FLOW_STATEMENTS_WARNING": "警告: 此積木僅可用於迴圈內。", + "CONTROLS_IF_TOOLTIP_1": "當值為 true 時,執行一些陳述式。", + "CONTROLS_IF_TOOLTIP_2": "當值為 true 時,執行第一個陳述式,否則,執行第二個陳述式。", + "CONTROLS_IF_TOOLTIP_3": "如果第一個值為 true,則執行第一個陳述式。否則,當第二個值為 true 時,則執行第二個陳述式。", + "CONTROLS_IF_TOOLTIP_4": "如果第一個值為 true,則執行第一個陳述式。否則當第二個值為 true 時,則執行第二個陳述式。如果前幾個敘述都不為 ture,則執行最後一個陳述式。", + "CONTROLS_IF_MSG_IF": "如果", + "CONTROLS_IF_MSG_ELSEIF": "否則如果", + "CONTROLS_IF_MSG_ELSE": "否則", + "CONTROLS_IF_IF_TOOLTIP": "添加、 刪除或重新排列各區塊以重新配置這個「如果」積木。", + "CONTROLS_IF_ELSEIF_TOOLTIP": "添加條件到「如果」積木。", + "CONTROLS_IF_ELSE_TOOLTIP": "加入一個最終、所有條件都執行的區塊到「如果」積木中。", + "LOGIC_COMPARE_HELPURL": "https://zh.wikipedia.org/wiki/不等", + "LOGIC_COMPARE_TOOLTIP_EQ": "如果這兩個輸入區塊的結果相等,返回 true。", + "LOGIC_COMPARE_TOOLTIP_NEQ": "如果這兩個輸入區塊的結果不相等,返回 true。", + "LOGIC_COMPARE_TOOLTIP_LT": "如果第一個輸入結果比第二個小,返回 true。", + "LOGIC_COMPARE_TOOLTIP_LTE": "如果第一個輸入結果小於或等於第二個,返回 true。", + "LOGIC_COMPARE_TOOLTIP_GT": "如果第一個輸入結果大於第二個,返回 true。", + "LOGIC_COMPARE_TOOLTIP_GTE": "如果第一個輸入結果大於或等於第二個,返回 true。", + "LOGIC_OPERATION_TOOLTIP_AND": "如果兩個輸入結果都為 true,則返回 true。", + "LOGIC_OPERATION_AND": "且", + "LOGIC_OPERATION_TOOLTIP_OR": "如果至少一個輸入結果為 true,返回 true。", + "LOGIC_OPERATION_OR": "或", + "LOGIC_NEGATE_TITLE": "%1 不成立", + "LOGIC_NEGATE_TOOLTIP": "如果輸入結果是 false,則返回 true。如果輸入結果是 true,則返回 false。", + "LOGIC_BOOLEAN_TRUE": "true", + "LOGIC_BOOLEAN_FALSE": "false", + "LOGIC_BOOLEAN_TOOLTIP": "返回 true 或 false。", + "LOGIC_NULL": "null", + "LOGIC_NULL_TOOLTIP": "返回 null。", + "LOGIC_TERNARY_HELPURL": "https://zh.wikipedia.org/wiki/條件運算符", + "LOGIC_TERNARY_CONDITION": "測試", + "LOGIC_TERNARY_IF_TRUE": "如果為 true", + "LOGIC_TERNARY_IF_FALSE": "如果為 false", + "LOGIC_TERNARY_TOOLTIP": "檢查「測試」中的條件。如果條件為 true,將返回「如果為 true」的值;否則,返回「如果為 false」的值。", + "MATH_NUMBER_HELPURL": "https://zh.wikipedia.org/wiki/數", + "MATH_NUMBER_TOOLTIP": "一個數字。", + "MATH_ARITHMETIC_HELPURL": "https://zh.wikipedia.org/wiki/算術", + "MATH_ARITHMETIC_TOOLTIP_ADD": "返回兩個數字的總和。", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "返回兩個數字的差。", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "返回兩個數字的乘積。", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "返回兩個數字的商。", + "MATH_ARITHMETIC_TOOLTIP_POWER": "返回第二個數字的指數的第一個數字。", + "MATH_SINGLE_HELPURL": "https://zh.wikipedia.org/wiki/平方根", + "MATH_SINGLE_OP_ROOT": "開根號", + "MATH_SINGLE_TOOLTIP_ROOT": "返回指定數字的平方根。", + "MATH_SINGLE_OP_ABSOLUTE": "絕對值", + "MATH_SINGLE_TOOLTIP_ABS": "返回指定數字的絕對值。", + "MATH_SINGLE_TOOLTIP_NEG": "返回指定數字的 negation。", + "MATH_SINGLE_TOOLTIP_LN": "返回指定數字的自然對數。", + "MATH_SINGLE_TOOLTIP_LOG10": "返回指定數字的對數。", + "MATH_SINGLE_TOOLTIP_EXP": "返回指定數字指數的 e", + "MATH_SINGLE_TOOLTIP_POW10": "返回指定數字指數的10的冪次。", + "MATH_TRIG_HELPURL": "https://zh.wikipedia.org/wiki/三角函數", + "MATH_TRIG_TOOLTIP_SIN": "返回指定角度的正弦值(非弧度)。", + "MATH_TRIG_TOOLTIP_COS": "返回指定角度的餘弦值(非弧度)。", + "MATH_TRIG_TOOLTIP_TAN": "返回指定角度的正切值(非弧度)。", + "MATH_TRIG_TOOLTIP_ASIN": "返回指定角度的反正弦值(非弧度)。", + "MATH_TRIG_TOOLTIP_ACOS": "返回指定角度的反餘弦值(非弧度)。", + "MATH_TRIG_TOOLTIP_ATAN": "返回指定角度的反正切值。", + "MATH_CONSTANT_HELPURL": "https://zh.wikipedia.org/wiki/數學常數", + "MATH_CONSTANT_TOOLTIP": "返回一個的常見常量: π (3.141......),e (2.718...)、 φ (1.618...)、 開方(2) (1.414......)、 開方(½) (0.707......) 或 ∞ (無窮大)。", + "MATH_IS_EVEN": "是偶數", + "MATH_IS_ODD": "是奇數", + "MATH_IS_PRIME": "是質數", + "MATH_IS_WHOLE": "是非負整數", + "MATH_IS_POSITIVE": "是正值", + "MATH_IS_NEGATIVE": "是負值", + "MATH_IS_DIVISIBLE_BY": "可被整除", + "MATH_IS_TOOLTIP": "如果數字是偶數,奇數,非負整數,正數、 負數,或如果它是可被某數字整除,則返回 true 或 false。", + "MATH_CHANGE_HELPURL": "https://zh.wikipedia.org/wiki/加法", + "MATH_CHANGE_TITLE": "修改 %1 自 %2", + "MATH_CHANGE_TOOLTIP": "將數字加到變數「%1」。", + "MATH_ROUND_HELPURL": "https://zh.wikipedia.org/wiki/數值簡化", + "MATH_ROUND_TOOLTIP": "將數字無條件進位或無條件捨去。", + "MATH_ROUND_OPERATOR_ROUND": "四捨五入", + "MATH_ROUND_OPERATOR_ROUNDUP": "無條件進位", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "無條件捨去", + "MATH_ONLIST_OPERATOR_SUM": "數字總和 自清單", + "MATH_ONLIST_TOOLTIP_SUM": "返回清單中的所有數字的總和。", + "MATH_ONLIST_OPERATOR_MIN": "最小值 自清單", + "MATH_ONLIST_TOOLTIP_MIN": "返回清單項目中最小的數字。", + "MATH_ONLIST_OPERATOR_MAX": "最大值 自清單", + "MATH_ONLIST_TOOLTIP_MAX": "返回清單項目中最大的數字。", + "MATH_ONLIST_OPERATOR_AVERAGE": "平均數 自清單", + "MATH_ONLIST_TOOLTIP_AVERAGE": "返回清單中數值的平均值(算術平均值)。", + "MATH_ONLIST_OPERATOR_MEDIAN": "中位數 自清單", + "MATH_ONLIST_TOOLTIP_MEDIAN": "返回清單中數值的中位數。", + "MATH_ONLIST_OPERATOR_MODE": "比較眾數 自清單", + "MATH_ONLIST_TOOLTIP_MODE": "返回一個清單中的最常見的項目。", + "MATH_ONLIST_OPERATOR_STD_DEV": "標準差 自清單", + "MATH_ONLIST_TOOLTIP_STD_DEV": "返回清單中數字的標準差。", + "MATH_ONLIST_OPERATOR_RANDOM": "隨機抽取 自清單", + "MATH_ONLIST_TOOLTIP_RANDOM": "從清單中返回一個隨機的項目。", + "MATH_MODULO_HELPURL": "https://zh.wikipedia.org/wiki/模除", + "MATH_MODULO_TITLE": "%1 除以 %2 的餘數", + "MATH_MODULO_TOOLTIP": "回傳兩個數字相除的餘數。", + "MATH_CONSTRAIN_TITLE": "限制數字 %1 介於(低)%2 到(高)%3", + "MATH_CONSTRAIN_TOOLTIP": "限制數字介於兩個指定的數字之間(包含)。", + "MATH_RANDOM_INT_HELPURL": "https://zh.wikipedia.org/wiki/隨機數生成器", + "MATH_RANDOM_INT_TITLE": "隨機取數 %1 到 %2", + "MATH_RANDOM_INT_TOOLTIP": "在指定二個數之間隨機取一個數(包含)。", + "MATH_RANDOM_FLOAT_HELPURL": "https://zh.wikipedia.org/wiki/隨機數生成器", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "隨機取分數", + "MATH_RANDOM_FLOAT_TOOLTIP": "在 0.0(包含)和 1.0(不包含)之間隨機取一個數。", + "TEXT_TEXT_HELPURL": "https://zh.wikipedia.org/wiki/字串", + "TEXT_TEXT_TOOLTIP": "一個字元、一個單詞,或一串文字。", + "TEXT_JOIN_TITLE_CREATEWITH": "字串組合", + "TEXT_JOIN_TOOLTIP": "通過連接任意數量的項目來建立一串文字。", + "TEXT_CREATE_JOIN_TITLE_JOIN": "加入", + "TEXT_CREATE_JOIN_TOOLTIP": "添加、刪除或重新排列各區塊以重新配置這個文字積木。", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "添加一個項目到字串中。", + "TEXT_APPEND_TO": "在", + "TEXT_APPEND_APPENDTEXT": "後加入文字", + "TEXT_APPEND_TOOLTIP": "添加一些文字到變數「%1」之後。", + "TEXT_LENGTH_TITLE": "長度 %1", + "TEXT_LENGTH_TOOLTIP": "返回這串文字的字元數(包含空格)。", + "TEXT_ISEMPTY_TITLE": "%1 為空", + "TEXT_ISEMPTY_TOOLTIP": "如果提供的字串為空,則返回 true。", + "TEXT_INDEXOF_TOOLTIP": "在字串1中檢索是否有包含字串2,如果有,返回從頭/倒數算起的索引值。如果沒有則返回 %1。", + "TEXT_INDEXOF_INPUT_INTEXT": "在字串", + "TEXT_INDEXOF_OPERATOR_FIRST": "從 最前面 索引字串", + "TEXT_INDEXOF_OPERATOR_LAST": "從 最後面 索引字串", + "TEXT_CHARAT_INPUT_INTEXT": "在字串", + "TEXT_CHARAT_FROM_START": "取得 字元 #", + "TEXT_CHARAT_FROM_END": "取得 倒數第 # 個字元", + "TEXT_CHARAT_FIRST": "取得 第一個字元", + "TEXT_CHARAT_LAST": "取得 最後一個字元", + "TEXT_CHARAT_RANDOM": "取得 任意字元", + "TEXT_CHARAT_TAIL": "", + "TEXT_CHARAT_TOOLTIP": "返回位於指定位置的字元。", + "TEXT_GET_SUBSTRING_TOOLTIP": "返回指定的部分文字。", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "在字串", + "TEXT_GET_SUBSTRING_START_FROM_START": "取得 字元 #", + "TEXT_GET_SUBSTRING_START_FROM_END": "取得 倒數第 # 個字元", + "TEXT_GET_SUBSTRING_START_FIRST": "取得 第一個字元", + "TEXT_GET_SUBSTRING_END_FROM_START": "到 字元 #", + "TEXT_GET_SUBSTRING_END_FROM_END": "到 倒數第 # 個字元", + "TEXT_GET_SUBSTRING_END_LAST": "到 最後一個字元", + "TEXT_CHANGECASE_TOOLTIP": "使用不同的大小寫複製這段文字。", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "轉成 英文大寫", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "轉成 英文小寫", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "轉成 英文首字大寫", + "TEXT_TRIM_TOOLTIP": "複製這段文字,同時刪除兩端多餘的空格。", + "TEXT_TRIM_OPERATOR_BOTH": "消除兩側空格", + "TEXT_TRIM_OPERATOR_LEFT": "消除左側空格", + "TEXT_TRIM_OPERATOR_RIGHT": "消除右側空格", + "TEXT_PRINT_TITLE": "輸出 %1", + "TEXT_PRINT_TOOLTIP": "輸出指定的文字、 數字或其他值。", + "TEXT_PROMPT_TYPE_TEXT": "輸入 文字 並顯示提示訊息", + "TEXT_PROMPT_TYPE_NUMBER": "輸入 數字 並顯示提示訊息", + "TEXT_PROMPT_TOOLTIP_NUMBER": "輸入數字", + "TEXT_PROMPT_TOOLTIP_TEXT": "輸入文字", + "TEXT_COUNT_MESSAGE0": "在%2計算%1", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "計算某些文字在內容裡的出現次數。", + "TEXT_REPLACE_MESSAGE0": "在%3以%2取代%1", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "取代在內容裡的全部某些文字。", + "TEXT_REVERSE_MESSAGE0": "反轉%1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "反轉排序在文字裡的字元。", + "LISTS_CREATE_EMPTY_TITLE": "建立空的清單", + "LISTS_CREATE_EMPTY_TOOLTIP": "返回一個長度(項目數量)為 0 的清單,不包含任何資料記錄", + "LISTS_CREATE_WITH_TOOLTIP": "建立一個具備任意數量項目的清單。", + "LISTS_CREATE_WITH_INPUT_WITH": "使用這些值建立清單", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "清單", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "添加、刪除或重新排列各區塊以重新配置這個「清單」積木。", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "添加一個項目到清單裡。", + "LISTS_REPEAT_TOOLTIP": "建立一個清單,項目中包含指定重複次數的值。", + "LISTS_REPEAT_TITLE": "建立清單使用項目 %1 重複 %2 次", + "LISTS_LENGTH_TITLE": "長度 %1", + "LISTS_LENGTH_TOOLTIP": "返回清單的長度(項目數)。", + "LISTS_ISEMPTY_TITLE": "%1 值為空", + "LISTS_ISEMPTY_TOOLTIP": "如果該清單為空,則返回 true。", + "LISTS_INLIST": "自清單", + "LISTS_INDEX_OF_FIRST": "從 最前面 索引項目", + "LISTS_INDEX_OF_LAST": "從 最後面 索引項目", + "LISTS_INDEX_OF_TOOLTIP": "在清單中檢索是否有包含項目,如果有,返回從頭/倒數算起的索引值。如果沒有則返回 %1。", + "LISTS_GET_INDEX_GET": "取得", + "LISTS_GET_INDEX_GET_REMOVE": "取得並移除", + "LISTS_GET_INDEX_REMOVE": "移除", + "LISTS_GET_INDEX_FROM_END": "倒數第 # 筆", + "LISTS_GET_INDEX_FIRST": "第一筆", + "LISTS_GET_INDEX_LAST": "最後一筆", + "LISTS_GET_INDEX_RANDOM": "隨機", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 是第一個項目。", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 是最後一個項目。", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "返回在清單中指定位置的項目。", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "返回清單中的第一個項目。", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "返回清單中的最後一個項目。", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "返回清單中隨機一個項目。", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "移除並返回清單中的指定位置的項目。", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "移除並返回清單中的第一個項目。", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "移除並返回清單中的最後一個項目。", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "移除並返回清單中的隨機項目。", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "移除在清單中指定位置的項目。", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "移除清單中的第一個項目。", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "移除清單中的最後一個項目。", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "移除清單中隨機一個項目。", + "LISTS_SET_INDEX_SET": "設定", + "LISTS_SET_INDEX_INSERT": "添加", + "LISTS_SET_INDEX_INPUT_TO": "為", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "設定清單中指定位置的項目。", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "設定清單中的第一個項目。", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "設定清單中的最後一個項目。", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "設定清單中隨機一個項目。", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "添加一個項目到清單中的指定位置。", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "添加一個項目到清單中的第一個位置。", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "添加一個項目到清單中的最後一個位置。", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "添加一個項目到清單中的隨機位置。", + "LISTS_GET_SUBLIST_START_FROM_START": "取得子清單 從 #", + "LISTS_GET_SUBLIST_START_FROM_END": "取得子清單 從 # 倒數", + "LISTS_GET_SUBLIST_START_FIRST": "取得子清單 從 最前面", + "LISTS_GET_SUBLIST_END_FROM_START": "到 #", + "LISTS_GET_SUBLIST_END_FROM_END": "到 # 倒數", + "LISTS_GET_SUBLIST_END_LAST": "到 最後面", + "LISTS_GET_SUBLIST_TOOLTIP": "複製清單中指定的部分。", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "排列 %1 %2 %3", + "LISTS_SORT_TOOLTIP": "排序清單的複製內容。", + "LISTS_SORT_ORDER_ASCENDING": "升序", + "LISTS_SORT_ORDER_DESCENDING": "降序", + "LISTS_SORT_TYPE_NUMERIC": "依數字", + "LISTS_SORT_TYPE_TEXT": "依字母", + "LISTS_SORT_TYPE_IGNORECASE": "依字母排序,忽略大小寫", + "LISTS_SPLIT_LIST_FROM_TEXT": "從文本製作清單", + "LISTS_SPLIT_TEXT_FROM_LIST": "從清單拆出文本", + "LISTS_SPLIT_WITH_DELIMITER": "用分隔符", + "LISTS_SPLIT_TOOLTIP_SPLIT": "將文本變成清單項目,按分隔符號拆分。", + "LISTS_SPLIT_TOOLTIP_JOIN": "串起清單項目成一個文本,並用分隔符號分開。", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "反轉%1", + "LISTS_REVERSE_TOOLTIP": "反轉清單的複製內容。", + "VARIABLES_GET_TOOLTIP": "返回此變數的值。", + "VARIABLES_GET_CREATE_SET": "建立「賦值 %1」", + "VARIABLES_SET": "賦值 %1 成 %2", + "VARIABLES_SET_TOOLTIP": "設定此變數,好和輸入結果相等。", + "VARIABLES_SET_CREATE_GET": "建立「取得 %1」", + "PROCEDURES_DEFNORETURN_HELPURL": "https://zh.wikipedia.org/wiki/子程式", + "PROCEDURES_DEFNORETURN_TITLE": "到", + "PROCEDURES_DEFNORETURN_PROCEDURE": "做些什麼", + "PROCEDURES_BEFORE_PARAMS": "與:", + "PROCEDURES_CALL_BEFORE_PARAMS": "與:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "創建一個無回傳值的函式。", + "PROCEDURES_DEFNORETURN_COMMENT": "描述此函式...", + "PROCEDURES_DEFRETURN_HELPURL": "https://zh.wikipedia.org/wiki/子程式", + "PROCEDURES_DEFRETURN_RETURN": "返回", + "PROCEDURES_DEFRETURN_TOOLTIP": "創建一個有回傳值的的函式。", + "PROCEDURES_ALLOW_STATEMENTS": "允許陳述式", + "PROCEDURES_DEF_DUPLICATE_WARNING": "警告: 此函式中有重複的參數。", + "PROCEDURES_CALLNORETURN_HELPURL": "https://zh.wikipedia.org/wiki/%E5%AD%90%E7%A8%8B%E5%BA%8F", + "PROCEDURES_CALLNORETURN_TOOLTIP": "執行使用者定義的函式「%1」。", + "PROCEDURES_CALLRETURN_HELPURL": "https://zh.wikipedia.org/wiki/%E5%AD%90%E7%A8%8B%E5%BA%8F", + "PROCEDURES_CALLRETURN_TOOLTIP": "執行使用者定義的函式「%1」,並使用它的回傳值。", + "PROCEDURES_MUTATORCONTAINER_TITLE": "輸入", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "添加、刪除或重新排列此函式的輸入。", + "PROCEDURES_MUTATORARG_TITLE": "輸入名稱:", + "PROCEDURES_MUTATORARG_TOOLTIP": "添加一個輸入區塊到函式。", + "PROCEDURES_HIGHLIGHT_DEF": "反白顯示函式定義", + "PROCEDURES_CREATE_DO": "建立「%1」", + "PROCEDURES_IFRETURN_TOOLTIP": "如果值為 true,則返回第二個值。", + "PROCEDURES_IFRETURN_WARNING": "警告:這個積木只可以在定義函式時使用。" +} diff --git a/src/opsoro/server/static/js/blockly/msg/messages.js b/src/opsoro/server/static/js/blockly/msg/messages.js new file mode 100644 index 0000000..ad46c45 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/msg/messages.js @@ -0,0 +1,1161 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview English strings. + * @author fraser@google.com (Neil Fraser) + * + * After modifying this file, either run "build.py" from the parent directory, + * or run (from this directory): + * ../i18n/js_to_json.py + * to regenerate json/{en,qqq,synonyms}.json. + * + * To convert all of the json files to .js files, run: + * ../i18n/create_messages.py json/*.json + */ +'use strict'; + +goog.provide('Blockly.Msg.en'); + +goog.require('Blockly.Msg'); + + +/** + * Due to the frequency of long strings, the 80-column wrap rule need not apply + * to message files. + */ + +/** + * Each message is preceded with a tripple-slash comment that becomes the + * message descriptor. The build process extracts these descriptors, adds + * them to msg/json/qqq.json, and they show up in the translation console. + */ + +/// {{Notranslate}} Hue value for all logic blocks. +Blockly.Msg.LOGIC_HUE = '210'; +/// {{Notranslate}} Hue value for all loop blocks. +Blockly.Msg.LOOPS_HUE = '120'; +/// {{Notranslate}} Hue value for all math blocks. +Blockly.Msg.MATH_HUE = '230'; +/// {{Notranslate}} Hue value for all text blocks. +Blockly.Msg.TEXTS_HUE = '160'; +/// {{Notranslate}} Hue value for all list blocks. +Blockly.Msg.LISTS_HUE = '260'; +/// {{Notranslate}} Hue value for all colour blocks. +Blockly.Msg.COLOUR_HUE = '20'; +/// {{Notranslate}} Hue value for all variable blocks. +Blockly.Msg.VARIABLES_HUE = '330'; +/// {{Notranslate}} Hue value for all procedure blocks. +Blockly.Msg.PROCEDURES_HUE = '290'; + +/// default name - A simple, general default name for a variable, preferably short. +/// For more context, see +/// [[Translating:Blockly#infrequent_message_types]].\n{{Identical|Item}} +Blockly.Msg.VARIABLES_DEFAULT_NAME = 'item'; +/// button text - Button that sets a calendar to today's date.\n{{Identical|Today}} +Blockly.Msg.TODAY = 'Today'; + +// Context menus. +/// context menu - Make a copy of the selected block (and any blocks it contains).\n{{Identical|Duplicate}} +Blockly.Msg.DUPLICATE_BLOCK = 'Duplicate'; +/// context menu - Add a descriptive comment to the selected block. +Blockly.Msg.ADD_COMMENT = 'Add Comment'; +/// context menu - Remove the descriptive comment from the selected block. +Blockly.Msg.REMOVE_COMMENT = 'Remove Comment'; +/// context menu - Change from 'external' to 'inline' mode for displaying blocks used as inputs to the selected block. See [[Translating:Blockly#context_menus]]. +Blockly.Msg.EXTERNAL_INPUTS = 'External Inputs'; +/// context menu - Change from 'internal' to 'external' mode for displaying blocks used as inputs to the selected block. See [[Translating:Blockly#context_menus]]. +Blockly.Msg.INLINE_INPUTS = 'Inline Inputs'; +/// context menu - Permanently delete the selected block. +Blockly.Msg.DELETE_BLOCK = 'Delete Block'; +/// context menu - Permanently delete the %1 selected blocks.\n\nParameters:\n* %1 - an integer greater than 1. +Blockly.Msg.DELETE_X_BLOCKS = 'Delete %1 Blocks'; +/// confirmation prompt - Question the user if they really wanted to permanently delete all %1 blocks.\n\nParameters:\n* %1 - an integer greater than 1. +Blockly.Msg.DELETE_ALL_BLOCKS = 'Delete all %1 blocks?'; +/// context menu - Reposition all the blocks so that they form a neat line. +Blockly.Msg.CLEAN_UP = 'Clean up Blocks'; +/// context menu - Make the appearance of the selected block smaller by hiding some information about it. +Blockly.Msg.COLLAPSE_BLOCK = 'Collapse Block'; +/// context menu - Make the appearance of all blocks smaller by hiding some information about it. Use the same terminology as in the previous message. +Blockly.Msg.COLLAPSE_ALL = 'Collapse Blocks'; +/// context menu - Restore the appearance of the selected block by showing information about it that was hidden (collapsed) earlier. +Blockly.Msg.EXPAND_BLOCK = 'Expand Block'; +/// context menu - Restore the appearance of all blocks by showing information about it that was hidden (collapsed) earlier. Use the same terminology as in the previous message. +Blockly.Msg.EXPAND_ALL = 'Expand Blocks'; +/// context menu - Make the selected block have no effect (unless reenabled). +Blockly.Msg.DISABLE_BLOCK = 'Disable Block'; +/// context menu - Make the selected block have effect (after having been disabled earlier). +Blockly.Msg.ENABLE_BLOCK = 'Enable Block'; +/// context menu - Provide helpful information about the selected block.\n{{Identical|Help}} +Blockly.Msg.HELP = 'Help'; +/// context menu - Undo the previous action.\n{{Identical|Undo}} +Blockly.Msg.UNDO = 'Undo'; +/// context menu - Undo the previous undo action.\n{{Identical|Redo}} +Blockly.Msg.REDO = 'Redo'; + +// Variable renaming. +/// prompt - This message is only seen in the Opera browser. With most browsers, users can edit numeric values in blocks by just clicking and typing. Opera does not allows this, so we have to open a new window and prompt users with this message to chanage a value. +Blockly.Msg.CHANGE_VALUE_TITLE = 'Change value:'; +/// dropdown choice - When the user clicks on a variable block, this is one of the dropdown menu choices. It is used to rename the current variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu]. +Blockly.Msg.RENAME_VARIABLE = 'Rename variable...'; +/// prompt - Prompts the user to enter the new name for the selected variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu].\n\nParameters:\n* %1 - the name of the variable to be renamed. +Blockly.Msg.RENAME_VARIABLE_TITLE = 'Rename all "%1" variables to:'; + +// Variable creation +/// button text - Text on the button used to launch the variable creation dialogue. +Blockly.Msg.NEW_VARIABLE = 'Create variable...'; +/// prompt - Prompts the user to enter the name for a new variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu]. +Blockly.Msg.NEW_VARIABLE_TITLE = 'New variable name:'; +/// alert - Tells the user that the name they entered is already in use. +Blockly.Msg.VARIABLE_ALREADY_EXISTS = 'A variable named "%1" already exists.' + +// Variable deletion. +/// confirm - Ask the user to confirm their deletion of multiple uses of a variable. +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = 'Delete %1 uses of the "%2" variable?'; +/// alert - Tell the user that they can't delete a variable because it's part of the definition of a procedure. +Blockly.Msg.CANNOT_DELETE_VARIABLE_PROCEDURE = 'Can\'t delete the variable "%1" because it is part of the definition of the procedure "%2"'; +/// dropdown choice - Delete the currently selected variable. +Blockly.Msg.DELETE_VARIABLE = 'Delete the "%1" variable'; + +// Colour Blocks. +/// url - Information about colour. +Blockly.Msg.COLOUR_PICKER_HELPURL = 'https://en.wikipedia.org/wiki/Color'; +/// tooltip - See [https://github.com/google/blockly/wiki/Colour#picking-a-colour-from-a-palette https://github.com/google/blockly/wiki/Colour#picking-a-colour-from-a-palette]. +Blockly.Msg.COLOUR_PICKER_TOOLTIP = 'Choose a colour from the palette.'; +/// url - A link that displays a random colour each time you visit it. +Blockly.Msg.COLOUR_RANDOM_HELPURL = 'http://randomcolour.com'; +/// block text - Title of block that generates a colour at random. +Blockly.Msg.COLOUR_RANDOM_TITLE = 'random colour'; +/// tooltip - See [https://github.com/google/blockly/wiki/Colour#generating-a-random-colour https://github.com/google/blockly/wiki/Colour#generating-a-random-colour]. +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = 'Choose a colour at random.'; +/// url - A link for color codes with percentages (0-100%) for each component, instead of the more common 0-255, which may be more difficult for beginners. +Blockly.Msg.COLOUR_RGB_HELPURL = 'http://www.december.com/html/spec/colorper.html'; +/// block text - Title of block for [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components]. +Blockly.Msg.COLOUR_RGB_TITLE = 'colour with'; +/// block input text - The amount of red (from 0 to 100) to use when [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].\n{{Identical|Red}} +Blockly.Msg.COLOUR_RGB_RED = 'red'; +/// block input text - The amount of green (from 0 to 100) to use when [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components]. +Blockly.Msg.COLOUR_RGB_GREEN = 'green'; +/// block input text - The amount of blue (from 0 to 100) to use when [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].\n{{Identical|Blue}} +Blockly.Msg.COLOUR_RGB_BLUE = 'blue'; +/// tooltip - See [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components]. +Blockly.Msg.COLOUR_RGB_TOOLTIP = 'Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100.'; +/// url - A useful link that displays blending of two colors. +Blockly.Msg.COLOUR_BLEND_HELPURL = 'http://meyerweb.com/eric/tools/color-blend/'; +/// block text - A verb for blending two shades of paint. +Blockly.Msg.COLOUR_BLEND_TITLE = 'blend'; +/// block input text - The first of two colours to [https://github.com/google/blockly/wiki/Colour#blending-colours blend]. +Blockly.Msg.COLOUR_BLEND_COLOUR1 = 'colour 1'; +/// block input text - The second of two colours to [https://github.com/google/blockly/wiki/Colour#blending-colours blend]. +Blockly.Msg.COLOUR_BLEND_COLOUR2 = 'colour 2'; +/// block input text - The proportion of the [https://github.com/google/blockly/wiki/Colour#blending-colours blend] containing the first color; the remaining proportion is of the second colour. For example, if the first colour is red and the second color blue, a ratio of 1 would yield pure red, a ratio of .5 would yield purple (equal amounts of red and blue), and a ratio of 0 would yield pure blue.\n{{Identical|Ratio}} +Blockly.Msg.COLOUR_BLEND_RATIO = 'ratio'; +/// tooltip - See [https://github.com/google/blockly/wiki/Colour#blending-colours https://github.com/google/blockly/wiki/Colour#blending-colours]. +Blockly.Msg.COLOUR_BLEND_TOOLTIP = 'Blends two colours together with a given ratio (0.0 - 1.0).'; + +// Loop Blocks. +/// url - Describes 'repeat loops' in computer programs; consider using the translation of the page [https://en.wikipedia.org/wiki/Control_flow http://en.wikipedia.org/wiki/Control_flow]. +Blockly.Msg.CONTROLS_REPEAT_HELPURL = 'https://en.wikipedia.org/wiki/For_loop'; +/// block input text - Title of [https://github.com/google/blockly/wiki/Loops#repeat repeat block].\n\nParameters:\n* %1 - the number of times the body of the loop should be repeated. +Blockly.Msg.CONTROLS_REPEAT_TITLE = 'repeat %1 times'; +/// block text - Preceding the blocks in the body of the loop. See [https://github.com/google/blockly/wiki/Loops https://github.com/google/blockly/wiki/Loops].\n{{Identical|Do}} +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = 'do'; +/// tooltip - See [https://github.com/google/blockly/wiki/Loops#repeat https://github.com/google/blockly/wiki/Loops#repeat]. +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = 'Do some statements several times.'; +/// url - Describes 'while loops' in computer programs; consider using the translation of [https://en.wikipedia.org/wiki/While_loop https://en.wikipedia.org/wiki/While_loop], if present, or [https://en.wikipedia.org/wiki/Control_flow https://en.wikipedia.org/wiki/Control_flow]. +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = 'https://github.com/google/blockly/wiki/Loops#repeat'; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +/// dropdown - Specifies that a loop should [https://github.com/google/blockly/wiki/Loops#repeat-while repeat while] the following condition is true. +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = 'repeat while'; +/// dropdown - Specifies that a loop should [https://github.com/google/blockly/wiki/Loops#repeat-until repeat until] the following condition becomes true. +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = 'repeat until'; +/// tooltip - See [https://github.com/google/blockly/wiki/Loops#repeat-while Loops#repeat-while https://github.com/google/blockly/wiki/Loops#repeat-while Loops#repeat-while]. +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = 'While a value is true, then do some statements.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Loops#repeat-until https://github.com/google/blockly/wiki/Loops#repeat-until]. +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = 'While a value is false, then do some statements.'; + +/// url - Describes 'for loops' in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/For_loop https://en.wikipedia.org/wiki/For_loop], if present. +Blockly.Msg.CONTROLS_FOR_HELPURL = 'https://github.com/google/blockly/wiki/Loops#count-with'; +/// tooltip - See [https://github.com/google/blockly/wiki/Loops#count-with https://github.com/google/blockly/wiki/Loops#count-with].\n\nParameters:\n* %1 - the name of the loop variable. +Blockly.Msg.CONTROLS_FOR_TOOLTIP = 'Have the variable "%1" take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks.'; +/// block text - Repeatedly counts a variable (%1) +/// starting with a (usually lower) number in a range (%2), +/// ending with a (usually higher) number in a range (%3), and counting the +/// iterations by a number of steps (%4). As in +/// [https://github.com/google/blockly/wiki/Loops#count-with +/// https://github.com/google/blockly/wiki/Loops#count-with]. +/// [[File:Blockly-count-with.png]] +Blockly.Msg.CONTROLS_FOR_TITLE = 'count with %1 from %2 to %3 by %4'; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; + +/// url - Describes 'for-each loops' in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/Foreach https://en.wikipedia.org/wiki/Foreach] if present. +Blockly.Msg.CONTROLS_FOREACH_HELPURL = 'https://github.com/google/blockly/wiki/Loops#for-each'; +/// block text - Title of [https://github.com/google/blockly/wiki/Loops#for-each for each block]. +/// Sequentially assigns every item in array %2 to the valiable %1. +Blockly.Msg.CONTROLS_FOREACH_TITLE = 'for each item %1 in list %2'; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +/// block text - Description of [https://github.com/google/blockly/wiki/Loops#for-each for each blocks].\n\nParameters:\n* %1 - the name of the loop variable. +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = 'For each item in a list, set the variable "%1" to the item, and then do some statements.'; + +/// url - Describes control flow in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/Control_flow https://en.wikipedia.org/wiki/Control_flow], if it exists. +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = 'https://github.com/google/blockly/wiki/Loops#loop-termination-blocks'; +/// dropdown - The current loop should be exited. See [https://github.com/google/blockly/wiki/Loops#break https://github.com/google/blockly/wiki/Loops#break]. +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = 'break out of loop'; +/// dropdown - The current iteration of the loop should be ended and the next should begin. See [https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration]. +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = 'continue with next iteration of loop'; +/// tooltip - See [https://github.com/google/blockly/wiki/Loops#break-out-of-loop https://github.com/google/blockly/wiki/Loops#break-out-of-loop]. +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = 'Break out of the containing loop.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration]. +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = 'Skip the rest of this loop, and continue with the next iteration.'; +/// warning - The user has tried placing a block outside of a loop (for each, while, repeat, etc.), but this type of block may only be used within a loop. See [https://github.com/google/blockly/wiki/Loops#loop-termination-blocks https://github.com/google/blockly/wiki/Loops#loop-termination-blocks]. +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = 'Warning: This block may only be used within a loop.'; + +// Logic Blocks. +/// url - Describes conditional statements (if-then-else) in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_else https://en.wikipedia.org/wiki/If_else], if present. +Blockly.Msg.CONTROLS_IF_HELPURL = 'https://github.com/google/blockly/wiki/IfElse'; +/// tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-blocks 'if' blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present. +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = 'If a value is true, then do some statements.'; +/// tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-else-blocks if-else blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present. +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = 'If a value is true, then do the first block of statements. Otherwise, do the second block of statements.'; +/// tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-else-if-blocks if-else-if blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present. +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = 'If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements.'; +/// tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-else-if-else-blocks if-else-if-else blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present. +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = 'If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements.'; +/// block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. +/// It is recommended, but not essential, that this have text in common with the translation of 'else if'\n{{Identical|If}} +Blockly.Msg.CONTROLS_IF_MSG_IF = 'if'; +/// block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. The English words "otherwise if" would probably be clearer than "else if", but the latter is used because it is traditional and shorter. +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = 'else if'; +/// block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. The English word "otherwise" would probably be superior to "else", but the latter is used because it is traditional and shorter. +Blockly.Msg.CONTROLS_IF_MSG_ELSE = 'else'; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +/// tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#block-modification if block modification]. +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = 'Add, remove, or reorder sections to reconfigure this if block.'; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +/// tooltip - Describes the 'else if' subblock during [https://github.com/google/blockly/wiki/IfElse#block-modification if block modification]. +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = 'Add a condition to the if block.'; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +/// tooltip - Describes the 'else' subblock during [https://github.com/google/blockly/wiki/IfElse#block-modification if block modification]. +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = 'Add a final, catch-all condition to the if block.'; + +/// url - Information about comparisons. +Blockly.Msg.LOGIC_COMPARE_HELPURL = 'https://en.wikipedia.org/wiki/Inequality_(mathematics)'; +/// tooltip - Describes the equals (=) block. +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = 'Return true if both inputs equal each other.'; +/// tooltip - Describes the not equals (≠) block. +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = 'Return true if both inputs are not equal to each other.'; +/// tooltip - Describes the less than (<) block. +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = 'Return true if the first input is smaller than the second input.'; +/// tooltip - Describes the less than or equals (≤) block. +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = 'Return true if the first input is smaller than or equal to the second input.'; +/// tooltip - Describes the greater than (>) block. +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = 'Return true if the first input is greater than the second input.'; +/// tooltip - Describes the greater than or equals (≥) block. +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = 'Return true if the first input is greater than or equal to the second input.'; + +/// url - Information about the Boolean conjunction ("and") and disjunction ("or") operators. Consider using the translation of [https://en.wikipedia.org/wiki/Boolean_logic https://en.wikipedia.org/wiki/Boolean_logic], if it exists in your language. +Blockly.Msg.LOGIC_OPERATION_HELPURL = 'https://github.com/google/blockly/wiki/Logic#logical-operations'; +/// tooltip - See [https://en.wikipedia.org/wiki/Logical_conjunction https://en.wikipedia.org/wiki/Logical_conjunction]. +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = 'Return true if both inputs are true.'; +/// block text - See [https://en.wikipedia.org/wiki/Logical_conjunction https://en.wikipedia.org/wiki/Logical_conjunction].\n{{Identical|And}} +Blockly.Msg.LOGIC_OPERATION_AND = 'and'; +/// block text - See [https://en.wikipedia.org/wiki/Disjunction https://en.wikipedia.org/wiki/Disjunction]. +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = 'Return true if at least one of the inputs is true.'; +/// block text - See [https://en.wikipedia.org/wiki/Disjunction https://en.wikipedia.org/wiki/Disjunction].\n{{Identical|Or}} +Blockly.Msg.LOGIC_OPERATION_OR = 'or'; + +/// url - Information about logical negation. The translation of [https://en.wikipedia.org/wiki/Logical_negation https://en.wikipedia.org/wiki/Logical_negation] is recommended if it exists in the target language. +Blockly.Msg.LOGIC_NEGATE_HELPURL = 'https://github.com/google/blockly/wiki/Logic#not'; +/// block text - This is a unary operator that returns ''false'' when the input is ''true'', and ''true'' when the input is ''false''. +/// \n\nParameters:\n* %1 - the input (which should be either the value "true" or "false") +Blockly.Msg.LOGIC_NEGATE_TITLE = 'not %1'; +/// tooltip - See [https://en.wikipedia.org/wiki/Logical_negation https://en.wikipedia.org/wiki/Logical_negation]. +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = 'Returns true if the input is false. Returns false if the input is true.'; + +/// url - Information about the logic values ''true'' and ''false''. Consider using the translation of [https://en.wikipedia.org/wiki/Truth_value https://en.wikipedia.org/wiki/Truth_value] if it exists in your language. +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = 'https://github.com/google/blockly/wiki/Logic#values'; +/// block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''true''.\n{{Identical|True}} +Blockly.Msg.LOGIC_BOOLEAN_TRUE = 'true'; +/// block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''false''.\n{{Identical|False}} +Blockly.Msg.LOGIC_BOOLEAN_FALSE = 'false'; +/// tooltip - Indicates that the block returns either of the two possible [https://en.wikipedia.org/wiki/Truth_value logical values]. +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = 'Returns either true or false.'; + +/// url - Provide a link to the translation of [https://en.wikipedia.org/wiki/Nullable_type https://en.wikipedia.org/wiki/Nullable_type], if it exists in your language; otherwise, do not worry about translating this advanced concept. +Blockly.Msg.LOGIC_NULL_HELPURL = 'https://en.wikipedia.org/wiki/Nullable_type'; +/// block text - In computer languages, ''null'' is a special value that indicates that no value has been set. You may use your language's word for "nothing" or "invalid".\n{{Identical|Null}} +Blockly.Msg.LOGIC_NULL = 'null'; +/// tooltip - This should use the word from the previous message. +Blockly.Msg.LOGIC_NULL_TOOLTIP = 'Returns null.'; + +/// url - Describes the programming language operator known as the ''ternary'' or ''conditional'' operator. It is recommended that you use the translation of [https://en.wikipedia.org/wiki/%3F: https://en.wikipedia.org/wiki/%3F:] if it exists. +Blockly.Msg.LOGIC_TERNARY_HELPURL = 'https://en.wikipedia.org/wiki/%3F:'; +/// block input text - Label for the input whose value determines which of the other two inputs is returned. In some programming languages, this is called a ''''predicate''''. +Blockly.Msg.LOGIC_TERNARY_CONDITION = 'test'; +/// block input text - Indicates that the following input should be returned (used as output) if the test input is true. Remember to try to keep block text terse (short). +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = 'if true'; +/// block input text - Indicates that the following input should be returned (used as output) if the test input is false. +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = 'if false'; +/// tooltip - See [https://en.wikipedia.org/wiki/%3F: https://en.wikipedia.org/wiki/%3F:]. +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = 'Check the condition in "test". If the condition is true, returns the "if true" value; otherwise returns the "if false" value.'; + +// Math Blocks. +/// url - Information about (real) numbers. +Blockly.Msg.MATH_NUMBER_HELPURL = 'https://en.wikipedia.org/wiki/Number'; +/// tooltip - Any positive or negative number, not necessarily an integer. +Blockly.Msg.MATH_NUMBER_TOOLTIP = 'A number.'; + +/// {{optional}}\nmath - The symbol for the binary operation addition. +Blockly.Msg.MATH_ADDITION_SYMBOL = '+'; +/// {{optional}}\nmath - The symbol for the binary operation indicating that the right operand should be +/// subtracted from the left operand. +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = '-'; +/// {{optional}}\nmath - The binary operation indicating that the left operand should be divided by +/// the right operand. +Blockly.Msg.MATH_DIVISION_SYMBOL = '÷'; +/// {{optional}}\nmath - The symbol for the binary operation multiplication. +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = '×'; +/// {{optional}}\nmath - The symbol for the binary operation exponentiation. Specifically, if the +/// value of the left operand is L and the value of the right operand (the exponent) is +/// R, multiply L by itself R times. (Fractional and negative exponents are also legal.) +Blockly.Msg.MATH_POWER_SYMBOL = '^'; + +/// math - The short name of the trigonometric function +/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent sine]. +Blockly.Msg.MATH_TRIG_SIN = 'sin'; +/// math - The short name of the trigonometric function +/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent cosine]. +Blockly.Msg.MATH_TRIG_COS = 'cos'; +/// math - The short name of the trigonometric function +/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent tangent]. +Blockly.Msg.MATH_TRIG_TAN = 'tan'; +/// math - The short name of the ''inverse of'' the trigonometric function +/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent sine]. +Blockly.Msg.MATH_TRIG_ASIN = 'asin'; +/// math - The short name of the ''inverse of'' the trigonometric function +/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent cosine]. +Blockly.Msg.MATH_TRIG_ACOS = 'acos'; +/// math - The short name of the ''inverse of'' the trigonometric function +/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent tangent]. +Blockly.Msg.MATH_TRIG_ATAN = 'atan'; + +/// url - Information about addition, subtraction, multiplication, division, and exponentiation. +Blockly.Msg.MATH_ARITHMETIC_HELPURL = 'https://en.wikipedia.org/wiki/Arithmetic'; +/// tooltip - See [https://en.wikipedia.org/wiki/Addition https://en.wikipedia.org/wiki/Addition]. +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = 'Return the sum of the two numbers.'; +/// tooltip - See [https://en.wikipedia.org/wiki/Subtraction https://en.wikipedia.org/wiki/Subtraction]. +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = 'Return the difference of the two numbers.'; +/// tooltip - See [https://en.wikipedia.org/wiki/Multiplication https://en.wikipedia.org/wiki/Multiplication]. +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = 'Return the product of the two numbers.'; +/// tooltip - See [https://en.wikipedia.org/wiki/Division_(mathematics) https://en.wikipedia.org/wiki/Division_(mathematics)]. +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = 'Return the quotient of the two numbers.'; +/// tooltip - See [https://en.wikipedia.org/wiki/Exponentiation https://en.wikipedia.org/wiki/Exponentiation]. +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = 'Return the first number raised to the power of the second number.'; + +/// url - Information about the square root operation. +Blockly.Msg.MATH_SINGLE_HELPURL = 'https://en.wikipedia.org/wiki/Square_root'; +/// dropdown - This computes the positive [https://en.wikipedia.org/wiki/Square_root square root] of its input. For example, the square root of 16 is 4. +Blockly.Msg.MATH_SINGLE_OP_ROOT = 'square root'; +/// tooltip - Please use the same term as in the previous message. +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = 'Return the square root of a number.'; +/// dropdown - This leaves positive numeric inputs changed and inverts negative inputs. For example, the absolute value of 5 is 5; the absolute value of -5 is also 5. For more information, see [https://en.wikipedia.org/wiki/Absolute_value https://en.wikipedia.org/wiki/Absolute_value]. +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = 'absolute'; +/// tooltip - Please use the same term as in the previous message. +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = 'Return the absolute value of a number.'; + +/// tooltip - Calculates '''0-n''', where '''n''' is the single numeric input. +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = 'Return the negation of a number.'; +/// tooltip - Calculates the [https://en.wikipedia.org/wiki/Natural_logarithm|natural logarithm] of its single numeric input. +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = 'Return the natural logarithm of a number.'; +/// tooltip - Calculates the [https://en.wikipedia.org/wiki/Common_logarithm common logarithm] of its single numeric input. +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = 'Return the base 10 logarithm of a number.'; +/// tooltip - Multiplies [https://en.wikipedia.org/wiki/E_(mathematical_constant) e] by itself n times, where n is the single numeric input. +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = 'Return e to the power of a number.'; +/// tooltip - Multiplies 10 by itself n times, where n is the single numeric input. +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = 'Return 10 to the power of a number.'; + +/// url - Information about the trigonometric functions sine, cosine, tangent, and their inverses (ideally using degrees, not radians). +Blockly.Msg.MATH_TRIG_HELPURL = 'https://en.wikipedia.org/wiki/Trigonometric_functions'; +/// tooltip - Return the [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent sine] of an [https://en.wikipedia.org/wiki/Degree_(angle) angle in degrees], not radians. +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = 'Return the sine of a degree (not radian).'; +/// tooltip - Return the [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent cosine] of an [https://en.wikipedia.org/wiki/Degree_(angle) angle in degrees], not radians. +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = 'Return the cosine of a degree (not radian).'; +/// tooltip - Return the [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent tangent] of an [https://en.wikipedia.org/wiki/Degree_(angle) angle in degrees], not radians. +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = 'Return the tangent of a degree (not radian).'; +/// tooltip - The [https://en.wikipedia.org/wiki/Inverse_trigonometric_functions inverse] of the [https://en.wikipedia.org/wiki/Cosine#Sine.2C_cosine_and_tangent sine function], using [https://en.wikipedia.org/wiki/Degree_(angle) degrees], not radians. +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = 'Return the arcsine of a number.'; +/// tooltip - The [https://en.wikipedia.org/wiki/Inverse_trigonometric_functions inverse] of the [https://en.wikipedia.org/wiki/Cosine#Sine.2C_cosine_and_tangent cosine] function, using [https://en.wikipedia.org/wiki/Degree_(angle) degrees], not radians. +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = 'Return the arccosine of a number.'; +/// tooltip - The [https://en.wikipedia.org/wiki/Inverse_trigonometric_functions inverse] of the [https://en.wikipedia.org/wiki/Cosine#Sine.2C_cosine_and_tangent tangent] function, using [https://en.wikipedia.org/wiki/Degree_(angle) degrees], not radians. +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = 'Return the arctangent of a number.'; + +/// url - Information about the mathematical constants Pi (π), e, the golden ratio (φ), √ 2, √ 1/2, and infinity (∞). +Blockly.Msg.MATH_CONSTANT_HELPURL = 'https://en.wikipedia.org/wiki/Mathematical_constant'; +/// tooltip - Provides the specified [https://en.wikipedia.org/wiki/Mathematical_constant mathematical constant]. +Blockly.Msg.MATH_CONSTANT_TOOLTIP = 'Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).'; +/// dropdown - A number is '''even''' if it is a multiple of 2. For example, 4 is even (yielding true), but 3 is not (false). +Blockly.Msg.MATH_IS_EVEN = 'is even'; +/// dropdown - A number is '''odd''' if it is not a multiple of 2. For example, 3 is odd (yielding true), but 4 is not (false). The opposite of "odd" is "even". +Blockly.Msg.MATH_IS_ODD = 'is odd'; +/// dropdown - A number is [https://en.wikipedia.org/wiki/Prime prime] if it cannot be evenly divided by any positive integers except for 1 and itself. For example, 5 is prime, but 6 is not because 2 × 3 = 6. +Blockly.Msg.MATH_IS_PRIME = 'is prime'; +/// dropdown - A number is '''whole''' if it is an [https://en.wikipedia.org/wiki/Integer integer]. For example, 5 is whole, but 5.1 is not. +Blockly.Msg.MATH_IS_WHOLE = 'is whole'; +/// dropdown - A number is '''positive''' if it is greater than 0. (0 is neither negative nor positive.) +Blockly.Msg.MATH_IS_POSITIVE = 'is positive'; +/// dropdown - A number is '''negative''' if it is less than 0. (0 is neither negative nor positive.) +Blockly.Msg.MATH_IS_NEGATIVE = 'is negative'; +/// dropdown - A number x is divisible by y if y goes into x evenly. For example, 10 is divisible by 5, but 10 is not divisible by 3. +Blockly.Msg.MATH_IS_DIVISIBLE_BY = 'is divisible by'; +/// tooltip - This block lets the user specify via a dropdown menu whether to check if the numeric input is even, odd, prime, whole, positive, negative, or divisible by a given value. +Blockly.Msg.MATH_IS_TOOLTIP = 'Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false.'; + +/// url - Information about incrementing (increasing the value of) a variable. +/// For other languages, just use the translation of the Wikipedia page about +/// addition ([https://en.wikipedia.org/wiki/Addition https://en.wikipedia.org/wiki/Addition]). +Blockly.Msg.MATH_CHANGE_HELPURL = 'https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter'; +/// - As in: ''change'' [the value of variable] ''item'' ''by'' 1 (e.g., if the variable named 'item' had the value 5, change it to 6). +/// %1 is a variable name. +/// %2 is the amount of change. +Blockly.Msg.MATH_CHANGE_TITLE = 'change %1 by %2'; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +/// tooltip - This updates the value of the variable by adding to it the following numeric input.\n\nParameters:\n* %1 - the name of the variable whose value should be increased. +Blockly.Msg.MATH_CHANGE_TOOLTIP = 'Add a number to variable "%1".'; + +/// url - Information about how numbers are rounded to the nearest integer +Blockly.Msg.MATH_ROUND_HELPURL = 'https://en.wikipedia.org/wiki/Rounding'; +/// tooltip - See [https://en.wikipedia.org/wiki/Rounding https://en.wikipedia.org/wiki/Rounding]. +Blockly.Msg.MATH_ROUND_TOOLTIP = 'Round a number up or down.'; +/// dropdown - This rounds its input to the nearest whole number. For example, 3.4 is rounded to 3. +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = 'round'; +/// dropdown - This rounds its input up to the nearest whole number. For example, if the input was 2.2, the result would be 3. +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = 'round up'; +/// dropdown - This rounds its input down to the nearest whole number. For example, if the input was 3.8, the result would be 3. +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = 'round down'; + +/// url - Information about applying a function to a list of numbers. (We were unable to find such information in English. Feel free to skip this and any other URLs that are difficult.) +Blockly.Msg.MATH_ONLIST_HELPURL = ''; +/// dropdown - This computes the sum of the numeric elements in the list. For example, the sum of the list {1, 4} is 5. +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = 'sum of list'; +/// tooltip - Please use the same term for "sum" as in the previous message. +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = 'Return the sum of all the numbers in the list.'; +/// dropdown - This finds the smallest (minimum) number in a list. For example, the smallest number in the list [-5, 0, 3] is -5. +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = 'min of list'; +/// tooltip - Please use the same term for "min" or "minimum" as in the previous message. +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = 'Return the smallest number in the list.'; +/// dropdown - This finds the largest (maximum) number in a list. For example, the largest number in the list [-5, 0, 3] is 3. +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = 'max of list'; +/// tooltip +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = 'Return the largest number in the list.'; +/// dropdown - This adds up all of the numbers in a list and divides the sum by the number of elements in the list. For example, the [https://en.wikipedia.org/wiki/Arithmetic_mean average] of the list [1, 2, 3, 4] is 2.5 (10/4). +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = 'average of list'; +/// tooltip - See [https://en.wikipedia.org/wiki/Arithmetic_mean https://en.wikipedia.org/wiki/Arithmetic_mean] for more informatin. +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = 'Return the average (arithmetic mean) of the numeric values in the list.'; +/// dropdown - This finds the [https://en.wikipedia.org/wiki/Median median] of the numeric values in a list. For example, the median of the list {1, 2, 7, 12, 13} is 7. +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = 'median of list'; +/// tooltip - See [https://en.wikipedia.org/wiki/Median median https://en.wikipedia.org/wiki/Median median] for more information. +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = 'Return the median number in the list.'; +/// dropdown - This finds the most common numbers ([https://en.wikipedia.org/wiki/Mode_(statistics) modes]) in a list. For example, the modes of the list {1, 3, 9, 3, 9} are {3, 9}. +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = 'modes of list'; +/// tooltip - See [https://en.wikipedia.org/wiki/Mode_(statistics) https://en.wikipedia.org/wiki/Mode_(statistics)] for more information. +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = 'Return a list of the most common item(s) in the list.'; +/// dropdown - This finds the [https://en.wikipedia.org/wiki/Standard_deviation standard deviation] of the numeric values in a list. +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = 'standard deviation of list'; +/// tooltip - See [https://en.wikipedia.org/wiki/Standard_deviation https://en.wikipedia.org/wiki/Standard_deviation] for more information. +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = 'Return the standard deviation of the list.'; +/// dropdown - This choose an element at random from a list. Each element is chosen with equal probability. +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = 'random item of list'; +/// tooltip - Please use same term for 'random' as in previous entry. +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = 'Return a random element from the list.'; + +/// url - information about the modulo (remainder) operation. +Blockly.Msg.MATH_MODULO_HELPURL = 'https://en.wikipedia.org/wiki/Modulo_operation'; +/// block text - Title of block providing the remainder when dividing the first numerical input by the second. For example, the remainder of 10 divided by 3 is 1.\n\nParameters:\n* %1 - the dividend (10, in our example)\n* %2 - the divisor (3 in our example). +Blockly.Msg.MATH_MODULO_TITLE = 'remainder of %1 ÷ %2'; +/// tooltip - For example, the remainder of 10 divided by 3 is 1. +Blockly.Msg.MATH_MODULO_TOOLTIP = 'Return the remainder from dividing the two numbers.'; + +/// url - Information about constraining a numeric value to be in a specific range. (The English URL is not ideal. Recall that translating URLs is the lowest priority.) +Blockly.Msg.MATH_CONSTRAIN_HELPURL = 'https://en.wikipedia.org/wiki/Clamping_(graphics)'; +/// block text - The title of the block that '''constrain'''s (forces) a number to be in a given range. +///For example, if the number 150 is constrained to be between 5 and 100, the result will be 100. +///\n\nParameters:\n* %1 - the value to constrain (e.g., 150)\n* %2 - the minimum value (e.g., 5)\n* %3 - the maximum value (e.g., 100). +Blockly.Msg.MATH_CONSTRAIN_TITLE = 'constrain %1 low %2 high %3'; +/// tooltip - This compares a number ''x'' to a low value ''L'' and a high value ''H''. If ''x'' is less then ''L'', the result is ''L''. If ''x'' is greater than ''H'', the result is ''H''. Otherwise, the result is ''x''. +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = 'Constrain a number to be between the specified limits (inclusive).'; + +/// url - Information about how computers generate random numbers. +Blockly.Msg.MATH_RANDOM_INT_HELPURL = 'https://en.wikipedia.org/wiki/Random_number_generation'; +/// block text - The title of the block that generates a random integer (whole number) in the specified range. For example, if the range is from 5 to 7, this returns 5, 6, or 7 with equal likelihood. %1 is a placeholder for the lower number, %2 is the placeholder for the larger number. +Blockly.Msg.MATH_RANDOM_INT_TITLE = 'random integer from %1 to %2'; +/// tooltip - Return a random integer between two values specified as inputs. For example, if one input was 7 and another 9, any of the numbers 7, 8, or 9 could be produced. +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = 'Return a random integer between the two specified limits, inclusive.'; + +/// url - Information about how computers generate random numbers (specifically, numbers in the range from 0 to just below 1). +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = 'https://en.wikipedia.org/wiki/Random_number_generation'; +/// block text - The title of the block that generates a random number greater than or equal to 0 and less than 1. +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = 'random fraction'; +/// tooltip - Return a random fraction between 0 and 1. The value may be equal to 0 but must be less than 1. +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = 'Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive).'; + +// Text Blocks. +/// url - Information about how computers represent text (sometimes referred to as ''string''s). +Blockly.Msg.TEXT_TEXT_HELPURL = 'https://en.wikipedia.org/wiki/String_(computer_science)'; +/// tooltip - See [https://github.com/google/blockly/wiki/Text https://github.com/google/blockly/wiki/Text]. +Blockly.Msg.TEXT_TEXT_TOOLTIP = 'A letter, word, or line of text.'; + +/// url - Information on concatenating/appending pieces of text. +Blockly.Msg.TEXT_JOIN_HELPURL = 'https://github.com/google/blockly/wiki/Text#text-creation'; +/// block text - See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation]. +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = 'create text with'; +/// tooltip - See [https://github.com/google/blockly/wiki/Text#text-creation create text with] for more information. +Blockly.Msg.TEXT_JOIN_TOOLTIP = 'Create a piece of text by joining together any number of items.'; + +/// block text - This is shown when the programmer wants to change the number of pieces of text being joined together. See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation], specifically the last picture in the 'Text creation' section.\n{{Identical|Join}} +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = 'join'; +/// tooltip - See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation], specifically the last picture in the 'Text creation' section. +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = 'Add, remove, or reorder sections to reconfigure this text block.'; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +/// block text - See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation], specifically the last picture in the 'Text creation' section. +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = 'Add an item to the text.'; + +/// url - This and the other text-related URLs are going to be hard to translate. As always, it is okay to leave untranslated or paste in the English-language URL. For these URLs, you might also consider a general URL about how computers represent text (such as the translation of [https://en.wikipedia.org/wiki/String_(computer_science) this Wikipedia page]). +Blockly.Msg.TEXT_APPEND_HELPURL = 'https://github.com/google/blockly/wiki/Text#text-modification'; +/// block input text - Message preceding the name of a variable to which text should be appended. +/// [[File:blockly-append-text.png]] +Blockly.Msg.TEXT_APPEND_TO = 'to'; +/// block input text - Message following the variable and preceding the piece of text that should +/// be appended, as shown below. +/// [[File:blockly-append-text.png]] +Blockly.Msg.TEXT_APPEND_APPENDTEXT = 'append text'; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +/// tooltip - See [https://github.com/google/blockly/wiki/Text#text-modification https://github.com/google/blockly/wiki/Text#text-modification] for more information.\n\nParameters:\n* %1 - the name of the variable to which text should be appended +Blockly.Msg.TEXT_APPEND_TOOLTIP = 'Append some text to variable "%1".'; + +/// url - Information about text on computers (usually referred to as 'strings'). +Blockly.Msg.TEXT_LENGTH_HELPURL = 'https://github.com/google/blockly/wiki/Text#text-modification'; +/// block text - See [https://github.com/google/blockly/wiki/Text#text-length https://github.com/google/blockly/wiki/Text#text-length]. +/// \n\nParameters:\n* %1 - the piece of text to take the length of +Blockly.Msg.TEXT_LENGTH_TITLE = 'length of %1'; +/// tooltip - See [https://github.com/google/blockly/wiki/Text#text-length https://github.com/google/blockly/wiki/Text#text-length]. +Blockly.Msg.TEXT_LENGTH_TOOLTIP = 'Returns the number of letters (including spaces) in the provided text.'; + +/// url - Information about empty pieces of text on computers (usually referred to as 'empty strings'). +Blockly.Msg.TEXT_ISEMPTY_HELPURL = 'https://github.com/google/blockly/wiki/Text#checking-for-empty-text'; +/// block text - See [https://github.com/google/blockly/wiki/Text#checking-for-empty-text https://github.com/google/blockly/wiki/Text#checking-for-empty-text]. +/// \n\nParameters:\n* %1 - the piece of text to test for emptiness +Blockly.Msg.TEXT_ISEMPTY_TITLE = '%1 is empty'; +/// tooltip - See [https://github.com/google/blockly/wiki/Text#checking-for-empty-text https://github.com/google/blockly/wiki/Text#checking-for-empty-text]. +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = 'Returns true if the provided text is empty.'; + +/// url - Information about finding a character in a piece of text. +Blockly.Msg.TEXT_INDEXOF_HELPURL = 'https://github.com/google/blockly/wiki/Text#finding-text'; +/// tooltip - %1 will be replaced by either the number 0 or -1 depending on the indexing mode. See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text]. +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = 'Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found.'; +/// block text - Title of blocks allowing users to find text. See +/// [https://github.com/google/blockly/wiki/Text#finding-text +/// https://github.com/google/blockly/wiki/Text#finding-text]. +/// [[File:Blockly-find-text.png]]. +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = 'in text'; +/// dropdown - See [https://github.com/google/blockly/wiki/Text#finding-text +/// https://github.com/google/blockly/wiki/Text#finding-text]. +/// [[File:Blockly-find-text.png]]. +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = 'find first occurrence of text'; +/// dropdown - See [https://github.com/google/blockly/wiki/Text#finding-text +/// https://github.com/google/blockly/wiki/Text#finding-text]. This would +/// replace "find first occurrence of text" below. (For more information on +/// how common text is factored out of dropdown menus, see +/// [https://translatewiki.net/wiki/Translating:Blockly#Drop-Down_Menus +/// https://translatewiki.net/wiki/Translating:Blockly#Drop-Down_Menus)].) +/// [[File:Blockly-find-text.png]]. +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = 'find last occurrence of text'; +/// block text - Optional text to follow the rightmost block in a +/// [https://github.com/google/blockly/wiki/Text#finding-text +/// https://github.com/google/blockly/wiki/Text#finding-text in text ... find block] +/// (after the "a" in the below picture). This will be the empty string in most languages. +/// [[File:Blockly-find-text.png]]. +Blockly.Msg.TEXT_INDEXOF_TAIL = ''; + +/// url - Information about extracting characters (letters, number, symbols, etc.) from text. +Blockly.Msg.TEXT_CHARAT_HELPURL = 'https://github.com/google/blockly/wiki/Text#extracting-text'; +/// block text - Appears before the piece of text from which a letter (or number, +/// punctuation character, etc.) should be extracted, as shown below. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-single-character +/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = 'in text'; +/// dropdown - Indicates that the letter (or number, punctuation character, etc.) with the +/// specified index should be obtained from the preceding piece of text. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-single-character +/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_FROM_START = 'get letter #'; +/// block text - Indicates that the letter (or number, punctuation character, etc.) with the +/// specified index from the end of a given piece of text should be obtained. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-single-character +/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_FROM_END = 'get letter # from end'; +/// block text - Indicates that the first letter of the following piece of text should be +/// retrieved. See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character +/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_FIRST = 'get first letter'; +/// block text - Indicates that the last letter (or number, punctuation mark, etc.) of the +/// following piece of text should be retrieved. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-single-character +/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_LAST = 'get last letter'; +/// block text - Indicates that any letter (or number, punctuation mark, etc.) in the +/// following piece of text should be randomly selected. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-single-character +/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_RANDOM = 'get random letter'; +/// block text - Text that goes after the rightmost block/dropdown when getting a single letter from +/// a piece of text, as in [https://blockly-demo.appspot.com/static/apps/code/index.html#3m23km these +/// blocks] or shown below. For most languages, this will be blank. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_TAIL = ''; +/// tooltip - See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character +/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_TOOLTIP = 'Returns the letter at the specified position.'; + +/// See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = 'Returns a specified portion of the text.'; +/// url - Information about extracting characters from text. Reminder: urls are the +/// lowest priority translations. Feel free to skip. +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = 'https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text'; +/// block text - Precedes a piece of text from which a portion should be extracted. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = 'in text'; +/// dropdown - Indicates that the following number specifies the position (relative to the start +/// position) of the beginning of the region of text that should be obtained from the preceding +/// piece of text. See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = 'get substring from letter #'; +/// dropdown - Indicates that the following number specifies the position (relative to the end +/// position) of the beginning of the region of text that should be obtained from the preceding +/// piece of text. See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. +/// Note: If {{msg-Blockly|ORDINAL_NUMBER_SUFFIX}} is defined, it will +/// automatically appear ''after'' this and any other +/// [https://translatewiki.net/wiki/Translating:Blockly#Ordinal_numbers ordinal numbers] +/// on this block. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = 'get substring from letter # from end'; +/// block text - Indicates that a region starting with the first letter of the preceding piece +/// of text should be extracted. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = 'get substring from first letter'; +/// dropdown - Indicates that the following number specifies the position (relative to +/// the start position) of the end of the region of text that should be obtained from the +/// preceding piece of text. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = 'to letter #'; +/// dropdown - Indicates that the following number specifies the position (relative to the +/// end position) of the end of the region of text that should be obtained from the preceding +/// piece of text. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = 'to letter # from end'; +/// block text - Indicates that a region ending with the last letter of the preceding piece +/// of text should be extracted. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = 'to last letter'; +/// block text - Text that should go after the rightmost block/dropdown when +/// [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// extracting a region of text]. In most languages, this will be the empty string. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ''; + +/// url - Information about the case of letters (upper-case and lower-case). +Blockly.Msg.TEXT_CHANGECASE_HELPURL = 'https://github.com/google/blockly/wiki/Text#adjusting-text-case'; +/// tooltip - Describes a block to adjust the case of letters. For more information on this block, +/// see [https://github.com/google/blockly/wiki/Text#adjusting-text-case +/// https://github.com/google/blockly/wiki/Text#adjusting-text-case]. +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = 'Return a copy of the text in a different case.'; +/// block text - Indicates that all of the letters in the following piece of text should be +/// capitalized. If your language does not use case, you may indicate that this is not +/// applicable to your language. For more information on this block, see +/// [https://github.com/google/blockly/wiki/Text#adjusting-text-case +/// https://github.com/google/blockly/wiki/Text#adjusting-text-case]. +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = 'to UPPER CASE'; +/// block text - Indicates that all of the letters in the following piece of text should be converted to lower-case. If your language does not use case, you may indicate that this is not applicable to your language. For more information on this block, see [https://github.com/google/blockly/wiki/Text#adjusting-text-case https://github.com/google/blockly/wiki/Text#adjusting-text-case]. +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = 'to lower case'; +/// block text - Indicates that the first letter of each of the following words should be capitalized and the rest converted to lower-case. If your language does not use case, you may indicate that this is not applicable to your language. For more information on this block, see [https://github.com/google/blockly/wiki/Text#adjusting-text-case https://github.com/google/blockly/wiki/Text#adjusting-text-case]. +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = 'to Title Case'; + +/// url - Information about trimming (removing) text off the beginning and ends of pieces of text. +Blockly.Msg.TEXT_TRIM_HELPURL = 'https://github.com/google/blockly/wiki/Text#trimming-removing-spaces'; +/// tooltip - See [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces +/// https://github.com/google/blockly/wiki/Text#trimming-removing-spaces]. +Blockly.Msg.TEXT_TRIM_TOOLTIP = 'Return a copy of the text with spaces removed from one or both ends.'; +/// dropdown - Removes spaces from the beginning and end of a piece of text. See +/// [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces +/// https://github.com/google/blockly/wiki/Text#trimming-removing-spaces]. Note that neither +/// this nor the other options modify the original piece of text (that follows); +/// the block just returns a version of the text without the specified spaces. +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = 'trim spaces from both sides of'; +/// dropdown - Removes spaces from the beginning of a piece of text. See +/// [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces +/// https://github.com/google/blockly/wiki/Text#trimming-removing-spaces]. +/// Note that in right-to-left scripts, this will remove spaces from the right side. +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = 'trim spaces from left side of'; +/// dropdown - Removes spaces from the end of a piece of text. See +/// [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces +/// https://github.com/google/blockly/wiki/Text#trimming-removing-spaces]. +/// Note that in right-to-left scripts, this will remove spaces from the left side. +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = 'trim spaces from right side of'; + +/// url - Information about displaying text on computers. +Blockly.Msg.TEXT_PRINT_HELPURL = 'https://github.com/google/blockly/wiki/Text#printing-text'; +/// block text - Display the input on the screen. See +/// [https://github.com/google/blockly/wiki/Text#printing-text +/// https://github.com/google/blockly/wiki/Text#printing-text]. +/// \n\nParameters:\n* %1 - the value to print +Blockly.Msg.TEXT_PRINT_TITLE = 'print %1'; +/// tooltip - See [https://github.com/google/blockly/wiki/Text#printing-text +/// https://github.com/google/blockly/wiki/Text#printing-text]. +Blockly.Msg.TEXT_PRINT_TOOLTIP = 'Print the specified text, number or other value.'; +/// url - Information about getting text from users. +Blockly.Msg.TEXT_PROMPT_HELPURL = 'https://github.com/google/blockly/wiki/Text#getting-input-from-the-user'; +/// dropdown - Specifies that a piece of text should be requested from the user with +/// the following message. See [https://github.com/google/blockly/wiki/Text#printing-text +/// https://github.com/google/blockly/wiki/Text#printing-text]. +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = 'prompt for text with message'; +/// dropdown - Specifies that a number should be requested from the user with the +/// following message. See [https://github.com/google/blockly/wiki/Text#printing-text +/// https://github.com/google/blockly/wiki/Text#printing-text]. +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = 'prompt for number with message'; +/// dropdown - Precedes the message with which the user should be prompted for +/// a number. See [https://github.com/google/blockly/wiki/Text#printing-text +/// https://github.com/google/blockly/wiki/Text#printing-text]. +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = 'Prompt for user for a number.'; +/// dropdown - Precedes the message with which the user should be prompted for some text. +/// See [https://github.com/google/blockly/wiki/Text#printing-text +/// https://github.com/google/blockly/wiki/Text#printing-text]. +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = 'Prompt for user for some text.'; + +/// block text - Title of a block that counts the number of instances of +/// a smaller pattern (%1) inside a longer string (%2). +Blockly.Msg.TEXT_COUNT_MESSAGE0 = 'count %1 in %2'; +/// url - Information about counting how many times a string appears in another string. +Blockly.Msg.TEXT_COUNT_HELPURL = 'https://github.com/google/blockly/wiki/Text#counting-substrings'; +/// tooltip - Short description of a block that counts how many times some text occurs within some other text. +Blockly.Msg.TEXT_COUNT_TOOLTIP = 'Count how many times some text occurs within some other text.'; + +/// block text - Title of a block that returns a copy of text (%3) with all +/// instances of some smaller text (%1) replaced with other text (%2). +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = 'replace %1 with %2 in %3'; +/// url - Information about replacing each copy text (or string, in computer lingo) with other text. +Blockly.Msg.TEXT_REPLACE_HELPURL = 'https://github.com/google/blockly/wiki/Text#replacing-substrings'; +/// tooltip - Short description of a block that replaces copies of text in a large text with other text. +Blockly.Msg.TEXT_REPLACE_TOOLTIP = 'Replace all occurances of some text within some other text.'; + +/// block text - Title of block that returns a copy of text (%1) with the order +/// of letters and characters reversed. +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = 'reverse %1'; +/// url - Information about reversing a letters/characters in text. +Blockly.Msg.TEXT_REVERSE_HELPURL = 'https://github.com/google/blockly/wiki/Text#reversing-text'; +/// tooltip - See [https://github.com/google/blockly/wiki/Text]. +Blockly.Msg.TEXT_REVERSE_TOOLTIP = 'Reverses the order of the characters in the text.'; + +// Lists Blocks. +/// url - Information on empty lists. +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = 'https://github.com/google/blockly/wiki/Lists#create-empty-list'; +/// block text - See [https://github.com/google/blockly/wiki/Lists#create-empty-list https://github.com/google/blockly/wiki/Lists#create-empty-list]. +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = 'create empty list'; +/// block text - See [https://github.com/google/blockly/wiki/Lists#create-empty-list https://github.com/google/blockly/wiki/Lists#create-empty-list]. +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = 'Returns a list, of length 0, containing no data records'; + +/// url - Information on building lists. +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = 'https://github.com/google/blockly/wiki/Lists#create-list-with'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#create-list-with https://github.com/google/blockly/wiki/Lists#create-list-with]. +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = 'Create a list with any number of items.'; +/// block text - See [https://github.com/google/blockly/wiki/Lists#create-list-with https://github.com/google/blockly/wiki/Lists#create-list-with]. +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = 'create list with'; +/// block text - This appears in a sub-block when [https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs changing the number of inputs in a ''''create list with'''' block].\n{{Identical|List}} +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = 'list'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs]. +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = 'Add, remove, or reorder sections to reconfigure this list block.'; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs]. +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = 'Add an item to the list.'; + +/// url - Information about [https://github.com/google/blockly/wiki/Lists#create-list-with creating a list with multiple copies of a single item]. +Blockly.Msg.LISTS_REPEAT_HELPURL = 'https://github.com/google/blockly/wiki/Lists#create-list-with'; +/// url - See [https://github.com/google/blockly/wiki/Lists#create-list-with creating a list with multiple copies of a single item]. +Blockly.Msg.LISTS_REPEAT_TOOLTIP = 'Creates a list consisting of the given value repeated the specified number of times.'; +/// block text - See [https://github.com/google/blockly/wiki/Lists#create-list-with +/// https://github.com/google/blockly/wiki/Lists#create-list-with]. +///\n\nParameters:\n* %1 - the item (text) to be repeated\n* %2 - the number of times to repeat it +Blockly.Msg.LISTS_REPEAT_TITLE = 'create list with item %1 repeated %2 times'; + +/// url - Information about how the length of a list is computed (i.e., by the total number of elements, not the number of different elements). +Blockly.Msg.LISTS_LENGTH_HELPURL = 'https://github.com/google/blockly/wiki/Lists#length-of'; +/// block text - See [https://github.com/google/blockly/wiki/Lists#length-of https://github.com/google/blockly/wiki/Lists#length-of]. +/// \n\nParameters:\n* %1 - the list whose length is desired +Blockly.Msg.LISTS_LENGTH_TITLE = 'length of %1'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#length-of https://github.com/google/blockly/wiki/Lists#length-of Blockly:Lists:length of]. +Blockly.Msg.LISTS_LENGTH_TOOLTIP = 'Returns the length of a list.'; + +/// url - See [https://github.com/google/blockly/wiki/Lists#is-empty https://github.com/google/blockly/wiki/Lists#is-empty]. +Blockly.Msg.LISTS_ISEMPTY_HELPURL = 'https://github.com/google/blockly/wiki/Lists#is-empty'; +/// block text - See [https://github.com/google/blockly/wiki/Lists#is-empty +/// https://github.com/google/blockly/wiki/Lists#is-empty]. +/// \n\nParameters:\n* %1 - the list to test +Blockly.Msg.LISTS_ISEMPTY_TITLE = '%1 is empty'; +/// block tooltip - See [https://github.com/google/blockly/wiki/Lists#is-empty +/// https://github.com/google/blockly/wiki/Lists#is-empty]. +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = 'Returns true if the list is empty.'; + +/// block text - Title of blocks operating on [https://github.com/google/blockly/wiki/Lists lists]. +Blockly.Msg.LISTS_INLIST = 'in list'; + +/// url - See [https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list +/// https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list]. +Blockly.Msg.LISTS_INDEX_OF_HELPURL = 'https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list'; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +/// dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list +/// Lists#finding-items-in-a-list]. +/// [[File:Blockly-list-find.png]] +Blockly.Msg.LISTS_INDEX_OF_FIRST = 'find first occurrence of item'; +/// dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list +/// https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list]. +/// [[File:Blockly-list-find.png]] +Blockly.Msg.LISTS_INDEX_OF_LAST = 'find last occurrence of item'; +/// tooltip - %1 will be replaced by either the number 0 or -1 depending on the indexing mode. See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list +/// https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list]. +/// [[File:Blockly-list-find.png]] +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = 'Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found.'; + +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +/// dropdown - Indicates that the user wishes to +/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item +/// get an item from a list] without removing it from the list. +Blockly.Msg.LISTS_GET_INDEX_GET = 'get'; +/// dropdown - Indicates that the user wishes to +/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item +/// get and remove an item from a list], as opposed to merely getting +/// it without modifying the list. +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = 'get and remove'; +/// dropdown - Indicates that the user wishes to +/// [https://github.com/google/blockly/wiki/Lists#removing-an-item +/// remove an item from a list].\n{{Identical|Remove}} +Blockly.Msg.LISTS_GET_INDEX_REMOVE = 'remove'; +/// dropdown - Indicates that an index relative to the front of the list should be used to +/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item get and/or remove +/// an item from a list]. Note: If {{msg-Blockly|ORDINAL_NUMBER_SUFFIX}} is defined, it will +/// automatically appear ''after'' this number (and any other ordinal numbers on this block). +/// See [[Translating:Blockly#Ordinal_numbers]] for more information on ordinal numbers in Blockly. +/// [[File:Blockly-list-get-item.png]] +Blockly.Msg.LISTS_GET_INDEX_FROM_START = '#'; +/// dropdown - Indicates that an index relative to the end of the list should be used +/// to [https://github.com/google/blockly/wiki/Lists#getting-a-single-item access an item in a list]. +/// [[File:Blockly-list-get-item.png]] +Blockly.Msg.LISTS_GET_INDEX_FROM_END = '# from end'; +/// dropdown - Indicates that the '''first''' item should be +/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. +/// [[File:Blockly-list-get-item.png]] +Blockly.Msg.LISTS_GET_INDEX_FIRST = 'first'; +/// dropdown - Indicates that the '''last''' item should be +/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. +/// [[File:Blockly-list-get-item.png]] +Blockly.Msg.LISTS_GET_INDEX_LAST = 'last'; +/// dropdown - Indicates that a '''random''' item should be +/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. +/// [[File:Blockly-list-get-item.png]] +Blockly.Msg.LISTS_GET_INDEX_RANDOM = 'random'; +/// block text - Text that should go after the rightmost block/dropdown when +/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item +/// accessing an item from a list]. In most languages, this will be the empty string. +/// [[File:Blockly-list-get-item.png]] +Blockly.Msg.LISTS_GET_INDEX_TAIL = ''; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +/// tooltip - Indicates the ordinal number that the first item in a list is referenced by. %1 will be replaced by either "#0" or "#1" depending on the indexing mode. +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = '%1 is the first item.'; +/// tooltip - Indicates the ordinal number that the last item in a list is referenced by. %1 will be replaced by either "#0" or "#1" depending on the indexing mode. +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = '%1 is the last item.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = 'Returns the item at the specified position in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = 'Returns the first item in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = 'Returns the last item in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = 'Returns a random item in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '#' or '# from end'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = 'Removes and returns the item at the specified position in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'first'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = 'Removes and returns the first item in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'last'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = 'Removes and returns the last item in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'random'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = 'Removes and returns a random item in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '#' or '# from end'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = 'Removes the item at the specified position in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'first'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = 'Removes the first item in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'last'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = 'Removes the last item in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'random'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = 'Removes a random item in a list.'; +/// url - Information about putting items in lists. +Blockly.Msg.LISTS_SET_INDEX_HELPURL = 'https://github.com/google/blockly/wiki/Lists#in-list--set'; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +/// block text - [https://github.com/google/blockly/wiki/Lists#in-list--set +/// Replaces an item in a list]. +/// [[File:Blockly-in-list-set-insert.png]] +Blockly.Msg.LISTS_SET_INDEX_SET = 'set'; +/// block text - [https://github.com/google/blockly/wiki/Lists#in-list--insert-at +/// Inserts an item into a list]. +/// [[File:Blockly-in-list-set-insert.png]] +Blockly.Msg.LISTS_SET_INDEX_INSERT = 'insert at'; +/// block text - The word(s) after the position in the list and before the item to be set/inserted. +/// [[File:Blockly-in-list-set-insert.png]] +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = 'as'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "set" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = 'Sets the item at the specified position in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "set" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = 'Sets the first item in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "set" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = 'Sets the last item in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "set" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = 'Sets a random item in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "insert" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = 'Inserts the item at the specified position in a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "insert" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = 'Inserts the item at the start of a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "insert" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = 'Append the item to the end of a list.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "insert" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = 'Inserts the item randomly in a list.'; + +/// url - Information describing extracting a sublist from an existing list. +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = 'https://github.com/google/blockly/wiki/Lists#getting-a-sublist'; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +/// dropdown - Indicates that an index relative to the front of the list should be used +/// to specify the beginning of the range from which to +/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. +/// [[File:Blockly-get-sublist.png]] +/// Note: If {{msg-Blockly|ORDINAL_NUMBER_SUFFIX}} is defined, it will +/// automatically appear ''after'' this number (and any other ordinal numbers on this block). +/// See [[Translating:Blockly#Ordinal_numbers]] for more information on ordinal numbers in Blockly. +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = 'get sub-list from #'; +/// dropdown - Indicates that an index relative to the end of the list should be used +/// to specify the beginning of the range from which to +/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = 'get sub-list from # from end'; +/// dropdown - Indicates that the +/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist sublist to extract] +/// should begin with the list's first item. +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = 'get sub-list from first'; +/// dropdown - Indicates that an index relative to the front of the list should be +/// used to specify the end of the range from which to +/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. +/// [[File:Blockly-get-sublist.png]] +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = 'to #'; +/// dropdown - Indicates that an index relative to the end of the list should be +/// used to specify the end of the range from which to +/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. +/// [[File:Blockly-get-sublist.png]] +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = 'to # from end'; +/// dropdown - Indicates that the '''last''' item in the given list should be +/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist the end +/// of the selected sublist]. +/// [[File:Blockly-get-sublist.png]] +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = 'to last'; +/// block text - This appears in the rightmost position ("tail") of the +/// sublist block, as described at +/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist +/// https://github.com/google/blockly/wiki/Lists#getting-a-sublist]. +/// In English and most other languages, this is the empty string. +/// [[File:Blockly-get-sublist.png]] +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ''; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-sublist +/// https://github.com/google/blockly/wiki/Lists#getting-a-sublist] for more information. +/// [[File:Blockly-get-sublist.png]] +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = 'Creates a copy of the specified portion of a list.'; + +/// {{optional}}\nurl - Information describing sorting a list. +Blockly.Msg.LISTS_SORT_HELPURL = 'https://github.com/google/blockly/wiki/Lists#sorting-a-list'; +/// Sort as type %1 (numeric or alphabetic) in order %2 (ascending or descending) a list of items %3.\n{{Identical|Sort}} +Blockly.Msg.LISTS_SORT_TITLE = 'sort %1 %2 %3'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#sorting-a-list]. +Blockly.Msg.LISTS_SORT_TOOLTIP = 'Sort a copy of a list.'; +/// sorting order or direction from low to high value for numeric, or A-Z for alphabetic.\n{{Identical|Ascending}} +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = 'ascending'; +/// sorting order or direction from high to low value for numeric, or Z-A for alphabetic.\n{{Identical|Descending}} +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = 'descending'; +/// sort by treating each item as a number. +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = 'numeric'; +/// sort by treating each item alphabetically, case-sensitive. +Blockly.Msg.LISTS_SORT_TYPE_TEXT = 'alphabetic'; +/// sort by treating each item alphabetically, ignoring differences in case. +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = 'alphabetic, ignore case'; + +/// url - Information describing splitting text into a list, or joining a list into text. +Blockly.Msg.LISTS_SPLIT_HELPURL = 'https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists'; +/// dropdown - Indicates that text will be split up into a list (e.g. "a-b-c" -> ["a", "b", "c"]). +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = 'make list from text'; +/// dropdown - Indicates that a list will be joined together to form text (e.g. ["a", "b", "c"] -> "a-b-c"). +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = 'make text from list'; +/// block text - Prompts for a letter to be used as a separator when splitting or joining text. +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = 'with delimiter'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#make-list-from-text +/// https://github.com/google/blockly/wiki/Lists#make-list-from-text] for more information. +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = 'Split text into a list of texts, breaking at each delimiter.'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#make-text-from-list +/// https://github.com/google/blockly/wiki/Lists#make-text-from-list] for more information. +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = 'Join a list of texts into one text, separated by a delimiter.'; + +/// url - Information describing reversing a list. +Blockly.Msg.LISTS_REVERSE_HELPURL = 'https://github.com/google/blockly/wiki/Lists#reversing-a-list'; +/// block text - Title of block that returns a copy of a list (%1) with the order of items reversed. +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = 'reverse %1'; +/// tooltip - Short description for a block that reverses a copy of a list. +Blockly.Msg.LISTS_REVERSE_TOOLTIP = 'Reverse a copy of a list.'; + +/// grammar - Text that follows an ordinal number (a number that indicates +/// position relative to other numbers). In most languages, such text appears +/// before the number, so this should be blank. An exception is Hungarian. +/// See [[Translating:Blockly#Ordinal_numbers]] for more information. +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ''; + +// Variables Blocks. +/// url - Information about ''variables'' in computer programming. Consider using your language's translation of [https://en.wikipedia.org/wiki/Variable_(computer_science) https://en.wikipedia.org/wiki/Variable_(computer_science)], if it exists. +Blockly.Msg.VARIABLES_GET_HELPURL = 'https://github.com/google/blockly/wiki/Variables#get'; +/// tooltip - This gets the value of the named variable without modifying it. +Blockly.Msg.VARIABLES_GET_TOOLTIP = 'Returns the value of this variable.'; +/// context menu - Selecting this creates a block to set (change) the value of this variable. +/// \n\nParameters:\n* %1 - the name of the variable. +Blockly.Msg.VARIABLES_GET_CREATE_SET = 'Create "set %1"'; + +/// url - Information about ''variables'' in computer programming. Consider using your language's translation of [https://en.wikipedia.org/wiki/Variable_(computer_science) https://en.wikipedia.org/wiki/Variable_(computer_science)], if it exists. +Blockly.Msg.VARIABLES_SET_HELPURL = 'https://github.com/google/blockly/wiki/Variables#set'; +/// block text - Change the value of a mathematical variable: '''set [the value of] x to 7'''.\n\nParameters:\n* %1 - the name of the variable.\n* %2 - the value to be assigned. +Blockly.Msg.VARIABLES_SET = 'set %1 to %2'; +/// tooltip - This initializes or changes the value of the named variable. +Blockly.Msg.VARIABLES_SET_TOOLTIP = 'Sets this variable to be equal to the input.'; +/// context menu - Selecting this creates a block to get (change) the value of +/// this variable.\n\nParameters:\n* %1 - the name of the variable. +Blockly.Msg.VARIABLES_SET_CREATE_GET = 'Create "get %1"'; + +// Procedures Blocks. +/// url - Information about defining [https://en.wikipedia.org/wiki/Subroutine functions] that do not have return values. +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = 'https://en.wikipedia.org/wiki/Subroutine'; +/// block text - This precedes the name of the function when defining it. See +/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#c84aoc this sample +/// function definition]. +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = 'to'; +/// default name - This acts as a placeholder for the name of a function on a +/// function definition block, as shown on +/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#w7cfju this block]. +/// The user will replace it with the function's name. +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = 'do something'; +/// block text - This precedes the list of parameters on a function's defiition block. See +/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample +/// function with parameters]. +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = 'with:'; +/// block text - This precedes the list of parameters on a function's caller block. See +/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample +/// function with parameters]. +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = 'with:'; +/// block text - This appears next to the function's "body", the blocks that should be +/// run when the function is called, as shown in +/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample +/// function definition]. +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ''; +/// tooltip +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = 'Creates a function with no output.'; +/// Placeholder text that the user is encouraged to replace with a description of what their function does. +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = 'Describe this function...'; +/// url - Information about defining [https://en.wikipedia.org/wiki/Subroutine functions] that have return values. +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = 'https://en.wikipedia.org/wiki/Subroutine'; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; +/// block text - This imperative or infinite verb precedes the value that is used as the return value +/// (output) of this function. See +/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#6ot5y5 this sample +/// function that returns a value]. +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = 'return'; +/// tooltip +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = 'Creates a function with an output.'; +/// Label for a checkbox that controls if statements are allowed in a function. +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = 'allow statements'; + +/// alert - The user has created a function with two parameters that have the same name. Every parameter must have a different name. +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = 'Warning: This function has duplicate parameters.'; + +/// url - Information about calling [https://en.wikipedia.org/wiki/Subroutine functions] that do not return values. +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = 'https://en.wikipedia.org/wiki/Subroutine'; +/// tooltip - This block causes the body (blocks inside) of the named function definition to be run. +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = 'Run the user-defined function "%1".'; + +/// url - Information about calling [https://en.wikipedia.org/wiki/Subroutine functions] that return values. +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = 'https://en.wikipedia.org/wiki/Subroutine'; +/// tooltip - This block causes the body (blocks inside) of the named function definition to be run.\n\nParameters:\n* %1 - the name of the function. +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = 'Run the user-defined function "%1" and use its output.'; + +/// block text - This text appears on a block in a window that appears when the user clicks +/// on the plus sign or star on a function definition block. It refers to the set of parameters +/// (referred to by the simpler term "inputs") to the function. See +/// [[Translating:Blockly#function_definitions]]. +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = 'inputs'; +/// tooltip +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = 'Add, remove, or reorder inputs to this function.'; +/// block text - This text appears on a block in a window that appears when the user clicks +/// on the plus sign or star on a function definition block]. It appears on the block for +/// adding an individual parameter (referred to by the simpler term "inputs") to the function. +/// See [[Translating:Blockly#function_definitions]]. +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = 'input name:'; +/// tooltip +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = 'Add an input to the function.'; + +/// context menu - This appears on the context menu for function calls. Selecting +/// it causes the corresponding function definition to be highlighted (as shown at +/// [[Translating:Blockly#context_menus]]. +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = 'Highlight function definition'; +/// context menu - This appears on the context menu for function definitions. +/// Selecting it creates a block to call the function.\n\nParameters:\n* %1 - the name of the function.\n{{Identical|Create}} +Blockly.Msg.PROCEDURES_CREATE_DO = 'Create "%1"'; + +/// tooltip - If the first value is true, this causes the second value to be returned +/// immediately from the enclosing function. +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = 'If a value is true, then return a second value.'; +/// {{optional}}\nurl - Information about guard clauses. +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = 'http://c2.com/cgi/wiki?GuardClause'; +/// warning - This appears if the user tries to use this block outside of a function definition. +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = 'Warning: This block may be used only within a function definition.'; diff --git a/src/opsoro/server/static/js/blockly/package.json b/src/opsoro/server/static/js/blockly/package.json new file mode 100644 index 0000000..46bc66e --- /dev/null +++ b/src/opsoro/server/static/js/blockly/package.json @@ -0,0 +1,49 @@ +{ + "name": "blockly", + "version": "1.0.0", + "description": "Blockly is a library for building visual programming editors.", + "keywords": [ + "blockly" + ], + "repository": { + "type": "git", + "url": "https://github.com/google/blockly.git" + }, + "bugs": { + "url": "https://github.com/google/blockly/issues" + }, + "homepage": "https://developers.google.com/blockly/", + "author": { + "name": "Neil Fraser" + }, + "scripts": { + "lint": "jshint .", + "preinstall": "scripts/get_geckdriver.sh && scripts/get_selenium.sh && scripts/get_chromedriver.sh && scripts/selenium_connect.sh &", + "test": "node tests/jsunit/test_runner.js" + }, + "license": "Apache-2.0", + "private": true, + "devDependencies": { + "jshint": "latest" + }, + "jshintConfig": { + "globalstrict": true, + "predef": [ + "Blockly", + "goog", + "window", + "document", + "soy", + "XMLHttpRequest" + ], + "sub": true, + "undef": true, + "unused": true + }, + "dependencies": { + "install": "^0.8.8", + "npm": "^4.4.4", + "closure-library": "^1.43629075.2", + "webdriverio": "^4.6.2" + } +} diff --git a/src/opsoro/server/static/js/blockly/php_compressed.js b/src/opsoro/server/static/js/blockly/php_compressed.js new file mode 100644 index 0000000..87436e2 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/php_compressed.js @@ -0,0 +1,87 @@ +// Do not edit this file; automatically generated by build.py. +'use strict'; + + +// Copyright 2015 Google Inc. Apache License 2.0 +Blockly.PHP=new Blockly.Generator("PHP");Blockly.PHP.addReservedWords("__halt_compiler,abstract,and,array,as,break,callable,case,catch,class,clone,const,continue,declare,default,die,do,echo,else,elseif,empty,enddeclare,endfor,endforeach,endif,endswitch,endwhile,eval,exit,extends,final,for,foreach,function,global,goto,if,implements,include,include_once,instanceof,insteadof,interface,isset,list,namespace,new,or,print,private,protected,public,require,require_once,return,static,switch,throw,trait,try,unset,use,var,while,xor,PHP_VERSION,PHP_MAJOR_VERSION,PHP_MINOR_VERSION,PHP_RELEASE_VERSION,PHP_VERSION_ID,PHP_EXTRA_VERSION,PHP_ZTS,PHP_DEBUG,PHP_MAXPATHLEN,PHP_OS,PHP_SAPI,PHP_EOL,PHP_INT_MAX,PHP_INT_SIZE,DEFAULT_INCLUDE_PATH,PEAR_INSTALL_DIR,PEAR_EXTENSION_DIR,PHP_EXTENSION_DIR,PHP_PREFIX,PHP_BINDIR,PHP_BINARY,PHP_MANDIR,PHP_LIBDIR,PHP_DATADIR,PHP_SYSCONFDIR,PHP_LOCALSTATEDIR,PHP_CONFIG_FILE_PATH,PHP_CONFIG_FILE_SCAN_DIR,PHP_SHLIB_SUFFIX,E_ERROR,E_WARNING,E_PARSE,E_NOTICE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE,E_DEPRECATED,E_USER_DEPRECATED,E_ALL,E_STRICT,__COMPILER_HALT_OFFSET__,TRUE,FALSE,NULL,__CLASS__,__DIR__,__FILE__,__FUNCTION__,__LINE__,__METHOD__,__NAMESPACE__,__TRAIT__"); +Blockly.PHP.ORDER_ATOMIC=0;Blockly.PHP.ORDER_CLONE=1;Blockly.PHP.ORDER_NEW=1;Blockly.PHP.ORDER_MEMBER=2.1;Blockly.PHP.ORDER_FUNCTION_CALL=2.2;Blockly.PHP.ORDER_POWER=3;Blockly.PHP.ORDER_INCREMENT=4;Blockly.PHP.ORDER_DECREMENT=4;Blockly.PHP.ORDER_BITWISE_NOT=4;Blockly.PHP.ORDER_CAST=4;Blockly.PHP.ORDER_SUPPRESS_ERROR=4;Blockly.PHP.ORDER_INSTANCEOF=5;Blockly.PHP.ORDER_LOGICAL_NOT=6;Blockly.PHP.ORDER_UNARY_PLUS=7.1;Blockly.PHP.ORDER_UNARY_NEGATION=7.2;Blockly.PHP.ORDER_MULTIPLICATION=8.1; +Blockly.PHP.ORDER_DIVISION=8.2;Blockly.PHP.ORDER_MODULUS=8.3;Blockly.PHP.ORDER_ADDITION=9.1;Blockly.PHP.ORDER_SUBTRACTION=9.2;Blockly.PHP.ORDER_STRING_CONCAT=9.3;Blockly.PHP.ORDER_BITWISE_SHIFT=10;Blockly.PHP.ORDER_RELATIONAL=11;Blockly.PHP.ORDER_EQUALITY=12;Blockly.PHP.ORDER_REFERENCE=13;Blockly.PHP.ORDER_BITWISE_AND=13;Blockly.PHP.ORDER_BITWISE_XOR=14;Blockly.PHP.ORDER_BITWISE_OR=15;Blockly.PHP.ORDER_LOGICAL_AND=16;Blockly.PHP.ORDER_LOGICAL_OR=17;Blockly.PHP.ORDER_IF_NULL=18; +Blockly.PHP.ORDER_CONDITIONAL=19;Blockly.PHP.ORDER_ASSIGNMENT=20;Blockly.PHP.ORDER_LOGICAL_AND_WEAK=21;Blockly.PHP.ORDER_LOGICAL_XOR=22;Blockly.PHP.ORDER_LOGICAL_OR_WEAK=23;Blockly.PHP.ORDER_COMMA=24;Blockly.PHP.ORDER_NONE=99; +Blockly.PHP.ORDER_OVERRIDES=[[Blockly.PHP.ORDER_MEMBER,Blockly.PHP.ORDER_FUNCTION_CALL],[Blockly.PHP.ORDER_MEMBER,Blockly.PHP.ORDER_MEMBER],[Blockly.PHP.ORDER_LOGICAL_NOT,Blockly.PHP.ORDER_LOGICAL_NOT],[Blockly.PHP.ORDER_MULTIPLICATION,Blockly.PHP.ORDER_MULTIPLICATION],[Blockly.PHP.ORDER_ADDITION,Blockly.PHP.ORDER_ADDITION],[Blockly.PHP.ORDER_LOGICAL_AND,Blockly.PHP.ORDER_LOGICAL_AND],[Blockly.PHP.ORDER_LOGICAL_OR,Blockly.PHP.ORDER_LOGICAL_OR]]; +Blockly.PHP.init=function(a){Blockly.PHP.definitions_=Object.create(null);Blockly.PHP.functionNames_=Object.create(null);Blockly.PHP.variableDB_?Blockly.PHP.variableDB_.reset():Blockly.PHP.variableDB_=new Blockly.Names(Blockly.PHP.RESERVED_WORDS_,"$");var b=[];a=Blockly.Variables.allVariables(a);for(var c=0;cc?Blockly.PHP.valueToCode(a,b,Blockly.PHP.ORDER_SUBTRACTION)||g:d?Blockly.PHP.valueToCode(a,b,Blockly.PHP.ORDER_UNARY_NEGATION)||g:Blockly.PHP.valueToCode(a,b,e)||g;if(Blockly.isNumber(a))a=parseFloat(a)+c,d&&(a=-a);else{if(0c&& +(a=a+" - "+-c,f=Blockly.PHP.ORDER_SUBTRACTION);d&&(a=c?"-("+a+")":"-"+a,f=Blockly.PHP.ORDER_UNARY_NEGATION);f=Math.floor(f);e=Math.floor(e);f&&e>=f&&(a="("+a+")")}return a};Blockly.PHP.lists={};Blockly.PHP.lists_create_empty=function(a){return["array()",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.lists_create_with=function(a){for(var b=Array(a.itemCount_),c=0;c "strnatcasecmp",',' "TEXT" => "strcmp",',' "IGNORE_CASE" => "strcasecmp"'," );"," $sortCmp = $sortCmpFuncs[$type];"," $list2 = $list;"," usort($list2, $sortCmp);", +" if ($direction == -1) {"," $list2 = array_reverse($list2);"," }"," return $list2;","}"])+"("+b+', "'+a+'", '+c+")",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.lists_split=function(a){var b=Blockly.PHP.valueToCode(a,"INPUT",Blockly.PHP.ORDER_COMMA),c=Blockly.PHP.valueToCode(a,"DELIM",Blockly.PHP.ORDER_COMMA)||"''";a=a.getFieldValue("MODE");if("SPLIT"==a)b||(b="''"),a="explode";else if("JOIN"==a)b||(b="array()"),a="implode";else throw"Unknown mode: "+a;return[a+"("+c+", "+b+")",Blockly.PHP.ORDER_FUNCTION_CALL]}; +Blockly.PHP.lists_reverse=function(a){return["array_reverse("+(Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_COMMA)||"[]")+")",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.math={};Blockly.PHP.math_number=function(a){a=parseFloat(a.getFieldValue("NUM"));Infinity==a?a="INF":-Infinity==a&&(a="-INF");return[a,Blockly.PHP.ORDER_ATOMIC]}; +Blockly.PHP.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.PHP.ORDER_ADDITION],MINUS:[" - ",Blockly.PHP.ORDER_SUBTRACTION],MULTIPLY:[" * ",Blockly.PHP.ORDER_MULTIPLICATION],DIVIDE:[" / ",Blockly.PHP.ORDER_DIVISION],POWER:[" ** ",Blockly.PHP.ORDER_POWER]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.PHP.valueToCode(a,"A",b)||"0";a=Blockly.PHP.valueToCode(a,"B",b)||"0";return[d+c+a,b]}; +Blockly.PHP.math_single=function(a){var b=a.getFieldValue("OP"),c;if("NEG"==b)return a=Blockly.PHP.valueToCode(a,"NUM",Blockly.PHP.ORDER_UNARY_NEGATION)||"0","-"==a[0]&&(a=" "+a),["-"+a,Blockly.PHP.ORDER_UNARY_NEGATION];a="SIN"==b||"COS"==b||"TAN"==b?Blockly.PHP.valueToCode(a,"NUM",Blockly.PHP.ORDER_DIVISION)||"0":Blockly.PHP.valueToCode(a,"NUM",Blockly.PHP.ORDER_NONE)||"0";switch(b){case "ABS":c="abs("+a+")";break;case "ROOT":c="sqrt("+a+")";break;case "LN":c="log("+a+")";break;case "EXP":c="exp("+ +a+")";break;case "POW10":c="pow(10,"+a+")";break;case "ROUND":c="round("+a+")";break;case "ROUNDUP":c="ceil("+a+")";break;case "ROUNDDOWN":c="floor("+a+")";break;case "SIN":c="sin("+a+" / 180 * pi())";break;case "COS":c="cos("+a+" / 180 * pi())";break;case "TAN":c="tan("+a+" / 180 * pi())"}if(c)return[c,Blockly.PHP.ORDER_FUNCTION_CALL];switch(b){case "LOG10":c="log("+a+") / log(10)";break;case "ASIN":c="asin("+a+") / pi() * 180";break;case "ACOS":c="acos("+a+") / pi() * 180";break;case "ATAN":c="atan("+ +a+") / pi() * 180";break;default:throw"Unknown math operator: "+b;}return[c,Blockly.PHP.ORDER_DIVISION]};Blockly.PHP.math_constant=function(a){return{PI:["M_PI",Blockly.PHP.ORDER_ATOMIC],E:["M_E",Blockly.PHP.ORDER_ATOMIC],GOLDEN_RATIO:["(1 + sqrt(5)) / 2",Blockly.PHP.ORDER_DIVISION],SQRT2:["M_SQRT2",Blockly.PHP.ORDER_ATOMIC],SQRT1_2:["M_SQRT1_2",Blockly.PHP.ORDER_ATOMIC],INFINITY:["INF",Blockly.PHP.ORDER_ATOMIC]}[a.getFieldValue("CONSTANT")]}; +Blockly.PHP.math_number_property=function(a){var b=Blockly.PHP.valueToCode(a,"NUMBER_TO_CHECK",Blockly.PHP.ORDER_MODULUS)||"0",c=a.getFieldValue("PROPERTY"),d;if("PRIME"==c)return[Blockly.PHP.provideFunction_("math_isPrime",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($n) {"," // https://en.wikipedia.org/wiki/Primality_test#Naive_methods"," if ($n == 2 || $n == 3) {"," return true;"," }"," // False if n is NaN, negative, is 1, or not whole."," // And false if n is divisible by 2 or 3.", +" if (!is_numeric($n) || $n <= 1 || $n % 1 != 0 || $n % 2 == 0 || $n % 3 == 0) {"," return false;"," }"," // Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for ($x = 6; $x <= sqrt($n) + 1; $x += 6) {"," if ($n % ($x - 1) == 0 || $n % ($x + 1) == 0) {"," return false;"," }"," }"," return true;","}"])+"("+b+")",Blockly.JavaScript.ORDER_FUNCTION_CALL];switch(c){case "EVEN":d=b+" % 2 == 0";break;case "ODD":d=b+" % 2 == 1";break;case "WHOLE":d="is_int("+b+")";break;case "POSITIVE":d= +b+" > 0";break;case "NEGATIVE":d=b+" < 0";break;case "DIVISIBLE_BY":a=Blockly.PHP.valueToCode(a,"DIVISOR",Blockly.PHP.ORDER_MODULUS)||"0",d=b+" % "+a+" == 0"}return[d,Blockly.PHP.ORDER_EQUALITY]};Blockly.PHP.math_change=function(a){var b=Blockly.PHP.valueToCode(a,"DELTA",Blockly.PHP.ORDER_ADDITION)||"0";return Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE)+" += "+b+";\n"};Blockly.PHP.math_round=Blockly.PHP.math_single;Blockly.PHP.math_trig=Blockly.PHP.math_single; +Blockly.PHP.math_on_list=function(a){var b=a.getFieldValue("OP");switch(b){case "SUM":a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_FUNCTION_CALL)||"array()";a="array_sum("+a+")";break;case "MIN":a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_FUNCTION_CALL)||"array()";a="min("+a+")";break;case "MAX":a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_FUNCTION_CALL)||"array()";a="max("+a+")";break;case "AVERAGE":b=Blockly.PHP.provideFunction_("math_mean",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+ +"($myList) {"," return array_sum($myList) / count($myList);","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"array()";a=b+"("+a+")";break;case "MEDIAN":b=Blockly.PHP.provideFunction_("math_median",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($arr) {"," sort($arr,SORT_NUMERIC);"," return (count($arr) % 2) ? $arr[floor(count($arr)/2)] : "," ($arr[floor(count($arr)/2)] + $arr[floor(count($arr)/2) - 1]) / 2;","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)|| +"[]";a=b+"("+a+")";break;case "MODE":b=Blockly.PHP.provideFunction_("math_modes",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($values) {"," if (empty($values)) return array();"," $counts = array_count_values($values);"," arsort($counts); // Sort counts in descending order"," $modes = array_keys($counts, current($counts), true);"," return $modes;","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "STD_DEV":b=Blockly.PHP.provideFunction_("math_standard_deviation", +["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($numbers) {"," $n = count($numbers);"," if (!$n) return null;"," $mean = array_sum($numbers) / count($numbers);"," foreach($numbers as $key => $num) $devs[$key] = pow($num - $mean, 2);"," return sqrt(array_sum($devs) / (count($devs) - 1));","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "RANDOM":b=Blockly.PHP.provideFunction_("math_random_list",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+ +"($list) {"," $x = rand(0, count($list)-1);"," return $list[$x];","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;default:throw"Unknown operator: "+b;}return[a,Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.math_modulo=function(a){var b=Blockly.PHP.valueToCode(a,"DIVIDEND",Blockly.PHP.ORDER_MODULUS)||"0";a=Blockly.PHP.valueToCode(a,"DIVISOR",Blockly.PHP.ORDER_MODULUS)||"0";return[b+" % "+a,Blockly.PHP.ORDER_MODULUS]}; +Blockly.PHP.math_constrain=function(a){var b=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_COMMA)||"0",c=Blockly.PHP.valueToCode(a,"LOW",Blockly.PHP.ORDER_COMMA)||"0";a=Blockly.PHP.valueToCode(a,"HIGH",Blockly.PHP.ORDER_COMMA)||"Infinity";return["min(max("+b+", "+c+"), "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]}; +Blockly.PHP.math_random_int=function(a){var b=Blockly.PHP.valueToCode(a,"FROM",Blockly.PHP.ORDER_COMMA)||"0";a=Blockly.PHP.valueToCode(a,"TO",Blockly.PHP.ORDER_COMMA)||"0";return[Blockly.PHP.provideFunction_("math_random_int",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($a, $b) {"," if ($a > $b) {"," return rand($b, $a);"," }"," return rand($a, $b);","}"])+"("+b+", "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]}; +Blockly.PHP.math_random_float=function(a){return["(float)rand()/(float)getrandmax()",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.variables={};Blockly.PHP.variables_get=function(a){return[Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),Blockly.PHP.ORDER_ATOMIC]};Blockly.PHP.variables_set=function(a){var b=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_ASSIGNMENT)||"0";return Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE)+" = "+b+";\n"};Blockly.PHP.colour={};Blockly.PHP.colour_picker=function(a){return["'"+a.getFieldValue("COLOUR")+"'",Blockly.PHP.ORDER_ATOMIC]};Blockly.PHP.colour_random=function(a){return[Blockly.PHP.provideFunction_("colour_random",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"() {"," return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);","}"])+"()",Blockly.PHP.ORDER_FUNCTION_CALL]}; +Blockly.PHP.colour_rgb=function(a){var b=Blockly.PHP.valueToCode(a,"RED",Blockly.PHP.ORDER_COMMA)||0,c=Blockly.PHP.valueToCode(a,"GREEN",Blockly.PHP.ORDER_COMMA)||0;a=Blockly.PHP.valueToCode(a,"BLUE",Blockly.PHP.ORDER_COMMA)||0;return[Blockly.PHP.provideFunction_("colour_rgb",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($r, $g, $b) {"," $r = round(max(min($r, 100), 0) * 2.55);"," $g = round(max(min($g, 100), 0) * 2.55);"," $b = round(max(min($b, 100), 0) * 2.55);"," $hex = '#';"," $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);", +" $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT);"," $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT);"," return $hex;","}"])+"("+b+", "+c+", "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]}; +Blockly.PHP.colour_blend=function(a){var b=Blockly.PHP.valueToCode(a,"COLOUR1",Blockly.PHP.ORDER_COMMA)||"'#000000'",c=Blockly.PHP.valueToCode(a,"COLOUR2",Blockly.PHP.ORDER_COMMA)||"'#000000'";a=Blockly.PHP.valueToCode(a,"RATIO",Blockly.PHP.ORDER_COMMA)||.5;return[Blockly.PHP.provideFunction_("colour_blend",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($c1, $c2, $ratio) {"," $ratio = max(min($ratio, 1), 0);"," $r1 = hexdec(substr($c1, 1, 2));"," $g1 = hexdec(substr($c1, 3, 2));"," $b1 = hexdec(substr($c1, 5, 2));", +" $r2 = hexdec(substr($c2, 1, 2));"," $g2 = hexdec(substr($c2, 3, 2));"," $b2 = hexdec(substr($c2, 5, 2));"," $r = round($r1 * (1 - $ratio) + $r2 * $ratio);"," $g = round($g1 * (1 - $ratio) + $g2 * $ratio);"," $b = round($b1 * (1 - $ratio) + $b2 * $ratio);"," $hex = '#';"," $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);"," $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT);"," $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT);"," return $hex;","}"])+"("+b+", "+c+", "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.procedures={}; +Blockly.PHP.procedures_defreturn=function(a){for(var b=[],c=0,d;d=a.workspace.variableList[c];c++)-1==a.arguments_.indexOf(d)&&b.push(Blockly.PHP.variableDB_.getName(d,Blockly.Variables.NAME_TYPE));b=b.length?" global "+b.join(", ")+";\n":"";d=Blockly.PHP.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE);var e=Blockly.PHP.statementToCode(a,"STACK");Blockly.PHP.STATEMENT_PREFIX&&(e=Blockly.PHP.prefixLines(Blockly.PHP.STATEMENT_PREFIX.replace(/%1/g,"'"+a.id+"'"),Blockly.PHP.INDENT)+ +e);Blockly.PHP.INFINITE_LOOP_TRAP&&(e=Blockly.PHP.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+a.id+"'")+e);var g=Blockly.PHP.valueToCode(a,"RETURN",Blockly.PHP.ORDER_NONE)||"";g&&(g=" return "+g+";\n");for(var f=[],c=0;c= ")+d+"; "+b;b=Math.abs(parseFloat(e));a=(1==b?a+(f?"++":"--"):a+((f?" += ":" -= ")+b))+(") {\n"+g+"}\n")}else a="",f=c,c.match(/^\w+$/)||Blockly.isNumber(c)||(f=Blockly.PHP.variableDB_.getDistinctName(b+"_start",Blockly.Variables.NAME_TYPE),a+=f+" = "+c+";\n"),c=d,d.match(/^\w+$/)||Blockly.isNumber(d)||(c=Blockly.PHP.variableDB_.getDistinctName(b+"_end",Blockly.Variables.NAME_TYPE),a+=c+" = "+d+";\n"),d=Blockly.PHP.variableDB_.getDistinctName(b+"_inc",Blockly.Variables.NAME_TYPE), +a+=d+" = ",a=Blockly.isNumber(e)?a+(Math.abs(e)+";\n"):a+("abs("+e+");\n"),a=a+("if ("+f+" > "+c+") {\n")+(Blockly.PHP.INDENT+d+" = -"+d+";\n"),a+="}\n",a+="for ("+b+" = "+f+"; "+d+" >= 0 ? "+b+" <= "+c+" : "+b+" >= "+c+"; "+b+" += "+d+") {\n"+g+"}\n";return a}; +Blockly.PHP.controls_forEach=function(a){var b=Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_ASSIGNMENT)||"[]",d=Blockly.PHP.statementToCode(a,"DO"),d=Blockly.PHP.addLoopTrap(d,a.id);return""+("foreach ("+c+" as "+b+") {\n"+d+"}\n")}; +Blockly.PHP.controls_flow_statements=function(a){switch(a.getFieldValue("FLOW")){case "BREAK":return"break;\n";case "CONTINUE":return"continue;\n"}throw"Unknown flow statement.";};Blockly.PHP.logic={};Blockly.PHP.controls_if=function(a){var b=0,c="",d,e;do e=Blockly.PHP.valueToCode(a,"IF"+b,Blockly.PHP.ORDER_NONE)||"false",d=Blockly.PHP.statementToCode(a,"DO"+b),c+=(0",GTE:">="}[a.getFieldValue("OP")],c="=="==b||"!="==b?Blockly.PHP.ORDER_EQUALITY:Blockly.PHP.ORDER_RELATIONAL,d=Blockly.PHP.valueToCode(a,"A",c)||"0";a=Blockly.PHP.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; +Blockly.PHP.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"&&":"||",c="&&"==b?Blockly.PHP.ORDER_LOGICAL_AND:Blockly.PHP.ORDER_LOGICAL_OR,d=Blockly.PHP.valueToCode(a,"A",c);a=Blockly.PHP.valueToCode(a,"B",c);if(d||a){var e="&&"==b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]};Blockly.PHP.logic_negate=function(a){var b=Blockly.PHP.ORDER_LOGICAL_NOT;return["!"+(Blockly.PHP.valueToCode(a,"BOOL",b)||"true"),b]}; +Blockly.PHP.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"true":"false",Blockly.PHP.ORDER_ATOMIC]};Blockly.PHP.logic_null=function(a){return["null",Blockly.PHP.ORDER_ATOMIC]};Blockly.PHP.logic_ternary=function(a){var b=Blockly.PHP.valueToCode(a,"IF",Blockly.PHP.ORDER_CONDITIONAL)||"false",c=Blockly.PHP.valueToCode(a,"THEN",Blockly.PHP.ORDER_CONDITIONAL)||"null";a=Blockly.PHP.valueToCode(a,"ELSE",Blockly.PHP.ORDER_CONDITIONAL)||"null";return[b+" ? "+c+" : "+a,Blockly.PHP.ORDER_CONDITIONAL]}; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/python_compressed.js b/src/opsoro/server/static/js/blockly/python_compressed.js new file mode 100644 index 0000000..d520ce0 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/python_compressed.js @@ -0,0 +1,80 @@ +// Do not edit this file; automatically generated by build.py. +'use strict'; + + +// Copyright 2012 Google Inc. Apache License 2.0 +Blockly.Python=new Blockly.Generator("Python");Blockly.Python.addReservedWords("False,None,True,and,as,assert,break,class,continue,def,del,elif,else,except,exec,finally,for,from,global,if,import,in,is,lambda,nonlocal,not,or,pass,print,raise,return,try,while,with,yield,NotImplemented,Ellipsis,__debug__,quit,exit,copyright,license,credits,ArithmeticError,AssertionError,AttributeError,BaseException,BlockingIOError,BrokenPipeError,BufferError,BytesWarning,ChildProcessError,ConnectionAbortedError,ConnectionError,ConnectionRefusedError,ConnectionResetError,DeprecationWarning,EOFError,Ellipsis,EnvironmentError,Exception,FileExistsError,FileNotFoundError,FloatingPointError,FutureWarning,GeneratorExit,IOError,ImportError,ImportWarning,IndentationError,IndexError,InterruptedError,IsADirectoryError,KeyError,KeyboardInterrupt,LookupError,MemoryError,ModuleNotFoundError,NameError,NotADirectoryError,NotImplemented,NotImplementedError,OSError,OverflowError,PendingDeprecationWarning,PermissionError,ProcessLookupError,RecursionError,ReferenceError,ResourceWarning,RuntimeError,RuntimeWarning,StandardError,StopAsyncIteration,StopIteration,SyntaxError,SyntaxWarning,SystemError,SystemExit,TabError,TimeoutError,TypeError,UnboundLocalError,UnicodeDecodeError,UnicodeEncodeError,UnicodeError,UnicodeTranslateError,UnicodeWarning,UserWarning,ValueError,Warning,ZeroDivisionError,_,__build_class__,__debug__,__doc__,__import__,__loader__,__name__,__package__,__spec__,abs,all,any,apply,ascii,basestring,bin,bool,buffer,bytearray,bytes,callable,chr,classmethod,cmp,coerce,compile,complex,copyright,credits,delattr,dict,dir,divmod,enumerate,eval,exec,execfile,exit,file,filter,float,format,frozenset,getattr,globals,hasattr,hash,help,hex,id,input,int,intern,isinstance,issubclass,iter,len,license,list,locals,long,map,max,memoryview,min,next,object,oct,open,ord,pow,print,property,quit,range,raw_input,reduce,reload,repr,reversed,round,set,setattr,slice,sorted,staticmethod,str,sum,super,tuple,type,unichr,unicode,vars,xrange,zip"); +Blockly.Python.ORDER_ATOMIC=0;Blockly.Python.ORDER_COLLECTION=1;Blockly.Python.ORDER_STRING_CONVERSION=1;Blockly.Python.ORDER_MEMBER=2.1;Blockly.Python.ORDER_FUNCTION_CALL=2.2;Blockly.Python.ORDER_EXPONENTIATION=3;Blockly.Python.ORDER_UNARY_SIGN=4;Blockly.Python.ORDER_BITWISE_NOT=4;Blockly.Python.ORDER_MULTIPLICATIVE=5;Blockly.Python.ORDER_ADDITIVE=6;Blockly.Python.ORDER_BITWISE_SHIFT=7;Blockly.Python.ORDER_BITWISE_AND=8;Blockly.Python.ORDER_BITWISE_XOR=9;Blockly.Python.ORDER_BITWISE_OR=10; +Blockly.Python.ORDER_RELATIONAL=11;Blockly.Python.ORDER_LOGICAL_NOT=12;Blockly.Python.ORDER_LOGICAL_AND=13;Blockly.Python.ORDER_LOGICAL_OR=14;Blockly.Python.ORDER_CONDITIONAL=15;Blockly.Python.ORDER_LAMBDA=16;Blockly.Python.ORDER_NONE=99; +Blockly.Python.ORDER_OVERRIDES=[[Blockly.Python.ORDER_FUNCTION_CALL,Blockly.Python.ORDER_MEMBER],[Blockly.Python.ORDER_FUNCTION_CALL,Blockly.Python.ORDER_FUNCTION_CALL],[Blockly.Python.ORDER_MEMBER,Blockly.Python.ORDER_MEMBER],[Blockly.Python.ORDER_MEMBER,Blockly.Python.ORDER_FUNCTION_CALL],[Blockly.Python.ORDER_LOGICAL_NOT,Blockly.Python.ORDER_LOGICAL_NOT],[Blockly.Python.ORDER_LOGICAL_AND,Blockly.Python.ORDER_LOGICAL_AND],[Blockly.Python.ORDER_LOGICAL_OR,Blockly.Python.ORDER_LOGICAL_OR]]; +Blockly.Python.init=function(a){Blockly.Python.PASS=this.INDENT+"pass\n";Blockly.Python.definitions_=Object.create(null);Blockly.Python.functionNames_=Object.create(null);Blockly.Python.variableDB_?Blockly.Python.variableDB_.reset():Blockly.Python.variableDB_=new Blockly.Names(Blockly.Python.RESERVED_WORDS_);var b=[];a=a.variableList;for(var c=0;cc?"int("+a+" - "+-c+")":"int("+a+")",d&&(a="-"+a));return a};Blockly.Python.lists={};Blockly.Python.lists_create_empty=function(a){return["[]",Blockly.Python.ORDER_ATOMIC]};Blockly.Python.lists_create_with=function(a){for(var b=Array(a.itemCount_),c=0;ca?Blockly.Python.ORDER_UNARY_SIGN:Blockly.Python.ORDER_ATOMIC;return[a,b]}; +Blockly.Python.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.Python.ORDER_ADDITIVE],MINUS:[" - ",Blockly.Python.ORDER_ADDITIVE],MULTIPLY:[" * ",Blockly.Python.ORDER_MULTIPLICATIVE],DIVIDE:[" / ",Blockly.Python.ORDER_MULTIPLICATIVE],POWER:[" ** ",Blockly.Python.ORDER_EXPONENTIATION]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.Python.valueToCode(a,"A",b)||"0";a=Blockly.Python.valueToCode(a,"B",b)||"0";return[d+c+a,b]}; +Blockly.Python.math_single=function(a){var b=a.getFieldValue("OP"),c;if("NEG"==b)return c=Blockly.Python.valueToCode(a,"NUM",Blockly.Python.ORDER_UNARY_SIGN)||"0",["-"+c,Blockly.Python.ORDER_UNARY_SIGN];Blockly.Python.definitions_.import_math="import math";a="SIN"==b||"COS"==b||"TAN"==b?Blockly.Python.valueToCode(a,"NUM",Blockly.Python.ORDER_MULTIPLICATIVE)||"0":Blockly.Python.valueToCode(a,"NUM",Blockly.Python.ORDER_NONE)||"0";switch(b){case "ABS":c="math.fabs("+a+")";break;case "ROOT":c="math.sqrt("+ +a+")";break;case "LN":c="math.log("+a+")";break;case "LOG10":c="math.log10("+a+")";break;case "EXP":c="math.exp("+a+")";break;case "POW10":c="math.pow(10,"+a+")";break;case "ROUND":c="round("+a+")";break;case "ROUNDUP":c="math.ceil("+a+")";break;case "ROUNDDOWN":c="math.floor("+a+")";break;case "SIN":c="math.sin("+a+" / 180.0 * math.pi)";break;case "COS":c="math.cos("+a+" / 180.0 * math.pi)";break;case "TAN":c="math.tan("+a+" / 180.0 * math.pi)"}if(c)return[c,Blockly.Python.ORDER_FUNCTION_CALL];switch(b){case "ASIN":c= +"math.asin("+a+") / math.pi * 180";break;case "ACOS":c="math.acos("+a+") / math.pi * 180";break;case "ATAN":c="math.atan("+a+") / math.pi * 180";break;default:throw"Unknown math operator: "+b;}return[c,Blockly.Python.ORDER_MULTIPLICATIVE]}; +Blockly.Python.math_constant=function(a){var b={PI:["math.pi",Blockly.Python.ORDER_MEMBER],E:["math.e",Blockly.Python.ORDER_MEMBER],GOLDEN_RATIO:["(1 + math.sqrt(5)) / 2",Blockly.Python.ORDER_MULTIPLICATIVE],SQRT2:["math.sqrt(2)",Blockly.Python.ORDER_MEMBER],SQRT1_2:["math.sqrt(1.0 / 2)",Blockly.Python.ORDER_MEMBER],INFINITY:["float('inf')",Blockly.Python.ORDER_ATOMIC]};a=a.getFieldValue("CONSTANT");"INFINITY"!=a&&(Blockly.Python.definitions_.import_math="import math");return b[a]}; +Blockly.Python.math_number_property=function(a){var b=Blockly.Python.valueToCode(a,"NUMBER_TO_CHECK",Blockly.Python.ORDER_MULTIPLICATIVE)||"0",c=a.getFieldValue("PROPERTY"),d;if("PRIME"==c)return Blockly.Python.definitions_.import_math="import math",Blockly.Python.definitions_.from_numbers_import_Number="from numbers import Number",[Blockly.Python.provideFunction_("math_isPrime",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(n):"," # https://en.wikipedia.org/wiki/Primality_test#Naive_methods", +" # If n is not a number but a string, try parsing it."," if not isinstance(n, Number):"," try:"," n = float(n)"," except:"," return False"," if n == 2 or n == 3:"," return True"," # False if n is negative, is 1, or not whole, or if n is divisible by 2 or 3."," if n <= 1 or n % 1 != 0 or n % 2 == 0 or n % 3 == 0:"," return False"," # Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for x in range(6, int(math.sqrt(n)) + 2, 6):"," if n % (x - 1) == 0 or n % (x + 1) == 0:", +" return False"," return True"])+"("+b+")",Blockly.Python.ORDER_FUNCTION_CALL];switch(c){case "EVEN":d=b+" % 2 == 0";break;case "ODD":d=b+" % 2 == 1";break;case "WHOLE":d=b+" % 1 == 0";break;case "POSITIVE":d=b+" > 0";break;case "NEGATIVE":d=b+" < 0";break;case "DIVISIBLE_BY":a=Blockly.Python.valueToCode(a,"DIVISOR",Blockly.Python.ORDER_MULTIPLICATIVE);if(!a||"0"==a)return["False",Blockly.Python.ORDER_ATOMIC];d=b+" % "+a+" == 0"}return[d,Blockly.Python.ORDER_RELATIONAL]}; +Blockly.Python.math_change=function(a){Blockly.Python.definitions_.from_numbers_import_Number="from numbers import Number";var b=Blockly.Python.valueToCode(a,"DELTA",Blockly.Python.ORDER_ADDITIVE)||"0";a=Blockly.Python.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);return a+" = ("+a+" if isinstance("+a+", Number) else 0) + "+b+"\n"};Blockly.Python.math_round=Blockly.Python.math_single;Blockly.Python.math_trig=Blockly.Python.math_single; +Blockly.Python.math_on_list=function(a){var b=a.getFieldValue("OP");a=Blockly.Python.valueToCode(a,"LIST",Blockly.Python.ORDER_NONE)||"[]";switch(b){case "SUM":b="sum("+a+")";break;case "MIN":b="min("+a+")";break;case "MAX":b="max("+a+")";break;case "AVERAGE":Blockly.Python.definitions_.from_numbers_import_Number="from numbers import Number";b=Blockly.Python.provideFunction_("math_mean",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(myList):"," localList = [e for e in myList if isinstance(e, Number)]", +" if not localList: return"," return float(sum(localList)) / len(localList)"]);b=b+"("+a+")";break;case "MEDIAN":Blockly.Python.definitions_.from_numbers_import_Number="from numbers import Number";b=Blockly.Python.provideFunction_("math_median",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(myList):"," localList = sorted([e for e in myList if isinstance(e, Number)])"," if not localList: return"," if len(localList) % 2 == 0:"," return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0", +" else:"," return localList[(len(localList) - 1) // 2]"]);b=b+"("+a+")";break;case "MODE":b=Blockly.Python.provideFunction_("math_modes",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(some_list):"," modes = []"," # Using a lists of [item, count] to keep count rather than dict",' # to avoid "unhashable" errors when the counted item is itself a list or dict.'," counts = []"," maxCount = 1"," for item in some_list:"," found = False"," for count in counts:"," if count[0] == item:", +" count[1] += 1"," maxCount = max(maxCount, count[1])"," found = True"," if not found:"," counts.append([item, 1])"," for counted_item, item_count in counts:"," if item_count == maxCount:"," modes.append(counted_item)"," return modes"]);b=b+"("+a+")";break;case "STD_DEV":Blockly.Python.definitions_.import_math="import math";b=Blockly.Python.provideFunction_("math_standard_deviation",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(numbers):"," n = len(numbers)", +" if n == 0: return"," mean = float(sum(numbers)) / n"," variance = sum((x - mean) ** 2 for x in numbers) / n"," return math.sqrt(variance)"]);b=b+"("+a+")";break;case "RANDOM":Blockly.Python.definitions_.import_random="import random";b="random.choice("+a+")";break;default:throw"Unknown operator: "+b;}return[b,Blockly.Python.ORDER_FUNCTION_CALL]}; +Blockly.Python.math_modulo=function(a){var b=Blockly.Python.valueToCode(a,"DIVIDEND",Blockly.Python.ORDER_MULTIPLICATIVE)||"0";a=Blockly.Python.valueToCode(a,"DIVISOR",Blockly.Python.ORDER_MULTIPLICATIVE)||"0";return[b+" % "+a,Blockly.Python.ORDER_MULTIPLICATIVE]}; +Blockly.Python.math_constrain=function(a){var b=Blockly.Python.valueToCode(a,"VALUE",Blockly.Python.ORDER_NONE)||"0",c=Blockly.Python.valueToCode(a,"LOW",Blockly.Python.ORDER_NONE)||"0";a=Blockly.Python.valueToCode(a,"HIGH",Blockly.Python.ORDER_NONE)||"float('inf')";return["min(max("+b+", "+c+"), "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]}; +Blockly.Python.math_random_int=function(a){Blockly.Python.definitions_.import_random="import random";var b=Blockly.Python.valueToCode(a,"FROM",Blockly.Python.ORDER_NONE)||"0";a=Blockly.Python.valueToCode(a,"TO",Blockly.Python.ORDER_NONE)||"0";return["random.randint("+b+", "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]};Blockly.Python.math_random_float=function(a){Blockly.Python.definitions_.import_random="import random";return["random.random()",Blockly.Python.ORDER_FUNCTION_CALL]};Blockly.Python.variables={};Blockly.Python.variables_get=function(a){return[Blockly.Python.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),Blockly.Python.ORDER_ATOMIC]};Blockly.Python.variables_set=function(a){var b=Blockly.Python.valueToCode(a,"VALUE",Blockly.Python.ORDER_NONE)||"0";return Blockly.Python.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE)+" = "+b+"\n"};Blockly.Python.colour={};Blockly.Python.colour_picker=function(a){return["'"+a.getFieldValue("COLOUR")+"'",Blockly.Python.ORDER_ATOMIC]};Blockly.Python.colour_random=function(a){Blockly.Python.definitions_.import_random="import random";return["'#%06x' % random.randint(0, 2**24 - 1)",Blockly.Python.ORDER_FUNCTION_CALL]}; +Blockly.Python.colour_rgb=function(a){var b=Blockly.Python.provideFunction_("colour_rgb",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(r, g, b):"," r = round(min(100, max(0, r)) * 2.55)"," g = round(min(100, max(0, g)) * 2.55)"," b = round(min(100, max(0, b)) * 2.55)"," return '#%02x%02x%02x' % (r, g, b)"]),c=Blockly.Python.valueToCode(a,"RED",Blockly.Python.ORDER_NONE)||0,d=Blockly.Python.valueToCode(a,"GREEN",Blockly.Python.ORDER_NONE)||0;a=Blockly.Python.valueToCode(a,"BLUE",Blockly.Python.ORDER_NONE)|| +0;return[b+"("+c+", "+d+", "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]}; +Blockly.Python.colour_blend=function(a){var b=Blockly.Python.provideFunction_("colour_blend",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(colour1, colour2, ratio):"," r1, r2 = int(colour1[1:3], 16), int(colour2[1:3], 16)"," g1, g2 = int(colour1[3:5], 16), int(colour2[3:5], 16)"," b1, b2 = int(colour1[5:7], 16), int(colour2[5:7], 16)"," ratio = min(1, max(0, ratio))"," r = round(r1 * (1 - ratio) + r2 * ratio)"," g = round(g1 * (1 - ratio) + g2 * ratio)"," b = round(b1 * (1 - ratio) + b2 * ratio)", +" return '#%02x%02x%02x' % (r, g, b)"]),c=Blockly.Python.valueToCode(a,"COLOUR1",Blockly.Python.ORDER_NONE)||"'#000000'",d=Blockly.Python.valueToCode(a,"COLOUR2",Blockly.Python.ORDER_NONE)||"'#000000'";a=Blockly.Python.valueToCode(a,"RATIO",Blockly.Python.ORDER_NONE)||0;return[b+"("+c+", "+d+", "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]};Blockly.Python.procedures={}; +Blockly.Python.procedures_defreturn=function(a){for(var b=[],c=0,d;d=a.workspace.variableList[c];c++)-1==a.arguments_.indexOf(d)&&b.push(Blockly.Python.variableDB_.getName(d,Blockly.Variables.NAME_TYPE));b=b.length?" global "+b.join(", ")+"\n":"";d=Blockly.Python.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE);var e=Blockly.Python.statementToCode(a,"STACK");Blockly.Python.STATEMENT_PREFIX&&(e=Blockly.Python.prefixLines(Blockly.Python.STATEMENT_PREFIX.replace(/%1/g,"'"+a.id+ +"'"),Blockly.Python.INDENT)+e);Blockly.Python.INFINITE_LOOP_TRAP&&(e=Blockly.Python.INFINITE_LOOP_TRAP.replace(/%1/g,'"'+a.id+'"')+e);var f=Blockly.Python.valueToCode(a,"RETURN",Blockly.Python.ORDER_NONE)||"";f?f=" return "+f+"\n":e||(e=Blockly.Python.PASS);for(var g=[],c=0;c= stop:"," yield start"," start -= abs(step)"])};a=function(a,b,c){return"("+a+" <= "+b+") and "+h()+"("+a+", "+b+", "+c+") or "+k()+"("+a+", "+b+", "+c+")"};if(Blockly.isNumber(c)&&Blockly.isNumber(d)&& +Blockly.isNumber(e))c=parseFloat(c),d=parseFloat(d),e=Math.abs(parseFloat(e)),0===c%1&&0===d%1&&0===e%1?(c<=d?(d++,a=0==c&&1==e?d:c+", "+d,1!=e&&(a+=", "+e)):(d--,a=c+", "+d+", -"+e),a="range("+a+")"):(a=c",GTE:">="}[a.getFieldValue("OP")],c=Blockly.Python.ORDER_RELATIONAL,d=Blockly.Python.valueToCode(a,"A",c)||"0";a=Blockly.Python.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; +Blockly.Python.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"and":"or",c="and"==b?Blockly.Python.ORDER_LOGICAL_AND:Blockly.Python.ORDER_LOGICAL_OR,d=Blockly.Python.valueToCode(a,"A",c);a=Blockly.Python.valueToCode(a,"B",c);if(d||a){var e="and"==b?"True":"False";d||(d=e);a||(a=e)}else a=d="False";return[d+" "+b+" "+a,c]};Blockly.Python.logic_negate=function(a){return["not "+(Blockly.Python.valueToCode(a,"BOOL",Blockly.Python.ORDER_LOGICAL_NOT)||"True"),Blockly.Python.ORDER_LOGICAL_NOT]}; +Blockly.Python.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"True":"False",Blockly.Python.ORDER_ATOMIC]};Blockly.Python.logic_null=function(a){return["None",Blockly.Python.ORDER_ATOMIC]}; +Blockly.Python.logic_ternary=function(a){var b=Blockly.Python.valueToCode(a,"IF",Blockly.Python.ORDER_CONDITIONAL)||"False",c=Blockly.Python.valueToCode(a,"THEN",Blockly.Python.ORDER_CONDITIONAL)||"None";a=Blockly.Python.valueToCode(a,"ELSE",Blockly.Python.ORDER_CONDITIONAL)||"None";return[c+" if "+b+" else "+a,Blockly.Python.ORDER_CONDITIONAL]}; \ No newline at end of file diff --git a/src/opsoro/server/static/js/blockly/scripts/get_chromedriver.sh b/src/opsoro/server/static/js/blockly/scripts/get_chromedriver.sh new file mode 100644 index 0000000..ab24d9b --- /dev/null +++ b/src/opsoro/server/static/js/blockly/scripts/get_chromedriver.sh @@ -0,0 +1,12 @@ +#!/bin/bash +os_name=`uname` +chromedriver_dir="chromedriver" +if [ ! -d $chromedriver_dir ]; then + mkdir $chromedriver_dir +fi + +if [[ $os_name == 'Linux' ]]; then + cd chromedriver && curl -L https://chromedriver.storage.googleapis.com/2.29/chromedriver_linux64.zip > tmp.zip && unzip -o tmp.zip && rm tmp.zip +elif [[ $os_name == 'Darwin' ]]; then + cd chromedriver && curl -L https://chromedriver.storage.googleapis.com/2.29/chromedriver_mac64.zip | tar xz +fi diff --git a/src/opsoro/server/static/js/blockly/scripts/get_geckdriver.sh b/src/opsoro/server/static/js/blockly/scripts/get_geckdriver.sh new file mode 100644 index 0000000..4cc3b8f --- /dev/null +++ b/src/opsoro/server/static/js/blockly/scripts/get_geckdriver.sh @@ -0,0 +1,7 @@ +#!/bin/bash +os_name=`uname` +if [[ $os_name == 'Linux' ]]; then + cd ../ && curl -L https://github.com/mozilla/geckodriver/releases/download/v0.11.1/geckodriver-v0.11.1-linux64.tar.gz | tar xz +elif [[ $os_name == 'Darwin' ]]; then + cd ../ && curl -L https://github.com/mozilla/geckodriver/releases/download/v0.11.1/geckodriver-v0.11.1-macos.tar.gz | tar xz +fi diff --git a/src/opsoro/server/static/js/blockly/scripts/get_selenium.sh b/src/opsoro/server/static/js/blockly/scripts/get_selenium.sh new file mode 100644 index 0000000..34a416b --- /dev/null +++ b/src/opsoro/server/static/js/blockly/scripts/get_selenium.sh @@ -0,0 +1,14 @@ +#!/bin/bash +DIR="../webdriverio-test" +FILE=selenium-server-standalone-3.0.1.jar + +if [ ! -d $DIR ]; then + mkdir $DIR +fi + +if [ ! -f $DIR/$FILE ]; then + cd $DIR && curl -O http://selenium-release.storage.googleapis.com/3.0/selenium-server-standalone-3.0.1.jar +fi + + + diff --git a/src/opsoro/server/static/js/blockly/scripts/selenium_connect.sh b/src/opsoro/server/static/js/blockly/scripts/selenium_connect.sh new file mode 100644 index 0000000..3fae905 --- /dev/null +++ b/src/opsoro/server/static/js/blockly/scripts/selenium_connect.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +#check if selenium server is up running +pid=`lsof -ti tcp:4444` +if [ $? -eq 0 ] +then + kill -9 $pid +fi +java -jar -Dwebdriver.gecko.driver=../geckodriver -Dwebdriver.chrome.driver="chromedriver/chromedriver" ../webdriverio-test/selenium-server-standalone-3.0.1.jar & + diff --git a/src/opsoro/server/static/js/foundation.min.js b/src/opsoro/server/static/js/foundation.min.js deleted file mode 100644 index a5f7bd2..0000000 --- a/src/opsoro/server/static/js/foundation.min.js +++ /dev/null @@ -1,5960 +0,0 @@ -/* - * Foundation Responsive Library - * http://foundation.zurb.com - * Copyright 2014, ZURB - * Free to use under the MIT license. - * http://www.opensource.org/licenses/mit-license.php -*/ - -(function ($, window, document, undefined) { - 'use strict'; - - var header_helpers = function (class_array) { - var i = class_array.length; - var head = $('head'); - - while (i--) { - if(head.has('.' + class_array[i]).length === 0) { - head.append(''); - } - } - }; - - header_helpers([ - 'foundation-mq-small', - 'foundation-mq-small-only', - 'foundation-mq-medium', - 'foundation-mq-medium-only', - 'foundation-mq-large', - 'foundation-mq-large-only', - 'foundation-mq-xlarge', - 'foundation-mq-xlarge-only', - 'foundation-mq-xxlarge', - 'foundation-data-attribute-namespace']); - - // Enable FastClick if present - - $(function() { - if (typeof FastClick !== 'undefined') { - // Don't attach to body if undefined - if (typeof document.body !== 'undefined') { - FastClick.attach(document.body); - } - } - }); - - // private Fast Selector wrapper, - // returns jQuery object. Only use where - // getElementById is not available. - var S = function (selector, context) { - if (typeof selector === 'string') { - if (context) { - var cont; - if (context.jquery) { - cont = context[0]; - if (!cont) return context; - } else { - cont = context; - } - return $(cont.querySelectorAll(selector)); - } - - return $(document.querySelectorAll(selector)); - } - - return $(selector, context); - }; - - // Namespace functions. - - var attr_name = function (init) { - var arr = []; - if (!init) arr.push('data'); - if (this.namespace.length > 0) arr.push(this.namespace); - arr.push(this.name); - - return arr.join('-'); - }; - - var add_namespace = function (str) { - var parts = str.split('-'), - i = parts.length, - arr = []; - - while (i--) { - if (i !== 0) { - arr.push(parts[i]); - } else { - if (this.namespace.length > 0) { - arr.push(this.namespace, parts[i]); - } else { - arr.push(parts[i]); - } - } - } - - return arr.reverse().join('-'); - }; - - // Event binding and data-options updating. - - var bindings = function (method, options) { - var self = this, - should_bind_events = !S(this).data(this.attr_name(true)); - - if (S(this.scope).is('[' + this.attr_name() +']')) { - S(this.scope).data(this.attr_name(true) + '-init', $.extend({}, this.settings, (options || method), this.data_options(S(this.scope)))); - - if (should_bind_events) { - this.events(this.scope); - } - - } else { - S('[' + this.attr_name() +']', this.scope).each(function () { - var should_bind_events = !S(this).data(self.attr_name(true) + '-init'); - S(this).data(self.attr_name(true) + '-init', $.extend({}, self.settings, (options || method), self.data_options(S(this)))); - - if (should_bind_events) { - self.events(this); - } - }); - } - // # Patch to fix #5043 to move this *after* the if/else clause in order for Backbone and similar frameworks to have improved control over event binding and data-options updating. - if (typeof method === 'string') { - return this[method].call(this, options); - } - - }; - - var single_image_loaded = function (image, callback) { - function loaded () { - callback(image[0]); - } - - function bindLoad () { - this.one('load', loaded); - - if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { - var src = this.attr( 'src' ), - param = src.match( /\?/ ) ? '&' : '?'; - - param += 'random=' + (new Date()).getTime(); - this.attr('src', src + param); - } - } - - if (!image.attr('src')) { - loaded(); - return; - } - - if (image[0].complete || image[0].readyState === 4) { - loaded(); - } else { - bindLoad.call(image); - } - }; - - /* - https://github.com/paulirish/matchMedia.js - */ - - window.matchMedia = window.matchMedia || (function( doc ) { - - 'use strict'; - - var bool, - docElem = doc.documentElement, - refNode = docElem.firstElementChild || docElem.firstChild, - // fakeBody required for - fakeBody = doc.createElement( 'body' ), - div = doc.createElement( 'div' ); - - div.id = 'mq-test-1'; - div.style.cssText = 'position:absolute;top:-100em'; - fakeBody.style.background = 'none'; - fakeBody.appendChild(div); - - return function (q) { - - div.innerHTML = '­'; - - docElem.insertBefore( fakeBody, refNode ); - bool = div.offsetWidth === 42; - docElem.removeChild( fakeBody ); - - return { - matches: bool, - media: q - }; - - }; - - }( document )); - - /* - * jquery.requestAnimationFrame - * https://github.com/gnarf37/jquery-requestAnimationFrame - * Requires jQuery 1.8+ - * - * Copyright (c) 2012 Corey Frang - * Licensed under the MIT license. - */ - - (function($) { - - // requestAnimationFrame polyfill adapted from Erik Möller - // fixes from Paul Irish and Tino Zijdel - // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ - // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating - - var animating, - lastTime = 0, - vendors = ['webkit', 'moz'], - requestAnimationFrame = window.requestAnimationFrame, - cancelAnimationFrame = window.cancelAnimationFrame, - jqueryFxAvailable = 'undefined' !== typeof jQuery.fx; - - for (; lastTime < vendors.length && !requestAnimationFrame; lastTime++) { - requestAnimationFrame = window[ vendors[lastTime] + 'RequestAnimationFrame' ]; - cancelAnimationFrame = cancelAnimationFrame || - window[ vendors[lastTime] + 'CancelAnimationFrame' ] || - window[ vendors[lastTime] + 'CancelRequestAnimationFrame' ]; - } - - function raf() { - if (animating) { - requestAnimationFrame(raf); - - if (jqueryFxAvailable) { - jQuery.fx.tick(); - } - } - } - - if (requestAnimationFrame) { - // use rAF - window.requestAnimationFrame = requestAnimationFrame; - window.cancelAnimationFrame = cancelAnimationFrame; - - if (jqueryFxAvailable) { - jQuery.fx.timer = function (timer) { - if (timer() && jQuery.timers.push(timer) && !animating) { - animating = true; - raf(); - } - }; - - jQuery.fx.stop = function () { - animating = false; - }; - } - } else { - // polyfill - window.requestAnimationFrame = function (callback) { - var currTime = new Date().getTime(), - timeToCall = Math.max(0, 16 - (currTime - lastTime)), - id = window.setTimeout(function () { - callback(currTime + timeToCall); - }, timeToCall); - lastTime = currTime + timeToCall; - return id; - }; - - window.cancelAnimationFrame = function (id) { - clearTimeout(id); - }; - - } - - }( jQuery )); - - - function removeQuotes (string) { - if (typeof string === 'string' || string instanceof String) { - string = string.replace(/^['\\/"]+|(;\s?})+|['\\/"]+$/g, ''); - } - - return string; - } - - window.Foundation = { - name : 'Foundation', - - version : '5.5.0', - - media_queries : { - 'small' : S('.foundation-mq-small').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'small-only' : S('.foundation-mq-small-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'medium' : S('.foundation-mq-medium').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'medium-only' : S('.foundation-mq-medium-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'large' : S('.foundation-mq-large').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'large-only' : S('.foundation-mq-large-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'xlarge' : S('.foundation-mq-xlarge').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'xlarge-only' : S('.foundation-mq-xlarge-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'xxlarge' : S('.foundation-mq-xxlarge').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, '') - }, - - stylesheet : $('').appendTo('head')[0].sheet, - - global: { - namespace: undefined - }, - - init : function (scope, libraries, method, options, response) { - var args = [scope, method, options, response], - responses = []; - - // check RTL - this.rtl = /rtl/i.test(S('html').attr('dir')); - - // set foundation global scope - this.scope = scope || this.scope; - - this.set_namespace(); - - if (libraries && typeof libraries === 'string' && !/reflow/i.test(libraries)) { - if (this.libs.hasOwnProperty(libraries)) { - responses.push(this.init_lib(libraries, args)); - } - } else { - for (var lib in this.libs) { - responses.push(this.init_lib(lib, libraries)); - } - } - - S(window).load(function(){ - S(window) - .trigger('resize.fndtn.clearing') - .trigger('resize.fndtn.dropdown') - .trigger('resize.fndtn.equalizer') - .trigger('resize.fndtn.interchange') - .trigger('resize.fndtn.joyride') - .trigger('resize.fndtn.magellan') - .trigger('resize.fndtn.topbar') - .trigger('resize.fndtn.slider'); - }); - - return scope; - }, - - init_lib : function (lib, args) { - if (this.libs.hasOwnProperty(lib)) { - this.patch(this.libs[lib]); - - if (args && args.hasOwnProperty(lib)) { - if (typeof this.libs[lib].settings !== 'undefined') { - $.extend(true, this.libs[lib].settings, args[lib]); - } - else if (typeof this.libs[lib].defaults !== 'undefined') { - $.extend(true, this.libs[lib].defaults, args[lib]); - } - return this.libs[lib].init.apply(this.libs[lib], [this.scope, args[lib]]); - } - - args = args instanceof Array ? args : new Array(args); - return this.libs[lib].init.apply(this.libs[lib], args); - } - - return function () {}; - }, - - patch : function (lib) { - lib.scope = this.scope; - lib.namespace = this.global.namespace; - lib.rtl = this.rtl; - lib['data_options'] = this.utils.data_options; - lib['attr_name'] = attr_name; - lib['add_namespace'] = add_namespace; - lib['bindings'] = bindings; - lib['S'] = this.utils.S; - }, - - inherit : function (scope, methods) { - var methods_arr = methods.split(' '), - i = methods_arr.length; - - while (i--) { - if (this.utils.hasOwnProperty(methods_arr[i])) { - scope[methods_arr[i]] = this.utils[methods_arr[i]]; - } - } - }, - - set_namespace: function () { - - // Description: - // Don't bother reading the namespace out of the meta tag - // if the namespace has been set globally in javascript - // - // Example: - // Foundation.global.namespace = 'my-namespace'; - // or make it an empty string: - // Foundation.global.namespace = ''; - // - // - - // If the namespace has not been set (is undefined), try to read it out of the meta element. - // Otherwise use the globally defined namespace, even if it's empty ('') - var namespace = ( this.global.namespace === undefined ) ? $('.foundation-data-attribute-namespace').css('font-family') : this.global.namespace; - - // Finally, if the namsepace is either undefined or false, set it to an empty string. - // Otherwise use the namespace value. - this.global.namespace = ( namespace === undefined || /false/i.test(namespace) ) ? '' : namespace; - }, - - libs : {}, - - // methods that can be inherited in libraries - utils : { - - // Description: - // Fast Selector wrapper returns jQuery object. Only use where getElementById - // is not available. - // - // Arguments: - // Selector (String): CSS selector describing the element(s) to be - // returned as a jQuery object. - // - // Scope (String): CSS selector describing the area to be searched. Default - // is document. - // - // Returns: - // Element (jQuery Object): jQuery object containing elements matching the - // selector within the scope. - S : S, - - // Description: - // Executes a function a max of once every n milliseconds - // - // Arguments: - // Func (Function): Function to be throttled. - // - // Delay (Integer): Function execution threshold in milliseconds. - // - // Returns: - // Lazy_function (Function): Function with throttling applied. - throttle : function (func, delay) { - var timer = null; - - return function () { - var context = this, args = arguments; - - if (timer == null) { - timer = setTimeout(function () { - func.apply(context, args); - timer = null; - }, delay); - } - }; - }, - - // Description: - // Executes a function when it stops being invoked for n seconds - // Modified version of _.debounce() http://underscorejs.org - // - // Arguments: - // Func (Function): Function to be debounced. - // - // Delay (Integer): Function execution threshold in milliseconds. - // - // Immediate (Bool): Whether the function should be called at the beginning - // of the delay instead of the end. Default is false. - // - // Returns: - // Lazy_function (Function): Function with debouncing applied. - debounce : function (func, delay, immediate) { - var timeout, result; - return function () { - var context = this, args = arguments; - var later = function () { - timeout = null; - if (!immediate) result = func.apply(context, args); - }; - var callNow = immediate && !timeout; - clearTimeout(timeout); - timeout = setTimeout(later, delay); - if (callNow) result = func.apply(context, args); - return result; - }; - }, - - // Description: - // Parses data-options attribute - // - // Arguments: - // El (jQuery Object): Element to be parsed. - // - // Returns: - // Options (Javascript Object): Contents of the element's data-options - // attribute. - data_options : function (el, data_attr_name) { - data_attr_name = data_attr_name || 'options'; - var opts = {}, ii, p, opts_arr, - data_options = function (el) { - var namespace = Foundation.global.namespace; - - if (namespace.length > 0) { - return el.data(namespace + '-' + data_attr_name); - } - - return el.data(data_attr_name); - }; - - var cached_options = data_options(el); - - if (typeof cached_options === 'object') { - return cached_options; - } - - opts_arr = (cached_options || ':').split(';'); - ii = opts_arr.length; - - function isNumber (o) { - return ! isNaN (o-0) && o !== null && o !== '' && o !== false && o !== true; - } - - function trim (str) { - if (typeof str === 'string') return $.trim(str); - return str; - } - - while (ii--) { - p = opts_arr[ii].split(':'); - p = [p[0], p.slice(1).join(':')]; - - if (/true/i.test(p[1])) p[1] = true; - if (/false/i.test(p[1])) p[1] = false; - if (isNumber(p[1])) { - if (p[1].indexOf('.') === -1) { - p[1] = parseInt(p[1], 10); - } else { - p[1] = parseFloat(p[1]); - } - } - - if (p.length === 2 && p[0].length > 0) { - opts[trim(p[0])] = trim(p[1]); - } - } - - return opts; - }, - - // Description: - // Adds JS-recognizable media queries - // - // Arguments: - // Media (String): Key string for the media query to be stored as in - // Foundation.media_queries - // - // Class (String): Class name for the generated tag - register_media : function (media, media_class) { - if(Foundation.media_queries[media] === undefined) { - $('head').append(''); - Foundation.media_queries[media] = removeQuotes($('.' + media_class).css('font-family')); - } - }, - - // Description: - // Add custom CSS within a JS-defined media query - // - // Arguments: - // Rule (String): CSS rule to be appended to the document. - // - // Media (String): Optional media query string for the CSS rule to be - // nested under. - add_custom_rule : function (rule, media) { - if (media === undefined && Foundation.stylesheet) { - Foundation.stylesheet.insertRule(rule, Foundation.stylesheet.cssRules.length); - } else { - var query = Foundation.media_queries[media]; - - if (query !== undefined) { - Foundation.stylesheet.insertRule('@media ' + - Foundation.media_queries[media] + '{ ' + rule + ' }'); - } - } - }, - - // Description: - // Performs a callback function when an image is fully loaded - // - // Arguments: - // Image (jQuery Object): Image(s) to check if loaded. - // - // Callback (Function): Function to execute when image is fully loaded. - image_loaded : function (images, callback) { - var self = this, - unloaded = images.length; - - if (unloaded === 0) { - callback(images); - } - - images.each(function () { - single_image_loaded(self.S(this), function () { - unloaded -= 1; - if (unloaded === 0) { - callback(images); - } - }); - }); - }, - - // Description: - // Returns a random, alphanumeric string - // - // Arguments: - // Length (Integer): Length of string to be generated. Defaults to random - // integer. - // - // Returns: - // Rand (String): Pseudo-random, alphanumeric string. - random_str : function () { - if (!this.fidx) this.fidx = 0; - this.prefix = this.prefix || [(this.name || 'F'), (+new Date).toString(36)].join('-'); - - return this.prefix + (this.fidx++).toString(36); - }, - - // Description: - // Helper for window.matchMedia - // - // Arguments: - // mq (String): Media query - // - // Returns: - // (Boolean): Whether the media query passes or not - match : function (mq) { - return window.matchMedia(mq).matches; - }, - - // Description: - // Helpers for checking Foundation default media queries with JS - // - // Returns: - // (Boolean): Whether the media query passes or not - - is_small_up : function () { - return this.match(Foundation.media_queries.small); - }, - - is_medium_up : function () { - return this.match(Foundation.media_queries.medium); - }, - - is_large_up : function () { - return this.match(Foundation.media_queries.large); - }, - - is_xlarge_up : function () { - return this.match(Foundation.media_queries.xlarge); - }, - - is_xxlarge_up : function () { - return this.match(Foundation.media_queries.xxlarge); - }, - - is_small_only : function () { - return !this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); - }, - - is_medium_only : function () { - return this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); - }, - - is_large_only : function () { - return this.is_medium_up() && this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); - }, - - is_xlarge_only : function () { - return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && !this.is_xxlarge_up(); - }, - - is_xxlarge_only : function () { - return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && this.is_xxlarge_up(); - } - } - }; - - $.fn.foundation = function () { - var args = Array.prototype.slice.call(arguments, 0); - - return this.each(function () { - Foundation.init.apply(Foundation, [this].concat(args)); - return this; - }); - }; - -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.slider = { - name : 'slider', - - version : '5.5.0', - - settings: { - start: 0, - end: 100, - step: 1, - precision: null, - initial: null, - display_selector: '', - vertical: false, - trigger_input_change: false, - on_change: function(){} - }, - - cache : {}, - - init : function (scope, method, options) { - Foundation.inherit(this,'throttle'); - this.bindings(method, options); - this.reflow(); - }, - - events : function() { - var self = this; - - $(this.scope) - .off('.slider') - .on('mousedown.fndtn.slider touchstart.fndtn.slider pointerdown.fndtn.slider', - '[' + self.attr_name() + ']:not(.disabled, [disabled]) .range-slider-handle', function(e) { - if (!self.cache.active) { - e.preventDefault(); - self.set_active_slider($(e.target)); - } - }) - .on('mousemove.fndtn.slider touchmove.fndtn.slider pointermove.fndtn.slider', function(e) { - if (!!self.cache.active) { - e.preventDefault(); - if ($.data(self.cache.active[0], 'settings').vertical) { - var scroll_offset = 0; - if (!e.pageY) { - scroll_offset = window.scrollY; - } - self.calculate_position(self.cache.active, self.get_cursor_position(e, 'y') + scroll_offset); - } else { - self.calculate_position(self.cache.active, self.get_cursor_position(e, 'x')); - } - } - }) - .on('mouseup.fndtn.slider touchend.fndtn.slider pointerup.fndtn.slider', function(e) { - self.remove_active_slider(); - }) - .on('change.fndtn.slider', function(e) { - self.settings.on_change(); - }); - - self.S(window) - .on('resize.fndtn.slider', self.throttle(function(e) { - self.reflow(); - }, 300)); - }, - - get_cursor_position : function(e, xy) { - var pageXY = 'page' + xy.toUpperCase(), - clientXY = 'client' + xy.toUpperCase(), - position; - - if (typeof e[pageXY] !== 'undefined') { - position = e[pageXY]; - } - else if (typeof e.originalEvent[clientXY] !== 'undefined') { - position = e.originalEvent[clientXY]; - } - else if (e.originalEvent.touches && e.originalEvent.touches[0] && typeof e.originalEvent.touches[0][clientXY] !== 'undefined') { - position = e.originalEvent.touches[0][clientXY]; - } - else if(e.currentPoint && typeof e.currentPoint[xy] !== 'undefined') { - position = e.currentPoint[xy]; - } - return position; - }, - - set_active_slider : function($handle) { - this.cache.active = $handle; - }, - - remove_active_slider : function() { - this.cache.active = null; - }, - - calculate_position : function($handle, cursor_x) { - var self = this, - settings = $.data($handle[0], 'settings'), - handle_l = $.data($handle[0], 'handle_l'), - handle_o = $.data($handle[0], 'handle_o'), - bar_l = $.data($handle[0], 'bar_l'), - bar_o = $.data($handle[0], 'bar_o'); - - requestAnimationFrame(function(){ - var pct; - - if (Foundation.rtl && !settings.vertical) { - pct = self.limit_to(((bar_o+bar_l-cursor_x)/bar_l),0,1); - } else { - pct = self.limit_to(((cursor_x-bar_o)/bar_l),0,1); - } - - pct = settings.vertical ? 1-pct : pct; - - var norm = self.normalized_value(pct, settings.start, settings.end, settings.step, settings.precision); - - self.set_ui($handle, norm); - }); - }, - - set_ui : function($handle, value) { - var settings = $.data($handle[0], 'settings'), - handle_l = $.data($handle[0], 'handle_l'), - bar_l = $.data($handle[0], 'bar_l'), - norm_pct = this.normalized_percentage(value, settings.start, settings.end), - handle_offset = norm_pct*(bar_l-handle_l)-1, - progress_bar_length = norm_pct*100, - $handle_parent = $handle.parent(), - $hidden_inputs = $handle.parent().children('input[type=hidden]'); - - if (Foundation.rtl && !settings.vertical) { - handle_offset = -handle_offset; - } - - handle_offset = settings.vertical ? -handle_offset + bar_l - handle_l + 1 : handle_offset; - this.set_translate($handle, handle_offset, settings.vertical); - - if (settings.vertical) { - $handle.siblings('.range-slider-active-segment').css('height', progress_bar_length + '%'); - } else { - $handle.siblings('.range-slider-active-segment').css('width', progress_bar_length + '%'); - } - - $handle_parent.attr(this.attr_name(), value).trigger('change').trigger('change.fndtn.slider'); - - $hidden_inputs.val(value); - if (settings.trigger_input_change) { - $hidden_inputs.trigger('change'); - } - - if (!$handle[0].hasAttribute('aria-valuemin')) { - $handle.attr({ - 'aria-valuemin': settings.start, - 'aria-valuemax': settings.end - }); - } - $handle.attr('aria-valuenow', value); - - if (settings.display_selector != '') { - $(settings.display_selector).each(function(){ - if (this.hasOwnProperty('value')) { - $(this).val(value); - } else { - $(this).text(value); - } - }); - } - - }, - - normalized_percentage : function(val, start, end) { - return Math.min(1, (val - start)/(end - start)); - }, - - normalized_value : function(val, start, end, step, precision) { - var range = end - start, - point = val*range, - mod = (point-(point%step)) / step, - rem = point % step, - round = ( rem >= step*0.5 ? step : 0); - return ((mod*step + round) + start).toFixed(precision); - }, - - set_translate : function(ele, offset, vertical) { - if (vertical) { - $(ele) - .css('-webkit-transform', 'translateY('+offset+'px)') - .css('-moz-transform', 'translateY('+offset+'px)') - .css('-ms-transform', 'translateY('+offset+'px)') - .css('-o-transform', 'translateY('+offset+'px)') - .css('transform', 'translateY('+offset+'px)'); - } else { - $(ele) - .css('-webkit-transform', 'translateX('+offset+'px)') - .css('-moz-transform', 'translateX('+offset+'px)') - .css('-ms-transform', 'translateX('+offset+'px)') - .css('-o-transform', 'translateX('+offset+'px)') - .css('transform', 'translateX('+offset+'px)'); - } - }, - - limit_to : function(val, min, max) { - return Math.min(Math.max(val, min), max); - }, - - - - initialize_settings : function(handle) { - var settings = $.extend({}, this.settings, this.data_options($(handle).parent())), - decimal_places_match_result; - - if (settings.precision === null) { - decimal_places_match_result = ('' + settings.step).match(/\.([\d]*)/); - settings.precision = decimal_places_match_result && decimal_places_match_result[1] ? decimal_places_match_result[1].length : 0; - } - - if (settings.vertical) { - $.data(handle, 'bar_o', $(handle).parent().offset().top); - $.data(handle, 'bar_l', $(handle).parent().outerHeight()); - $.data(handle, 'handle_o', $(handle).offset().top); - $.data(handle, 'handle_l', $(handle).outerHeight()); - } else { - $.data(handle, 'bar_o', $(handle).parent().offset().left); - $.data(handle, 'bar_l', $(handle).parent().outerWidth()); - $.data(handle, 'handle_o', $(handle).offset().left); - $.data(handle, 'handle_l', $(handle).outerWidth()); - } - - $.data(handle, 'bar', $(handle).parent()); - $.data(handle, 'settings', settings); - }, - - set_initial_position : function($ele) { - var settings = $.data($ele.children('.range-slider-handle')[0], 'settings'), - initial = ((typeof settings.initial == 'number' && !isNaN(settings.initial)) ? settings.initial : Math.floor((settings.end-settings.start)*0.5/settings.step)*settings.step+settings.start), - $handle = $ele.children('.range-slider-handle'); - this.set_ui($handle, initial); - }, - - set_value : function(value) { - var self = this; - $('[' + self.attr_name() + ']', this.scope).each(function(){ - $(this).attr(self.attr_name(), value); - }); - if (!!$(this.scope).attr(self.attr_name())) { - $(this.scope).attr(self.attr_name(), value); - } - self.reflow(); - }, - - reflow : function() { - var self = this; - self.S('[' + this.attr_name() + ']').each(function() { - var handle = $(this).children('.range-slider-handle')[0], - val = $(this).attr(self.attr_name()); - self.initialize_settings(handle); - - if (val) { - self.set_ui($(handle), parseFloat(val)); - } else { - self.set_initial_position($(this)); - } - }); - } - }; - -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - var Modernizr = Modernizr || false; - - Foundation.libs.joyride = { - name : 'joyride', - - version : '5.5.0', - - defaults : { - expose : false, // turn on or off the expose feature - modal : true, // Whether to cover page with modal during the tour - keyboard : true, // enable left, right and esc keystrokes - tip_location : 'bottom', // 'top' or 'bottom' in relation to parent - nub_position : 'auto', // override on a per tooltip bases - scroll_speed : 1500, // Page scrolling speed in milliseconds, 0 = no scroll animation - scroll_animation : 'linear', // supports 'swing' and 'linear', extend with jQuery UI. - timer : 0, // 0 = no timer , all other numbers = timer in milliseconds - start_timer_on_click : true, // true or false - true requires clicking the first button start the timer - start_offset : 0, // the index of the tooltip you want to start on (index of the li) - next_button : true, // true or false to control whether a next button is used - prev_button : true, // true or false to control whether a prev button is used - tip_animation : 'fade', // 'pop' or 'fade' in each tip - pause_after : [], // array of indexes where to pause the tour after - exposed : [], // array of expose elements - tip_animation_fade_speed : 300, // when tipAnimation = 'fade' this is speed in milliseconds for the transition - cookie_monster : false, // true or false to control whether cookies are used - cookie_name : 'joyride', // Name the cookie you'll use - cookie_domain : false, // Will this cookie be attached to a domain, ie. '.notableapp.com' - cookie_expires : 365, // set when you would like the cookie to expire. - tip_container : 'body', // Where will the tip be attached - abort_on_close : true, // When true, the close event will not fire any callback - tip_location_patterns : { - top: ['bottom'], - bottom: [], // bottom should not need to be repositioned - left: ['right', 'top', 'bottom'], - right: ['left', 'top', 'bottom'] - }, - post_ride_callback : function (){}, // A method to call once the tour closes (canceled or complete) - post_step_callback : function (){}, // A method to call after each step - pre_step_callback : function (){}, // A method to call before each step - pre_ride_callback : function (){}, // A method to call before the tour starts (passed index, tip, and cloned exposed element) - post_expose_callback : function (){}, // A method to call after an element has been exposed - template : { // HTML segments for tip layout - link : '×', - timer : '
        ', - tip : '
        ', - wrapper : '
        ', - button : '', - prev_button : '', - modal : '
        ', - expose : '
        ', - expose_cover : '
        ' - }, - expose_add_class : '' // One or more space-separated class names to be added to exposed element - }, - - init : function (scope, method, options) { - Foundation.inherit(this, 'throttle random_str'); - - this.settings = this.settings || $.extend({}, this.defaults, (options || method)); - - this.bindings(method, options) - }, - - go_next : function() { - if (this.settings.$li.next().length < 1) { - this.end(); - } else if (this.settings.timer > 0) { - clearTimeout(this.settings.automate); - this.hide(); - this.show(); - this.startTimer(); - } else { - this.hide(); - this.show(); - } - }, - - go_prev : function() { - if (this.settings.$li.prev().length < 1) { - // Do nothing if there are no prev element - } else if (this.settings.timer > 0) { - clearTimeout(this.settings.automate); - this.hide(); - this.show(null, true); - this.startTimer(); - } else { - this.hide(); - this.show(null, true); - } - }, - - events : function () { - var self = this; - - $(this.scope) - .off('.joyride') - .on('click.fndtn.joyride', '.joyride-next-tip, .joyride-modal-bg', function (e) { - e.preventDefault(); - this.go_next() - }.bind(this)) - .on('click.fndtn.joyride', '.joyride-prev-tip', function (e) { - e.preventDefault(); - this.go_prev(); - }.bind(this)) - - .on('click.fndtn.joyride', '.joyride-close-tip', function (e) { - e.preventDefault(); - this.end(this.settings.abort_on_close); - }.bind(this)) - - .on('keyup.fndtn.joyride', function(e) { - // Don't do anything if keystrokes are disabled - // or if the joyride is not being shown - if (!this.settings.keyboard || !this.settings.riding) return; - - switch (e.which) { - case 39: // right arrow - e.preventDefault(); - this.go_next(); - break; - case 37: // left arrow - e.preventDefault(); - this.go_prev(); - break; - case 27: // escape - e.preventDefault(); - this.end(this.settings.abort_on_close); - } - }.bind(this)); - - $(window) - .off('.joyride') - .on('resize.fndtn.joyride', self.throttle(function () { - if ($('[' + self.attr_name() + ']').length > 0 && self.settings.$next_tip && self.settings.riding) { - if (self.settings.exposed.length > 0) { - var $els = $(self.settings.exposed); - - $els.each(function () { - var $this = $(this); - self.un_expose($this); - self.expose($this); - }); - } - - if (self.is_phone()) { - self.pos_phone(); - } else { - self.pos_default(false); - } - } - }, 100)); - }, - - start : function () { - var self = this, - $this = $('[' + this.attr_name() + ']', this.scope), - integer_settings = ['timer', 'scrollSpeed', 'startOffset', 'tipAnimationFadeSpeed', 'cookieExpires'], - int_settings_count = integer_settings.length; - - if (!$this.length > 0) return; - - if (!this.settings.init) this.events(); - - this.settings = $this.data(this.attr_name(true) + '-init'); - - // non configureable settings - this.settings.$content_el = $this; - this.settings.$body = $(this.settings.tip_container); - this.settings.body_offset = $(this.settings.tip_container).position(); - this.settings.$tip_content = this.settings.$content_el.find('> li'); - this.settings.paused = false; - this.settings.attempts = 0; - this.settings.riding = true; - - // can we create cookies? - if (typeof $.cookie !== 'function') { - this.settings.cookie_monster = false; - } - - // generate the tips and insert into dom. - if (!this.settings.cookie_monster || this.settings.cookie_monster && !$.cookie(this.settings.cookie_name)) { - this.settings.$tip_content.each(function (index) { - var $this = $(this); - this.settings = $.extend({}, self.defaults, self.data_options($this)); - - // Make sure that settings parsed from data_options are integers where necessary - var i = int_settings_count; - while (i--) { - self.settings[integer_settings[i]] = parseInt(self.settings[integer_settings[i]], 10); - } - self.create({$li : $this, index : index}); - }); - - // show first tip - if (!this.settings.start_timer_on_click && this.settings.timer > 0) { - this.show('init'); - this.startTimer(); - } else { - this.show('init'); - } - - } - }, - - resume : function () { - this.set_li(); - this.show(); - }, - - tip_template : function (opts) { - var $blank, content; - - opts.tip_class = opts.tip_class || ''; - - $blank = $(this.settings.template.tip).addClass(opts.tip_class); - content = $.trim($(opts.li).html()) + - this.prev_button_text(opts.prev_button_text, opts.index) + - this.button_text(opts.button_text) + - this.settings.template.link + - this.timer_instance(opts.index); - - $blank.append($(this.settings.template.wrapper)); - $blank.first().attr(this.add_namespace('data-index'), opts.index); - $('.joyride-content-wrapper', $blank).append(content); - - return $blank[0]; - }, - - timer_instance : function (index) { - var txt; - - if ((index === 0 && this.settings.start_timer_on_click && this.settings.timer > 0) || this.settings.timer === 0) { - txt = ''; - } else { - txt = $(this.settings.template.timer)[0].outerHTML; - } - return txt; - }, - - button_text : function (txt) { - if (this.settings.tip_settings.next_button) { - txt = $.trim(txt) || 'Next'; - txt = $(this.settings.template.button).append(txt)[0].outerHTML; - } else { - txt = ''; - } - return txt; - }, - - prev_button_text : function (txt, idx) { - if (this.settings.tip_settings.prev_button) { - txt = $.trim(txt) || 'Previous'; - - // Add the disabled class to the button if it's the first element - if (idx == 0) - txt = $(this.settings.template.prev_button).append(txt).addClass('disabled')[0].outerHTML; - else - txt = $(this.settings.template.prev_button).append(txt)[0].outerHTML; - } else { - txt = ''; - } - return txt; - }, - - create : function (opts) { - this.settings.tip_settings = $.extend({}, this.settings, this.data_options(opts.$li)); - var buttonText = opts.$li.attr(this.add_namespace('data-button')) - || opts.$li.attr(this.add_namespace('data-text')), - prevButtonText = opts.$li.attr(this.add_namespace('data-button-prev')) - || opts.$li.attr(this.add_namespace('data-prev-text')), - tipClass = opts.$li.attr('class'), - $tip_content = $(this.tip_template({ - tip_class : tipClass, - index : opts.index, - button_text : buttonText, - prev_button_text : prevButtonText, - li : opts.$li - })); - - $(this.settings.tip_container).append($tip_content); - }, - - show : function (init, is_prev) { - var $timer = null; - - // are we paused? - if (this.settings.$li === undefined - || ($.inArray(this.settings.$li.index(), this.settings.pause_after) === -1)) { - - // don't go to the next li if the tour was paused - if (this.settings.paused) { - this.settings.paused = false; - } else { - this.set_li(init, is_prev); - } - - this.settings.attempts = 0; - - if (this.settings.$li.length && this.settings.$target.length > 0) { - if (init) { //run when we first start - this.settings.pre_ride_callback(this.settings.$li.index(), this.settings.$next_tip); - if (this.settings.modal) { - this.show_modal(); - } - } - - this.settings.pre_step_callback(this.settings.$li.index(), this.settings.$next_tip); - - if (this.settings.modal && this.settings.expose) { - this.expose(); - } - - this.settings.tip_settings = $.extend({}, this.settings, this.data_options(this.settings.$li)); - - this.settings.timer = parseInt(this.settings.timer, 10); - - this.settings.tip_settings.tip_location_pattern = this.settings.tip_location_patterns[this.settings.tip_settings.tip_location]; - - // scroll and hide bg if not modal - if (!/body/i.test(this.settings.$target.selector)) { - var joyridemodalbg = $('.joyride-modal-bg'); - if (/pop/i.test(this.settings.tipAnimation)) { - joyridemodalbg.hide(); - } else { - joyridemodalbg.fadeOut(this.settings.tipAnimationFadeSpeed); - } - this.scroll_to(); - } - - if (this.is_phone()) { - this.pos_phone(true); - } else { - this.pos_default(true); - } - - $timer = this.settings.$next_tip.find('.joyride-timer-indicator'); - - if (/pop/i.test(this.settings.tip_animation)) { - - $timer.width(0); - - if (this.settings.timer > 0) { - - this.settings.$next_tip.show(); - - setTimeout(function () { - $timer.animate({ - width: $timer.parent().width() - }, this.settings.timer, 'linear'); - }.bind(this), this.settings.tip_animation_fade_speed); - - } else { - this.settings.$next_tip.show(); - - } - - - } else if (/fade/i.test(this.settings.tip_animation)) { - - $timer.width(0); - - if (this.settings.timer > 0) { - - this.settings.$next_tip - .fadeIn(this.settings.tip_animation_fade_speed) - .show(); - - setTimeout(function () { - $timer.animate({ - width: $timer.parent().width() - }, this.settings.timer, 'linear'); - }.bind(this), this.settings.tip_animation_fade_speed); - - } else { - this.settings.$next_tip.fadeIn(this.settings.tip_animation_fade_speed); - } - } - - this.settings.$current_tip = this.settings.$next_tip; - - // skip non-existant targets - } else if (this.settings.$li && this.settings.$target.length < 1) { - - this.show(init, is_prev); - - } else { - - this.end(); - - } - } else { - - this.settings.paused = true; - - } - - }, - - is_phone : function () { - return matchMedia(Foundation.media_queries.small).matches && - !matchMedia(Foundation.media_queries.medium).matches; - }, - - hide : function () { - if (this.settings.modal && this.settings.expose) { - this.un_expose(); - } - - if (!this.settings.modal) { - $('.joyride-modal-bg').hide(); - } - - // Prevent scroll bouncing...wait to remove from layout - this.settings.$current_tip.css('visibility', 'hidden'); - setTimeout($.proxy(function() { - this.hide(); - this.css('visibility', 'visible'); - }, this.settings.$current_tip), 0); - this.settings.post_step_callback(this.settings.$li.index(), - this.settings.$current_tip); - }, - - set_li : function (init, is_prev) { - if (init) { - this.settings.$li = this.settings.$tip_content.eq(this.settings.start_offset); - this.set_next_tip(); - this.settings.$current_tip = this.settings.$next_tip; - } else { - if (is_prev) - this.settings.$li = this.settings.$li.prev(); - else - this.settings.$li = this.settings.$li.next(); - this.set_next_tip(); - } - - this.set_target(); - }, - - set_next_tip : function () { - this.settings.$next_tip = $('.joyride-tip-guide').eq(this.settings.$li.index()); - this.settings.$next_tip.data('closed', ''); - }, - - set_target : function () { - var cl = this.settings.$li.attr(this.add_namespace('data-class')), - id = this.settings.$li.attr(this.add_namespace('data-id')), - $sel = function () { - if (id) { - return $(document.getElementById(id)); - } else if (cl) { - return $('.' + cl).first(); - } else { - return $('body'); - } - }; - - this.settings.$target = $sel(); - }, - - scroll_to : function () { - var window_half, tipOffset; - - window_half = $(window).height() / 2; - tipOffset = Math.ceil(this.settings.$target.offset().top - window_half + this.settings.$next_tip.outerHeight()); - - if (tipOffset != 0) { - $('html, body').stop().animate({ - scrollTop: tipOffset - }, this.settings.scroll_speed, 'swing'); - } - }, - - paused : function () { - return ($.inArray((this.settings.$li.index() + 1), this.settings.pause_after) === -1); - }, - - restart : function () { - this.hide(); - this.settings.$li = undefined; - this.show('init'); - }, - - pos_default : function (init) { - var $nub = this.settings.$next_tip.find('.joyride-nub'), - nub_width = Math.ceil($nub.outerWidth() / 2), - nub_height = Math.ceil($nub.outerHeight() / 2), - toggle = init || false; - - // tip must not be "display: none" to calculate position - if (toggle) { - this.settings.$next_tip.css('visibility', 'hidden'); - this.settings.$next_tip.show(); - } - - if (!/body/i.test(this.settings.$target.selector)) { - var topAdjustment = this.settings.tip_settings.tipAdjustmentY ? parseInt(this.settings.tip_settings.tipAdjustmentY) : 0, - leftAdjustment = this.settings.tip_settings.tipAdjustmentX ? parseInt(this.settings.tip_settings.tipAdjustmentX) : 0; - - if (this.bottom()) { - if (this.rtl) { - this.settings.$next_tip.css({ - top: (this.settings.$target.offset().top + nub_height + this.settings.$target.outerHeight() + topAdjustment), - left: this.settings.$target.offset().left + this.settings.$target.outerWidth() - this.settings.$next_tip.outerWidth() + leftAdjustment}); - } else { - this.settings.$next_tip.css({ - top: (this.settings.$target.offset().top + nub_height + this.settings.$target.outerHeight() + topAdjustment), - left: this.settings.$target.offset().left + leftAdjustment}); - } - - this.nub_position($nub, this.settings.tip_settings.nub_position, 'top'); - - } else if (this.top()) { - if (this.rtl) { - this.settings.$next_tip.css({ - top: (this.settings.$target.offset().top - this.settings.$next_tip.outerHeight() - nub_height + topAdjustment), - left: this.settings.$target.offset().left + this.settings.$target.outerWidth() - this.settings.$next_tip.outerWidth()}); - } else { - this.settings.$next_tip.css({ - top: (this.settings.$target.offset().top - this.settings.$next_tip.outerHeight() - nub_height + topAdjustment), - left: this.settings.$target.offset().left + leftAdjustment}); - } - - this.nub_position($nub, this.settings.tip_settings.nub_position, 'bottom'); - - } else if (this.right()) { - - this.settings.$next_tip.css({ - top: this.settings.$target.offset().top + topAdjustment, - left: (this.settings.$target.outerWidth() + this.settings.$target.offset().left + nub_width + leftAdjustment)}); - - this.nub_position($nub, this.settings.tip_settings.nub_position, 'left'); - - } else if (this.left()) { - - this.settings.$next_tip.css({ - top: this.settings.$target.offset().top + topAdjustment, - left: (this.settings.$target.offset().left - this.settings.$next_tip.outerWidth() - nub_width + leftAdjustment)}); - - this.nub_position($nub, this.settings.tip_settings.nub_position, 'right'); - - } - - if (!this.visible(this.corners(this.settings.$next_tip)) && this.settings.attempts < this.settings.tip_settings.tip_location_pattern.length) { - - $nub.removeClass('bottom') - .removeClass('top') - .removeClass('right') - .removeClass('left'); - - this.settings.tip_settings.tip_location = this.settings.tip_settings.tip_location_pattern[this.settings.attempts]; - - this.settings.attempts++; - - this.pos_default(); - - } - - } else if (this.settings.$li.length) { - - this.pos_modal($nub); - - } - - if (toggle) { - this.settings.$next_tip.hide(); - this.settings.$next_tip.css('visibility', 'visible'); - } - - }, - - pos_phone : function (init) { - var tip_height = this.settings.$next_tip.outerHeight(), - tip_offset = this.settings.$next_tip.offset(), - target_height = this.settings.$target.outerHeight(), - $nub = $('.joyride-nub', this.settings.$next_tip), - nub_height = Math.ceil($nub.outerHeight() / 2), - toggle = init || false; - - $nub.removeClass('bottom') - .removeClass('top') - .removeClass('right') - .removeClass('left'); - - if (toggle) { - this.settings.$next_tip.css('visibility', 'hidden'); - this.settings.$next_tip.show(); - } - - if (!/body/i.test(this.settings.$target.selector)) { - - if (this.top()) { - - this.settings.$next_tip.offset({top: this.settings.$target.offset().top - tip_height - nub_height}); - $nub.addClass('bottom'); - - } else { - - this.settings.$next_tip.offset({top: this.settings.$target.offset().top + target_height + nub_height}); - $nub.addClass('top'); - - } - - } else if (this.settings.$li.length) { - this.pos_modal($nub); - } - - if (toggle) { - this.settings.$next_tip.hide(); - this.settings.$next_tip.css('visibility', 'visible'); - } - }, - - pos_modal : function ($nub) { - this.center(); - $nub.hide(); - - this.show_modal(); - }, - - show_modal : function () { - if (!this.settings.$next_tip.data('closed')) { - var joyridemodalbg = $('.joyride-modal-bg'); - if (joyridemodalbg.length < 1) { - var joyridemodalbg = $(this.settings.template.modal); - joyridemodalbg.appendTo('body'); - } - - if (/pop/i.test(this.settings.tip_animation)) { - joyridemodalbg.show(); - } else { - joyridemodalbg.fadeIn(this.settings.tip_animation_fade_speed); - } - } - }, - - expose : function () { - var expose, - exposeCover, - el, - origCSS, - origClasses, - randId = 'expose-' + this.random_str(6); - - if (arguments.length > 0 && arguments[0] instanceof $) { - el = arguments[0]; - } else if(this.settings.$target && !/body/i.test(this.settings.$target.selector)){ - el = this.settings.$target; - } else { - return false; - } - - if(el.length < 1){ - if(window.console){ - console.error('element not valid', el); - } - return false; - } - - expose = $(this.settings.template.expose); - this.settings.$body.append(expose); - expose.css({ - top: el.offset().top, - left: el.offset().left, - width: el.outerWidth(true), - height: el.outerHeight(true) - }); - - exposeCover = $(this.settings.template.expose_cover); - - origCSS = { - zIndex: el.css('z-index'), - position: el.css('position') - }; - - origClasses = el.attr('class') == null ? '' : el.attr('class'); - - el.css('z-index',parseInt(expose.css('z-index'))+1); - - if (origCSS.position == 'static') { - el.css('position','relative'); - } - - el.data('expose-css',origCSS); - el.data('orig-class', origClasses); - el.attr('class', origClasses + ' ' + this.settings.expose_add_class); - - exposeCover.css({ - top: el.offset().top, - left: el.offset().left, - width: el.outerWidth(true), - height: el.outerHeight(true) - }); - - if (this.settings.modal) this.show_modal(); - - this.settings.$body.append(exposeCover); - expose.addClass(randId); - exposeCover.addClass(randId); - el.data('expose', randId); - this.settings.post_expose_callback(this.settings.$li.index(), this.settings.$next_tip, el); - this.add_exposed(el); - }, - - un_expose : function () { - var exposeId, - el, - expose , - origCSS, - origClasses, - clearAll = false; - - if (arguments.length > 0 && arguments[0] instanceof $) { - el = arguments[0]; - } else if(this.settings.$target && !/body/i.test(this.settings.$target.selector)){ - el = this.settings.$target; - } else { - return false; - } - - if(el.length < 1){ - if (window.console) { - console.error('element not valid', el); - } - return false; - } - - exposeId = el.data('expose'); - expose = $('.' + exposeId); - - if (arguments.length > 1) { - clearAll = arguments[1]; - } - - if (clearAll === true) { - $('.joyride-expose-wrapper,.joyride-expose-cover').remove(); - } else { - expose.remove(); - } - - origCSS = el.data('expose-css'); - - if (origCSS.zIndex == 'auto') { - el.css('z-index', ''); - } else { - el.css('z-index', origCSS.zIndex); - } - - if (origCSS.position != el.css('position')) { - if(origCSS.position == 'static') {// this is default, no need to set it. - el.css('position', ''); - } else { - el.css('position', origCSS.position); - } - } - - origClasses = el.data('orig-class'); - el.attr('class', origClasses); - el.removeData('orig-classes'); - - el.removeData('expose'); - el.removeData('expose-z-index'); - this.remove_exposed(el); - }, - - add_exposed: function(el){ - this.settings.exposed = this.settings.exposed || []; - if (el instanceof $ || typeof el === 'object') { - this.settings.exposed.push(el[0]); - } else if (typeof el == 'string') { - this.settings.exposed.push(el); - } - }, - - remove_exposed: function(el){ - var search, i; - if (el instanceof $) { - search = el[0] - } else if (typeof el == 'string'){ - search = el; - } - - this.settings.exposed = this.settings.exposed || []; - i = this.settings.exposed.length; - - while (i--) { - if (this.settings.exposed[i] == search) { - this.settings.exposed.splice(i, 1); - return; - } - } - }, - - center : function () { - var $w = $(window); - - this.settings.$next_tip.css({ - top : ((($w.height() - this.settings.$next_tip.outerHeight()) / 2) + $w.scrollTop()), - left : ((($w.width() - this.settings.$next_tip.outerWidth()) / 2) + $w.scrollLeft()) - }); - - return true; - }, - - bottom : function () { - return /bottom/i.test(this.settings.tip_settings.tip_location); - }, - - top : function () { - return /top/i.test(this.settings.tip_settings.tip_location); - }, - - right : function () { - return /right/i.test(this.settings.tip_settings.tip_location); - }, - - left : function () { - return /left/i.test(this.settings.tip_settings.tip_location); - }, - - corners : function (el) { - var w = $(window), - window_half = w.height() / 2, - //using this to calculate since scroll may not have finished yet. - tipOffset = Math.ceil(this.settings.$target.offset().top - window_half + this.settings.$next_tip.outerHeight()), - right = w.width() + w.scrollLeft(), - offsetBottom = w.height() + tipOffset, - bottom = w.height() + w.scrollTop(), - top = w.scrollTop(); - - if (tipOffset < top) { - if (tipOffset < 0) { - top = 0; - } else { - top = tipOffset; - } - } - - if (offsetBottom > bottom) { - bottom = offsetBottom; - } - - return [ - el.offset().top < top, - right < el.offset().left + el.outerWidth(), - bottom < el.offset().top + el.outerHeight(), - w.scrollLeft() > el.offset().left - ]; - }, - - visible : function (hidden_corners) { - var i = hidden_corners.length; - - while (i--) { - if (hidden_corners[i]) return false; - } - - return true; - }, - - nub_position : function (nub, pos, def) { - if (pos === 'auto') { - nub.addClass(def); - } else { - nub.addClass(pos); - } - }, - - startTimer : function () { - if (this.settings.$li.length) { - this.settings.automate = setTimeout(function () { - this.hide(); - this.show(); - this.startTimer(); - }.bind(this), this.settings.timer); - } else { - clearTimeout(this.settings.automate); - } - }, - - end : function (abort) { - if (this.settings.cookie_monster) { - $.cookie(this.settings.cookie_name, 'ridden', { expires: this.settings.cookie_expires, domain: this.settings.cookie_domain }); - } - - if (this.settings.timer > 0) { - clearTimeout(this.settings.automate); - } - - if (this.settings.modal && this.settings.expose) { - this.un_expose(); - } - - // Unplug keystrokes listener - $(this.scope).off('keyup.joyride') - - this.settings.$next_tip.data('closed', true); - this.settings.riding = false; - - $('.joyride-modal-bg').hide(); - this.settings.$current_tip.hide(); - - if (typeof abort === 'undefined' || abort === false) { - this.settings.post_step_callback(this.settings.$li.index(), this.settings.$current_tip); - this.settings.post_ride_callback(this.settings.$li.index(), this.settings.$current_tip); - } - - $('.joyride-tip-guide').remove(); - }, - - off : function () { - $(this.scope).off('.joyride'); - $(window).off('.joyride'); - $('.joyride-close-tip, .joyride-next-tip, .joyride-modal-bg').off('.joyride'); - $('.joyride-tip-guide, .joyride-modal-bg').remove(); - clearTimeout(this.settings.automate); - this.settings = {}; - }, - - reflow : function () {} - }; -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.equalizer = { - name : 'equalizer', - - version : '5.5.0', - - settings : { - use_tallest: true, - before_height_change: $.noop, - after_height_change: $.noop, - equalize_on_stack: false - }, - - init : function (scope, method, options) { - Foundation.inherit(this, 'image_loaded'); - this.bindings(method, options); - this.reflow(); - }, - - events : function () { - this.S(window).off('.equalizer').on('resize.fndtn.equalizer', function(e){ - this.reflow(); - }.bind(this)); - }, - - equalize: function(equalizer) { - var isStacked = false, - vals = equalizer.find('[' + this.attr_name() + '-watch]:visible'), - settings = equalizer.data(this.attr_name(true)+'-init'); - - if (vals.length === 0) return; - var firstTopOffset = vals.first().offset().top; - settings.before_height_change(); - equalizer.trigger('before-height-change').trigger('before-height-change.fndth.equalizer'); - vals.height('inherit'); - vals.each(function(){ - var el = $(this); - if (el.offset().top !== firstTopOffset) { - isStacked = true; - } - }); - - if (settings.equalize_on_stack === false) { - if (isStacked) return; - }; - - var heights = vals.map(function(){ return $(this).outerHeight(false) }).get(); - - if (settings.use_tallest) { - var max = Math.max.apply(null, heights); - vals.css('height', max); - } else { - var min = Math.min.apply(null, heights); - vals.css('height', min); - } - settings.after_height_change(); - equalizer.trigger('after-height-change').trigger('after-height-change.fndtn.equalizer'); - }, - - reflow : function () { - var self = this; - - this.S('[' + this.attr_name() + ']', this.scope).each(function(){ - var $eq_target = $(this); - self.image_loaded(self.S('img', this), function(){ - self.equalize($eq_target) - }); - }); - } - }; -})(jQuery, window, window.document); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.dropdown = { - name : 'dropdown', - - version : '5.5.0', - - settings : { - active_class: 'open', - disabled_class: 'disabled', - mega_class: 'mega', - align: 'bottom', - is_hover: false, - hover_timeout: 150, - opened: function(){}, - closed: function(){} - }, - - init : function (scope, method, options) { - Foundation.inherit(this, 'throttle'); - - $.extend(true, this.settings, method, options); - this.bindings(method, options); - }, - - events : function (scope) { - var self = this, - S = self.S; - - S(this.scope) - .off('.dropdown') - .on('click.fndtn.dropdown', '[' + this.attr_name() + ']', function (e) { - var settings = S(this).data(self.attr_name(true) + '-init') || self.settings; - if (!settings.is_hover || Modernizr.touch) { - e.preventDefault(); - if (S(this).parent('[data-reveal-id]')) { - e.stopPropagation(); - } - self.toggle($(this)); - } - }) - .on('mouseenter.fndtn.dropdown', '[' + this.attr_name() + '], [' + this.attr_name() + '-content]', function (e) { - var $this = S(this), - dropdown, - target; - - clearTimeout(self.timeout); - - if ($this.data(self.data_attr())) { - dropdown = S('#' + $this.data(self.data_attr())); - target = $this; - } else { - dropdown = $this; - target = S('[' + self.attr_name() + '="' + dropdown.attr('id') + '"]'); - } - - var settings = target.data(self.attr_name(true) + '-init') || self.settings; - - if(S(e.currentTarget).data(self.data_attr()) && settings.is_hover) { - self.closeall.call(self); - } - - if (settings.is_hover) self.open.apply(self, [dropdown, target]); - }) - .on('mouseleave.fndtn.dropdown', '[' + this.attr_name() + '], [' + this.attr_name() + '-content]', function (e) { - var $this = S(this); - var settings; - - if ($this.data(self.data_attr())) { - settings = $this.data(self.data_attr(true) + '-init') || self.settings; - } - else { - var target = S('[' + self.attr_name() + '="' + S(this).attr('id') + '"]'), - settings = target.data(self.attr_name(true) + '-init') || self.settings; - } - - self.timeout = setTimeout(function () { - if ($this.data(self.data_attr())) { - if (settings.is_hover) self.close.call(self, S('#' + $this.data(self.data_attr()))); - } else { - if (settings.is_hover) self.close.call(self, $this); - } - }.bind(this), settings.hover_timeout); - }) - .on('click.fndtn.dropdown', function (e) { - var parent = S(e.target).closest('[' + self.attr_name() + '-content]'); - var links = parent.find('a'); - - if (links.length > 0 && parent.attr('aria-autoclose') !== "false") { - self.close.call(self, S('[' + self.attr_name() + '-content]')); - } - - if (S(e.target).closest('[' + self.attr_name() + ']').length > 0) { - return; - } - - if (!(S(e.target).data('revealId')) && - (parent.length > 0 && (S(e.target).is('[' + self.attr_name() + '-content]') || - $.contains(parent.first()[0], e.target)))) { - e.stopPropagation(); - return; - } - - self.close.call(self, S('[' + self.attr_name() + '-content]')); - }) - .on('opened.fndtn.dropdown', '[' + self.attr_name() + '-content]', function () { - self.settings.opened.call(this); - }) - .on('closed.fndtn.dropdown', '[' + self.attr_name() + '-content]', function () { - self.settings.closed.call(this); - }); - - S(window) - .off('.dropdown') - .on('resize.fndtn.dropdown', self.throttle(function () { - self.resize.call(self); - }, 50)); - - this.resize(); - }, - - close: function (dropdown) { - var self = this; - dropdown.each(function () { - var original_target = $('[' + self.attr_name() + '=' + dropdown[0].id + ']') || $('aria-controls=' + dropdown[0].id+ ']'); - original_target.attr('aria-expanded', 'false'); - if (self.S(this).hasClass(self.settings.active_class)) { - self.S(this) - .css(Foundation.rtl ? 'right':'left', '-99999px') - .attr('aria-hidden', 'true') - .removeClass(self.settings.active_class) - .prev('[' + self.attr_name() + ']') - .removeClass(self.settings.active_class) - .removeData('target'); - - self.S(this).trigger('closed').trigger('closed.fndtn.dropdown', [dropdown]); - } - }); - dropdown.removeClass('f-open-' + this.attr_name(true)); - }, - - closeall: function() { - var self = this; - $.each(self.S('.f-open-' + this.attr_name(true)), function() { - self.close.call(self, self.S(this)); - }); - }, - - open: function (dropdown, target) { - this - .css(dropdown - .addClass(this.settings.active_class), target); - dropdown.prev('[' + this.attr_name() + ']').addClass(this.settings.active_class); - dropdown.data('target', target.get(0)).trigger('opened').trigger('opened.fndtn.dropdown', [dropdown, target]); - dropdown.attr('aria-hidden', 'false'); - target.attr('aria-expanded', 'true'); - dropdown.focus(); - dropdown.addClass('f-open-' + this.attr_name(true)); - }, - - data_attr: function () { - if (this.namespace.length > 0) { - return this.namespace + '-' + this.name; - } - - return this.name; - }, - - toggle : function (target) { - if (target.hasClass(this.settings.disabled_class)) { - return; - } - var dropdown = this.S('#' + target.data(this.data_attr())); - if (dropdown.length === 0) { - // No dropdown found, not continuing - return; - } - - this.close.call(this, this.S('[' + this.attr_name() + '-content]').not(dropdown)); - - if (dropdown.hasClass(this.settings.active_class)) { - this.close.call(this, dropdown); - if (dropdown.data('target') !== target.get(0)) - this.open.call(this, dropdown, target); - } else { - this.open.call(this, dropdown, target); - } - }, - - resize : function () { - var dropdown = this.S('[' + this.attr_name() + '-content].open'), - target = this.S('[' + this.attr_name() + '="' + dropdown.attr('id') + '"]'); - - if (dropdown.length && target.length) { - this.css(dropdown, target); - } - }, - - css : function (dropdown, target) { - var left_offset = Math.max((target.width() - dropdown.width()) / 2, 8), - settings = target.data(this.attr_name(true) + '-init') || this.settings; - - this.clear_idx(); - - if (this.small()) { - var p = this.dirs.bottom.call(dropdown, target, settings); - - dropdown.attr('style', '').removeClass('drop-left drop-right drop-top').css({ - position : 'absolute', - width: '95%', - 'max-width': 'none', - top: p.top - }); - - dropdown.css(Foundation.rtl ? 'right':'left', left_offset); - } else { - - this.style(dropdown, target, settings); - } - - return dropdown; - }, - - style : function (dropdown, target, settings) { - var css = $.extend({position: 'absolute'}, - this.dirs[settings.align].call(dropdown, target, settings)); - - dropdown.attr('style', '').css(css); - }, - - // return CSS property object - // `this` is the dropdown - dirs : { - // Calculate target offset - _base : function (t) { - var o_p = this.offsetParent(), - o = o_p.offset(), - p = t.offset(); - - p.top -= o.top; - p.left -= o.left; - - //set some flags on the p object to pass along - p.missRight = false; - p.missTop = false; - p.missLeft = false; - p.leftRightFlag = false; - - //lets see if the panel will be off the screen - //get the actual width of the page and store it - var actualBodyWidth; - if (document.getElementsByClassName('row')[0]) { - actualBodyWidth = document.getElementsByClassName('row')[0].clientWidth; - } else { - actualBodyWidth = window.outerWidth; - } - - var actualMarginWidth = (window.outerWidth - actualBodyWidth) / 2; - var actualBoundary = actualBodyWidth; - - if (!this.hasClass('mega')) { - //miss top - if (t.offset().top <= this.outerHeight()) { - p.missTop = true; - actualBoundary = window.outerWidth - actualMarginWidth; - p.leftRightFlag = true; - } - - //miss right - if (t.offset().left + this.outerWidth() > t.offset().left + actualMarginWidth && t.offset().left - actualMarginWidth > this.outerWidth()) { - p.missRight = true; - p.missLeft = false; - } - - //miss left - if (t.offset().left - this.outerWidth() <= 0) { - p.missLeft = true; - p.missRight = false; - } - } - - return p; - }, - - top: function (t, s) { - var self = Foundation.libs.dropdown, - p = self.dirs._base.call(this, t); - - this.addClass('drop-top'); - - if (p.missTop == true) { - p.top = p.top + t.outerHeight() + this.outerHeight(); - this.removeClass('drop-top'); - } - - if (p.missRight == true) { - p.left = p.left - this.outerWidth() + t.outerWidth(); - } - - if (t.outerWidth() < this.outerWidth() || self.small() || this.hasClass(s.mega_menu)) { - self.adjust_pip(this,t,s,p); - } - - if (Foundation.rtl) { - return {left: p.left - this.outerWidth() + t.outerWidth(), - top: p.top - this.outerHeight()}; - } - - return {left: p.left, top: p.top - this.outerHeight()}; - }, - - bottom: function (t,s) { - var self = Foundation.libs.dropdown, - p = self.dirs._base.call(this, t); - - if (p.missRight == true) { - p.left = p.left - this.outerWidth() + t.outerWidth(); - } - - if (t.outerWidth() < this.outerWidth() || self.small() || this.hasClass(s.mega_menu)) { - self.adjust_pip(this,t,s,p); - } - - if (self.rtl) { - return {left: p.left - this.outerWidth() + t.outerWidth(), top: p.top + t.outerHeight()}; - } - - return {left: p.left, top: p.top + t.outerHeight()}; - }, - - left: function (t, s) { - var p = Foundation.libs.dropdown.dirs._base.call(this, t); - - this.addClass('drop-left'); - - if (p.missLeft == true) { - p.left = p.left + this.outerWidth(); - p.top = p.top + t.outerHeight(); - this.removeClass('drop-left'); - } - - return {left: p.left - this.outerWidth(), top: p.top}; - }, - - right: function (t, s) { - var p = Foundation.libs.dropdown.dirs._base.call(this, t); - - this.addClass('drop-right'); - - if (p.missRight == true) { - p.left = p.left - this.outerWidth(); - p.top = p.top + t.outerHeight(); - this.removeClass('drop-right'); - } else { - p.triggeredRight = true; - } - - var self = Foundation.libs.dropdown; - - if (t.outerWidth() < this.outerWidth() || self.small() || this.hasClass(s.mega_menu)) { - self.adjust_pip(this,t,s,p); - } - - return {left: p.left + t.outerWidth(), top: p.top}; - } - }, - - // Insert rule to style psuedo elements - adjust_pip : function (dropdown,target,settings,position) { - var sheet = Foundation.stylesheet, - pip_offset_base = 8; - - if (dropdown.hasClass(settings.mega_class)) { - pip_offset_base = position.left + (target.outerWidth()/2) - 8; - } - else if (this.small()) { - pip_offset_base += position.left - 8; - } - - this.rule_idx = sheet.cssRules.length; - - //default - var sel_before = '.f-dropdown.open:before', - sel_after = '.f-dropdown.open:after', - css_before = 'left: ' + pip_offset_base + 'px;', - css_after = 'left: ' + (pip_offset_base - 1) + 'px;'; - - if (position.missRight == true) { - pip_offset_base = dropdown.outerWidth() - 23; - sel_before = '.f-dropdown.open:before', - sel_after = '.f-dropdown.open:after', - css_before = 'left: ' + pip_offset_base + 'px;', - css_after = 'left: ' + (pip_offset_base - 1) + 'px;'; - } - - //just a case where right is fired, but its not missing right - if (position.triggeredRight == true) { - sel_before = '.f-dropdown.open:before', - sel_after = '.f-dropdown.open:after', - css_before = 'left:-12px;', - css_after = 'left:-14px;'; - } - - if (sheet.insertRule) { - sheet.insertRule([sel_before, '{', css_before, '}'].join(' '), this.rule_idx); - sheet.insertRule([sel_after, '{', css_after, '}'].join(' '), this.rule_idx + 1); - } else { - sheet.addRule(sel_before, css_before, this.rule_idx); - sheet.addRule(sel_after, css_after, this.rule_idx + 1); - } - }, - - // Remove old dropdown rule index - clear_idx : function () { - var sheet = Foundation.stylesheet; - - if (typeof this.rule_idx !== 'undefined') { - sheet.deleteRule(this.rule_idx); - sheet.deleteRule(this.rule_idx); - delete this.rule_idx; - } - }, - - small : function () { - return matchMedia(Foundation.media_queries.small).matches && - !matchMedia(Foundation.media_queries.medium).matches; - }, - - off: function () { - this.S(this.scope).off('.fndtn.dropdown'); - this.S('html, body').off('.fndtn.dropdown'); - this.S(window).off('.fndtn.dropdown'); - this.S('[data-dropdown-content]').off('.fndtn.dropdown'); - }, - - reflow : function () {} - }; -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.clearing = { - name : 'clearing', - - version: '5.5.0', - - settings : { - templates : { - viewing : '×' + - '' - }, - - // comma delimited list of selectors that, on click, will close clearing, - // add 'div.clearing-blackout, div.visible-img' to close on background click - close_selectors : '.clearing-close, div.clearing-blackout', - - // Default to the entire li element. - open_selectors : '', - - // Image will be skipped in carousel. - skip_selector : '', - - touch_label : '', - - // event initializers and locks - init : false, - locked : false - }, - - init : function (scope, method, options) { - var self = this; - Foundation.inherit(this, 'throttle image_loaded'); - - this.bindings(method, options); - - if (self.S(this.scope).is('[' + this.attr_name() + ']')) { - this.assemble(self.S('li', this.scope)); - } else { - self.S('[' + this.attr_name() + ']', this.scope).each(function () { - self.assemble(self.S('li', this)); - }); - } - }, - - events : function (scope) { - var self = this, - S = self.S, - $scroll_container = $('.scroll-container'); - - if ($scroll_container.length > 0) { - this.scope = $scroll_container; - } - - S(this.scope) - .off('.clearing') - .on('click.fndtn.clearing', 'ul[' + this.attr_name() + '] li ' + this.settings.open_selectors, - function (e, current, target) { - var current = current || S(this), - target = target || current, - next = current.next('li'), - settings = current.closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init'), - image = S(e.target); - - e.preventDefault(); - - if (!settings) { - self.init(); - settings = current.closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init'); - } - - // if clearing is open and the current image is - // clicked, go to the next image in sequence - if (target.hasClass('visible') && - current[0] === target[0] && - next.length > 0 && self.is_open(current)) { - target = next; - image = S('img', target); - } - - // set current and target to the clicked li if not otherwise defined. - self.open(image, current, target); - self.update_paddles(target); - }) - - .on('click.fndtn.clearing', '.clearing-main-next', - function (e) { self.nav(e, 'next') }) - .on('click.fndtn.clearing', '.clearing-main-prev', - function (e) { self.nav(e, 'prev') }) - .on('click.fndtn.clearing', this.settings.close_selectors, - function (e) { Foundation.libs.clearing.close(e, this) }); - - $(document).on('keydown.fndtn.clearing', - function (e) { self.keydown(e) }); - - S(window).off('.clearing').on('resize.fndtn.clearing', - function () { self.resize() }); - - this.swipe_events(scope); - }, - - swipe_events : function (scope) { - var self = this, - S = self.S; - - S(this.scope) - .on('touchstart.fndtn.clearing', '.visible-img', function(e) { - if (!e.touches) { e = e.originalEvent; } - var data = { - start_page_x: e.touches[0].pageX, - start_page_y: e.touches[0].pageY, - start_time: (new Date()).getTime(), - delta_x: 0, - is_scrolling: undefined - }; - - S(this).data('swipe-transition', data); - e.stopPropagation(); - }) - .on('touchmove.fndtn.clearing', '.visible-img', function(e) { - if (!e.touches) { e = e.originalEvent; } - // Ignore pinch/zoom events - if(e.touches.length > 1 || e.scale && e.scale !== 1) return; - - var data = S(this).data('swipe-transition'); - - if (typeof data === 'undefined') { - data = {}; - } - - data.delta_x = e.touches[0].pageX - data.start_page_x; - - if (Foundation.rtl) { - data.delta_x = -data.delta_x; - } - - if (typeof data.is_scrolling === 'undefined') { - data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) ); - } - - if (!data.is_scrolling && !data.active) { - e.preventDefault(); - var direction = (data.delta_x < 0) ? 'next' : 'prev'; - data.active = true; - self.nav(e, direction); - } - }) - .on('touchend.fndtn.clearing', '.visible-img', function(e) { - S(this).data('swipe-transition', {}); - e.stopPropagation(); - }); - }, - - assemble : function ($li) { - var $el = $li.parent(); - - if ($el.parent().hasClass('carousel')) { - return; - } - - $el.after('
        '); - - var grid = $el.detach(), - grid_outerHTML = ''; - - if (grid[0] == null) { - return; - } else { - grid_outerHTML = grid[0].outerHTML; - } - - var holder = this.S('#foundationClearingHolder'), - settings = $el.data(this.attr_name(true) + '-init'), - data = { - grid: '', - viewing: settings.templates.viewing - }, - wrapper = '
        ' + data.viewing + - data.grid + '
        ', - touch_label = this.settings.touch_label; - - if (Modernizr.touch) { - wrapper = $(wrapper).find('.clearing-touch-label').html(touch_label).end(); - } - - holder.after(wrapper).remove(); - }, - - open : function ($image, current, target) { - var self = this, - body = $(document.body), - root = target.closest('.clearing-assembled'), - container = self.S('div', root).first(), - visible_image = self.S('.visible-img', container), - image = self.S('img', visible_image).not($image), - label = self.S('.clearing-touch-label', container), - error = false; - - // Event to disable scrolling on touch devices when Clearing is activated - $('body').on('touchmove',function(e){ - e.preventDefault(); - }); - - image.error(function () { - error = true; - }); - - function startLoad() { - setTimeout(function () { - this.image_loaded(image, function () { - if (image.outerWidth() === 1 && !error) { - startLoad.call(this); - } else { - cb.call(this, image); - } - }.bind(this)); - }.bind(this), 100); - } - - function cb (image) { - var $image = $(image); - $image.css('visibility', 'visible'); - // toggle the gallery - body.css('overflow', 'hidden'); - root.addClass('clearing-blackout'); - container.addClass('clearing-container'); - visible_image.show(); - this.fix_height(target) - .caption(self.S('.clearing-caption', visible_image), self.S('img', target)) - .center_and_label(image, label) - .shift(current, target, function () { - target.closest('li').siblings().removeClass('visible'); - target.closest('li').addClass('visible'); - }); - visible_image.trigger('opened.fndtn.clearing') - } - - if (!this.locked()) { - visible_image.trigger('open.fndtn.clearing'); - // set the image to the selected thumbnail - image - .attr('src', this.load($image)) - .css('visibility', 'hidden'); - - startLoad.call(this); - } - }, - - close : function (e, el) { - e.preventDefault(); - - var root = (function (target) { - if (/blackout/.test(target.selector)) { - return target; - } else { - return target.closest('.clearing-blackout'); - } - }($(el))), - body = $(document.body), container, visible_image; - - if (el === e.target && root) { - body.css('overflow', ''); - container = $('div', root).first(); - visible_image = $('.visible-img', container); - visible_image.trigger('close.fndtn.clearing'); - this.settings.prev_index = 0; - $('ul[' + this.attr_name() + ']', root) - .attr('style', '').closest('.clearing-blackout') - .removeClass('clearing-blackout'); - container.removeClass('clearing-container'); - visible_image.hide(); - visible_image.trigger('closed.fndtn.clearing'); - } - - // Event to re-enable scrolling on touch devices - $('body').off('touchmove'); - - return false; - }, - - is_open : function (current) { - return current.parent().prop('style').length > 0; - }, - - keydown : function (e) { - var clearing = $('.clearing-blackout ul[' + this.attr_name() + ']'), - NEXT_KEY = this.rtl ? 37 : 39, - PREV_KEY = this.rtl ? 39 : 37, - ESC_KEY = 27; - - if (e.which === NEXT_KEY) this.go(clearing, 'next'); - if (e.which === PREV_KEY) this.go(clearing, 'prev'); - if (e.which === ESC_KEY) this.S('a.clearing-close').trigger('click').trigger('click.fndtn.clearing'); - }, - - nav : function (e, direction) { - var clearing = $('ul[' + this.attr_name() + ']', '.clearing-blackout'); - - e.preventDefault(); - this.go(clearing, direction); - }, - - resize : function () { - var image = $('img', '.clearing-blackout .visible-img'), - label = $('.clearing-touch-label', '.clearing-blackout'); - - if (image.length) { - this.center_and_label(image, label); - image.trigger('resized.fndtn.clearing') - } - }, - - // visual adjustments - fix_height : function (target) { - var lis = target.parent().children(), - self = this; - - lis.each(function () { - var li = self.S(this), - image = li.find('img'); - - if (li.height() > image.outerHeight()) { - li.addClass('fix-height'); - } - }) - .closest('ul') - .width(lis.length * 100 + '%'); - - return this; - }, - - update_paddles : function (target) { - target = target.closest('li'); - var visible_image = target - .closest('.carousel') - .siblings('.visible-img'); - - if (target.next().length > 0) { - this.S('.clearing-main-next', visible_image).removeClass('disabled'); - } else { - this.S('.clearing-main-next', visible_image).addClass('disabled'); - } - - if (target.prev().length > 0) { - this.S('.clearing-main-prev', visible_image).removeClass('disabled'); - } else { - this.S('.clearing-main-prev', visible_image).addClass('disabled'); - } - }, - - center_and_label : function (target, label) { - if (!this.rtl) { - target.css({ - marginLeft : -(target.outerWidth() / 2), - marginTop : -(target.outerHeight() / 2) - }); - - if (label.length > 0) { - label.css({ - marginLeft : -(label.outerWidth() / 2), - marginTop : -(target.outerHeight() / 2)-label.outerHeight()-10 - }); - } - } else { - target.css({ - marginRight : -(target.outerWidth() / 2), - marginTop : -(target.outerHeight() / 2), - left: 'auto', - right: '50%' - }); - - if (label.length > 0) { - label.css({ - marginRight : -(label.outerWidth() / 2), - marginTop : -(target.outerHeight() / 2)-label.outerHeight()-10, - left: 'auto', - right: '50%' - }); - } - } - return this; - }, - - // image loading and preloading - - load : function ($image) { - var href; - - if ($image[0].nodeName === 'A') { - href = $image.attr('href'); - } else { - href = $image.closest('a').attr('href'); - } - - this.preload($image); - - if (href) return href; - return $image.attr('src'); - }, - - preload : function ($image) { - this - .img($image.closest('li').next()) - .img($image.closest('li').prev()); - }, - - img : function (img) { - if (img.length) { - var new_img = new Image(), - new_a = this.S('a', img); - - if (new_a.length) { - new_img.src = new_a.attr('href'); - } else { - new_img.src = this.S('img', img).attr('src'); - } - } - return this; - }, - - // image caption - - caption : function (container, $image) { - var caption = $image.attr('data-caption'); - - if (caption) { - container - .html(caption) - .show(); - } else { - container - .text('') - .hide(); - } - return this; - }, - - // directional methods - - go : function ($ul, direction) { - var current = this.S('.visible', $ul), - target = current[direction](); - - // Check for skip selector. - if (this.settings.skip_selector && target.find(this.settings.skip_selector).length != 0) { - target = target[direction](); - } - - if (target.length) { - this.S('img', target) - .trigger('click', [current, target]).trigger('click.fndtn.clearing', [current, target]) - .trigger('change.fndtn.clearing'); - } - }, - - shift : function (current, target, callback) { - var clearing = target.parent(), - old_index = this.settings.prev_index || target.index(), - direction = this.direction(clearing, current, target), - dir = this.rtl ? 'right' : 'left', - left = parseInt(clearing.css('left'), 10), - width = target.outerWidth(), - skip_shift; - - var dir_obj = {}; - - // we use jQuery animate instead of CSS transitions because we - // need a callback to unlock the next animation - // needs support for RTL ** - if (target.index() !== old_index && !/skip/.test(direction)){ - if (/left/.test(direction)) { - this.lock(); - dir_obj[dir] = left + width; - clearing.animate(dir_obj, 300, this.unlock()); - } else if (/right/.test(direction)) { - this.lock(); - dir_obj[dir] = left - width; - clearing.animate(dir_obj, 300, this.unlock()); - } - } else if (/skip/.test(direction)) { - // the target image is not adjacent to the current image, so - // do we scroll right or not - skip_shift = target.index() - this.settings.up_count; - this.lock(); - - if (skip_shift > 0) { - dir_obj[dir] = -(skip_shift * width); - clearing.animate(dir_obj, 300, this.unlock()); - } else { - dir_obj[dir] = 0; - clearing.animate(dir_obj, 300, this.unlock()); - } - } - - callback(); - }, - - direction : function ($el, current, target) { - var lis = this.S('li', $el), - li_width = lis.outerWidth() + (lis.outerWidth() / 4), - up_count = Math.floor(this.S('.clearing-container').outerWidth() / li_width) - 1, - target_index = lis.index(target), - response; - - this.settings.up_count = up_count; - - if (this.adjacent(this.settings.prev_index, target_index)) { - if ((target_index > up_count) && target_index > this.settings.prev_index) { - response = 'right'; - } else if ((target_index > up_count - 1) && target_index <= this.settings.prev_index) { - response = 'left'; - } else { - response = false; - } - } else { - response = 'skip'; - } - - this.settings.prev_index = target_index; - - return response; - }, - - adjacent : function (current_index, target_index) { - for (var i = target_index + 1; i >= target_index - 1; i--) { - if (i === current_index) return true; - } - return false; - }, - - // lock management - - lock : function () { - this.settings.locked = true; - }, - - unlock : function () { - this.settings.locked = false; - }, - - locked : function () { - return this.settings.locked; - }, - - off : function () { - this.S(this.scope).off('.fndtn.clearing'); - this.S(window).off('.fndtn.clearing'); - }, - - reflow : function () { - this.init(); - } - }; - -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - var noop = function() {}; - - var Orbit = function(el, settings) { - // Don't reinitialize plugin - if (el.hasClass(settings.slides_container_class)) { - return this; - } - - var self = this, - container, - slides_container = el, - number_container, - bullets_container, - timer_container, - idx = 0, - animate, - timer, - locked = false, - adjust_height_after = false; - - - self.slides = function() { - return slides_container.children(settings.slide_selector); - }; - - self.slides().first().addClass(settings.active_slide_class); - - self.update_slide_number = function(index) { - if (settings.slide_number) { - number_container.find('span:first').text(parseInt(index)+1); - number_container.find('span:last').text(self.slides().length); - } - if (settings.bullets) { - bullets_container.children().removeClass(settings.bullets_active_class); - $(bullets_container.children().get(index)).addClass(settings.bullets_active_class); - } - }; - - self.update_active_link = function(index) { - var link = $('[data-orbit-link="'+self.slides().eq(index).attr('data-orbit-slide')+'"]'); - link.siblings().removeClass(settings.bullets_active_class); - link.addClass(settings.bullets_active_class); - }; - - self.build_markup = function() { - slides_container.wrap('
        '); - container = slides_container.parent(); - slides_container.addClass(settings.slides_container_class); - - if (settings.stack_on_small) { - container.addClass(settings.stack_on_small_class); - } - - if (settings.navigation_arrows) { - container.append($('').addClass(settings.prev_class)); - container.append($('').addClass(settings.next_class)); - } - - if (settings.timer) { - timer_container = $('
        ').addClass(settings.timer_container_class); - timer_container.append(''); - timer_container.append($('
        ').addClass(settings.timer_progress_class)); - timer_container.addClass(settings.timer_paused_class); - container.append(timer_container); - } - - if (settings.slide_number) { - number_container = $('
        ').addClass(settings.slide_number_class); - number_container.append(' ' + settings.slide_number_text + ' '); - container.append(number_container); - } - - if (settings.bullets) { - bullets_container = $('
          ').addClass(settings.bullets_container_class); - container.append(bullets_container); - bullets_container.wrap('
          '); - self.slides().each(function(idx, el) { - var bullet = $('
        1. ').attr('data-orbit-slide', idx).on('click', self.link_bullet);; - bullets_container.append(bullet); - }); - } - - }; - - self._goto = function(next_idx, start_timer) { - // if (locked) {return false;} - if (next_idx === idx) {return false;} - if (typeof timer === 'object') {timer.restart();} - var slides = self.slides(); - - var dir = 'next'; - locked = true; - if (next_idx < idx) {dir = 'prev';} - if (next_idx >= slides.length) { - if (!settings.circular) return false; - next_idx = 0; - } else if (next_idx < 0) { - if (!settings.circular) return false; - next_idx = slides.length - 1; - } - - var current = $(slides.get(idx)); - var next = $(slides.get(next_idx)); - - current.css('zIndex', 2); - current.removeClass(settings.active_slide_class); - next.css('zIndex', 4).addClass(settings.active_slide_class); - - slides_container.trigger('before-slide-change.fndtn.orbit'); - settings.before_slide_change(); - self.update_active_link(next_idx); - - var callback = function() { - var unlock = function() { - idx = next_idx; - locked = false; - if (start_timer === true) {timer = self.create_timer(); timer.start();} - self.update_slide_number(idx); - slides_container.trigger('after-slide-change.fndtn.orbit',[{slide_number: idx, total_slides: slides.length}]); - settings.after_slide_change(idx, slides.length); - }; - if (slides_container.height() != next.height() && settings.variable_height) { - slides_container.animate({'height': next.height()}, 250, 'linear', unlock); - } else { - unlock(); - } - }; - - if (slides.length === 1) {callback(); return false;} - - var start_animation = function() { - if (dir === 'next') {animate.next(current, next, callback);} - if (dir === 'prev') {animate.prev(current, next, callback);} - }; - - if (next.height() > slides_container.height() && settings.variable_height) { - slides_container.animate({'height': next.height()}, 250, 'linear', start_animation); - } else { - start_animation(); - } - }; - - self.next = function(e) { - e.stopImmediatePropagation(); - e.preventDefault(); - self._goto(idx + 1); - }; - - self.prev = function(e) { - e.stopImmediatePropagation(); - e.preventDefault(); - self._goto(idx - 1); - }; - - self.link_custom = function(e) { - e.preventDefault(); - var link = $(this).attr('data-orbit-link'); - if ((typeof link === 'string') && (link = $.trim(link)) != '') { - var slide = container.find('[data-orbit-slide='+link+']'); - if (slide.index() != -1) {self._goto(slide.index());} - } - }; - - self.link_bullet = function(e) { - var index = $(this).attr('data-orbit-slide'); - if ((typeof index === 'string') && (index = $.trim(index)) != '') { - if(isNaN(parseInt(index))) - { - var slide = container.find('[data-orbit-slide='+index+']'); - if (slide.index() != -1) {self._goto(slide.index() + 1);} - } - else - { - self._goto(parseInt(index)); - } - } - - } - - self.timer_callback = function() { - self._goto(idx + 1, true); - } - - self.compute_dimensions = function() { - var current = $(self.slides().get(idx)); - var h = current.height(); - if (!settings.variable_height) { - self.slides().each(function(){ - if ($(this).height() > h) { h = $(this).height(); } - }); - } - slides_container.height(h); - }; - - self.create_timer = function() { - var t = new Timer( - container.find('.'+settings.timer_container_class), - settings, - self.timer_callback - ); - return t; - }; - - self.stop_timer = function() { - if (typeof timer === 'object') timer.stop(); - }; - - self.toggle_timer = function() { - var t = container.find('.'+settings.timer_container_class); - if (t.hasClass(settings.timer_paused_class)) { - if (typeof timer === 'undefined') {timer = self.create_timer();} - timer.start(); - } - else { - if (typeof timer === 'object') {timer.stop();} - } - }; - - self.init = function() { - self.build_markup(); - if (settings.timer) { - timer = self.create_timer(); - Foundation.utils.image_loaded(this.slides().children('img'), timer.start); - } - animate = new FadeAnimation(settings, slides_container); - if (settings.animation === 'slide') - animate = new SlideAnimation(settings, slides_container); - - container.on('click', '.'+settings.next_class, self.next); - container.on('click', '.'+settings.prev_class, self.prev); - - if (settings.next_on_click) { - container.on('click', '.'+settings.slides_container_class+' [data-orbit-slide]', self.link_bullet); - } - - container.on('click', self.toggle_timer); - if (settings.swipe) { - container.on('touchstart.fndtn.orbit', function(e) { - if (!e.touches) {e = e.originalEvent;} - var data = { - start_page_x: e.touches[0].pageX, - start_page_y: e.touches[0].pageY, - start_time: (new Date()).getTime(), - delta_x: 0, - is_scrolling: undefined - }; - container.data('swipe-transition', data); - e.stopPropagation(); - }) - .on('touchmove.fndtn.orbit', function(e) { - if (!e.touches) { e = e.originalEvent; } - // Ignore pinch/zoom events - if(e.touches.length > 1 || e.scale && e.scale !== 1) return; - - var data = container.data('swipe-transition'); - if (typeof data === 'undefined') {data = {};} - - data.delta_x = e.touches[0].pageX - data.start_page_x; - - if ( typeof data.is_scrolling === 'undefined') { - data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) ); - } - - if (!data.is_scrolling && !data.active) { - e.preventDefault(); - var direction = (data.delta_x < 0) ? (idx+1) : (idx-1); - data.active = true; - self._goto(direction); - } - }) - .on('touchend.fndtn.orbit', function(e) { - container.data('swipe-transition', {}); - e.stopPropagation(); - }) - } - container.on('mouseenter.fndtn.orbit', function(e) { - if (settings.timer && settings.pause_on_hover) { - self.stop_timer(); - } - }) - .on('mouseleave.fndtn.orbit', function(e) { - if (settings.timer && settings.resume_on_mouseout) { - timer.start(); - } - }); - - $(document).on('click', '[data-orbit-link]', self.link_custom); - $(window).on('load resize', self.compute_dimensions); - Foundation.utils.image_loaded(this.slides().children('img'), self.compute_dimensions); - Foundation.utils.image_loaded(this.slides().children('img'), function() { - container.prev('.'+settings.preloader_class).css('display', 'none'); - self.update_slide_number(0); - self.update_active_link(0); - slides_container.trigger('ready.fndtn.orbit'); - }); - }; - - self.init(); - }; - - var Timer = function(el, settings, callback) { - var self = this, - duration = settings.timer_speed, - progress = el.find('.'+settings.timer_progress_class), - start, - timeout, - left = -1; - - this.update_progress = function(w) { - var new_progress = progress.clone(); - new_progress.attr('style', ''); - new_progress.css('width', w+'%'); - progress.replaceWith(new_progress); - progress = new_progress; - }; - - this.restart = function() { - clearTimeout(timeout); - el.addClass(settings.timer_paused_class); - left = -1; - self.update_progress(0); - }; - - this.start = function() { - if (!el.hasClass(settings.timer_paused_class)) {return true;} - left = (left === -1) ? duration : left; - el.removeClass(settings.timer_paused_class); - start = new Date().getTime(); - progress.animate({'width': '100%'}, left, 'linear'); - timeout = setTimeout(function() { - self.restart(); - callback(); - }, left); - el.trigger('timer-started.fndtn.orbit') - }; - - this.stop = function() { - if (el.hasClass(settings.timer_paused_class)) {return true;} - clearTimeout(timeout); - el.addClass(settings.timer_paused_class); - var end = new Date().getTime(); - left = left - (end - start); - var w = 100 - ((left / duration) * 100); - self.update_progress(w); - el.trigger('timer-stopped.fndtn.orbit'); - }; - }; - - var SlideAnimation = function(settings, container) { - var duration = settings.animation_speed; - var is_rtl = ($('html[dir=rtl]').length === 1); - var margin = is_rtl ? 'marginRight' : 'marginLeft'; - var animMargin = {}; - animMargin[margin] = '0%'; - - this.next = function(current, next, callback) { - current.animate({marginLeft:'-100%'}, duration); - next.animate(animMargin, duration, function() { - current.css(margin, '100%'); - callback(); - }); - }; - - this.prev = function(current, prev, callback) { - current.animate({marginLeft:'100%'}, duration); - prev.css(margin, '-100%'); - prev.animate(animMargin, duration, function() { - current.css(margin, '100%'); - callback(); - }); - }; - }; - - var FadeAnimation = function(settings, container) { - var duration = settings.animation_speed; - var is_rtl = ($('html[dir=rtl]').length === 1); - var margin = is_rtl ? 'marginRight' : 'marginLeft'; - - this.next = function(current, next, callback) { - next.css({'margin':'0%', 'opacity':'0.01'}); - next.animate({'opacity':'1'}, duration, 'linear', function() { - current.css('margin', '100%'); - callback(); - }); - }; - - this.prev = function(current, prev, callback) { - prev.css({'margin':'0%', 'opacity':'0.01'}); - prev.animate({'opacity':'1'}, duration, 'linear', function() { - current.css('margin', '100%'); - callback(); - }); - }; - }; - - - Foundation.libs = Foundation.libs || {}; - - Foundation.libs.orbit = { - name: 'orbit', - - version: '5.5.0', - - settings: { - animation: 'slide', - timer_speed: 10000, - pause_on_hover: true, - resume_on_mouseout: false, - next_on_click: true, - animation_speed: 500, - stack_on_small: false, - navigation_arrows: true, - slide_number: true, - slide_number_text: 'of', - container_class: 'orbit-container', - stack_on_small_class: 'orbit-stack-on-small', - next_class: 'orbit-next', - prev_class: 'orbit-prev', - timer_container_class: 'orbit-timer', - timer_paused_class: 'paused', - timer_progress_class: 'orbit-progress', - slides_container_class: 'orbit-slides-container', - preloader_class: 'preloader', - slide_selector: '*', - bullets_container_class: 'orbit-bullets', - bullets_active_class: 'active', - slide_number_class: 'orbit-slide-number', - caption_class: 'orbit-caption', - active_slide_class: 'active', - orbit_transition_class: 'orbit-transitioning', - bullets: true, - circular: true, - timer: true, - variable_height: false, - swipe: true, - before_slide_change: noop, - after_slide_change: noop - }, - - init : function (scope, method, options) { - var self = this; - this.bindings(method, options); - }, - - events : function (instance) { - var orbit_instance = new Orbit(this.S(instance), this.S(instance).data('orbit-init')); - this.S(instance).data(this.name + '-instance', orbit_instance); - }, - - reflow : function () { - var self = this; - - if (self.S(self.scope).is('[data-orbit]')) { - var $el = self.S(self.scope); - var instance = $el.data(self.name + '-instance'); - instance.compute_dimensions(); - } else { - self.S('[data-orbit]', self.scope).each(function(idx, el) { - var $el = self.S(el); - var opts = self.data_options($el); - var instance = $el.data(self.name + '-instance'); - instance.compute_dimensions(); - }); - } - } - }; - - -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.offcanvas = { - name : 'offcanvas', - - version : '5.5.0', - - settings : { - open_method: 'move', - close_on_click: false - }, - - init : function (scope, method, options) { - this.bindings(method, options); - }, - - events : function () { - var self = this, - S = self.S, - move_class = '', - right_postfix = '', - left_postfix = ''; - - if (this.settings.open_method === 'move') { - move_class = 'move-'; - right_postfix = 'right'; - left_postfix = 'left'; - } else if (this.settings.open_method === 'overlap_single') { - move_class = 'offcanvas-overlap-'; - right_postfix = 'right'; - left_postfix = 'left'; - } else if (this.settings.open_method === 'overlap') { - move_class = 'offcanvas-overlap'; - } - - S(this.scope).off('.offcanvas') - .on('click.fndtn.offcanvas', '.left-off-canvas-toggle', function (e) { - self.click_toggle_class(e, move_class + right_postfix); - if (self.settings.open_method !== 'overlap'){ - S('.left-submenu').removeClass(move_class + right_postfix); - } - $('.left-off-canvas-toggle').attr('aria-expanded', 'true'); - }) - .on('click.fndtn.offcanvas', '.left-off-canvas-menu a', function (e) { - var settings = self.get_settings(e); - var parent = S(this).parent(); - - if(settings.close_on_click && !parent.hasClass('has-submenu') && !parent.hasClass('back')){ - self.hide.call(self, move_class + right_postfix, self.get_wrapper(e)); - parent.parent().removeClass(move_class + right_postfix); - }else if(S(this).parent().hasClass('has-submenu')){ - e.preventDefault(); - S(this).siblings('.left-submenu').toggleClass(move_class + right_postfix); - }else if(parent.hasClass('back')){ - e.preventDefault(); - parent.parent().removeClass(move_class + right_postfix); - } - $('.left-off-canvas-toggle').attr('aria-expanded', 'true'); - }) - .on('click.fndtn.offcanvas', '.right-off-canvas-toggle', function (e) { - self.click_toggle_class(e, move_class + left_postfix); - if (self.settings.open_method !== 'overlap'){ - S('.right-submenu').removeClass(move_class + left_postfix); - } - $('.right-off-canvas-toggle').attr('aria-expanded', 'true'); - }) - .on('click.fndtn.offcanvas', '.right-off-canvas-menu a', function (e) { - var settings = self.get_settings(e); - var parent = S(this).parent(); - - if(settings.close_on_click && !parent.hasClass('has-submenu') && !parent.hasClass('back')){ - self.hide.call(self, move_class + left_postfix, self.get_wrapper(e)); - parent.parent().removeClass(move_class + left_postfix); - }else if(S(this).parent().hasClass('has-submenu')){ - e.preventDefault(); - S(this).siblings('.right-submenu').toggleClass(move_class + left_postfix); - }else if(parent.hasClass('back')){ - e.preventDefault(); - parent.parent().removeClass(move_class + left_postfix); - } - $('.right-off-canvas-toggle').attr('aria-expanded', 'true'); - }) - .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) { - self.click_remove_class(e, move_class + left_postfix); - S('.right-submenu').removeClass(move_class + left_postfix); - if (right_postfix){ - self.click_remove_class(e, move_class + right_postfix); - S('.left-submenu').removeClass(move_class + left_postfix); - } - $('.right-off-canvas-toggle').attr('aria-expanded', 'true'); - }) - .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) { - self.click_remove_class(e, move_class + left_postfix); - $('.left-off-canvas-toggle').attr('aria-expanded', 'false'); - if (right_postfix) { - self.click_remove_class(e, move_class + right_postfix); - $('.right-off-canvas-toggle').attr('aria-expanded', 'false'); - } - }); - }, - - toggle: function(class_name, $off_canvas) { - $off_canvas = $off_canvas || this.get_wrapper(); - if ($off_canvas.is('.' + class_name)) { - this.hide(class_name, $off_canvas); - } else { - this.show(class_name, $off_canvas); - } - }, - - show: function(class_name, $off_canvas) { - $off_canvas = $off_canvas || this.get_wrapper(); - $off_canvas.trigger('open').trigger('open.fndtn.offcanvas'); - $off_canvas.addClass(class_name); - }, - - hide: function(class_name, $off_canvas) { - $off_canvas = $off_canvas || this.get_wrapper(); - $off_canvas.trigger('close').trigger('close.fndtn.offcanvas'); - $off_canvas.removeClass(class_name); - }, - - click_toggle_class: function(e, class_name) { - e.preventDefault(); - var $off_canvas = this.get_wrapper(e); - this.toggle(class_name, $off_canvas); - }, - - click_remove_class: function(e, class_name) { - e.preventDefault(); - var $off_canvas = this.get_wrapper(e); - this.hide(class_name, $off_canvas); - }, - - get_settings: function(e) { - var offcanvas = this.S(e.target).closest('[' + this.attr_name() + ']'); - return offcanvas.data(this.attr_name(true) + '-init') || this.settings; - }, - - get_wrapper: function(e) { - var $off_canvas = this.S(e ? e.target : this.scope).closest('.off-canvas-wrap'); - - if ($off_canvas.length === 0) { - $off_canvas = this.S('.off-canvas-wrap'); - } - return $off_canvas; - }, - - reflow : function () {} - }; -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.alert = { - name : 'alert', - - version : '5.5.0', - - settings : { - callback: function (){} - }, - - init : function (scope, method, options) { - this.bindings(method, options); - }, - - events : function () { - var self = this, - S = this.S; - - $(this.scope).off('.alert').on('click.fndtn.alert', '[' + this.attr_name() + '] .close', function (e) { - var alertBox = S(this).closest('[' + self.attr_name() + ']'), - settings = alertBox.data(self.attr_name(true) + '-init') || self.settings; - - e.preventDefault(); - if (Modernizr.csstransitions) { - alertBox.addClass('alert-close'); - alertBox.on('transitionend webkitTransitionEnd oTransitionEnd', function(e) { - S(this).trigger('close').trigger('close.fndtn.alert').remove(); - settings.callback(); - }); - } else { - alertBox.fadeOut(300, function () { - S(this).trigger('close').trigger('close.fndtn.alert').remove(); - settings.callback(); - }); - } - }); - }, - - reflow : function () {} - }; -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.reveal = { - name : 'reveal', - - version : '5.5.0', - - locked : false, - - settings : { - animation: 'fadeAndPop', - animation_speed: 250, - close_on_background_click: true, - close_on_esc: true, - dismiss_modal_class: 'close-reveal-modal', - bg_class: 'reveal-modal-bg', - bg_root_element: 'body', - root_element: 'body', - open: function(){}, - opened: function(){}, - close: function(){}, - closed: function(){}, - bg : $('.reveal-modal-bg'), - css : { - open : { - 'opacity': 0, - 'visibility': 'visible', - 'display' : 'block' - }, - close : { - 'opacity': 1, - 'visibility': 'hidden', - 'display': 'none' - } - } - }, - - init : function (scope, method, options) { - $.extend(true, this.settings, method, options); - this.bindings(method, options); - }, - - events : function (scope) { - var self = this, - S = self.S; - - S(this.scope) - .off('.reveal') - .on('click.fndtn.reveal', '[' + this.add_namespace('data-reveal-id') + ']:not([disabled])', function (e) { - e.preventDefault(); - - if (!self.locked) { - var element = S(this), - ajax = element.data(self.data_attr('reveal-ajax')); - - self.locked = true; - - if (typeof ajax === 'undefined') { - self.open.call(self, element); - } else { - var url = ajax === true ? element.attr('href') : ajax; - - self.open.call(self, element, {url: url}); - } - } - }); - - S(document) - .on('click.fndtn.reveal', this.close_targets(), function (e) { - - e.preventDefault(); - - if (!self.locked) { - var settings = S('[' + self.attr_name() + '].open').data(self.attr_name(true) + '-init') || self.settings, - bg_clicked = S(e.target)[0] === S('.' + settings.bg_class)[0]; - - if (bg_clicked) { - if (settings.close_on_background_click) { - e.stopPropagation(); - } else { - return; - } - } - - self.locked = true; - self.close.call(self, bg_clicked ? S('[' + self.attr_name() + '].open') : S(this).closest('[' + self.attr_name() + ']')); - } - }); - - if(S('[' + self.attr_name() + ']', this.scope).length > 0) { - S(this.scope) - // .off('.reveal') - .on('open.fndtn.reveal', this.settings.open) - .on('opened.fndtn.reveal', this.settings.opened) - .on('opened.fndtn.reveal', this.open_video) - .on('close.fndtn.reveal', this.settings.close) - .on('closed.fndtn.reveal', this.settings.closed) - .on('closed.fndtn.reveal', this.close_video); - } else { - S(this.scope) - // .off('.reveal') - .on('open.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.open) - .on('opened.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.opened) - .on('opened.fndtn.reveal', '[' + self.attr_name() + ']', this.open_video) - .on('close.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.close) - .on('closed.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.closed) - .on('closed.fndtn.reveal', '[' + self.attr_name() + ']', this.close_video); - } - - return true; - }, - - // PATCH #3: turning on key up capture only when a reveal window is open - key_up_on : function (scope) { - var self = this; - - // PATCH #1: fixing multiple keyup event trigger from single key press - self.S('body').off('keyup.fndtn.reveal').on('keyup.fndtn.reveal', function ( event ) { - var open_modal = self.S('[' + self.attr_name() + '].open'), - settings = open_modal.data(self.attr_name(true) + '-init') || self.settings ; - // PATCH #2: making sure that the close event can be called only while unlocked, - // so that multiple keyup.fndtn.reveal events don't prevent clean closing of the reveal window. - if ( settings && event.which === 27 && settings.close_on_esc && !self.locked) { // 27 is the keycode for the Escape key - self.close.call(self, open_modal); - } - }); - - return true; - }, - - // PATCH #3: turning on key up capture only when a reveal window is open - key_up_off : function (scope) { - this.S('body').off('keyup.fndtn.reveal'); - return true; - }, - - - open : function (target, ajax_settings) { - var self = this, - modal; - - if (target) { - if (typeof target.selector !== 'undefined') { - // Find the named node; only use the first one found, since the rest of the code assumes there's only one node - modal = self.S('#' + target.data(self.data_attr('reveal-id'))).first(); - } else { - modal = self.S(this.scope); - - ajax_settings = target; - } - } else { - modal = self.S(this.scope); - } - - var settings = modal.data(self.attr_name(true) + '-init'); - settings = settings || this.settings; - - - if (modal.hasClass('open') && target.attr('data-reveal-id') == modal.attr('id')) { - return self.close(modal); - } - - if (!modal.hasClass('open')) { - var open_modal = self.S('[' + self.attr_name() + '].open'); - - if (typeof modal.data('css-top') === 'undefined') { - modal.data('css-top', parseInt(modal.css('top'), 10)) - .data('offset', this.cache_offset(modal)); - } - - this.key_up_on(modal); // PATCH #3: turning on key up capture only when a reveal window is open - modal.trigger('open').trigger('open.fndtn.reveal'); - - if (open_modal.length < 1) { - this.toggle_bg(modal, true); - } - - if (typeof ajax_settings === 'string') { - ajax_settings = { - url: ajax_settings - }; - } - - if (typeof ajax_settings === 'undefined' || !ajax_settings.url) { - if (open_modal.length > 0) { - this.hide(open_modal, settings.css.close); - } - - this.show(modal, settings.css.open); - } else { - var old_success = typeof ajax_settings.success !== 'undefined' ? ajax_settings.success : null; - - $.extend(ajax_settings, { - success: function (data, textStatus, jqXHR) { - if ( $.isFunction(old_success) ) { - var result = old_success(data, textStatus, jqXHR); - if (typeof result == 'string') data = result; - } - - modal.html(data); - self.S(modal).foundation('section', 'reflow'); - self.S(modal).children().foundation(); - - if (open_modal.length > 0) { - self.hide(open_modal, settings.css.close); - } - self.show(modal, settings.css.open); - } - }); - - $.ajax(ajax_settings); - } - } - self.S(window).trigger('resize'); - }, - - close : function (modal) { - var modal = modal && modal.length ? modal : this.S(this.scope), - open_modals = this.S('[' + this.attr_name() + '].open'), - settings = modal.data(this.attr_name(true) + '-init') || this.settings; - - if (open_modals.length > 0) { - this.locked = true; - this.key_up_off(modal); // PATCH #3: turning on key up capture only when a reveal window is open - modal.trigger('close').trigger('close.fndtn.reveal'); - this.toggle_bg(modal, false); - this.hide(open_modals, settings.css.close, settings); - } - }, - - close_targets : function () { - var base = '.' + this.settings.dismiss_modal_class; - - if (this.settings.close_on_background_click) { - return base + ', .' + this.settings.bg_class; - } - - return base; - }, - - toggle_bg : function (el, modal, state) { - var settings = el.data(this.attr_name(true) + '-init') || this.settings, - bg_root_element = settings.bg_root_element; // Adding option to specify the background root element fixes scrolling issue - - if (this.S('.' + this.settings.bg_class).length === 0) { - this.settings.bg = $('
          ', {'class': this.settings.bg_class}) - .appendTo(bg_root_element).hide(); - } - - var visible = this.settings.bg.filter(':visible').length > 0; - if ( state != visible ) { - if ( state == undefined ? visible : !state ) { - this.hide(this.settings.bg); - } else { - this.show(this.settings.bg); - } - } - }, - - show : function (el, css) { - // is modal - if (css) { - var settings = el.data(this.attr_name(true) + '-init') || this.settings, - root_element = settings.root_element; - - if (el.parent(root_element).length === 0) { - var placeholder = el.wrap('
          ').parent(); - - el.on('closed.fndtn.reveal.wrapped', function() { - el.detach().appendTo(placeholder); - el.unwrap().unbind('closed.fndtn.reveal.wrapped'); - }); - - el.detach().appendTo(root_element); - } - - var animData = getAnimationData(settings.animation); - if (!animData.animate) { - this.locked = false; - } - if (animData.pop) { - css.top = $(root_element).scrollTop() - el.data('offset') + 'px'; //adding root_element instead of window for scrolling offset if modal trigger is below the fold - var end_css = { - top: $(root_element).scrollTop() + el.data('css-top') + 'px', //adding root_element instead of window for scrolling offset if modal trigger is below the fold - opacity: 1 - }; - - return setTimeout(function () { - return el - .css(css) - .animate(end_css, settings.animation_speed, 'linear', function () { - this.locked = false; - el.trigger('opened').trigger('opened.fndtn.reveal'); - }.bind(this)) - .addClass('open'); - }.bind(this), settings.animation_speed / 2); - } - - if (animData.fade) { - css.top = $(root_element).scrollTop() + el.data('css-top') + 'px'; //adding root_element instead of window for scrolling offset if modal trigger is below the fold - var end_css = {opacity: 1}; - - return setTimeout(function () { - return el - .css(css) - .animate(end_css, settings.animation_speed, 'linear', function () { - this.locked = false; - el.trigger('opened').trigger('opened.fndtn.reveal'); - }.bind(this)) - .addClass('open'); - }.bind(this), settings.animation_speed / 2); - } - - return el.css(css).show().css({opacity: 1}).addClass('open').trigger('opened').trigger('opened.fndtn.reveal'); - } - - var settings = this.settings; - - // should we animate the background? - if (getAnimationData(settings.animation).fade) { - return el.fadeIn(settings.animation_speed / 2); - } - - this.locked = false; - - return el.show(); - }, - - hide : function (el, css) { - // is modal - if (css) { - var settings = el.data(this.attr_name(true) + '-init') || this.settings, - root_element = settings.root_element; - - var animData = getAnimationData(settings.animation); - if (!animData.animate) { - this.locked = false; - } - if (animData.pop) { - var end_css = { - top: - $(root_element).scrollTop() - el.data('offset') + 'px', //adding root_element instead of window for scrolling offset if modal trigger is below the fold - opacity: 0 - }; - - return setTimeout(function () { - return el - .animate(end_css, settings.animation_speed, 'linear', function () { - this.locked = false; - el.css(css).trigger('closed').trigger('closed.fndtn.reveal'); - }.bind(this)) - .removeClass('open'); - }.bind(this), settings.animation_speed / 2); - } - - if (animData.fade) { - var end_css = {opacity: 0}; - - return setTimeout(function () { - return el - .animate(end_css, settings.animation_speed, 'linear', function () { - this.locked = false; - el.css(css).trigger('closed').trigger('closed.fndtn.reveal'); - }.bind(this)) - .removeClass('open'); - }.bind(this), settings.animation_speed / 2); - } - - return el.hide().css(css).removeClass('open').trigger('closed').trigger('closed.fndtn.reveal'); - } - - var settings = this.settings; - - // should we animate the background? - if (getAnimationData(settings.animation).fade) { - return el.fadeOut(settings.animation_speed / 2); - } - - return el.hide(); - }, - - close_video : function (e) { - var video = $('.flex-video', e.target), - iframe = $('iframe', video); - - if (iframe.length > 0) { - iframe.attr('data-src', iframe[0].src); - iframe.attr('src', iframe.attr('src')); - video.hide(); - } - }, - - open_video : function (e) { - var video = $('.flex-video', e.target), - iframe = video.find('iframe'); - - if (iframe.length > 0) { - var data_src = iframe.attr('data-src'); - if (typeof data_src === 'string') { - iframe[0].src = iframe.attr('data-src'); - } else { - var src = iframe[0].src; - iframe[0].src = undefined; - iframe[0].src = src; - } - video.show(); - } - }, - - data_attr: function (str) { - if (this.namespace.length > 0) { - return this.namespace + '-' + str; - } - - return str; - }, - - cache_offset : function (modal) { - var offset = modal.show().height() + parseInt(modal.css('top'), 10); - - modal.hide(); - - return offset; - }, - - off : function () { - $(this.scope).off('.fndtn.reveal'); - }, - - reflow : function () {} - }; - - /* - * getAnimationData('popAndFade') // {animate: true, pop: true, fade: true} - * getAnimationData('fade') // {animate: true, pop: false, fade: true} - * getAnimationData('pop') // {animate: true, pop: true, fade: false} - * getAnimationData('foo') // {animate: false, pop: false, fade: false} - * getAnimationData(null) // {animate: false, pop: false, fade: false} - */ - function getAnimationData(str) { - var fade = /fade/i.test(str); - var pop = /pop/i.test(str); - return { - animate: fade || pop, - pop: pop, - fade: fade - }; - } -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.interchange = { - name : 'interchange', - - version : '5.5.0', - - cache : {}, - - images_loaded : false, - nodes_loaded : false, - - settings : { - load_attr : 'interchange', - - named_queries : { - 'default' : 'only screen', - 'small' : Foundation.media_queries['small'], - 'small-only' : Foundation.media_queries['small-only'], - 'medium' : Foundation.media_queries['medium'], - 'medium-only' : Foundation.media_queries['medium-only'], - 'large' : Foundation.media_queries['large'], - 'large-only' : Foundation.media_queries['large-only'], - 'xlarge' : Foundation.media_queries['xlarge'], - 'xlarge-only' : Foundation.media_queries['xlarge-only'], - 'xxlarge' : Foundation.media_queries['xxlarge'], - 'landscape' : 'only screen and (orientation: landscape)', - 'portrait' : 'only screen and (orientation: portrait)', - 'retina' : 'only screen and (-webkit-min-device-pixel-ratio: 2),' + - 'only screen and (min--moz-device-pixel-ratio: 2),' + - 'only screen and (-o-min-device-pixel-ratio: 2/1),' + - 'only screen and (min-device-pixel-ratio: 2),' + - 'only screen and (min-resolution: 192dpi),' + - 'only screen and (min-resolution: 2dppx)' - }, - - directives : { - replace: function (el, path, trigger) { - // The trigger argument, if called within the directive, fires - // an event named after the directive on the element, passing - // any parameters along to the event that you pass to trigger. - // - // ex. trigger(), trigger([a, b, c]), or trigger(a, b, c) - // - // This allows you to bind a callback like so: - // $('#interchangeContainer').on('replace', function (e, a, b, c) { - // console.log($(this).html(), a, b, c); - // }); - - if (/IMG/.test(el[0].nodeName)) { - var orig_path = el[0].src; - - if (new RegExp(path, 'i').test(orig_path)) return; - - el[0].src = path; - - return trigger(el[0].src); - } - var last_path = el.data(this.data_attr + '-last-path'), - self = this; - - if (last_path == path) return; - - if (/\.(gif|jpg|jpeg|tiff|png)([?#].*)?/i.test(path)) { - $(el).css('background-image', 'url('+path+')'); - el.data('interchange-last-path', path); - return trigger(path); - } - - return $.get(path, function (response) { - el.html(response); - el.data(self.data_attr + '-last-path', path); - trigger(); - }); - - } - } - }, - - init : function (scope, method, options) { - Foundation.inherit(this, 'throttle random_str'); - - this.data_attr = this.set_data_attr(); - $.extend(true, this.settings, method, options); - this.bindings(method, options); - this.load('images'); - this.load('nodes'); - }, - - get_media_hash : function() { - var mediaHash=''; - for (var queryName in this.settings.named_queries ) { - mediaHash += matchMedia(this.settings.named_queries[queryName]).matches.toString(); - } - return mediaHash; - }, - - events : function () { - var self = this, prevMediaHash; - - $(window) - .off('.interchange') - .on('resize.fndtn.interchange', self.throttle(function () { - var currMediaHash = self.get_media_hash(); - if (currMediaHash !== prevMediaHash) { - self.resize(); - } - prevMediaHash = currMediaHash; - }, 50)); - - return this; - }, - - resize : function () { - var cache = this.cache; - - if(!this.images_loaded || !this.nodes_loaded) { - setTimeout($.proxy(this.resize, this), 50); - return; - } - - for (var uuid in cache) { - if (cache.hasOwnProperty(uuid)) { - var passed = this.results(uuid, cache[uuid]); - - if (passed) { - this.settings.directives[passed - .scenario[1]].call(this, passed.el, passed.scenario[0], function () { - if (arguments[0] instanceof Array) { - var args = arguments[0]; - } else { - var args = Array.prototype.slice.call(arguments, 0); - } - - passed.el.trigger(passed.scenario[1], args); - }); - } - } - } - - }, - - results : function (uuid, scenarios) { - var count = scenarios.length; - - if (count > 0) { - var el = this.S('[' + this.add_namespace('data-uuid') + '="' + uuid + '"]'); - - while (count--) { - var mq, rule = scenarios[count][2]; - if (this.settings.named_queries.hasOwnProperty(rule)) { - mq = matchMedia(this.settings.named_queries[rule]); - } else { - mq = matchMedia(rule); - } - if (mq.matches) { - return {el: el, scenario: scenarios[count]}; - } - } - } - - return false; - }, - - load : function (type, force_update) { - if (typeof this['cached_' + type] === 'undefined' || force_update) { - this['update_' + type](); - } - - return this['cached_' + type]; - }, - - update_images : function () { - var images = this.S('img[' + this.data_attr + ']'), - count = images.length, - i = count, - loaded_count = 0, - data_attr = this.data_attr; - - this.cache = {}; - this.cached_images = []; - this.images_loaded = (count === 0); - - while (i--) { - loaded_count++; - if (images[i]) { - var str = images[i].getAttribute(data_attr) || ''; - - if (str.length > 0) { - this.cached_images.push(images[i]); - } - } - - if (loaded_count === count) { - this.images_loaded = true; - this.enhance('images'); - } - } - - return this; - }, - - update_nodes : function () { - var nodes = this.S('[' + this.data_attr + ']').not('img'), - count = nodes.length, - i = count, - loaded_count = 0, - data_attr = this.data_attr; - - this.cached_nodes = []; - this.nodes_loaded = (count === 0); - - - while (i--) { - loaded_count++; - var str = nodes[i].getAttribute(data_attr) || ''; - - if (str.length > 0) { - this.cached_nodes.push(nodes[i]); - } - - if(loaded_count === count) { - this.nodes_loaded = true; - this.enhance('nodes'); - } - } - - return this; - }, - - enhance : function (type) { - var i = this['cached_' + type].length; - - while (i--) { - this.object($(this['cached_' + type][i])); - } - - return $(window).trigger('resize').trigger('resize.fndtn.interchange'); - }, - - convert_directive : function (directive) { - - var trimmed = this.trim(directive); - - if (trimmed.length > 0) { - return trimmed; - } - - return 'replace'; - }, - - parse_scenario : function (scenario) { - // This logic had to be made more complex since some users were using commas in the url path - // So we cannot simply just split on a comma - var directive_match = scenario[0].match(/(.+),\s*(\w+)\s*$/), - media_query = scenario[1]; - - if (directive_match) { - var path = directive_match[1], - directive = directive_match[2]; - } - else { - var cached_split = scenario[0].split(/,\s*$/), - path = cached_split[0], - directive = ''; - } - - return [this.trim(path), this.convert_directive(directive), this.trim(media_query)]; - }, - - object : function(el) { - var raw_arr = this.parse_data_attr(el), - scenarios = [], - i = raw_arr.length; - - if (i > 0) { - while (i--) { - var split = raw_arr[i].split(/\((.*?)(\))$/); - - if (split.length > 1) { - var params = this.parse_scenario(split); - scenarios.push(params); - } - } - } - - return this.store(el, scenarios); - }, - - store : function (el, scenarios) { - var uuid = this.random_str(), - current_uuid = el.data(this.add_namespace('uuid', true)); - - if (this.cache[current_uuid]) return this.cache[current_uuid]; - - el.attr(this.add_namespace('data-uuid'), uuid); - - return this.cache[uuid] = scenarios; - }, - - trim : function(str) { - - if (typeof str === 'string') { - return $.trim(str); - } - - return str; - }, - - set_data_attr: function (init) { - if (init) { - if (this.namespace.length > 0) { - return this.namespace + '-' + this.settings.load_attr; - } - - return this.settings.load_attr; - } - - if (this.namespace.length > 0) { - return 'data-' + this.namespace + '-' + this.settings.load_attr; - } - - return 'data-' + this.settings.load_attr; - }, - - parse_data_attr : function (el) { - var raw = el.attr(this.attr_name()).split(/\[(.*?)\]/), - i = raw.length, - output = []; - - while (i--) { - if (raw[i].replace(/[\W\d]+/, '').length > 4) { - output.push(raw[i]); - } - } - - return output; - }, - - reflow : function () { - this.load('images', true); - this.load('nodes', true); - } - - }; - -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs['magellan-expedition'] = { - name : 'magellan-expedition', - - version : '5.5.0', - - settings : { - active_class: 'active', - threshold: 0, // pixels from the top of the expedition for it to become fixes - destination_threshold: 20, // pixels from the top of destination for it to be considered active - throttle_delay: 30, // calculation throttling to increase framerate - fixed_top: 0, // top distance in pixels assigend to the fixed element on scroll - offset_by_height: true, // whether to offset the destination by the expedition height. Usually you want this to be true, unless your expedition is on the side. - duration: 700, // animation duration time - easing: 'swing' // animation easing - }, - - init : function (scope, method, options) { - Foundation.inherit(this, 'throttle'); - this.bindings(method, options); - }, - - events : function () { - var self = this, - S = self.S, - settings = self.settings; - - // initialize expedition offset - self.set_expedition_position(); - - S(self.scope) - .off('.magellan') - .on('click.fndtn.magellan', '[' + self.add_namespace('data-magellan-arrival') + '] a[href^="#"]', function (e) { - e.preventDefault(); - var expedition = $(this).closest('[' + self.attr_name() + ']'), - settings = expedition.data('magellan-expedition-init'), - hash = this.hash.split('#').join(''), - target = $('a[name="'+hash+'"]'); - - if (target.length === 0) { - target = $('#'+hash); - - } - - - // Account for expedition height if fixed position - var scroll_top = target.offset().top - settings.destination_threshold + 1; - if (settings.offset_by_height) { - scroll_top = scroll_top - expedition.outerHeight(); - } - - $('html, body').stop().animate({ - 'scrollTop': scroll_top - }, settings.duration, settings.easing, function () { - if(history.pushState) { - history.pushState(null, null, '#'+hash); - } - else { - location.hash = '#'+hash; - } - }); - }) - .on('scroll.fndtn.magellan', self.throttle(this.check_for_arrivals.bind(this), settings.throttle_delay)); - - $(window) - .on('resize.fndtn.magellan', self.throttle(this.set_expedition_position.bind(this), settings.throttle_delay)); - }, - - check_for_arrivals : function() { - var self = this; - self.update_arrivals(); - self.update_expedition_positions(); - }, - - set_expedition_position : function() { - var self = this; - $('[' + this.attr_name() + '=fixed]', self.scope).each(function(idx, el) { - var expedition = $(this), - settings = expedition.data('magellan-expedition-init'), - styles = expedition.attr('styles'), // save styles - top_offset, fixed_top; - - expedition.attr('style', ''); - top_offset = expedition.offset().top + settings.threshold; - - //set fixed-top by attribute - fixed_top = parseInt(expedition.data('magellan-fixed-top')); - if(!isNaN(fixed_top)) - self.settings.fixed_top = fixed_top; - - expedition.data(self.data_attr('magellan-top-offset'), top_offset); - expedition.attr('style', styles); - }); - }, - - update_expedition_positions : function() { - var self = this, - window_top_offset = $(window).scrollTop(); - - $('[' + this.attr_name() + '=fixed]', self.scope).each(function() { - var expedition = $(this), - settings = expedition.data('magellan-expedition-init'), - styles = expedition.attr('style'), // save styles - top_offset = expedition.data('magellan-top-offset'); - - //scroll to the top distance - if (window_top_offset+self.settings.fixed_top >= top_offset) { - // Placeholder allows height calculations to be consistent even when - // appearing to switch between fixed/non-fixed placement - var placeholder = expedition.prev('[' + self.add_namespace('data-magellan-expedition-clone') + ']'); - if (placeholder.length === 0) { - placeholder = expedition.clone(); - placeholder.removeAttr(self.attr_name()); - placeholder.attr(self.add_namespace('data-magellan-expedition-clone'),''); - expedition.before(placeholder); - } - expedition.css({position:'fixed', top: settings.fixed_top}).addClass('fixed'); - } else { - expedition.prev('[' + self.add_namespace('data-magellan-expedition-clone') + ']').remove(); - expedition.attr('style',styles).css('position','').css('top','').removeClass('fixed'); - } - }); - }, - - update_arrivals : function() { - var self = this, - window_top_offset = $(window).scrollTop(); - - $('[' + this.attr_name() + ']', self.scope).each(function() { - var expedition = $(this), - settings = expedition.data(self.attr_name(true) + '-init'), - offsets = self.offsets(expedition, window_top_offset), - arrivals = expedition.find('[' + self.add_namespace('data-magellan-arrival') + ']'), - active_item = false; - offsets.each(function(idx, item) { - if (item.viewport_offset >= item.top_offset) { - var arrivals = expedition.find('[' + self.add_namespace('data-magellan-arrival') + ']'); - arrivals.not(item.arrival).removeClass(settings.active_class); - item.arrival.addClass(settings.active_class); - active_item = true; - return true; - } - }); - - if (!active_item) arrivals.removeClass(settings.active_class); - }); - }, - - offsets : function(expedition, window_offset) { - var self = this, - settings = expedition.data(self.attr_name(true) + '-init'), - viewport_offset = window_offset; - - return expedition.find('[' + self.add_namespace('data-magellan-arrival') + ']').map(function(idx, el) { - var name = $(this).data(self.data_attr('magellan-arrival')), - dest = $('[' + self.add_namespace('data-magellan-destination') + '=' + name + ']'); - if (dest.length > 0) { - var top_offset = dest.offset().top - settings.destination_threshold; - if (settings.offset_by_height) { - top_offset = top_offset - expedition.outerHeight(); - } - top_offset = Math.floor(top_offset); - return { - destination : dest, - arrival : $(this), - top_offset : top_offset, - viewport_offset : viewport_offset - } - } - }).sort(function(a, b) { - if (a.top_offset < b.top_offset) return -1; - if (a.top_offset > b.top_offset) return 1; - return 0; - }); - }, - - data_attr: function (str) { - if (this.namespace.length > 0) { - return this.namespace + '-' + str; - } - - return str; - }, - - off : function () { - this.S(this.scope).off('.magellan'); - this.S(window).off('.magellan'); - }, - - reflow : function () { - var self = this; - // remove placeholder expeditions used for height calculation purposes - $('[' + self.add_namespace('data-magellan-expedition-clone') + ']', self.scope).remove(); - } - }; -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.accordion = { - name : 'accordion', - - version : '5.5.0', - - settings : { - content_class: 'content', - active_class: 'active', - multi_expand: false, - toggleable: true, - callback : function () {} - }, - - init : function (scope, method, options) { - this.bindings(method, options); - }, - - events : function () { - var self = this; - var S = this.S; - S(this.scope) - .off('.fndtn.accordion') - .on('click.fndtn.accordion', '[' + this.attr_name() + '] > .accordion-navigation > a', function (e) { - var accordion = S(this).closest('[' + self.attr_name() + ']'), - groupSelector = self.attr_name() + '=' + accordion.attr(self.attr_name()), - settings = accordion.data(self.attr_name(true) + '-init') || self.settings, - target = S('#' + this.href.split('#')[1]), - aunts = $('> .accordion-navigation', accordion), - siblings = aunts.children('.'+settings.content_class), - active_content = siblings.filter('.' + settings.active_class); - - e.preventDefault(); - - if (accordion.attr(self.attr_name())) { - siblings = siblings.add('[' + groupSelector + '] dd > '+'.'+settings.content_class); - aunts = aunts.add('[' + groupSelector + '] .accordion-navigation'); - } - - if (settings.toggleable && target.is(active_content)) { - target.parent('.accordion-navigation').toggleClass(settings.active_class, false); - target.toggleClass(settings.active_class, false); - settings.callback(target); - target.triggerHandler('toggled', [accordion]); - accordion.triggerHandler('toggled', [target]); - return; - } - - if (!settings.multi_expand) { - siblings.removeClass(settings.active_class); - aunts.removeClass(settings.active_class); - } - - target.addClass(settings.active_class).parent().addClass(settings.active_class); - settings.callback(target); - target.triggerHandler('toggled', [accordion]); - accordion.triggerHandler('toggled', [target]); - }); - }, - - off : function () {}, - - reflow : function () {} - }; -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.topbar = { - name : 'topbar', - - version: '5.5.0', - - settings : { - index : 0, - sticky_class : 'sticky', - custom_back_text: true, - back_text: 'Back', - mobile_show_parent_link: true, - is_hover: true, - scrolltop : true, // jump to top when sticky nav menu toggle is clicked - sticky_on : 'all' - }, - - init : function (section, method, options) { - Foundation.inherit(this, 'add_custom_rule register_media throttle'); - var self = this; - - self.register_media('topbar', 'foundation-mq-topbar'); - - this.bindings(method, options); - - self.S('[' + this.attr_name() + ']', this.scope).each(function () { - var topbar = $(this), - settings = topbar.data(self.attr_name(true) + '-init'), - section = self.S('section, .top-bar-section', this); - topbar.data('index', 0); - var topbarContainer = topbar.parent(); - if (topbarContainer.hasClass('fixed') || self.is_sticky(topbar, topbarContainer, settings) ) { - self.settings.sticky_class = settings.sticky_class; - self.settings.sticky_topbar = topbar; - topbar.data('height', topbarContainer.outerHeight()); - topbar.data('stickyoffset', topbarContainer.offset().top); - } else { - topbar.data('height', topbar.outerHeight()); - } - - if (!settings.assembled) { - self.assemble(topbar); - } - - if (settings.is_hover) { - self.S('.has-dropdown', topbar).addClass('not-click'); - } else { - self.S('.has-dropdown', topbar).removeClass('not-click'); - } - - // Pad body when sticky (scrolled) or fixed. - self.add_custom_rule('.f-topbar-fixed { padding-top: ' + topbar.data('height') + 'px }'); - - if (topbarContainer.hasClass('fixed')) { - self.S('body').addClass('f-topbar-fixed'); - } - }); - - }, - - is_sticky: function (topbar, topbarContainer, settings) { - var sticky = topbarContainer.hasClass(settings.sticky_class); - - if (sticky && settings.sticky_on === 'all') { - return true; - } else if (sticky && this.small() && settings.sticky_on === 'small') { - return (matchMedia(Foundation.media_queries.small).matches && !matchMedia(Foundation.media_queries.medium).matches && - !matchMedia(Foundation.media_queries.large).matches); - //return true; - } else if (sticky && this.medium() && settings.sticky_on === 'medium') { - return (matchMedia(Foundation.media_queries.small).matches && matchMedia(Foundation.media_queries.medium).matches && - !matchMedia(Foundation.media_queries.large).matches); - //return true; - } else if(sticky && this.large() && settings.sticky_on === 'large') { - return (matchMedia(Foundation.media_queries.small).matches && matchMedia(Foundation.media_queries.medium).matches && - matchMedia(Foundation.media_queries.large).matches); - //return true; - } - - return false; - }, - - toggle: function (toggleEl) { - var self = this, - topbar; - - if (toggleEl) { - topbar = self.S(toggleEl).closest('[' + this.attr_name() + ']'); - } else { - topbar = self.S('[' + this.attr_name() + ']'); - } - - var settings = topbar.data(this.attr_name(true) + '-init'); - - var section = self.S('section, .top-bar-section', topbar); - - if (self.breakpoint()) { - if (!self.rtl) { - section.css({left: '0%'}); - $('>.name', section).css({left: '100%'}); - } else { - section.css({right: '0%'}); - $('>.name', section).css({right: '100%'}); - } - - self.S('li.moved', section).removeClass('moved'); - topbar.data('index', 0); - - topbar - .toggleClass('expanded') - .css('height', ''); - } - - if (settings.scrolltop) { - if (!topbar.hasClass('expanded')) { - if (topbar.hasClass('fixed')) { - topbar.parent().addClass('fixed'); - topbar.removeClass('fixed'); - self.S('body').addClass('f-topbar-fixed'); - } - } else if (topbar.parent().hasClass('fixed')) { - if (settings.scrolltop) { - topbar.parent().removeClass('fixed'); - topbar.addClass('fixed'); - self.S('body').removeClass('f-topbar-fixed'); - - window.scrollTo(0,0); - } else { - topbar.parent().removeClass('expanded'); - } - } - } else { - if (self.is_sticky(topbar, topbar.parent(), settings)) { - topbar.parent().addClass('fixed'); - } - - if (topbar.parent().hasClass('fixed')) { - if (!topbar.hasClass('expanded')) { - topbar.removeClass('fixed'); - topbar.parent().removeClass('expanded'); - self.update_sticky_positioning(); - } else { - topbar.addClass('fixed'); - topbar.parent().addClass('expanded'); - self.S('body').addClass('f-topbar-fixed'); - } - } - } - }, - - timer : null, - - events : function (bar) { - var self = this, - S = this.S; - - S(this.scope) - .off('.topbar') - .on('click.fndtn.topbar', '[' + this.attr_name() + '] .toggle-topbar', function (e) { - e.preventDefault(); - self.toggle(this); - }) - .on('click.fndtn.topbar','.top-bar .top-bar-section li a[href^="#"],[' + this.attr_name() + '] .top-bar-section li a[href^="#"]',function (e) { - var li = $(this).closest('li'); - if(self.breakpoint() && !li.hasClass('back') && !li.hasClass('has-dropdown')) - { - self.toggle(); - } - }) - .on('click.fndtn.topbar', '[' + this.attr_name() + '] li.has-dropdown', function (e) { - var li = S(this), - target = S(e.target), - topbar = li.closest('[' + self.attr_name() + ']'), - settings = topbar.data(self.attr_name(true) + '-init'); - - if(target.data('revealId')) { - self.toggle(); - return; - } - - if (self.breakpoint()) return; - if (settings.is_hover && !Modernizr.touch) return; - - e.stopImmediatePropagation(); - - if (li.hasClass('hover')) { - li - .removeClass('hover') - .find('li') - .removeClass('hover'); - - li.parents('li.hover') - .removeClass('hover'); - } else { - li.addClass('hover'); - - $(li).siblings().removeClass('hover'); - - if (target[0].nodeName === 'A' && target.parent().hasClass('has-dropdown')) { - e.preventDefault(); - } - } - }) - .on('click.fndtn.topbar', '[' + this.attr_name() + '] .has-dropdown>a', function (e) { - if (self.breakpoint()) { - - e.preventDefault(); - - var $this = S(this), - topbar = $this.closest('[' + self.attr_name() + ']'), - section = topbar.find('section, .top-bar-section'), - dropdownHeight = $this.next('.dropdown').outerHeight(), - $selectedLi = $this.closest('li'); - - topbar.data('index', topbar.data('index') + 1); - $selectedLi.addClass('moved'); - - if (!self.rtl) { - section.css({left: -(100 * topbar.data('index')) + '%'}); - section.find('>.name').css({left: 100 * topbar.data('index') + '%'}); - } else { - section.css({right: -(100 * topbar.data('index')) + '%'}); - section.find('>.name').css({right: 100 * topbar.data('index') + '%'}); - } - - topbar.css('height', $this.siblings('ul').outerHeight(true) + topbar.data('height')); - } - }); - - S(window).off('.topbar').on('resize.fndtn.topbar', self.throttle(function() { - self.resize.call(self); - }, 50)).trigger('resize').trigger('resize.fndtn.topbar').load(function(){ - // Ensure that the offset is calculated after all of the pages resources have loaded - S(this).trigger('resize.fndtn.topbar'); - }); - - S('body').off('.topbar').on('click.fndtn.topbar', function (e) { - var parent = S(e.target).closest('li').closest('li.hover'); - - if (parent.length > 0) { - return; - } - - S('[' + self.attr_name() + '] li.hover').removeClass('hover'); - }); - - // Go up a level on Click - S(this.scope).on('click.fndtn.topbar', '[' + this.attr_name() + '] .has-dropdown .back', function (e) { - e.preventDefault(); - - var $this = S(this), - topbar = $this.closest('[' + self.attr_name() + ']'), - section = topbar.find('section, .top-bar-section'), - settings = topbar.data(self.attr_name(true) + '-init'), - $movedLi = $this.closest('li.moved'), - $previousLevelUl = $movedLi.parent(); - - topbar.data('index', topbar.data('index') - 1); - - if (!self.rtl) { - section.css({left: -(100 * topbar.data('index')) + '%'}); - section.find('>.name').css({left: 100 * topbar.data('index') + '%'}); - } else { - section.css({right: -(100 * topbar.data('index')) + '%'}); - section.find('>.name').css({right: 100 * topbar.data('index') + '%'}); - } - - if (topbar.data('index') === 0) { - topbar.css('height', ''); - } else { - topbar.css('height', $previousLevelUl.outerHeight(true) + topbar.data('height')); - } - - setTimeout(function () { - $movedLi.removeClass('moved'); - }, 300); - }); - - // Show dropdown menus when their items are focused - S(this.scope).find('.dropdown a') - .focus(function() { - $(this).parents('.has-dropdown').addClass('hover'); - }) - .blur(function() { - $(this).parents('.has-dropdown').removeClass('hover'); - }); - }, - - resize : function () { - var self = this; - self.S('[' + this.attr_name() + ']').each(function () { - var topbar = self.S(this), - settings = topbar.data(self.attr_name(true) + '-init'); - - var stickyContainer = topbar.parent('.' + self.settings.sticky_class); - var stickyOffset; - - if (!self.breakpoint()) { - var doToggle = topbar.hasClass('expanded'); - topbar - .css('height', '') - .removeClass('expanded') - .find('li') - .removeClass('hover'); - - if(doToggle) { - self.toggle(topbar); - } - } - - if(self.is_sticky(topbar, stickyContainer, settings)) { - if(stickyContainer.hasClass('fixed')) { - // Remove the fixed to allow for correct calculation of the offset. - stickyContainer.removeClass('fixed'); - - stickyOffset = stickyContainer.offset().top; - if(self.S(document.body).hasClass('f-topbar-fixed')) { - stickyOffset -= topbar.data('height'); - } - - topbar.data('stickyoffset', stickyOffset); - stickyContainer.addClass('fixed'); - } else { - stickyOffset = stickyContainer.offset().top; - topbar.data('stickyoffset', stickyOffset); - } - } - - }); - }, - - breakpoint : function () { - return !matchMedia(Foundation.media_queries['topbar']).matches; - }, - - small : function () { - return matchMedia(Foundation.media_queries['small']).matches; - }, - - medium : function () { - return matchMedia(Foundation.media_queries['medium']).matches; - }, - - large : function () { - return matchMedia(Foundation.media_queries['large']).matches; - }, - - assemble : function (topbar) { - var self = this, - settings = topbar.data(this.attr_name(true) + '-init'), - section = self.S('section, .top-bar-section', topbar); - - // Pull element out of the DOM for manipulation - section.detach(); - - self.S('.has-dropdown>a', section).each(function () { - var $link = self.S(this), - $dropdown = $link.siblings('.dropdown'), - url = $link.attr('href'), - $titleLi; - - - if (!$dropdown.find('.title.back').length) { - - if (settings.mobile_show_parent_link == true && url) { - $titleLi = $('
        2. '); - } else { - $titleLi = $('
        3. '); - } - - // Copy link to subnav - if (settings.custom_back_text == true) { - $('h5>a', $titleLi).html(settings.back_text); - } else { - $('h5>a', $titleLi).html('« ' + $link.html()); - } - $dropdown.prepend($titleLi); - } - }); - - // Put element back in the DOM - section.appendTo(topbar); - - // check for sticky - this.sticky(); - - this.assembled(topbar); - }, - - assembled : function (topbar) { - topbar.data(this.attr_name(true), $.extend({}, topbar.data(this.attr_name(true)), {assembled: true})); - }, - - height : function (ul) { - var total = 0, - self = this; - - $('> li', ul).each(function () { - total += self.S(this).outerHeight(true); - }); - - return total; - }, - - sticky : function () { - var self = this; - - this.S(window).on('scroll', function() { - self.update_sticky_positioning(); - }); - }, - - update_sticky_positioning: function() { - var klass = '.' + this.settings.sticky_class, - $window = this.S(window), - self = this; - - if (self.settings.sticky_topbar && self.is_sticky(this.settings.sticky_topbar,this.settings.sticky_topbar.parent(), this.settings)) { - var distance = this.settings.sticky_topbar.data('stickyoffset'); - if (!self.S(klass).hasClass('expanded')) { - if ($window.scrollTop() > (distance)) { - if (!self.S(klass).hasClass('fixed')) { - self.S(klass).addClass('fixed'); - self.S('body').addClass('f-topbar-fixed'); - } - } else if ($window.scrollTop() <= distance) { - if (self.S(klass).hasClass('fixed')) { - self.S(klass).removeClass('fixed'); - self.S('body').removeClass('f-topbar-fixed'); - } - } - } - } - }, - - off : function () { - this.S(this.scope).off('.fndtn.topbar'); - this.S(window).off('.fndtn.topbar'); - }, - - reflow : function () {} - }; -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.tab = { - name : 'tab', - - version : '5.5.0', - - settings : { - active_class: 'active', - callback : function () {}, - deep_linking: false, - scroll_to_content: true, - is_hover: false - }, - - default_tab_hashes: [], - - init : function (scope, method, options) { - var self = this, - S = this.S; - - this.bindings(method, options); - this.handle_location_hash_change(); - - // Store the default active tabs which will be referenced when the - // location hash is absent, as in the case of navigating the tabs and - // returning to the first viewing via the browser Back button. - S('[' + this.attr_name() + '] > .active > a', this.scope).each(function () { - self.default_tab_hashes.push(this.hash); - }); - }, - - events : function () { - var self = this, - S = this.S; - - var usual_tab_behavior = function (e) { - var settings = S(this).closest('[' + self.attr_name() +']').data(self.attr_name(true) + '-init'); - if (!settings.is_hover || Modernizr.touch) { - e.preventDefault(); - e.stopPropagation(); - self.toggle_active_tab(S(this).parent()); - } - }; - - S(this.scope) - .off('.tab') - // Click event: tab title - .on('focus.fndtn.tab', '[' + this.attr_name() + '] > * > a', usual_tab_behavior ) - .on('click.fndtn.tab', '[' + this.attr_name() + '] > * > a', usual_tab_behavior ) - // Hover event: tab title - .on('mouseenter.fndtn.tab', '[' + this.attr_name() + '] > * > a', function (e) { - var settings = S(this).closest('[' + self.attr_name() +']').data(self.attr_name(true) + '-init'); - if (settings.is_hover) self.toggle_active_tab(S(this).parent()); - }); - - // Location hash change event - S(window).on('hashchange.fndtn.tab', function (e) { - e.preventDefault(); - self.handle_location_hash_change(); - }); - }, - - handle_location_hash_change : function () { - - var self = this, - S = this.S; - - S('[' + this.attr_name() + ']', this.scope).each(function () { - var settings = S(this).data(self.attr_name(true) + '-init'); - if (settings.deep_linking) { - // Match the location hash to a label - var hash; - if (settings.scroll_to_content) { - hash = self.scope.location.hash; - } else { - // prefix the hash to prevent anchor scrolling - hash = self.scope.location.hash.replace('fndtn-', ''); - } - if (hash != '') { - // Check whether the location hash references a tab content div or - // another element on the page (inside or outside the tab content div) - var hash_element = S(hash); - if (hash_element.hasClass('content') && hash_element.parent().hasClass('tabs-content')) { - // Tab content div - self.toggle_active_tab($('[' + self.attr_name() + '] > * > a[href=' + hash + ']').parent()); - } else { - // Not the tab content div. If inside the tab content, find the - // containing tab and toggle it as active. - var hash_tab_container_id = hash_element.closest('.content').attr('id'); - if (hash_tab_container_id != undefined) { - self.toggle_active_tab($('[' + self.attr_name() + '] > * > a[href=#' + hash_tab_container_id + ']').parent(), hash); - } - } - } else { - // Reference the default tab hashes which were initialized in the init function - for (var ind = 0; ind < self.default_tab_hashes.length; ind++) { - self.toggle_active_tab($('[' + self.attr_name() + '] > * > a[href=' + self.default_tab_hashes[ind] + ']').parent()); - } - } - } - }); - }, - - toggle_active_tab: function (tab, location_hash) { - var S = this.S, - tabs = tab.closest('[' + this.attr_name() + ']'), - tab_link = tab.find('a'), - anchor = tab.children('a').first(), - target_hash = '#' + anchor.attr('href').split('#')[1], - target = S(target_hash), - siblings = tab.siblings(), - settings = tabs.data(this.attr_name(true) + '-init'), - interpret_keyup_action = function(e) { - // Light modification of Heydon Pickering's Practical ARIA Examples: http://heydonworks.com/practical_aria_examples/js/a11y.js - - // define current, previous and next (possible) tabs - - var $original = $(this); - var $prev = $(this).parents('li').prev().children('[role="tab"]'); - var $next = $(this).parents('li').next().children('[role="tab"]'); - var $target; - - // find the direction (prev or next) - - switch (e.keyCode) { - case 37: - $target = $prev; - break; - case 39: - $target = $next; - break; - default: - $target = false - break; - } - - if ($target.length) { - $original.attr({ - 'tabindex' : '-1', - 'aria-selected' : null - }); - $target.attr({ - 'tabindex' : '0', - 'aria-selected' : true - }).focus(); - } - - // Hide panels - - $('[role="tabpanel"]') - .attr('aria-hidden', 'true'); - - // Show panel which corresponds to target - - $('#' + $(document.activeElement).attr('href').substring(1)) - .attr('aria-hidden', null); - - }; - - // allow usage of data-tab-content attribute instead of href - if (S(this).data(this.data_attr('tab-content'))) { - target_hash = '#' + S(this).data(this.data_attr('tab-content')).split('#')[1]; - target = S(target_hash); - } - - if (settings.deep_linking) { - - if (settings.scroll_to_content) { - // retain current hash to scroll to content - window.location.hash = location_hash || target_hash; - if (location_hash == undefined || location_hash == target_hash) { - tab.parent()[0].scrollIntoView(); - } else { - S(target_hash)[0].scrollIntoView(); - } - } else { - // prefix the hashes so that the browser doesn't scroll down - if (location_hash != undefined) { - window.location.hash = 'fndtn-' + location_hash.replace('#', ''); - } else { - window.location.hash = 'fndtn-' + target_hash.replace('#', ''); - } - } - } - - // WARNING: The activation and deactivation of the tab content must - // occur after the deep linking in order to properly refresh the browser - // window (notably in Chrome). - // Clean up multiple attr instances to done once - tab.addClass(settings.active_class).triggerHandler('opened'); - tab_link.attr({'aria-selected': 'true', tabindex: 0}); - siblings.removeClass(settings.active_class) - siblings.find('a').attr({'aria-selected': 'false', tabindex: -1}); - target.siblings().removeClass(settings.active_class).attr({'aria-hidden': 'true', tabindex: -1}); - target.addClass(settings.active_class).attr('aria-hidden', 'false').removeAttr('tabindex'); - settings.callback(tab); - target.triggerHandler('toggled', [tab]); - tabs.triggerHandler('toggled', [target]); - - tab_link.off('keydown').on('keydown', interpret_keyup_action ); - }, - - data_attr: function (str) { - if (this.namespace.length > 0) { - return this.namespace + '-' + str; - } - - return str; - }, - - off : function () {}, - - reflow : function () {} - }; -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.abide = { - name : 'abide', - - version : '5.5.0', - - settings : { - live_validate : true, - validate_on_blur: true, - focus_on_invalid : true, - error_labels: true, // labels with a for="inputId" will recieve an `error` class - error_class: 'error', - timeout : 1000, - patterns : { - alpha: /^[a-zA-Z]+$/, - alpha_numeric : /^[a-zA-Z0-9]+$/, - integer: /^[-+]?\d+$/, - number: /^[-+]?\d*(?:[\.\,]\d+)?$/, - - // amex, visa, diners - card : /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/, - cvv : /^([0-9]){3,4}$/, - - // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address - email : /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/, - - url: /^(https?|ftp|file|ssh):\/\/(((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/, - // abc.de - domain: /^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/, - - datetime: /^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/, - // YYYY-MM-DD - date: /(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/, - // HH:MM:SS - time : /^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/, - dateISO: /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/, - // MM/DD/YYYY - month_day_year : /^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/, - // DD/MM/YYYY - day_month_year : /^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/, - - // #FFF or #FFFFFF - color: /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/ - }, - validators : { - equalTo: function(el, required, parent) { - var from = document.getElementById(el.getAttribute(this.add_namespace('data-equalto'))).value, - to = el.value, - valid = (from === to); - - return valid; - } - } - }, - - timer : null, - - init : function (scope, method, options) { - this.bindings(method, options); - }, - - events : function (scope) { - var self = this, - form = self.S(scope).attr('novalidate', 'novalidate'), - settings = form.data(this.attr_name(true) + '-init') || {}; - - this.invalid_attr = this.add_namespace('data-invalid'); - - form - .off('.abide') - .on('submit.fndtn.abide validate.fndtn.abide', function (e) { - var is_ajax = /ajax/i.test(self.S(this).attr(self.attr_name())); - return self.validate(self.S(this).find('input, textarea, select').get(), e, is_ajax); - }) - .on('reset', function() { - return self.reset($(this)); - }) - .find('input, textarea, select') - .off('.abide') - .on('blur.fndtn.abide change.fndtn.abide', function (e) { - if (settings.validate_on_blur === true) { - self.validate([this], e); - } - }) - .on('keydown.fndtn.abide', function (e) { - if (settings.live_validate === true && e.which != 9) { - clearTimeout(self.timer); - self.timer = setTimeout(function () { - self.validate([this], e); - }.bind(this), settings.timeout); - } - }); - }, - - reset : function (form) { - form.removeAttr(this.invalid_attr); - $(this.invalid_attr, form).removeAttr(this.invalid_attr); - $('.' + this.settings.error_class, form).not('small').removeClass(this.settings.error_class); - }, - - validate : function (els, e, is_ajax) { - var validations = this.parse_patterns(els), - validation_count = validations.length, - form = this.S(els[0]).closest('form'), - submit_event = /submit/.test(e.type); - - // Has to count up to make sure the focus gets applied to the top error - for (var i=0; i < validation_count; i++) { - if (!validations[i] && (submit_event || is_ajax)) { - if (this.settings.focus_on_invalid) els[i].focus(); - form.trigger('invalid').trigger('invalid.fndtn.abide'); - this.S(els[i]).closest('form').attr(this.invalid_attr, ''); - return false; - } - } - - if (submit_event || is_ajax) { - form.trigger('valid').trigger('valid.fndtn.abide'); - } - - form.removeAttr(this.invalid_attr); - - if (is_ajax) return false; - - return true; - }, - - parse_patterns : function (els) { - var i = els.length, - el_patterns = []; - - while (i--) { - el_patterns.push(this.pattern(els[i])); - } - - return this.check_validation_and_apply_styles(el_patterns); - }, - - pattern : function (el) { - var type = el.getAttribute('type'), - required = typeof el.getAttribute('required') === 'string'; - - var pattern = el.getAttribute('pattern') || ''; - - if (this.settings.patterns.hasOwnProperty(pattern) && pattern.length > 0) { - return [el, this.settings.patterns[pattern], required]; - } else if (pattern.length > 0) { - return [el, new RegExp(pattern), required]; - } - - if (this.settings.patterns.hasOwnProperty(type)) { - return [el, this.settings.patterns[type], required]; - } - - pattern = /.*/; - - return [el, pattern, required]; - }, - - // TODO: Break this up into smaller methods, getting hard to read. - check_validation_and_apply_styles : function (el_patterns) { - var i = el_patterns.length, - validations = [], - form = this.S(el_patterns[0][0]).closest('[data-' + this.attr_name(true) + ']'), - settings = form.data(this.attr_name(true) + '-init') || {}; - while (i--) { - var el = el_patterns[i][0], - required = el_patterns[i][2], - value = el.value.trim(), - direct_parent = this.S(el).parent(), - validator = el.getAttribute(this.add_namespace('data-abide-validator')), - is_radio = el.type === "radio", - is_checkbox = el.type === "checkbox", - label = this.S('label[for="' + el.getAttribute('id') + '"]'), - valid_length = (required) ? (el.value.length > 0) : true, - el_validations = []; - - var parent, valid; - - // support old way to do equalTo validations - if(el.getAttribute(this.add_namespace('data-equalto'))) { validator = "equalTo" } - - if (!direct_parent.is('label')) { - parent = direct_parent; - } else { - parent = direct_parent.parent(); - } - - if (validator) { - valid = this.settings.validators[validator].apply(this, [el, required, parent]); - el_validations.push(valid); - } - - if (is_radio && required) { - el_validations.push(this.valid_radio(el, required)); - } else if (is_checkbox && required) { - el_validations.push(this.valid_checkbox(el, required)); - } else { - - if (el_patterns[i][1].test(value) && valid_length || - !required && el.value.length < 1 || $(el).attr('disabled')) { - el_validations.push(true); - } else { - el_validations.push(false); - } - - el_validations = [el_validations.every(function(valid){return valid;})]; - - if(el_validations[0]){ - this.S(el).removeAttr(this.invalid_attr); - el.setAttribute('aria-invalid', 'false'); - el.removeAttribute('aria-describedby'); - parent.removeClass(this.settings.error_class); - if (label.length > 0 && this.settings.error_labels) { - label.removeClass(this.settings.error_class).removeAttr('role'); - } - $(el).triggerHandler('valid'); - } else { - this.S(el).attr(this.invalid_attr, ''); - el.setAttribute('aria-invalid', 'true'); - - // Try to find the error associated with the input - var errorElem = parent.find('small.'+this.settings.error_class, 'span.'+this.settings.error_class); - var errorID = errorElem.length > 0 ? errorElem[0].id : ""; - if (errorID.length > 0) el.setAttribute('aria-describedby', errorID); - - // el.setAttribute('aria-describedby', $(el).find('.error')[0].id); - parent.addClass(this.settings.error_class); - if (label.length > 0 && this.settings.error_labels) { - label.addClass(this.settings.error_class).attr('role', 'alert'); - } - $(el).triggerHandler('invalid'); - } - } - validations.push(el_validations[0]); - } - validations = [validations.every(function(valid){return valid;})]; - return validations; - }, - - valid_checkbox : function(el, required) { - var el = this.S(el), - valid = (el.is(':checked') || !required); - - if (valid) { - el.removeAttr(this.invalid_attr).parent().removeClass(this.settings.error_class); - } else { - el.attr(this.invalid_attr, '').parent().addClass(this.settings.error_class); - } - - return valid; - }, - - valid_radio : function (el, required) { - var name = el.getAttribute('name'), - group = this.S(el).closest('[data-' + this.attr_name(true) + ']').find("[name='"+name+"']"), - count = group.length, - valid = false; - - // Has to count up to make sure the focus gets applied to the top error - for (var i=0; i < count; i++) { - if (group[i].checked) valid = true; - } - - // Has to count up to make sure the focus gets applied to the top error - for (var i=0; i < count; i++) { - if (valid) { - this.S(group[i]).removeAttr(this.invalid_attr).parent().removeClass(this.settings.error_class); - } else { - this.S(group[i]).attr(this.invalid_attr, '').parent().addClass(this.settings.error_class); - } - } - - return valid; - }, - - valid_equal: function(el, required, parent) { - var from = document.getElementById(el.getAttribute(this.add_namespace('data-equalto'))).value, - to = el.value, - valid = (from === to); - - if (valid) { - this.S(el).removeAttr(this.invalid_attr); - parent.removeClass(this.settings.error_class); - if (label.length > 0 && settings.error_labels) label.removeClass(this.settings.error_class); - } else { - this.S(el).attr(this.invalid_attr, ''); - parent.addClass(this.settings.error_class); - if (label.length > 0 && settings.error_labels) label.addClass(this.settings.error_class); - } - - return valid; - }, - - valid_oneof: function(el, required, parent, doNotValidateOthers) { - var el = this.S(el), - others = this.S('[' + this.add_namespace('data-oneof') + ']'), - valid = others.filter(':checked').length > 0; - - if (valid) { - el.removeAttr(this.invalid_attr).parent().removeClass(this.settings.error_class); - } else { - el.attr(this.invalid_attr, '').parent().addClass(this.settings.error_class); - } - - if (!doNotValidateOthers) { - var _this = this; - others.each(function() { - _this.valid_oneof.call(_this, this, null, null, true); - }); - } - - return valid; - } - }; -}(jQuery, window, window.document)); -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.tooltip = { - name : 'tooltip', - - version : '5.5.0', - - settings : { - additional_inheritable_classes : [], - tooltip_class : '.tooltip', - append_to: 'body', - touch_close_text: 'Tap To Close', - disable_for_touch: false, - hover_delay: 200, - show_on : 'all', - tip_template : function (selector, content) { - return '' + content + ''; - } - }, - - cache : {}, - - init : function (scope, method, options) { - Foundation.inherit(this, 'random_str'); - this.bindings(method, options); - }, - - should_show: function (target, tip) { - var settings = $.extend({}, this.settings, this.data_options(target)); - - if (settings.show_on === 'all') { - return true; - } else if (this.small() && settings.show_on === 'small') { - return true; - } else if (this.medium() && settings.show_on === 'medium') { - return true; - } else if (this.large() && settings.show_on === 'large') { - return true; - } - return false; - }, - - medium : function () { - return matchMedia(Foundation.media_queries['medium']).matches; - }, - - large : function () { - return matchMedia(Foundation.media_queries['large']).matches; - }, - - events : function (instance) { - var self = this, - S = self.S; - - self.create(this.S(instance)); - - $(this.scope) - .off('.tooltip') - .on('mouseenter.fndtn.tooltip mouseleave.fndtn.tooltip touchstart.fndtn.tooltip MSPointerDown.fndtn.tooltip', - '[' + this.attr_name() + ']', function (e) { - var $this = S(this), - settings = $.extend({}, self.settings, self.data_options($this)), - is_touch = false; - - if (Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type) && S(e.target).is('a')) { - return false; - } - - if (/mouse/i.test(e.type) && self.ie_touch(e)) return false; - - if ($this.hasClass('open')) { - if (Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type)) e.preventDefault(); - self.hide($this); - } else { - if (settings.disable_for_touch && Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type)) { - return; - } else if(!settings.disable_for_touch && Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type)) { - e.preventDefault(); - S(settings.tooltip_class + '.open').hide(); - is_touch = true; - } - - if (/enter|over/i.test(e.type)) { - this.timer = setTimeout(function () { - var tip = self.showTip($this); - }.bind(this), self.settings.hover_delay); - } else if (e.type === 'mouseout' || e.type === 'mouseleave') { - clearTimeout(this.timer); - self.hide($this); - } else { - self.showTip($this); - } - } - }) - .on('mouseleave.fndtn.tooltip touchstart.fndtn.tooltip MSPointerDown.fndtn.tooltip', '[' + this.attr_name() + '].open', function (e) { - if (/mouse/i.test(e.type) && self.ie_touch(e)) return false; - - if($(this).data('tooltip-open-event-type') == 'touch' && e.type == 'mouseleave') { - return; - } - else if($(this).data('tooltip-open-event-type') == 'mouse' && /MSPointerDown|touchstart/i.test(e.type)) { - self.convert_to_touch($(this)); - } else { - self.hide($(this)); - } - }) - .on('DOMNodeRemoved DOMAttrModified', '[' + this.attr_name() + ']:not(a)', function (e) { - self.hide(S(this)); - }); - }, - - ie_touch : function (e) { - // How do I distinguish between IE11 and Windows Phone 8????? - return false; - }, - - showTip : function ($target) { - var $tip = this.getTip($target); - if (this.should_show($target, $tip)){ - return this.show($target); - } - return; - }, - - getTip : function ($target) { - var selector = this.selector($target), - settings = $.extend({}, this.settings, this.data_options($target)), - tip = null; - - if (selector) { - tip = this.S('span[data-selector="' + selector + '"]' + settings.tooltip_class); - } - - return (typeof tip === 'object') ? tip : false; - }, - - selector : function ($target) { - var id = $target.attr('id'), - dataSelector = $target.attr(this.attr_name()) || $target.attr('data-selector'); - - if ((id && id.length < 1 || !id) && typeof dataSelector != 'string') { - dataSelector = this.random_str(6); - $target - .attr('data-selector', dataSelector) - .attr('aria-describedby', dataSelector); - } - - return (id && id.length > 0) ? id : dataSelector; - }, - - create : function ($target) { - var self = this, - settings = $.extend({}, this.settings, this.data_options($target)), - tip_template = this.settings.tip_template; - - if (typeof settings.tip_template === 'string' && window.hasOwnProperty(settings.tip_template)) { - tip_template = window[settings.tip_template]; - } - - var $tip = $(tip_template(this.selector($target), $('
          ').html($target.attr('title')).html())), - classes = this.inheritable_classes($target); - - $tip.addClass(classes).appendTo(settings.append_to); - - if (Modernizr.touch) { - $tip.append(''+settings.touch_close_text+''); - $tip.on('touchstart.fndtn.tooltip MSPointerDown.fndtn.tooltip', function(e) { - self.hide($target); - }); - } - - $target.removeAttr('title').attr('title',''); - }, - - reposition : function (target, tip, classes) { - var width, nub, nubHeight, nubWidth, column, objPos; - - tip.css('visibility', 'hidden').show(); - - width = target.data('width'); - nub = tip.children('.nub'); - nubHeight = nub.outerHeight(); - nubWidth = nub.outerHeight(); - - if (this.small()) { - tip.css({'width' : '100%' }); - } else { - tip.css({'width' : (width) ? width : 'auto'}); - } - - objPos = function (obj, top, right, bottom, left, width) { - return obj.css({ - 'top' : (top) ? top : 'auto', - 'bottom' : (bottom) ? bottom : 'auto', - 'left' : (left) ? left : 'auto', - 'right' : (right) ? right : 'auto' - }).end(); - }; - - objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', target.offset().left); - - if (this.small()) { - objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', 12.5, $(this.scope).width()); - tip.addClass('tip-override'); - objPos(nub, -nubHeight, 'auto', 'auto', target.offset().left); - } else { - var left = target.offset().left; - if (Foundation.rtl) { - nub.addClass('rtl'); - left = target.offset().left + target.outerWidth() - tip.outerWidth(); - } - objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', left); - tip.removeClass('tip-override'); - if (classes && classes.indexOf('tip-top') > -1) { - if (Foundation.rtl) nub.addClass('rtl'); - objPos(tip, (target.offset().top - tip.outerHeight()), 'auto', 'auto', left) - .removeClass('tip-override'); - } else if (classes && classes.indexOf('tip-left') > -1) { - objPos(tip, (target.offset().top + (target.outerHeight() / 2) - (tip.outerHeight() / 2)), 'auto', 'auto', (target.offset().left - tip.outerWidth() - nubHeight)) - .removeClass('tip-override'); - nub.removeClass('rtl'); - } else if (classes && classes.indexOf('tip-right') > -1) { - objPos(tip, (target.offset().top + (target.outerHeight() / 2) - (tip.outerHeight() / 2)), 'auto', 'auto', (target.offset().left + target.outerWidth() + nubHeight)) - .removeClass('tip-override'); - nub.removeClass('rtl'); - } - } - - tip.css('visibility', 'visible').hide(); - }, - - small : function () { - return matchMedia(Foundation.media_queries.small).matches && - !matchMedia(Foundation.media_queries.medium).matches; - }, - - inheritable_classes : function ($target) { - var settings = $.extend({}, this.settings, this.data_options($target)), - inheritables = ['tip-top', 'tip-left', 'tip-bottom', 'tip-right', 'radius', 'round'].concat(settings.additional_inheritable_classes), - classes = $target.attr('class'), - filtered = classes ? $.map(classes.split(' '), function (el, i) { - if ($.inArray(el, inheritables) !== -1) { - return el; - } - }).join(' ') : ''; - - return $.trim(filtered); - }, - - convert_to_touch : function($target) { - var self = this, - $tip = self.getTip($target), - settings = $.extend({}, self.settings, self.data_options($target)); - - if ($tip.find('.tap-to-close').length === 0) { - $tip.append(''+settings.touch_close_text+''); - $tip.on('click.fndtn.tooltip.tapclose touchstart.fndtn.tooltip.tapclose MSPointerDown.fndtn.tooltip.tapclose', function(e) { - self.hide($target); - }); - } - - $target.data('tooltip-open-event-type', 'touch'); - }, - - show : function ($target) { - var $tip = this.getTip($target); - - if ($target.data('tooltip-open-event-type') == 'touch') { - this.convert_to_touch($target); - } - - this.reposition($target, $tip, $target.attr('class')); - $target.addClass('open'); - $tip.fadeIn(150); - }, - - hide : function ($target) { - var $tip = this.getTip($target); - - $tip.fadeOut(150, function() { - $tip.find('.tap-to-close').remove(); - $tip.off('click.fndtn.tooltip.tapclose MSPointerDown.fndtn.tapclose'); - $target.removeClass('open'); - }); - }, - - off : function () { - var self = this; - this.S(this.scope).off('.fndtn.tooltip'); - this.S(this.settings.tooltip_class).each(function (i) { - $('[' + self.attr_name() + ']').eq(i).attr('title', $(this).text()); - }).remove(); - }, - - reflow : function () {} - }; -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.abide.js b/src/opsoro/server/static/js/foundation/foundation.abide.js deleted file mode 100644 index 522840e..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.abide.js +++ /dev/null @@ -1,318 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.abide = { - name : 'abide', - - version : '5.5.0', - - settings : { - live_validate : true, - validate_on_blur: true, - focus_on_invalid : true, - error_labels: true, // labels with a for="inputId" will recieve an `error` class - error_class: 'error', - timeout : 1000, - patterns : { - alpha: /^[a-zA-Z]+$/, - alpha_numeric : /^[a-zA-Z0-9]+$/, - integer: /^[-+]?\d+$/, - number: /^[-+]?\d*(?:[\.\,]\d+)?$/, - - // amex, visa, diners - card : /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/, - cvv : /^([0-9]){3,4}$/, - - // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address - email : /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/, - - url: /^(https?|ftp|file|ssh):\/\/(((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/, - // abc.de - domain: /^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/, - - datetime: /^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/, - // YYYY-MM-DD - date: /(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/, - // HH:MM:SS - time : /^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/, - dateISO: /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/, - // MM/DD/YYYY - month_day_year : /^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/, - // DD/MM/YYYY - day_month_year : /^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/, - - // #FFF or #FFFFFF - color: /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/ - }, - validators : { - equalTo: function(el, required, parent) { - var from = document.getElementById(el.getAttribute(this.add_namespace('data-equalto'))).value, - to = el.value, - valid = (from === to); - - return valid; - } - } - }, - - timer : null, - - init : function (scope, method, options) { - this.bindings(method, options); - }, - - events : function (scope) { - var self = this, - form = self.S(scope).attr('novalidate', 'novalidate'), - settings = form.data(this.attr_name(true) + '-init') || {}; - - this.invalid_attr = this.add_namespace('data-invalid'); - - form - .off('.abide') - .on('submit.fndtn.abide validate.fndtn.abide', function (e) { - var is_ajax = /ajax/i.test(self.S(this).attr(self.attr_name())); - return self.validate(self.S(this).find('input, textarea, select').get(), e, is_ajax); - }) - .on('reset', function() { - return self.reset($(this)); - }) - .find('input, textarea, select') - .off('.abide') - .on('blur.fndtn.abide change.fndtn.abide', function (e) { - if (settings.validate_on_blur === true) { - self.validate([this], e); - } - }) - .on('keydown.fndtn.abide', function (e) { - if (settings.live_validate === true && e.which != 9) { - clearTimeout(self.timer); - self.timer = setTimeout(function () { - self.validate([this], e); - }.bind(this), settings.timeout); - } - }); - }, - - reset : function (form) { - form.removeAttr(this.invalid_attr); - $(this.invalid_attr, form).removeAttr(this.invalid_attr); - $('.' + this.settings.error_class, form).not('small').removeClass(this.settings.error_class); - }, - - validate : function (els, e, is_ajax) { - var validations = this.parse_patterns(els), - validation_count = validations.length, - form = this.S(els[0]).closest('form'), - submit_event = /submit/.test(e.type); - - // Has to count up to make sure the focus gets applied to the top error - for (var i=0; i < validation_count; i++) { - if (!validations[i] && (submit_event || is_ajax)) { - if (this.settings.focus_on_invalid) els[i].focus(); - form.trigger('invalid').trigger('invalid.fndtn.abide'); - this.S(els[i]).closest('form').attr(this.invalid_attr, ''); - return false; - } - } - - if (submit_event || is_ajax) { - form.trigger('valid').trigger('valid.fndtn.abide'); - } - - form.removeAttr(this.invalid_attr); - - if (is_ajax) return false; - - return true; - }, - - parse_patterns : function (els) { - var i = els.length, - el_patterns = []; - - while (i--) { - el_patterns.push(this.pattern(els[i])); - } - - return this.check_validation_and_apply_styles(el_patterns); - }, - - pattern : function (el) { - var type = el.getAttribute('type'), - required = typeof el.getAttribute('required') === 'string'; - - var pattern = el.getAttribute('pattern') || ''; - - if (this.settings.patterns.hasOwnProperty(pattern) && pattern.length > 0) { - return [el, this.settings.patterns[pattern], required]; - } else if (pattern.length > 0) { - return [el, new RegExp(pattern), required]; - } - - if (this.settings.patterns.hasOwnProperty(type)) { - return [el, this.settings.patterns[type], required]; - } - - pattern = /.*/; - - return [el, pattern, required]; - }, - - // TODO: Break this up into smaller methods, getting hard to read. - check_validation_and_apply_styles : function (el_patterns) { - var i = el_patterns.length, - validations = [], - form = this.S(el_patterns[0][0]).closest('[data-' + this.attr_name(true) + ']'), - settings = form.data(this.attr_name(true) + '-init') || {}; - while (i--) { - var el = el_patterns[i][0], - required = el_patterns[i][2], - value = el.value.trim(), - direct_parent = this.S(el).parent(), - validator = el.getAttribute(this.add_namespace('data-abide-validator')), - is_radio = el.type === "radio", - is_checkbox = el.type === "checkbox", - label = this.S('label[for="' + el.getAttribute('id') + '"]'), - valid_length = (required) ? (el.value.length > 0) : true, - el_validations = []; - - var parent, valid; - - // support old way to do equalTo validations - if(el.getAttribute(this.add_namespace('data-equalto'))) { validator = "equalTo" } - - if (!direct_parent.is('label')) { - parent = direct_parent; - } else { - parent = direct_parent.parent(); - } - - if (validator) { - valid = this.settings.validators[validator].apply(this, [el, required, parent]); - el_validations.push(valid); - } - - if (is_radio && required) { - el_validations.push(this.valid_radio(el, required)); - } else if (is_checkbox && required) { - el_validations.push(this.valid_checkbox(el, required)); - } else { - - if (el_patterns[i][1].test(value) && valid_length || - !required && el.value.length < 1 || $(el).attr('disabled')) { - el_validations.push(true); - } else { - el_validations.push(false); - } - - el_validations = [el_validations.every(function(valid){return valid;})]; - - if(el_validations[0]){ - this.S(el).removeAttr(this.invalid_attr); - el.setAttribute('aria-invalid', 'false'); - el.removeAttribute('aria-describedby'); - parent.removeClass(this.settings.error_class); - if (label.length > 0 && this.settings.error_labels) { - label.removeClass(this.settings.error_class).removeAttr('role'); - } - $(el).triggerHandler('valid'); - } else { - this.S(el).attr(this.invalid_attr, ''); - el.setAttribute('aria-invalid', 'true'); - - // Try to find the error associated with the input - var errorElem = parent.find('small.'+this.settings.error_class, 'span.'+this.settings.error_class); - var errorID = errorElem.length > 0 ? errorElem[0].id : ""; - if (errorID.length > 0) el.setAttribute('aria-describedby', errorID); - - // el.setAttribute('aria-describedby', $(el).find('.error')[0].id); - parent.addClass(this.settings.error_class); - if (label.length > 0 && this.settings.error_labels) { - label.addClass(this.settings.error_class).attr('role', 'alert'); - } - $(el).triggerHandler('invalid'); - } - } - validations.push(el_validations[0]); - } - validations = [validations.every(function(valid){return valid;})]; - return validations; - }, - - valid_checkbox : function(el, required) { - var el = this.S(el), - valid = (el.is(':checked') || !required); - - if (valid) { - el.removeAttr(this.invalid_attr).parent().removeClass(this.settings.error_class); - } else { - el.attr(this.invalid_attr, '').parent().addClass(this.settings.error_class); - } - - return valid; - }, - - valid_radio : function (el, required) { - var name = el.getAttribute('name'), - group = this.S(el).closest('[data-' + this.attr_name(true) + ']').find("[name='"+name+"']"), - count = group.length, - valid = false; - - // Has to count up to make sure the focus gets applied to the top error - for (var i=0; i < count; i++) { - if (group[i].checked) valid = true; - } - - // Has to count up to make sure the focus gets applied to the top error - for (var i=0; i < count; i++) { - if (valid) { - this.S(group[i]).removeAttr(this.invalid_attr).parent().removeClass(this.settings.error_class); - } else { - this.S(group[i]).attr(this.invalid_attr, '').parent().addClass(this.settings.error_class); - } - } - - return valid; - }, - - valid_equal: function(el, required, parent) { - var from = document.getElementById(el.getAttribute(this.add_namespace('data-equalto'))).value, - to = el.value, - valid = (from === to); - - if (valid) { - this.S(el).removeAttr(this.invalid_attr); - parent.removeClass(this.settings.error_class); - if (label.length > 0 && settings.error_labels) label.removeClass(this.settings.error_class); - } else { - this.S(el).attr(this.invalid_attr, ''); - parent.addClass(this.settings.error_class); - if (label.length > 0 && settings.error_labels) label.addClass(this.settings.error_class); - } - - return valid; - }, - - valid_oneof: function(el, required, parent, doNotValidateOthers) { - var el = this.S(el), - others = this.S('[' + this.add_namespace('data-oneof') + ']'), - valid = others.filter(':checked').length > 0; - - if (valid) { - el.removeAttr(this.invalid_attr).parent().removeClass(this.settings.error_class); - } else { - el.attr(this.invalid_attr, '').parent().addClass(this.settings.error_class); - } - - if (!doNotValidateOthers) { - var _this = this; - others.each(function() { - _this.valid_oneof.call(_this, this, null, null, true); - }); - } - - return valid; - } - }; -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.accordion.js b/src/opsoro/server/static/js/foundation/foundation.accordion.js deleted file mode 100644 index 1165d15..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.accordion.js +++ /dev/null @@ -1,67 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.accordion = { - name : 'accordion', - - version : '5.5.0', - - settings : { - content_class: 'content', - active_class: 'active', - multi_expand: false, - toggleable: true, - callback : function () {} - }, - - init : function (scope, method, options) { - this.bindings(method, options); - }, - - events : function () { - var self = this; - var S = this.S; - S(this.scope) - .off('.fndtn.accordion') - .on('click.fndtn.accordion', '[' + this.attr_name() + '] > .accordion-navigation > a', function (e) { - var accordion = S(this).closest('[' + self.attr_name() + ']'), - groupSelector = self.attr_name() + '=' + accordion.attr(self.attr_name()), - settings = accordion.data(self.attr_name(true) + '-init') || self.settings, - target = S('#' + this.href.split('#')[1]), - aunts = $('> .accordion-navigation', accordion), - siblings = aunts.children('.'+settings.content_class), - active_content = siblings.filter('.' + settings.active_class); - - e.preventDefault(); - - if (accordion.attr(self.attr_name())) { - siblings = siblings.add('[' + groupSelector + '] dd > '+'.'+settings.content_class); - aunts = aunts.add('[' + groupSelector + '] .accordion-navigation'); - } - - if (settings.toggleable && target.is(active_content)) { - target.parent('.accordion-navigation').toggleClass(settings.active_class, false); - target.toggleClass(settings.active_class, false); - settings.callback(target); - target.triggerHandler('toggled', [accordion]); - accordion.triggerHandler('toggled', [target]); - return; - } - - if (!settings.multi_expand) { - siblings.removeClass(settings.active_class); - aunts.removeClass(settings.active_class); - } - - target.addClass(settings.active_class).parent().addClass(settings.active_class); - settings.callback(target); - target.triggerHandler('toggled', [accordion]); - accordion.triggerHandler('toggled', [target]); - }); - }, - - off : function () {}, - - reflow : function () {} - }; -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.alert.js b/src/opsoro/server/static/js/foundation/foundation.alert.js deleted file mode 100644 index 69059c1..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.alert.js +++ /dev/null @@ -1,43 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.alert = { - name : 'alert', - - version : '5.5.0', - - settings : { - callback: function (){} - }, - - init : function (scope, method, options) { - this.bindings(method, options); - }, - - events : function () { - var self = this, - S = this.S; - - $(this.scope).off('.alert').on('click.fndtn.alert', '[' + this.attr_name() + '] .close', function (e) { - var alertBox = S(this).closest('[' + self.attr_name() + ']'), - settings = alertBox.data(self.attr_name(true) + '-init') || self.settings; - - e.preventDefault(); - if (Modernizr.csstransitions) { - alertBox.addClass('alert-close'); - alertBox.on('transitionend webkitTransitionEnd oTransitionEnd', function(e) { - S(this).trigger('close').trigger('close.fndtn.alert').remove(); - settings.callback(); - }); - } else { - alertBox.fadeOut(300, function () { - S(this).trigger('close').trigger('close.fndtn.alert').remove(); - settings.callback(); - }); - } - }); - }, - - reflow : function () {} - }; -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.clearing.js b/src/opsoro/server/static/js/foundation/foundation.clearing.js deleted file mode 100644 index e83d024..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.clearing.js +++ /dev/null @@ -1,558 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.clearing = { - name : 'clearing', - - version: '5.5.0', - - settings : { - templates : { - viewing : '×' + - '' - }, - - // comma delimited list of selectors that, on click, will close clearing, - // add 'div.clearing-blackout, div.visible-img' to close on background click - close_selectors : '.clearing-close, div.clearing-blackout', - - // Default to the entire li element. - open_selectors : '', - - // Image will be skipped in carousel. - skip_selector : '', - - touch_label : '', - - // event initializers and locks - init : false, - locked : false - }, - - init : function (scope, method, options) { - var self = this; - Foundation.inherit(this, 'throttle image_loaded'); - - this.bindings(method, options); - - if (self.S(this.scope).is('[' + this.attr_name() + ']')) { - this.assemble(self.S('li', this.scope)); - } else { - self.S('[' + this.attr_name() + ']', this.scope).each(function () { - self.assemble(self.S('li', this)); - }); - } - }, - - events : function (scope) { - var self = this, - S = self.S, - $scroll_container = $('.scroll-container'); - - if ($scroll_container.length > 0) { - this.scope = $scroll_container; - } - - S(this.scope) - .off('.clearing') - .on('click.fndtn.clearing', 'ul[' + this.attr_name() + '] li ' + this.settings.open_selectors, - function (e, current, target) { - var current = current || S(this), - target = target || current, - next = current.next('li'), - settings = current.closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init'), - image = S(e.target); - - e.preventDefault(); - - if (!settings) { - self.init(); - settings = current.closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init'); - } - - // if clearing is open and the current image is - // clicked, go to the next image in sequence - if (target.hasClass('visible') && - current[0] === target[0] && - next.length > 0 && self.is_open(current)) { - target = next; - image = S('img', target); - } - - // set current and target to the clicked li if not otherwise defined. - self.open(image, current, target); - self.update_paddles(target); - }) - - .on('click.fndtn.clearing', '.clearing-main-next', - function (e) { self.nav(e, 'next') }) - .on('click.fndtn.clearing', '.clearing-main-prev', - function (e) { self.nav(e, 'prev') }) - .on('click.fndtn.clearing', this.settings.close_selectors, - function (e) { Foundation.libs.clearing.close(e, this) }); - - $(document).on('keydown.fndtn.clearing', - function (e) { self.keydown(e) }); - - S(window).off('.clearing').on('resize.fndtn.clearing', - function () { self.resize() }); - - this.swipe_events(scope); - }, - - swipe_events : function (scope) { - var self = this, - S = self.S; - - S(this.scope) - .on('touchstart.fndtn.clearing', '.visible-img', function(e) { - if (!e.touches) { e = e.originalEvent; } - var data = { - start_page_x: e.touches[0].pageX, - start_page_y: e.touches[0].pageY, - start_time: (new Date()).getTime(), - delta_x: 0, - is_scrolling: undefined - }; - - S(this).data('swipe-transition', data); - e.stopPropagation(); - }) - .on('touchmove.fndtn.clearing', '.visible-img', function(e) { - if (!e.touches) { e = e.originalEvent; } - // Ignore pinch/zoom events - if(e.touches.length > 1 || e.scale && e.scale !== 1) return; - - var data = S(this).data('swipe-transition'); - - if (typeof data === 'undefined') { - data = {}; - } - - data.delta_x = e.touches[0].pageX - data.start_page_x; - - if (Foundation.rtl) { - data.delta_x = -data.delta_x; - } - - if (typeof data.is_scrolling === 'undefined') { - data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) ); - } - - if (!data.is_scrolling && !data.active) { - e.preventDefault(); - var direction = (data.delta_x < 0) ? 'next' : 'prev'; - data.active = true; - self.nav(e, direction); - } - }) - .on('touchend.fndtn.clearing', '.visible-img', function(e) { - S(this).data('swipe-transition', {}); - e.stopPropagation(); - }); - }, - - assemble : function ($li) { - var $el = $li.parent(); - - if ($el.parent().hasClass('carousel')) { - return; - } - - $el.after('
          '); - - var grid = $el.detach(), - grid_outerHTML = ''; - - if (grid[0] == null) { - return; - } else { - grid_outerHTML = grid[0].outerHTML; - } - - var holder = this.S('#foundationClearingHolder'), - settings = $el.data(this.attr_name(true) + '-init'), - data = { - grid: '', - viewing: settings.templates.viewing - }, - wrapper = '
          ' + data.viewing + - data.grid + '
          ', - touch_label = this.settings.touch_label; - - if (Modernizr.touch) { - wrapper = $(wrapper).find('.clearing-touch-label').html(touch_label).end(); - } - - holder.after(wrapper).remove(); - }, - - open : function ($image, current, target) { - var self = this, - body = $(document.body), - root = target.closest('.clearing-assembled'), - container = self.S('div', root).first(), - visible_image = self.S('.visible-img', container), - image = self.S('img', visible_image).not($image), - label = self.S('.clearing-touch-label', container), - error = false; - - // Event to disable scrolling on touch devices when Clearing is activated - $('body').on('touchmove',function(e){ - e.preventDefault(); - }); - - image.error(function () { - error = true; - }); - - function startLoad() { - setTimeout(function () { - this.image_loaded(image, function () { - if (image.outerWidth() === 1 && !error) { - startLoad.call(this); - } else { - cb.call(this, image); - } - }.bind(this)); - }.bind(this), 100); - } - - function cb (image) { - var $image = $(image); - $image.css('visibility', 'visible'); - // toggle the gallery - body.css('overflow', 'hidden'); - root.addClass('clearing-blackout'); - container.addClass('clearing-container'); - visible_image.show(); - this.fix_height(target) - .caption(self.S('.clearing-caption', visible_image), self.S('img', target)) - .center_and_label(image, label) - .shift(current, target, function () { - target.closest('li').siblings().removeClass('visible'); - target.closest('li').addClass('visible'); - }); - visible_image.trigger('opened.fndtn.clearing') - } - - if (!this.locked()) { - visible_image.trigger('open.fndtn.clearing'); - // set the image to the selected thumbnail - image - .attr('src', this.load($image)) - .css('visibility', 'hidden'); - - startLoad.call(this); - } - }, - - close : function (e, el) { - e.preventDefault(); - - var root = (function (target) { - if (/blackout/.test(target.selector)) { - return target; - } else { - return target.closest('.clearing-blackout'); - } - }($(el))), - body = $(document.body), container, visible_image; - - if (el === e.target && root) { - body.css('overflow', ''); - container = $('div', root).first(); - visible_image = $('.visible-img', container); - visible_image.trigger('close.fndtn.clearing'); - this.settings.prev_index = 0; - $('ul[' + this.attr_name() + ']', root) - .attr('style', '').closest('.clearing-blackout') - .removeClass('clearing-blackout'); - container.removeClass('clearing-container'); - visible_image.hide(); - visible_image.trigger('closed.fndtn.clearing'); - } - - // Event to re-enable scrolling on touch devices - $('body').off('touchmove'); - - return false; - }, - - is_open : function (current) { - return current.parent().prop('style').length > 0; - }, - - keydown : function (e) { - var clearing = $('.clearing-blackout ul[' + this.attr_name() + ']'), - NEXT_KEY = this.rtl ? 37 : 39, - PREV_KEY = this.rtl ? 39 : 37, - ESC_KEY = 27; - - if (e.which === NEXT_KEY) this.go(clearing, 'next'); - if (e.which === PREV_KEY) this.go(clearing, 'prev'); - if (e.which === ESC_KEY) this.S('a.clearing-close').trigger('click').trigger('click.fndtn.clearing'); - }, - - nav : function (e, direction) { - var clearing = $('ul[' + this.attr_name() + ']', '.clearing-blackout'); - - e.preventDefault(); - this.go(clearing, direction); - }, - - resize : function () { - var image = $('img', '.clearing-blackout .visible-img'), - label = $('.clearing-touch-label', '.clearing-blackout'); - - if (image.length) { - this.center_and_label(image, label); - image.trigger('resized.fndtn.clearing') - } - }, - - // visual adjustments - fix_height : function (target) { - var lis = target.parent().children(), - self = this; - - lis.each(function () { - var li = self.S(this), - image = li.find('img'); - - if (li.height() > image.outerHeight()) { - li.addClass('fix-height'); - } - }) - .closest('ul') - .width(lis.length * 100 + '%'); - - return this; - }, - - update_paddles : function (target) { - target = target.closest('li'); - var visible_image = target - .closest('.carousel') - .siblings('.visible-img'); - - if (target.next().length > 0) { - this.S('.clearing-main-next', visible_image).removeClass('disabled'); - } else { - this.S('.clearing-main-next', visible_image).addClass('disabled'); - } - - if (target.prev().length > 0) { - this.S('.clearing-main-prev', visible_image).removeClass('disabled'); - } else { - this.S('.clearing-main-prev', visible_image).addClass('disabled'); - } - }, - - center_and_label : function (target, label) { - if (!this.rtl) { - target.css({ - marginLeft : -(target.outerWidth() / 2), - marginTop : -(target.outerHeight() / 2) - }); - - if (label.length > 0) { - label.css({ - marginLeft : -(label.outerWidth() / 2), - marginTop : -(target.outerHeight() / 2)-label.outerHeight()-10 - }); - } - } else { - target.css({ - marginRight : -(target.outerWidth() / 2), - marginTop : -(target.outerHeight() / 2), - left: 'auto', - right: '50%' - }); - - if (label.length > 0) { - label.css({ - marginRight : -(label.outerWidth() / 2), - marginTop : -(target.outerHeight() / 2)-label.outerHeight()-10, - left: 'auto', - right: '50%' - }); - } - } - return this; - }, - - // image loading and preloading - - load : function ($image) { - var href; - - if ($image[0].nodeName === 'A') { - href = $image.attr('href'); - } else { - href = $image.closest('a').attr('href'); - } - - this.preload($image); - - if (href) return href; - return $image.attr('src'); - }, - - preload : function ($image) { - this - .img($image.closest('li').next()) - .img($image.closest('li').prev()); - }, - - img : function (img) { - if (img.length) { - var new_img = new Image(), - new_a = this.S('a', img); - - if (new_a.length) { - new_img.src = new_a.attr('href'); - } else { - new_img.src = this.S('img', img).attr('src'); - } - } - return this; - }, - - // image caption - - caption : function (container, $image) { - var caption = $image.attr('data-caption'); - - if (caption) { - container - .html(caption) - .show(); - } else { - container - .text('') - .hide(); - } - return this; - }, - - // directional methods - - go : function ($ul, direction) { - var current = this.S('.visible', $ul), - target = current[direction](); - - // Check for skip selector. - if (this.settings.skip_selector && target.find(this.settings.skip_selector).length != 0) { - target = target[direction](); - } - - if (target.length) { - this.S('img', target) - .trigger('click', [current, target]).trigger('click.fndtn.clearing', [current, target]) - .trigger('change.fndtn.clearing'); - } - }, - - shift : function (current, target, callback) { - var clearing = target.parent(), - old_index = this.settings.prev_index || target.index(), - direction = this.direction(clearing, current, target), - dir = this.rtl ? 'right' : 'left', - left = parseInt(clearing.css('left'), 10), - width = target.outerWidth(), - skip_shift; - - var dir_obj = {}; - - // we use jQuery animate instead of CSS transitions because we - // need a callback to unlock the next animation - // needs support for RTL ** - if (target.index() !== old_index && !/skip/.test(direction)){ - if (/left/.test(direction)) { - this.lock(); - dir_obj[dir] = left + width; - clearing.animate(dir_obj, 300, this.unlock()); - } else if (/right/.test(direction)) { - this.lock(); - dir_obj[dir] = left - width; - clearing.animate(dir_obj, 300, this.unlock()); - } - } else if (/skip/.test(direction)) { - // the target image is not adjacent to the current image, so - // do we scroll right or not - skip_shift = target.index() - this.settings.up_count; - this.lock(); - - if (skip_shift > 0) { - dir_obj[dir] = -(skip_shift * width); - clearing.animate(dir_obj, 300, this.unlock()); - } else { - dir_obj[dir] = 0; - clearing.animate(dir_obj, 300, this.unlock()); - } - } - - callback(); - }, - - direction : function ($el, current, target) { - var lis = this.S('li', $el), - li_width = lis.outerWidth() + (lis.outerWidth() / 4), - up_count = Math.floor(this.S('.clearing-container').outerWidth() / li_width) - 1, - target_index = lis.index(target), - response; - - this.settings.up_count = up_count; - - if (this.adjacent(this.settings.prev_index, target_index)) { - if ((target_index > up_count) && target_index > this.settings.prev_index) { - response = 'right'; - } else if ((target_index > up_count - 1) && target_index <= this.settings.prev_index) { - response = 'left'; - } else { - response = false; - } - } else { - response = 'skip'; - } - - this.settings.prev_index = target_index; - - return response; - }, - - adjacent : function (current_index, target_index) { - for (var i = target_index + 1; i >= target_index - 1; i--) { - if (i === current_index) return true; - } - return false; - }, - - // lock management - - lock : function () { - this.settings.locked = true; - }, - - unlock : function () { - this.settings.locked = false; - }, - - locked : function () { - return this.settings.locked; - }, - - off : function () { - this.S(this.scope).off('.fndtn.clearing'); - this.S(window).off('.fndtn.clearing'); - }, - - reflow : function () { - this.init(); - } - }; - -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.dropdown.js b/src/opsoro/server/static/js/foundation/foundation.dropdown.js deleted file mode 100644 index 69ad8f2..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.dropdown.js +++ /dev/null @@ -1,439 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.dropdown = { - name : 'dropdown', - - version : '5.5.0', - - settings : { - active_class: 'open', - disabled_class: 'disabled', - mega_class: 'mega', - align: 'bottom', - is_hover: false, - hover_timeout: 150, - opened: function(){}, - closed: function(){} - }, - - init : function (scope, method, options) { - Foundation.inherit(this, 'throttle'); - - $.extend(true, this.settings, method, options); - this.bindings(method, options); - }, - - events : function (scope) { - var self = this, - S = self.S; - - S(this.scope) - .off('.dropdown') - .on('click.fndtn.dropdown', '[' + this.attr_name() + ']', function (e) { - var settings = S(this).data(self.attr_name(true) + '-init') || self.settings; - if (!settings.is_hover || Modernizr.touch) { - e.preventDefault(); - if (S(this).parent('[data-reveal-id]')) { - e.stopPropagation(); - } - self.toggle($(this)); - } - }) - .on('mouseenter.fndtn.dropdown', '[' + this.attr_name() + '], [' + this.attr_name() + '-content]', function (e) { - var $this = S(this), - dropdown, - target; - - clearTimeout(self.timeout); - - if ($this.data(self.data_attr())) { - dropdown = S('#' + $this.data(self.data_attr())); - target = $this; - } else { - dropdown = $this; - target = S('[' + self.attr_name() + '="' + dropdown.attr('id') + '"]'); - } - - var settings = target.data(self.attr_name(true) + '-init') || self.settings; - - if(S(e.currentTarget).data(self.data_attr()) && settings.is_hover) { - self.closeall.call(self); - } - - if (settings.is_hover) self.open.apply(self, [dropdown, target]); - }) - .on('mouseleave.fndtn.dropdown', '[' + this.attr_name() + '], [' + this.attr_name() + '-content]', function (e) { - var $this = S(this); - var settings; - - if ($this.data(self.data_attr())) { - settings = $this.data(self.data_attr(true) + '-init') || self.settings; - } - else { - var target = S('[' + self.attr_name() + '="' + S(this).attr('id') + '"]'), - settings = target.data(self.attr_name(true) + '-init') || self.settings; - } - - self.timeout = setTimeout(function () { - if ($this.data(self.data_attr())) { - if (settings.is_hover) self.close.call(self, S('#' + $this.data(self.data_attr()))); - } else { - if (settings.is_hover) self.close.call(self, $this); - } - }.bind(this), settings.hover_timeout); - }) - .on('click.fndtn.dropdown', function (e) { - var parent = S(e.target).closest('[' + self.attr_name() + '-content]'); - var links = parent.find('a'); - - if (links.length > 0 && parent.attr('aria-autoclose') !== "false") { - self.close.call(self, S('[' + self.attr_name() + '-content]')); - } - - if (S(e.target).closest('[' + self.attr_name() + ']').length > 0) { - return; - } - - if (!(S(e.target).data('revealId')) && - (parent.length > 0 && (S(e.target).is('[' + self.attr_name() + '-content]') || - $.contains(parent.first()[0], e.target)))) { - e.stopPropagation(); - return; - } - - self.close.call(self, S('[' + self.attr_name() + '-content]')); - }) - .on('opened.fndtn.dropdown', '[' + self.attr_name() + '-content]', function () { - self.settings.opened.call(this); - }) - .on('closed.fndtn.dropdown', '[' + self.attr_name() + '-content]', function () { - self.settings.closed.call(this); - }); - - S(window) - .off('.dropdown') - .on('resize.fndtn.dropdown', self.throttle(function () { - self.resize.call(self); - }, 50)); - - this.resize(); - }, - - close: function (dropdown) { - var self = this; - dropdown.each(function () { - var original_target = $('[' + self.attr_name() + '=' + dropdown[0].id + ']') || $('aria-controls=' + dropdown[0].id+ ']'); - original_target.attr('aria-expanded', 'false'); - if (self.S(this).hasClass(self.settings.active_class)) { - self.S(this) - .css(Foundation.rtl ? 'right':'left', '-99999px') - .attr('aria-hidden', 'true') - .removeClass(self.settings.active_class) - .prev('[' + self.attr_name() + ']') - .removeClass(self.settings.active_class) - .removeData('target'); - - self.S(this).trigger('closed').trigger('closed.fndtn.dropdown', [dropdown]); - } - }); - dropdown.removeClass('f-open-' + this.attr_name(true)); - }, - - closeall: function() { - var self = this; - $.each(self.S('.f-open-' + this.attr_name(true)), function() { - self.close.call(self, self.S(this)); - }); - }, - - open: function (dropdown, target) { - this - .css(dropdown - .addClass(this.settings.active_class), target); - dropdown.prev('[' + this.attr_name() + ']').addClass(this.settings.active_class); - dropdown.data('target', target.get(0)).trigger('opened').trigger('opened.fndtn.dropdown', [dropdown, target]); - dropdown.attr('aria-hidden', 'false'); - target.attr('aria-expanded', 'true'); - dropdown.focus(); - dropdown.addClass('f-open-' + this.attr_name(true)); - }, - - data_attr: function () { - if (this.namespace.length > 0) { - return this.namespace + '-' + this.name; - } - - return this.name; - }, - - toggle : function (target) { - if (target.hasClass(this.settings.disabled_class)) { - return; - } - var dropdown = this.S('#' + target.data(this.data_attr())); - if (dropdown.length === 0) { - // No dropdown found, not continuing - return; - } - - this.close.call(this, this.S('[' + this.attr_name() + '-content]').not(dropdown)); - - if (dropdown.hasClass(this.settings.active_class)) { - this.close.call(this, dropdown); - if (dropdown.data('target') !== target.get(0)) - this.open.call(this, dropdown, target); - } else { - this.open.call(this, dropdown, target); - } - }, - - resize : function () { - var dropdown = this.S('[' + this.attr_name() + '-content].open'), - target = this.S('[' + this.attr_name() + '="' + dropdown.attr('id') + '"]'); - - if (dropdown.length && target.length) { - this.css(dropdown, target); - } - }, - - css : function (dropdown, target) { - var left_offset = Math.max((target.width() - dropdown.width()) / 2, 8), - settings = target.data(this.attr_name(true) + '-init') || this.settings; - - this.clear_idx(); - - if (this.small()) { - var p = this.dirs.bottom.call(dropdown, target, settings); - - dropdown.attr('style', '').removeClass('drop-left drop-right drop-top').css({ - position : 'absolute', - width: '95%', - 'max-width': 'none', - top: p.top - }); - - dropdown.css(Foundation.rtl ? 'right':'left', left_offset); - } else { - - this.style(dropdown, target, settings); - } - - return dropdown; - }, - - style : function (dropdown, target, settings) { - var css = $.extend({position: 'absolute'}, - this.dirs[settings.align].call(dropdown, target, settings)); - - dropdown.attr('style', '').css(css); - }, - - // return CSS property object - // `this` is the dropdown - dirs : { - // Calculate target offset - _base : function (t) { - var o_p = this.offsetParent(), - o = o_p.offset(), - p = t.offset(); - - p.top -= o.top; - p.left -= o.left; - - //set some flags on the p object to pass along - p.missRight = false; - p.missTop = false; - p.missLeft = false; - p.leftRightFlag = false; - - //lets see if the panel will be off the screen - //get the actual width of the page and store it - var actualBodyWidth; - if (document.getElementsByClassName('row')[0]) { - actualBodyWidth = document.getElementsByClassName('row')[0].clientWidth; - } else { - actualBodyWidth = window.outerWidth; - } - - var actualMarginWidth = (window.outerWidth - actualBodyWidth) / 2; - var actualBoundary = actualBodyWidth; - - if (!this.hasClass('mega')) { - //miss top - if (t.offset().top <= this.outerHeight()) { - p.missTop = true; - actualBoundary = window.outerWidth - actualMarginWidth; - p.leftRightFlag = true; - } - - //miss right - if (t.offset().left + this.outerWidth() > t.offset().left + actualMarginWidth && t.offset().left - actualMarginWidth > this.outerWidth()) { - p.missRight = true; - p.missLeft = false; - } - - //miss left - if (t.offset().left - this.outerWidth() <= 0) { - p.missLeft = true; - p.missRight = false; - } - } - - return p; - }, - - top: function (t, s) { - var self = Foundation.libs.dropdown, - p = self.dirs._base.call(this, t); - - this.addClass('drop-top'); - - if (p.missTop == true) { - p.top = p.top + t.outerHeight() + this.outerHeight(); - this.removeClass('drop-top'); - } - - if (p.missRight == true) { - p.left = p.left - this.outerWidth() + t.outerWidth(); - } - - if (t.outerWidth() < this.outerWidth() || self.small() || this.hasClass(s.mega_menu)) { - self.adjust_pip(this,t,s,p); - } - - if (Foundation.rtl) { - return {left: p.left - this.outerWidth() + t.outerWidth(), - top: p.top - this.outerHeight()}; - } - - return {left: p.left, top: p.top - this.outerHeight()}; - }, - - bottom: function (t,s) { - var self = Foundation.libs.dropdown, - p = self.dirs._base.call(this, t); - - if (p.missRight == true) { - p.left = p.left - this.outerWidth() + t.outerWidth(); - } - - if (t.outerWidth() < this.outerWidth() || self.small() || this.hasClass(s.mega_menu)) { - self.adjust_pip(this,t,s,p); - } - - if (self.rtl) { - return {left: p.left - this.outerWidth() + t.outerWidth(), top: p.top + t.outerHeight()}; - } - - return {left: p.left, top: p.top + t.outerHeight()}; - }, - - left: function (t, s) { - var p = Foundation.libs.dropdown.dirs._base.call(this, t); - - this.addClass('drop-left'); - - if (p.missLeft == true) { - p.left = p.left + this.outerWidth(); - p.top = p.top + t.outerHeight(); - this.removeClass('drop-left'); - } - - return {left: p.left - this.outerWidth(), top: p.top}; - }, - - right: function (t, s) { - var p = Foundation.libs.dropdown.dirs._base.call(this, t); - - this.addClass('drop-right'); - - if (p.missRight == true) { - p.left = p.left - this.outerWidth(); - p.top = p.top + t.outerHeight(); - this.removeClass('drop-right'); - } else { - p.triggeredRight = true; - } - - var self = Foundation.libs.dropdown; - - if (t.outerWidth() < this.outerWidth() || self.small() || this.hasClass(s.mega_menu)) { - self.adjust_pip(this,t,s,p); - } - - return {left: p.left + t.outerWidth(), top: p.top}; - } - }, - - // Insert rule to style psuedo elements - adjust_pip : function (dropdown,target,settings,position) { - var sheet = Foundation.stylesheet, - pip_offset_base = 8; - - if (dropdown.hasClass(settings.mega_class)) { - pip_offset_base = position.left + (target.outerWidth()/2) - 8; - } - else if (this.small()) { - pip_offset_base += position.left - 8; - } - - this.rule_idx = sheet.cssRules.length; - - //default - var sel_before = '.f-dropdown.open:before', - sel_after = '.f-dropdown.open:after', - css_before = 'left: ' + pip_offset_base + 'px;', - css_after = 'left: ' + (pip_offset_base - 1) + 'px;'; - - if (position.missRight == true) { - pip_offset_base = dropdown.outerWidth() - 23; - sel_before = '.f-dropdown.open:before', - sel_after = '.f-dropdown.open:after', - css_before = 'left: ' + pip_offset_base + 'px;', - css_after = 'left: ' + (pip_offset_base - 1) + 'px;'; - } - - //just a case where right is fired, but its not missing right - if (position.triggeredRight == true) { - sel_before = '.f-dropdown.open:before', - sel_after = '.f-dropdown.open:after', - css_before = 'left:-12px;', - css_after = 'left:-14px;'; - } - - if (sheet.insertRule) { - sheet.insertRule([sel_before, '{', css_before, '}'].join(' '), this.rule_idx); - sheet.insertRule([sel_after, '{', css_after, '}'].join(' '), this.rule_idx + 1); - } else { - sheet.addRule(sel_before, css_before, this.rule_idx); - sheet.addRule(sel_after, css_after, this.rule_idx + 1); - } - }, - - // Remove old dropdown rule index - clear_idx : function () { - var sheet = Foundation.stylesheet; - - if (typeof this.rule_idx !== 'undefined') { - sheet.deleteRule(this.rule_idx); - sheet.deleteRule(this.rule_idx); - delete this.rule_idx; - } - }, - - small : function () { - return matchMedia(Foundation.media_queries.small).matches && - !matchMedia(Foundation.media_queries.medium).matches; - }, - - off: function () { - this.S(this.scope).off('.fndtn.dropdown'); - this.S('html, body').off('.fndtn.dropdown'); - this.S(window).off('.fndtn.dropdown'); - this.S('[data-dropdown-content]').off('.fndtn.dropdown'); - }, - - reflow : function () {} - }; -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.equalizer.js b/src/opsoro/server/static/js/foundation/foundation.equalizer.js deleted file mode 100644 index 1c8f0b6..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.equalizer.js +++ /dev/null @@ -1,73 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.equalizer = { - name : 'equalizer', - - version : '5.5.0', - - settings : { - use_tallest: true, - before_height_change: $.noop, - after_height_change: $.noop, - equalize_on_stack: false - }, - - init : function (scope, method, options) { - Foundation.inherit(this, 'image_loaded'); - this.bindings(method, options); - this.reflow(); - }, - - events : function () { - this.S(window).off('.equalizer').on('resize.fndtn.equalizer', function(e){ - this.reflow(); - }.bind(this)); - }, - - equalize: function(equalizer) { - var isStacked = false, - vals = equalizer.find('[' + this.attr_name() + '-watch]:visible'), - settings = equalizer.data(this.attr_name(true)+'-init'); - - if (vals.length === 0) return; - var firstTopOffset = vals.first().offset().top; - settings.before_height_change(); - equalizer.trigger('before-height-change').trigger('before-height-change.fndth.equalizer'); - vals.height('inherit'); - vals.each(function(){ - var el = $(this); - if (el.offset().top !== firstTopOffset) { - isStacked = true; - } - }); - - if (settings.equalize_on_stack === false) { - if (isStacked) return; - }; - - var heights = vals.map(function(){ return $(this).outerHeight(false) }).get(); - - if (settings.use_tallest) { - var max = Math.max.apply(null, heights); - vals.css('height', max); - } else { - var min = Math.min.apply(null, heights); - vals.css('height', min); - } - settings.after_height_change(); - equalizer.trigger('after-height-change').trigger('after-height-change.fndtn.equalizer'); - }, - - reflow : function () { - var self = this; - - this.S('[' + this.attr_name() + ']', this.scope).each(function(){ - var $eq_target = $(this); - self.image_loaded(self.S('img', this), function(){ - self.equalize($eq_target) - }); - }); - } - }; -})(jQuery, window, window.document); diff --git a/src/opsoro/server/static/js/foundation/foundation.interchange.js b/src/opsoro/server/static/js/foundation/foundation.interchange.js deleted file mode 100644 index 7afcceb..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.interchange.js +++ /dev/null @@ -1,348 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.interchange = { - name : 'interchange', - - version : '5.5.0', - - cache : {}, - - images_loaded : false, - nodes_loaded : false, - - settings : { - load_attr : 'interchange', - - named_queries : { - 'default' : 'only screen', - 'small' : Foundation.media_queries['small'], - 'small-only' : Foundation.media_queries['small-only'], - 'medium' : Foundation.media_queries['medium'], - 'medium-only' : Foundation.media_queries['medium-only'], - 'large' : Foundation.media_queries['large'], - 'large-only' : Foundation.media_queries['large-only'], - 'xlarge' : Foundation.media_queries['xlarge'], - 'xlarge-only' : Foundation.media_queries['xlarge-only'], - 'xxlarge' : Foundation.media_queries['xxlarge'], - 'landscape' : 'only screen and (orientation: landscape)', - 'portrait' : 'only screen and (orientation: portrait)', - 'retina' : 'only screen and (-webkit-min-device-pixel-ratio: 2),' + - 'only screen and (min--moz-device-pixel-ratio: 2),' + - 'only screen and (-o-min-device-pixel-ratio: 2/1),' + - 'only screen and (min-device-pixel-ratio: 2),' + - 'only screen and (min-resolution: 192dpi),' + - 'only screen and (min-resolution: 2dppx)' - }, - - directives : { - replace: function (el, path, trigger) { - // The trigger argument, if called within the directive, fires - // an event named after the directive on the element, passing - // any parameters along to the event that you pass to trigger. - // - // ex. trigger(), trigger([a, b, c]), or trigger(a, b, c) - // - // This allows you to bind a callback like so: - // $('#interchangeContainer').on('replace', function (e, a, b, c) { - // console.log($(this).html(), a, b, c); - // }); - - if (/IMG/.test(el[0].nodeName)) { - var orig_path = el[0].src; - - if (new RegExp(path, 'i').test(orig_path)) return; - - el[0].src = path; - - return trigger(el[0].src); - } - var last_path = el.data(this.data_attr + '-last-path'), - self = this; - - if (last_path == path) return; - - if (/\.(gif|jpg|jpeg|tiff|png)([?#].*)?/i.test(path)) { - $(el).css('background-image', 'url('+path+')'); - el.data('interchange-last-path', path); - return trigger(path); - } - - return $.get(path, function (response) { - el.html(response); - el.data(self.data_attr + '-last-path', path); - trigger(); - }); - - } - } - }, - - init : function (scope, method, options) { - Foundation.inherit(this, 'throttle random_str'); - - this.data_attr = this.set_data_attr(); - $.extend(true, this.settings, method, options); - this.bindings(method, options); - this.load('images'); - this.load('nodes'); - }, - - get_media_hash : function() { - var mediaHash=''; - for (var queryName in this.settings.named_queries ) { - mediaHash += matchMedia(this.settings.named_queries[queryName]).matches.toString(); - } - return mediaHash; - }, - - events : function () { - var self = this, prevMediaHash; - - $(window) - .off('.interchange') - .on('resize.fndtn.interchange', self.throttle(function () { - var currMediaHash = self.get_media_hash(); - if (currMediaHash !== prevMediaHash) { - self.resize(); - } - prevMediaHash = currMediaHash; - }, 50)); - - return this; - }, - - resize : function () { - var cache = this.cache; - - if(!this.images_loaded || !this.nodes_loaded) { - setTimeout($.proxy(this.resize, this), 50); - return; - } - - for (var uuid in cache) { - if (cache.hasOwnProperty(uuid)) { - var passed = this.results(uuid, cache[uuid]); - - if (passed) { - this.settings.directives[passed - .scenario[1]].call(this, passed.el, passed.scenario[0], function () { - if (arguments[0] instanceof Array) { - var args = arguments[0]; - } else { - var args = Array.prototype.slice.call(arguments, 0); - } - - passed.el.trigger(passed.scenario[1], args); - }); - } - } - } - - }, - - results : function (uuid, scenarios) { - var count = scenarios.length; - - if (count > 0) { - var el = this.S('[' + this.add_namespace('data-uuid') + '="' + uuid + '"]'); - - while (count--) { - var mq, rule = scenarios[count][2]; - if (this.settings.named_queries.hasOwnProperty(rule)) { - mq = matchMedia(this.settings.named_queries[rule]); - } else { - mq = matchMedia(rule); - } - if (mq.matches) { - return {el: el, scenario: scenarios[count]}; - } - } - } - - return false; - }, - - load : function (type, force_update) { - if (typeof this['cached_' + type] === 'undefined' || force_update) { - this['update_' + type](); - } - - return this['cached_' + type]; - }, - - update_images : function () { - var images = this.S('img[' + this.data_attr + ']'), - count = images.length, - i = count, - loaded_count = 0, - data_attr = this.data_attr; - - this.cache = {}; - this.cached_images = []; - this.images_loaded = (count === 0); - - while (i--) { - loaded_count++; - if (images[i]) { - var str = images[i].getAttribute(data_attr) || ''; - - if (str.length > 0) { - this.cached_images.push(images[i]); - } - } - - if (loaded_count === count) { - this.images_loaded = true; - this.enhance('images'); - } - } - - return this; - }, - - update_nodes : function () { - var nodes = this.S('[' + this.data_attr + ']').not('img'), - count = nodes.length, - i = count, - loaded_count = 0, - data_attr = this.data_attr; - - this.cached_nodes = []; - this.nodes_loaded = (count === 0); - - - while (i--) { - loaded_count++; - var str = nodes[i].getAttribute(data_attr) || ''; - - if (str.length > 0) { - this.cached_nodes.push(nodes[i]); - } - - if(loaded_count === count) { - this.nodes_loaded = true; - this.enhance('nodes'); - } - } - - return this; - }, - - enhance : function (type) { - var i = this['cached_' + type].length; - - while (i--) { - this.object($(this['cached_' + type][i])); - } - - return $(window).trigger('resize').trigger('resize.fndtn.interchange'); - }, - - convert_directive : function (directive) { - - var trimmed = this.trim(directive); - - if (trimmed.length > 0) { - return trimmed; - } - - return 'replace'; - }, - - parse_scenario : function (scenario) { - // This logic had to be made more complex since some users were using commas in the url path - // So we cannot simply just split on a comma - var directive_match = scenario[0].match(/(.+),\s*(\w+)\s*$/), - media_query = scenario[1]; - - if (directive_match) { - var path = directive_match[1], - directive = directive_match[2]; - } - else { - var cached_split = scenario[0].split(/,\s*$/), - path = cached_split[0], - directive = ''; - } - - return [this.trim(path), this.convert_directive(directive), this.trim(media_query)]; - }, - - object : function(el) { - var raw_arr = this.parse_data_attr(el), - scenarios = [], - i = raw_arr.length; - - if (i > 0) { - while (i--) { - var split = raw_arr[i].split(/\((.*?)(\))$/); - - if (split.length > 1) { - var params = this.parse_scenario(split); - scenarios.push(params); - } - } - } - - return this.store(el, scenarios); - }, - - store : function (el, scenarios) { - var uuid = this.random_str(), - current_uuid = el.data(this.add_namespace('uuid', true)); - - if (this.cache[current_uuid]) return this.cache[current_uuid]; - - el.attr(this.add_namespace('data-uuid'), uuid); - - return this.cache[uuid] = scenarios; - }, - - trim : function(str) { - - if (typeof str === 'string') { - return $.trim(str); - } - - return str; - }, - - set_data_attr: function (init) { - if (init) { - if (this.namespace.length > 0) { - return this.namespace + '-' + this.settings.load_attr; - } - - return this.settings.load_attr; - } - - if (this.namespace.length > 0) { - return 'data-' + this.namespace + '-' + this.settings.load_attr; - } - - return 'data-' + this.settings.load_attr; - }, - - parse_data_attr : function (el) { - var raw = el.attr(this.attr_name()).split(/\[(.*?)\]/), - i = raw.length, - output = []; - - while (i--) { - if (raw[i].replace(/[\W\d]+/, '').length > 4) { - output.push(raw[i]); - } - } - - return output; - }, - - reflow : function () { - this.load('images', true); - this.load('nodes', true); - } - - }; - -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.joyride.js b/src/opsoro/server/static/js/foundation/foundation.joyride.js deleted file mode 100644 index a62c1a2..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.joyride.js +++ /dev/null @@ -1,924 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - var Modernizr = Modernizr || false; - - Foundation.libs.joyride = { - name : 'joyride', - - version : '5.5.0', - - defaults : { - expose : false, // turn on or off the expose feature - modal : true, // Whether to cover page with modal during the tour - keyboard : true, // enable left, right and esc keystrokes - tip_location : 'bottom', // 'top' or 'bottom' in relation to parent - nub_position : 'auto', // override on a per tooltip bases - scroll_speed : 1500, // Page scrolling speed in milliseconds, 0 = no scroll animation - scroll_animation : 'linear', // supports 'swing' and 'linear', extend with jQuery UI. - timer : 0, // 0 = no timer , all other numbers = timer in milliseconds - start_timer_on_click : true, // true or false - true requires clicking the first button start the timer - start_offset : 0, // the index of the tooltip you want to start on (index of the li) - next_button : true, // true or false to control whether a next button is used - prev_button : true, // true or false to control whether a prev button is used - tip_animation : 'fade', // 'pop' or 'fade' in each tip - pause_after : [], // array of indexes where to pause the tour after - exposed : [], // array of expose elements - tip_animation_fade_speed : 300, // when tipAnimation = 'fade' this is speed in milliseconds for the transition - cookie_monster : false, // true or false to control whether cookies are used - cookie_name : 'joyride', // Name the cookie you'll use - cookie_domain : false, // Will this cookie be attached to a domain, ie. '.notableapp.com' - cookie_expires : 365, // set when you would like the cookie to expire. - tip_container : 'body', // Where will the tip be attached - abort_on_close : true, // When true, the close event will not fire any callback - tip_location_patterns : { - top: ['bottom'], - bottom: [], // bottom should not need to be repositioned - left: ['right', 'top', 'bottom'], - right: ['left', 'top', 'bottom'] - }, - post_ride_callback : function (){}, // A method to call once the tour closes (canceled or complete) - post_step_callback : function (){}, // A method to call after each step - pre_step_callback : function (){}, // A method to call before each step - pre_ride_callback : function (){}, // A method to call before the tour starts (passed index, tip, and cloned exposed element) - post_expose_callback : function (){}, // A method to call after an element has been exposed - template : { // HTML segments for tip layout - link : '×', - timer : '
          ', - tip : '
          ', - wrapper : '
          ', - button : '', - prev_button : '', - modal : '
          ', - expose : '
          ', - expose_cover : '
          ' - }, - expose_add_class : '' // One or more space-separated class names to be added to exposed element - }, - - init : function (scope, method, options) { - Foundation.inherit(this, 'throttle random_str'); - - this.settings = this.settings || $.extend({}, this.defaults, (options || method)); - - this.bindings(method, options) - }, - - go_next : function() { - if (this.settings.$li.next().length < 1) { - this.end(); - } else if (this.settings.timer > 0) { - clearTimeout(this.settings.automate); - this.hide(); - this.show(); - this.startTimer(); - } else { - this.hide(); - this.show(); - } - }, - - go_prev : function() { - if (this.settings.$li.prev().length < 1) { - // Do nothing if there are no prev element - } else if (this.settings.timer > 0) { - clearTimeout(this.settings.automate); - this.hide(); - this.show(null, true); - this.startTimer(); - } else { - this.hide(); - this.show(null, true); - } - }, - - events : function () { - var self = this; - - $(this.scope) - .off('.joyride') - .on('click.fndtn.joyride', '.joyride-next-tip, .joyride-modal-bg', function (e) { - e.preventDefault(); - this.go_next() - }.bind(this)) - .on('click.fndtn.joyride', '.joyride-prev-tip', function (e) { - e.preventDefault(); - this.go_prev(); - }.bind(this)) - - .on('click.fndtn.joyride', '.joyride-close-tip', function (e) { - e.preventDefault(); - this.end(this.settings.abort_on_close); - }.bind(this)) - - .on('keyup.fndtn.joyride', function(e) { - // Don't do anything if keystrokes are disabled - // or if the joyride is not being shown - if (!this.settings.keyboard || !this.settings.riding) return; - - switch (e.which) { - case 39: // right arrow - e.preventDefault(); - this.go_next(); - break; - case 37: // left arrow - e.preventDefault(); - this.go_prev(); - break; - case 27: // escape - e.preventDefault(); - this.end(this.settings.abort_on_close); - } - }.bind(this)); - - $(window) - .off('.joyride') - .on('resize.fndtn.joyride', self.throttle(function () { - if ($('[' + self.attr_name() + ']').length > 0 && self.settings.$next_tip && self.settings.riding) { - if (self.settings.exposed.length > 0) { - var $els = $(self.settings.exposed); - - $els.each(function () { - var $this = $(this); - self.un_expose($this); - self.expose($this); - }); - } - - if (self.is_phone()) { - self.pos_phone(); - } else { - self.pos_default(false); - } - } - }, 100)); - }, - - start : function () { - var self = this, - $this = $('[' + this.attr_name() + ']', this.scope), - integer_settings = ['timer', 'scrollSpeed', 'startOffset', 'tipAnimationFadeSpeed', 'cookieExpires'], - int_settings_count = integer_settings.length; - - if (!$this.length > 0) return; - - if (!this.settings.init) this.events(); - - this.settings = $this.data(this.attr_name(true) + '-init'); - - // non configureable settings - this.settings.$content_el = $this; - this.settings.$body = $(this.settings.tip_container); - this.settings.body_offset = $(this.settings.tip_container).position(); - this.settings.$tip_content = this.settings.$content_el.find('> li'); - this.settings.paused = false; - this.settings.attempts = 0; - this.settings.riding = true; - - // can we create cookies? - if (typeof $.cookie !== 'function') { - this.settings.cookie_monster = false; - } - - // generate the tips and insert into dom. - if (!this.settings.cookie_monster || this.settings.cookie_monster && !$.cookie(this.settings.cookie_name)) { - this.settings.$tip_content.each(function (index) { - var $this = $(this); - this.settings = $.extend({}, self.defaults, self.data_options($this)); - - // Make sure that settings parsed from data_options are integers where necessary - var i = int_settings_count; - while (i--) { - self.settings[integer_settings[i]] = parseInt(self.settings[integer_settings[i]], 10); - } - self.create({$li : $this, index : index}); - }); - - // show first tip - if (!this.settings.start_timer_on_click && this.settings.timer > 0) { - this.show('init'); - this.startTimer(); - } else { - this.show('init'); - } - - } - }, - - resume : function () { - this.set_li(); - this.show(); - }, - - tip_template : function (opts) { - var $blank, content; - - opts.tip_class = opts.tip_class || ''; - - $blank = $(this.settings.template.tip).addClass(opts.tip_class); - content = $.trim($(opts.li).html()) + - this.prev_button_text(opts.prev_button_text, opts.index) + - this.button_text(opts.button_text) + - this.settings.template.link + - this.timer_instance(opts.index); - - $blank.append($(this.settings.template.wrapper)); - $blank.first().attr(this.add_namespace('data-index'), opts.index); - $('.joyride-content-wrapper', $blank).append(content); - - return $blank[0]; - }, - - timer_instance : function (index) { - var txt; - - if ((index === 0 && this.settings.start_timer_on_click && this.settings.timer > 0) || this.settings.timer === 0) { - txt = ''; - } else { - txt = $(this.settings.template.timer)[0].outerHTML; - } - return txt; - }, - - button_text : function (txt) { - if (this.settings.tip_settings.next_button) { - txt = $.trim(txt) || 'Next'; - txt = $(this.settings.template.button).append(txt)[0].outerHTML; - } else { - txt = ''; - } - return txt; - }, - - prev_button_text : function (txt, idx) { - if (this.settings.tip_settings.prev_button) { - txt = $.trim(txt) || 'Previous'; - - // Add the disabled class to the button if it's the first element - if (idx == 0) - txt = $(this.settings.template.prev_button).append(txt).addClass('disabled')[0].outerHTML; - else - txt = $(this.settings.template.prev_button).append(txt)[0].outerHTML; - } else { - txt = ''; - } - return txt; - }, - - create : function (opts) { - this.settings.tip_settings = $.extend({}, this.settings, this.data_options(opts.$li)); - var buttonText = opts.$li.attr(this.add_namespace('data-button')) - || opts.$li.attr(this.add_namespace('data-text')), - prevButtonText = opts.$li.attr(this.add_namespace('data-button-prev')) - || opts.$li.attr(this.add_namespace('data-prev-text')), - tipClass = opts.$li.attr('class'), - $tip_content = $(this.tip_template({ - tip_class : tipClass, - index : opts.index, - button_text : buttonText, - prev_button_text : prevButtonText, - li : opts.$li - })); - - $(this.settings.tip_container).append($tip_content); - }, - - show : function (init, is_prev) { - var $timer = null; - - // are we paused? - if (this.settings.$li === undefined - || ($.inArray(this.settings.$li.index(), this.settings.pause_after) === -1)) { - - // don't go to the next li if the tour was paused - if (this.settings.paused) { - this.settings.paused = false; - } else { - this.set_li(init, is_prev); - } - - this.settings.attempts = 0; - - if (this.settings.$li.length && this.settings.$target.length > 0) { - if (init) { //run when we first start - this.settings.pre_ride_callback(this.settings.$li.index(), this.settings.$next_tip); - if (this.settings.modal) { - this.show_modal(); - } - } - - this.settings.pre_step_callback(this.settings.$li.index(), this.settings.$next_tip); - - if (this.settings.modal && this.settings.expose) { - this.expose(); - } - - this.settings.tip_settings = $.extend({}, this.settings, this.data_options(this.settings.$li)); - - this.settings.timer = parseInt(this.settings.timer, 10); - - this.settings.tip_settings.tip_location_pattern = this.settings.tip_location_patterns[this.settings.tip_settings.tip_location]; - - // scroll and hide bg if not modal - if (!/body/i.test(this.settings.$target.selector)) { - var joyridemodalbg = $('.joyride-modal-bg'); - if (/pop/i.test(this.settings.tipAnimation)) { - joyridemodalbg.hide(); - } else { - joyridemodalbg.fadeOut(this.settings.tipAnimationFadeSpeed); - } - this.scroll_to(); - } - - if (this.is_phone()) { - this.pos_phone(true); - } else { - this.pos_default(true); - } - - $timer = this.settings.$next_tip.find('.joyride-timer-indicator'); - - if (/pop/i.test(this.settings.tip_animation)) { - - $timer.width(0); - - if (this.settings.timer > 0) { - - this.settings.$next_tip.show(); - - setTimeout(function () { - $timer.animate({ - width: $timer.parent().width() - }, this.settings.timer, 'linear'); - }.bind(this), this.settings.tip_animation_fade_speed); - - } else { - this.settings.$next_tip.show(); - - } - - - } else if (/fade/i.test(this.settings.tip_animation)) { - - $timer.width(0); - - if (this.settings.timer > 0) { - - this.settings.$next_tip - .fadeIn(this.settings.tip_animation_fade_speed) - .show(); - - setTimeout(function () { - $timer.animate({ - width: $timer.parent().width() - }, this.settings.timer, 'linear'); - }.bind(this), this.settings.tip_animation_fade_speed); - - } else { - this.settings.$next_tip.fadeIn(this.settings.tip_animation_fade_speed); - } - } - - this.settings.$current_tip = this.settings.$next_tip; - - // skip non-existant targets - } else if (this.settings.$li && this.settings.$target.length < 1) { - - this.show(init, is_prev); - - } else { - - this.end(); - - } - } else { - - this.settings.paused = true; - - } - - }, - - is_phone : function () { - return matchMedia(Foundation.media_queries.small).matches && - !matchMedia(Foundation.media_queries.medium).matches; - }, - - hide : function () { - if (this.settings.modal && this.settings.expose) { - this.un_expose(); - } - - if (!this.settings.modal) { - $('.joyride-modal-bg').hide(); - } - - // Prevent scroll bouncing...wait to remove from layout - this.settings.$current_tip.css('visibility', 'hidden'); - setTimeout($.proxy(function() { - this.hide(); - this.css('visibility', 'visible'); - }, this.settings.$current_tip), 0); - this.settings.post_step_callback(this.settings.$li.index(), - this.settings.$current_tip); - }, - - set_li : function (init, is_prev) { - if (init) { - this.settings.$li = this.settings.$tip_content.eq(this.settings.start_offset); - this.set_next_tip(); - this.settings.$current_tip = this.settings.$next_tip; - } else { - if (is_prev) - this.settings.$li = this.settings.$li.prev(); - else - this.settings.$li = this.settings.$li.next(); - this.set_next_tip(); - } - - this.set_target(); - }, - - set_next_tip : function () { - this.settings.$next_tip = $('.joyride-tip-guide').eq(this.settings.$li.index()); - this.settings.$next_tip.data('closed', ''); - }, - - set_target : function () { - var cl = this.settings.$li.attr(this.add_namespace('data-class')), - id = this.settings.$li.attr(this.add_namespace('data-id')), - $sel = function () { - if (id) { - return $(document.getElementById(id)); - } else if (cl) { - return $('.' + cl).first(); - } else { - return $('body'); - } - }; - - this.settings.$target = $sel(); - }, - - scroll_to : function () { - var window_half, tipOffset; - - window_half = $(window).height() / 2; - tipOffset = Math.ceil(this.settings.$target.offset().top - window_half + this.settings.$next_tip.outerHeight()); - - if (tipOffset != 0) { - $('html, body').stop().animate({ - scrollTop: tipOffset - }, this.settings.scroll_speed, 'swing'); - } - }, - - paused : function () { - return ($.inArray((this.settings.$li.index() + 1), this.settings.pause_after) === -1); - }, - - restart : function () { - this.hide(); - this.settings.$li = undefined; - this.show('init'); - }, - - pos_default : function (init) { - var $nub = this.settings.$next_tip.find('.joyride-nub'), - nub_width = Math.ceil($nub.outerWidth() / 2), - nub_height = Math.ceil($nub.outerHeight() / 2), - toggle = init || false; - - // tip must not be "display: none" to calculate position - if (toggle) { - this.settings.$next_tip.css('visibility', 'hidden'); - this.settings.$next_tip.show(); - } - - if (!/body/i.test(this.settings.$target.selector)) { - var topAdjustment = this.settings.tip_settings.tipAdjustmentY ? parseInt(this.settings.tip_settings.tipAdjustmentY) : 0, - leftAdjustment = this.settings.tip_settings.tipAdjustmentX ? parseInt(this.settings.tip_settings.tipAdjustmentX) : 0; - - if (this.bottom()) { - if (this.rtl) { - this.settings.$next_tip.css({ - top: (this.settings.$target.offset().top + nub_height + this.settings.$target.outerHeight() + topAdjustment), - left: this.settings.$target.offset().left + this.settings.$target.outerWidth() - this.settings.$next_tip.outerWidth() + leftAdjustment}); - } else { - this.settings.$next_tip.css({ - top: (this.settings.$target.offset().top + nub_height + this.settings.$target.outerHeight() + topAdjustment), - left: this.settings.$target.offset().left + leftAdjustment}); - } - - this.nub_position($nub, this.settings.tip_settings.nub_position, 'top'); - - } else if (this.top()) { - if (this.rtl) { - this.settings.$next_tip.css({ - top: (this.settings.$target.offset().top - this.settings.$next_tip.outerHeight() - nub_height + topAdjustment), - left: this.settings.$target.offset().left + this.settings.$target.outerWidth() - this.settings.$next_tip.outerWidth()}); - } else { - this.settings.$next_tip.css({ - top: (this.settings.$target.offset().top - this.settings.$next_tip.outerHeight() - nub_height + topAdjustment), - left: this.settings.$target.offset().left + leftAdjustment}); - } - - this.nub_position($nub, this.settings.tip_settings.nub_position, 'bottom'); - - } else if (this.right()) { - - this.settings.$next_tip.css({ - top: this.settings.$target.offset().top + topAdjustment, - left: (this.settings.$target.outerWidth() + this.settings.$target.offset().left + nub_width + leftAdjustment)}); - - this.nub_position($nub, this.settings.tip_settings.nub_position, 'left'); - - } else if (this.left()) { - - this.settings.$next_tip.css({ - top: this.settings.$target.offset().top + topAdjustment, - left: (this.settings.$target.offset().left - this.settings.$next_tip.outerWidth() - nub_width + leftAdjustment)}); - - this.nub_position($nub, this.settings.tip_settings.nub_position, 'right'); - - } - - if (!this.visible(this.corners(this.settings.$next_tip)) && this.settings.attempts < this.settings.tip_settings.tip_location_pattern.length) { - - $nub.removeClass('bottom') - .removeClass('top') - .removeClass('right') - .removeClass('left'); - - this.settings.tip_settings.tip_location = this.settings.tip_settings.tip_location_pattern[this.settings.attempts]; - - this.settings.attempts++; - - this.pos_default(); - - } - - } else if (this.settings.$li.length) { - - this.pos_modal($nub); - - } - - if (toggle) { - this.settings.$next_tip.hide(); - this.settings.$next_tip.css('visibility', 'visible'); - } - - }, - - pos_phone : function (init) { - var tip_height = this.settings.$next_tip.outerHeight(), - tip_offset = this.settings.$next_tip.offset(), - target_height = this.settings.$target.outerHeight(), - $nub = $('.joyride-nub', this.settings.$next_tip), - nub_height = Math.ceil($nub.outerHeight() / 2), - toggle = init || false; - - $nub.removeClass('bottom') - .removeClass('top') - .removeClass('right') - .removeClass('left'); - - if (toggle) { - this.settings.$next_tip.css('visibility', 'hidden'); - this.settings.$next_tip.show(); - } - - if (!/body/i.test(this.settings.$target.selector)) { - - if (this.top()) { - - this.settings.$next_tip.offset({top: this.settings.$target.offset().top - tip_height - nub_height}); - $nub.addClass('bottom'); - - } else { - - this.settings.$next_tip.offset({top: this.settings.$target.offset().top + target_height + nub_height}); - $nub.addClass('top'); - - } - - } else if (this.settings.$li.length) { - this.pos_modal($nub); - } - - if (toggle) { - this.settings.$next_tip.hide(); - this.settings.$next_tip.css('visibility', 'visible'); - } - }, - - pos_modal : function ($nub) { - this.center(); - $nub.hide(); - - this.show_modal(); - }, - - show_modal : function () { - if (!this.settings.$next_tip.data('closed')) { - var joyridemodalbg = $('.joyride-modal-bg'); - if (joyridemodalbg.length < 1) { - var joyridemodalbg = $(this.settings.template.modal); - joyridemodalbg.appendTo('body'); - } - - if (/pop/i.test(this.settings.tip_animation)) { - joyridemodalbg.show(); - } else { - joyridemodalbg.fadeIn(this.settings.tip_animation_fade_speed); - } - } - }, - - expose : function () { - var expose, - exposeCover, - el, - origCSS, - origClasses, - randId = 'expose-' + this.random_str(6); - - if (arguments.length > 0 && arguments[0] instanceof $) { - el = arguments[0]; - } else if(this.settings.$target && !/body/i.test(this.settings.$target.selector)){ - el = this.settings.$target; - } else { - return false; - } - - if(el.length < 1){ - if(window.console){ - console.error('element not valid', el); - } - return false; - } - - expose = $(this.settings.template.expose); - this.settings.$body.append(expose); - expose.css({ - top: el.offset().top, - left: el.offset().left, - width: el.outerWidth(true), - height: el.outerHeight(true) - }); - - exposeCover = $(this.settings.template.expose_cover); - - origCSS = { - zIndex: el.css('z-index'), - position: el.css('position') - }; - - origClasses = el.attr('class') == null ? '' : el.attr('class'); - - el.css('z-index',parseInt(expose.css('z-index'))+1); - - if (origCSS.position == 'static') { - el.css('position','relative'); - } - - el.data('expose-css',origCSS); - el.data('orig-class', origClasses); - el.attr('class', origClasses + ' ' + this.settings.expose_add_class); - - exposeCover.css({ - top: el.offset().top, - left: el.offset().left, - width: el.outerWidth(true), - height: el.outerHeight(true) - }); - - if (this.settings.modal) this.show_modal(); - - this.settings.$body.append(exposeCover); - expose.addClass(randId); - exposeCover.addClass(randId); - el.data('expose', randId); - this.settings.post_expose_callback(this.settings.$li.index(), this.settings.$next_tip, el); - this.add_exposed(el); - }, - - un_expose : function () { - var exposeId, - el, - expose , - origCSS, - origClasses, - clearAll = false; - - if (arguments.length > 0 && arguments[0] instanceof $) { - el = arguments[0]; - } else if(this.settings.$target && !/body/i.test(this.settings.$target.selector)){ - el = this.settings.$target; - } else { - return false; - } - - if(el.length < 1){ - if (window.console) { - console.error('element not valid', el); - } - return false; - } - - exposeId = el.data('expose'); - expose = $('.' + exposeId); - - if (arguments.length > 1) { - clearAll = arguments[1]; - } - - if (clearAll === true) { - $('.joyride-expose-wrapper,.joyride-expose-cover').remove(); - } else { - expose.remove(); - } - - origCSS = el.data('expose-css'); - - if (origCSS.zIndex == 'auto') { - el.css('z-index', ''); - } else { - el.css('z-index', origCSS.zIndex); - } - - if (origCSS.position != el.css('position')) { - if(origCSS.position == 'static') {// this is default, no need to set it. - el.css('position', ''); - } else { - el.css('position', origCSS.position); - } - } - - origClasses = el.data('orig-class'); - el.attr('class', origClasses); - el.removeData('orig-classes'); - - el.removeData('expose'); - el.removeData('expose-z-index'); - this.remove_exposed(el); - }, - - add_exposed: function(el){ - this.settings.exposed = this.settings.exposed || []; - if (el instanceof $ || typeof el === 'object') { - this.settings.exposed.push(el[0]); - } else if (typeof el == 'string') { - this.settings.exposed.push(el); - } - }, - - remove_exposed: function(el){ - var search, i; - if (el instanceof $) { - search = el[0] - } else if (typeof el == 'string'){ - search = el; - } - - this.settings.exposed = this.settings.exposed || []; - i = this.settings.exposed.length; - - while (i--) { - if (this.settings.exposed[i] == search) { - this.settings.exposed.splice(i, 1); - return; - } - } - }, - - center : function () { - var $w = $(window); - - this.settings.$next_tip.css({ - top : ((($w.height() - this.settings.$next_tip.outerHeight()) / 2) + $w.scrollTop()), - left : ((($w.width() - this.settings.$next_tip.outerWidth()) / 2) + $w.scrollLeft()) - }); - - return true; - }, - - bottom : function () { - return /bottom/i.test(this.settings.tip_settings.tip_location); - }, - - top : function () { - return /top/i.test(this.settings.tip_settings.tip_location); - }, - - right : function () { - return /right/i.test(this.settings.tip_settings.tip_location); - }, - - left : function () { - return /left/i.test(this.settings.tip_settings.tip_location); - }, - - corners : function (el) { - var w = $(window), - window_half = w.height() / 2, - //using this to calculate since scroll may not have finished yet. - tipOffset = Math.ceil(this.settings.$target.offset().top - window_half + this.settings.$next_tip.outerHeight()), - right = w.width() + w.scrollLeft(), - offsetBottom = w.height() + tipOffset, - bottom = w.height() + w.scrollTop(), - top = w.scrollTop(); - - if (tipOffset < top) { - if (tipOffset < 0) { - top = 0; - } else { - top = tipOffset; - } - } - - if (offsetBottom > bottom) { - bottom = offsetBottom; - } - - return [ - el.offset().top < top, - right < el.offset().left + el.outerWidth(), - bottom < el.offset().top + el.outerHeight(), - w.scrollLeft() > el.offset().left - ]; - }, - - visible : function (hidden_corners) { - var i = hidden_corners.length; - - while (i--) { - if (hidden_corners[i]) return false; - } - - return true; - }, - - nub_position : function (nub, pos, def) { - if (pos === 'auto') { - nub.addClass(def); - } else { - nub.addClass(pos); - } - }, - - startTimer : function () { - if (this.settings.$li.length) { - this.settings.automate = setTimeout(function () { - this.hide(); - this.show(); - this.startTimer(); - }.bind(this), this.settings.timer); - } else { - clearTimeout(this.settings.automate); - } - }, - - end : function (abort) { - if (this.settings.cookie_monster) { - $.cookie(this.settings.cookie_name, 'ridden', { expires: this.settings.cookie_expires, domain: this.settings.cookie_domain }); - } - - if (this.settings.timer > 0) { - clearTimeout(this.settings.automate); - } - - if (this.settings.modal && this.settings.expose) { - this.un_expose(); - } - - // Unplug keystrokes listener - $(this.scope).off('keyup.joyride') - - this.settings.$next_tip.data('closed', true); - this.settings.riding = false; - - $('.joyride-modal-bg').hide(); - this.settings.$current_tip.hide(); - - if (typeof abort === 'undefined' || abort === false) { - this.settings.post_step_callback(this.settings.$li.index(), this.settings.$current_tip); - this.settings.post_ride_callback(this.settings.$li.index(), this.settings.$current_tip); - } - - $('.joyride-tip-guide').remove(); - }, - - off : function () { - $(this.scope).off('.joyride'); - $(window).off('.joyride'); - $('.joyride-close-tip, .joyride-next-tip, .joyride-modal-bg').off('.joyride'); - $('.joyride-tip-guide, .joyride-modal-bg').remove(); - clearTimeout(this.settings.automate); - this.settings = {}; - }, - - reflow : function () {} - }; -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.js b/src/opsoro/server/static/js/foundation/foundation.js deleted file mode 100644 index 188cc0c..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.js +++ /dev/null @@ -1,690 +0,0 @@ -/* - * Foundation Responsive Library - * http://foundation.zurb.com - * Copyright 2014, ZURB - * Free to use under the MIT license. - * http://www.opensource.org/licenses/mit-license.php -*/ - -(function ($, window, document, undefined) { - 'use strict'; - - var header_helpers = function (class_array) { - var i = class_array.length; - var head = $('head'); - - while (i--) { - if(head.has('.' + class_array[i]).length === 0) { - head.append(''); - } - } - }; - - header_helpers([ - 'foundation-mq-small', - 'foundation-mq-small-only', - 'foundation-mq-medium', - 'foundation-mq-medium-only', - 'foundation-mq-large', - 'foundation-mq-large-only', - 'foundation-mq-xlarge', - 'foundation-mq-xlarge-only', - 'foundation-mq-xxlarge', - 'foundation-data-attribute-namespace']); - - // Enable FastClick if present - - $(function() { - if (typeof FastClick !== 'undefined') { - // Don't attach to body if undefined - if (typeof document.body !== 'undefined') { - FastClick.attach(document.body); - } - } - }); - - // private Fast Selector wrapper, - // returns jQuery object. Only use where - // getElementById is not available. - var S = function (selector, context) { - if (typeof selector === 'string') { - if (context) { - var cont; - if (context.jquery) { - cont = context[0]; - if (!cont) return context; - } else { - cont = context; - } - return $(cont.querySelectorAll(selector)); - } - - return $(document.querySelectorAll(selector)); - } - - return $(selector, context); - }; - - // Namespace functions. - - var attr_name = function (init) { - var arr = []; - if (!init) arr.push('data'); - if (this.namespace.length > 0) arr.push(this.namespace); - arr.push(this.name); - - return arr.join('-'); - }; - - var add_namespace = function (str) { - var parts = str.split('-'), - i = parts.length, - arr = []; - - while (i--) { - if (i !== 0) { - arr.push(parts[i]); - } else { - if (this.namespace.length > 0) { - arr.push(this.namespace, parts[i]); - } else { - arr.push(parts[i]); - } - } - } - - return arr.reverse().join('-'); - }; - - // Event binding and data-options updating. - - var bindings = function (method, options) { - var self = this, - should_bind_events = !S(this).data(this.attr_name(true)); - - if (S(this.scope).is('[' + this.attr_name() +']')) { - S(this.scope).data(this.attr_name(true) + '-init', $.extend({}, this.settings, (options || method), this.data_options(S(this.scope)))); - - if (should_bind_events) { - this.events(this.scope); - } - - } else { - S('[' + this.attr_name() +']', this.scope).each(function () { - var should_bind_events = !S(this).data(self.attr_name(true) + '-init'); - S(this).data(self.attr_name(true) + '-init', $.extend({}, self.settings, (options || method), self.data_options(S(this)))); - - if (should_bind_events) { - self.events(this); - } - }); - } - // # Patch to fix #5043 to move this *after* the if/else clause in order for Backbone and similar frameworks to have improved control over event binding and data-options updating. - if (typeof method === 'string') { - return this[method].call(this, options); - } - - }; - - var single_image_loaded = function (image, callback) { - function loaded () { - callback(image[0]); - } - - function bindLoad () { - this.one('load', loaded); - - if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { - var src = this.attr( 'src' ), - param = src.match( /\?/ ) ? '&' : '?'; - - param += 'random=' + (new Date()).getTime(); - this.attr('src', src + param); - } - } - - if (!image.attr('src')) { - loaded(); - return; - } - - if (image[0].complete || image[0].readyState === 4) { - loaded(); - } else { - bindLoad.call(image); - } - }; - - /* - https://github.com/paulirish/matchMedia.js - */ - - window.matchMedia = window.matchMedia || (function( doc ) { - - 'use strict'; - - var bool, - docElem = doc.documentElement, - refNode = docElem.firstElementChild || docElem.firstChild, - // fakeBody required for - fakeBody = doc.createElement( 'body' ), - div = doc.createElement( 'div' ); - - div.id = 'mq-test-1'; - div.style.cssText = 'position:absolute;top:-100em'; - fakeBody.style.background = 'none'; - fakeBody.appendChild(div); - - return function (q) { - - div.innerHTML = '­'; - - docElem.insertBefore( fakeBody, refNode ); - bool = div.offsetWidth === 42; - docElem.removeChild( fakeBody ); - - return { - matches: bool, - media: q - }; - - }; - - }( document )); - - /* - * jquery.requestAnimationFrame - * https://github.com/gnarf37/jquery-requestAnimationFrame - * Requires jQuery 1.8+ - * - * Copyright (c) 2012 Corey Frang - * Licensed under the MIT license. - */ - - (function($) { - - // requestAnimationFrame polyfill adapted from Erik Möller - // fixes from Paul Irish and Tino Zijdel - // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ - // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating - - var animating, - lastTime = 0, - vendors = ['webkit', 'moz'], - requestAnimationFrame = window.requestAnimationFrame, - cancelAnimationFrame = window.cancelAnimationFrame, - jqueryFxAvailable = 'undefined' !== typeof jQuery.fx; - - for (; lastTime < vendors.length && !requestAnimationFrame; lastTime++) { - requestAnimationFrame = window[ vendors[lastTime] + 'RequestAnimationFrame' ]; - cancelAnimationFrame = cancelAnimationFrame || - window[ vendors[lastTime] + 'CancelAnimationFrame' ] || - window[ vendors[lastTime] + 'CancelRequestAnimationFrame' ]; - } - - function raf() { - if (animating) { - requestAnimationFrame(raf); - - if (jqueryFxAvailable) { - jQuery.fx.tick(); - } - } - } - - if (requestAnimationFrame) { - // use rAF - window.requestAnimationFrame = requestAnimationFrame; - window.cancelAnimationFrame = cancelAnimationFrame; - - if (jqueryFxAvailable) { - jQuery.fx.timer = function (timer) { - if (timer() && jQuery.timers.push(timer) && !animating) { - animating = true; - raf(); - } - }; - - jQuery.fx.stop = function () { - animating = false; - }; - } - } else { - // polyfill - window.requestAnimationFrame = function (callback) { - var currTime = new Date().getTime(), - timeToCall = Math.max(0, 16 - (currTime - lastTime)), - id = window.setTimeout(function () { - callback(currTime + timeToCall); - }, timeToCall); - lastTime = currTime + timeToCall; - return id; - }; - - window.cancelAnimationFrame = function (id) { - clearTimeout(id); - }; - - } - - }( jQuery )); - - - function removeQuotes (string) { - if (typeof string === 'string' || string instanceof String) { - string = string.replace(/^['\\/"]+|(;\s?})+|['\\/"]+$/g, ''); - } - - return string; - } - - window.Foundation = { - name : 'Foundation', - - version : '5.5.0', - - media_queries : { - 'small' : S('.foundation-mq-small').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'small-only' : S('.foundation-mq-small-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'medium' : S('.foundation-mq-medium').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'medium-only' : S('.foundation-mq-medium-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'large' : S('.foundation-mq-large').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'large-only' : S('.foundation-mq-large-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'xlarge' : S('.foundation-mq-xlarge').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'xlarge-only' : S('.foundation-mq-xlarge-only').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, ''), - 'xxlarge' : S('.foundation-mq-xxlarge').css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, '') - }, - - stylesheet : $('').appendTo('head')[0].sheet, - - global: { - namespace: undefined - }, - - init : function (scope, libraries, method, options, response) { - var args = [scope, method, options, response], - responses = []; - - // check RTL - this.rtl = /rtl/i.test(S('html').attr('dir')); - - // set foundation global scope - this.scope = scope || this.scope; - - this.set_namespace(); - - if (libraries && typeof libraries === 'string' && !/reflow/i.test(libraries)) { - if (this.libs.hasOwnProperty(libraries)) { - responses.push(this.init_lib(libraries, args)); - } - } else { - for (var lib in this.libs) { - responses.push(this.init_lib(lib, libraries)); - } - } - - S(window).load(function(){ - S(window) - .trigger('resize.fndtn.clearing') - .trigger('resize.fndtn.dropdown') - .trigger('resize.fndtn.equalizer') - .trigger('resize.fndtn.interchange') - .trigger('resize.fndtn.joyride') - .trigger('resize.fndtn.magellan') - .trigger('resize.fndtn.topbar') - .trigger('resize.fndtn.slider'); - }); - - return scope; - }, - - init_lib : function (lib, args) { - if (this.libs.hasOwnProperty(lib)) { - this.patch(this.libs[lib]); - - if (args && args.hasOwnProperty(lib)) { - if (typeof this.libs[lib].settings !== 'undefined') { - $.extend(true, this.libs[lib].settings, args[lib]); - } - else if (typeof this.libs[lib].defaults !== 'undefined') { - $.extend(true, this.libs[lib].defaults, args[lib]); - } - return this.libs[lib].init.apply(this.libs[lib], [this.scope, args[lib]]); - } - - args = args instanceof Array ? args : new Array(args); - return this.libs[lib].init.apply(this.libs[lib], args); - } - - return function () {}; - }, - - patch : function (lib) { - lib.scope = this.scope; - lib.namespace = this.global.namespace; - lib.rtl = this.rtl; - lib['data_options'] = this.utils.data_options; - lib['attr_name'] = attr_name; - lib['add_namespace'] = add_namespace; - lib['bindings'] = bindings; - lib['S'] = this.utils.S; - }, - - inherit : function (scope, methods) { - var methods_arr = methods.split(' '), - i = methods_arr.length; - - while (i--) { - if (this.utils.hasOwnProperty(methods_arr[i])) { - scope[methods_arr[i]] = this.utils[methods_arr[i]]; - } - } - }, - - set_namespace: function () { - - // Description: - // Don't bother reading the namespace out of the meta tag - // if the namespace has been set globally in javascript - // - // Example: - // Foundation.global.namespace = 'my-namespace'; - // or make it an empty string: - // Foundation.global.namespace = ''; - // - // - - // If the namespace has not been set (is undefined), try to read it out of the meta element. - // Otherwise use the globally defined namespace, even if it's empty ('') - var namespace = ( this.global.namespace === undefined ) ? $('.foundation-data-attribute-namespace').css('font-family') : this.global.namespace; - - // Finally, if the namsepace is either undefined or false, set it to an empty string. - // Otherwise use the namespace value. - this.global.namespace = ( namespace === undefined || /false/i.test(namespace) ) ? '' : namespace; - }, - - libs : {}, - - // methods that can be inherited in libraries - utils : { - - // Description: - // Fast Selector wrapper returns jQuery object. Only use where getElementById - // is not available. - // - // Arguments: - // Selector (String): CSS selector describing the element(s) to be - // returned as a jQuery object. - // - // Scope (String): CSS selector describing the area to be searched. Default - // is document. - // - // Returns: - // Element (jQuery Object): jQuery object containing elements matching the - // selector within the scope. - S : S, - - // Description: - // Executes a function a max of once every n milliseconds - // - // Arguments: - // Func (Function): Function to be throttled. - // - // Delay (Integer): Function execution threshold in milliseconds. - // - // Returns: - // Lazy_function (Function): Function with throttling applied. - throttle : function (func, delay) { - var timer = null; - - return function () { - var context = this, args = arguments; - - if (timer == null) { - timer = setTimeout(function () { - func.apply(context, args); - timer = null; - }, delay); - } - }; - }, - - // Description: - // Executes a function when it stops being invoked for n seconds - // Modified version of _.debounce() http://underscorejs.org - // - // Arguments: - // Func (Function): Function to be debounced. - // - // Delay (Integer): Function execution threshold in milliseconds. - // - // Immediate (Bool): Whether the function should be called at the beginning - // of the delay instead of the end. Default is false. - // - // Returns: - // Lazy_function (Function): Function with debouncing applied. - debounce : function (func, delay, immediate) { - var timeout, result; - return function () { - var context = this, args = arguments; - var later = function () { - timeout = null; - if (!immediate) result = func.apply(context, args); - }; - var callNow = immediate && !timeout; - clearTimeout(timeout); - timeout = setTimeout(later, delay); - if (callNow) result = func.apply(context, args); - return result; - }; - }, - - // Description: - // Parses data-options attribute - // - // Arguments: - // El (jQuery Object): Element to be parsed. - // - // Returns: - // Options (Javascript Object): Contents of the element's data-options - // attribute. - data_options : function (el, data_attr_name) { - data_attr_name = data_attr_name || 'options'; - var opts = {}, ii, p, opts_arr, - data_options = function (el) { - var namespace = Foundation.global.namespace; - - if (namespace.length > 0) { - return el.data(namespace + '-' + data_attr_name); - } - - return el.data(data_attr_name); - }; - - var cached_options = data_options(el); - - if (typeof cached_options === 'object') { - return cached_options; - } - - opts_arr = (cached_options || ':').split(';'); - ii = opts_arr.length; - - function isNumber (o) { - return ! isNaN (o-0) && o !== null && o !== '' && o !== false && o !== true; - } - - function trim (str) { - if (typeof str === 'string') return $.trim(str); - return str; - } - - while (ii--) { - p = opts_arr[ii].split(':'); - p = [p[0], p.slice(1).join(':')]; - - if (/true/i.test(p[1])) p[1] = true; - if (/false/i.test(p[1])) p[1] = false; - if (isNumber(p[1])) { - if (p[1].indexOf('.') === -1) { - p[1] = parseInt(p[1], 10); - } else { - p[1] = parseFloat(p[1]); - } - } - - if (p.length === 2 && p[0].length > 0) { - opts[trim(p[0])] = trim(p[1]); - } - } - - return opts; - }, - - // Description: - // Adds JS-recognizable media queries - // - // Arguments: - // Media (String): Key string for the media query to be stored as in - // Foundation.media_queries - // - // Class (String): Class name for the generated tag - register_media : function (media, media_class) { - if(Foundation.media_queries[media] === undefined) { - $('head').append(''); - Foundation.media_queries[media] = removeQuotes($('.' + media_class).css('font-family')); - } - }, - - // Description: - // Add custom CSS within a JS-defined media query - // - // Arguments: - // Rule (String): CSS rule to be appended to the document. - // - // Media (String): Optional media query string for the CSS rule to be - // nested under. - add_custom_rule : function (rule, media) { - if (media === undefined && Foundation.stylesheet) { - Foundation.stylesheet.insertRule(rule, Foundation.stylesheet.cssRules.length); - } else { - var query = Foundation.media_queries[media]; - - if (query !== undefined) { - Foundation.stylesheet.insertRule('@media ' + - Foundation.media_queries[media] + '{ ' + rule + ' }'); - } - } - }, - - // Description: - // Performs a callback function when an image is fully loaded - // - // Arguments: - // Image (jQuery Object): Image(s) to check if loaded. - // - // Callback (Function): Function to execute when image is fully loaded. - image_loaded : function (images, callback) { - var self = this, - unloaded = images.length; - - if (unloaded === 0) { - callback(images); - } - - images.each(function () { - single_image_loaded(self.S(this), function () { - unloaded -= 1; - if (unloaded === 0) { - callback(images); - } - }); - }); - }, - - // Description: - // Returns a random, alphanumeric string - // - // Arguments: - // Length (Integer): Length of string to be generated. Defaults to random - // integer. - // - // Returns: - // Rand (String): Pseudo-random, alphanumeric string. - random_str : function () { - if (!this.fidx) this.fidx = 0; - this.prefix = this.prefix || [(this.name || 'F'), (+new Date).toString(36)].join('-'); - - return this.prefix + (this.fidx++).toString(36); - }, - - // Description: - // Helper for window.matchMedia - // - // Arguments: - // mq (String): Media query - // - // Returns: - // (Boolean): Whether the media query passes or not - match : function (mq) { - return window.matchMedia(mq).matches; - }, - - // Description: - // Helpers for checking Foundation default media queries with JS - // - // Returns: - // (Boolean): Whether the media query passes or not - - is_small_up : function () { - return this.match(Foundation.media_queries.small); - }, - - is_medium_up : function () { - return this.match(Foundation.media_queries.medium); - }, - - is_large_up : function () { - return this.match(Foundation.media_queries.large); - }, - - is_xlarge_up : function () { - return this.match(Foundation.media_queries.xlarge); - }, - - is_xxlarge_up : function () { - return this.match(Foundation.media_queries.xxlarge); - }, - - is_small_only : function () { - return !this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); - }, - - is_medium_only : function () { - return this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); - }, - - is_large_only : function () { - return this.is_medium_up() && this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); - }, - - is_xlarge_only : function () { - return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && !this.is_xxlarge_up(); - }, - - is_xxlarge_only : function () { - return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && this.is_xxlarge_up(); - } - } - }; - - $.fn.foundation = function () { - var args = Array.prototype.slice.call(arguments, 0); - - return this.each(function () { - Foundation.init.apply(Foundation, [this].concat(args)); - return this; - }); - }; - -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.magellan.js b/src/opsoro/server/static/js/foundation/foundation.magellan.js deleted file mode 100644 index 295c1f8..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.magellan.js +++ /dev/null @@ -1,198 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs['magellan-expedition'] = { - name : 'magellan-expedition', - - version : '5.5.0', - - settings : { - active_class: 'active', - threshold: 0, // pixels from the top of the expedition for it to become fixes - destination_threshold: 20, // pixels from the top of destination for it to be considered active - throttle_delay: 30, // calculation throttling to increase framerate - fixed_top: 0, // top distance in pixels assigend to the fixed element on scroll - offset_by_height: true, // whether to offset the destination by the expedition height. Usually you want this to be true, unless your expedition is on the side. - duration: 700, // animation duration time - easing: 'swing' // animation easing - }, - - init : function (scope, method, options) { - Foundation.inherit(this, 'throttle'); - this.bindings(method, options); - }, - - events : function () { - var self = this, - S = self.S, - settings = self.settings; - - // initialize expedition offset - self.set_expedition_position(); - - S(self.scope) - .off('.magellan') - .on('click.fndtn.magellan', '[' + self.add_namespace('data-magellan-arrival') + '] a[href^="#"]', function (e) { - e.preventDefault(); - var expedition = $(this).closest('[' + self.attr_name() + ']'), - settings = expedition.data('magellan-expedition-init'), - hash = this.hash.split('#').join(''), - target = $('a[name="'+hash+'"]'); - - if (target.length === 0) { - target = $('#'+hash); - - } - - - // Account for expedition height if fixed position - var scroll_top = target.offset().top - settings.destination_threshold + 1; - if (settings.offset_by_height) { - scroll_top = scroll_top - expedition.outerHeight(); - } - - $('html, body').stop().animate({ - 'scrollTop': scroll_top - }, settings.duration, settings.easing, function () { - if(history.pushState) { - history.pushState(null, null, '#'+hash); - } - else { - location.hash = '#'+hash; - } - }); - }) - .on('scroll.fndtn.magellan', self.throttle(this.check_for_arrivals.bind(this), settings.throttle_delay)); - - $(window) - .on('resize.fndtn.magellan', self.throttle(this.set_expedition_position.bind(this), settings.throttle_delay)); - }, - - check_for_arrivals : function() { - var self = this; - self.update_arrivals(); - self.update_expedition_positions(); - }, - - set_expedition_position : function() { - var self = this; - $('[' + this.attr_name() + '=fixed]', self.scope).each(function(idx, el) { - var expedition = $(this), - settings = expedition.data('magellan-expedition-init'), - styles = expedition.attr('styles'), // save styles - top_offset, fixed_top; - - expedition.attr('style', ''); - top_offset = expedition.offset().top + settings.threshold; - - //set fixed-top by attribute - fixed_top = parseInt(expedition.data('magellan-fixed-top')); - if(!isNaN(fixed_top)) - self.settings.fixed_top = fixed_top; - - expedition.data(self.data_attr('magellan-top-offset'), top_offset); - expedition.attr('style', styles); - }); - }, - - update_expedition_positions : function() { - var self = this, - window_top_offset = $(window).scrollTop(); - - $('[' + this.attr_name() + '=fixed]', self.scope).each(function() { - var expedition = $(this), - settings = expedition.data('magellan-expedition-init'), - styles = expedition.attr('style'), // save styles - top_offset = expedition.data('magellan-top-offset'); - - //scroll to the top distance - if (window_top_offset+self.settings.fixed_top >= top_offset) { - // Placeholder allows height calculations to be consistent even when - // appearing to switch between fixed/non-fixed placement - var placeholder = expedition.prev('[' + self.add_namespace('data-magellan-expedition-clone') + ']'); - if (placeholder.length === 0) { - placeholder = expedition.clone(); - placeholder.removeAttr(self.attr_name()); - placeholder.attr(self.add_namespace('data-magellan-expedition-clone'),''); - expedition.before(placeholder); - } - expedition.css({position:'fixed', top: settings.fixed_top}).addClass('fixed'); - } else { - expedition.prev('[' + self.add_namespace('data-magellan-expedition-clone') + ']').remove(); - expedition.attr('style',styles).css('position','').css('top','').removeClass('fixed'); - } - }); - }, - - update_arrivals : function() { - var self = this, - window_top_offset = $(window).scrollTop(); - - $('[' + this.attr_name() + ']', self.scope).each(function() { - var expedition = $(this), - settings = expedition.data(self.attr_name(true) + '-init'), - offsets = self.offsets(expedition, window_top_offset), - arrivals = expedition.find('[' + self.add_namespace('data-magellan-arrival') + ']'), - active_item = false; - offsets.each(function(idx, item) { - if (item.viewport_offset >= item.top_offset) { - var arrivals = expedition.find('[' + self.add_namespace('data-magellan-arrival') + ']'); - arrivals.not(item.arrival).removeClass(settings.active_class); - item.arrival.addClass(settings.active_class); - active_item = true; - return true; - } - }); - - if (!active_item) arrivals.removeClass(settings.active_class); - }); - }, - - offsets : function(expedition, window_offset) { - var self = this, - settings = expedition.data(self.attr_name(true) + '-init'), - viewport_offset = window_offset; - - return expedition.find('[' + self.add_namespace('data-magellan-arrival') + ']').map(function(idx, el) { - var name = $(this).data(self.data_attr('magellan-arrival')), - dest = $('[' + self.add_namespace('data-magellan-destination') + '=' + name + ']'); - if (dest.length > 0) { - var top_offset = dest.offset().top - settings.destination_threshold; - if (settings.offset_by_height) { - top_offset = top_offset - expedition.outerHeight(); - } - top_offset = Math.floor(top_offset); - return { - destination : dest, - arrival : $(this), - top_offset : top_offset, - viewport_offset : viewport_offset - } - } - }).sort(function(a, b) { - if (a.top_offset < b.top_offset) return -1; - if (a.top_offset > b.top_offset) return 1; - return 0; - }); - }, - - data_attr: function (str) { - if (this.namespace.length > 0) { - return this.namespace + '-' + str; - } - - return str; - }, - - off : function () { - this.S(this.scope).off('.magellan'); - this.S(window).off('.magellan'); - }, - - reflow : function () { - var self = this; - // remove placeholder expeditions used for height calculation purposes - $('[' + self.add_namespace('data-magellan-expedition-clone') + ']', self.scope).remove(); - } - }; -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.offcanvas.js b/src/opsoro/server/static/js/foundation/foundation.offcanvas.js deleted file mode 100644 index 8ce25d8..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.offcanvas.js +++ /dev/null @@ -1,152 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.offcanvas = { - name : 'offcanvas', - - version : '5.5.0', - - settings : { - open_method: 'move', - close_on_click: false - }, - - init : function (scope, method, options) { - this.bindings(method, options); - }, - - events : function () { - var self = this, - S = self.S, - move_class = '', - right_postfix = '', - left_postfix = ''; - - if (this.settings.open_method === 'move') { - move_class = 'move-'; - right_postfix = 'right'; - left_postfix = 'left'; - } else if (this.settings.open_method === 'overlap_single') { - move_class = 'offcanvas-overlap-'; - right_postfix = 'right'; - left_postfix = 'left'; - } else if (this.settings.open_method === 'overlap') { - move_class = 'offcanvas-overlap'; - } - - S(this.scope).off('.offcanvas') - .on('click.fndtn.offcanvas', '.left-off-canvas-toggle', function (e) { - self.click_toggle_class(e, move_class + right_postfix); - if (self.settings.open_method !== 'overlap'){ - S('.left-submenu').removeClass(move_class + right_postfix); - } - $('.left-off-canvas-toggle').attr('aria-expanded', 'true'); - }) - .on('click.fndtn.offcanvas', '.left-off-canvas-menu a', function (e) { - var settings = self.get_settings(e); - var parent = S(this).parent(); - - if(settings.close_on_click && !parent.hasClass('has-submenu') && !parent.hasClass('back')){ - self.hide.call(self, move_class + right_postfix, self.get_wrapper(e)); - parent.parent().removeClass(move_class + right_postfix); - }else if(S(this).parent().hasClass('has-submenu')){ - e.preventDefault(); - S(this).siblings('.left-submenu').toggleClass(move_class + right_postfix); - }else if(parent.hasClass('back')){ - e.preventDefault(); - parent.parent().removeClass(move_class + right_postfix); - } - $('.left-off-canvas-toggle').attr('aria-expanded', 'true'); - }) - .on('click.fndtn.offcanvas', '.right-off-canvas-toggle', function (e) { - self.click_toggle_class(e, move_class + left_postfix); - if (self.settings.open_method !== 'overlap'){ - S('.right-submenu').removeClass(move_class + left_postfix); - } - $('.right-off-canvas-toggle').attr('aria-expanded', 'true'); - }) - .on('click.fndtn.offcanvas', '.right-off-canvas-menu a', function (e) { - var settings = self.get_settings(e); - var parent = S(this).parent(); - - if(settings.close_on_click && !parent.hasClass('has-submenu') && !parent.hasClass('back')){ - self.hide.call(self, move_class + left_postfix, self.get_wrapper(e)); - parent.parent().removeClass(move_class + left_postfix); - }else if(S(this).parent().hasClass('has-submenu')){ - e.preventDefault(); - S(this).siblings('.right-submenu').toggleClass(move_class + left_postfix); - }else if(parent.hasClass('back')){ - e.preventDefault(); - parent.parent().removeClass(move_class + left_postfix); - } - $('.right-off-canvas-toggle').attr('aria-expanded', 'true'); - }) - .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) { - self.click_remove_class(e, move_class + left_postfix); - S('.right-submenu').removeClass(move_class + left_postfix); - if (right_postfix){ - self.click_remove_class(e, move_class + right_postfix); - S('.left-submenu').removeClass(move_class + left_postfix); - } - $('.right-off-canvas-toggle').attr('aria-expanded', 'true'); - }) - .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) { - self.click_remove_class(e, move_class + left_postfix); - $('.left-off-canvas-toggle').attr('aria-expanded', 'false'); - if (right_postfix) { - self.click_remove_class(e, move_class + right_postfix); - $('.right-off-canvas-toggle').attr('aria-expanded', 'false'); - } - }); - }, - - toggle: function(class_name, $off_canvas) { - $off_canvas = $off_canvas || this.get_wrapper(); - if ($off_canvas.is('.' + class_name)) { - this.hide(class_name, $off_canvas); - } else { - this.show(class_name, $off_canvas); - } - }, - - show: function(class_name, $off_canvas) { - $off_canvas = $off_canvas || this.get_wrapper(); - $off_canvas.trigger('open').trigger('open.fndtn.offcanvas'); - $off_canvas.addClass(class_name); - }, - - hide: function(class_name, $off_canvas) { - $off_canvas = $off_canvas || this.get_wrapper(); - $off_canvas.trigger('close').trigger('close.fndtn.offcanvas'); - $off_canvas.removeClass(class_name); - }, - - click_toggle_class: function(e, class_name) { - e.preventDefault(); - var $off_canvas = this.get_wrapper(e); - this.toggle(class_name, $off_canvas); - }, - - click_remove_class: function(e, class_name) { - e.preventDefault(); - var $off_canvas = this.get_wrapper(e); - this.hide(class_name, $off_canvas); - }, - - get_settings: function(e) { - var offcanvas = this.S(e.target).closest('[' + this.attr_name() + ']'); - return offcanvas.data(this.attr_name(true) + '-init') || this.settings; - }, - - get_wrapper: function(e) { - var $off_canvas = this.S(e ? e.target : this.scope).closest('.off-canvas-wrap'); - - if ($off_canvas.length === 0) { - $off_canvas = this.S('.off-canvas-wrap'); - } - return $off_canvas; - }, - - reflow : function () {} - }; -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.orbit.js b/src/opsoro/server/static/js/foundation/foundation.orbit.js deleted file mode 100644 index 9e744d6..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.orbit.js +++ /dev/null @@ -1,472 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - var noop = function() {}; - - var Orbit = function(el, settings) { - // Don't reinitialize plugin - if (el.hasClass(settings.slides_container_class)) { - return this; - } - - var self = this, - container, - slides_container = el, - number_container, - bullets_container, - timer_container, - idx = 0, - animate, - timer, - locked = false, - adjust_height_after = false; - - - self.slides = function() { - return slides_container.children(settings.slide_selector); - }; - - self.slides().first().addClass(settings.active_slide_class); - - self.update_slide_number = function(index) { - if (settings.slide_number) { - number_container.find('span:first').text(parseInt(index)+1); - number_container.find('span:last').text(self.slides().length); - } - if (settings.bullets) { - bullets_container.children().removeClass(settings.bullets_active_class); - $(bullets_container.children().get(index)).addClass(settings.bullets_active_class); - } - }; - - self.update_active_link = function(index) { - var link = $('[data-orbit-link="'+self.slides().eq(index).attr('data-orbit-slide')+'"]'); - link.siblings().removeClass(settings.bullets_active_class); - link.addClass(settings.bullets_active_class); - }; - - self.build_markup = function() { - slides_container.wrap('
          '); - container = slides_container.parent(); - slides_container.addClass(settings.slides_container_class); - - if (settings.stack_on_small) { - container.addClass(settings.stack_on_small_class); - } - - if (settings.navigation_arrows) { - container.append($('').addClass(settings.prev_class)); - container.append($('').addClass(settings.next_class)); - } - - if (settings.timer) { - timer_container = $('
          ').addClass(settings.timer_container_class); - timer_container.append(''); - timer_container.append($('
          ').addClass(settings.timer_progress_class)); - timer_container.addClass(settings.timer_paused_class); - container.append(timer_container); - } - - if (settings.slide_number) { - number_container = $('
          ').addClass(settings.slide_number_class); - number_container.append(' ' + settings.slide_number_text + ' '); - container.append(number_container); - } - - if (settings.bullets) { - bullets_container = $('
            ').addClass(settings.bullets_container_class); - container.append(bullets_container); - bullets_container.wrap('
            '); - self.slides().each(function(idx, el) { - var bullet = $('
          1. ').attr('data-orbit-slide', idx).on('click', self.link_bullet);; - bullets_container.append(bullet); - }); - } - - }; - - self._goto = function(next_idx, start_timer) { - // if (locked) {return false;} - if (next_idx === idx) {return false;} - if (typeof timer === 'object') {timer.restart();} - var slides = self.slides(); - - var dir = 'next'; - locked = true; - if (next_idx < idx) {dir = 'prev';} - if (next_idx >= slides.length) { - if (!settings.circular) return false; - next_idx = 0; - } else if (next_idx < 0) { - if (!settings.circular) return false; - next_idx = slides.length - 1; - } - - var current = $(slides.get(idx)); - var next = $(slides.get(next_idx)); - - current.css('zIndex', 2); - current.removeClass(settings.active_slide_class); - next.css('zIndex', 4).addClass(settings.active_slide_class); - - slides_container.trigger('before-slide-change.fndtn.orbit'); - settings.before_slide_change(); - self.update_active_link(next_idx); - - var callback = function() { - var unlock = function() { - idx = next_idx; - locked = false; - if (start_timer === true) {timer = self.create_timer(); timer.start();} - self.update_slide_number(idx); - slides_container.trigger('after-slide-change.fndtn.orbit',[{slide_number: idx, total_slides: slides.length}]); - settings.after_slide_change(idx, slides.length); - }; - if (slides_container.height() != next.height() && settings.variable_height) { - slides_container.animate({'height': next.height()}, 250, 'linear', unlock); - } else { - unlock(); - } - }; - - if (slides.length === 1) {callback(); return false;} - - var start_animation = function() { - if (dir === 'next') {animate.next(current, next, callback);} - if (dir === 'prev') {animate.prev(current, next, callback);} - }; - - if (next.height() > slides_container.height() && settings.variable_height) { - slides_container.animate({'height': next.height()}, 250, 'linear', start_animation); - } else { - start_animation(); - } - }; - - self.next = function(e) { - e.stopImmediatePropagation(); - e.preventDefault(); - self._goto(idx + 1); - }; - - self.prev = function(e) { - e.stopImmediatePropagation(); - e.preventDefault(); - self._goto(idx - 1); - }; - - self.link_custom = function(e) { - e.preventDefault(); - var link = $(this).attr('data-orbit-link'); - if ((typeof link === 'string') && (link = $.trim(link)) != '') { - var slide = container.find('[data-orbit-slide='+link+']'); - if (slide.index() != -1) {self._goto(slide.index());} - } - }; - - self.link_bullet = function(e) { - var index = $(this).attr('data-orbit-slide'); - if ((typeof index === 'string') && (index = $.trim(index)) != '') { - if(isNaN(parseInt(index))) - { - var slide = container.find('[data-orbit-slide='+index+']'); - if (slide.index() != -1) {self._goto(slide.index() + 1);} - } - else - { - self._goto(parseInt(index)); - } - } - - } - - self.timer_callback = function() { - self._goto(idx + 1, true); - } - - self.compute_dimensions = function() { - var current = $(self.slides().get(idx)); - var h = current.height(); - if (!settings.variable_height) { - self.slides().each(function(){ - if ($(this).height() > h) { h = $(this).height(); } - }); - } - slides_container.height(h); - }; - - self.create_timer = function() { - var t = new Timer( - container.find('.'+settings.timer_container_class), - settings, - self.timer_callback - ); - return t; - }; - - self.stop_timer = function() { - if (typeof timer === 'object') timer.stop(); - }; - - self.toggle_timer = function() { - var t = container.find('.'+settings.timer_container_class); - if (t.hasClass(settings.timer_paused_class)) { - if (typeof timer === 'undefined') {timer = self.create_timer();} - timer.start(); - } - else { - if (typeof timer === 'object') {timer.stop();} - } - }; - - self.init = function() { - self.build_markup(); - if (settings.timer) { - timer = self.create_timer(); - Foundation.utils.image_loaded(this.slides().children('img'), timer.start); - } - animate = new FadeAnimation(settings, slides_container); - if (settings.animation === 'slide') - animate = new SlideAnimation(settings, slides_container); - - container.on('click', '.'+settings.next_class, self.next); - container.on('click', '.'+settings.prev_class, self.prev); - - if (settings.next_on_click) { - container.on('click', '.'+settings.slides_container_class+' [data-orbit-slide]', self.link_bullet); - } - - container.on('click', self.toggle_timer); - if (settings.swipe) { - container.on('touchstart.fndtn.orbit', function(e) { - if (!e.touches) {e = e.originalEvent;} - var data = { - start_page_x: e.touches[0].pageX, - start_page_y: e.touches[0].pageY, - start_time: (new Date()).getTime(), - delta_x: 0, - is_scrolling: undefined - }; - container.data('swipe-transition', data); - e.stopPropagation(); - }) - .on('touchmove.fndtn.orbit', function(e) { - if (!e.touches) { e = e.originalEvent; } - // Ignore pinch/zoom events - if(e.touches.length > 1 || e.scale && e.scale !== 1) return; - - var data = container.data('swipe-transition'); - if (typeof data === 'undefined') {data = {};} - - data.delta_x = e.touches[0].pageX - data.start_page_x; - - if ( typeof data.is_scrolling === 'undefined') { - data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) ); - } - - if (!data.is_scrolling && !data.active) { - e.preventDefault(); - var direction = (data.delta_x < 0) ? (idx+1) : (idx-1); - data.active = true; - self._goto(direction); - } - }) - .on('touchend.fndtn.orbit', function(e) { - container.data('swipe-transition', {}); - e.stopPropagation(); - }) - } - container.on('mouseenter.fndtn.orbit', function(e) { - if (settings.timer && settings.pause_on_hover) { - self.stop_timer(); - } - }) - .on('mouseleave.fndtn.orbit', function(e) { - if (settings.timer && settings.resume_on_mouseout) { - timer.start(); - } - }); - - $(document).on('click', '[data-orbit-link]', self.link_custom); - $(window).on('load resize', self.compute_dimensions); - Foundation.utils.image_loaded(this.slides().children('img'), self.compute_dimensions); - Foundation.utils.image_loaded(this.slides().children('img'), function() { - container.prev('.'+settings.preloader_class).css('display', 'none'); - self.update_slide_number(0); - self.update_active_link(0); - slides_container.trigger('ready.fndtn.orbit'); - }); - }; - - self.init(); - }; - - var Timer = function(el, settings, callback) { - var self = this, - duration = settings.timer_speed, - progress = el.find('.'+settings.timer_progress_class), - start, - timeout, - left = -1; - - this.update_progress = function(w) { - var new_progress = progress.clone(); - new_progress.attr('style', ''); - new_progress.css('width', w+'%'); - progress.replaceWith(new_progress); - progress = new_progress; - }; - - this.restart = function() { - clearTimeout(timeout); - el.addClass(settings.timer_paused_class); - left = -1; - self.update_progress(0); - }; - - this.start = function() { - if (!el.hasClass(settings.timer_paused_class)) {return true;} - left = (left === -1) ? duration : left; - el.removeClass(settings.timer_paused_class); - start = new Date().getTime(); - progress.animate({'width': '100%'}, left, 'linear'); - timeout = setTimeout(function() { - self.restart(); - callback(); - }, left); - el.trigger('timer-started.fndtn.orbit') - }; - - this.stop = function() { - if (el.hasClass(settings.timer_paused_class)) {return true;} - clearTimeout(timeout); - el.addClass(settings.timer_paused_class); - var end = new Date().getTime(); - left = left - (end - start); - var w = 100 - ((left / duration) * 100); - self.update_progress(w); - el.trigger('timer-stopped.fndtn.orbit'); - }; - }; - - var SlideAnimation = function(settings, container) { - var duration = settings.animation_speed; - var is_rtl = ($('html[dir=rtl]').length === 1); - var margin = is_rtl ? 'marginRight' : 'marginLeft'; - var animMargin = {}; - animMargin[margin] = '0%'; - - this.next = function(current, next, callback) { - current.animate({marginLeft:'-100%'}, duration); - next.animate(animMargin, duration, function() { - current.css(margin, '100%'); - callback(); - }); - }; - - this.prev = function(current, prev, callback) { - current.animate({marginLeft:'100%'}, duration); - prev.css(margin, '-100%'); - prev.animate(animMargin, duration, function() { - current.css(margin, '100%'); - callback(); - }); - }; - }; - - var FadeAnimation = function(settings, container) { - var duration = settings.animation_speed; - var is_rtl = ($('html[dir=rtl]').length === 1); - var margin = is_rtl ? 'marginRight' : 'marginLeft'; - - this.next = function(current, next, callback) { - next.css({'margin':'0%', 'opacity':'0.01'}); - next.animate({'opacity':'1'}, duration, 'linear', function() { - current.css('margin', '100%'); - callback(); - }); - }; - - this.prev = function(current, prev, callback) { - prev.css({'margin':'0%', 'opacity':'0.01'}); - prev.animate({'opacity':'1'}, duration, 'linear', function() { - current.css('margin', '100%'); - callback(); - }); - }; - }; - - - Foundation.libs = Foundation.libs || {}; - - Foundation.libs.orbit = { - name: 'orbit', - - version: '5.5.0', - - settings: { - animation: 'slide', - timer_speed: 10000, - pause_on_hover: true, - resume_on_mouseout: false, - next_on_click: true, - animation_speed: 500, - stack_on_small: false, - navigation_arrows: true, - slide_number: true, - slide_number_text: 'of', - container_class: 'orbit-container', - stack_on_small_class: 'orbit-stack-on-small', - next_class: 'orbit-next', - prev_class: 'orbit-prev', - timer_container_class: 'orbit-timer', - timer_paused_class: 'paused', - timer_progress_class: 'orbit-progress', - slides_container_class: 'orbit-slides-container', - preloader_class: 'preloader', - slide_selector: '*', - bullets_container_class: 'orbit-bullets', - bullets_active_class: 'active', - slide_number_class: 'orbit-slide-number', - caption_class: 'orbit-caption', - active_slide_class: 'active', - orbit_transition_class: 'orbit-transitioning', - bullets: true, - circular: true, - timer: true, - variable_height: false, - swipe: true, - before_slide_change: noop, - after_slide_change: noop - }, - - init : function (scope, method, options) { - var self = this; - this.bindings(method, options); - }, - - events : function (instance) { - var orbit_instance = new Orbit(this.S(instance), this.S(instance).data('orbit-init')); - this.S(instance).data(this.name + '-instance', orbit_instance); - }, - - reflow : function () { - var self = this; - - if (self.S(self.scope).is('[data-orbit]')) { - var $el = self.S(self.scope); - var instance = $el.data(self.name + '-instance'); - instance.compute_dimensions(); - } else { - self.S('[data-orbit]', self.scope).each(function(idx, el) { - var $el = self.S(el); - var opts = self.data_options($el); - var instance = $el.data(self.name + '-instance'); - instance.compute_dimensions(); - }); - } - } - }; - - -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.reveal.js b/src/opsoro/server/static/js/foundation/foundation.reveal.js deleted file mode 100644 index 2df38e9..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.reveal.js +++ /dev/null @@ -1,449 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.reveal = { - name : 'reveal', - - version : '5.5.0', - - locked : false, - - settings : { - animation: 'fadeAndPop', - animation_speed: 250, - close_on_background_click: true, - close_on_esc: true, - dismiss_modal_class: 'close-reveal-modal', - bg_class: 'reveal-modal-bg', - bg_root_element: 'body', - root_element: 'body', - open: function(){}, - opened: function(){}, - close: function(){}, - closed: function(){}, - bg : $('.reveal-modal-bg'), - css : { - open : { - 'opacity': 0, - 'visibility': 'visible', - 'display' : 'block' - }, - close : { - 'opacity': 1, - 'visibility': 'hidden', - 'display': 'none' - } - } - }, - - init : function (scope, method, options) { - $.extend(true, this.settings, method, options); - this.bindings(method, options); - }, - - events : function (scope) { - var self = this, - S = self.S; - - S(this.scope) - .off('.reveal') - .on('click.fndtn.reveal', '[' + this.add_namespace('data-reveal-id') + ']:not([disabled])', function (e) { - e.preventDefault(); - - if (!self.locked) { - var element = S(this), - ajax = element.data(self.data_attr('reveal-ajax')); - - self.locked = true; - - if (typeof ajax === 'undefined') { - self.open.call(self, element); - } else { - var url = ajax === true ? element.attr('href') : ajax; - - self.open.call(self, element, {url: url}); - } - } - }); - - S(document) - .on('click.fndtn.reveal', this.close_targets(), function (e) { - - e.preventDefault(); - - if (!self.locked) { - var settings = S('[' + self.attr_name() + '].open').data(self.attr_name(true) + '-init') || self.settings, - bg_clicked = S(e.target)[0] === S('.' + settings.bg_class)[0]; - - if (bg_clicked) { - if (settings.close_on_background_click) { - e.stopPropagation(); - } else { - return; - } - } - - self.locked = true; - self.close.call(self, bg_clicked ? S('[' + self.attr_name() + '].open') : S(this).closest('[' + self.attr_name() + ']')); - } - }); - - if(S('[' + self.attr_name() + ']', this.scope).length > 0) { - S(this.scope) - // .off('.reveal') - .on('open.fndtn.reveal', this.settings.open) - .on('opened.fndtn.reveal', this.settings.opened) - .on('opened.fndtn.reveal', this.open_video) - .on('close.fndtn.reveal', this.settings.close) - .on('closed.fndtn.reveal', this.settings.closed) - .on('closed.fndtn.reveal', this.close_video); - } else { - S(this.scope) - // .off('.reveal') - .on('open.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.open) - .on('opened.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.opened) - .on('opened.fndtn.reveal', '[' + self.attr_name() + ']', this.open_video) - .on('close.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.close) - .on('closed.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.closed) - .on('closed.fndtn.reveal', '[' + self.attr_name() + ']', this.close_video); - } - - return true; - }, - - // PATCH #3: turning on key up capture only when a reveal window is open - key_up_on : function (scope) { - var self = this; - - // PATCH #1: fixing multiple keyup event trigger from single key press - self.S('body').off('keyup.fndtn.reveal').on('keyup.fndtn.reveal', function ( event ) { - var open_modal = self.S('[' + self.attr_name() + '].open'), - settings = open_modal.data(self.attr_name(true) + '-init') || self.settings ; - // PATCH #2: making sure that the close event can be called only while unlocked, - // so that multiple keyup.fndtn.reveal events don't prevent clean closing of the reveal window. - if ( settings && event.which === 27 && settings.close_on_esc && !self.locked) { // 27 is the keycode for the Escape key - self.close.call(self, open_modal); - } - }); - - return true; - }, - - // PATCH #3: turning on key up capture only when a reveal window is open - key_up_off : function (scope) { - this.S('body').off('keyup.fndtn.reveal'); - return true; - }, - - - open : function (target, ajax_settings) { - var self = this, - modal; - - if (target) { - if (typeof target.selector !== 'undefined') { - // Find the named node; only use the first one found, since the rest of the code assumes there's only one node - modal = self.S('#' + target.data(self.data_attr('reveal-id'))).first(); - } else { - modal = self.S(this.scope); - - ajax_settings = target; - } - } else { - modal = self.S(this.scope); - } - - var settings = modal.data(self.attr_name(true) + '-init'); - settings = settings || this.settings; - - - if (modal.hasClass('open') && target.attr('data-reveal-id') == modal.attr('id')) { - return self.close(modal); - } - - if (!modal.hasClass('open')) { - var open_modal = self.S('[' + self.attr_name() + '].open'); - - if (typeof modal.data('css-top') === 'undefined') { - modal.data('css-top', parseInt(modal.css('top'), 10)) - .data('offset', this.cache_offset(modal)); - } - - this.key_up_on(modal); // PATCH #3: turning on key up capture only when a reveal window is open - modal.trigger('open').trigger('open.fndtn.reveal'); - - if (open_modal.length < 1) { - this.toggle_bg(modal, true); - } - - if (typeof ajax_settings === 'string') { - ajax_settings = { - url: ajax_settings - }; - } - - if (typeof ajax_settings === 'undefined' || !ajax_settings.url) { - if (open_modal.length > 0) { - this.hide(open_modal, settings.css.close); - } - - this.show(modal, settings.css.open); - } else { - var old_success = typeof ajax_settings.success !== 'undefined' ? ajax_settings.success : null; - - $.extend(ajax_settings, { - success: function (data, textStatus, jqXHR) { - if ( $.isFunction(old_success) ) { - var result = old_success(data, textStatus, jqXHR); - if (typeof result == 'string') data = result; - } - - modal.html(data); - self.S(modal).foundation('section', 'reflow'); - self.S(modal).children().foundation(); - - if (open_modal.length > 0) { - self.hide(open_modal, settings.css.close); - } - self.show(modal, settings.css.open); - } - }); - - $.ajax(ajax_settings); - } - } - self.S(window).trigger('resize'); - }, - - close : function (modal) { - var modal = modal && modal.length ? modal : this.S(this.scope), - open_modals = this.S('[' + this.attr_name() + '].open'), - settings = modal.data(this.attr_name(true) + '-init') || this.settings; - - if (open_modals.length > 0) { - this.locked = true; - this.key_up_off(modal); // PATCH #3: turning on key up capture only when a reveal window is open - modal.trigger('close').trigger('close.fndtn.reveal'); - this.toggle_bg(modal, false); - this.hide(open_modals, settings.css.close, settings); - } - }, - - close_targets : function () { - var base = '.' + this.settings.dismiss_modal_class; - - if (this.settings.close_on_background_click) { - return base + ', .' + this.settings.bg_class; - } - - return base; - }, - - toggle_bg : function (el, modal, state) { - var settings = el.data(this.attr_name(true) + '-init') || this.settings, - bg_root_element = settings.bg_root_element; // Adding option to specify the background root element fixes scrolling issue - - if (this.S('.' + this.settings.bg_class).length === 0) { - this.settings.bg = $('
            ', {'class': this.settings.bg_class}) - .appendTo(bg_root_element).hide(); - } - - var visible = this.settings.bg.filter(':visible').length > 0; - if ( state != visible ) { - if ( state == undefined ? visible : !state ) { - this.hide(this.settings.bg); - } else { - this.show(this.settings.bg); - } - } - }, - - show : function (el, css) { - // is modal - if (css) { - var settings = el.data(this.attr_name(true) + '-init') || this.settings, - root_element = settings.root_element; - - if (el.parent(root_element).length === 0) { - var placeholder = el.wrap('
            ').parent(); - - el.on('closed.fndtn.reveal.wrapped', function() { - el.detach().appendTo(placeholder); - el.unwrap().unbind('closed.fndtn.reveal.wrapped'); - }); - - el.detach().appendTo(root_element); - } - - var animData = getAnimationData(settings.animation); - if (!animData.animate) { - this.locked = false; - } - if (animData.pop) { - css.top = $(root_element).scrollTop() - el.data('offset') + 'px'; //adding root_element instead of window for scrolling offset if modal trigger is below the fold - var end_css = { - top: $(root_element).scrollTop() + el.data('css-top') + 'px', //adding root_element instead of window for scrolling offset if modal trigger is below the fold - opacity: 1 - }; - - return setTimeout(function () { - return el - .css(css) - .animate(end_css, settings.animation_speed, 'linear', function () { - this.locked = false; - el.trigger('opened').trigger('opened.fndtn.reveal'); - }.bind(this)) - .addClass('open'); - }.bind(this), settings.animation_speed / 2); - } - - if (animData.fade) { - css.top = $(root_element).scrollTop() + el.data('css-top') + 'px'; //adding root_element instead of window for scrolling offset if modal trigger is below the fold - var end_css = {opacity: 1}; - - return setTimeout(function () { - return el - .css(css) - .animate(end_css, settings.animation_speed, 'linear', function () { - this.locked = false; - el.trigger('opened').trigger('opened.fndtn.reveal'); - }.bind(this)) - .addClass('open'); - }.bind(this), settings.animation_speed / 2); - } - - return el.css(css).show().css({opacity: 1}).addClass('open').trigger('opened').trigger('opened.fndtn.reveal'); - } - - var settings = this.settings; - - // should we animate the background? - if (getAnimationData(settings.animation).fade) { - return el.fadeIn(settings.animation_speed / 2); - } - - this.locked = false; - - return el.show(); - }, - - hide : function (el, css) { - // is modal - if (css) { - var settings = el.data(this.attr_name(true) + '-init') || this.settings, - root_element = settings.root_element; - - var animData = getAnimationData(settings.animation); - if (!animData.animate) { - this.locked = false; - } - if (animData.pop) { - var end_css = { - top: - $(root_element).scrollTop() - el.data('offset') + 'px', //adding root_element instead of window for scrolling offset if modal trigger is below the fold - opacity: 0 - }; - - return setTimeout(function () { - return el - .animate(end_css, settings.animation_speed, 'linear', function () { - this.locked = false; - el.css(css).trigger('closed').trigger('closed.fndtn.reveal'); - }.bind(this)) - .removeClass('open'); - }.bind(this), settings.animation_speed / 2); - } - - if (animData.fade) { - var end_css = {opacity: 0}; - - return setTimeout(function () { - return el - .animate(end_css, settings.animation_speed, 'linear', function () { - this.locked = false; - el.css(css).trigger('closed').trigger('closed.fndtn.reveal'); - }.bind(this)) - .removeClass('open'); - }.bind(this), settings.animation_speed / 2); - } - - return el.hide().css(css).removeClass('open').trigger('closed').trigger('closed.fndtn.reveal'); - } - - var settings = this.settings; - - // should we animate the background? - if (getAnimationData(settings.animation).fade) { - return el.fadeOut(settings.animation_speed / 2); - } - - return el.hide(); - }, - - close_video : function (e) { - var video = $('.flex-video', e.target), - iframe = $('iframe', video); - - if (iframe.length > 0) { - iframe.attr('data-src', iframe[0].src); - iframe.attr('src', iframe.attr('src')); - video.hide(); - } - }, - - open_video : function (e) { - var video = $('.flex-video', e.target), - iframe = video.find('iframe'); - - if (iframe.length > 0) { - var data_src = iframe.attr('data-src'); - if (typeof data_src === 'string') { - iframe[0].src = iframe.attr('data-src'); - } else { - var src = iframe[0].src; - iframe[0].src = undefined; - iframe[0].src = src; - } - video.show(); - } - }, - - data_attr: function (str) { - if (this.namespace.length > 0) { - return this.namespace + '-' + str; - } - - return str; - }, - - cache_offset : function (modal) { - var offset = modal.show().height() + parseInt(modal.css('top'), 10); - - modal.hide(); - - return offset; - }, - - off : function () { - $(this.scope).off('.fndtn.reveal'); - }, - - reflow : function () {} - }; - - /* - * getAnimationData('popAndFade') // {animate: true, pop: true, fade: true} - * getAnimationData('fade') // {animate: true, pop: false, fade: true} - * getAnimationData('pop') // {animate: true, pop: true, fade: false} - * getAnimationData('foo') // {animate: false, pop: false, fade: false} - * getAnimationData(null) // {animate: false, pop: false, fade: false} - */ - function getAnimationData(str) { - var fade = /fade/i.test(str); - var pop = /pop/i.test(str); - return { - animate: fade || pop, - pop: pop, - fade: fade - }; - } -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.slider.js b/src/opsoro/server/static/js/foundation/foundation.slider.js deleted file mode 100644 index d68118d..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.slider.js +++ /dev/null @@ -1,267 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.slider = { - name : 'slider', - - version : '5.5.0', - - settings: { - start: 0, - end: 100, - step: 1, - precision: null, - initial: null, - display_selector: '', - vertical: false, - trigger_input_change: false, - on_change: function(){} - }, - - cache : {}, - - init : function (scope, method, options) { - Foundation.inherit(this,'throttle'); - this.bindings(method, options); - this.reflow(); - }, - - events : function() { - var self = this; - - $(this.scope) - .off('.slider') - .on('mousedown.fndtn.slider touchstart.fndtn.slider pointerdown.fndtn.slider', - '[' + self.attr_name() + ']:not(.disabled, [disabled]) .range-slider-handle', function(e) { - if (!self.cache.active) { - e.preventDefault(); - self.set_active_slider($(e.target)); - } - }) - .on('mousemove.fndtn.slider touchmove.fndtn.slider pointermove.fndtn.slider', function(e) { - if (!!self.cache.active) { - e.preventDefault(); - if ($.data(self.cache.active[0], 'settings').vertical) { - var scroll_offset = 0; - if (!e.pageY) { - scroll_offset = window.scrollY; - } - self.calculate_position(self.cache.active, self.get_cursor_position(e, 'y') + scroll_offset); - } else { - self.calculate_position(self.cache.active, self.get_cursor_position(e, 'x')); - } - } - }) - .on('mouseup.fndtn.slider touchend.fndtn.slider pointerup.fndtn.slider', function(e) { - self.remove_active_slider(); - }) - .on('change.fndtn.slider', function(e) { - self.settings.on_change(); - }); - - self.S(window) - .on('resize.fndtn.slider', self.throttle(function(e) { - self.reflow(); - }, 300)); - }, - - get_cursor_position : function(e, xy) { - var pageXY = 'page' + xy.toUpperCase(), - clientXY = 'client' + xy.toUpperCase(), - position; - - if (typeof e[pageXY] !== 'undefined') { - position = e[pageXY]; - } - else if (typeof e.originalEvent[clientXY] !== 'undefined') { - position = e.originalEvent[clientXY]; - } - else if (e.originalEvent.touches && e.originalEvent.touches[0] && typeof e.originalEvent.touches[0][clientXY] !== 'undefined') { - position = e.originalEvent.touches[0][clientXY]; - } - else if(e.currentPoint && typeof e.currentPoint[xy] !== 'undefined') { - position = e.currentPoint[xy]; - } - return position; - }, - - set_active_slider : function($handle) { - this.cache.active = $handle; - }, - - remove_active_slider : function() { - this.cache.active = null; - }, - - calculate_position : function($handle, cursor_x) { - var self = this, - settings = $.data($handle[0], 'settings'), - handle_l = $.data($handle[0], 'handle_l'), - handle_o = $.data($handle[0], 'handle_o'), - bar_l = $.data($handle[0], 'bar_l'), - bar_o = $.data($handle[0], 'bar_o'); - - requestAnimationFrame(function(){ - var pct; - - if (Foundation.rtl && !settings.vertical) { - pct = self.limit_to(((bar_o+bar_l-cursor_x)/bar_l),0,1); - } else { - pct = self.limit_to(((cursor_x-bar_o)/bar_l),0,1); - } - - pct = settings.vertical ? 1-pct : pct; - - var norm = self.normalized_value(pct, settings.start, settings.end, settings.step, settings.precision); - - self.set_ui($handle, norm); - }); - }, - - set_ui : function($handle, value) { - var settings = $.data($handle[0], 'settings'), - handle_l = $.data($handle[0], 'handle_l'), - bar_l = $.data($handle[0], 'bar_l'), - norm_pct = this.normalized_percentage(value, settings.start, settings.end), - handle_offset = norm_pct*(bar_l-handle_l)-1, - progress_bar_length = norm_pct*100, - $handle_parent = $handle.parent(), - $hidden_inputs = $handle.parent().children('input[type=hidden]'); - - if (Foundation.rtl && !settings.vertical) { - handle_offset = -handle_offset; - } - - handle_offset = settings.vertical ? -handle_offset + bar_l - handle_l + 1 : handle_offset; - this.set_translate($handle, handle_offset, settings.vertical); - - if (settings.vertical) { - $handle.siblings('.range-slider-active-segment').css('height', progress_bar_length + '%'); - } else { - $handle.siblings('.range-slider-active-segment').css('width', progress_bar_length + '%'); - } - - $handle_parent.attr(this.attr_name(), value).trigger('change').trigger('change.fndtn.slider'); - - $hidden_inputs.val(value); - if (settings.trigger_input_change) { - $hidden_inputs.trigger('change'); - } - - if (!$handle[0].hasAttribute('aria-valuemin')) { - $handle.attr({ - 'aria-valuemin': settings.start, - 'aria-valuemax': settings.end - }); - } - $handle.attr('aria-valuenow', value); - - if (settings.display_selector != '') { - $(settings.display_selector).each(function(){ - if (this.hasOwnProperty('value')) { - $(this).val(value); - } else { - $(this).text(value); - } - }); - } - - }, - - normalized_percentage : function(val, start, end) { - return Math.min(1, (val - start)/(end - start)); - }, - - normalized_value : function(val, start, end, step, precision) { - var range = end - start, - point = val*range, - mod = (point-(point%step)) / step, - rem = point % step, - round = ( rem >= step*0.5 ? step : 0); - return ((mod*step + round) + start).toFixed(precision); - }, - - set_translate : function(ele, offset, vertical) { - if (vertical) { - $(ele) - .css('-webkit-transform', 'translateY('+offset+'px)') - .css('-moz-transform', 'translateY('+offset+'px)') - .css('-ms-transform', 'translateY('+offset+'px)') - .css('-o-transform', 'translateY('+offset+'px)') - .css('transform', 'translateY('+offset+'px)'); - } else { - $(ele) - .css('-webkit-transform', 'translateX('+offset+'px)') - .css('-moz-transform', 'translateX('+offset+'px)') - .css('-ms-transform', 'translateX('+offset+'px)') - .css('-o-transform', 'translateX('+offset+'px)') - .css('transform', 'translateX('+offset+'px)'); - } - }, - - limit_to : function(val, min, max) { - return Math.min(Math.max(val, min), max); - }, - - - - initialize_settings : function(handle) { - var settings = $.extend({}, this.settings, this.data_options($(handle).parent())), - decimal_places_match_result; - - if (settings.precision === null) { - decimal_places_match_result = ('' + settings.step).match(/\.([\d]*)/); - settings.precision = decimal_places_match_result && decimal_places_match_result[1] ? decimal_places_match_result[1].length : 0; - } - - if (settings.vertical) { - $.data(handle, 'bar_o', $(handle).parent().offset().top); - $.data(handle, 'bar_l', $(handle).parent().outerHeight()); - $.data(handle, 'handle_o', $(handle).offset().top); - $.data(handle, 'handle_l', $(handle).outerHeight()); - } else { - $.data(handle, 'bar_o', $(handle).parent().offset().left); - $.data(handle, 'bar_l', $(handle).parent().outerWidth()); - $.data(handle, 'handle_o', $(handle).offset().left); - $.data(handle, 'handle_l', $(handle).outerWidth()); - } - - $.data(handle, 'bar', $(handle).parent()); - $.data(handle, 'settings', settings); - }, - - set_initial_position : function($ele) { - var settings = $.data($ele.children('.range-slider-handle')[0], 'settings'), - initial = ((typeof settings.initial == 'number' && !isNaN(settings.initial)) ? settings.initial : Math.floor((settings.end-settings.start)*0.5/settings.step)*settings.step+settings.start), - $handle = $ele.children('.range-slider-handle'); - this.set_ui($handle, initial); - }, - - set_value : function(value) { - var self = this; - $('[' + self.attr_name() + ']', this.scope).each(function(){ - $(this).attr(self.attr_name(), value); - }); - if (!!$(this.scope).attr(self.attr_name())) { - $(this.scope).attr(self.attr_name(), value); - } - self.reflow(); - }, - - reflow : function() { - var self = this; - self.S('[' + this.attr_name() + ']').each(function() { - var handle = $(this).children('.range-slider-handle')[0], - val = $(this).attr(self.attr_name()); - self.initialize_settings(handle); - - if (val) { - self.set_ui($(handle), parseFloat(val)); - } else { - self.set_initial_position($(this)); - } - }); - } - }; - -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.tab.js b/src/opsoro/server/static/js/foundation/foundation.tab.js deleted file mode 100644 index e408f8b..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.tab.js +++ /dev/null @@ -1,217 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.tab = { - name : 'tab', - - version : '5.5.0', - - settings : { - active_class: 'active', - callback : function () {}, - deep_linking: false, - scroll_to_content: true, - is_hover: false - }, - - default_tab_hashes: [], - - init : function (scope, method, options) { - var self = this, - S = this.S; - - this.bindings(method, options); - this.handle_location_hash_change(); - - // Store the default active tabs which will be referenced when the - // location hash is absent, as in the case of navigating the tabs and - // returning to the first viewing via the browser Back button. - S('[' + this.attr_name() + '] > .active > a', this.scope).each(function () { - self.default_tab_hashes.push(this.hash); - }); - }, - - events : function () { - var self = this, - S = this.S; - - var usual_tab_behavior = function (e) { - var settings = S(this).closest('[' + self.attr_name() +']').data(self.attr_name(true) + '-init'); - if (!settings.is_hover || Modernizr.touch) { - e.preventDefault(); - e.stopPropagation(); - self.toggle_active_tab(S(this).parent()); - } - }; - - S(this.scope) - .off('.tab') - // Click event: tab title - .on('focus.fndtn.tab', '[' + this.attr_name() + '] > * > a', usual_tab_behavior ) - .on('click.fndtn.tab', '[' + this.attr_name() + '] > * > a', usual_tab_behavior ) - // Hover event: tab title - .on('mouseenter.fndtn.tab', '[' + this.attr_name() + '] > * > a', function (e) { - var settings = S(this).closest('[' + self.attr_name() +']').data(self.attr_name(true) + '-init'); - if (settings.is_hover) self.toggle_active_tab(S(this).parent()); - }); - - // Location hash change event - S(window).on('hashchange.fndtn.tab', function (e) { - e.preventDefault(); - self.handle_location_hash_change(); - }); - }, - - handle_location_hash_change : function () { - - var self = this, - S = this.S; - - S('[' + this.attr_name() + ']', this.scope).each(function () { - var settings = S(this).data(self.attr_name(true) + '-init'); - if (settings.deep_linking) { - // Match the location hash to a label - var hash; - if (settings.scroll_to_content) { - hash = self.scope.location.hash; - } else { - // prefix the hash to prevent anchor scrolling - hash = self.scope.location.hash.replace('fndtn-', ''); - } - if (hash != '') { - // Check whether the location hash references a tab content div or - // another element on the page (inside or outside the tab content div) - var hash_element = S(hash); - if (hash_element.hasClass('content') && hash_element.parent().hasClass('tabs-content')) { - // Tab content div - self.toggle_active_tab($('[' + self.attr_name() + '] > * > a[href=' + hash + ']').parent()); - } else { - // Not the tab content div. If inside the tab content, find the - // containing tab and toggle it as active. - var hash_tab_container_id = hash_element.closest('.content').attr('id'); - if (hash_tab_container_id != undefined) { - self.toggle_active_tab($('[' + self.attr_name() + '] > * > a[href=#' + hash_tab_container_id + ']').parent(), hash); - } - } - } else { - // Reference the default tab hashes which were initialized in the init function - for (var ind = 0; ind < self.default_tab_hashes.length; ind++) { - self.toggle_active_tab($('[' + self.attr_name() + '] > * > a[href=' + self.default_tab_hashes[ind] + ']').parent()); - } - } - } - }); - }, - - toggle_active_tab: function (tab, location_hash) { - var S = this.S, - tabs = tab.closest('[' + this.attr_name() + ']'), - tab_link = tab.find('a'), - anchor = tab.children('a').first(), - target_hash = '#' + anchor.attr('href').split('#')[1], - target = S(target_hash), - siblings = tab.siblings(), - settings = tabs.data(this.attr_name(true) + '-init'), - interpret_keyup_action = function(e) { - // Light modification of Heydon Pickering's Practical ARIA Examples: http://heydonworks.com/practical_aria_examples/js/a11y.js - - // define current, previous and next (possible) tabs - - var $original = $(this); - var $prev = $(this).parents('li').prev().children('[role="tab"]'); - var $next = $(this).parents('li').next().children('[role="tab"]'); - var $target; - - // find the direction (prev or next) - - switch (e.keyCode) { - case 37: - $target = $prev; - break; - case 39: - $target = $next; - break; - default: - $target = false - break; - } - - if ($target.length) { - $original.attr({ - 'tabindex' : '-1', - 'aria-selected' : null - }); - $target.attr({ - 'tabindex' : '0', - 'aria-selected' : true - }).focus(); - } - - // Hide panels - - $('[role="tabpanel"]') - .attr('aria-hidden', 'true'); - - // Show panel which corresponds to target - - $('#' + $(document.activeElement).attr('href').substring(1)) - .attr('aria-hidden', null); - - }; - - // allow usage of data-tab-content attribute instead of href - if (S(this).data(this.data_attr('tab-content'))) { - target_hash = '#' + S(this).data(this.data_attr('tab-content')).split('#')[1]; - target = S(target_hash); - } - - if (settings.deep_linking) { - - if (settings.scroll_to_content) { - // retain current hash to scroll to content - window.location.hash = location_hash || target_hash; - if (location_hash == undefined || location_hash == target_hash) { - tab.parent()[0].scrollIntoView(); - } else { - S(target_hash)[0].scrollIntoView(); - } - } else { - // prefix the hashes so that the browser doesn't scroll down - if (location_hash != undefined) { - window.location.hash = 'fndtn-' + location_hash.replace('#', ''); - } else { - window.location.hash = 'fndtn-' + target_hash.replace('#', ''); - } - } - } - - // WARNING: The activation and deactivation of the tab content must - // occur after the deep linking in order to properly refresh the browser - // window (notably in Chrome). - // Clean up multiple attr instances to done once - tab.addClass(settings.active_class).triggerHandler('opened'); - tab_link.attr({'aria-selected': 'true', tabindex: 0}); - siblings.removeClass(settings.active_class) - siblings.find('a').attr({'aria-selected': 'false', tabindex: -1}); - target.siblings().removeClass(settings.active_class).attr({'aria-hidden': 'true', tabindex: -1}); - target.addClass(settings.active_class).attr('aria-hidden', 'false').removeAttr('tabindex'); - settings.callback(tab); - target.triggerHandler('toggled', [tab]); - tabs.triggerHandler('toggled', [target]); - - tab_link.off('keydown').on('keydown', interpret_keyup_action ); - }, - - data_attr: function (str) { - if (this.namespace.length > 0) { - return this.namespace + '-' + str; - } - - return str; - }, - - off : function () {}, - - reflow : function () {} - }; -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.tooltip.js b/src/opsoro/server/static/js/foundation/foundation.tooltip.js deleted file mode 100644 index a735917..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.tooltip.js +++ /dev/null @@ -1,300 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.tooltip = { - name : 'tooltip', - - version : '5.5.0', - - settings : { - additional_inheritable_classes : [], - tooltip_class : '.tooltip', - append_to: 'body', - touch_close_text: 'Tap To Close', - disable_for_touch: false, - hover_delay: 200, - show_on : 'all', - tip_template : function (selector, content) { - return '' + content + ''; - } - }, - - cache : {}, - - init : function (scope, method, options) { - Foundation.inherit(this, 'random_str'); - this.bindings(method, options); - }, - - should_show: function (target, tip) { - var settings = $.extend({}, this.settings, this.data_options(target)); - - if (settings.show_on === 'all') { - return true; - } else if (this.small() && settings.show_on === 'small') { - return true; - } else if (this.medium() && settings.show_on === 'medium') { - return true; - } else if (this.large() && settings.show_on === 'large') { - return true; - } - return false; - }, - - medium : function () { - return matchMedia(Foundation.media_queries['medium']).matches; - }, - - large : function () { - return matchMedia(Foundation.media_queries['large']).matches; - }, - - events : function (instance) { - var self = this, - S = self.S; - - self.create(this.S(instance)); - - $(this.scope) - .off('.tooltip') - .on('mouseenter.fndtn.tooltip mouseleave.fndtn.tooltip touchstart.fndtn.tooltip MSPointerDown.fndtn.tooltip', - '[' + this.attr_name() + ']', function (e) { - var $this = S(this), - settings = $.extend({}, self.settings, self.data_options($this)), - is_touch = false; - - if (Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type) && S(e.target).is('a')) { - return false; - } - - if (/mouse/i.test(e.type) && self.ie_touch(e)) return false; - - if ($this.hasClass('open')) { - if (Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type)) e.preventDefault(); - self.hide($this); - } else { - if (settings.disable_for_touch && Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type)) { - return; - } else if(!settings.disable_for_touch && Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type)) { - e.preventDefault(); - S(settings.tooltip_class + '.open').hide(); - is_touch = true; - } - - if (/enter|over/i.test(e.type)) { - this.timer = setTimeout(function () { - var tip = self.showTip($this); - }.bind(this), self.settings.hover_delay); - } else if (e.type === 'mouseout' || e.type === 'mouseleave') { - clearTimeout(this.timer); - self.hide($this); - } else { - self.showTip($this); - } - } - }) - .on('mouseleave.fndtn.tooltip touchstart.fndtn.tooltip MSPointerDown.fndtn.tooltip', '[' + this.attr_name() + '].open', function (e) { - if (/mouse/i.test(e.type) && self.ie_touch(e)) return false; - - if($(this).data('tooltip-open-event-type') == 'touch' && e.type == 'mouseleave') { - return; - } - else if($(this).data('tooltip-open-event-type') == 'mouse' && /MSPointerDown|touchstart/i.test(e.type)) { - self.convert_to_touch($(this)); - } else { - self.hide($(this)); - } - }) - .on('DOMNodeRemoved DOMAttrModified', '[' + this.attr_name() + ']:not(a)', function (e) { - self.hide(S(this)); - }); - }, - - ie_touch : function (e) { - // How do I distinguish between IE11 and Windows Phone 8????? - return false; - }, - - showTip : function ($target) { - var $tip = this.getTip($target); - if (this.should_show($target, $tip)){ - return this.show($target); - } - return; - }, - - getTip : function ($target) { - var selector = this.selector($target), - settings = $.extend({}, this.settings, this.data_options($target)), - tip = null; - - if (selector) { - tip = this.S('span[data-selector="' + selector + '"]' + settings.tooltip_class); - } - - return (typeof tip === 'object') ? tip : false; - }, - - selector : function ($target) { - var id = $target.attr('id'), - dataSelector = $target.attr(this.attr_name()) || $target.attr('data-selector'); - - if ((id && id.length < 1 || !id) && typeof dataSelector != 'string') { - dataSelector = this.random_str(6); - $target - .attr('data-selector', dataSelector) - .attr('aria-describedby', dataSelector); - } - - return (id && id.length > 0) ? id : dataSelector; - }, - - create : function ($target) { - var self = this, - settings = $.extend({}, this.settings, this.data_options($target)), - tip_template = this.settings.tip_template; - - if (typeof settings.tip_template === 'string' && window.hasOwnProperty(settings.tip_template)) { - tip_template = window[settings.tip_template]; - } - - var $tip = $(tip_template(this.selector($target), $('
            ').html($target.attr('title')).html())), - classes = this.inheritable_classes($target); - - $tip.addClass(classes).appendTo(settings.append_to); - - if (Modernizr.touch) { - $tip.append(''+settings.touch_close_text+''); - $tip.on('touchstart.fndtn.tooltip MSPointerDown.fndtn.tooltip', function(e) { - self.hide($target); - }); - } - - $target.removeAttr('title').attr('title',''); - }, - - reposition : function (target, tip, classes) { - var width, nub, nubHeight, nubWidth, column, objPos; - - tip.css('visibility', 'hidden').show(); - - width = target.data('width'); - nub = tip.children('.nub'); - nubHeight = nub.outerHeight(); - nubWidth = nub.outerHeight(); - - if (this.small()) { - tip.css({'width' : '100%' }); - } else { - tip.css({'width' : (width) ? width : 'auto'}); - } - - objPos = function (obj, top, right, bottom, left, width) { - return obj.css({ - 'top' : (top) ? top : 'auto', - 'bottom' : (bottom) ? bottom : 'auto', - 'left' : (left) ? left : 'auto', - 'right' : (right) ? right : 'auto' - }).end(); - }; - - objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', target.offset().left); - - if (this.small()) { - objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', 12.5, $(this.scope).width()); - tip.addClass('tip-override'); - objPos(nub, -nubHeight, 'auto', 'auto', target.offset().left); - } else { - var left = target.offset().left; - if (Foundation.rtl) { - nub.addClass('rtl'); - left = target.offset().left + target.outerWidth() - tip.outerWidth(); - } - objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', left); - tip.removeClass('tip-override'); - if (classes && classes.indexOf('tip-top') > -1) { - if (Foundation.rtl) nub.addClass('rtl'); - objPos(tip, (target.offset().top - tip.outerHeight()), 'auto', 'auto', left) - .removeClass('tip-override'); - } else if (classes && classes.indexOf('tip-left') > -1) { - objPos(tip, (target.offset().top + (target.outerHeight() / 2) - (tip.outerHeight() / 2)), 'auto', 'auto', (target.offset().left - tip.outerWidth() - nubHeight)) - .removeClass('tip-override'); - nub.removeClass('rtl'); - } else if (classes && classes.indexOf('tip-right') > -1) { - objPos(tip, (target.offset().top + (target.outerHeight() / 2) - (tip.outerHeight() / 2)), 'auto', 'auto', (target.offset().left + target.outerWidth() + nubHeight)) - .removeClass('tip-override'); - nub.removeClass('rtl'); - } - } - - tip.css('visibility', 'visible').hide(); - }, - - small : function () { - return matchMedia(Foundation.media_queries.small).matches && - !matchMedia(Foundation.media_queries.medium).matches; - }, - - inheritable_classes : function ($target) { - var settings = $.extend({}, this.settings, this.data_options($target)), - inheritables = ['tip-top', 'tip-left', 'tip-bottom', 'tip-right', 'radius', 'round'].concat(settings.additional_inheritable_classes), - classes = $target.attr('class'), - filtered = classes ? $.map(classes.split(' '), function (el, i) { - if ($.inArray(el, inheritables) !== -1) { - return el; - } - }).join(' ') : ''; - - return $.trim(filtered); - }, - - convert_to_touch : function($target) { - var self = this, - $tip = self.getTip($target), - settings = $.extend({}, self.settings, self.data_options($target)); - - if ($tip.find('.tap-to-close').length === 0) { - $tip.append(''+settings.touch_close_text+''); - $tip.on('click.fndtn.tooltip.tapclose touchstart.fndtn.tooltip.tapclose MSPointerDown.fndtn.tooltip.tapclose', function(e) { - self.hide($target); - }); - } - - $target.data('tooltip-open-event-type', 'touch'); - }, - - show : function ($target) { - var $tip = this.getTip($target); - - if ($target.data('tooltip-open-event-type') == 'touch') { - this.convert_to_touch($target); - } - - this.reposition($target, $tip, $target.attr('class')); - $target.addClass('open'); - $tip.fadeIn(150); - }, - - hide : function ($target) { - var $tip = this.getTip($target); - - $tip.fadeOut(150, function() { - $tip.find('.tap-to-close').remove(); - $tip.off('click.fndtn.tooltip.tapclose MSPointerDown.fndtn.tapclose'); - $target.removeClass('open'); - }); - }, - - off : function () { - var self = this; - this.S(this.scope).off('.fndtn.tooltip'); - this.S(this.settings.tooltip_class).each(function (i) { - $('[' + self.attr_name() + ']').eq(i).attr('title', $(this).text()); - }).remove(); - }, - - reflow : function () {} - }; -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/foundation/foundation.topbar.js b/src/opsoro/server/static/js/foundation/foundation.topbar.js deleted file mode 100644 index 01bbc57..0000000 --- a/src/opsoro/server/static/js/foundation/foundation.topbar.js +++ /dev/null @@ -1,445 +0,0 @@ -;(function ($, window, document, undefined) { - 'use strict'; - - Foundation.libs.topbar = { - name : 'topbar', - - version: '5.5.0', - - settings : { - index : 0, - sticky_class : 'sticky', - custom_back_text: true, - back_text: 'Back', - mobile_show_parent_link: true, - is_hover: true, - scrolltop : true, // jump to top when sticky nav menu toggle is clicked - sticky_on : 'all' - }, - - init : function (section, method, options) { - Foundation.inherit(this, 'add_custom_rule register_media throttle'); - var self = this; - - self.register_media('topbar', 'foundation-mq-topbar'); - - this.bindings(method, options); - - self.S('[' + this.attr_name() + ']', this.scope).each(function () { - var topbar = $(this), - settings = topbar.data(self.attr_name(true) + '-init'), - section = self.S('section, .top-bar-section', this); - topbar.data('index', 0); - var topbarContainer = topbar.parent(); - if (topbarContainer.hasClass('fixed') || self.is_sticky(topbar, topbarContainer, settings) ) { - self.settings.sticky_class = settings.sticky_class; - self.settings.sticky_topbar = topbar; - topbar.data('height', topbarContainer.outerHeight()); - topbar.data('stickyoffset', topbarContainer.offset().top); - } else { - topbar.data('height', topbar.outerHeight()); - } - - if (!settings.assembled) { - self.assemble(topbar); - } - - if (settings.is_hover) { - self.S('.has-dropdown', topbar).addClass('not-click'); - } else { - self.S('.has-dropdown', topbar).removeClass('not-click'); - } - - // Pad body when sticky (scrolled) or fixed. - self.add_custom_rule('.f-topbar-fixed { padding-top: ' + topbar.data('height') + 'px }'); - - if (topbarContainer.hasClass('fixed')) { - self.S('body').addClass('f-topbar-fixed'); - } - }); - - }, - - is_sticky: function (topbar, topbarContainer, settings) { - var sticky = topbarContainer.hasClass(settings.sticky_class); - - if (sticky && settings.sticky_on === 'all') { - return true; - } else if (sticky && this.small() && settings.sticky_on === 'small') { - return (matchMedia(Foundation.media_queries.small).matches && !matchMedia(Foundation.media_queries.medium).matches && - !matchMedia(Foundation.media_queries.large).matches); - //return true; - } else if (sticky && this.medium() && settings.sticky_on === 'medium') { - return (matchMedia(Foundation.media_queries.small).matches && matchMedia(Foundation.media_queries.medium).matches && - !matchMedia(Foundation.media_queries.large).matches); - //return true; - } else if(sticky && this.large() && settings.sticky_on === 'large') { - return (matchMedia(Foundation.media_queries.small).matches && matchMedia(Foundation.media_queries.medium).matches && - matchMedia(Foundation.media_queries.large).matches); - //return true; - } - - return false; - }, - - toggle: function (toggleEl) { - var self = this, - topbar; - - if (toggleEl) { - topbar = self.S(toggleEl).closest('[' + this.attr_name() + ']'); - } else { - topbar = self.S('[' + this.attr_name() + ']'); - } - - var settings = topbar.data(this.attr_name(true) + '-init'); - - var section = self.S('section, .top-bar-section', topbar); - - if (self.breakpoint()) { - if (!self.rtl) { - section.css({left: '0%'}); - $('>.name', section).css({left: '100%'}); - } else { - section.css({right: '0%'}); - $('>.name', section).css({right: '100%'}); - } - - self.S('li.moved', section).removeClass('moved'); - topbar.data('index', 0); - - topbar - .toggleClass('expanded') - .css('height', ''); - } - - if (settings.scrolltop) { - if (!topbar.hasClass('expanded')) { - if (topbar.hasClass('fixed')) { - topbar.parent().addClass('fixed'); - topbar.removeClass('fixed'); - self.S('body').addClass('f-topbar-fixed'); - } - } else if (topbar.parent().hasClass('fixed')) { - if (settings.scrolltop) { - topbar.parent().removeClass('fixed'); - topbar.addClass('fixed'); - self.S('body').removeClass('f-topbar-fixed'); - - window.scrollTo(0,0); - } else { - topbar.parent().removeClass('expanded'); - } - } - } else { - if (self.is_sticky(topbar, topbar.parent(), settings)) { - topbar.parent().addClass('fixed'); - } - - if (topbar.parent().hasClass('fixed')) { - if (!topbar.hasClass('expanded')) { - topbar.removeClass('fixed'); - topbar.parent().removeClass('expanded'); - self.update_sticky_positioning(); - } else { - topbar.addClass('fixed'); - topbar.parent().addClass('expanded'); - self.S('body').addClass('f-topbar-fixed'); - } - } - } - }, - - timer : null, - - events : function (bar) { - var self = this, - S = this.S; - - S(this.scope) - .off('.topbar') - .on('click.fndtn.topbar', '[' + this.attr_name() + '] .toggle-topbar', function (e) { - e.preventDefault(); - self.toggle(this); - }) - .on('click.fndtn.topbar','.top-bar .top-bar-section li a[href^="#"],[' + this.attr_name() + '] .top-bar-section li a[href^="#"]',function (e) { - var li = $(this).closest('li'); - if(self.breakpoint() && !li.hasClass('back') && !li.hasClass('has-dropdown')) - { - self.toggle(); - } - }) - .on('click.fndtn.topbar', '[' + this.attr_name() + '] li.has-dropdown', function (e) { - var li = S(this), - target = S(e.target), - topbar = li.closest('[' + self.attr_name() + ']'), - settings = topbar.data(self.attr_name(true) + '-init'); - - if(target.data('revealId')) { - self.toggle(); - return; - } - - if (self.breakpoint()) return; - if (settings.is_hover && !Modernizr.touch) return; - - e.stopImmediatePropagation(); - - if (li.hasClass('hover')) { - li - .removeClass('hover') - .find('li') - .removeClass('hover'); - - li.parents('li.hover') - .removeClass('hover'); - } else { - li.addClass('hover'); - - $(li).siblings().removeClass('hover'); - - if (target[0].nodeName === 'A' && target.parent().hasClass('has-dropdown')) { - e.preventDefault(); - } - } - }) - .on('click.fndtn.topbar', '[' + this.attr_name() + '] .has-dropdown>a', function (e) { - if (self.breakpoint()) { - - e.preventDefault(); - - var $this = S(this), - topbar = $this.closest('[' + self.attr_name() + ']'), - section = topbar.find('section, .top-bar-section'), - dropdownHeight = $this.next('.dropdown').outerHeight(), - $selectedLi = $this.closest('li'); - - topbar.data('index', topbar.data('index') + 1); - $selectedLi.addClass('moved'); - - if (!self.rtl) { - section.css({left: -(100 * topbar.data('index')) + '%'}); - section.find('>.name').css({left: 100 * topbar.data('index') + '%'}); - } else { - section.css({right: -(100 * topbar.data('index')) + '%'}); - section.find('>.name').css({right: 100 * topbar.data('index') + '%'}); - } - - topbar.css('height', $this.siblings('ul').outerHeight(true) + topbar.data('height')); - } - }); - - S(window).off('.topbar').on('resize.fndtn.topbar', self.throttle(function() { - self.resize.call(self); - }, 50)).trigger('resize').trigger('resize.fndtn.topbar').load(function(){ - // Ensure that the offset is calculated after all of the pages resources have loaded - S(this).trigger('resize.fndtn.topbar'); - }); - - S('body').off('.topbar').on('click.fndtn.topbar', function (e) { - var parent = S(e.target).closest('li').closest('li.hover'); - - if (parent.length > 0) { - return; - } - - S('[' + self.attr_name() + '] li.hover').removeClass('hover'); - }); - - // Go up a level on Click - S(this.scope).on('click.fndtn.topbar', '[' + this.attr_name() + '] .has-dropdown .back', function (e) { - e.preventDefault(); - - var $this = S(this), - topbar = $this.closest('[' + self.attr_name() + ']'), - section = topbar.find('section, .top-bar-section'), - settings = topbar.data(self.attr_name(true) + '-init'), - $movedLi = $this.closest('li.moved'), - $previousLevelUl = $movedLi.parent(); - - topbar.data('index', topbar.data('index') - 1); - - if (!self.rtl) { - section.css({left: -(100 * topbar.data('index')) + '%'}); - section.find('>.name').css({left: 100 * topbar.data('index') + '%'}); - } else { - section.css({right: -(100 * topbar.data('index')) + '%'}); - section.find('>.name').css({right: 100 * topbar.data('index') + '%'}); - } - - if (topbar.data('index') === 0) { - topbar.css('height', ''); - } else { - topbar.css('height', $previousLevelUl.outerHeight(true) + topbar.data('height')); - } - - setTimeout(function () { - $movedLi.removeClass('moved'); - }, 300); - }); - - // Show dropdown menus when their items are focused - S(this.scope).find('.dropdown a') - .focus(function() { - $(this).parents('.has-dropdown').addClass('hover'); - }) - .blur(function() { - $(this).parents('.has-dropdown').removeClass('hover'); - }); - }, - - resize : function () { - var self = this; - self.S('[' + this.attr_name() + ']').each(function () { - var topbar = self.S(this), - settings = topbar.data(self.attr_name(true) + '-init'); - - var stickyContainer = topbar.parent('.' + self.settings.sticky_class); - var stickyOffset; - - if (!self.breakpoint()) { - var doToggle = topbar.hasClass('expanded'); - topbar - .css('height', '') - .removeClass('expanded') - .find('li') - .removeClass('hover'); - - if(doToggle) { - self.toggle(topbar); - } - } - - if(self.is_sticky(topbar, stickyContainer, settings)) { - if(stickyContainer.hasClass('fixed')) { - // Remove the fixed to allow for correct calculation of the offset. - stickyContainer.removeClass('fixed'); - - stickyOffset = stickyContainer.offset().top; - if(self.S(document.body).hasClass('f-topbar-fixed')) { - stickyOffset -= topbar.data('height'); - } - - topbar.data('stickyoffset', stickyOffset); - stickyContainer.addClass('fixed'); - } else { - stickyOffset = stickyContainer.offset().top; - topbar.data('stickyoffset', stickyOffset); - } - } - - }); - }, - - breakpoint : function () { - return !matchMedia(Foundation.media_queries['topbar']).matches; - }, - - small : function () { - return matchMedia(Foundation.media_queries['small']).matches; - }, - - medium : function () { - return matchMedia(Foundation.media_queries['medium']).matches; - }, - - large : function () { - return matchMedia(Foundation.media_queries['large']).matches; - }, - - assemble : function (topbar) { - var self = this, - settings = topbar.data(this.attr_name(true) + '-init'), - section = self.S('section, .top-bar-section', topbar); - - // Pull element out of the DOM for manipulation - section.detach(); - - self.S('.has-dropdown>a', section).each(function () { - var $link = self.S(this), - $dropdown = $link.siblings('.dropdown'), - url = $link.attr('href'), - $titleLi; - - - if (!$dropdown.find('.title.back').length) { - - if (settings.mobile_show_parent_link == true && url) { - $titleLi = $('
          2. '); - } else { - $titleLi = $('
          3. '); - } - - // Copy link to subnav - if (settings.custom_back_text == true) { - $('h5>a', $titleLi).html(settings.back_text); - } else { - $('h5>a', $titleLi).html('« ' + $link.html()); - } - $dropdown.prepend($titleLi); - } - }); - - // Put element back in the DOM - section.appendTo(topbar); - - // check for sticky - this.sticky(); - - this.assembled(topbar); - }, - - assembled : function (topbar) { - topbar.data(this.attr_name(true), $.extend({}, topbar.data(this.attr_name(true)), {assembled: true})); - }, - - height : function (ul) { - var total = 0, - self = this; - - $('> li', ul).each(function () { - total += self.S(this).outerHeight(true); - }); - - return total; - }, - - sticky : function () { - var self = this; - - this.S(window).on('scroll', function() { - self.update_sticky_positioning(); - }); - }, - - update_sticky_positioning: function() { - var klass = '.' + this.settings.sticky_class, - $window = this.S(window), - self = this; - - if (self.settings.sticky_topbar && self.is_sticky(this.settings.sticky_topbar,this.settings.sticky_topbar.parent(), this.settings)) { - var distance = this.settings.sticky_topbar.data('stickyoffset'); - if (!self.S(klass).hasClass('expanded')) { - if ($window.scrollTop() > (distance)) { - if (!self.S(klass).hasClass('fixed')) { - self.S(klass).addClass('fixed'); - self.S('body').addClass('f-topbar-fixed'); - } - } else if ($window.scrollTop() <= distance) { - if (self.S(klass).hasClass('fixed')) { - self.S(klass).removeClass('fixed'); - self.S('body').removeClass('f-topbar-fixed'); - } - } - } - } - }, - - off : function () { - this.S(this.scope).off('.fndtn.topbar'); - this.S(window).off('.fndtn.topbar'); - }, - - reflow : function () {} - }; -}(jQuery, window, window.document)); diff --git a/src/opsoro/server/static/js/knockout-slider-binding.js b/src/opsoro/server/static/js/knockout-slider-binding.js index 99c1da0..2979444 100644 --- a/src/opsoro/server/static/js/knockout-slider-binding.js +++ b/src/opsoro/server/static/js/knockout-slider-binding.js @@ -1,16 +1,16 @@ ko.bindingHandlers.slider = { - init: function(element, valueAccessor){ + init: function(element, valueAccessor) { valueAccessor().extend({ rateLimit: 50 }); - $(element).on('change.fndtn.slider', function(){ + $(element).on('moved.zf.slider', function() { var value = valueAccessor(); - value( $(element).attr('data-slider') ); + value( $(element).find(".slider-handle").attr("aria-valuenow") ); }); }, update: function (element, valueAccessor, allBindingsAccessor, viewModel) { var value = valueAccessor(); - var valueUnwrapped = ko.unwrap(value); - $(element).foundation('slider', 'set_value', valueUnwrapped || 0); + var valueUnwrapped = ko.unwrap(value) || 0; + var elem = new Foundation.Slider($(element), { 'binding': true, 'initialStart': valueUnwrapped }); ko.bindingHandlers.slider.init(element, valueAccessor); } }; diff --git a/src/opsoro/server/static/js/opsoro.js b/src/opsoro/server/static/js/opsoro.js index f08d908..91cb31d 100644 --- a/src/opsoro/server/static/js/opsoro.js +++ b/src/opsoro/server/static/js/opsoro.js @@ -1,121 +1,140 @@ - - function showMainError(msg){ - $("#errors").append("
            " + msg + "×
            "); - $(document).foundation('alert', 'reflow'); - // setTimeout(function () { - // showFiles(_CurrentPath, _OnlyFolders, _SaveFileView); - // }, 200); + $('#errors').append(""); + $('#errors .callout.alert').slideDown("fast", function() {}); + setTimeout(function () { + $('#errors .callout.alert').slideUp( "slow", function() { + $('#errors .callout.alert').remove(); + }); + }, 5000); +} +function showMainWarning(msg){ + $('#errors').append(""); + $('#errors .callout.warning').slideDown("fast", function() {}); + setTimeout(function () { + $('#errors .callout.warning').slideUp( "slow", function() { + $('#errors .callout.warning').remove(); + }); + }, 4000); } function showMainMessage(msg){ - $("#errors").append("
            " + msg + "×
            "); - $(document).foundation('alert', 'reflow'); + $('#errors').append(""); + $('#errors .callout.primary').slideDown("fast", function() {}); + setTimeout(function () { + $('#errors .callout.primary').slideUp( "slow", function() { + $('#errors .callout.primary').remove(); + }); + }, 3000); } function showMainSuccess(msg){ - $("#errors").append("
            " + msg + "×
            "); - $(document).foundation('alert', 'reflow'); + $('#errors').append(""); + $('#errors .callout.success').slideDown("fast", function() {}); + setTimeout(function () { + $('#errors .callout.success').slideUp( "slow", function() { + $('#errors .callout.success').remove(); + }); + }, 2000); } - +var popup_classes; function showPopup(sIcon, sTitle, sClass, sContent) { - $("#popup").addClass(sClass); - $("#popup .titlebar .titleicon span").addClass(sIcon); - $("#popup .titlebar .title").html(sTitle); + popup_classes = sClass; + $('#popup').addClass(popup_classes); + $('#popup .titlebar .titleicon span').addClass(sIcon); + $('#popup .titlebar .title').html(sTitle); - if (sContent != ""){ - $("#popup .content").html(sContent); + if (sContent != ''){ + $('#popup .content').html(sContent); } - $("#popup .btnClose").off("click"); - $("#popup .btnClose").on("click", closePopup); + $('#popup .btnClose').off('click'); + $('#popup .btnClose').on('click', closePopup); // Open message popup - if (!$("#popup").hasClass("open")){ - $("#popup").foundation("reveal", "open"); - } + $('#popup').foundation('open'); + } function closePopup() { - $("#popup").foundation("reveal", "close"); + $('#popup').foundation('close'); // Clear text & icon - $("#popup .titlebar .titleicon span").removeClass(); - $("#popup .titlebar .titleicon span").addClass("fa"); - $("#popup .titlebar .title").html(""); - $("#popup .content").html(""); + $('#popup .titlebar .titleicon span').removeClass(); + $('#popup .titlebar .titleicon span').addClass('fa'); + $('#popup .titlebar .title').html(''); + $('#popup .content').html(''); - $("#popup").removeClass(); - $("#popup").addClass("reveal-modal"); + $('#popup').removeClass(popup_classes); + $('#popup').addClass('reveal'); } function showMessagePopup(sIcon, sTitle, sText, handlers) { - $("#message_popup .titlebar .titleicon span").addClass(sIcon); - $("#message_popup .titlebar .title").html(sTitle); - $("#message_popup .content .text").html(sText); + $('#message_popup .titlebar .titleicon span').addClass(sIcon); + $('#message_popup .titlebar .title').html(sTitle); + $('#message_popup .content .text').html(sText); data = {}; // Input enabling if (handlers.inputText != undefined){ - $("#message_popup .inputText").removeClass("hide"); - $("#message_popup .inputText").on("input", handlers.inputText); + $('#message_popup .inputText').removeClass('hide'); + $('#message_popup .inputText').on('input', handlers.inputText); } // Button click handlers if (handlers.btnOk != undefined){ - $("#message_popup .btnOk").removeClass("hide"); - $("#message_popup .btnOk").on("click", handlers.btnOk); + $('#message_popup .btnOk').removeClass('hide'); + $('#message_popup .btnOk').on('click', handlers.btnOk); } if (handlers.btnYes != undefined){ - $("#message_popup .btnYes").removeClass("hide"); - $("#message_popup .btnYes").on("click", handlers.btnYes); + $('#message_popup .btnYes').removeClass('hide'); + $('#message_popup .btnYes').on('click', handlers.btnYes); } if (handlers.btnNo != undefined){ - $("#message_popup .btnNo").removeClass("hide"); - $("#message_popup .btnNo").on("click", handlers.btnNo); + $('#message_popup .btnNo').removeClass('hide'); + $('#message_popup .btnNo').on('click', handlers.btnNo); } if (handlers.btnSave != undefined){ - $("#message_popup .btnSave").removeClass("hide"); - $("#message_popup .btnSave").on("click", handlers.btnSave); + $('#message_popup .btnSave').removeClass('hide'); + $('#message_popup .btnSave').on('click', handlers.btnSave); } if (handlers.btnCancel != undefined){ - $("#message_popup .btnCancel").removeClass("hide"); - $("#message_popup .btnCancel").on("click", handlers.btnCancel); + $('#message_popup .btnCancel').removeClass('hide'); + $('#message_popup .btnCancel').on('click', handlers.btnCancel); } - $("#message_popup .btnClose").off("click"); - $("#message_popup .btnClose").on("click", closeMessagePopup); + $('#message_popup .btnClose').off('click'); + $('#message_popup .btnClose').on('click', closeMessagePopup); // Open message popup - if (!$("#message_popup").hasClass("open")){ - $("#message_popup").foundation("reveal", "open"); + if (!$('#message_popup').hasClass('open')){ + $('#message_popup').foundation('open'); } } function closeMessagePopup() { - $("#message_popup").foundation("reveal", "close"); + $('#message_popup').foundation('close'); // Clear text & icon - $("#message_popup .titlebar .titleicon span").removeClass(); - $("#message_popup .titlebar .titleicon span").addClass("fa"); - $("#message_popup .titlebar .title").html(""); - $("#message_popup .content .text").html(""); + $('#message_popup .titlebar .titleicon span').removeClass(); + $('#message_popup .titlebar .titleicon span').addClass('fa'); + $('#message_popup .titlebar .title').html(''); + $('#message_popup .content .text').html(''); // Clear inputs - $("#message_popup .inputText").val(""); + $('#message_popup .inputText').val(''); // Hide inputs - $("#message_popup .inputText").addClass("hide"); + $('#message_popup .inputText').addClass('hide'); // Hide buttons - $("#message_popup .btnOk").addClass("hide"); - $("#message_popup .btnYes").addClass("hide"); - $("#message_popup .btnNo").addClass("hide"); - $("#message_popup .btnSave").addClass("hide"); - $("#message_popup .btnCancel").addClass("hide"); + $('#message_popup .btnOk').addClass('hide'); + $('#message_popup .btnYes').addClass('hide'); + $('#message_popup .btnNo').addClass('hide'); + $('#message_popup .btnSave').addClass('hide'); + $('#message_popup .btnCancel').addClass('hide'); // Remove click handlers - $("#message_popup .btnOk").off("click"); - $("#message_popup .btnYes").off("click"); - $("#message_popup .btnNo").off("click"); - $("#message_popup .btnSave").off("click"); - $("#message_popup .btnCancel").off("click"); + $('#message_popup .btnOk').off('click'); + $('#message_popup .btnYes').off('click'); + $('#message_popup .btnNo').off('click'); + $('#message_popup .btnSave').off('click'); + $('#message_popup .btnCancel').off('click'); } function popupWindow(mylink, windowname) @@ -126,13 +145,174 @@ function popupWindow(mylink, windowname) href=mylink; else href=mylink.href; - window.open(href, windowname, 'width=400,height=400,scrollbars=no'); + window.open(href, windowname, 'width=400,height=500,scrollbars=no'); return false; } // ------------------------------------------------------------------------------------------------------- // ------------------------------------------------------------------------------------------------------- +// Socket connection +//-------------------------------------------------------------------------------------------------------- +// Setup websocket connection. +var app_socket_handler = undefined; +var conn = null; +var connReady = false; +function connectSocket() { + conn = new SockJS('http://' + window.location.host + '/sockjs'); + + conn.onopen = function(){ + console.log("SockJS connected."); + $.ajax({ + url: "/sockjstoken/", + cache: false + }).done(function(data) { + var appname = undefined; + + if (app_data != undefined) { + if ('formatted_name' in app_data) { + appname = app_data['formatted_name']; + } + } + conn.send(JSON.stringify({ + app: appname, + action: "authenticate", + token: data + })); + connReady = true; + console.log("SockJS authenticated."); + + if (typeof virtual_robot != 'undefined' && virtual_robot) { + conn.send(JSON.stringify({action: "robot"})); + } + }); + }; + + conn.onmessage = function(e){ + try { + var msg = $.parseJSON(e.data); + console.log(msg); + switch(msg.action) { + case 'refresh': + setTimeout(function() { location.reload(); }, 1000); + break; + case 'info': + if (typeof msg.type != 'undefined' && typeof msg.text != 'undefined') { + switch(msg.type) { + case 'popup': + showMessagePopup('fa-info', 'Server info', msg.text, {btnOk: function() { location.reload(); }}); + break; + case 'error': + showMainError(msg.text); + break; + case 'warning': + showMainWarning(msg.text); + break; + case 'message': + showMainMessage(msg.text); + break; + case 'success': + showMainSuccess(msg.text); + break; + } + } + break; + case 'users': + var text = ' user'; + if (msg.count > 1) { text += 's' } + text += ' connected.' + + $('.online_users').html(msg.count + text); + break; + case 'apps': + $('.app-active').css('display', 'none'); + $('.app-locked').css('display', 'none'); + + if (typeof msg.active != 'undefined') { + for (var i = 0; i < msg.active.length; i++) { + var app = msg.active[i]; + $('.' + app + ' .app-active').css('display', 'inline-block'); + } + } + if (typeof msg.locked != 'undefined') { + for (var i = 0; i < msg.locked.length; i++) { + var app = msg.locked[i]; + $('.' + app + ' .app-locked').css('display', 'inline-block'); + } + } + break; + case 'app': + console.log(msg.data); + if (app_socket_handler != undefined) { + app_socket_handler(msg.data); + } + break; + case 'robot': + // console.log(msg.dofs); + if (typeof virtualModel != 'undefined') { + if (typeof msg.dofs != 'undefined' && typeof virtualModel.update_dofs === "function") { + virtualModel.update_dofs(msg.dofs); + } + if (typeof msg.sound != 'undefined' && typeof msg.msg != 'undefined' && typeof virtualModel.update_sound === "function") { + virtualModel.update_sound(msg.sound, msg.msg); + } + if (typeof msg.refresh != 'undefined') { + location.reload(); + } + } + + break; + // case 'shutdown': + // showMessagePopup('fa-info', 'Server info', msg.text, {btnOk: function() { location.reload(); }}); + // break; + } + } catch (e) { + console.log(e); + } finally { + + } + + }; + + conn.onclose = function(){ + console.log('SOCKET close'); + conn = null; + + // Only reconnect if the connection was successfull in the first place + if (connReady) { + setTimeout(function() { + var retry_socket = setInterval(function () { + connectSocket(); + setTimeout(function() { + if (connReady) { + clearInterval(retry_socket); + if (typeof virtual_robot != 'undefined' && virtual_robot) { + + } else { + location.reload(); + } + } + }, 500); + }, 1000); + + showMainError('Disconnected from robot, trying to reconnect...'); + $('.online_users').html('Disconnected, trying to reconnect...'); + $('.active_apps').html(''); + if (typeof virtual_robot != 'undefined' && virtual_robot) { + + } else { + setTimeout(function() { location.reload(); }, 5000); + } + }, 500); + } + + connReady = false; + }; +} +$(document).ready(function(){ + connectSocket(); +}); +// ------------------------------------------------------------------------------------------------------- // Robot control functions // ------------------------------------------------------------------------------------------------------- function robotSendReceiveConfig(config_data) @@ -141,7 +321,25 @@ function robotSendReceiveConfig(config_data) $.ajax({ dataType: 'json', type: 'POST', - url: '/robot/config/', + url: '/config/robot/', + data: { config_data: json_data }, + success: function(data){ + if (!data.success) { + showMainError(data.message); + } else { + return data.config; + } + } + }); +} + +function robotSendReceiveExpressions(config_data) +{ + var json_data = ko.toJSON(config_data, null, 2); + $.ajax({ + dataType: 'json', + type: 'POST', + url: '/config/expression/', data: { config_data: json_data }, success: function(data){ if (!data.success) { @@ -236,9 +434,9 @@ function robotSendServo(pin, value) function robotSendTTS(text) { $.ajax({ - dataType: "json", - type: "GET", - url: "/robot/tts/", + dataType: 'json', + type: 'GET', + url: '/robot/tts/', data: {t: text}, success: function(data){ if (!data.success) { @@ -251,12 +449,12 @@ function robotSendTTS(text) function robotSendSound(soundName) { $.ajax({ - dataType: "json", - type: "GET", - url: "/robot/sound/", + dataType: 'json', + type: 'GET', + url: '/robot/sound/', data: {s: soundName}, success: function(data){ - if(data.status == "error"){ + if(data.status == 'error'){ showMainError(data.message); } @@ -267,11 +465,11 @@ function robotSendSound(soundName) function robotSendStop() { $.ajax({ - dataType: "json", - type: "GET", - url: "/robot/stop/", + dataType: 'json', + type: 'GET', + url: '/robot/stop/', success: function(data){ - if(data.status == "error"){ + if(data.status == 'error'){ showMainError(data.message); } @@ -282,4 +480,21 @@ function robotSendStop() // ------------------------------------------------------------------------------------------------------- // ------------------------------------------------------------------------------------------------------- -$(document).foundation(); +function ClickToEdit(value, placeholder){ + var self = this; + // Data + self.value = ko.observable(value); + self.editing = ko.observable(false); + self.placeholder = placeholder || "empty"; + + // Behaviors + self.edit = function(){ self.editing(true) } + + self.displayValue = ko.pureComputed(function(){ + if(self.value() == ""){ + return "" + self.placeholder +"" + } + return self.value(); + }, self); + +} diff --git a/src/opsoro/server/static/js/robot/model.js b/src/opsoro/server/static/js/robot/model.js new file mode 100644 index 0000000..1d7fc6c --- /dev/null +++ b/src/opsoro/server/static/js/robot/model.js @@ -0,0 +1,544 @@ +var modules_definition = {}; + +// Converts from degrees to radians. +Math.radians = function(degrees) { + return degrees * Math.PI / 180; +}; + +// Converts from radians to degrees. +Math.degrees = function(radians) { + return radians * 180 / Math.PI; +}; + +function constrain(val, min, max) { + return Math.min(max, Math.max(val, min)); +} +function grid_to_screen(val) { + // Make sure the grid value is an int + val = Math.round(val); + // 8mm between grid holes + val *= virtualModel.grid.space; + // start value + val += virtualModel.grid.start; + return val; +} +function screen_to_grid(val) { + // start value + val -= virtualModel.grid.start; + // 8mm between grid holes + val /= virtualModel.grid.space; + // Make sure the grid value is an int + return Math.round(val); +} +function mm_to_screen(val) { + return val * virtualModel.grid.scale; +} +function snap_to_grid_x(value, object) { + var size12 = (object.rotation()%180 == 0 ? object.width() : object.height()) / 2; + var min = virtualModel.grid.x + size12; + var max = virtualModel.grid.x + virtualModel.grid.width - size12 + + // Constrain value + value = constrain(value, min, max); + value -= virtualModel.grid.x; + // Startposition + value -= virtualModel.grid.start; + // 8mm between holes + value /= virtualModel.grid.space; + // Make sure the grid value is an int + value = Math.round(value); + // convert back + value *= virtualModel.grid.space; + value += virtualModel.grid.start; + value += virtualModel.grid.x; + + return value; +} +function snap_to_grid_y(value, object) { + var size12 = (object.rotation()%180 == 0 ? object.height() : object.width()) / 2; + var min = virtualModel.grid.y + size12; + var max = virtualModel.grid.y + virtualModel.grid.height - size12 + + // Constrain value + value = constrain(value, min, max); + value -= virtualModel.grid.y; + // Startposition + value -= virtualModel.grid.start; + // 8mm between holes + value /= virtualModel.grid.space; + // Make sure the grid value is an int + value = Math.round(value); + // convert back + value *= virtualModel.grid.space; + value += virtualModel.grid.start; + value += virtualModel.grid.y; + + return value; +} +var Expression = function(name, filename, poly_index, dof_values) { + var self = this; + self.name = name || ''; + self.default = '2753'; + self.filename = ko.observable(filename || self.default); + self.poly_index = ko.observable(poly_index || -1); + self.dof_values = dof_values || [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]; + self.selected = ko.observable(false); + + self.update = function() { + if (!self.selected()) { return; } + var dofs = self.dof_values; + for (var i = 0; i < virtualModel.modules().length; i++) { + var mod = virtualModel.modules()[i]; + for (var j = 0; j < mod.dofs().length; j++) { + dofs[mod.dofs()[j].servo().pin()] = parseFloat(mod.dofs()[j].value()); + } + } + self.dof_values = dofs; + robotSendReceiveAllDOF(self.dof_values); + }; + + self.select = function() { + for (var i = 0; i < virtualModel.expressions().length; i++) { + virtualModel.expressions()[i].selected(false); + } + virtualModel.selected_expression(self); + + if (self.poly_index() < 0) { + // Use dof values + for (var i = 0; i < virtualModel.modules().length; i++) { + var mod = virtualModel.modules()[i]; + for (var j = 0; j < mod.dofs().length; j++) { + mod.dofs()[j].value(self.dof_values[mod.dofs()[j].servo().pin()]); + + mod.update_dofs(); + } + } + } else { + // Use dof poly + for (var i = 0; i < virtualModel.modules().length; i++) { + virtualModel.modules()[i].apply_poly(self.poly_index()); + } + } + self.selected(true); + }; + self.update_icon = function(icon) { + self.filename(icon); + $("#PickIconModal").foundation("close"); + }; + self.change_icon = function() { + // Reset icons + for (var i = 0; i < virtualModel.used_icons.length; i++) { + if (virtualModel.used_icons[i] == self.default) { + continue; + } + virtualModel.icons.push(virtualModel.used_icons[i]); + } + virtualModel.used_icons = [] + for (var i = 0; i < virtualModel.expressions().length; i++) { + virtualModel.icons.remove(virtualModel.expressions()[i].filename()); + virtualModel.used_icons.push(virtualModel.expressions()[i].filename()); + } + virtualModel.icons.sort(); + // View icons + $("#PickIconModal").foundation("open"); + }; + self.remove = function() { + virtualModel.expressions.remove(self); + if (virtualModel.expressions().length > 0) { + virtualModel.expressions()[0].select(); + } + }; + +}; +var Grid = function(pin, mid, min, max) { + var self = this; + self.x = 30; + self.y = 30; + self.holesX = 25; + self.holesY = 36; + + self.object = main_svg.image('/static/images/robot/grids/A4_portrait.svg'); + self.object.addClass('grid'); + self.object.move(self.x, self.y); + self.object.draggable().on('dragmove', function(e) { e.preventDefault(); }); + self.object.on('mousedown', function(){ + if (virtualModel.selected_module() != undefined) { + virtualModel.selected_module().deselect(); + } + }); + self.resize = function(width) { + self.width = width - (2 * self.x); + self.scale = self.width / 205; + self.height = 293 * self.scale; + self.start = 6.5 * self.scale; + self.space = 8 * self.scale; + + main_svg.size(width, self.height + (2 * self.y)); + + self.object.size(self.width, self.height); + }; + + self.resize(470); +}; +var Servo = function(pin, mid, min, max) { + var self = this; + self.pin = ko.observable(pin || 0); + self.mid = ko.observable(mid || 1500); + self.min = ko.observable(min || -100); + self.max = ko.observable(max || 100); + + self.update_mid = function() { + if(connReady){ + conn.send(JSON.stringify({ + action: "setServoPos", + pin: self.pin(), + value: self.mid(), + })); + } + }; + self._update_mid = ko.computed(function() { + if(connReady){ + conn.send(JSON.stringify({ + action: "setServoPos", + pin: self.pin(), + value: self.mid(), + })); + } + return self.mid(); + }, self); +}; +var Dof = function(name) { + var self = this; + self.name = ko.observable(name); + self.name_formatted = ko.observable(name.replace(' ', '_')); + self.value = ko.observable(0); + self.isServo = ko.observable(false); + self.servo = ko.observable(new Servo(0, 1500, 0, 0)); + self.poly = ko.observableArray(); + for (var i = 0; i < 20; i++) { + self.poly.push(0); + } + + self.setServo = function(pin, mid, min, max) { + self.servo(new Servo(pin, mid, min, max)); + self.isServo(true); + }; + self.set_poly = function(poly) { + if (poly.length < 20) { return; } + self.poly.removeAll(); + for (var i = 0; i < 20; i++) { + self.poly.push((constrain(poly[i] || 0, -1, 1))); + } + }; + self.update_single_poly = function(index) { + if (index < 0 || index > 19) { return; } + self.poly()[index] = ((constrain(self.value() || 0, -1, 1))); + }; + self.apply_poly = function(index) { + if (index < 0 || index > 19) { return; } + self.value(self.poly()[index]); + }; +}; +var Module = function(svg_code, specs, config) { + var self = this; + + self.code = svg_code || ''; + self.specs = specs || ''; + self.config = config || ''; + + self.name = new ClickToEdit("", "Untitled"); + self.type = ko.observable(''); + self.x = ko.observable(0); + self.y = ko.observable(0); + self.grid_x = ko.observable(0); + self.grid_y = ko.observable(0); + self.width = ko.observable(0); + self.height = ko.observable(0); + self.actual_width = ko.observable(0); + self.actual_height = ko.observable(0); + self.rotation = ko.observable(0); + self.dofs = ko.observableArray(); + self._drag_offset = [0, 0]; + + self.set_dofs = function(values) { + if (values.length != self.dofs().length) { + console.log('error dofs'); + return; + } + for (var i = 0; i < self.dofs().length; i++) { + self.dofs()[i].value(constrain(values[i] || 0, -1, 1)); + } + self.update_dofs(); + }; + self.apply_poly = function(index) { + if (index < 0 || index > 19) { return; } + for (var i = 0; i < self.dofs().length; i++) { + self.dofs()[i].apply_poly(index); + } + self.update_dofs(); + }; + + self.set_pos = function(x, y) { + // Reset rotation for position movement + if (self.object != undefined) { + // self.object.rotate(0, self.x(), self.y()); + // self.group.rotate(0); + } + self.x(snap_to_grid_x(x, self)); + self.y(snap_to_grid_y(y, self)); + self.grid_x(screen_to_grid(self.x())); + self.grid_y(screen_to_grid(self.y())); + self.update(); + }; + self.set_size = function(width, height) { + self.width(width); + self.height(height); + self.update(); + }; + self.set_rotation = function(rotation) { + rotation = rotation % 360; + self.rotation(Math.round(rotation / 90) * 90); // 90° angles only + // When object is over the side -> reposition + self.set_pos(self.x(), self.y()); + }; + self.rotate = function() { + self.set_rotation(self.rotation() + 90); + }; + self.update_dofs = function() {}; + self.update = function() { + if (self.object == undefined) { return; } + + var maxSize = Math.max(self.width(), self.height()); + self.object.size(maxSize, maxSize); + + self.object.center(self.x(), self.y()); + // self.object.rotate(self.rotation(), self.x(), self.y()); + self.group.rotate(self.rotation()); + }; + self._drag_move = function(e) { + e.preventDefault(); + + if (e.detail.event.type != 'mousemove') { return; } + + var x = e.detail.event.pageX - virtualModel.canvasX - self._drag_offset[0]; + var y = e.detail.event.pageY - virtualModel.canvasY - self._drag_offset[1]; + + self.set_pos(x, y); + }; + self._mouse_down = function(e) { + self._drag_offset = [e.pageX - virtualModel.canvasX - self.x(), e.pageY - virtualModel.canvasY - self.y()]; + self.select(); + }; + self.remove = function() { + self.deselect(); + self.object.remove(); + if (self.extra != undefined) { + self.extra.remove(); + } + virtualModel.modules.remove(self); + }; + self.select = function() { + if (virtualModel.selected_module() != undefined) { + virtualModel.selected_module().deselect(); + } + self.object.front(); + if (self.extra != undefined) { + self.extra.front(); + } + self.object.addClass('selected_module'); + virtualModel.selected_module(self); + Foundation.reInit($('[data-slider]')); + }; + self.deselect = function() { + self.object.removeClass('selected_module'); + virtualModel.selected_module(undefined); + }; + + // Apply parameters + if (self.specs != '') { + self.type(self.specs.type); + self.name.value(self.type()); + self.set_size(mm_to_screen(self.specs.size.width), mm_to_screen(self.specs.size.height)); + self.actual_width(self.specs.size.width); + self.actual_height(self.specs.size.height); + + // initialize dofs if the module has any + if (self.specs.dofs != undefined) { + for (var i = 0; i < self.specs.dofs.length; i++) { + var newdof = new Dof(self.specs.dofs[i].name); + if (self.specs.dofs[i].servo != undefined) { + newdof.setServo(0, 1500, self.specs.dofs[i].servo.min, self.specs.dofs[i].servo.max) + } + self.dofs.push(newdof); + } + + self._update_dofs = ko.computed(function() { + if (self.dofs().length == 0) { return undefined; } + + if (virtualModel.selected_expression().selected()) { + if (virtualModel.selected_expression().poly_index() < 0) { + } else { + for (var i = 0; i < self.dofs().length; i++) { + self.dofs()[i].update_single_poly(virtualModel.selected_expression().poly_index()); + } + } + virtualModel.selected_expression().update(); + } + self.update_dofs(); + return self.dofs()[0].value(); + }, self); + } + } + if (self.config != '') { + self.name.value(self.config.name); + self.grid_x(self.config.grid.x); + self.grid_y(self.config.grid.y); + self.set_pos(virtualModel.grid.x + grid_to_screen(self.config.grid.x), virtualModel.grid.y + grid_to_screen(self.config.grid.y)); + self.set_rotation(self.config.grid.rotation || 0); + + if (self.config.dofs != undefined) { + for (var i = 0; i < self.config.dofs.length; i++) { + var dof = self.config.dofs[i]; + if (dof.servo != undefined) { + self.dofs()[i].servo().pin(dof.servo.pin); + self.dofs()[i].servo().mid(dof.servo.mid); + } + if (dof.mapping != undefined) { + self.dofs()[i].set_poly(dof.mapping.poly) + } + } + } + + + } + if (self.code != '') { + self.visual = main_svg.svg(self.code); + + self.object = self.visual.select('.object').last(); + self.group = self.object.select('.group').last(); + + if (virtualModel.edit()) { + // add drag events + self.object.style('cursor', 'grab'); + self.object.draggable().on('dragmove', self._drag_move); + if (self.extra != undefined) { + self.extra.style('cursor', 'grab'); + self.extra.draggable().on('dragmove', self._drag_move); + } + } else { + self.object.style('cursor', 'pointer'); + self.object.draggable().on('dragmove', function(e) { e.preventDefault(); }); + if (self.extra != undefined) { + self.extra.style('cursor', 'pointer'); + self.extra.draggable().on('dragmove', function(e) { e.preventDefault(); }); + } + } + self.object.on('mousedown', self._mouse_down); + if (self.extra != undefined) { + self.extra.on('mousedown', self._mouse_down); + } + self.update(); + } + +}; + +var VirtualModel = function() { + var self = this; + + // create svg drawing + main_svg = SVG('model_screen'); + + self.edit = ko.observable(false); + if ($('#model_screen').hasClass('edit')) { + self.edit(true); + } + + self.available_servos = ko.observableArray(); + for (var i = 0; i < 16; i++) { + self.available_servos.push(i); + } + + self.grid = new Grid(); + self.modules = ko.observableArray(); + self.selected_module = ko.observable(); + self.init = function() { + if (expression_data != undefined) { + for (var i = 0; i < expression_data.length; i++) { + var dat = expression_data[i]; + self.add_expression(dat.name, dat.filename, dat.poly, dat.dofs); + } + } else { + self.add_expression('', '1f610'); + } + self.expressions()[0].selected(true); + self.selected_expression(self.expressions()[0]); + for (var i = 0; i < configs.length; i++) { + var mod_type = configs[i].type; + self.add_module(mod_type, configs[i]); + } + }; + self.add_module = function(mod_type, config) { + var mod = new modules_definition[mod_type](svg_codes[mod_type], specs[mod_type], config); + self.modules.push(mod); + }; + self.resize = function() { + // update grid x & y reference points + var rect = $('svg').first().position(); + self.canvasX = rect.left; + self.canvasY = rect.top; + }; + self.resize(); + +}; + +var main_svg; +var virtualModel; + +$(document).ready(function() { + virtualModel = new VirtualModel(); + virtualModel.init(); + ko.applyBindings(virtualModel); + + $(window).resize(virtualModel.resize); + init_touch(); +}); + +function allowDrop(ev) { + ev.preventDefault(); +} + +function drag(ev) { + ev.dataTransfer.setData("module_type", ev.target.id); +} + +function drop(ev) { + ev.preventDefault(); + var data = ev.dataTransfer.getData("module_type"); + virtualModel.add_module(data, ''); + virtualModel.modules()[virtualModel.modules().length-1].set_pos(ev.pageX - virtualModel.canvasX, ev.pageY - virtualModel.canvasY); + virtualModel.modules()[virtualModel.modules().length-1].select(); +} + +function touchHandler(event) { + var touch = event.changedTouches[0]; + + var simulatedEvent = document.createEvent("MouseEvent"); + simulatedEvent.initMouseEvent({ + touchstart: "mousedown", + touchmove: "mousemove", + touchend: "mouseup" + }[event.type], true, true, window, 1, + touch.screenX, touch.screenY, + touch.clientX, touch.clientY, false, + false, false, false, 0, null); + + touch.target.dispatchEvent(simulatedEvent); + event.preventDefault(); +} + +function init_touch() { + document.addEventListener("touchstart", touchHandler, true); + document.addEventListener("touchmove", touchHandler, true); + document.addEventListener("touchend", touchHandler, true); + document.addEventListener("touchcancel", touchHandler, true); +} diff --git a/src/opsoro/server/static/js/robot/model_minimal.js b/src/opsoro/server/static/js/robot/model_minimal.js new file mode 100644 index 0000000..c6139d2 --- /dev/null +++ b/src/opsoro/server/static/js/robot/model_minimal.js @@ -0,0 +1,532 @@ +var modules_definition = {}; + +// Converts from degrees to radians. +Math.radians = function(degrees) { + return degrees * Math.PI / 180; +}; + +// Converts from radians to degrees. +Math.degrees = function(radians) { + return radians * 180 / Math.PI; +}; + +function constrain(val, min, max) { + return Math.min(max, Math.max(val, min)); +} +function grid_to_screen(val) { + // Make sure the grid value is an int + val = Math.round(val) - 1; + // 8mm between grid holes + val *= virtualModel.grid.space; + // start value + val += virtualModel.grid.start; + return val; +} +function screen_to_grid(val) { + // start value + val -= virtualModel.grid.start; + // 8mm between grid holes + val /= virtualModel.grid.space; + // Make sure the grid value is an int + return Math.round(val) - 1; +} +function mm_to_screen(val) { + return val * virtualModel.grid.scale; +} +function snap_to_grid_x(value, object) { + var size12 = (object.rotation%180 == 0 ? object.width : object.height) / 2; + var min = virtualModel.grid.x + size12; + var max = virtualModel.grid.x + virtualModel.grid.width - size12 + + // Constrain value + value = constrain(value, min, max); + value -= virtualModel.grid.x; + // Startposition + value -= virtualModel.grid.start; + // 8mm between holes + value /= virtualModel.grid.space; + // Make sure the grid value is an int + value = Math.round(value); + // convert back + value *= virtualModel.grid.space; + value += virtualModel.grid.start; + value += virtualModel.grid.x; + + return value; +} +function snap_to_grid_y(value, object) { + var size12 = (object.rotation%180 == 0 ? object.height : object.width) / 2; + var min = virtualModel.grid.y + size12; + var max = virtualModel.grid.y + virtualModel.grid.height - size12 + + // Constrain value + value = constrain(value, min, max); + value -= virtualModel.grid.y; + // Startposition + value -= virtualModel.grid.start; + // 8mm between holes + value /= virtualModel.grid.space; + // Make sure the grid value is an int + value = Math.round(value); + // convert back + value *= virtualModel.grid.space; + value += virtualModel.grid.start; + value += virtualModel.grid.y; + + return value; +} +var Grid = function() { + var self = this; + self.x = 30; + self.y = 30; + self.holesX = 25; + self.holesY = 36; + + self.object = main_svg.image('/static/images/robot/grids/A4_portrait.svg'); + self.object.addClass('grid'); + self.object.move(self.x, self.y); + self.object.draggable().on('dragmove', function(e) { e.preventDefault(); }); + self.object.on('mousedown', function(){ + if (virtualModel.selected_module != undefined) { + virtualModel.selected_module.deselect(); + } + }); + self.resize = function(width) { + self.width = width - (2 * self.x); + self.scale = self.width / 205; + self.height = 293 * self.scale; + self.start = 6.5 * self.scale; + self.space = 8 * self.scale; + + main_svg.size(width, self.height + (2 * self.y)); + + self.object.size(self.width, self.height); + }; + + self.resize(470); +}; +var Servo = function(pin, mid, min, max) { + var self = this; + self.pin = (pin || -1); + self.mid = (mid || 1500); + self.min = (min || -100); + self.max = (max || 100); +}; +var Dof = function(name) { + var self = this; + self.name = name; + self.name_formatted = name.replace(' ', '_'); + self.value = 0; + self.to_value = 0; + self.isServo = false; + self.servo = new Servo(-1, 1500, 0, 0); + self.poly = []; + self.interval = undefined; + for (var i = 0; i < 20; i++) { + self.poly.push(0); + } + + self.setServo = function(pin, mid, min, max) { + self.servo = new Servo(pin, mid, min, max); + self.isServo = true; + }; + self.set_poly = function(poly) { + if (poly.length < 20) { return; } + for (var i = 0; i < 20; i++) { + self.poly[i] = constrain(poly[i] || 0, -1, 1); + } + }; + self.update_single_poly = function(index) { + if (index < 0 || index > 19) { return; } + self.poly[index] = ((constrain(self.value || 0, -1, 1))); + }; + self.apply_poly = function(index, update_call) { + if (index < 0 || index > 19) { return; } + self.set_value(self.poly[index], update_call); + }; + self.set_value = function(value, update_call) { + value = constrain(value || 0, -1, 1); + + // Make a smooth transition between the old and new dof value + if (self.interval != undefined) { + clearInterval(self.interval); + } + var steps = 10; + var step = (value - self.value) / steps; + var delay = Math.abs(step) * 200; + self.value = constrain(self.value + step, -1, 1); + self.interval = setInterval(function() { + self.value = constrain(self.value + step, -1, 1); + steps--; + if (steps <= 1) { + self.value = value; + clearInterval(self.interval); + self.interval = undefined; + } + if (update_call != undefined) { update_call(); } + }, delay); + }; +}; +var Module = function(svg_code, specs, config) { + var self = this; + + self.code = svg_code || ''; + self.specs = specs || ''; + self._config = undefined; + + self.name = ''; + self.type = ''; + self.x = 0; + self.y = 0; + self.grid_x = 0; + self.grid_y = 0; + self.width = 0; + self.height = 0; + self.actual_width = 0; + self.actual_height = 0; + self.rotation = 0; + self.dofs = []; + self._drag_offset = [0, 0]; + + self.set_dofs = function(values) { + if (values.length != self.dofs.length) { + console.log('error dofs'); + return; + } + for (var i = 0; i < self.dofs.length; i++) { + self.dofs[i].value = constrain(values[i] || 0, -1, 1); + } + self.update_dofs(); + }; + self.apply_poly = function(index) { + if (index < 0 || index > 19) { return; } + for (var i = 0; i < self.dofs.length; i++) { + self.dofs[i].apply_poly(index, self.update_dofs); + } + }; + + self.set_pos = function(x, y) { + self.x = snap_to_grid_x(x, self); + self.y = snap_to_grid_y(y, self); + self.update(); + }; + self.update_grid_pos = function() { + self.grid_x = screen_to_grid(self.x); + self.grid_y = screen_to_grid(self.y); + }; + self.set_size = function(width, height) { + self.width = width; + self.height = height; + self.update();config + }; + self.set_rotation = function(rotation) { + rotation = rotation % 360; + self.rotation = (Math.round(rotation / 90) * 90); // 90° angles only + // When object is over the side -> reposition + self.set_pos(self.x, self.y); + }; + self.rotate = function() { + self.set_rotation(self.rotation + 90); + }; + self.update_dofs = function() {}; + self.update = function() { + if (self.object == undefined) { return; } + + var maxSize = Math.max(self.width, self.height); + self.object.size(maxSize, maxSize); + + self.object.center(self.x, self.y); + self.group.rotate(self.rotation); + }; + self.resize = function() { + + if (self.extra != undefined) { + self.resize_extra(); + } + self.set_pos(virtualModel.grid.x + grid_to_screen(self.grid_x), virtualModel.grid.y + grid_to_screen(self.grid_y)); + self.set_size(mm_to_screen(self.actual_width), mm_to_screen(self.actual_height)); + + }; + self._drag_move = function(e) { + e.preventDefault(); + + if (e.detail.event.type != 'mousemove') { return; } + + var x = e.detail.event.pageX - virtualModel.canvasX - self._drag_offset[0]; + var y = e.detail.event.pageY - virtualModel.canvasY - self._drag_offset[1]; + + self.set_pos(x, y); + self.update_grid_pos(); + }; + self._mouse_down = function(e) { + self._drag_offset = [e.pageX - virtualModel.canvasX - self.x, e.pageY - virtualModel.canvasY - self.y]; + self.select(); + }; + self.remove = function() { + self.deselect(); + self.object.remove(); + if (self.extra != undefined) { + self.extra.remove(); + } + var index = virtualModel.modules.indexOf(self); + if (index > -1) { + virtualModel.modules.splice(index, 1); + } + }; + self.select = function() { + if (virtualModel.selected_module != undefined) { + virtualModel.selected_module.deselect(); + } + self.object.front(); + if (self.extra != undefined) { + self.extra.front(); + } + self.object.addClass('selected_module'); + virtualModel.selected_module = self; + // Notify other scripts + virtualModel.notify(); + }; + self.deselect = function() { + self.object.removeClass('selected_module'); + virtualModel.selected_module = undefined; + // Notify other scripts + virtualModel.notify(); + }; + + // Apply parameters + if (self.specs != '') { + self.type = self.specs.type; + self.name = self.type; + self.actual_width = self.specs.size.width; + self.actual_height = self.specs.size.height; + self.resize(); + + // initialize dofs if the module has any + if (self.specs.dofs != undefined) { + for (var i = 0; i < self.specs.dofs.length; i++) { + var newdof = new Dof(self.specs.dofs[i].name); + if (self.specs.dofs[i].servo != undefined) { + newdof.setServo(-1, 1500, self.specs.dofs[i].servo.min, self.specs.dofs[i].servo.max) + } + self.dofs.push(newdof); + } + } + } + self.set_config = function(conf) { + if (conf != undefined && conf != '') { + self._config = conf; + self.name = self._config.name; + self.grid_x = self._config.grid.x; + self.grid_y = self._config.grid.y; + self.resize(); + self.set_rotation(self._config.grid.rotation || 0); + + if (self._config.dofs != undefined) { + for (var i = 0; i < self._config.dofs.length; i++) { + var dof = self._config.dofs[i]; + if (dof.servo != undefined) { + self.dofs[i].servo.pin = dof.servo.pin; + self.dofs[i].servo.mid = dof.servo.mid; + self.dofs[i].servo.min = dof.servo.min; + self.dofs[i].servo.max = dof.servo.max; + } + if (dof.poly != undefined) { + self.dofs[i].set_poly(dof.poly); + } + } + } + } + }; + self.set_config(config); + + self.get_config = function() { + if (self._config == undefined || self._config == '') { + self._config = {}; + } + if (self._config != undefined && self._config != '') { + self._config.name = self.name; + self._config.type = self.type; + + if (self._config.grid == undefined) { + self._config.grid = {}; + } + self._config.grid.x = self.grid_x; + self._config.grid.y = self.grid_y; + self._config.grid.rotation = self.rotation; + + if (self._config.dofs == undefined) { + self._config.dofs = []; + } + for (var i = 0; i < self.dofs.length; i++) { + var dof = self.dofs[i]; + if (self._config.dofs[i] == undefined) { + self._config.dofs[i] = {}; + } + self._config.dofs[i].name = dof.name; + if (dof.servo != undefined) { + if (self._config.dofs[i].servo == undefined) { + self._config.dofs[i].servo = {} + } + self._config.dofs[i].servo.pin = dof.servo.pin; + self._config.dofs[i].servo.mid = dof.servo.mid; + self._config.dofs[i].servo.min = dof.servo.min; + self._config.dofs[i].servo.max = dof.servo.max; + } + if (dof.poly != undefined) { + self._config.dofs[i].poly = dof.poly; + } + } + } + return self._config; + }; + + if (self.code != '') { + self.visual = main_svg.svg(self.code); + + self.object = self.visual.select('.object').last(); + self.group = self.object.select('.group').last(); + + if (virtualModel.edit) { + if (virtualModel.move) { + // add drag events + self.object.style('cursor', 'move'); + self.object.draggable().on('dragmove', self._drag_move); + if (self.extra != undefined) { + self.extra.style('cursor', 'move'); + self.extra.draggable().on('dragmove', self._drag_move); + } + } else { + self.object.style('cursor', 'pointer'); + self.object.draggable().on('dragmove', function(e) { e.preventDefault(); }); + if (self.extra != undefined) { + self.extra.style('cursor', 'pointer'); + self.extra.draggable().on('dragmove', function(e) { e.preventDefault(); }); + } + } + self.object.on('mousedown', self._mouse_down); + if (self.extra != undefined) { + self.extra.on('mousedown', self._mouse_down); + } + } + self.update(); + } + +}; + +var VirtualModel = function() { + var self = this; + + // create svg drawing + main_svg = SVG('model_screen'); + + self.edit = false; + self.move = false; + if ($('#model_screen').hasClass('edit')) { + self.edit = true; + } + if ($('#model_screen').hasClass('config')) { + self.move = true; + } + + self.change_handler = undefined; + self.notify = function() { + if (self.change_handler == undefined) { + return; + } + self.change_handler(); + }; + + self.grid = new Grid(); + self.modules = []; + self.selected_module = undefined; + self.set_config = function(conf) { + var mod_count = self.modules.length; + for (var i = 0; i < mod_count; i++) { + self.modules[0].remove(); + } + if (conf == undefined || conf == '') { return; } + var mod_conf = conf['modules']; + if (mod_conf != undefined) { + for (var i = 0; i < mod_conf.length; i++) { + self.add_module(mod_conf[i].type, mod_conf[i]); + } + } + virtualModel.notify(); + } + self.get_config = function() { + var mod_count = self.modules.length; + var config_modules = []; + for (var i = 0; i < mod_count; i++) { + config_modules.push(self.modules[i].get_config()); + } + return { 'modules': config_modules }; + } + self.init = function() { + self.set_config(configs); + }; + self.add_module = function(mod_type, config) { + var mod = new modules_definition[mod_type](svg_codes[mod_type], specs[mod_type], config); + self.modules.push(mod); + }; + self.resize = function() { + // update grid x & y reference points + var rect = $('svg').first().position(); + self.canvasX = rect.left; + self.canvasY = rect.top; + + self.grid.resize($('#model_screen').width()); + + for (var i = 0; i < self.modules.length; i++) { + self.modules[i].resize(); + } + }; + self.resize(); + + self.update_dofs = function(dofs) { + if (dofs == undefined) { return; } + for (var i = 0; i < self.modules.length; i++) { + var mod = self.modules[i]; + for (var j = 0; j < mod.dofs.length; j++) { + var dof = mod.dofs[j]; + if (dof.servo.pin >= 0) { + dof.set_value(dofs[dof.servo.pin], mod.update_dofs); + } + } + } + }; + self.apply_poly = function(poly_index) { + if (poly_index == undefined || poly_index < 0) { return; } + for (var i = 0; i < self.modules.length; i++) { + self.modules[i].apply_poly(poly_index); + } + }; + + self.sound = undefined; + self.update_sound = function(type, msg) { + var icon = 'fa-music' + if (type == 'tts') { + icon = 'fa-commenting-o' + } + $('.robot_sound').html(' ' + msg); + + var sound_src = '/sound/?t=' + type + '&f=' + msg; + if (self.sound == undefined) { + self.sound = new Audio(sound_src); + } else { + self.sound.pause(); + self.sound.src = sound_src; + self.sound.load(); + } + self.sound.play(); + }; +}; + +var main_svg; +var virtualModel = new VirtualModel(); + +$(document).ready(function() { + virtualModel.init(); + + $(window).resize(virtualModel.resize); + +}); diff --git a/src/opsoro/server/static/js/robot/modules.js b/src/opsoro/server/static/js/robot/modules.js deleted file mode 100644 index e3b0a96..0000000 --- a/src/opsoro/server/static/js/robot/modules.js +++ /dev/null @@ -1,1116 +0,0 @@ -var virtualModel; -var modules_name; -var skins_name; -var action_data; -var config_data; -var dof_values; - -// $(document).ready(function() { -var module_function = { - 'eye': DrawEye, - 'eyebrow': DrawEyebrow, - 'mouth': DrawMouth -}; - -function constrain(val, min, max) { - return Math.min(max, Math.max(val, min)); -} - -var Mapping = function(neutral) { - var self = this; - self.neutral = ko.observable(neutral); - self.poly = ko.observableArray(); - - // Populate Poly - for (var i = 0; i < 20; i++) { - self.poly.push(0.0); - } - - self.setPolyPos = function(index, position) { - self.poly()[index] = position; - }; -}; -var MappingGraph = function() { - var self = this; - - if ($('#poly_screen').length == 0) { - return; - } - - self.svg = SVG('poly_screen').size('100%', '121'); - - self.width = $('#poly_screen svg').width(); - self.height = self.svg.height(); - self.points = ko.observableArray(); - - // var rect = self.svg.rect(self.width, self.height); - // rect.fill("#AAA"); - - self.centerY = self.height / 2; - self.nodeSize = self.width / 30; - - self.stepWidth = self.width / 21; - self.startX = self.nodeSize; - - self.updateGraph = function() { - if (virtualModel == undefined) { - return; - } - for (var i = 0; i < self.points().length; i++) { - self.points()[i].cy(self.centerY - virtualModel.selectedModule_SelectedDof().map().poly()[i] * (self.centerY - self.nodeSize)); - } - }; - - var startX, - text, - line; - startX = 5; - var texts = ['1', '0', '-1']; - var Ys = [ - self.nodeSize, self.centerY, self.height - self.nodeSize - ]; - line = self.svg.line(startX * 2, Ys[0], startX * 2, Ys[2]).stroke({ - width: 0.5 - }); - line = self.svg.line(self.width - 1, Ys[0], self.width - 1, Ys[2]).stroke({ - width: 0.5 - }); - - for (var i = Ys[0]; i < Ys[2]; i += self.height / 40) { - self.svg.line(startX * 2, i, self.width - 1, i).stroke({ - width: 0.2 - }); - } - - for (var i = 0; i < texts.length; i++) { - text = self.svg.plain(texts[i]); - text.center(startX, Ys[i]); - line = self.svg.line(startX * 2, Ys[i], self.width - 1, Ys[i]).stroke({ - width: 0.5 - }); - } - - var updateInfoTxt = function(circ) { - self.infoRect.show(); - self.infoTxt.show(); - var num = (self.centerY - circ.cy()) / (self.centerY - self.nodeSize); - num = Math.round(num * 20) / 20; // Round to 0.05 - self.infoTxt.plain(num); - if (circ.cx() > self.infoRect.width() * 2) { - self.info.move(circ.cx() - self.infoRect.width() - self.nodeSize * 3 / 2, circ.cy() + self.infoRect.height() / 2 - 1) - } else { - self.info.move(circ.cx() + self.nodeSize * 3 / 2, circ.cy() + self.infoRect.height() / 2 - 1) - } - return num; - }; - var hideInfoTxt = function() { - self.infoRect.hide(); - self.infoTxt.hide(); - }; - - for (var i = 0; i < 20; i++) { - line = self.svg.line(self.startX * 2 + self.stepWidth * i, Ys[0], self.startX * 2 + self.stepWidth * i, Ys[2]).stroke({ - width: 0.2 - }); - var circle = self.svg.circle(self.nodeSize); - circle.fill('#286') - circle.center(self.startX * 2 + self.stepWidth * i, self.centerY); - circle.draggable(function(x, y) { - return { - x: x == self.startX * 2 + self.stepWidth * i, - y: y > self.nodeSize / 2 - 1 && y < (self.height - self.nodeSize * 3 / 2) - } - }); - circle.attr({ - index: i - }); - circle.on('mouseover', function() { - updateInfoTxt(this); - }); - circle.on('mouseleave', function() { - hideInfoTxt(); - }); - circle.on('dragmove', function() { - var num = updateInfoTxt(this); - virtualModel.selectedModule_SelectedDof().map().poly()[this.attr('index')] = num; - virtualModel.updateDofVisualisation(this.attr('index'), false); - }); - circle.on('dragend', function(e) { - var num = updateInfoTxt(this); - this.cy(self.centerY - num * (self.centerY - self.nodeSize)); - virtualModel.selectedModule_SelectedDof().map().poly()[this.attr('index')] = num; - virtualModel.updateDofVisualisation(this.attr('index'), true); - }); - self.points.push(circle); - } - self.info = self.svg.nested(); - self.infoRect = self.info.rect(30, 12); - self.infoRect.move(-2, -10); - self.infoRect.fill('#fff'); - self.infoRect.stroke({ - color: '#222', - opacity: 0.8, - width: 1 - }); - self.infoTxt = self.info.plain(''); - self.infoTxt.move(0, 0); - self.infoTxt.fill('#000'); - hideInfoTxt(); - -}; -var Servo = function(pin, mid, min, max) { - var self = this; - self.pin = ko.observable(pin); - self.mid = ko.observable(mid); - self.min = ko.observable(min); - self.max = ko.observable(max); -}; -var Dof = function(name) { - var self = this; - self.name = ko.observable(name); - self.isServo = ko.observable(false); - self.servo = ko.observable(new Servo(0, 1500, 0, 0)); - self.isMap = ko.observable(false); - self.map = ko.observable(new Mapping(0)); - self.value = ko.observable(0.0); - - self.setServo = function(pin, mid, min, max) { - self.servo(new Servo(pin, mid, min, max)); - self.isServo(true); - }; - self.setMap = function(neutral) { - self.map(new Mapping(neutral)); - self.isMap(true); - }; -}; -var Module = function(type, name, x, y, width, height, rotation) { - var self = this; - self.module = ko.observable(type); - self.name = ko.observable(name); - self.x = ko.observable(x); - self.y = ko.observable(y); - self.width = ko.observable(width); - self.height = ko.observable(height); - self.rotation = ko.observable(Math.round(rotation / 90) * 90); // 90° angles only - self.dofs = ko.observableArray(); - self.image = undefined; - self.drawObject = undefined; - - self.snapToGrid = function() { - var newX, - newY; - newX = Math.round(self.image.cx() / (virtualModel.snap() * virtualModel.screenGridSize)) * (virtualModel.snap() * virtualModel.screenGridSize); - newY = Math.round(self.image.cy() / (virtualModel.snap() * virtualModel.screenGridSize)) * (virtualModel.snap() * virtualModel.screenGridSize); - self.image.center(newX, newY); - }; - - self.draw = function() { - self.update(self.x(), self.y(), self.width(), self.height(), self.rotation()); - self.drawObject = new module_function[self.module()](virtualModel.svg, self.x(), self.y(), self.width(), self.height()); - self.image = self.drawObject.image; - - self.updateImage(); - }; - - self.updateDofVisualisation = function(mapIndex, updateRobot) { - if (self.drawObject == undefined) { - return; - } - if (updateRobot == undefined) { - updateRobot = false; - } - var values = []; - - $.each(self.dofs(), function(idx, dof) { - dof.value(0); - if (dof_values != undefined) { - if (dof.isServo()) { - dof.value(dof_values[dof.servo().pin()]); - } - } else { - if (dof.isMap() && dof.isServo()) { - if (mapIndex < 0) { - dof.value(dof.map().neutral()); - } else { - dof.value(dof.map().poly()[mapIndex]); - } - } - } - if (updateRobot) { - virtualModel.updateDof(dof); - } - values.push(parseFloat(dof.value())); - }); - if (values.length == self.drawObject.dofs.length) { - self.drawObject.x = self.x(); - self.drawObject.y = self.y(); - self.drawObject.width = self.width(); - self.drawObject.height = self.height(); - self.drawObject.Set(values) - self.drawObject.Update(); - } - if (mapIndex < 0) { - self.snapToGrid(); - } - }; - - self.update = function(x, y, w, h, r) { - r = Math.round(r / 90) * 90; - self.rotation(r); - self.x(Math.ceil(virtualModel.centerX + x * virtualModel.refSize)); - self.y(Math.ceil(virtualModel.centerY + y * virtualModel.refSize)); - self.width(Math.ceil(w * virtualModel.refSize)); - self.height(Math.ceil(h * virtualModel.refSize)); - }; - self.updateImage = function() { - if (!virtualModel.editable) { - return; - } - if (self.image == undefined) { - return; - } - self.image.attr({ - preserveAspectRatio: "none" - }); - - self.image.style('cursor', 'grab'); - self.image.draggable(); - self.snapToGrid(); - self.image.on('mousedown', function() { - virtualModel.resetSelect(); - // this.selectize(); - this.opacity(1); - virtualModel.setSelectedModule(self); - }); - self.image.on('dragend', function(e) { - self.snapToGrid(); - self.x(this.cx()); - self.y(this.cy()); - self.drawObject.x = self.x(); - self.drawObject.y = self.y(); - self.drawObject.width = self.width(); - self.drawObject.height = self.height(); - }); - }; -}; - -function DrawModule(svg, x, y, width, height) { - var self = this; - self.svg = svg || undefined; - self.x = x || 0; - self.y = y || 0 - self.width = width || 0; - self.height = height || 0; - self.dofs = []; -} - -// ---------------------------------------------------------------------------------------------------- -// Mouth -// ---------------------------------------------------------------------------------------------------- -function DrawMouth(svg, x, y, width, height) { - var self = this; - self.base = DrawModule; - self.base(svg, x, y, width, height); - - self.dofs = ['left_vertical', 'middle_vertical', 'right_vertical', 'left_rotation', 'right_rotation']; - - self.increase = self.height / 2; - - self.Set = function(values) { - self.right_Y = constrain(values[0] || 0, -1, 1); // -1.0 -> 1.0 - self.middle_Y = constrain(values[1] || 0, -1, 1); // -1.0 -> 1.0 - self.left_Y = constrain(values[2] || 0, -1, 1); // -1.0 -> 1.0 - self.right_R = constrain(values[3] || 0, -1, 1); // -1.0 -> 1.0 - self.left_R = constrain(values[4] || 0, -1, 1); // -1.0 -> 1.0 - } - self.Set([-0.5, 0.5, -0.5, 0, 0]); - - if (self.svg == undefined) { - return; - } - - self.curve = new SVG.PathArray([ - ['M', 0, 0] - ]); - self.image = self.svg.nested(); - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - self.image_mouth = self.image.path(self.curve); - - self.Update = function() { - var leftX, - rightX, - topY, - middleY1, - middleY2, - centerY; - - leftX = 0; - rightX = self.width; - middleY1 = self.left_R * 90; - middleY2 = self.right_R * 90; - - centerY = self.height / 2; - - self.increase = self.height / 2; - - self.curve = new SVG.PathArray([ - [ - 'M', leftX, centerY + (self.left_Y * self.increase) - ], - [ - 'C', leftX + self.width / 4, - centerY + middleY1, - rightX - self.width / 4, - centerY + middleY2, - rightX, - centerY + (self.right_Y * self.increase) - ], - [ - 'C', rightX - self.width / 4, - centerY + (self.middle_Y * self.increase / 2) + middleY2 + self.increase / 2, - leftX + self.width / 4, - centerY + (self.middle_Y * self.increase / 2) + middleY1 + self.increase / 2, - leftX, - centerY + (self.left_Y * self.increase) - ], - ['z'] - ]); - - self.image_mouth.plot(self.curve); - // // Round bezier corners - var endsize = 1; - var marker = self.svg.marker(endsize, endsize, function(add) { - add.circle(endsize).fill('#C00'); - }) - self.image_mouth.marker('start', marker); - self.image_mouth.marker('mid', marker); - self.image_mouth.fill('#222').stroke({ - width: Math.min(self.width, self.height) / 8, - color: '#C00' - }); - - - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - }; - self.Update(); -} -DrawMouth.prototype = new DrawModule; - -// ---------------------------------------------------------------------------------------------------- -// Eyebrow -// ---------------------------------------------------------------------------------------------------- -function DrawEyebrow(svg, x, y, width, height) { - var self = this; - self.base = DrawModule; - self.base(svg, x, y, width, height); - - self.dofs = ['Left Vertical', 'Right Vertical', 'Rotation']; - self.increase = self.height / 2; - - self.Set = function(values) { - self.right_Y = constrain(values[0] || 0, -1, 1); // -1.0 -> 1.0 - self.left_Y = constrain(values[1] || 0, -1, 1); // -1.0 -> 1.0 - self.rotation = constrain(values[2] || 0, -1, 1); // -1.0 -> 1.0 - } - self.Set([0, 0, 0]); - - if (self.svg == undefined) { - return; - } - - self.curve = new SVG.PathArray([ - ['M', 0, 0] - ]); - self.image = self.svg.nested(); - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - self.image_eyebrow = self.image.path(self.curve); - - self.Update = function() { - var leftX, - rightX, - centerY; - leftX = 0; - rightX = self.width; - self.increase = self.height / 2; - centerY = self.height / 2; - self.curve = new SVG.PathArray([ - [ - 'M', leftX, centerY + (self.left_Y * self.increase) - ], - [ - 'C', leftX + self.width / 4, - centerY + (self.left_Y * self.increase) - self.increase / 2, - rightX - self.width / 4, - centerY + (self.right_Y * self.increase) - self.increase / 2, - rightX, - centerY + (self.right_Y * self.increase) - ] - ]); - - self.image_eyebrow.plot(self.curve); - // Round bezier corners - var endsize = 1; - var marker = self.svg.marker(endsize, endsize, function(add) { - add.circle(endsize).fill('#222'); - }) - self.image_eyebrow.marker('start', marker); - self.image_eyebrow.marker('end', marker); - self.image_eyebrow.fill('none').stroke({ - width: Math.min(self.width, self.height) / 6, - color: '#222' - }); - - self.image_eyebrow.rotate(self.rotation * 45); - - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - }; - self.Update(); -} -DrawEyebrow.prototype = new DrawModule; - -// ---------------------------------------------------------------------------------------------------- -// Eye -// ---------------------------------------------------------------------------------------------------- -function DrawEye(svg, x, y, width, height) { - var self = this; - self.base = DrawModule; - self.base(svg, x, y, width, height); - - self.dofs = ['Pupil Horizontal', 'Pupil Vertical', 'Eyelid Closure']; - - self.Set = function(values) { - self.pupil_X = constrain(values[0] || 0, -1, 1); // -1.0 -> 1.0 - self.pupil_Y = constrain(values[1] || 0, -1, 1); // -1.0 -> 1.0 - self.lid = constrain(-values[2] || 0, -1, 1); // -1.0 -> 1.0 - } - self.Set([0, 0, 0.5]); - - if (self.svg == undefined) { - return; - } - - self.curve = new SVG.PathArray([ - ['M', 0, 0] - ]); - self.image = self.svg.nested(); - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - - self.image_eye = self.image.ellipse(self.width, self.height); - self.image_eye.fill('#DDD'); - - self.image_pupil = self.image.ellipse(self.width / 5, self.height / 5); //((parseInt(self.width) + parseInt(self.height)) / 5); - self.image_pupil.center(self.width / 2, self.height / 2); - self.image_pupil.fill('#000'); - - self.image_lid = self.image.path(self.curve); - - self.Update = function() { - var leftX, - rightX, - topY, - pupil_factor; - leftX = 0; - rightX = self.width; - topY = 0; - pupil_factor = 2.5; - - self.image_eye.size(self.width, self.height); - self.image_eye.center(self.width / 2, self.height / 2); - self.image_pupil.size(self.width / pupil_factor, self.height / pupil_factor); - self.image_pupil.center(self.width / 2 - self.pupil_X * (self.width / 2 - self.image_pupil.width() / 1.4), self.height / 2 - self.pupil_Y * (self.height / 2 - self.image_pupil.height() / 1.4)); - - self.curve = new SVG.PathArray([ - [ - 'M', leftX, self.height / 2 - ], - [ - 'C', leftX, -self.height / 4, - rightX, -self.height / 4, - rightX, - self.height / 2 - ], - [ - 'C', rightX, self.height / 2 + self.lid * self.height * 5 / 8, - leftX, - self.height / 2 + self.lid * self.height * 5 / 8, - leftX, - self.height / 2 - ], - ['z'] - ]); - - self.image_lid.plot(self.curve); - - // Round bezier corners - // var endsize = 1; - // var marker = self.svg.marker(endsize, endsize, function(add) { - // add.circle(endsize).fill('#999'); - // }) - // self.image_lid.marker('start', marker); - // self.image_lid.marker('mid', marker); - self.image_lid.fill('#444'); //.stroke({ width: 1, color: '#999' }); - - - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - // self.image.size(self.width, self.height); - // self.image.move(self.x, self.y); - }; - self.Update(); -} -DrawEyebrow.prototype = new DrawModule; - -var VirtualModel = function() { - var self = this; - - // File operations toolbar item - self.fileIsLocked = ko.observable(false); - self.fileIsModified = ko.observable(false); - self.fileName = ko.observable("Untitled"); - self.fileStatus = ko.observable(""); - self.fileExtension = ko.observable(".conf"); - - self.config = (config_data == undefined ? undefined : config_data); //JSON.parse(config_data)); - self.allModules = ['eye', 'eyebrow', 'mouth']; //modules_name; - self.allSkins = ['ono', 'nmct', 'robo']; //skins_name; - self.skin = ko.observable((self.allSkins == undefined ? - 'ono' : - self.allSkins[0])); - self.name = ko.observable("OPSORO robot"); - - self.isSelectedModule = ko.observable(false); - self.selectedModule = ko.observable(); - self.selectedModule_SelectedDof = ko.observable(); - - self.modules = ko.observableArray(); - - // create svg drawing - self.svg = SVG('model_screen').size('100%', '600'); - - self.modelwidth = $('#model_screen svg').width(); - self.modelheight = self.svg.height(); - self.refSize = Math.max(self.modelwidth, self.modelheight) / 2; - - self.gridSize = ko.observable(18); - self.screenGridSize = Math.min(self.modelwidth, self.modelheight) / self.gridSize(); - self.snap = ko.observable(1); - - self.centerX = self.modelwidth / 2; - self.centerY = self.modelheight / 2; - - self.skin_image = undefined; - self.newConfig = true; - - self.editable = ($('#poly_screen').length != 0); - - self.mappingGraph = new MappingGraph(); - - self.updateServoPin = function() { - - } - self.updateServoMid = function() { - if (!self.selectedModule_SelectedDof().isServo()) { - return; - } - console.log(parseInt(self.selectedModule_SelectedDof().servo().mid())); - robotSendServo(self.selectedModule_SelectedDof().servo().pin(), parseInt(self.selectedModule_SelectedDof().servo().mid())); - } - self.updateServoMin = function() { - if (!self.selectedModule_SelectedDof().isServo()) { - return; - } - console.log(parseInt(self.selectedModule_SelectedDof().servo().mid()) + parseInt(self.selectedModule_SelectedDof().servo().min())); - robotSendServo(self.selectedModule_SelectedDof().servo().pin(), parseInt(self.selectedModule_SelectedDof().servo().mid()) + parseInt(self.selectedModule_SelectedDof().servo().min())); - } - self.updateServoMax = function() { - if (!self.selectedModule_SelectedDof().isServo()) { - return; - } - console.log(parseInt(self.selectedModule_SelectedDof().servo().mid()) + parseInt(self.selectedModule_SelectedDof().servo().max())); - robotSendServo(self.selectedModule_SelectedDof().servo().pin(), parseInt(self.selectedModule_SelectedDof().servo().mid()) + parseInt(self.selectedModule_SelectedDof().servo().max())); - } - - // self.updateDof = function(mod_name, dof_name, value) { - // if (!self.selectedModule_SelectedDof().isServo()) { - // return; - // } - // - // robotSendDOF(mod_name, dof_name, value); - // // $.ajax({ - // // dataType: "text", - // // type: "POST", - // // url: "setDof", - // // cache: false, - // // data: { - // // module_name: mod_name, - // // dof_name: dof_name, - // // value: value - // // }, - // // success: function(data) {} - // // }); - // } - self.updateDofs = function() { - if (!self.selectedModule_SelectedDof().isServo()) { - return; - } - - var dof_values = {}; - - for (var i = 0; i < self.modules().length; i++) { - var singleModule = self.modules()[i]; - dof_values[singleModule.name()] = {}; - for (var j = 0; j < singleModule.dofs().length; j++) { - var singleDof = singleModule.dofs()[j]; - dof_values[singleModule.name()][singleDof.name()] = singleDof.value(); - - var value = parseInt(singleDof.servo().mid()); - if (singleDof.value() >= 0) { - value += parseInt(singleDof.value() * singleDof.servo().max()); - } else { - value += parseInt(-singleDof.value() * singleDof.servo().min()); - } - - robotSendServo(singleDof.servo().pin(), value); - } - console.log(dof_values[singleModule.name()]); - // mod_values[singleModule.name()].push(dof_values); - - } - // console.log(dof_values[]); - // robotSendReceiveAllDOF(dof_values); - } - - self.updateDof = function(singleDof) { - if (singleDof == undefined) { - return; - } - if (!singleDof.isServo()) { - return; - } - - if (singleDof.value() > 1.0) { - singleDof.value(1.0); - } - if (singleDof.value() < -1.0) { - singleDof.value(-1.0); - } - - - var value = parseInt(singleDof.servo().mid()); - if (singleDof.value() >= 0) { - value += parseInt(singleDof.value() * singleDof.servo().max()); - } else { - value += parseInt(-singleDof.value() * singleDof.servo().min()); - } - - robotSendServo(singleDof.servo().pin(), value); - } - - self.clearDraw = function() { - console.log('Clear'); - self.svg.clear(); - self.modelwidth = $('#model_screen svg').width(); - self.modelheight = self.svg.height(); - self.refSize = Math.max(self.modelwidth, self.modelheight) / 2; - self.screenGridSize = Math.min(self.modelwidth, self.modelheight) / self.gridSize(); - self.centerX = self.modelwidth / 2; - self.centerY = self.modelheight / 2; - - - self.resetSelect(); - if (self.config != undefined) { - if (self.config.grid != undefined) { - self.gridSize(self.config.grid); - } - } - self.screenGridSize = Math.min(self.modelwidth, self.modelheight) / self.gridSize(); - if (!self.editable) { - return; - } - var pattern = self.svg.pattern(self.screenGridSize, self.screenGridSize, function(add) { - // add.rect(self.screenGridSize, self.screenGridSize).fill('#eee'); - // add.rect(10,10); - var size = self.screenGridSize * 3 / 16; - add.rect(size, size).fill('#444'); - add.rect(size, size).move(self.screenGridSize - size, 0).fill('#444'); - add.rect(size, size).move(0, self.screenGridSize - size).fill('#444'); - add.rect(size, size).move(self.screenGridSize - size, self.screenGridSize - size).fill('#444'); - }) - self.grid = self.svg.rect(self.modelwidth, self.modelheight).attr({ - fill: pattern - }); - }; - self.setSelectedModule = function(module) { - self.selectedModule(module); - self.selectedModule_SelectedDof(self.selectedModule().dofs()[0]); - if (!self.editable) { - return; - } - self.fileIsModified(true); - self.isSelectedModule(true); - self.mappingGraph.updateGraph(); - self.updateServoMid(); - }; - self.selectedModule_RotateLeft = function() { - self.selectedModule().rotation((self.selectedModule().rotation() - 90) % 360); - self.selectedModule().image.rotate(self.selectedModule().rotation()); - }; - self.selectedModule_RotateRight = function() { - self.selectedModule().rotation((self.selectedModule().rotation() + 90) % 360); - self.selectedModule().image.rotate(self.selectedModule().rotation()); - }; - self.selectedModule_AddDof = function() { - var newDof = new Dof("New dof"); - self.selectedModule().dofs.push(newDof); - self.selectedModule_SelectedDof(newDof); - }; - self.selectedModule_Remove = function() { - self.resetSelect(); - self.selectedModule().image.remove(); - self.modules.remove(self.selectedModule()); - }; - self.selectedModule_RemoveDof = function() { - self.selectedModule().dofs.remove(self.selectedModule_SelectedDof()); - if (self.selectedModule().dofs().length == 0) { - self.selectedModule_AddDof(); - } - self.selectedModule_SelectedDof(self.selectedModule().dofs()[0]); - }; - - self.saveConfig = function() { - console.log('Save'); - if (!self.editable) { - return; - } - var svg_data = {}; - svg_data['name'] = self.name(); - svg_data['skin'] = self.skin(); - svg_data['grid'] = self.gridSize(); - - svg_data['modules'] = []; - - for (var i = 0; i < self.modules().length; i++) { - var singleModule = self.modules()[i]; - var module_data = {}; - module_data['module'] = singleModule.module(); - module_data['name'] = singleModule.name(); - var matrix = new SVG.Matrix(singleModule.image); - module_data['canvas'] = { - x: (singleModule.image.cx() - self.centerX) / self.refSize, - y: (singleModule.image.cy() - self.centerY) / self.refSize, - width: singleModule.width() / self.refSize, - height: singleModule.height() / self.refSize, - rotation: matrix.extract().rotation - }; - if (singleModule.dofs() != undefined) { - module_data['dofs'] = []; - for (var j = 0; j < singleModule.dofs().length; j++) { - var singleDof = singleModule.dofs()[j]; - var dof_data = {}; - - dof_data['name'] = singleDof.name(); - if (singleDof.isServo()) { - dof_data['servo'] = singleDof.servo(); - } - if (singleDof.isMap()) { - dof_data['mapping'] = singleDof.map(); - } - module_data['dofs'].push(dof_data); - } - } - svg_data['modules'].push(module_data); - } - return svg_data; - }; - - self.init = function() { - // self.config = undefined; - // self.newConfig = true; - self.redraw(); - }; - - self.loadFileData = function(data) { - if (data == undefined) { - return; - } - // Load data - var dataobj = JSON.parse(data); - console.log(dataobj); - // Do something with the data - self.newConfig = true; - self.config = dataobj; - self.redraw(); - self.fileIsModified(false); - }; - - self.saveFileData = function() { - if (!self.editable) { - return; - } - return ko.toJSON(self.saveConfig(), null, 2); - }; - - self.setDefault = function() { - if (!self.editable) { - return; - } - // Convert data - // file_data = self.saveConfig(); - // var data = ko.toJSON(file_data, null, 2); - - // Send data - robotSendReceiveConfig(self.saveConfig()); - }; - - // self.setDefault = function() { - // $.ajax({ - // dataType: "json", - // data: { - // filename: self.fileName() + self.fileExtension() - // }, - // type: "POST", - // url: "setDefault", - // success: function(data) { - // if (data.status == "error") { - // // addError(data.message); - // alert('Error setting default configuration.'); - // } - // } - // }); - // }; - - //------------------------------------------------------------------------------- - // SVG stuff - //------------------------------------------------------------------------------- - - // var axisY = self.svg.line(0, centerY, self.modelwidth/2, centerY).stroke({ width: 1 }); - // var axisX = self.svg.line(centerX, 0, centerX, self.modelheight).stroke({ width: 1 }); - // var Seperator = self.svg.line(self.modelwidth/2, 0, self.modelwidth/2, self.modelheight).stroke({ width: 3 }); - - // Draw skin & modules - self.redraw = function() { - console.log('Redraw'); - if (!self.newConfig && self.fileIsModified()) { - // Convert and convert back, bad reading otherwise - self.config = JSON.parse(ko.toJSON(self.saveConfig())); - //alert('not good'); - } else { - self.newConfig = true; - } - self.clearDraw(); - if (self.config != undefined) { - self.skin_image = self.svg.image('/static/images/skins/' + self.config.skin + '.svg').loaded(self.drawModules); - } else { - self.skin_image = self.svg.image('/static/images/skins/' + self.skin() + '.svg').loaded(self.drawModules); - } - - self.fileIsModified(false); - }; - - var previousMapIndex = -1; - self.updateDofVisualisation = function(mapIndex, updateRobot) { - // console.log('update dof vis'); - // console.log(self.modules()); - // alert(''); - if (mapIndex < -1 || previousMapIndex != mapIndex) { - // Update all modules (when selecting new emotion for mapping) - $.each(self.modules(), function(idx, mod) { - mod.updateDofVisualisation(mapIndex, updateRobot); - }); - } else { - // Update single module (when changing mapping) - self.selectedModule().updateDofVisualisation(mapIndex, updateRobot); - } - previousMapIndex = mapIndex; - // self.updateDofs(); - }; - - self.drawModules = function() { - // $("image, svg").mousedown(function() { - // virtualModel.resetSelect(); - // // virtualModel.updateDofVisualisation(-1); - // return false; - // }); - - var dx = self.modelwidth / self.skin_image.width(); - var dy = self.modelheight / self.skin_image.height(); - - var modelWidth, - modelHeight; - - if (dx < dy) { - modelWidth = self.modelwidth; - modelHeight = self.skin_image.height() * dx; - } else { - modelWidth = self.skin_image.width() * dy; - modelHeight = self.modelheight; - } - - self.skin_image.size(modelWidth, modelHeight); - self.centerX = modelWidth / 2; - self.centerY = modelHeight / 2 - - // Divide in 2 - self.refSize = Math.max(modelWidth, modelHeight) / 2; - - if (self.config == undefined) { - return; - } - self.skin(self.config.skin); - self.name(self.config.name); - self.createModules(); - // Draw modules on top of the skin - $.each(self.modules(), function(idx, mod) { - mod.draw(); - }); - self.resetSelect(); - } - - self.resetSelect = function() { - if (!self.editable) { - return; - } - for (var i = 0; i < self.modules().length; i++) { - // self.modules()[i].image.selectize(false); - self.modules()[i].image.opacity(0.8); - // self.modules()[i].image.stroke('#000') - } - // if (self.isSelectedModule()) { - // self.updateDofVisualisation(-2, true); - // } - self.isSelectedModule(false); - }; - - // Create modules - self.createModules = function() { - self.modules.removeAll(); - if (self.config != undefined) { - $.each(self.config.modules, function(idx, mod) { - var newModule = new Module(mod.module, mod.name, mod.canvas.x, mod.canvas.y, mod.canvas.width, mod.canvas.height, mod.canvas.rotation); - if (mod.dofs.length == 0) { - newModule.dofs.push(new Dof('')); - } - $.each(mod.dofs, function(idx, dof) { - var newDof = new Dof(dof.name); - if (dof.servo != undefined) { - newDof.setServo(dof.servo.pin, dof.servo.mid, dof.servo.min, dof.servo.max); - } - if (dof.mapping != undefined) { - newDof.setMap(dof.mapping.neutral); - if (dof.mapping.poly != undefined) { - newDof.map().poly(dof.mapping.poly); - } - } - newModule.dofs.push(newDof); - }); - self.modules.push(newModule); - if (self.selectedModule() == undefined) { - self.setSelectedModule(newModule); - self.isSelectedModule(false); - } - }); - } else { - var newModule = new Module('', '', 0, 0, 0, 0, 0); - var newDof = new Dof(''); - newModule.dofs.push(newDof); - self.setSelectedModule(newModule); - self.isSelectedModule(false); - } - }; - - var newModule = new Module('', '', 0, 0, 0, 0, 0); - var newDof = new Dof(''); - newModule.dofs.push(newDof); - self.setSelectedModule(newModule); - self.isSelectedModule(false); - - if (self.editable) { - var index = 0; - self.svg_modules = SVG('modules_screen').size('100%', '60'); - // Draw available modules - if (self.allModules != undefined) { - $.each(self.allModules, function(idx, mod) { - // alert(mod); - // var moduleImage = self.svg.image('static/images/' + mod + '.svg').loaded(function() { - - var moduleImage = self.svg_modules.image('/static/images/modules/' + mod + '.svg').loaded(function() { - this.attr({ - preserveAspectRatio: "none", - type: mod - }); - var h = 50; - var w = 50; - var increase = 5; - this.size(w, h); - - this.move(index * (w + 2 * increase), increase); - index += 1; - - this.style('cursor', 'pointer'); - // this.selectize(); - // this.resize({snapToAngle:5}); - // allModules.push(this); - this.on('mouseover', function(e) { - this.size(w + increase, h + increase); - }); - this.on('mouseleave', function(e) { - this.size(w, h); - }); - this.on('click', function(e) { - var newModule = new Module(mod, mod, 0, 0, 0.2, 0.2, 0); - var tempModule = new module_function[mod](undefined, 0, 0, 0, 0); - for (var i = 0; i < tempModule.dofs.length; i++) { - var newDof = new Dof(tempModule.dofs[i]); - newModule.dofs.push(newDof); - } - self.setSelectedModule(newModule); - self.isSelectedModule(true); - newModule.draw(); - self.modules.push(newModule); - }); - }); - }); - } - } - // - if (action_data != undefined && action_data.openfile) { - self.loadFileData(action_data.openfile || ""); - } else { - self.init(); - } -}; - -// $(document).ready(function() { -// // This makes Knockout get to work -// // virtualModel = new VirtualModel(); -// -// }); diff --git a/src/opsoro/server/static/js/robot/virtual.js b/src/opsoro/server/static/js/robot/virtual.js deleted file mode 100644 index f78bf47..0000000 --- a/src/opsoro/server/static/js/robot/virtual.js +++ /dev/null @@ -1,116 +0,0 @@ -// Create modules -// self.createModules = function() { -// self.modules.removeAll(); -// if (self.config != undefined) { -// $.each(self.config.modules, function(idx, mod) { -// var newModule = new Module(mod.module, mod.name, mod.canvas.x, mod.canvas.y, mod.canvas.width, mod.canvas.height, mod.canvas.rotation); -// -// $.each(mod.dofs, function(idx, dof) { -// var newDof = new Dof(dof.name); -// if (dof.servo != undefined) { -// newDof.setServo(dof.servo.pin, dof.servo.mid, dof.servo.min, dof.servo.max); -// } -// if (dof.mapping != undefined) { -// newDof.setMap(dof.mapping.neutral); -// newDof.map().poly(dof.mapping.poly); -// } -// newModule.dofs.push(newDof); -// }); -// self.modules.push(newModule); -// if (self.selectedModule() == undefined) { -// self.setSelectedModule(newModule); -// self.isSelectedModule(false); -// } -// }); -// } else { -// var newModule = new Module('', '', 0, 0, 0, 0, 0); -// var newDof = new Dof(''); -// newModule.dofs.push(newDof); -// self.setSelectedModule(newModule); -// self.isSelectedModule(false); -// } -// }; - -function updateVirtualModel() { - virtualModel.updateDofVisualisation(-2); -} - -function resizeCanvas() { - // Resize model to fit screen - // var w = $("#virtualModelDiv").width(); - // var h = $("#virtualModelDiv").height(); - // size = w; - // if (h < size) { size = h; } - // $("#model_screen svg").attr("width", size); - // $("#model_screen svg").attr("height", size); - updateVirtualModel(); -} - -updateData = function() { - $.ajax({ - dataType: "text", - type: "POST", - url: "/robot/dofs/", - data: { - getdata: 1 - }, - success: function(data) { - //alert(data); - // console.log(data); - dof_values = JSON.parse(data)["dofs"]; - // console.log(dof_values); - - // checkData(); - updateVirtualModel(); - // $("#virtualModelCanvas").drawLayers(); - } - }); - setTimeout(updateData, 50); -} - -// // Setup websocket connection. -// var conn = null; -// var connReady = false; -// conn = new SockJS("http://" + window.location.host + "/sockjs"); -// -// self.conn.onopen = function(){ -// $.ajax({ -// url: "/sockjstoken", -// cache: false -// }) -// .done(function(data) { -// conn.send(JSON.stringify({action: "authenticate", token: data})); -// connReady = true; -// }); -// }; -// -// self.conn.onmessage = function(e){ -// var msg = $.parseJSON(e.data); -// switch(msg.action){ -// case "soundStopped": -// -// break; -// } -// }; -// -// self.conn.onclose = function(){ -// conn = null; -// connReady = false; -// }; - -$(document).ready(function() { - - virtualModel = new VirtualModel(); - - $(window).resize(resizeCanvas); - - resizeCanvas(); - // w = $("#virtualModelCanvas").width(); - // $("#virtualModelCanvas").attr("width", w); - // $("#virtualModelCanvas").attr("height", w); - - // setupVirtualModel(); - - updateData(); - -}); diff --git a/src/opsoro/server/static/js/robot/virtual_ono.js b/src/opsoro/server/static/js/robot/virtual_ono.js deleted file mode 100644 index 406c7a3..0000000 --- a/src/opsoro/server/static/js/robot/virtual_ono.js +++ /dev/null @@ -1,379 +0,0 @@ -var knobx = 0.5; -var knoby = 0.5; -var r_factor = 0.4; -var w; - -var dof_names = [ - "r_eb_inner", - "r_eb_outer", - "r_e_ver", - "r_e_hor", - "r_e_lid", - "m_l", - "m_mid", - "m_r", - "l_e_lid", - "l_e_ver", - "l_e_hor", - "l_eb_inner", - "l_eb_outer", -]; - -var previous_dofs = {}; -// // dofs["r_eb_inner"] = 0.0; -// // dofs["r_eb_outer"] = 0.0; -// // dofs["r_e_ver"] = 0.0; -// // dofs["r_e_hor"] = 0.0; -// // dofs["r_e_lid"] = 0.0; -// // dofs["m_l"] = 0.0; -// // dofs["m_mid"] = 0.0; -// // dofs["m_r"] = 0.0; -// // dofs["l_e_lid"] = 0.0; -// // dofs["l_e_ver"] = 0.0; -// // dofs["l_e_hor"] = 0.0; -// // dofs["l_eb_inner"] = 0.0; -// // dofs["l_eb_outer"] = 0.0; -// -// dofs["r_eb_inner"] = 0.74; -// dofs["r_eb_outer"] = 0.42; -// dofs["r_e_ver"] = 0.61; -// dofs["r_e_hor"] = -0.27; -// dofs["r_e_lid"] = 1.0; -// dofs["m_l"] = -0.01; -// dofs["m_mid"] = -0.01; -// dofs["m_r"] = -1.0; -// dofs["l_e_lid"] = 0.63; -// dofs["l_e_ver"] = 0.61; -// dofs["l_e_hor"] = 0.26; -// dofs["l_eb_inner"] = -1.0; -// dofs["l_eb_outer"] = -0.03; - - -function resizeCanvas(){ - w = $("#virtualModelCanvas").width(); - - $("#virtualModelCanvas").attr("width", w); - $("#virtualModelCanvas").attr("height", w); - - updateVirtualModel(); -} - -$.jCanvas.extend({ - name: 'drawMouth', - type: 'mouth', - props: {}, - fn: function(ctx, params) { - // Just to keep our lines short - var p = params; - p.mouth_right = -p.mouth_right; - p.mouth_left = -p.mouth_left; - p.mouth_mid = -p.mouth_mid; - - // Enable layer transformations like scale and rotate - $.jCanvas.transformShape(this, ctx, p); - // Draw mouth - ctx.beginPath(); - ctx.moveTo(p.x-8*p.size, p.y+(3*p.size*p.mouth_left)); - ctx.bezierCurveTo( - p.x-8*p.size, p.y+(3*p.size*p.mouth_left)-1*p.size, - p.x-4*p.size, p.y, - p.x, p.y - ); - ctx.bezierCurveTo( - p.x+4*p.size, p.y, - p.x+8*p.size, p.y+(3*p.size*p.mouth_right)-1*p.size, - p.x+8*p.size, p.y+(3*p.size*p.mouth_right) - ); - ctx.bezierCurveTo( - p.x+8*p.size, p.y+(3*p.size*p.mouth_right)+1*p.size, - p.x+4*p.size, p.y+(3*p.size*(p.mouth_mid+1)), - p.x, p.y+(3*p.size*(p.mouth_mid+1)) - ); - ctx.bezierCurveTo( - p.x-4*p.size, p.y+(3*p.size*(p.mouth_mid+1)), - p.x-8*p.size, p.y+(3*p.size*p.mouth_left)+1*p.size, - p.x-8*p.size, p.y+(3*p.size*p.mouth_left) - ); - ctx.closePath(); - // Call the detectEvents() function to enable jCanvas events - // Be sure to pass it these arguments, too! - $.jCanvas.detectEvents(this, ctx, p); - // Call the closePath() functions to fill, stroke, and close the path - // This function also enables masking support and events - // It accepts the same arguments as detectEvents() - $.jCanvas.closePath(this, ctx, p); - } -}); - -$.jCanvas.extend({ - name: 'drawEyeLid', - type: 'eyeLid', - props: {}, - fn: function(ctx, params) { - // Just to keep our lines short - var p = params; - // Enable layer transformations like scale and rotate - $.jCanvas.transformShape(this, ctx, p); - // Draw mouth - ctx.beginPath(); - ctx.moveTo(p.x-4*p.size, p.y+p.size); - ctx.bezierCurveTo( - p.x-4*p.size, p.y, - p.x-2*p.size, p.y, - p.x, p.y - ); - ctx.bezierCurveTo( - p.x+2*p.size, p.y, - p.x+4*p.size, p.y, - p.x+4*p.size, p.y+p.size - ); - ctx.bezierCurveTo( - p.x+4*p.size, p.y+p.size, - p.x+4*p.size, p.y+2*p.size, - p.x+4*p.size, p.y+2*p.size - ); - ctx.bezierCurveTo( - p.x+4*p.size, p.y+5*p.size, - p.x+3*p.size, p.y+4*p.size-3.5*p.size*p.eyeLidOpen, - p.x, p.y+4*p.size-3.5*p.size*p.eyeLidOpen - ); - ctx.bezierCurveTo( - p.x-3*p.size, p.y+4*p.size-3.5*p.size*p.eyeLidOpen, - p.x-4*p.size, p.y+5*p.size, - p.x-4*p.size, p.y+2*p.size - ); - ctx.bezierCurveTo( - p.x-4*p.size, p.y+2*p.size, - p.x-4*p.size, p.y+p.size, - p.x-4*p.size, p.y+p.size - ); - ctx.closePath(); - // Call the detectEvents() function to enable jCanvas events - // Be sure to pass it these arguments, too! - $.jCanvas.detectEvents(this, ctx, p); - // Call the closePath() functions to fill, stroke, and close the path - // This function also enables masking support and events - // It accepts the same arguments as detectEvents() - $.jCanvas.closePath(this, ctx, p); - } -}); - -$.jCanvas.extend({ - name: 'drawEyeBrow', - type: 'eyeBrow', - props: {}, - fn: function(ctx, params) { - // Just to keep our lines short - var p = params; - - // Draw eyeBrow - // Side: 0 = right, 1 = left - p.y = p.y - 2*p.size*((p.inner + p.outer)/2); - p.rotate = 30*((p.inner-p.outer)/2); - if (p.side == 0){ - p.rotate = 180 + 30*((p.outer-p.inner)/2); - } - // Enable layer transformations like scale and rotate - $.jCanvas.transformShape(this, ctx, p); - - ctx.beginPath(); - ctx.moveTo(p.x-2*p.size, p.y-p.size); - ctx.bezierCurveTo( - p.x-p.size, p.y-p.size, - p.x+4*p.size, p.y-p.size, - p.x+4*p.size, p.y - ); - ctx.bezierCurveTo( - p.x+4*p.size, p.y+p.size, - p.x-p.size, p.y+p.size, - p.x-2*p.size, p.y+p.size - ); - ctx.bezierCurveTo( - p.x-3*p.size, p.y+p.size, - p.x-4*p.size, p.y+p.size, - p.x-4*p.size, p.y - ); - ctx.bezierCurveTo( - p.x-4*p.size, p.y-p.size, - p.x-3*p.size, p.y-p.size, - p.x-2*p.size, p.y-p.size - ); - ctx.closePath(); - - // Call the detectEvents() function to enable jCanvas events - // Be sure to pass it these arguments, too! - $.jCanvas.detectEvents(this, ctx, p); - // Call the closePath() functions to fill, stroke, and close the path - // This function also enables masking support and events - // It accepts the same arguments as detectEvents() - $.jCanvas.closePath(this, ctx, p); - } -}); - -function setupVirtualModel(){ - $("#virtualModelCanvas") - .drawImage({ - layer: true, - name: "bg", - source: "static/img/empty_face.svg", - x: 0, y: 0, - width: w, - height: w, - fromCenter: false, - }) - .drawMouth({ - layer: true, - name:"mouthlayer", - strokeStyle: '#c00', - strokeWidth: 4, - fillStyle: '#000000', - size: w/60, - x: w/2, y: w*0.375, - mouth_mid: dofs["m_mid"], - mouth_left: dofs["m_l"], - mouth_right: dofs["m_r"] - }) - .drawEllipse({ - layer:true, - name:"rightEyePupil", - fillStyle: '#000000', - x: w*0.405, y: w*0.25, - width: w/30, height: w/30 - }) - .drawEllipse({ - layer:true, - name:"leftEyePupil", - fillStyle: '#000000', - x: w*0.605, y: w*0.25, - width: w/30, height: w/30 - }) - .drawEyeLid({ - layer: true, - name:"rightEyeLidlayer", - fillStyle: '#FFD63D', - size: w/65, - x: w*0.405, y: w*0.2, - eyeLidOpen: dofs["r_e_lid"] - }) - .drawEyeLid({ - layer: true, - name:"leftEyeLidlayer", - fillStyle: '#FFD63D', - size: w/65, - x: w*0.605, y: w*0.2, - eyeLidOpen: dofs["l_e_lid"] - }) - .drawEyeBrow({ - layer: true, - name:"rightEyeBrowlayer", - fillStyle: '#000000', - size: w/65, - x: w*0.605, y: w*0.16, - side: 0, - outer: dofs["r_eb_outer"], - inner: dofs["r_eb_inner"] - }) - .drawEyeBrow({ - layer: true, - name:"leftEyeBrowlayer", - fillStyle: '#000000', - size: w/65, - x: w*0.605, y: w*0.16, - side: 1, - outer: dofs["l_eb_outer"], - inner: dofs["l_eb_inner"] - }) - updateVirtualModel(); -} - -function updateVirtualModel(){ - $("#virtualModelCanvas") - .setLayer("bg", { - width: w, - height: w - }) - .setLayer("mouthlayer", { - x: w/2, y: w*0.375, - size: w/60, - mouth_mid: dofs["m_mid"], - mouth_left: dofs["m_l"], - mouth_right: dofs["m_r"] - }) - .setLayer("rightEyePupil", { - x: w*0.405 + (w/35 * dofs["r_e_hor"]), y: w*0.25 - (w/35 * dofs["r_e_ver"]), - width: w/30, height: w/30 - }) - .setLayer("rightEyeLidlayer", { - size: w/65, - x: w*0.405, y: w*0.2, - eyeLidOpen: dofs["r_e_lid"] - }) - .setLayer("rightEyeBrowlayer", { - size: w/65, - x: w*0.405, y: w*0.16, - outer: dofs["r_eb_outer"], - inner: dofs["r_eb_inner"] - }) - .setLayer("leftEyePupil", { - x: w*0.605 - (w/35 * dofs["l_e_hor"]), y: w*0.25 - (w/35 * dofs["l_e_ver"]), - width: w/30, height: w/30 - }) - .setLayer("leftEyeLidlayer", { - size: w/65, - x: w*0.605, y: w*0.2, - eyeLidOpen: dofs["l_e_lid"] - }) - .setLayer("leftEyeBrowlayer", { - size: w/65, - x: w*0.605, y: w*0.16, - outer: dofs["l_eb_outer"], - inner: dofs["l_eb_inner"] - }) - .drawLayers(); -} - -function checkData(){ - for (var i = 0; i<13; i++) { - if (dofs[dof_names[i]] == undefined){ - if (previous_dofs[dof_names[i]] == undefined){ - dofs[dof_names[i]] = 0.0; - }else{ - dofs[dof_names[i]] = previous_dofs[dof_names[i]]; - } - } - } - previous_dofs = dofs; -} - -updateData = function(){ - $.ajax({ - dataType: "text", - type: "POST", - url: "/virtual", - data: { getdata: 1 }, - success: function(data){ - //alert(data); - - dofs = JSON.parse(data)["dofs"]; - - //alert(dofs["l_eb_inner"]); - checkData(); - updateVirtualModel(); - $("#virtualModelCanvas").drawLayers(); - } - }); - setTimeout(updateData, 50); -} - -$(document).ready(function(){ - $(window).resize(resizeCanvas); - - w = $("#virtualModelCanvas").width(); - $("#virtualModelCanvas").attr("width", w); - $("#virtualModelCanvas").attr("height", w); - - setupVirtualModel(); - - updateData(); - -}); diff --git a/src/opsoro/server/static/js/robot_new/modules.js b/src/opsoro/server/static/js/robot_new/modules.js deleted file mode 100644 index db939c1..0000000 --- a/src/opsoro/server/static/js/robot_new/modules.js +++ /dev/null @@ -1,1147 +0,0 @@ -var virtualModel; -var modules_name; -var skins_name; -var action_data; -var config_data; -var dof_values; - -// $(document).ready(function() { -var module_function = { - 'eye': DrawEye, - 'eyebrow': DrawEyebrow, - 'mouth': DrawMouth -}; - -function constrain(val, min, max) { - return Math.min(max, Math.max(val, min)); -} - -var Mapping = function(neutral) { - var self = this; - self.neutral = ko.observable(neutral); - self.poly = ko.observableArray(); - - // Populate Poly - for (var i = 0; i < 20; i++) { - self.poly.push(0.0); - } - - self.setPolyPos = function(index, position) { - self.poly()[index] = position; - }; -}; -var MappingGraph = function() { - var self = this; - - if ($('#poly_screen').length == 0) { - return; - } - - self.svg = SVG('poly_screen').size('100%', '121'); - - self.width = $('#poly_screen svg').width(); - self.height = self.svg.height(); - self.points = ko.observableArray(); - - // var rect = self.svg.rect(self.width, self.height); - // rect.fill("#AAA"); - - self.centerY = self.height / 2; - self.nodeSize = self.width / 30; - - self.stepWidth = self.width / 21; - self.startX = self.nodeSize; - - self.updateGraph = function() { - if (virtualModel == undefined) { - return; - } - for (var i = 0; i < self.points().length; i++) { - self.points()[i].cy(self.centerY - virtualModel.selectedModule_SelectedDof().map().poly()[i] * (self.centerY - self.nodeSize)); - } - }; - - var startX, - text, - line; - startX = 5; - var texts = ['1', '0', '-1']; - var Ys = [ - self.nodeSize, self.centerY, self.height - self.nodeSize - ]; - line = self.svg.line(startX * 2, Ys[0], startX * 2, Ys[2]).stroke({ - width: 0.5 - }); - line = self.svg.line(self.width - 1, Ys[0], self.width - 1, Ys[2]).stroke({ - width: 0.5 - }); - - for (var i = Ys[0]; i < Ys[2]; i += self.height / 40) { - self.svg.line(startX * 2, i, self.width - 1, i).stroke({ - width: 0.2 - }); - } - for (var i = 0; i < texts.length; i++) { - text = self.svg.plain(texts[i]); - text.center(startX, Ys[i]); - line = self.svg.line(startX * 2, Ys[i], self.width - 1, Ys[i]).stroke({ - width: 0.5 - }); - } - var updateInfoTxt = function(circ) { - self.infoRect.show(); - self.infoTxt.show(); - var num = (self.centerY - circ.cy()) / (self.centerY - self.nodeSize); - num = Math.round(num * 20) / 20; // Round to 0.05 - self.infoTxt.plain(num); - if (circ.cx() > self.infoRect.width() * 2) { - self.info.move(circ.cx() - self.infoRect.width() - self.nodeSize * 3 / 2, circ.cy() + self.infoRect.height() / 2 - 1) - } else { - self.info.move(circ.cx() + self.nodeSize * 3 / 2, circ.cy() + self.infoRect.height() / 2 - 1) - } - return num; - }; - var hideInfoTxt = function() { - self.infoRect.hide(); - self.infoTxt.hide(); - }; - for (var i = 0; i < 20; i++) { - line = self.svg.line(self.startX * 2 + self.stepWidth * i, Ys[0], self.startX * 2 + self.stepWidth * i, Ys[2]).stroke({ - width: 0.2 - }); - var circle = self.svg.circle(self.nodeSize); - circle.fill('#286') - circle.center(self.startX * 2 + self.stepWidth * i, self.centerY); - circle.draggable(function(x, y) { - return { - x: x == self.startX * 2 + self.stepWidth * i, - y: y > self.nodeSize / 2 - 1 && y < (self.height - self.nodeSize * 3 / 2) - } - }); - circle.attr({ - index: i - }); - circle.on('mouseover', function() { - updateInfoTxt(this); - }); - circle.on('mouseleave', function() { - hideInfoTxt(); - }); - circle.on('dragmove', function() { - var num = updateInfoTxt(this); - virtualModel.selectedModule_SelectedDof().map().poly()[this.attr('index')] = num; - virtualModel.updateDofVisualisation(this.attr('index'), false); - }); - circle.on('dragend', function(e) { - var num = updateInfoTxt(this); - this.cy(self.centerY - num * (self.centerY - self.nodeSize)); - virtualModel.selectedModule_SelectedDof().map().poly()[this.attr('index')] = num; - virtualModel.updateDofVisualisation(this.attr('index'), true); - }); - self.points.push(circle); - } - self.info = self.svg.nested(); - self.infoRect = self.info.rect(30, 12); - self.infoRect.move(-2, -10); - self.infoRect.fill('#fff'); - self.infoRect.stroke({ - color: '#222', - opacity: 0.8, - width: 1 - }); - self.infoTxt = self.info.plain(''); - self.infoTxt.move(0, 0); - self.infoTxt.fill('#000'); - hideInfoTxt(); - -}; -var Servo = function(pin, mid, min, max) { - var self = this; - self.pin = ko.observable(pin); - self.mid = ko.observable(mid); - self.min = ko.observable(min); - self.max = ko.observable(max); -}; -var Dof = function(name) { - var self = this; - self.name = ko.observable(name); - self.isServo = ko.observable(false); - self.servo = ko.observable(new Servo(0, 1500, 0, 0)); - self.isMap = ko.observable(false); - self.map = ko.observable(new Mapping(0)); - self.value = ko.observable(0.0); - - self.setServo = function(pin, mid, min, max) { - self.servo(new Servo(pin, mid, min, max)); - self.isServo(true); - }; - self.setMap = function(neutral) { - self.map(new Mapping(neutral)); - self.isMap(true); - }; -}; -var Module = function(type, name, x, y, width, height, rotation) { - var self = this; - self.module = ko.observable(type); - self.name = ko.observable(name); - self.x = ko.observable(x); - self.y = ko.observable(y); - self.width = ko.observable(width); - self.height = ko.observable(height); - self.rotation = ko.observable(Math.round(rotation / 90) * 90); // 90° angles only - self.dofs = ko.observableArray(); - self.image = undefined; - self.drawObject = undefined; - - self.snapToGrid = function() { - var newX, - newY; - newX = Math.round(self.image.cx() / (virtualModel.snap() * virtualModel.screenGridSize)) * (virtualModel.snap() * virtualModel.screenGridSize); - newY = Math.round(self.image.cy() / (virtualModel.snap() * virtualModel.screenGridSize)) * (virtualModel.snap() * virtualModel.screenGridSize); - self.image.center(newX, newY); - }; - - self.draw = function() { - self.update(self.x(), self.y(), self.width(), self.height(), self.rotation()); - self.drawObject = new module_function[self.module()](virtualModel.svg, self.x(), self.y(), self.width(), self.height()); - self.image = self.drawObject.image; - - self.updateImage(); - }; - - self.updateDofVisualisation = function(mapIndex, updateRobot) { - if (self.drawObject == undefined) { - return; - } - if (updateRobot == undefined) { - updateRobot = false; - } - var values = []; - - $.each(self.dofs(), function(idx, dof) { - dof.value(0); - if (dof_values != undefined) { - if (dof.isServo()) { - dof.value(dof_values[dof.servo().pin()]); - } - } else { - if (dof.isMap() && dof.isServo()) { - if (mapIndex < 0) { - dof.value(dof.map().neutral()); - } else { - dof.value(dof.map().poly()[mapIndex]); - } - } - } - if (updateRobot) { - virtualModel.updateDof(dof); - } - values.push(parseFloat(dof.value())); - }); - if (values.length == self.drawObject.dofs.length) { - self.drawObject.x = self.x(); - self.drawObject.y = self.y(); - self.drawObject.width = self.width(); - self.drawObject.height = self.height(); - self.drawObject.Set(values) - self.drawObject.Update(); - } - if (mapIndex < 0) { - self.snapToGrid(); - } - }; - - self.update = function(x, y, w, h, r) { - r = Math.round(r / 90) * 90; - self.rotation(r); - self.x(Math.ceil(virtualModel.centerX + x * virtualModel.refSize)); - self.y(Math.ceil(virtualModel.centerY + y * virtualModel.refSize)); - self.width(Math.ceil(w * virtualModel.refSize)); - self.height(Math.ceil(h * virtualModel.refSize)); - }; - self.updateImage = function() { - if (!virtualModel.editable) { - return; - } - if (self.image == undefined) { - return; - } - self.image.attr({ - preserveAspectRatio: "none" - }); - - self.image.style('cursor', 'grab'); - self.image.draggable(); - self.snapToGrid(); - self.image.on('mousedown', function() { - virtualModel.resetSelect(); - // this.selectize(); - this.opacity(1); - virtualModel.setSelectedModule(self); - }); - self.image.on('dragend', function(e) { - self.snapToGrid(); - self.x(this.cx()); - self.y(this.cy()); - self.drawObject.x = self.x(); - self.drawObject.y = self.y(); - self.drawObject.width = self.width(); - self.drawObject.height = self.height(); - }); - }; -}; - -function DrawModule(svg, x, y, width, height) { - var self = this; - self.svg = svg || undefined; - self.x = x || 0; - self.y = y || 0 - self.width = width || 0; - self.height = height || 0; - self.dofs = []; -} - -// ---------------------------------------------------------------------------------------------------- -// Mouth -// ---------------------------------------------------------------------------------------------------- -function DrawMouth(svg, x, y, width, height) { - var self = this; - self.base = DrawModule; - self.base(svg, x, y, width, height); - - self.dofs = ['left_vertical', 'middle_vertical', 'right_vertical', 'left_rotation', 'right_rotation']; - - self.increase = self.height / 2; - - self.Set = function(values) { - self.left_Y = constrain(values[0] || 0, -1, 1); // -1.0 -> 1.0 - self.middle_Y = constrain(values[1] || 0, -1, 1); // -1.0 -> 1.0 - self.right_Y = constrain(values[2] || 0, -1, 1); // -1.0 -> 1.0 - self.left_R = constrain(values[3] || 0, -1, 1); // -1.0 -> 1.0 - self.right_R = constrain(values[4] || 0, -1, 1); // -1.0 -> 1.0 - } - self.Set([-0.5, 0.5, -0.5, 0, 0]); - - if (self.svg == undefined) { - return; - } - - self.curve = new SVG.PathArray([ - ['M', 0, 0] - ]); - self.image = self.svg.nested(); - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - self.image_mouth = self.image.path(self.curve); - - self.Update = function() { - var leftX, - rightX, - topY, - middleY1, - middleY2, - centerY; - - leftX = 0; - rightX = self.width; - middleY1 = self.left_R * 90; - middleY2 = self.right_R * 90; - - centerY = self.height / 2; - - self.increase = self.height / 2; - - self.curve = new SVG.PathArray([ - [ - 'M', leftX, centerY + (self.left_Y * self.increase) - ], - [ - 'C', leftX + self.width / 4, - centerY + middleY1, - rightX - self.width / 4, - centerY + middleY2, - rightX, - centerY + (self.right_Y * self.increase) - ], - [ - 'C', rightX - self.width / 4, - centerY + (self.middle_Y * self.increase / 2) + middleY2 + self.increase / 2, - leftX + self.width / 4, - centerY + (self.middle_Y * self.increase / 2) + middleY1 + self.increase / 2, - leftX, - centerY + (self.left_Y * self.increase) - ], - ['z'] - ]); - - self.image_mouth.plot(self.curve); - // // Round bezier corners - var endsize = 1; - var marker = self.svg.marker(endsize, endsize, function(add) { - add.circle(endsize).fill('#C00'); - }) - self.image_mouth.marker('start', marker); - self.image_mouth.marker('mid', marker); - self.image_mouth.fill('#222').stroke({ - width: Math.min(self.width, self.height) / 8, - color: '#C00' - }); - - - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - }; - self.Update(); -} -DrawMouth.prototype = new DrawModule; - -// ---------------------------------------------------------------------------------------------------- -// Eyebrow -// ---------------------------------------------------------------------------------------------------- -function DrawEyebrow(svg, x, y, width, height) { - var self = this; - self.base = DrawModule; - self.base(svg, x, y, width, height); - - self.dofs = ['Left Vertical', 'Right Vertical', 'Rotation']; - self.increase = self.height / 2; - - self.Set = function(values) { - self.left_Y = constrain(values[0] || 0, -1, 1); // -1.0 -> 1.0 - self.right_Y = constrain(values[1] || 0, -1, 1); // -1.0 -> 1.0 - self.rotation = constrain(values[2] || 0, -1, 1); // -1.0 -> 1.0 - } - self.Set([0, 0, 0]); - - if (self.svg == undefined) { - return; - } - - self.curve = new SVG.PathArray([ - ['M', 0, 0] - ]); - self.image = self.svg.nested(); - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - self.image_eyebrow = self.image.path(self.curve); - - self.Update = function() { - var leftX, - rightX, - centerY; - leftX = 0; - rightX = self.width; - self.increase = self.height / 2; - centerY = self.height / 2; - self.curve = new SVG.PathArray([ - [ - 'M', leftX, centerY + (self.left_Y * self.increase) - ], - [ - 'C', leftX + self.width / 4, - centerY + (self.left_Y * self.increase) - self.increase / 2, - rightX - self.width / 4, - centerY + (self.right_Y * self.increase) - self.increase / 2, - rightX, - centerY + (self.right_Y * self.increase) - ] - ]); - - self.image_eyebrow.plot(self.curve); - // Round bezier corners - var endsize = 1; - var marker = self.svg.marker(endsize, endsize, function(add) { - add.circle(endsize).fill('#222'); - }) - self.image_eyebrow.marker('start', marker); - self.image_eyebrow.marker('end', marker); - self.image_eyebrow.fill('none').stroke({ - width: Math.min(self.width, self.height) / 6, - color: '#222' - }); - - self.image_eyebrow.rotate(self.rotation * 45); - - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - }; - self.Update(); -} -DrawEyebrow.prototype = new DrawModule; - -// ---------------------------------------------------------------------------------------------------- -// Eye -// ---------------------------------------------------------------------------------------------------- -function DrawEye(svg, x, y, width, height) { - var self = this; - self.base = DrawModule; - self.base(svg, x, y, width, height); - - self.dofs = ['Pupil Horizontal', 'Pupil Vertical', 'Eyelid Closure']; - - self.Set = function(values) { - self.pupil_X = constrain(values[0] || 0, -1, 1); // -1.0 -> 1.0 - self.pupil_Y = constrain(values[1] || 0, -1, 1); // -1.0 -> 1.0 - self.lid = constrain(-values[2] || 0, -1, 1); // -1.0 -> 1.0 - } - self.Set([0, 0, 0.5]); - - if (self.svg == undefined) { - return; - } - - self.curve = new SVG.PathArray([ - ['M', 0, 0] - ]); - self.image = self.svg.nested(); - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - - self.image_eye = self.image.ellipse(self.width, self.height); - self.image_eye.fill('#DDD'); - - self.image_pupil = self.image.ellipse(self.width / 5, self.height / 5); //((parseInt(self.width) + parseInt(self.height)) / 5); - self.image_pupil.center(self.width / 2, self.height / 2); - self.image_pupil.fill('#000'); - - self.image_lid = self.image.path(self.curve); - - self.Update = function() { - var leftX, - rightX, - topY, - pupil_factor; - leftX = 0; - rightX = self.width; - topY = 0; - pupil_factor = 2.5; - - self.image_eye.size(self.width, self.height); - self.image_eye.center(self.width / 2, self.height / 2); - self.image_pupil.size(self.width / pupil_factor, self.height / pupil_factor); - self.image_pupil.center(self.width / 2 - self.pupil_X * (self.width / 2 - self.image_pupil.width() / 1.4), self.height / 2 - self.pupil_Y * (self.height / 2 - self.image_pupil.height() / 1.4)); - - self.curve = new SVG.PathArray([ - [ - 'M', leftX, self.height / 2 - ], - [ - 'C', leftX, -self.height / 4, - rightX, -self.height / 4, - rightX, - self.height / 2 - ], - [ - 'C', rightX, self.height / 2 + self.lid * self.height * 5 / 8, - leftX, - self.height / 2 + self.lid * self.height * 5 / 8, - leftX, - self.height / 2 - ], - ['z'] - ]); - - self.image_lid.plot(self.curve); - - // Round bezier corners - // var endsize = 1; - // var marker = self.svg.marker(endsize, endsize, function(add) { - // add.circle(endsize).fill('#999'); - // }) - // self.image_lid.marker('start', marker); - // self.image_lid.marker('mid', marker); - self.image_lid.fill('#444'); //.stroke({ width: 1, color: '#999' }); - - - self.image.attr({ - x: self.x - self.width / 2, - y: self.y - self.height / 2, - width: self.width, - height: self.height - }); - // self.image.size(self.width, self.height); - // self.image.move(self.x, self.y); - }; - self.Update(); -} -DrawEyebrow.prototype = new DrawModule; - -var VirtualModel = function() { - var self = this; - - // File operations toolbar item - self.fileIsLocked = ko.observable(false); - self.fileIsModified = ko.observable(false); - self.fileName = ko.observable("Untitled"); - self.fileStatus = ko.observable(""); - self.fileExtension = ko.observable(".conf"); - - self.config = (config_data == undefined ? - undefined : - config_data); //JSON.parse(config_data)); - self.allModules = ['eye', 'eyebrow', 'mouth']; //modules_name; - self.allSkins = ['ono', 'nmct', 'robo']; //skins_name; - self.skin = ko.observable((self.allSkins == undefined ? - 'ono' : - self.allSkins[0])); - self.name = ko.observable("OPSORO robot"); - - self.isSelectedModule = ko.observable(false); - self.selectedModule = ko.observable(); - self.selectedModule_SelectedDof = ko.observable(); - - self.modules = ko.observableArray(); - - // create svg drawing - self.svg = SVG('model_screen').size('100%', '600'); - - self.modelwidth = $('#model_screen svg').width(); - self.modelheight = self.svg.height(); - self.refSize = Math.max(self.modelwidth, self.modelheight) / 2; - - self.gridSize = ko.observable(18); - self.screenGridSize = Math.min(self.modelwidth, self.modelheight) / self.gridSize(); - self.snap = ko.observable(1); - - self.centerX = self.modelwidth / 2; - self.centerY = self.modelheight / 2; - - self.skin_image = undefined; - self.newConfig = true; - - self.editable = ($('#poly_screen').length != 0); - - self.mappingGraph = new MappingGraph(); - - self.updateServoPin = function() { - - } - self.updateServoMid = function() { - if (!self.selectedModule_SelectedDof().isServo()) { - return; - } - console.log(parseInt(self.selectedModule_SelectedDof().servo().mid())); - robotSendServo(self.selectedModule_SelectedDof().servo().pin(), parseInt(self.selectedModule_SelectedDof().servo().mid())); - } - self.updateServoMin = function() { - if (!self.selectedModule_SelectedDof().isServo()) { - return; - } - console.log(parseInt(self.selectedModule_SelectedDof().servo().mid()) + parseInt(self.selectedModule_SelectedDof().servo().min())); - robotSendServo(self.selectedModule_SelectedDof().servo().pin(), parseInt(self.selectedModule_SelectedDof().servo().mid()) + parseInt(self.selectedModule_SelectedDof().servo().min())); - } - self.updateServoMax = function() { - if (!self.selectedModule_SelectedDof().isServo()) { - return; - } - console.log(parseInt(self.selectedModule_SelectedDof().servo().mid()) + parseInt(self.selectedModule_SelectedDof().servo().max())); - robotSendServo(self.selectedModule_SelectedDof().servo().pin(), parseInt(self.selectedModule_SelectedDof().servo().mid()) + parseInt(self.selectedModule_SelectedDof().servo().max())); - } - self.updateDofs = function() { - if (!self.selectedModule_SelectedDof().isServo()) { - return; - } - - var dof_values = {}; - - for (var i = 0; i < self.modules().length; i++) { - var singleModule = self.modules()[i]; - dof_values[singleModule.name()] = {}; - for (var j = 0; j < singleModule.dofs().length; j++) { - var singleDof = singleModule.dofs()[j]; - dof_values[singleModule.name()][singleDof.name()] = singleDof.value(); - - var value = parseInt(singleDof.servo().mid()); - if (singleDof.value() >= 0) { - value += parseInt(singleDof.value() * singleDof.servo().max()); - } else { - value += parseInt(-singleDof.value() * singleDof.servo().min()); - } - - robotSendServo(singleDof.servo().pin(), value); - } - console.log(dof_values[singleModule.name()]); - // mod_values[singleModule.name()].push(dof_values); - - } - // console.log(dof_values[]); - // robotSendReceiveAllDOF(dof_values); - } - - self.updateDof = function(singleDof) { - if (singleDof == undefined) { - return; - } - if (!singleDof.isServo()) { - return; - } - - if (singleDof.value() > 1.0) { - singleDof.value(1.0); - } - if (singleDof.value() < -1.0) { - singleDof.value(-1.0); - } - - - var value = parseInt(singleDof.servo().mid()); - if (singleDof.value() >= 0) { - value += parseInt(singleDof.value() * singleDof.servo().max()); - } else { - value += parseInt(-singleDof.value() * singleDof.servo().min()); - } - - robotSendServo(singleDof.servo().pin(), value); - } - - self.clearDraw = function() { - console.log('Clear'); - self.svg.clear(); - self.modelwidth = $('#model_screen svg').width(); - self.modelheight = self.svg.height(); - self.refSize = Math.max(self.modelwidth, self.modelheight) / 2; - self.screenGridSize = Math.min(self.modelwidth, self.modelheight) / self.gridSize(); - self.centerX = self.modelwidth / 2; - self.centerY = self.modelheight / 2; - - - self.resetSelect(); - if (self.config != undefined) { - if (self.config.grid != undefined) { - self.gridSize(self.config.grid); - } - } - self.screenGridSize = Math.min(self.modelwidth, self.modelheight) / self.gridSize(); - if (!self.editable) { - return; - } - var pattern = self.svg.pattern(self.screenGridSize, self.screenGridSize, function(add) { - // add.rect(self.screenGridSize, self.screenGridSize).fill('#eee'); - // add.rect(10,10); - var size = self.screenGridSize * 3 / 16; - add.rect(size, size).fill('#444'); - add.rect(size, size).move(self.screenGridSize - size, 0).fill('#444'); - add.rect(size, size).move(0, self.screenGridSize - size).fill('#444'); - add.rect(size, size).move(self.screenGridSize - size, self.screenGridSize - size).fill('#444'); - }) - self.grid = self.svg.rect(self.modelwidth, self.modelheight).attr({ - fill: pattern - }); - }; - self.setSelectedModule = function(module) { - self.selectedModule(module); - self.selectedModule_SelectedDof(self.selectedModule().dofs()[0]); - if (!self.editable) { - return; - } - self.fileIsModified(true); - self.isSelectedModule(true); - self.mappingGraph.updateGraph(); - self.updateServoMid(); - }; - self.selectedModule_RotateLeft = function() { - self.selectedModule().rotation((self.selectedModule().rotation() - 90) % 360); - self.selectedModule().image.rotate(self.selectedModule().rotation()); - }; - self.selectedModule_RotateRight = function() { - self.selectedModule().rotation((self.selectedModule().rotation() + 90) % 360); - self.selectedModule().image.rotate(self.selectedModule().rotation()); - }; - self.selectedModule_AddDof = function() { - var newDof = new Dof("New dof"); - self.selectedModule().dofs.push(newDof); - self.selectedModule_SelectedDof(newDof); - }; - self.selectedModule_Remove = function() { - self.resetSelect(); - self.selectedModule().image.remove(); - self.modules.remove(self.selectedModule()); - }; - self.selectedModule_RemoveDof = function() { - self.selectedModule().dofs.remove(self.selectedModule_SelectedDof()); - if (self.selectedModule().dofs().length == 0) { - self.selectedModule_AddDof(); - } - self.selectedModule_SelectedDof(self.selectedModule().dofs()[0]); - }; - - self.saveConfig = function() { - console.log('Save'); - if (!self.editable) { - return; - } - var svg_data = {}; - svg_data['name'] = self.name(); - svg_data['skin'] = self.skin(); - svg_data['grid'] = self.gridSize(); - - svg_data['modules'] = []; - - for (var i = 0; i < self.modules().length; i++) { - var singleModule = self.modules()[i]; - var module_data = {}; - module_data['module'] = singleModule.module(); - module_data['name'] = singleModule.name(); - var matrix = new SVG.Matrix(singleModule.image); - module_data['canvas'] = { - x: (singleModule.image.cx() - self.centerX) / self.refSize, - y: (singleModule.image.cy() - self.centerY) / self.refSize, - width: singleModule.width() / self.refSize, - height: singleModule.height() / self.refSize, - rotation: matrix.extract().rotation - }; - if (singleModule.dofs() != undefined) { - module_data['dofs'] = []; - for (var j = 0; j < singleModule.dofs().length; j++) { - var singleDof = singleModule.dofs()[j]; - var dof_data = {}; - - dof_data['name'] = singleDof.name(); - if (singleDof.isServo()) { - dof_data['servo'] = singleDof.servo(); - } - if (singleDof.isMap()) { - dof_data['mapping'] = singleDof.map(); - } - module_data['dofs'].push(dof_data); - } - } - svg_data['modules'].push(module_data); - } - return svg_data; - }; - - self.init = function() { - self.config = undefined; - self.newConfig = true; - self.redraw(); - }; - - self.loadFileData = function(data) { - if (data == undefined) { - return; - } - // Load data - var dataobj = JSON.parse(data); - console.log(dataobj); - // Do something with the data - self.newConfig = true; - self.config = dataobj; - self.redraw(); - self.fileIsModified(false); - }; - - self.saveFileData = function() { - if (!self.editable) { - return; - } - return ko.toJSON(self.saveConfig(), null, 2); - }; - - self.setDefault = function() { - if (!self.editable) { - return; - } - // Convert data - // file_data = self.saveConfig(); - // var data = ko.toJSON(file_data, null, 2); - - // Send data - robotSendReceiveConfig(self.saveConfig()); - }; - - //------------------------------------------------------------------------------- - // SVG stuff - //------------------------------------------------------------------------------- - - // var axisY = self.svg.line(0, centerY, self.modelwidth/2, centerY).stroke({ width: 1 }); - // var axisX = self.svg.line(centerX, 0, centerX, self.modelheight).stroke({ width: 1 }); - // var Seperator = self.svg.line(self.modelwidth/2, 0, self.modelwidth/2, self.modelheight).stroke({ width: 3 }); - - // Draw skin & modules - self.redraw = function() { - console.log('Redraw'); - if (!self.newConfig && self.fileIsModified()) { - // Convert and convert back, bad reading otherwise - self.config = JSON.parse(ko.toJSON(self.saveConfig())); - //alert('not good'); - } else { - self.newConfig = true; - } - self.clearDraw(); - if (self.config != undefined) { - self.skin_image = self.svg.image('/static/images/skins/' + self.config.skin + '.svg').loaded(self.drawModules); - } else { - self.skin_image = self.svg.image('/static/images/skins/' + self.skin() + '.svg').loaded(self.drawModules); - } - - self.fileIsModified(false); - }; - - var previousMapIndex = -1; - self.updateDofVisualisation = function(mapIndex, updateRobot) { - // alert(''); - if (mapIndex < -1 || previousMapIndex != mapIndex) { - // Update all modules (when selecting new emotion for mapping) - $.each(self.modules(), function(idx, mod) { - mod.updateDofVisualisation(mapIndex, updateRobot); - }); - } else { - // Update single module (when changing mapping) - self.selectedModule().updateDofVisualisation(mapIndex, updateRobot); - } - previousMapIndex = mapIndex; - // self.updateDofs(); - }; - - self.drawModules = function() { - $("image, svg").mousedown(function() { - virtualModel.resetSelect(); - // virtualModel.updateDofVisualisation(-1); - return false; - }); - - var dx = self.modelwidth / self.skin_image.width(); - var dy = self.modelheight / self.skin_image.height(); - - var modelWidth, - modelHeight; - - if (dx < dy) { - modelWidth = self.modelwidth; - modelHeight = self.skin_image.height() * dx; - } else { - modelWidth = self.skin_image.width() * dy; - modelHeight = self.modelheight; - } - - self.skin_image.size(modelWidth, modelHeight); - self.centerX = modelWidth / 2; - self.centerY = modelHeight / 2 - - // Divide in 2 - self.refSize = Math.max(modelWidth, modelHeight) / 2; - - if (self.config == undefined) { - return; - } - self.skin(self.config.skin); - self.name(self.config.name); - self.createModules(); - // Draw modules on top of the skin - $.each(self.modules(), function(idx, mod) { - mod.draw(); - }); - self.resetSelect(); - } - - self.resetSelect = function() { - if (!self.editable) { - return; - } - for (var i = 0; i < self.modules().length; i++) { - // self.modules()[i].image.selectize(false); - self.modules()[i].image.opacity(0.8); - // self.modules()[i].image.stroke('#000') - } - // if (self.isSelectedModule()) { - // self.updateDofVisualisation(-2, true); - // } - self.isSelectedModule(false); - }; - - // Create modules - self.createModules = function() { - self.modules.removeAll(); - if (self.config != undefined) { - $.each(self.config.modules, function(idx, mod) { - var newModule = new Module(mod.module, mod.name, mod.canvas.x, mod.canvas.y, mod.canvas.width, mod.canvas.height, mod.canvas.rotation); - if (mod.dofs.length == 0) { - newModule.dofs.push(new Dof('')); - } - $.each(mod.dofs, function(idx, dof) { - var newDof = new Dof(dof.name); - if (dof.servo != undefined) { - newDof.setServo(dof.servo.pin, dof.servo.mid, dof.servo.min, dof.servo.max); - } - if (dof.mapping != undefined) { - newDof.setMap(dof.mapping.neutral); - if (dof.mapping.poly != undefined) { - newDof.map().poly(dof.mapping.poly); - } - } - newModule.dofs.push(newDof); - }); - self.modules.push(newModule); - if (self.selectedModule() == undefined) { - self.setSelectedModule(newModule); - self.isSelectedModule(false); - } - }); - } else { - var newModule = new Module('', '', 0, 0, 0, 0, 0); - var newDof = new Dof(''); - newModule.dofs.push(newDof); - self.setSelectedModule(newModule); - self.isSelectedModule(false); - } - }; - - var newModule = new Module('', '', 0, 0, 0, 0, 0); - var newDof = new Dof(''); - newModule.dofs.push(newDof); - self.setSelectedModule(newModule); - self.isSelectedModule(false); - - if (self.editable) { - var index = 0; - self.svg_modules = SVG('modules_screen').size('100%', '60'); - // Draw available modules - if (self.allModules != undefined) { - $.each(self.allModules, function(idx, mod) { - // alert(mod); - // var moduleImage = self.svg.image('static/images/' + mod + '.svg').loaded(function() { - - var moduleImage = self.svg_modules.image('/static/images/modules/' + mod + '.svg').loaded(function() { - this.attr({ - preserveAspectRatio: "none", - type: mod - }); - var h = 50; - var w = 50; - var increase = 5; - this.size(w, h); - - this.move(index * (w + 2 * increase), increase); - index += 1; - - this.style('cursor', 'pointer'); - // this.selectize(); - // this.resize({snapToAngle:5}); - // allModules.push(this); - this.on('mouseover', function(e) { - this.size(w + increase, h + increase); - }); - this.on('mouseleave', function(e) { - this.size(w, h); - }); - this.on('click', function(e) { - var newModule = new Module(mod, mod, 0, 0, 0.2, 0.2, 0); - var tempModule = new module_function[mod](undefined, 0, 0, 0, 0); - for (var i = 0; i < tempModule.dofs.length; i++) { - var newDof = new Dof(tempModule.dofs[i]); - newModule.dofs.push(newDof); - } - self.setSelectedModule(newModule); - self.isSelectedModule(true); - newModule.draw(); - self.modules.push(newModule); - }); - }); - }); - } - } - var mousePos; - document.onmousemove = handleMouseMove; - document.addEventListener('touchmove', handleMouseMove) - - setInterval(getMousePosition, 750); - function handleMouseMove(event) { - var dot, eventDoc, doc, body, pageX, pageY; - - event = event || window.event; // IE-ism - - // If pageX/Y aren't available and clientX/Y are, - // calculate pageX/Y - logic taken from jQuery. - // (This is to support old IE) - if (event.pageX == null && event.clientX != null) { - eventDoc = (event.target && event.target.ownerDocument) || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = event.clientX + - (doc && doc.scrollLeft || body && body.scrollLeft || 0) - - (doc && doc.clientLeft || body && body.clientLeft || 0); - event.pageY = event.clientY + - (doc && doc.scrollTop || body && body.scrollTop || 0) - - (doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Use event.pageX / event.pageY here - mousePos = { - x: event.pageX, - y: event.pageY - }; - } - - function getMousePosition() { - var pos = mousePos; - if (!pos) { - // We haven't seen any movement yet - } - else { - // Use pos.x and pos.y - - var right_eye_module = undefined; - var left_eye_module = undefined; - - for (var i = 0; i < self.modules().length; i++) { - // self.modules()[i].image.selectize(false); - if (self.modules()[i].name() == 'eye_left') { - left_eye_module = self.modules()[i]; - } - if (self.modules()[i].name() == 'eye_right') { - right_eye_module = self.modules()[i]; - } - } - - var delta = 0.2; - - if (left_eye_module != undefined) { - var left_eye_dof_x = -(mousePos.x - left_eye_module.x()) / (left_eye_module.x() * delta); - var left_eye_dof_y = -(mousePos.y - left_eye_module.y()) / (left_eye_module.y() * delta); - robotSendDOF('eye_left', 'pupil_horizontal', left_eye_dof_x); - robotSendDOF('eye_left', 'pupil_vertical', left_eye_dof_y); - } - - if (right_eye_module != undefined) { - var right_eye_dof_x = -(mousePos.x - right_eye_module.x()) / (right_eye_module.x() * delta); - var right_eye_dof_y = -(mousePos.y - right_eye_module.y()) / (right_eye_module.y() * delta); - robotSendDOF('eye_right', 'pupil_horizontal', right_eye_dof_x); - robotSendDOF('eye_right', 'pupil_vertical', right_eye_dof_y); - } - } - } - // - // if (action_data != undefined && action_data.openfile) { - // self.loadFileData(action_data.openfile || ""); - // } else { - // self.init(); - // } -}; - -// $(document).ready(function() { -// // This makes Knockout get to work -// // virtualModel = new VirtualModel(); -// -// }); diff --git a/src/opsoro/server/static/js/robot_new/virtual.js b/src/opsoro/server/static/js/robot_new/virtual.js deleted file mode 100644 index 414082f..0000000 --- a/src/opsoro/server/static/js/robot_new/virtual.js +++ /dev/null @@ -1,103 +0,0 @@ - -function updateVirtualModel() { - virtualModel.updateDofVisualisation(-2, false); -} - -updateData = function() { - var timeOut = 500; - - // prev_dof_values = dof_values; - // dof_values = robotSendReceiveAllDOF(undefined); //JSON.parse(data); - // console.log(dof_values); - // if (prev_dof_values != undefined) { - // for (var i = 0; i < prev_dof_values.length; i++) { - // if (prev_dof_values[i] != dof_values[i]) { - // timeOut = 100; - // } - // } - // } - // // checkData(); - // updateVirtualModel(); - // $.ajax({ - // dataType: 'json', - // type: 'POST', - // url: '/robot/dofs/', - // success: function(data){ - // if (!data.success) { - // showMainError(data.message); - // } else { - // return data.dofs; - // } - // } - // }); - - - $.ajax({ - dataType: "json", - type: "POST", - url: "/robot/dofs/", - // data: { - // getdata: 1 - // }, - success: function(data) { - //alert(data); - // console.log(data); - prev_dof_values = dof_values; - // dof_values = data.split(','); //JSON.parse(data); - dof_values = data.dofs; - // console.log(dof_values); - if (prev_dof_values != undefined) { - for (var i = 0; i < prev_dof_values.length; i++) { - if (prev_dof_values[i] != dof_values[i]) { - timeOut = 100; - } - } - } - // checkData(); - updateVirtualModel(); - // $("#virtualModelCanvas").drawLayers(); - } - }); - setTimeout(updateData, timeOut); -} - -// // Setup websocket connection. -// var conn = null; -// var connReady = false; -// conn = new SockJS("http://" + window.location.host + "/sockjs"); -// -// self.conn.onopen = function(){ -// $.ajax({ -// url: "/sockjstoken", -// cache: false -// }) -// .done(function(data) { -// conn.send(JSON.stringify({action: "authenticate", token: data})); -// connReady = true; -// }); -// }; -// -// self.conn.onmessage = function(e){ -// var msg = $.parseJSON(e.data); -// switch(msg.action){ -// case "soundStopped": -// -// break; -// } -// }; -// -// self.conn.onclose = function(){ -// conn = null; -// connReady = false; -// }; - -$(document).ready(function() { - - virtualModel = new VirtualModel(); - - $(window).resize(virtualModel.redraw); - updateData(); - virtualModel.redraw(); - - -}); diff --git a/src/opsoro/server/static/js/vendor/foundation.js b/src/opsoro/server/static/js/vendor/foundation.js new file mode 100644 index 0000000..3bc16c9 --- /dev/null +++ b/src/opsoro/server/static/js/vendor/foundation.js @@ -0,0 +1,10207 @@ +!function ($) { + + "use strict"; + + var FOUNDATION_VERSION = '6.3.1'; + + // Global Foundation object + // This is attached to the window, or used as a module for AMD/Browserify + var Foundation = { + version: FOUNDATION_VERSION, + + /** + * Stores initialized plugins. + */ + _plugins: {}, + + /** + * Stores generated unique ids for plugin instances + */ + _uuids: [], + + /** + * Returns a boolean for RTL support + */ + rtl: function () { + return $('html').attr('dir') === 'rtl'; + }, + /** + * Defines a Foundation plugin, adding it to the `Foundation` namespace and the list of plugins to initialize when reflowing. + * @param {Object} plugin - The constructor of the plugin. + */ + plugin: function (plugin, name) { + // Object key to use when adding to global Foundation object + // Examples: Foundation.Reveal, Foundation.OffCanvas + var className = name || functionName(plugin); + // Object key to use when storing the plugin, also used to create the identifying data attribute for the plugin + // Examples: data-reveal, data-off-canvas + var attrName = hyphenate(className); + + // Add to the Foundation object and the plugins list (for reflowing) + this._plugins[attrName] = this[className] = plugin; + }, + /** + * @function + * Populates the _uuids array with pointers to each individual plugin instance. + * Adds the `zfPlugin` data-attribute to programmatically created plugins to allow use of $(selector).foundation(method) calls. + * Also fires the initialization event for each plugin, consolidating repetitive code. + * @param {Object} plugin - an instance of a plugin, usually `this` in context. + * @param {String} name - the name of the plugin, passed as a camelCased string. + * @fires Plugin#init + */ + registerPlugin: function (plugin, name) { + var pluginName = name ? hyphenate(name) : functionName(plugin.constructor).toLowerCase(); + plugin.uuid = this.GetYoDigits(6, pluginName); + + if (!plugin.$element.attr('data-' + pluginName)) { + plugin.$element.attr('data-' + pluginName, plugin.uuid); + } + if (!plugin.$element.data('zfPlugin')) { + plugin.$element.data('zfPlugin', plugin); + } + /** + * Fires when the plugin has initialized. + * @event Plugin#init + */ + plugin.$element.trigger('init.zf.' + pluginName); + + this._uuids.push(plugin.uuid); + + return; + }, + /** + * @function + * Removes the plugins uuid from the _uuids array. + * Removes the zfPlugin data attribute, as well as the data-plugin-name attribute. + * Also fires the destroyed event for the plugin, consolidating repetitive code. + * @param {Object} plugin - an instance of a plugin, usually `this` in context. + * @fires Plugin#destroyed + */ + unregisterPlugin: function (plugin) { + var pluginName = hyphenate(functionName(plugin.$element.data('zfPlugin').constructor)); + + this._uuids.splice(this._uuids.indexOf(plugin.uuid), 1); + plugin.$element.removeAttr('data-' + pluginName).removeData('zfPlugin') + /** + * Fires when the plugin has been destroyed. + * @event Plugin#destroyed + */ + .trigger('destroyed.zf.' + pluginName); + for (var prop in plugin) { + plugin[prop] = null; //clean up script to prep for garbage collection. + } + return; + }, + + /** + * @function + * Causes one or more active plugins to re-initialize, resetting event listeners, recalculating positions, etc. + * @param {String} plugins - optional string of an individual plugin key, attained by calling `$(element).data('pluginName')`, or string of a plugin class i.e. `'dropdown'` + * @default If no argument is passed, reflow all currently active plugins. + */ + reInit: function (plugins) { + var isJQ = plugins instanceof $; + try { + if (isJQ) { + plugins.each(function () { + $(this).data('zfPlugin')._init(); + }); + } else { + var type = typeof plugins, + _this = this, + fns = { + 'object': function (plgs) { + plgs.forEach(function (p) { + p = hyphenate(p); + $('[data-' + p + ']').foundation('_init'); + }); + }, + 'string': function () { + plugins = hyphenate(plugins); + $('[data-' + plugins + ']').foundation('_init'); + }, + 'undefined': function () { + this['object'](Object.keys(_this._plugins)); + } + }; + fns[type](plugins); + } + } catch (err) { + console.error(err); + } finally { + return plugins; + } + }, + + /** + * returns a random base-36 uid with namespacing + * @function + * @param {Number} length - number of random base-36 digits desired. Increase for more random strings. + * @param {String} namespace - name of plugin to be incorporated in uid, optional. + * @default {String} '' - if no plugin name is provided, nothing is appended to the uid. + * @returns {String} - unique id + */ + GetYoDigits: function (length, namespace) { + length = length || 6; + return Math.round(Math.pow(36, length + 1) - Math.random() * Math.pow(36, length)).toString(36).slice(1) + (namespace ? '-' + namespace : ''); + }, + /** + * Initialize plugins on any elements within `elem` (and `elem` itself) that aren't already initialized. + * @param {Object} elem - jQuery object containing the element to check inside. Also checks the element itself, unless it's the `document` object. + * @param {String|Array} plugins - A list of plugins to initialize. Leave this out to initialize everything. + */ + reflow: function (elem, plugins) { + + // If plugins is undefined, just grab everything + if (typeof plugins === 'undefined') { + plugins = Object.keys(this._plugins); + } + // If plugins is a string, convert it to an array with one item + else if (typeof plugins === 'string') { + plugins = [plugins]; + } + + var _this = this; + + // Iterate through each plugin + $.each(plugins, function (i, name) { + // Get the current plugin + var plugin = _this._plugins[name]; + + // Localize the search to all elements inside elem, as well as elem itself, unless elem === document + var $elem = $(elem).find('[data-' + name + ']').addBack('[data-' + name + ']'); + + // For each plugin found, initialize it + $elem.each(function () { + var $el = $(this), + opts = {}; + // Don't double-dip on plugins + if ($el.data('zfPlugin')) { + console.warn("Tried to initialize " + name + " on an element that already has a Foundation plugin."); + return; + } + + if ($el.attr('data-options')) { + var thing = $el.attr('data-options').split(';').forEach(function (e, i) { + var opt = e.split(':').map(function (el) { + return el.trim(); + }); + if (opt[0]) opts[opt[0]] = parseValue(opt[1]); + }); + } + try { + $el.data('zfPlugin', new plugin($(this), opts)); + } catch (er) { + console.error(er); + } finally { + return; + } + }); + }); + }, + getFnName: functionName, + transitionend: function ($elem) { + var transitions = { + 'transition': 'transitionend', + 'WebkitTransition': 'webkitTransitionEnd', + 'MozTransition': 'transitionend', + 'OTransition': 'otransitionend' + }; + var elem = document.createElement('div'), + end; + + for (var t in transitions) { + if (typeof elem.style[t] !== 'undefined') { + end = transitions[t]; + } + } + if (end) { + return end; + } else { + end = setTimeout(function () { + $elem.triggerHandler('transitionend', [$elem]); + }, 1); + return 'transitionend'; + } + } + }; + + Foundation.util = { + /** + * Function for applying a debounce effect to a function call. + * @function + * @param {Function} func - Function to be called at end of timeout. + * @param {Number} delay - Time in ms to delay the call of `func`. + * @returns function + */ + throttle: function (func, delay) { + var timer = null; + + return function () { + var context = this, + args = arguments; + + if (timer === null) { + timer = setTimeout(function () { + func.apply(context, args); + timer = null; + }, delay); + } + }; + } + }; + + // TODO: consider not making this a jQuery function + // TODO: need way to reflow vs. re-initialize + /** + * The Foundation jQuery method. + * @param {String|Array} method - An action to perform on the current jQuery object. + */ + var foundation = function (method) { + var type = typeof method, + $meta = $('meta.foundation-mq'), + $noJS = $('.no-js'); + + if (!$meta.length) { + $('').appendTo(document.head); + } + if ($noJS.length) { + $noJS.removeClass('no-js'); + } + + if (type === 'undefined') { + //needs to initialize the Foundation object, or an individual plugin. + Foundation.MediaQuery._init(); + Foundation.reflow(this); + } else if (type === 'string') { + //an individual method to invoke on a plugin or group of plugins + var args = Array.prototype.slice.call(arguments, 1); //collect all the arguments, if necessary + var plugClass = this.data('zfPlugin'); //determine the class of plugin + + if (plugClass !== undefined && plugClass[method] !== undefined) { + //make sure both the class and method exist + if (this.length === 1) { + //if there's only one, call it directly. + plugClass[method].apply(plugClass, args); + } else { + this.each(function (i, el) { + //otherwise loop through the jQuery collection and invoke the method on each + plugClass[method].apply($(el).data('zfPlugin'), args); + }); + } + } else { + //error for no class or no method + throw new ReferenceError("We're sorry, '" + method + "' is not an available method for " + (plugClass ? functionName(plugClass) : 'this element') + '.'); + } + } else { + //error for invalid argument type + throw new TypeError('We\'re sorry, ' + type + ' is not a valid parameter. You must use a string representing the method you wish to invoke.'); + } + return this; + }; + + window.Foundation = Foundation; + $.fn.foundation = foundation; + + // Polyfill for requestAnimationFrame + (function () { + if (!Date.now || !window.Date.now) window.Date.now = Date.now = function () { + return new Date().getTime(); + }; + + var vendors = ['webkit', 'moz']; + for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) { + var vp = vendors[i]; + window.requestAnimationFrame = window[vp + 'RequestAnimationFrame']; + window.cancelAnimationFrame = window[vp + 'CancelAnimationFrame'] || window[vp + 'CancelRequestAnimationFrame']; + } + if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) { + var lastTime = 0; + window.requestAnimationFrame = function (callback) { + var now = Date.now(); + var nextTime = Math.max(lastTime + 16, now); + return setTimeout(function () { + callback(lastTime = nextTime); + }, nextTime - now); + }; + window.cancelAnimationFrame = clearTimeout; + } + /** + * Polyfill for performance.now, required by rAF + */ + if (!window.performance || !window.performance.now) { + window.performance = { + start: Date.now(), + now: function () { + return Date.now() - this.start; + } + }; + } + })(); + if (!Function.prototype.bind) { + Function.prototype.bind = function (oThis) { + if (typeof this !== 'function') { + // closest thing possible to the ECMAScript 5 + // internal IsCallable function + throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); + } + + var aArgs = Array.prototype.slice.call(arguments, 1), + fToBind = this, + fNOP = function () {}, + fBound = function () { + return fToBind.apply(this instanceof fNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments))); + }; + + if (this.prototype) { + // native functions don't have a prototype + fNOP.prototype = this.prototype; + } + fBound.prototype = new fNOP(); + + return fBound; + }; + } + // Polyfill to get the name of a function in IE9 + function functionName(fn) { + if (Function.prototype.name === undefined) { + var funcNameRegex = /function\s([^(]{1,})\(/; + var results = funcNameRegex.exec(fn.toString()); + return results && results.length > 1 ? results[1].trim() : ""; + } else if (fn.prototype === undefined) { + return fn.constructor.name; + } else { + return fn.prototype.constructor.name; + } + } + function parseValue(str) { + if ('true' === str) return true;else if ('false' === str) return false;else if (!isNaN(str * 1)) return parseFloat(str); + return str; + } + // Convert PascalCase to kebab-case + // Thank you: http://stackoverflow.com/a/8955580 + function hyphenate(str) { + return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); + } +}(jQuery); +'use strict'; + +!function ($) { + + // Default set of media queries + var defaultQueries = { + 'default': 'only screen', + landscape: 'only screen and (orientation: landscape)', + portrait: 'only screen and (orientation: portrait)', + retina: 'only screen and (-webkit-min-device-pixel-ratio: 2),' + 'only screen and (min--moz-device-pixel-ratio: 2),' + 'only screen and (-o-min-device-pixel-ratio: 2/1),' + 'only screen and (min-device-pixel-ratio: 2),' + 'only screen and (min-resolution: 192dpi),' + 'only screen and (min-resolution: 2dppx)' + }; + + var MediaQuery = { + queries: [], + + current: '', + + /** + * Initializes the media query helper, by extracting the breakpoint list from the CSS and activating the breakpoint watcher. + * @function + * @private + */ + _init: function () { + var self = this; + var extractedStyles = $('.foundation-mq').css('font-family'); + var namedQueries; + + namedQueries = parseStyleToObject(extractedStyles); + + for (var key in namedQueries) { + if (namedQueries.hasOwnProperty(key)) { + self.queries.push({ + name: key, + value: 'only screen and (min-width: ' + namedQueries[key] + ')' + }); + } + } + + this.current = this._getCurrentSize(); + + this._watcher(); + }, + + + /** + * Checks if the screen is at least as wide as a breakpoint. + * @function + * @param {String} size - Name of the breakpoint to check. + * @returns {Boolean} `true` if the breakpoint matches, `false` if it's smaller. + */ + atLeast: function (size) { + var query = this.get(size); + + if (query) { + return window.matchMedia(query).matches; + } + + return false; + }, + + + /** + * Checks if the screen matches to a breakpoint. + * @function + * @param {String} size - Name of the breakpoint to check, either 'small only' or 'small'. Omitting 'only' falls back to using atLeast() method. + * @returns {Boolean} `true` if the breakpoint matches, `false` if it does not. + */ + is: function (size) { + size = size.trim().split(' '); + if (size.length > 1 && size[1] === 'only') { + if (size[0] === this._getCurrentSize()) return true; + } else { + return this.atLeast(size[0]); + } + return false; + }, + + + /** + * Gets the media query of a breakpoint. + * @function + * @param {String} size - Name of the breakpoint to get. + * @returns {String|null} - The media query of the breakpoint, or `null` if the breakpoint doesn't exist. + */ + get: function (size) { + for (var i in this.queries) { + if (this.queries.hasOwnProperty(i)) { + var query = this.queries[i]; + if (size === query.name) return query.value; + } + } + + return null; + }, + + + /** + * Gets the current breakpoint name by testing every breakpoint and returning the last one to match (the biggest one). + * @function + * @private + * @returns {String} Name of the current breakpoint. + */ + _getCurrentSize: function () { + var matched; + + for (var i = 0; i < this.queries.length; i++) { + var query = this.queries[i]; + + if (window.matchMedia(query.value).matches) { + matched = query; + } + } + + if (typeof matched === 'object') { + return matched.name; + } else { + return matched; + } + }, + + + /** + * Activates the breakpoint watcher, which fires an event on the window whenever the breakpoint changes. + * @function + * @private + */ + _watcher: function () { + var _this = this; + + $(window).on('resize.zf.mediaquery', function () { + var newSize = _this._getCurrentSize(), + currentSize = _this.current; + + if (newSize !== currentSize) { + // Change the current media query + _this.current = newSize; + + // Broadcast the media query change on the window + $(window).trigger('changed.zf.mediaquery', [newSize, currentSize]); + } + }); + } + }; + + Foundation.MediaQuery = MediaQuery; + + // matchMedia() polyfill - Test a CSS media type/query in JS. + // Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license + window.matchMedia || (window.matchMedia = function () { + 'use strict'; + + // For browsers that support matchMedium api such as IE 9 and webkit + + var styleMedia = window.styleMedia || window.media; + + // For those that don't support matchMedium + if (!styleMedia) { + var style = document.createElement('style'), + script = document.getElementsByTagName('script')[0], + info = null; + + style.type = 'text/css'; + style.id = 'matchmediajs-test'; + + script && script.parentNode && script.parentNode.insertBefore(style, script); + + // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers + info = 'getComputedStyle' in window && window.getComputedStyle(style, null) || style.currentStyle; + + styleMedia = { + matchMedium: function (media) { + var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }'; + + // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers + if (style.styleSheet) { + style.styleSheet.cssText = text; + } else { + style.textContent = text; + } + + // Test if media query is true or false + return info.width === '1px'; + } + }; + } + + return function (media) { + return { + matches: styleMedia.matchMedium(media || 'all'), + media: media || 'all' + }; + }; + }()); + + // Thank you: https://github.com/sindresorhus/query-string + function parseStyleToObject(str) { + var styleObject = {}; + + if (typeof str !== 'string') { + return styleObject; + } + + str = str.trim().slice(1, -1); // browsers re-quote string style values + + if (!str) { + return styleObject; + } + + styleObject = str.split('&').reduce(function (ret, param) { + var parts = param.replace(/\+/g, ' ').split('='); + var key = parts[0]; + var val = parts[1]; + key = decodeURIComponent(key); + + // missing `=` should be `null`: + // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters + val = val === undefined ? null : decodeURIComponent(val); + + if (!ret.hasOwnProperty(key)) { + ret[key] = val; + } else if (Array.isArray(ret[key])) { + ret[key].push(val); + } else { + ret[key] = [ret[key], val]; + } + return ret; + }, {}); + + return styleObject; + } + + Foundation.MediaQuery = MediaQuery; +}(jQuery); +'use strict'; + +!function ($) { + + Foundation.Box = { + ImNotTouchingYou: ImNotTouchingYou, + GetDimensions: GetDimensions, + GetOffsets: GetOffsets + }; + + /** + * Compares the dimensions of an element to a container and determines collision events with container. + * @function + * @param {jQuery} element - jQuery object to test for collisions. + * @param {jQuery} parent - jQuery object to use as bounding container. + * @param {Boolean} lrOnly - set to true to check left and right values only. + * @param {Boolean} tbOnly - set to true to check top and bottom values only. + * @default if no parent object passed, detects collisions with `window`. + * @returns {Boolean} - true if collision free, false if a collision in any direction. + */ + function ImNotTouchingYou(element, parent, lrOnly, tbOnly) { + var eleDims = GetDimensions(element), + top, + bottom, + left, + right; + + if (parent) { + var parDims = GetDimensions(parent); + + bottom = eleDims.offset.top + eleDims.height <= parDims.height + parDims.offset.top; + top = eleDims.offset.top >= parDims.offset.top; + left = eleDims.offset.left >= parDims.offset.left; + right = eleDims.offset.left + eleDims.width <= parDims.width + parDims.offset.left; + } else { + bottom = eleDims.offset.top + eleDims.height <= eleDims.windowDims.height + eleDims.windowDims.offset.top; + top = eleDims.offset.top >= eleDims.windowDims.offset.top; + left = eleDims.offset.left >= eleDims.windowDims.offset.left; + right = eleDims.offset.left + eleDims.width <= eleDims.windowDims.width; + } + + var allDirs = [bottom, top, left, right]; + + if (lrOnly) { + return left === right === true; + } + + if (tbOnly) { + return top === bottom === true; + } + + return allDirs.indexOf(false) === -1; + }; + + /** + * Uses native methods to return an object of dimension values. + * @function + * @param {jQuery || HTML} element - jQuery object or DOM element for which to get the dimensions. Can be any element other that document or window. + * @returns {Object} - nested object of integer pixel values + * TODO - if element is window, return only those values. + */ + function GetDimensions(elem, test) { + elem = elem.length ? elem[0] : elem; + + if (elem === window || elem === document) { + throw new Error("I'm sorry, Dave. I'm afraid I can't do that."); + } + + var rect = elem.getBoundingClientRect(), + parRect = elem.parentNode.getBoundingClientRect(), + winRect = document.body.getBoundingClientRect(), + winY = window.pageYOffset, + winX = window.pageXOffset; + + return { + width: rect.width, + height: rect.height, + offset: { + top: rect.top + winY, + left: rect.left + winX + }, + parentDims: { + width: parRect.width, + height: parRect.height, + offset: { + top: parRect.top + winY, + left: parRect.left + winX + } + }, + windowDims: { + width: winRect.width, + height: winRect.height, + offset: { + top: winY, + left: winX + } + } + }; + } + + /** + * Returns an object of top and left integer pixel values for dynamically rendered elements, + * such as: Tooltip, Reveal, and Dropdown + * @function + * @param {jQuery} element - jQuery object for the element being positioned. + * @param {jQuery} anchor - jQuery object for the element's anchor point. + * @param {String} position - a string relating to the desired position of the element, relative to it's anchor + * @param {Number} vOffset - integer pixel value of desired vertical separation between anchor and element. + * @param {Number} hOffset - integer pixel value of desired horizontal separation between anchor and element. + * @param {Boolean} isOverflow - if a collision event is detected, sets to true to default the element to full width - any desired offset. + * TODO alter/rewrite to work with `em` values as well/instead of pixels + */ + function GetOffsets(element, anchor, position, vOffset, hOffset, isOverflow) { + var $eleDims = GetDimensions(element), + $anchorDims = anchor ? GetDimensions(anchor) : null; + + switch (position) { + case 'top': + return { + left: Foundation.rtl() ? $anchorDims.offset.left - $eleDims.width + $anchorDims.width : $anchorDims.offset.left, + top: $anchorDims.offset.top - ($eleDims.height + vOffset) + }; + break; + case 'left': + return { + left: $anchorDims.offset.left - ($eleDims.width + hOffset), + top: $anchorDims.offset.top + }; + break; + case 'right': + return { + left: $anchorDims.offset.left + $anchorDims.width + hOffset, + top: $anchorDims.offset.top + }; + break; + case 'center top': + return { + left: $anchorDims.offset.left + $anchorDims.width / 2 - $eleDims.width / 2, + top: $anchorDims.offset.top - ($eleDims.height + vOffset) + }; + break; + case 'center bottom': + return { + left: isOverflow ? hOffset : $anchorDims.offset.left + $anchorDims.width / 2 - $eleDims.width / 2, + top: $anchorDims.offset.top + $anchorDims.height + vOffset + }; + break; + case 'center left': + return { + left: $anchorDims.offset.left - ($eleDims.width + hOffset), + top: $anchorDims.offset.top + $anchorDims.height / 2 - $eleDims.height / 2 + }; + break; + case 'center right': + return { + left: $anchorDims.offset.left + $anchorDims.width + hOffset + 1, + top: $anchorDims.offset.top + $anchorDims.height / 2 - $eleDims.height / 2 + }; + break; + case 'center': + return { + left: $eleDims.windowDims.offset.left + $eleDims.windowDims.width / 2 - $eleDims.width / 2, + top: $eleDims.windowDims.offset.top + $eleDims.windowDims.height / 2 - $eleDims.height / 2 + }; + break; + case 'reveal': + return { + left: ($eleDims.windowDims.width - $eleDims.width) / 2, + top: $eleDims.windowDims.offset.top + vOffset + }; + case 'reveal full': + return { + left: $eleDims.windowDims.offset.left, + top: $eleDims.windowDims.offset.top + }; + break; + case 'left bottom': + return { + left: $anchorDims.offset.left, + top: $anchorDims.offset.top + $anchorDims.height + vOffset + }; + break; + case 'right bottom': + return { + left: $anchorDims.offset.left + $anchorDims.width + hOffset - $eleDims.width, + top: $anchorDims.offset.top + $anchorDims.height + vOffset + }; + break; + default: + return { + left: Foundation.rtl() ? $anchorDims.offset.left - $eleDims.width + $anchorDims.width : $anchorDims.offset.left + hOffset, + top: $anchorDims.offset.top + $anchorDims.height + vOffset + }; + } + } +}(jQuery); +//************************************************** +//**Work inspired by multiple jquery swipe plugins** +//**Done by Yohai Ararat *************************** +//************************************************** +(function ($) { + + $.spotSwipe = { + version: '1.0.0', + enabled: 'ontouchstart' in document.documentElement, + preventDefault: false, + moveThreshold: 75, + timeThreshold: 200 + }; + + var startPosX, + startPosY, + startTime, + elapsedTime, + isMoving = false; + + function onTouchEnd() { + // alert(this); + this.removeEventListener('touchmove', onTouchMove); + this.removeEventListener('touchend', onTouchEnd); + isMoving = false; + } + + function onTouchMove(e) { + if ($.spotSwipe.preventDefault) { + e.preventDefault(); + } + if (isMoving) { + var x = e.touches[0].pageX; + var y = e.touches[0].pageY; + var dx = startPosX - x; + var dy = startPosY - y; + var dir; + elapsedTime = new Date().getTime() - startTime; + if (Math.abs(dx) >= $.spotSwipe.moveThreshold && elapsedTime <= $.spotSwipe.timeThreshold) { + dir = dx > 0 ? 'left' : 'right'; + } + // else if(Math.abs(dy) >= $.spotSwipe.moveThreshold && elapsedTime <= $.spotSwipe.timeThreshold) { + // dir = dy > 0 ? 'down' : 'up'; + // } + if (dir) { + e.preventDefault(); + onTouchEnd.call(this); + $(this).trigger('swipe', dir).trigger('swipe' + dir); + } + } + } + + function onTouchStart(e) { + if (e.touches.length == 1) { + startPosX = e.touches[0].pageX; + startPosY = e.touches[0].pageY; + isMoving = true; + startTime = new Date().getTime(); + this.addEventListener('touchmove', onTouchMove, false); + this.addEventListener('touchend', onTouchEnd, false); + } + } + + function init() { + this.addEventListener && this.addEventListener('touchstart', onTouchStart, false); + } + + function teardown() { + this.removeEventListener('touchstart', onTouchStart); + } + + $.event.special.swipe = { setup: init }; + + $.each(['left', 'up', 'down', 'right'], function () { + $.event.special['swipe' + this] = { setup: function () { + $(this).on('swipe', $.noop); + } }; + }); +})(jQuery); +/**************************************************** + * Method for adding psuedo drag events to elements * + ***************************************************/ +!function ($) { + $.fn.addTouch = function () { + this.each(function (i, el) { + $(el).bind('touchstart touchmove touchend touchcancel', function () { + //we pass the original event object because the jQuery event + //object is normalized to w3c specs and does not provide the TouchList + handleTouch(event); + }); + }); + + var handleTouch = function (event) { + var touches = event.changedTouches, + first = touches[0], + eventTypes = { + touchstart: 'mousedown', + touchmove: 'mousemove', + touchend: 'mouseup' + }, + type = eventTypes[event.type], + simulatedEvent; + + if ('MouseEvent' in window && typeof window.MouseEvent === 'function') { + simulatedEvent = new window.MouseEvent(type, { + 'bubbles': true, + 'cancelable': true, + 'screenX': first.screenX, + 'screenY': first.screenY, + 'clientX': first.clientX, + 'clientY': first.clientY + }); + } else { + simulatedEvent = document.createEvent('MouseEvent'); + simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY, false, false, false, false, 0 /*left*/, null); + } + first.target.dispatchEvent(simulatedEvent); + }; + }; +}(jQuery); + +//********************************** +//**From the jQuery Mobile Library** +//**need to recreate functionality** +//**and try to improve if possible** +//********************************** + +/* Removing the jQuery function **** +************************************ + +(function( $, window, undefined ) { + + var $document = $( document ), + // supportTouch = $.mobile.support.touch, + touchStartEvent = 'touchstart'//supportTouch ? "touchstart" : "mousedown", + touchStopEvent = 'touchend'//supportTouch ? "touchend" : "mouseup", + touchMoveEvent = 'touchmove'//supportTouch ? "touchmove" : "mousemove"; + + // setup new event shortcuts + $.each( ( "touchstart touchmove touchend " + + "swipe swipeleft swiperight" ).split( " " ), function( i, name ) { + + $.fn[ name ] = function( fn ) { + return fn ? this.bind( name, fn ) : this.trigger( name ); + }; + + // jQuery < 1.8 + if ( $.attrFn ) { + $.attrFn[ name ] = true; + } + }); + + function triggerCustomEvent( obj, eventType, event, bubble ) { + var originalType = event.type; + event.type = eventType; + if ( bubble ) { + $.event.trigger( event, undefined, obj ); + } else { + $.event.dispatch.call( obj, event ); + } + event.type = originalType; + } + + // also handles taphold + + // Also handles swipeleft, swiperight + $.event.special.swipe = { + + // More than this horizontal displacement, and we will suppress scrolling. + scrollSupressionThreshold: 30, + + // More time than this, and it isn't a swipe. + durationThreshold: 1000, + + // Swipe horizontal displacement must be more than this. + horizontalDistanceThreshold: window.devicePixelRatio >= 2 ? 15 : 30, + + // Swipe vertical displacement must be less than this. + verticalDistanceThreshold: window.devicePixelRatio >= 2 ? 15 : 30, + + getLocation: function ( event ) { + var winPageX = window.pageXOffset, + winPageY = window.pageYOffset, + x = event.clientX, + y = event.clientY; + + if ( event.pageY === 0 && Math.floor( y ) > Math.floor( event.pageY ) || + event.pageX === 0 && Math.floor( x ) > Math.floor( event.pageX ) ) { + + // iOS4 clientX/clientY have the value that should have been + // in pageX/pageY. While pageX/page/ have the value 0 + x = x - winPageX; + y = y - winPageY; + } else if ( y < ( event.pageY - winPageY) || x < ( event.pageX - winPageX ) ) { + + // Some Android browsers have totally bogus values for clientX/Y + // when scrolling/zooming a page. Detectable since clientX/clientY + // should never be smaller than pageX/pageY minus page scroll + x = event.pageX - winPageX; + y = event.pageY - winPageY; + } + + return { + x: x, + y: y + }; + }, + + start: function( event ) { + var data = event.originalEvent.touches ? + event.originalEvent.touches[ 0 ] : event, + location = $.event.special.swipe.getLocation( data ); + return { + time: ( new Date() ).getTime(), + coords: [ location.x, location.y ], + origin: $( event.target ) + }; + }, + + stop: function( event ) { + var data = event.originalEvent.touches ? + event.originalEvent.touches[ 0 ] : event, + location = $.event.special.swipe.getLocation( data ); + return { + time: ( new Date() ).getTime(), + coords: [ location.x, location.y ] + }; + }, + + handleSwipe: function( start, stop, thisObject, origTarget ) { + if ( stop.time - start.time < $.event.special.swipe.durationThreshold && + Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.horizontalDistanceThreshold && + Math.abs( start.coords[ 1 ] - stop.coords[ 1 ] ) < $.event.special.swipe.verticalDistanceThreshold ) { + var direction = start.coords[0] > stop.coords[ 0 ] ? "swipeleft" : "swiperight"; + + triggerCustomEvent( thisObject, "swipe", $.Event( "swipe", { target: origTarget, swipestart: start, swipestop: stop }), true ); + triggerCustomEvent( thisObject, direction,$.Event( direction, { target: origTarget, swipestart: start, swipestop: stop } ), true ); + return true; + } + return false; + + }, + + // This serves as a flag to ensure that at most one swipe event event is + // in work at any given time + eventInProgress: false, + + setup: function() { + var events, + thisObject = this, + $this = $( thisObject ), + context = {}; + + // Retrieve the events data for this element and add the swipe context + events = $.data( this, "mobile-events" ); + if ( !events ) { + events = { length: 0 }; + $.data( this, "mobile-events", events ); + } + events.length++; + events.swipe = context; + + context.start = function( event ) { + + // Bail if we're already working on a swipe event + if ( $.event.special.swipe.eventInProgress ) { + return; + } + $.event.special.swipe.eventInProgress = true; + + var stop, + start = $.event.special.swipe.start( event ), + origTarget = event.target, + emitted = false; + + context.move = function( event ) { + if ( !start || event.isDefaultPrevented() ) { + return; + } + + stop = $.event.special.swipe.stop( event ); + if ( !emitted ) { + emitted = $.event.special.swipe.handleSwipe( start, stop, thisObject, origTarget ); + if ( emitted ) { + + // Reset the context to make way for the next swipe event + $.event.special.swipe.eventInProgress = false; + } + } + // prevent scrolling + if ( Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.scrollSupressionThreshold ) { + event.preventDefault(); + } + }; + + context.stop = function() { + emitted = true; + + // Reset the context to make way for the next swipe event + $.event.special.swipe.eventInProgress = false; + $document.off( touchMoveEvent, context.move ); + context.move = null; + }; + + $document.on( touchMoveEvent, context.move ) + .one( touchStopEvent, context.stop ); + }; + $this.on( touchStartEvent, context.start ); + }, + + teardown: function() { + var events, context; + + events = $.data( this, "mobile-events" ); + if ( events ) { + context = events.swipe; + delete events.swipe; + events.length--; + if ( events.length === 0 ) { + $.removeData( this, "mobile-events" ); + } + } + + if ( context ) { + if ( context.start ) { + $( this ).off( touchStartEvent, context.start ); + } + if ( context.move ) { + $document.off( touchMoveEvent, context.move ); + } + if ( context.stop ) { + $document.off( touchStopEvent, context.stop ); + } + } + } + }; + $.each({ + swipeleft: "swipe.left", + swiperight: "swipe.right" + }, function( event, sourceEvent ) { + + $.event.special[ event ] = { + setup: function() { + $( this ).bind( sourceEvent, $.noop ); + }, + teardown: function() { + $( this ).unbind( sourceEvent ); + } + }; + }); +})( jQuery, this ); +*/ +'use strict'; + +!function ($) { + + /** + * Motion module. + * @module foundation.motion + */ + + var initClasses = ['mui-enter', 'mui-leave']; + var activeClasses = ['mui-enter-active', 'mui-leave-active']; + + var Motion = { + animateIn: function (element, animation, cb) { + animate(true, element, animation, cb); + }, + + animateOut: function (element, animation, cb) { + animate(false, element, animation, cb); + } + }; + + function Move(duration, elem, fn) { + var anim, + prog, + start = null; + // console.log('called'); + + if (duration === 0) { + fn.apply(elem); + elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]); + return; + } + + function move(ts) { + if (!start) start = ts; + // console.log(start, ts); + prog = ts - start; + fn.apply(elem); + + if (prog < duration) { + anim = window.requestAnimationFrame(move, elem); + } else { + window.cancelAnimationFrame(anim); + elem.trigger('finished.zf.animate', [elem]).triggerHandler('finished.zf.animate', [elem]); + } + } + anim = window.requestAnimationFrame(move); + } + + /** + * Animates an element in or out using a CSS transition class. + * @function + * @private + * @param {Boolean} isIn - Defines if the animation is in or out. + * @param {Object} element - jQuery or HTML object to animate. + * @param {String} animation - CSS class to use. + * @param {Function} cb - Callback to run when animation is finished. + */ + function animate(isIn, element, animation, cb) { + element = $(element).eq(0); + + if (!element.length) return; + + var initClass = isIn ? initClasses[0] : initClasses[1]; + var activeClass = isIn ? activeClasses[0] : activeClasses[1]; + + // Set up the animation + reset(); + + element.addClass(animation).css('transition', 'none'); + + requestAnimationFrame(function () { + element.addClass(initClass); + if (isIn) element.show(); + }); + + // Start the animation + requestAnimationFrame(function () { + element[0].offsetWidth; + element.css('transition', '').addClass(activeClass); + }); + + // Clean up the animation when it finishes + element.one(Foundation.transitionend(element), finish); + + // Hides the element (for out animations), resets the element, and runs a callback + function finish() { + if (!isIn) element.hide(); + reset(); + if (cb) cb.apply(element); + } + + // Resets transitions and removes motion-specific classes + function reset() { + element[0].style.transitionDuration = 0; + element.removeClass(initClass + ' ' + activeClass + ' ' + animation); + } + } + + Foundation.Move = Move; + Foundation.Motion = Motion; +}(jQuery); +'use strict'; + +!function ($) { + + var MutationObserver = function () { + var prefixes = ['WebKit', 'Moz', 'O', 'Ms', '']; + for (var i = 0; i < prefixes.length; i++) { + if (prefixes[i] + 'MutationObserver' in window) { + return window[prefixes[i] + 'MutationObserver']; + } + } + return false; + }(); + + var triggers = function (el, type) { + el.data(type).split(' ').forEach(function (id) { + $('#' + id)[type === 'close' ? 'trigger' : 'triggerHandler'](type + '.zf.trigger', [el]); + }); + }; + // Elements with [data-open] will reveal a plugin that supports it when clicked. + $(document).on('click.zf.trigger', '[data-open]', function () { + triggers($(this), 'open'); + }); + + // Elements with [data-close] will close a plugin that supports it when clicked. + // If used without a value on [data-close], the event will bubble, allowing it to close a parent component. + $(document).on('click.zf.trigger', '[data-close]', function () { + var id = $(this).data('close'); + if (id) { + triggers($(this), 'close'); + } else { + $(this).trigger('close.zf.trigger'); + } + }); + + // Elements with [data-toggle] will toggle a plugin that supports it when clicked. + $(document).on('click.zf.trigger', '[data-toggle]', function () { + var id = $(this).data('toggle'); + if (id) { + triggers($(this), 'toggle'); + } else { + $(this).trigger('toggle.zf.trigger'); + } + }); + + // Elements with [data-closable] will respond to close.zf.trigger events. + $(document).on('close.zf.trigger', '[data-closable]', function (e) { + e.stopPropagation(); + var animation = $(this).data('closable'); + + if (animation !== '') { + Foundation.Motion.animateOut($(this), animation, function () { + $(this).trigger('closed.zf'); + }); + } else { + $(this).fadeOut().trigger('closed.zf'); + } + }); + + $(document).on('focus.zf.trigger blur.zf.trigger', '[data-toggle-focus]', function () { + var id = $(this).data('toggle-focus'); + $('#' + id).triggerHandler('toggle.zf.trigger', [$(this)]); + }); + + /** + * Fires once after all other scripts have loaded + * @function + * @private + */ + $(window).on('load', function () { + checkListeners(); + }); + + function checkListeners() { + eventsListener(); + resizeListener(); + scrollListener(); + mutateListener(); + closemeListener(); + } + + //******** only fires this function once on load, if there's something to watch ******** + function closemeListener(pluginName) { + var yetiBoxes = $('[data-yeti-box]'), + plugNames = ['dropdown', 'tooltip', 'reveal']; + + if (pluginName) { + if (typeof pluginName === 'string') { + plugNames.push(pluginName); + } else if (typeof pluginName === 'object' && typeof pluginName[0] === 'string') { + plugNames.concat(pluginName); + } else { + console.error('Plugin names must be strings'); + } + } + if (yetiBoxes.length) { + var listeners = plugNames.map(function (name) { + return 'closeme.zf.' + name; + }).join(' '); + + $(window).off(listeners).on(listeners, function (e, pluginId) { + var plugin = e.namespace.split('.')[0]; + var plugins = $('[data-' + plugin + ']').not('[data-yeti-box="' + pluginId + '"]'); + + plugins.each(function () { + var _this = $(this); + + _this.triggerHandler('close.zf.trigger', [_this]); + }); + }); + } + } + + function resizeListener(debounce) { + var timer = void 0, + $nodes = $('[data-resize]'); + if ($nodes.length) { + $(window).off('resize.zf.trigger').on('resize.zf.trigger', function (e) { + if (timer) { + clearTimeout(timer); + } + + timer = setTimeout(function () { + + if (!MutationObserver) { + //fallback for IE 9 + $nodes.each(function () { + $(this).triggerHandler('resizeme.zf.trigger'); + }); + } + //trigger all listening elements and signal a resize event + $nodes.attr('data-events', "resize"); + }, debounce || 10); //default time to emit resize event + }); + } + } + + function scrollListener(debounce) { + var timer = void 0, + $nodes = $('[data-scroll]'); + if ($nodes.length) { + $(window).off('scroll.zf.trigger').on('scroll.zf.trigger', function (e) { + if (timer) { + clearTimeout(timer); + } + + timer = setTimeout(function () { + + if (!MutationObserver) { + //fallback for IE 9 + $nodes.each(function () { + $(this).triggerHandler('scrollme.zf.trigger'); + }); + } + //trigger all listening elements and signal a scroll event + $nodes.attr('data-events', "scroll"); + }, debounce || 10); //default time to emit scroll event + }); + } + } + + function mutateListener(debounce) { + var $nodes = $('[data-mutate]'); + if ($nodes.length && MutationObserver) { + //trigger all listening elements and signal a mutate event + //no IE 9 or 10 + $nodes.each(function () { + $(this).triggerHandler('mutateme.zf.trigger'); + }); + } + } + + function eventsListener() { + if (!MutationObserver) { + return false; + } + var nodes = document.querySelectorAll('[data-resize], [data-scroll], [data-mutate]'); + + //element callback + var listeningElementsMutation = function (mutationRecordsList) { + var $target = $(mutationRecordsList[0].target); + + //trigger the event handler for the element depending on type + switch (mutationRecordsList[0].type) { + + case "attributes": + if ($target.attr("data-events") === "scroll" && mutationRecordsList[0].attributeName === "data-events") { + $target.triggerHandler('scrollme.zf.trigger', [$target, window.pageYOffset]); + } + if ($target.attr("data-events") === "resize" && mutationRecordsList[0].attributeName === "data-events") { + $target.triggerHandler('resizeme.zf.trigger', [$target]); + } + if (mutationRecordsList[0].attributeName === "style") { + $target.closest("[data-mutate]").attr("data-events", "mutate"); + $target.closest("[data-mutate]").triggerHandler('mutateme.zf.trigger', [$target.closest("[data-mutate]")]); + } + break; + + case "childList": + $target.closest("[data-mutate]").attr("data-events", "mutate"); + $target.closest("[data-mutate]").triggerHandler('mutateme.zf.trigger', [$target.closest("[data-mutate]")]); + break; + + default: + return false; + //nothing + } + }; + + if (nodes.length) { + //for each element that needs to listen for resizing, scrolling, or mutation add a single observer + for (var i = 0; i <= nodes.length - 1; i++) { + var elementObserver = new MutationObserver(listeningElementsMutation); + elementObserver.observe(nodes[i], { attributes: true, childList: true, characterData: false, subtree: true, attributeFilter: ["data-events", "style"] }); + } + } + } + + // ------------------------------------ + + // [PH] + // Foundation.CheckWatchers = checkWatchers; + Foundation.IHearYou = checkListeners; + // Foundation.ISeeYou = scrollListener; + // Foundation.IFeelYou = closemeListener; +}(jQuery); + +// function domMutationObserver(debounce) { +// // !!! This is coming soon and needs more work; not active !!! // +// var timer, +// nodes = document.querySelectorAll('[data-mutate]'); +// // +// if (nodes.length) { +// // var MutationObserver = (function () { +// // var prefixes = ['WebKit', 'Moz', 'O', 'Ms', '']; +// // for (var i=0; i < prefixes.length; i++) { +// // if (prefixes[i] + 'MutationObserver' in window) { +// // return window[prefixes[i] + 'MutationObserver']; +// // } +// // } +// // return false; +// // }()); +// +// +// //for the body, we need to listen for all changes effecting the style and class attributes +// var bodyObserver = new MutationObserver(bodyMutation); +// bodyObserver.observe(document.body, { attributes: true, childList: true, characterData: false, subtree:true, attributeFilter:["style", "class"]}); +// +// +// //body callback +// function bodyMutation(mutate) { +// //trigger all listening elements and signal a mutation event +// if (timer) { clearTimeout(timer); } +// +// timer = setTimeout(function() { +// bodyObserver.disconnect(); +// $('[data-mutate]').attr('data-events',"mutate"); +// }, debounce || 150); +// } +// } +// } +/******************************************* + * * + * This util was created by Marius Olbertz * + * Please thank Marius on GitHub /owlbertz * + * or the web http://www.mariusolbertz.de/ * + * * + ******************************************/ + +'use strict'; + +!function ($) { + + var keyCodes = { + 9: 'TAB', + 13: 'ENTER', + 27: 'ESCAPE', + 32: 'SPACE', + 37: 'ARROW_LEFT', + 38: 'ARROW_UP', + 39: 'ARROW_RIGHT', + 40: 'ARROW_DOWN' + }; + + var commands = {}; + + var Keyboard = { + keys: getKeyCodes(keyCodes), + + /** + * Parses the (keyboard) event and returns a String that represents its key + * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE + * @param {Event} event - the event generated by the event handler + * @return String key - String that represents the key pressed + */ + parseKey: function (event) { + var key = keyCodes[event.which || event.keyCode] || String.fromCharCode(event.which).toUpperCase(); + + // Remove un-printable characters, e.g. for `fromCharCode` calls for CTRL only events + key = key.replace(/\W+/, ''); + + if (event.shiftKey) key = 'SHIFT_' + key; + if (event.ctrlKey) key = 'CTRL_' + key; + if (event.altKey) key = 'ALT_' + key; + + // Remove trailing underscore, in case only modifiers were used (e.g. only `CTRL_ALT`) + key = key.replace(/_$/, ''); + + return key; + }, + + + /** + * Handles the given (keyboard) event + * @param {Event} event - the event generated by the event handler + * @param {String} component - Foundation component's name, e.g. Slider or Reveal + * @param {Objects} functions - collection of functions that are to be executed + */ + handleKey: function (event, component, functions) { + var commandList = commands[component], + keyCode = this.parseKey(event), + cmds, + command, + fn; + + if (!commandList) return console.warn('Component not defined!'); + + if (typeof commandList.ltr === 'undefined') { + // this component does not differentiate between ltr and rtl + cmds = commandList; // use plain list + } else { + // merge ltr and rtl: if document is rtl, rtl overwrites ltr and vice versa + if (Foundation.rtl()) cmds = $.extend({}, commandList.ltr, commandList.rtl);else cmds = $.extend({}, commandList.rtl, commandList.ltr); + } + command = cmds[keyCode]; + + fn = functions[command]; + if (fn && typeof fn === 'function') { + // execute function if exists + var returnValue = fn.apply(); + if (functions.handled || typeof functions.handled === 'function') { + // execute function when event was handled + functions.handled(returnValue); + } + } else { + if (functions.unhandled || typeof functions.unhandled === 'function') { + // execute function when event was not handled + functions.unhandled(); + } + } + }, + + + /** + * Finds all focusable elements within the given `$element` + * @param {jQuery} $element - jQuery object to search within + * @return {jQuery} $focusable - all focusable elements within `$element` + */ + findFocusable: function ($element) { + if (!$element) { + return false; + } + return $element.find('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]').filter(function () { + if (!$(this).is(':visible') || $(this).attr('tabindex') < 0) { + return false; + } //only have visible elements and those that have a tabindex greater or equal 0 + return true; + }); + }, + + + /** + * Returns the component name name + * @param {Object} component - Foundation component, e.g. Slider or Reveal + * @return String componentName + */ + + register: function (componentName, cmds) { + commands[componentName] = cmds; + }, + + + /** + * Traps the focus in the given element. + * @param {jQuery} $element jQuery object to trap the foucs into. + */ + trapFocus: function ($element) { + var $focusable = Foundation.Keyboard.findFocusable($element), + $firstFocusable = $focusable.eq(0), + $lastFocusable = $focusable.eq(-1); + + $element.on('keydown.zf.trapfocus', function (event) { + if (event.target === $lastFocusable[0] && Foundation.Keyboard.parseKey(event) === 'TAB') { + event.preventDefault(); + $firstFocusable.focus(); + } else if (event.target === $firstFocusable[0] && Foundation.Keyboard.parseKey(event) === 'SHIFT_TAB') { + event.preventDefault(); + $lastFocusable.focus(); + } + }); + }, + + /** + * Releases the trapped focus from the given element. + * @param {jQuery} $element jQuery object to release the focus for. + */ + releaseFocus: function ($element) { + $element.off('keydown.zf.trapfocus'); + } + }; + + /* + * Constants for easier comparing. + * Can be used like Foundation.parseKey(event) === Foundation.keys.SPACE + */ + function getKeyCodes(kcs) { + var k = {}; + for (var kc in kcs) { + k[kcs[kc]] = kcs[kc]; + }return k; + } + + Foundation.Keyboard = Keyboard; +}(jQuery); +'use strict'; + +!function ($) { + + var Nest = { + Feather: function (menu) { + var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'zf'; + + menu.attr('role', 'menubar'); + + var items = menu.find('li').attr({ 'role': 'menuitem' }), + subMenuClass = 'is-' + type + '-submenu', + subItemClass = subMenuClass + '-item', + hasSubClass = 'is-' + type + '-submenu-parent'; + + items.each(function () { + var $item = $(this), + $sub = $item.children('ul'); + + if ($sub.length) { + $item.addClass(hasSubClass).attr({ + 'aria-haspopup': true, + 'aria-label': $item.children('a:first').text() + }); + // Note: Drilldowns behave differently in how they hide, and so need + // additional attributes. We should look if this possibly over-generalized + // utility (Nest) is appropriate when we rework menus in 6.4 + if (type === 'drilldown') { + $item.attr({ 'aria-expanded': false }); + } + + $sub.addClass('submenu ' + subMenuClass).attr({ + 'data-submenu': '', + 'role': 'menu' + }); + if (type === 'drilldown') { + $sub.attr({ 'aria-hidden': true }); + } + } + + if ($item.parent('[data-submenu]').length) { + $item.addClass('is-submenu-item ' + subItemClass); + } + }); + + return; + }, + Burn: function (menu, type) { + var //items = menu.find('li'), + subMenuClass = 'is-' + type + '-submenu', + subItemClass = subMenuClass + '-item', + hasSubClass = 'is-' + type + '-submenu-parent'; + + menu.find('>li, .menu, .menu > li').removeClass(subMenuClass + ' ' + subItemClass + ' ' + hasSubClass + ' is-submenu-item submenu is-active').removeAttr('data-submenu').css('display', ''); + + // console.log( menu.find('.' + subMenuClass + ', .' + subItemClass + ', .has-submenu, .is-submenu-item, .submenu, [data-submenu]') + // .removeClass(subMenuClass + ' ' + subItemClass + ' has-submenu is-submenu-item submenu') + // .removeAttr('data-submenu')); + // items.each(function(){ + // var $item = $(this), + // $sub = $item.children('ul'); + // if($item.parent('[data-submenu]').length){ + // $item.removeClass('is-submenu-item ' + subItemClass); + // } + // if($sub.length){ + // $item.removeClass('has-submenu'); + // $sub.removeClass('submenu ' + subMenuClass).removeAttr('data-submenu'); + // } + // }); + } + }; + + Foundation.Nest = Nest; +}(jQuery); +'use strict'; + +!function ($) { + + function Timer(elem, options, cb) { + var _this = this, + duration = options.duration, + //options is an object for easily adding features later. + nameSpace = Object.keys(elem.data())[0] || 'timer', + remain = -1, + start, + timer; + + this.isPaused = false; + + this.restart = function () { + remain = -1; + clearTimeout(timer); + this.start(); + }; + + this.start = function () { + this.isPaused = false; + // if(!elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things. + clearTimeout(timer); + remain = remain <= 0 ? duration : remain; + elem.data('paused', false); + start = Date.now(); + timer = setTimeout(function () { + if (options.infinite) { + _this.restart(); //rerun the timer. + } + if (cb && typeof cb === 'function') { + cb(); + } + }, remain); + elem.trigger('timerstart.zf.' + nameSpace); + }; + + this.pause = function () { + this.isPaused = true; + //if(elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things. + clearTimeout(timer); + elem.data('paused', true); + var end = Date.now(); + remain = remain - (end - start); + elem.trigger('timerpaused.zf.' + nameSpace); + }; + } + + /** + * Runs a callback function when images are fully loaded. + * @param {Object} images - Image(s) to check if loaded. + * @param {Func} callback - Function to execute when image is fully loaded. + */ + function onImagesLoaded(images, callback) { + var self = this, + unloaded = images.length; + + if (unloaded === 0) { + callback(); + } + + images.each(function () { + // Check if image is loaded + if (this.complete || this.readyState === 4 || this.readyState === 'complete') { + singleImageLoaded(); + } + // Force load the image + else { + // fix for IE. See https://css-tricks.com/snippets/jquery/fixing-load-in-ie-for-cached-images/ + var src = $(this).attr('src'); + $(this).attr('src', src + (src.indexOf('?') >= 0 ? '&' : '?') + new Date().getTime()); + $(this).one('load', function () { + singleImageLoaded(); + }); + } + }); + + function singleImageLoaded() { + unloaded--; + if (unloaded === 0) { + callback(); + } + } + } + + Foundation.Timer = Timer; + Foundation.onImagesLoaded = onImagesLoaded; +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * Slider module. + * @module foundation.slider + * @requires foundation.util.motion + * @requires foundation.util.triggers + * @requires foundation.util.keyboard + * @requires foundation.util.touch + */ + + var Slider = function () { + /** + * Creates a new instance of a slider control. + * @class + * @param {jQuery} element - jQuery object to make into a slider control. + * @param {Object} options - Overrides to the default plugin settings. + */ + function Slider(element, options) { + _classCallCheck(this, Slider); + + this.$element = element; + this.options = $.extend({}, Slider.defaults, this.$element.data(), options); + + this._init(); + + Foundation.registerPlugin(this, 'Slider'); + Foundation.Keyboard.register('Slider', { + 'ltr': { + 'ARROW_RIGHT': 'increase', + 'ARROW_UP': 'increase', + 'ARROW_DOWN': 'decrease', + 'ARROW_LEFT': 'decrease', + 'SHIFT_ARROW_RIGHT': 'increase_fast', + 'SHIFT_ARROW_UP': 'increase_fast', + 'SHIFT_ARROW_DOWN': 'decrease_fast', + 'SHIFT_ARROW_LEFT': 'decrease_fast' + }, + 'rtl': { + 'ARROW_LEFT': 'increase', + 'ARROW_RIGHT': 'decrease', + 'SHIFT_ARROW_LEFT': 'increase_fast', + 'SHIFT_ARROW_RIGHT': 'decrease_fast' + } + }); + } + + /** + * Initilizes the plugin by reading/setting attributes, creating collections and setting the initial position of the handle(s). + * @function + * @private + */ + + + _createClass(Slider, [{ + key: '_init', + value: function _init() { + this.inputs = this.$element.find('input'); + this.handles = this.$element.find('[data-slider-handle]'); + + this.$handle = this.handles.eq(0); + this.$input = this.inputs.length ? this.inputs.eq(0) : $('#' + this.$handle.attr('aria-controls')); + this.$fill = this.$element.find('[data-slider-fill]').css(this.options.vertical ? 'height' : 'width', 0); + + var isDbl = false, + _this = this; + if (this.options.disabled || this.$element.hasClass(this.options.disabledClass)) { + this.options.disabled = true; + this.$element.addClass(this.options.disabledClass); + } + if (!this.inputs.length) { + this.inputs = $().add(this.$input); + this.options.binding = true; + } + + this._setInitAttr(0); + + if (this.handles[1]) { + this.options.doubleSided = true; + this.$handle2 = this.handles.eq(1); + this.$input2 = this.inputs.length > 1 ? this.inputs.eq(1) : $('#' + this.$handle2.attr('aria-controls')); + + if (!this.inputs[1]) { + this.inputs = this.inputs.add(this.$input2); + } + isDbl = true; + + // this.$handle.triggerHandler('click.zf.slider'); + this._setInitAttr(1); + } + + // Set handle positions + this.setHandles(); + + this._events(); + } + }, { + key: 'setHandles', + value: function setHandles() { + var _this2 = this; + + if (this.handles[1]) { + this._setHandlePos(this.$handle, this.inputs.eq(0).val(), true, function () { + _this2._setHandlePos(_this2.$handle2, _this2.inputs.eq(1).val(), true); + }); + } else { + this._setHandlePos(this.$handle, this.inputs.eq(0).val(), true); + } + } + }, { + key: '_reflow', + value: function _reflow() { + this.setHandles(); + } + /** + * @function + * @private + * @param {Number} value - floating point (the value) to be transformed using to a relative position on the slider (the inverse of _value) + */ + + }, { + key: '_pctOfBar', + value: function _pctOfBar(value) { + var pctOfBar = percent(value - this.options.start, this.options.end - this.options.start); + + switch (this.options.positionValueFunction) { + case "pow": + pctOfBar = this._logTransform(pctOfBar); + break; + case "log": + pctOfBar = this._powTransform(pctOfBar); + break; + } + + return pctOfBar.toFixed(2); + } + + /** + * @function + * @private + * @param {Number} pctOfBar - floating point, the relative position of the slider (typically between 0-1) to be transformed to a value + */ + + }, { + key: '_value', + value: function _value(pctOfBar) { + switch (this.options.positionValueFunction) { + case "pow": + pctOfBar = this._powTransform(pctOfBar); + break; + case "log": + pctOfBar = this._logTransform(pctOfBar); + break; + } + var value = (this.options.end - this.options.start) * pctOfBar + this.options.start; + + return value; + } + + /** + * @function + * @private + * @param {Number} value - floating point (typically between 0-1) to be transformed using the log function + */ + + }, { + key: '_logTransform', + value: function _logTransform(value) { + return baseLog(this.options.nonLinearBase, value * (this.options.nonLinearBase - 1) + 1); + } + + /** + * @function + * @private + * @param {Number} value - floating point (typically between 0-1) to be transformed using the power function + */ + + }, { + key: '_powTransform', + value: function _powTransform(value) { + return (Math.pow(this.options.nonLinearBase, value) - 1) / (this.options.nonLinearBase - 1); + } + + /** + * Sets the position of the selected handle and fill bar. + * @function + * @private + * @param {jQuery} $hndl - the selected handle to move. + * @param {Number} location - floating point between the start and end values of the slider bar. + * @param {Function} cb - callback function to fire on completion. + * @fires Slider#moved + * @fires Slider#changed + */ + + }, { + key: '_setHandlePos', + value: function _setHandlePos($hndl, location, noInvert, cb) { + // don't move if the slider has been disabled since its initialization + if (this.$element.hasClass(this.options.disabledClass)) { + return; + } + //might need to alter that slightly for bars that will have odd number selections. + location = parseFloat(location); //on input change events, convert string to number...grumble. + + // prevent slider from running out of bounds, if value exceeds the limits set through options, override the value to min/max + if (location < this.options.start) { + location = this.options.start; + } else if (location > this.options.end) { + location = this.options.end; + } + + var isDbl = this.options.doubleSided; + + if (isDbl) { + //this block is to prevent 2 handles from crossing eachother. Could/should be improved. + if (this.handles.index($hndl) === 0) { + var h2Val = parseFloat(this.$handle2.attr('aria-valuenow')); + location = location >= h2Val ? h2Val - this.options.step : location; + } else { + var h1Val = parseFloat(this.$handle.attr('aria-valuenow')); + location = location <= h1Val ? h1Val + this.options.step : location; + } + } + + //this is for single-handled vertical sliders, it adjusts the value to account for the slider being "upside-down" + //for click and drag events, it's weird due to the scale(-1, 1) css property + if (this.options.vertical && !noInvert) { + location = this.options.end - location; + } + + var _this = this, + vert = this.options.vertical, + hOrW = vert ? 'height' : 'width', + lOrT = vert ? 'top' : 'left', + handleDim = $hndl[0].getBoundingClientRect()[hOrW], + elemDim = this.$element[0].getBoundingClientRect()[hOrW], + + //percentage of bar min/max value based on click or drag point + pctOfBar = this._pctOfBar(location), + + //number of actual pixels to shift the handle, based on the percentage obtained above + pxToMove = (elemDim - handleDim) * pctOfBar, + + //percentage of bar to shift the handle + movement = (percent(pxToMove, elemDim) * 100).toFixed(this.options.decimal); + //fixing the decimal value for the location number, is passed to other methods as a fixed floating-point value + location = parseFloat(location.toFixed(this.options.decimal)); + // declare empty object for css adjustments, only used with 2 handled-sliders + var css = {}; + + this._setValues($hndl, location); + + // TODO update to calculate based on values set to respective inputs?? + if (isDbl) { + var isLeftHndl = this.handles.index($hndl) === 0, + + //empty variable, will be used for min-height/width for fill bar + dim, + + //percentage w/h of the handle compared to the slider bar + handlePct = ~~(percent(handleDim, elemDim) * 100); + //if left handle, the math is slightly different than if it's the right handle, and the left/top property needs to be changed for the fill bar + if (isLeftHndl) { + //left or top percentage value to apply to the fill bar. + css[lOrT] = movement + '%'; + //calculate the new min-height/width for the fill bar. + dim = parseFloat(this.$handle2[0].style[lOrT]) - movement + handlePct; + //this callback is necessary to prevent errors and allow the proper placement and initialization of a 2-handled slider + //plus, it means we don't care if 'dim' isNaN on init, it won't be in the future. + if (cb && typeof cb === 'function') { + cb(); + } //this is only needed for the initialization of 2 handled sliders + } else { + //just caching the value of the left/bottom handle's left/top property + var handlePos = parseFloat(this.$handle[0].style[lOrT]); + //calculate the new min-height/width for the fill bar. Use isNaN to prevent false positives for numbers <= 0 + //based on the percentage of movement of the handle being manipulated, less the opposing handle's left/top position, plus the percentage w/h of the handle itself + dim = movement - (isNaN(handlePos) ? (this.options.initialStart - this.options.start) / ((this.options.end - this.options.start) / 100) : handlePos) + handlePct; + } + // assign the min-height/width to our css object + css['min-' + hOrW] = dim + '%'; + } + + this.$element.one('finished.zf.animate', function () { + /** + * Fires when the handle is done moving. + * @event Slider#moved + */ + _this.$element.trigger('moved.zf.slider', [$hndl]); + }); + + //because we don't know exactly how the handle will be moved, check the amount of time it should take to move. + var moveTime = this.$element.data('dragging') ? 1000 / 60 : this.options.moveTime; + + Foundation.Move(moveTime, $hndl, function () { + // adjusting the left/top property of the handle, based on the percentage calculated above + // if movement isNaN, that is because the slider is hidden and we cannot determine handle width, + // fall back to next best guess. + if (isNaN(movement)) { + $hndl.css(lOrT, pctOfBar * 100 + '%'); + } else { + $hndl.css(lOrT, movement + '%'); + } + + if (!_this.options.doubleSided) { + //if single-handled, a simple method to expand the fill bar + _this.$fill.css(hOrW, pctOfBar * 100 + '%'); + } else { + //otherwise, use the css object we created above + _this.$fill.css(css); + } + }); + + /** + * Fires when the value has not been change for a given time. + * @event Slider#changed + */ + clearTimeout(_this.timeout); + _this.timeout = setTimeout(function () { + _this.$element.trigger('changed.zf.slider', [$hndl]); + }, _this.options.changedDelay); + } + + /** + * Sets the initial attribute for the slider element. + * @function + * @private + * @param {Number} idx - index of the current handle/input to use. + */ + + }, { + key: '_setInitAttr', + value: function _setInitAttr(idx) { + var initVal = idx === 0 ? this.options.initialStart : this.options.initialEnd; + var id = this.inputs.eq(idx).attr('id') || Foundation.GetYoDigits(6, 'slider'); + this.inputs.eq(idx).attr({ + 'id': id, + 'max': this.options.end, + 'min': this.options.start, + 'step': this.options.step + }); + this.inputs.eq(idx).val(initVal); + this.handles.eq(idx).attr({ + 'role': 'slider', + 'aria-controls': id, + 'aria-valuemax': this.options.end, + 'aria-valuemin': this.options.start, + 'aria-valuenow': initVal, + 'aria-orientation': this.options.vertical ? 'vertical' : 'horizontal', + 'tabindex': 0 + }); + } + + /** + * Sets the input and `aria-valuenow` values for the slider element. + * @function + * @private + * @param {jQuery} $handle - the currently selected handle. + * @param {Number} val - floating point of the new value. + */ + + }, { + key: '_setValues', + value: function _setValues($handle, val) { + var idx = this.options.doubleSided ? this.handles.index($handle) : 0; + this.inputs.eq(idx).val(val); + $handle.attr('aria-valuenow', val); + } + + /** + * Handles events on the slider element. + * Calculates the new location of the current handle. + * If there are two handles and the bar was clicked, it determines which handle to move. + * @function + * @private + * @param {Object} e - the `event` object passed from the listener. + * @param {jQuery} $handle - the current handle to calculate for, if selected. + * @param {Number} val - floating point number for the new value of the slider. + * TODO clean this up, there's a lot of repeated code between this and the _setHandlePos fn. + */ + + }, { + key: '_handleEvent', + value: function _handleEvent(e, $handle, val) { + var value, hasVal; + if (!val) { + //click or drag events + e.preventDefault(); + var _this = this, + vertical = this.options.vertical, + param = vertical ? 'height' : 'width', + direction = vertical ? 'top' : 'left', + eventOffset = vertical ? e.pageY : e.pageX, + halfOfHandle = this.$handle[0].getBoundingClientRect()[param] / 2, + barDim = this.$element[0].getBoundingClientRect()[param], + windowScroll = vertical ? $(window).scrollTop() : $(window).scrollLeft(); + + var elemOffset = this.$element.offset()[direction]; + + // touch events emulated by the touch util give position relative to screen, add window.scroll to event coordinates... + // best way to guess this is simulated is if clientY == pageY + if (e.clientY === e.pageY) { + eventOffset = eventOffset + windowScroll; + } + var eventFromBar = eventOffset - elemOffset; + var barXY; + if (eventFromBar < 0) { + barXY = 0; + } else if (eventFromBar > barDim) { + barXY = barDim; + } else { + barXY = eventFromBar; + } + var offsetPct = percent(barXY, barDim); + + value = this._value(offsetPct); + + // turn everything around for RTL, yay math! + if (Foundation.rtl() && !this.options.vertical) { + value = this.options.end - value; + } + + value = _this._adjustValue(null, value); + //boolean flag for the setHandlePos fn, specifically for vertical sliders + hasVal = false; + + if (!$handle) { + //figure out which handle it is, pass it to the next function. + var firstHndlPos = absPosition(this.$handle, direction, barXY, param), + secndHndlPos = absPosition(this.$handle2, direction, barXY, param); + $handle = firstHndlPos <= secndHndlPos ? this.$handle : this.$handle2; + } + } else { + //change event on input + value = this._adjustValue(null, val); + hasVal = true; + } + + this._setHandlePos($handle, value, hasVal); + } + + /** + * Adjustes value for handle in regard to step value. returns adjusted value + * @function + * @private + * @param {jQuery} $handle - the selected handle. + * @param {Number} value - value to adjust. used if $handle is falsy + */ + + }, { + key: '_adjustValue', + value: function _adjustValue($handle, value) { + var val, + step = this.options.step, + div = parseFloat(step / 2), + left, + prev_val, + next_val; + if (!!$handle) { + val = parseFloat($handle.attr('aria-valuenow')); + } else { + val = value; + } + left = val % step; + prev_val = val - left; + next_val = prev_val + step; + if (left === 0) { + return val; + } + val = val >= prev_val + div ? next_val : prev_val; + return val; + } + + /** + * Adds event listeners to the slider elements. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + this._eventsForHandle(this.$handle); + if (this.handles[1]) { + this._eventsForHandle(this.$handle2); + } + } + + /** + * Adds event listeners a particular handle + * @function + * @private + * @param {jQuery} $handle - the current handle to apply listeners to. + */ + + }, { + key: '_eventsForHandle', + value: function _eventsForHandle($handle) { + var _this = this, + curHandle, + timer; + + this.inputs.off('change.zf.slider').on('change.zf.slider', function (e) { + var idx = _this.inputs.index($(this)); + _this._handleEvent(e, _this.handles.eq(idx), $(this).val()); + }); + + if (this.options.clickSelect) { + this.$element.off('click.zf.slider').on('click.zf.slider', function (e) { + if (_this.$element.data('dragging')) { + return false; + } + + if (!$(e.target).is('[data-slider-handle]')) { + if (_this.options.doubleSided) { + _this._handleEvent(e); + } else { + _this._handleEvent(e, _this.$handle); + } + } + }); + } + + if (this.options.draggable) { + this.handles.addTouch(); + + var $body = $('body'); + $handle.off('mousedown.zf.slider').on('mousedown.zf.slider', function (e) { + $handle.addClass('is-dragging'); + _this.$fill.addClass('is-dragging'); // + _this.$element.data('dragging', true); + + curHandle = $(e.currentTarget); + + $body.on('mousemove.zf.slider', function (e) { + e.preventDefault(); + _this._handleEvent(e, curHandle); + }).on('mouseup.zf.slider', function (e) { + _this._handleEvent(e, curHandle); + + $handle.removeClass('is-dragging'); + _this.$fill.removeClass('is-dragging'); + _this.$element.data('dragging', false); + + $body.off('mousemove.zf.slider mouseup.zf.slider'); + }); + }) + // prevent events triggered by touch + .on('selectstart.zf.slider touchmove.zf.slider', function (e) { + e.preventDefault(); + }); + } + + $handle.off('keydown.zf.slider').on('keydown.zf.slider', function (e) { + var _$handle = $(this), + idx = _this.options.doubleSided ? _this.handles.index(_$handle) : 0, + oldValue = parseFloat(_this.inputs.eq(idx).val()), + newValue; + + // handle keyboard event with keyboard util + Foundation.Keyboard.handleKey(e, 'Slider', { + decrease: function () { + newValue = oldValue - _this.options.step; + }, + increase: function () { + newValue = oldValue + _this.options.step; + }, + decrease_fast: function () { + newValue = oldValue - _this.options.step * 10; + }, + increase_fast: function () { + newValue = oldValue + _this.options.step * 10; + }, + handled: function () { + // only set handle pos when event was handled specially + e.preventDefault(); + _this._setHandlePos(_$handle, newValue, true); + } + }); + /*if (newValue) { // if pressed key has special function, update value + e.preventDefault(); + _this._setHandlePos(_$handle, newValue); + }*/ + }); + } + + /** + * Destroys the slider plugin. + */ + + }, { + key: 'destroy', + value: function destroy() { + this.handles.off('.zf.slider'); + this.inputs.off('.zf.slider'); + this.$element.off('.zf.slider'); + + clearTimeout(this.timeout); + + Foundation.unregisterPlugin(this); + } + }]); + + return Slider; + }(); + + Slider.defaults = { + /** + * Minimum value for the slider scale. + * @option + * @type {number} + * @default 0 + */ + start: 0, + /** + * Maximum value for the slider scale. + * @option + * @type {number} + * @default 100 + */ + end: 100, + /** + * Minimum value change per change event. + * @option + * @type {number} + * @default 1 + */ + step: 1, + /** + * Value at which the handle/input *(left handle/first input)* should be set to on initialization. + * @option + * @type {number} + * @default 0 + */ + initialStart: 0, + /** + * Value at which the right handle/second input should be set to on initialization. + * @option + * @type {number} + * @default 100 + */ + initialEnd: 100, + /** + * Allows the input to be located outside the container and visible. Set to by the JS + * @option + * @type {boolean} + * @default false + */ + binding: false, + /** + * Allows the user to click/tap on the slider bar to select a value. + * @option + * @type {boolean} + * @default true + */ + clickSelect: true, + /** + * Set to true and use the `vertical` class to change alignment to vertical. + * @option + * @type {boolean} + * @default false + */ + vertical: false, + /** + * Allows the user to drag the slider handle(s) to select a value. + * @option + * @type {boolean} + * @default true + */ + draggable: true, + /** + * Disables the slider and prevents event listeners from being applied. Double checked by JS with `disabledClass`. + * @option + * @type {boolean} + * @default false + */ + disabled: false, + /** + * Allows the use of two handles. Double checked by the JS. Changes some logic handling. + * @option + * @type {boolean} + * @default false + */ + doubleSided: false, + /** + * Potential future feature. + */ + // steps: 100, + /** + * Number of decimal places the plugin should go to for floating point precision. + * @option + * @type {number} + * @default 2 + */ + decimal: 2, + /** + * Time delay for dragged elements. + */ + // dragDelay: 0, + /** + * Time, in ms, to animate the movement of a slider handle if user clicks/taps on the bar. Needs to be manually set if updating the transition time in the Sass settings. + * @option + * @type {number} + * @default 200 + */ + moveTime: 200, //update this if changing the transition time in the sass + /** + * Class applied to disabled sliders. + * @option + * @type {string} + * @default 'disabled' + */ + disabledClass: 'disabled', + /** + * Will invert the default layout for a vertical slider. + * @option + * @type {boolean} + * @default false + */ + invertVertical: false, + /** + * Milliseconds before the `changed.zf-slider` event is triggered after value change. + * @option + * @type {number} + * @default 500 + */ + changedDelay: 500, + /** + * Basevalue for non-linear sliders + * @option + * @type {number} + * @default 5 + */ + nonLinearBase: 5, + /** + * Basevalue for non-linear sliders, possible values are: `'linear'`, `'pow'` & `'log'`. Pow and Log use the nonLinearBase setting. + * @option + * @type {string} + * @default 'linear' + */ + positionValueFunction: 'linear' + }; + + function percent(frac, num) { + return frac / num; + } + function absPosition($handle, dir, clickPos, param) { + return Math.abs($handle.position()[dir] + $handle[param]() / 2 - clickPos); + } + function baseLog(base, value) { + return Math.log(value) / Math.log(base); + } + + // Window exports + Foundation.plugin(Slider, 'Slider'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * Drilldown module. + * @module foundation.drilldown + * @requires foundation.util.keyboard + * @requires foundation.util.motion + * @requires foundation.util.nest + */ + + var Drilldown = function () { + /** + * Creates a new instance of a drilldown menu. + * @class + * @param {jQuery} element - jQuery object to make into an accordion menu. + * @param {Object} options - Overrides to the default plugin settings. + */ + function Drilldown(element, options) { + _classCallCheck(this, Drilldown); + + this.$element = element; + this.options = $.extend({}, Drilldown.defaults, this.$element.data(), options); + + Foundation.Nest.Feather(this.$element, 'drilldown'); + + this._init(); + + Foundation.registerPlugin(this, 'Drilldown'); + Foundation.Keyboard.register('Drilldown', { + 'ENTER': 'open', + 'SPACE': 'open', + 'ARROW_RIGHT': 'next', + 'ARROW_UP': 'up', + 'ARROW_DOWN': 'down', + 'ARROW_LEFT': 'previous', + 'ESCAPE': 'close', + 'TAB': 'down', + 'SHIFT_TAB': 'up' + }); + } + + /** + * Initializes the drilldown by creating jQuery collections of elements + * @private + */ + + + _createClass(Drilldown, [{ + key: '_init', + value: function _init() { + this.$submenuAnchors = this.$element.find('li.is-drilldown-submenu-parent').children('a'); + this.$submenus = this.$submenuAnchors.parent('li').children('[data-submenu]'); + this.$menuItems = this.$element.find('li').not('.js-drilldown-back').attr('role', 'menuitem').find('a'); + this.$element.attr('data-mutate', this.$element.attr('data-drilldown') || Foundation.GetYoDigits(6, 'drilldown')); + + this._prepareMenu(); + this._registerEvents(); + + this._keyboardEvents(); + } + + /** + * prepares drilldown menu by setting attributes to links and elements + * sets a min height to prevent content jumping + * wraps the element if not already wrapped + * @private + * @function + */ + + }, { + key: '_prepareMenu', + value: function _prepareMenu() { + var _this = this; + // if(!this.options.holdOpen){ + // this._menuLinkEvents(); + // } + this.$submenuAnchors.each(function () { + var $link = $(this); + var $sub = $link.parent(); + if (_this.options.parentLink) { + $link.clone().prependTo($sub.children('[data-submenu]')).wrap('
          4. '); + } + $link.data('savedHref', $link.attr('href')).removeAttr('href').attr('tabindex', 0); + $link.children('[data-submenu]').attr({ + 'aria-hidden': true, + 'tabindex': 0, + 'role': 'menu' + }); + _this._events($link); + }); + this.$submenus.each(function () { + var $menu = $(this), + $back = $menu.find('.js-drilldown-back'); + if (!$back.length) { + switch (_this.options.backButtonPosition) { + case "bottom": + $menu.append(_this.options.backButton); + break; + case "top": + $menu.prepend(_this.options.backButton); + break; + default: + console.error("Unsupported backButtonPosition value '" + _this.options.backButtonPosition + "'"); + } + } + _this._back($menu); + }); + + this.$submenus.addClass('invisible'); + if (!this.options.autoHeight) { + this.$submenus.addClass('drilldown-submenu-cover-previous'); + } + + // create a wrapper on element if it doesn't exist. + if (!this.$element.parent().hasClass('is-drilldown')) { + this.$wrapper = $(this.options.wrapper).addClass('is-drilldown'); + if (this.options.animateHeight) this.$wrapper.addClass('animate-height'); + this.$element.wrap(this.$wrapper); + } + // set wrapper + this.$wrapper = this.$element.parent(); + this.$wrapper.css(this._getMaxDims()); + } + }, { + key: '_resize', + value: function _resize() { + this.$wrapper.css({ 'max-width': 'none', 'min-height': 'none' }); + // _getMaxDims has side effects (boo) but calling it should update all other necessary heights & widths + this.$wrapper.css(this._getMaxDims()); + } + + /** + * Adds event handlers to elements in the menu. + * @function + * @private + * @param {jQuery} $elem - the current menu item to add handlers to. + */ + + }, { + key: '_events', + value: function _events($elem) { + var _this = this; + + $elem.off('click.zf.drilldown').on('click.zf.drilldown', function (e) { + if ($(e.target).parentsUntil('ul', 'li').hasClass('is-drilldown-submenu-parent')) { + e.stopImmediatePropagation(); + e.preventDefault(); + } + + // if(e.target !== e.currentTarget.firstElementChild){ + // return false; + // } + _this._show($elem.parent('li')); + + if (_this.options.closeOnClick) { + var $body = $('body'); + $body.off('.zf.drilldown').on('click.zf.drilldown', function (e) { + if (e.target === _this.$element[0] || $.contains(_this.$element[0], e.target)) { + return; + } + e.preventDefault(); + _this._hideAll(); + $body.off('.zf.drilldown'); + }); + } + }); + this.$element.on('mutateme.zf.trigger', this._resize.bind(this)); + } + + /** + * Adds event handlers to the menu element. + * @function + * @private + */ + + }, { + key: '_registerEvents', + value: function _registerEvents() { + if (this.options.scrollTop) { + this._bindHandler = this._scrollTop.bind(this); + this.$element.on('open.zf.drilldown hide.zf.drilldown closed.zf.drilldown', this._bindHandler); + } + } + + /** + * Scroll to Top of Element or data-scroll-top-element + * @function + * @fires Drilldown#scrollme + */ + + }, { + key: '_scrollTop', + value: function _scrollTop() { + var _this = this; + var $scrollTopElement = _this.options.scrollTopElement != '' ? $(_this.options.scrollTopElement) : _this.$element, + scrollPos = parseInt($scrollTopElement.offset().top + _this.options.scrollTopOffset); + $('html, body').stop(true).animate({ scrollTop: scrollPos }, _this.options.animationDuration, _this.options.animationEasing, function () { + /** + * Fires after the menu has scrolled + * @event Drilldown#scrollme + */ + if (this === $('html')[0]) _this.$element.trigger('scrollme.zf.drilldown'); + }); + } + + /** + * Adds keydown event listener to `li`'s in the menu. + * @private + */ + + }, { + key: '_keyboardEvents', + value: function _keyboardEvents() { + var _this = this; + + this.$menuItems.add(this.$element.find('.js-drilldown-back > a, .is-submenu-parent-item > a')).on('keydown.zf.drilldown', function (e) { + var $element = $(this), + $elements = $element.parent('li').parent('ul').children('li').children('a'), + $prevElement, + $nextElement; + + $elements.each(function (i) { + if ($(this).is($element)) { + $prevElement = $elements.eq(Math.max(0, i - 1)); + $nextElement = $elements.eq(Math.min(i + 1, $elements.length - 1)); + return; + } + }); + + Foundation.Keyboard.handleKey(e, 'Drilldown', { + next: function () { + if ($element.is(_this.$submenuAnchors)) { + _this._show($element.parent('li')); + $element.parent('li').one(Foundation.transitionend($element), function () { + $element.parent('li').find('ul li a').filter(_this.$menuItems).first().focus(); + }); + return true; + } + }, + previous: function () { + _this._hide($element.parent('li').parent('ul')); + $element.parent('li').parent('ul').one(Foundation.transitionend($element), function () { + setTimeout(function () { + $element.parent('li').parent('ul').parent('li').children('a').first().focus(); + }, 1); + }); + return true; + }, + up: function () { + $prevElement.focus(); + // Don't tap focus on first element in root ul + return !$element.is(_this.$element.find('> li:first-child > a')); + }, + down: function () { + $nextElement.focus(); + // Don't tap focus on last element in root ul + return !$element.is(_this.$element.find('> li:last-child > a')); + }, + close: function () { + // Don't close on element in root ul + if (!$element.is(_this.$element.find('> li > a'))) { + _this._hide($element.parent().parent()); + $element.parent().parent().siblings('a').focus(); + } + }, + open: function () { + if (!$element.is(_this.$menuItems)) { + // not menu item means back button + _this._hide($element.parent('li').parent('ul')); + $element.parent('li').parent('ul').one(Foundation.transitionend($element), function () { + setTimeout(function () { + $element.parent('li').parent('ul').parent('li').children('a').first().focus(); + }, 1); + }); + return true; + } else if ($element.is(_this.$submenuAnchors)) { + _this._show($element.parent('li')); + $element.parent('li').one(Foundation.transitionend($element), function () { + $element.parent('li').find('ul li a').filter(_this.$menuItems).first().focus(); + }); + return true; + } + }, + handled: function (preventDefault) { + if (preventDefault) { + e.preventDefault(); + } + e.stopImmediatePropagation(); + } + }); + }); // end keyboardAccess + } + + /** + * Closes all open elements, and returns to root menu. + * @function + * @fires Drilldown#closed + */ + + }, { + key: '_hideAll', + value: function _hideAll() { + var $elem = this.$element.find('.is-drilldown-submenu.is-active').addClass('is-closing'); + if (this.options.autoHeight) this.$wrapper.css({ height: $elem.parent().closest('ul').data('calcHeight') }); + $elem.one(Foundation.transitionend($elem), function (e) { + $elem.removeClass('is-active is-closing'); + }); + /** + * Fires when the menu is fully closed. + * @event Drilldown#closed + */ + this.$element.trigger('closed.zf.drilldown'); + } + + /** + * Adds event listener for each `back` button, and closes open menus. + * @function + * @fires Drilldown#back + * @param {jQuery} $elem - the current sub-menu to add `back` event. + */ + + }, { + key: '_back', + value: function _back($elem) { + var _this = this; + $elem.off('click.zf.drilldown'); + $elem.children('.js-drilldown-back').on('click.zf.drilldown', function (e) { + e.stopImmediatePropagation(); + // console.log('mouseup on back'); + _this._hide($elem); + + // If there is a parent submenu, call show + var parentSubMenu = $elem.parent('li').parent('ul').parent('li'); + if (parentSubMenu.length) { + _this._show(parentSubMenu); + } + }); + } + + /** + * Adds event listener to menu items w/o submenus to close open menus on click. + * @function + * @private + */ + + }, { + key: '_menuLinkEvents', + value: function _menuLinkEvents() { + var _this = this; + this.$menuItems.not('.is-drilldown-submenu-parent').off('click.zf.drilldown').on('click.zf.drilldown', function (e) { + // e.stopImmediatePropagation(); + setTimeout(function () { + _this._hideAll(); + }, 0); + }); + } + + /** + * Opens a submenu. + * @function + * @fires Drilldown#open + * @param {jQuery} $elem - the current element with a submenu to open, i.e. the `li` tag. + */ + + }, { + key: '_show', + value: function _show($elem) { + if (this.options.autoHeight) this.$wrapper.css({ height: $elem.children('[data-submenu]').data('calcHeight') }); + $elem.attr('aria-expanded', true); + $elem.children('[data-submenu]').addClass('is-active').removeClass('invisible').attr('aria-hidden', false); + /** + * Fires when the submenu has opened. + * @event Drilldown#open + */ + this.$element.trigger('open.zf.drilldown', [$elem]); + } + }, { + key: '_hide', + + + /** + * Hides a submenu + * @function + * @fires Drilldown#hide + * @param {jQuery} $elem - the current sub-menu to hide, i.e. the `ul` tag. + */ + value: function _hide($elem) { + if (this.options.autoHeight) this.$wrapper.css({ height: $elem.parent().closest('ul').data('calcHeight') }); + var _this = this; + $elem.parent('li').attr('aria-expanded', false); + $elem.attr('aria-hidden', true).addClass('is-closing'); + $elem.addClass('is-closing').one(Foundation.transitionend($elem), function () { + $elem.removeClass('is-active is-closing'); + $elem.blur().addClass('invisible'); + }); + /** + * Fires when the submenu has closed. + * @event Drilldown#hide + */ + $elem.trigger('hide.zf.drilldown', [$elem]); + } + + /** + * Iterates through the nested menus to calculate the min-height, and max-width for the menu. + * Prevents content jumping. + * @function + * @private + */ + + }, { + key: '_getMaxDims', + value: function _getMaxDims() { + var maxHeight = 0, + result = {}, + _this = this; + this.$submenus.add(this.$element).each(function () { + var numOfElems = $(this).children('li').length; + var height = Foundation.Box.GetDimensions(this).height; + maxHeight = height > maxHeight ? height : maxHeight; + if (_this.options.autoHeight) { + $(this).data('calcHeight', height); + if (!$(this).hasClass('is-drilldown-submenu')) result['height'] = height; + } + }); + + if (!this.options.autoHeight) result['min-height'] = maxHeight + 'px'; + + result['max-width'] = this.$element[0].getBoundingClientRect().width + 'px'; + + return result; + } + + /** + * Destroys the Drilldown Menu + * @function + */ + + }, { + key: 'destroy', + value: function destroy() { + if (this.options.scrollTop) this.$element.off('.zf.drilldown', this._bindHandler); + this._hideAll(); + this.$element.off('mutateme.zf.trigger'); + Foundation.Nest.Burn(this.$element, 'drilldown'); + this.$element.unwrap().find('.js-drilldown-back, .is-submenu-parent-item').remove().end().find('.is-active, .is-closing, .is-drilldown-submenu').removeClass('is-active is-closing is-drilldown-submenu').end().find('[data-submenu]').removeAttr('aria-hidden tabindex role'); + this.$submenuAnchors.each(function () { + $(this).off('.zf.drilldown'); + }); + + this.$submenus.removeClass('drilldown-submenu-cover-previous'); + + this.$element.find('a').each(function () { + var $link = $(this); + $link.removeAttr('tabindex'); + if ($link.data('savedHref')) { + $link.attr('href', $link.data('savedHref')).removeData('savedHref'); + } else { + return; + } + }); + Foundation.unregisterPlugin(this); + } + }]); + + return Drilldown; + }(); + + Drilldown.defaults = { + /** + * Markup used for JS generated back button. Prepended or appended (see backButtonPosition) to submenu lists and deleted on `destroy` method, 'js-drilldown-back' class required. Remove the backslash (`\`) if copy and pasting. + * @option + * @type {string} + * @default '
          5. Back
          6. ' + */ + backButton: '
          7. Back
          8. ', + /** + * Position the back button either at the top or bottom of drilldown submenus. Can be `'left'` or `'bottom'`. + * @option + * @type {string} + * @default top + */ + backButtonPosition: 'top', + /** + * Markup used to wrap drilldown menu. Use a class name for independent styling; the JS applied class: `is-drilldown` is required. Remove the backslash (`\`) if copy and pasting. + * @option + * @type {string} + * @default '
            ' + */ + wrapper: '
            ', + /** + * Adds the parent link to the submenu. + * @option + * @type {boolean} + * @default false + */ + parentLink: false, + /** + * Allow the menu to return to root list on body click. + * @option + * @type {boolean} + * @default false + */ + closeOnClick: false, + /** + * Allow the menu to auto adjust height. + * @option + * @type {boolean} + * @default false + */ + autoHeight: false, + /** + * Animate the auto adjust height. + * @option + * @type {boolean} + * @default false + */ + animateHeight: false, + /** + * Scroll to the top of the menu after opening a submenu or navigating back using the menu back button + * @option + * @type {boolean} + * @default false + */ + scrollTop: false, + /** + * String jquery selector (for example 'body') of element to take offset().top from, if empty string the drilldown menu offset().top is taken + * @option + * @type {string} + * @default '' + */ + scrollTopElement: '', + /** + * ScrollTop offset + * @option + * @type {number} + * @default 0 + */ + scrollTopOffset: 0, + /** + * Scroll animation duration + * @option + * @type {number} + * @default 500 + */ + animationDuration: 500, + /** + * Scroll animation easing. Can be `'swing'` or `'linear'`. + * @option + * @type {string} + * @see {@link https://api.jquery.com/animate|JQuery animate} + * @default 'swing' + */ + animationEasing: 'swing' + // holdOpen: false + }; + + // Window exports + Foundation.plugin(Drilldown, 'Drilldown'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * AccordionMenu module. + * @module foundation.accordionMenu + * @requires foundation.util.keyboard + * @requires foundation.util.motion + * @requires foundation.util.nest + */ + + var AccordionMenu = function () { + /** + * Creates a new instance of an accordion menu. + * @class + * @fires AccordionMenu#init + * @param {jQuery} element - jQuery object to make into an accordion menu. + * @param {Object} options - Overrides to the default plugin settings. + */ + function AccordionMenu(element, options) { + _classCallCheck(this, AccordionMenu); + + this.$element = element; + this.options = $.extend({}, AccordionMenu.defaults, this.$element.data(), options); + + Foundation.Nest.Feather(this.$element, 'accordion'); + + this._init(); + + Foundation.registerPlugin(this, 'AccordionMenu'); + Foundation.Keyboard.register('AccordionMenu', { + 'ENTER': 'toggle', + 'SPACE': 'toggle', + 'ARROW_RIGHT': 'open', + 'ARROW_UP': 'up', + 'ARROW_DOWN': 'down', + 'ARROW_LEFT': 'close', + 'ESCAPE': 'closeAll' + }); + } + + /** + * Initializes the accordion menu by hiding all nested menus. + * @private + */ + + + _createClass(AccordionMenu, [{ + key: '_init', + value: function _init() { + this.$element.find('[data-submenu]').not('.is-active').slideUp(0); //.find('a').css('padding-left', '1rem'); + this.$element.attr({ + 'role': 'menu', + 'aria-multiselectable': this.options.multiOpen + }); + + this.$menuLinks = this.$element.find('.is-accordion-submenu-parent'); + this.$menuLinks.each(function () { + var linkId = this.id || Foundation.GetYoDigits(6, 'acc-menu-link'), + $elem = $(this), + $sub = $elem.children('[data-submenu]'), + subId = $sub[0].id || Foundation.GetYoDigits(6, 'acc-menu'), + isActive = $sub.hasClass('is-active'); + $elem.attr({ + 'aria-controls': subId, + 'aria-expanded': isActive, + 'role': 'menuitem', + 'id': linkId + }); + $sub.attr({ + 'aria-labelledby': linkId, + 'aria-hidden': !isActive, + 'role': 'menu', + 'id': subId + }); + }); + var initPanes = this.$element.find('.is-active'); + if (initPanes.length) { + var _this = this; + initPanes.each(function () { + _this.down($(this)); + }); + } + this._events(); + } + + /** + * Adds event handlers for items within the menu. + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + + this.$element.find('li').each(function () { + var $submenu = $(this).children('[data-submenu]'); + + if ($submenu.length) { + $(this).children('a').off('click.zf.accordionMenu').on('click.zf.accordionMenu', function (e) { + e.preventDefault(); + + _this.toggle($submenu); + }); + } + }).on('keydown.zf.accordionmenu', function (e) { + var $element = $(this), + $elements = $element.parent('ul').children('li'), + $prevElement, + $nextElement, + $target = $element.children('[data-submenu]'); + + $elements.each(function (i) { + if ($(this).is($element)) { + $prevElement = $elements.eq(Math.max(0, i - 1)).find('a').first(); + $nextElement = $elements.eq(Math.min(i + 1, $elements.length - 1)).find('a').first(); + + if ($(this).children('[data-submenu]:visible').length) { + // has open sub menu + $nextElement = $element.find('li:first-child').find('a').first(); + } + if ($(this).is(':first-child')) { + // is first element of sub menu + $prevElement = $element.parents('li').first().find('a').first(); + } else if ($prevElement.parents('li').first().children('[data-submenu]:visible').length) { + // if previous element has open sub menu + $prevElement = $prevElement.parents('li').find('li:last-child').find('a').first(); + } + if ($(this).is(':last-child')) { + // is last element of sub menu + $nextElement = $element.parents('li').first().next('li').find('a').first(); + } + + return; + } + }); + + Foundation.Keyboard.handleKey(e, 'AccordionMenu', { + open: function () { + if ($target.is(':hidden')) { + _this.down($target); + $target.find('li').first().find('a').first().focus(); + } + }, + close: function () { + if ($target.length && !$target.is(':hidden')) { + // close active sub of this item + _this.up($target); + } else if ($element.parent('[data-submenu]').length) { + // close currently open sub + _this.up($element.parent('[data-submenu]')); + $element.parents('li').first().find('a').first().focus(); + } + }, + up: function () { + $prevElement.focus(); + return true; + }, + down: function () { + $nextElement.focus(); + return true; + }, + toggle: function () { + if ($element.children('[data-submenu]').length) { + _this.toggle($element.children('[data-submenu]')); + } + }, + closeAll: function () { + _this.hideAll(); + }, + handled: function (preventDefault) { + if (preventDefault) { + e.preventDefault(); + } + e.stopImmediatePropagation(); + } + }); + }); //.attr('tabindex', 0); + } + + /** + * Closes all panes of the menu. + * @function + */ + + }, { + key: 'hideAll', + value: function hideAll() { + this.up(this.$element.find('[data-submenu]')); + } + + /** + * Opens all panes of the menu. + * @function + */ + + }, { + key: 'showAll', + value: function showAll() { + this.down(this.$element.find('[data-submenu]')); + } + + /** + * Toggles the open/close state of a submenu. + * @function + * @param {jQuery} $target - the submenu to toggle + */ + + }, { + key: 'toggle', + value: function toggle($target) { + if (!$target.is(':animated')) { + if (!$target.is(':hidden')) { + this.up($target); + } else { + this.down($target); + } + } + } + + /** + * Opens the sub-menu defined by `$target`. + * @param {jQuery} $target - Sub-menu to open. + * @fires AccordionMenu#down + */ + + }, { + key: 'down', + value: function down($target) { + var _this = this; + + if (!this.options.multiOpen) { + this.up(this.$element.find('.is-active').not($target.parentsUntil(this.$element).add($target))); + } + + $target.addClass('is-active').attr({ 'aria-hidden': false }).parent('.is-accordion-submenu-parent').attr({ 'aria-expanded': true }); + + //Foundation.Move(this.options.slideSpeed, $target, function() { + $target.slideDown(_this.options.slideSpeed, function () { + /** + * Fires when the menu is done opening. + * @event AccordionMenu#down + */ + _this.$element.trigger('down.zf.accordionMenu', [$target]); + }); + //}); + } + + /** + * Closes the sub-menu defined by `$target`. All sub-menus inside the target will be closed as well. + * @param {jQuery} $target - Sub-menu to close. + * @fires AccordionMenu#up + */ + + }, { + key: 'up', + value: function up($target) { + var _this = this; + //Foundation.Move(this.options.slideSpeed, $target, function(){ + $target.slideUp(_this.options.slideSpeed, function () { + /** + * Fires when the menu is done collapsing up. + * @event AccordionMenu#up + */ + _this.$element.trigger('up.zf.accordionMenu', [$target]); + }); + //}); + + var $menus = $target.find('[data-submenu]').slideUp(0).addBack().attr('aria-hidden', true); + + $menus.parent('.is-accordion-submenu-parent').attr('aria-expanded', false); + } + + /** + * Destroys an instance of accordion menu. + * @fires AccordionMenu#destroyed + */ + + }, { + key: 'destroy', + value: function destroy() { + this.$element.find('[data-submenu]').slideDown(0).css('display', ''); + this.$element.find('a').off('click.zf.accordionMenu'); + + Foundation.Nest.Burn(this.$element, 'accordion'); + Foundation.unregisterPlugin(this); + } + }]); + + return AccordionMenu; + }(); + + AccordionMenu.defaults = { + /** + * Amount of time to animate the opening of a submenu in ms. + * @option + * @type {number} + * @default 250 + */ + slideSpeed: 250, + /** + * Allow the menu to have multiple open panes. + * @option + * @type {boolean} + * @default true + */ + multiOpen: true + }; + + // Window exports + Foundation.plugin(AccordionMenu, 'AccordionMenu'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * DropdownMenu module. + * @module foundation.dropdown-menu + * @requires foundation.util.keyboard + * @requires foundation.util.box + * @requires foundation.util.nest + */ + + var DropdownMenu = function () { + /** + * Creates a new instance of DropdownMenu. + * @class + * @fires DropdownMenu#init + * @param {jQuery} element - jQuery object to make into a dropdown menu. + * @param {Object} options - Overrides to the default plugin settings. + */ + function DropdownMenu(element, options) { + _classCallCheck(this, DropdownMenu); + + this.$element = element; + this.options = $.extend({}, DropdownMenu.defaults, this.$element.data(), options); + + Foundation.Nest.Feather(this.$element, 'dropdown'); + this._init(); + + Foundation.registerPlugin(this, 'DropdownMenu'); + Foundation.Keyboard.register('DropdownMenu', { + 'ENTER': 'open', + 'SPACE': 'open', + 'ARROW_RIGHT': 'next', + 'ARROW_UP': 'up', + 'ARROW_DOWN': 'down', + 'ARROW_LEFT': 'previous', + 'ESCAPE': 'close' + }); + } + + /** + * Initializes the plugin, and calls _prepareMenu + * @private + * @function + */ + + + _createClass(DropdownMenu, [{ + key: '_init', + value: function _init() { + var subs = this.$element.find('li.is-dropdown-submenu-parent'); + this.$element.children('.is-dropdown-submenu-parent').children('.is-dropdown-submenu').addClass('first-sub'); + + this.$menuItems = this.$element.find('[role="menuitem"]'); + this.$tabs = this.$element.children('[role="menuitem"]'); + this.$tabs.find('ul.is-dropdown-submenu').addClass(this.options.verticalClass); + + if (this.$element.hasClass(this.options.rightClass) || this.options.alignment === 'right' || Foundation.rtl() || this.$element.parents('.top-bar-right').is('*')) { + this.options.alignment = 'right'; + subs.addClass('opens-left'); + } else { + subs.addClass('opens-right'); + } + this.changed = false; + this._events(); + } + }, { + key: '_isVertical', + value: function _isVertical() { + return this.$tabs.css('display') === 'block'; + } + + /** + * Adds event listeners to elements within the menu + * @private + * @function + */ + + }, { + key: '_events', + value: function _events() { + var _this = this, + hasTouch = 'ontouchstart' in window || typeof window.ontouchstart !== 'undefined', + parClass = 'is-dropdown-submenu-parent'; + + // used for onClick and in the keyboard handlers + var handleClickFn = function (e) { + var $elem = $(e.target).parentsUntil('ul', '.' + parClass), + hasSub = $elem.hasClass(parClass), + hasClicked = $elem.attr('data-is-click') === 'true', + $sub = $elem.children('.is-dropdown-submenu'); + + if (hasSub) { + if (hasClicked) { + if (!_this.options.closeOnClick || !_this.options.clickOpen && !hasTouch || _this.options.forceFollow && hasTouch) { + return; + } else { + e.stopImmediatePropagation(); + e.preventDefault(); + _this._hide($elem); + } + } else { + e.preventDefault(); + e.stopImmediatePropagation(); + _this._show($sub); + $elem.add($elem.parentsUntil(_this.$element, '.' + parClass)).attr('data-is-click', true); + } + } + }; + + if (this.options.clickOpen || hasTouch) { + this.$menuItems.on('click.zf.dropdownmenu touchstart.zf.dropdownmenu', handleClickFn); + } + + // Handle Leaf element Clicks + if (_this.options.closeOnClickInside) { + this.$menuItems.on('click.zf.dropdownmenu', function (e) { + var $elem = $(this), + hasSub = $elem.hasClass(parClass); + if (!hasSub) { + _this._hide(); + } + }); + } + + if (!this.options.disableHover) { + this.$menuItems.on('mouseenter.zf.dropdownmenu', function (e) { + var $elem = $(this), + hasSub = $elem.hasClass(parClass); + + if (hasSub) { + clearTimeout($elem.data('_delay')); + $elem.data('_delay', setTimeout(function () { + _this._show($elem.children('.is-dropdown-submenu')); + }, _this.options.hoverDelay)); + } + }).on('mouseleave.zf.dropdownmenu', function (e) { + var $elem = $(this), + hasSub = $elem.hasClass(parClass); + if (hasSub && _this.options.autoclose) { + if ($elem.attr('data-is-click') === 'true' && _this.options.clickOpen) { + return false; + } + + clearTimeout($elem.data('_delay')); + $elem.data('_delay', setTimeout(function () { + _this._hide($elem); + }, _this.options.closingTime)); + } + }); + } + this.$menuItems.on('keydown.zf.dropdownmenu', function (e) { + var $element = $(e.target).parentsUntil('ul', '[role="menuitem"]'), + isTab = _this.$tabs.index($element) > -1, + $elements = isTab ? _this.$tabs : $element.siblings('li').add($element), + $prevElement, + $nextElement; + + $elements.each(function (i) { + if ($(this).is($element)) { + $prevElement = $elements.eq(i - 1); + $nextElement = $elements.eq(i + 1); + return; + } + }); + + var nextSibling = function () { + if (!$element.is(':last-child')) { + $nextElement.children('a:first').focus(); + e.preventDefault(); + } + }, + prevSibling = function () { + $prevElement.children('a:first').focus(); + e.preventDefault(); + }, + openSub = function () { + var $sub = $element.children('ul.is-dropdown-submenu'); + if ($sub.length) { + _this._show($sub); + $element.find('li > a:first').focus(); + e.preventDefault(); + } else { + return; + } + }, + closeSub = function () { + //if ($element.is(':first-child')) { + var close = $element.parent('ul').parent('li'); + close.children('a:first').focus(); + _this._hide(close); + e.preventDefault(); + //} + }; + var functions = { + open: openSub, + close: function () { + _this._hide(_this.$element); + _this.$menuItems.find('a:first').focus(); // focus to first element + e.preventDefault(); + }, + handled: function () { + e.stopImmediatePropagation(); + } + }; + + if (isTab) { + if (_this._isVertical()) { + // vertical menu + if (Foundation.rtl()) { + // right aligned + $.extend(functions, { + down: nextSibling, + up: prevSibling, + next: closeSub, + previous: openSub + }); + } else { + // left aligned + $.extend(functions, { + down: nextSibling, + up: prevSibling, + next: openSub, + previous: closeSub + }); + } + } else { + // horizontal menu + if (Foundation.rtl()) { + // right aligned + $.extend(functions, { + next: prevSibling, + previous: nextSibling, + down: openSub, + up: closeSub + }); + } else { + // left aligned + $.extend(functions, { + next: nextSibling, + previous: prevSibling, + down: openSub, + up: closeSub + }); + } + } + } else { + // not tabs -> one sub + if (Foundation.rtl()) { + // right aligned + $.extend(functions, { + next: closeSub, + previous: openSub, + down: nextSibling, + up: prevSibling + }); + } else { + // left aligned + $.extend(functions, { + next: openSub, + previous: closeSub, + down: nextSibling, + up: prevSibling + }); + } + } + Foundation.Keyboard.handleKey(e, 'DropdownMenu', functions); + }); + } + + /** + * Adds an event handler to the body to close any dropdowns on a click. + * @function + * @private + */ + + }, { + key: '_addBodyHandler', + value: function _addBodyHandler() { + var $body = $(document.body), + _this = this; + $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu').on('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu', function (e) { + var $link = _this.$element.find(e.target); + if ($link.length) { + return; + } + + _this._hide(); + $body.off('mouseup.zf.dropdownmenu touchend.zf.dropdownmenu'); + }); + } + + /** + * Opens a dropdown pane, and checks for collisions first. + * @param {jQuery} $sub - ul element that is a submenu to show + * @function + * @private + * @fires DropdownMenu#show + */ + + }, { + key: '_show', + value: function _show($sub) { + var idx = this.$tabs.index(this.$tabs.filter(function (i, el) { + return $(el).find($sub).length > 0; + })); + var $sibs = $sub.parent('li.is-dropdown-submenu-parent').siblings('li.is-dropdown-submenu-parent'); + this._hide($sibs, idx); + $sub.css('visibility', 'hidden').addClass('js-dropdown-active').parent('li.is-dropdown-submenu-parent').addClass('is-active'); + var clear = Foundation.Box.ImNotTouchingYou($sub, null, true); + if (!clear) { + var oldClass = this.options.alignment === 'left' ? '-right' : '-left', + $parentLi = $sub.parent('.is-dropdown-submenu-parent'); + $parentLi.removeClass('opens' + oldClass).addClass('opens-' + this.options.alignment); + clear = Foundation.Box.ImNotTouchingYou($sub, null, true); + if (!clear) { + $parentLi.removeClass('opens-' + this.options.alignment).addClass('opens-inner'); + } + this.changed = true; + } + $sub.css('visibility', ''); + if (this.options.closeOnClick) { + this._addBodyHandler(); + } + /** + * Fires when the new dropdown pane is visible. + * @event DropdownMenu#show + */ + this.$element.trigger('show.zf.dropdownmenu', [$sub]); + } + + /** + * Hides a single, currently open dropdown pane, if passed a parameter, otherwise, hides everything. + * @function + * @param {jQuery} $elem - element with a submenu to hide + * @param {Number} idx - index of the $tabs collection to hide + * @private + */ + + }, { + key: '_hide', + value: function _hide($elem, idx) { + var $toClose; + if ($elem && $elem.length) { + $toClose = $elem; + } else if (idx !== undefined) { + $toClose = this.$tabs.not(function (i, el) { + return i === idx; + }); + } else { + $toClose = this.$element; + } + var somethingToClose = $toClose.hasClass('is-active') || $toClose.find('.is-active').length > 0; + + if (somethingToClose) { + $toClose.find('li.is-active').add($toClose).attr({ + 'data-is-click': false + }).removeClass('is-active'); + + $toClose.find('ul.js-dropdown-active').removeClass('js-dropdown-active'); + + if (this.changed || $toClose.find('opens-inner').length) { + var oldClass = this.options.alignment === 'left' ? 'right' : 'left'; + $toClose.find('li.is-dropdown-submenu-parent').add($toClose).removeClass('opens-inner opens-' + this.options.alignment).addClass('opens-' + oldClass); + this.changed = false; + } + /** + * Fires when the open menus are closed. + * @event DropdownMenu#hide + */ + this.$element.trigger('hide.zf.dropdownmenu', [$toClose]); + } + } + + /** + * Destroys the plugin. + * @function + */ + + }, { + key: 'destroy', + value: function destroy() { + this.$menuItems.off('.zf.dropdownmenu').removeAttr('data-is-click').removeClass('is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner'); + $(document.body).off('.zf.dropdownmenu'); + Foundation.Nest.Burn(this.$element, 'dropdown'); + Foundation.unregisterPlugin(this); + } + }]); + + return DropdownMenu; + }(); + + /** + * Default settings for plugin + */ + + + DropdownMenu.defaults = { + /** + * Disallows hover events from opening submenus + * @option + * @type {boolean} + * @default false + */ + disableHover: false, + /** + * Allow a submenu to automatically close on a mouseleave event, if not clicked open. + * @option + * @type {boolean} + * @default true + */ + autoclose: true, + /** + * Amount of time to delay opening a submenu on hover event. + * @option + * @type {number} + * @default 50 + */ + hoverDelay: 50, + /** + * Allow a submenu to open/remain open on parent click event. Allows cursor to move away from menu. + * @option + * @type {boolean} + * @default false + */ + clickOpen: false, + /** + * Amount of time to delay closing a submenu on a mouseleave event. + * @option + * @type {number} + * @default 500 + */ + + closingTime: 500, + /** + * Position of the menu relative to what direction the submenus should open. Handled by JS. Can be `'left'` or `'right'`. + * @option + * @type {string} + * @default 'left' + */ + alignment: 'left', + /** + * Allow clicks on the body to close any open submenus. + * @option + * @type {boolean} + * @default true + */ + closeOnClick: true, + /** + * Allow clicks on leaf anchor links to close any open submenus. + * @option + * @type {boolean} + * @default true + */ + closeOnClickInside: true, + /** + * Class applied to vertical oriented menus, Foundation default is `vertical`. Update this if using your own class. + * @option + * @type {string} + * @default 'vertical' + */ + verticalClass: 'vertical', + /** + * Class applied to right-side oriented menus, Foundation default is `align-right`. Update this if using your own class. + * @option + * @type {string} + * @default 'align-right' + */ + rightClass: 'align-right', + /** + * Boolean to force overide the clicking of links to perform default action, on second touch event for mobile. + * @option + * @type {boolean} + * @default true + */ + forceFollow: true + }; + + // Window exports + Foundation.plugin(DropdownMenu, 'DropdownMenu'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * Magellan module. + * @module foundation.magellan + */ + + var Magellan = function () { + /** + * Creates a new instance of Magellan. + * @class + * @fires Magellan#init + * @param {Object} element - jQuery object to add the trigger to. + * @param {Object} options - Overrides to the default plugin settings. + */ + function Magellan(element, options) { + _classCallCheck(this, Magellan); + + this.$element = element; + this.options = $.extend({}, Magellan.defaults, this.$element.data(), options); + + this._init(); + this.calcPoints(); + + Foundation.registerPlugin(this, 'Magellan'); + } + + /** + * Initializes the Magellan plugin and calls functions to get equalizer functioning on load. + * @private + */ + + + _createClass(Magellan, [{ + key: '_init', + value: function _init() { + var id = this.$element[0].id || Foundation.GetYoDigits(6, 'magellan'); + var _this = this; + this.$targets = $('[data-magellan-target]'); + this.$links = this.$element.find('a'); + this.$element.attr({ + 'data-resize': id, + 'data-scroll': id, + 'id': id + }); + this.$active = $(); + this.scrollPos = parseInt(window.pageYOffset, 10); + + this._events(); + } + + /** + * Calculates an array of pixel values that are the demarcation lines between locations on the page. + * Can be invoked if new elements are added or the size of a location changes. + * @function + */ + + }, { + key: 'calcPoints', + value: function calcPoints() { + var _this = this, + body = document.body, + html = document.documentElement; + + this.points = []; + this.winHeight = Math.round(Math.max(window.innerHeight, html.clientHeight)); + this.docHeight = Math.round(Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight)); + + this.$targets.each(function () { + var $tar = $(this), + pt = Math.round($tar.offset().top - _this.options.threshold); + $tar.targetPoint = pt; + _this.points.push(pt); + }); + } + + /** + * Initializes events for Magellan. + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this, + $body = $('html, body'), + opts = { + duration: _this.options.animationDuration, + easing: _this.options.animationEasing + }; + $(window).one('load', function () { + if (_this.options.deepLinking) { + if (location.hash) { + _this.scrollToLoc(location.hash); + } + } + _this.calcPoints(); + _this._updateActive(); + }); + + this.$element.on({ + 'resizeme.zf.trigger': this.reflow.bind(this), + 'scrollme.zf.trigger': this._updateActive.bind(this) + }).on('click.zf.magellan', 'a[href^="#"]', function (e) { + e.preventDefault(); + var arrival = this.getAttribute('href'); + _this.scrollToLoc(arrival); + }); + $(window).on('popstate', function (e) { + if (_this.options.deepLinking) { + _this.scrollToLoc(window.location.hash); + } + }); + } + + /** + * Function to scroll to a given location on the page. + * @param {String} loc - a properly formatted jQuery id selector. Example: '#foo' + * @function + */ + + }, { + key: 'scrollToLoc', + value: function scrollToLoc(loc) { + // Do nothing if target does not exist to prevent errors + if (!$(loc).length) { + return false; + } + this._inTransition = true; + var _this = this, + scrollPos = Math.round($(loc).offset().top - this.options.threshold / 2 - this.options.barOffset); + + $('html, body').stop(true).animate({ scrollTop: scrollPos }, this.options.animationDuration, this.options.animationEasing, function () { + _this._inTransition = false;_this._updateActive(); + }); + } + + /** + * Calls necessary functions to update Magellan upon DOM change + * @function + */ + + }, { + key: 'reflow', + value: function reflow() { + this.calcPoints(); + this._updateActive(); + } + + /** + * Updates the visibility of an active location link, and updates the url hash for the page, if deepLinking enabled. + * @private + * @function + * @fires Magellan#update + */ + + }, { + key: '_updateActive', + value: function _updateActive() /*evt, elem, scrollPos*/{ + if (this._inTransition) { + return; + } + var winPos = /*scrollPos ||*/parseInt(window.pageYOffset, 10), + curIdx; + + if (winPos + this.winHeight === this.docHeight) { + curIdx = this.points.length - 1; + } else if (winPos < this.points[0]) { + curIdx = undefined; + } else { + var isDown = this.scrollPos < winPos, + _this = this, + curVisible = this.points.filter(function (p, i) { + return isDown ? p - _this.options.barOffset <= winPos : p - _this.options.barOffset - _this.options.threshold <= winPos; + }); + curIdx = curVisible.length ? curVisible.length - 1 : 0; + } + + this.$active.removeClass(this.options.activeClass); + this.$active = this.$links.filter('[href="#' + this.$targets.eq(curIdx).data('magellan-target') + '"]').addClass(this.options.activeClass); + + if (this.options.deepLinking) { + var hash = ""; + if (curIdx != undefined) { + hash = this.$active[0].getAttribute('href'); + } + if (hash !== window.location.hash) { + if (window.history.pushState) { + window.history.pushState(null, null, hash); + } else { + window.location.hash = hash; + } + } + } + + this.scrollPos = winPos; + /** + * Fires when magellan is finished updating to the new active element. + * @event Magellan#update + */ + this.$element.trigger('update.zf.magellan', [this.$active]); + } + + /** + * Destroys an instance of Magellan and resets the url of the window. + * @function + */ + + }, { + key: 'destroy', + value: function destroy() { + this.$element.off('.zf.trigger .zf.magellan').find('.' + this.options.activeClass).removeClass(this.options.activeClass); + + if (this.options.deepLinking) { + var hash = this.$active[0].getAttribute('href'); + window.location.hash.replace(hash, ''); + } + + Foundation.unregisterPlugin(this); + } + }]); + + return Magellan; + }(); + + /** + * Default settings for plugin + */ + + + Magellan.defaults = { + /** + * Amount of time, in ms, the animated scrolling should take between locations. + * @option + * @type {number} + * @default 500 + */ + animationDuration: 500, + /** + * Animation style to use when scrolling between locations. Can be `'swing'` or `'linear'`. + * @option + * @type {string} + * @default 'linear' + * @see {@link https://api.jquery.com/animate|Jquery animate} + */ + animationEasing: 'linear', + /** + * Number of pixels to use as a marker for location changes. + * @option + * @type {number} + * @default 50 + */ + threshold: 50, + /** + * Class applied to the active locations link on the magellan container. + * @option + * @type {string} + * @default 'active' + */ + activeClass: 'active', + /** + * Allows the script to manipulate the url of the current page, and if supported, alter the history. + * @option + * @type {boolean} + * @default false + */ + deepLinking: false, + /** + * Number of pixels to offset the scroll of the page on item click if using a sticky nav bar. + * @option + * @type {number} + * @default 0 + */ + barOffset: 0 + }; + + // Window exports + Foundation.plugin(Magellan, 'Magellan'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * ResponsiveMenu module. + * @module foundation.responsiveMenu + * @requires foundation.util.triggers + * @requires foundation.util.mediaQuery + */ + + var ResponsiveMenu = function () { + /** + * Creates a new instance of a responsive menu. + * @class + * @fires ResponsiveMenu#init + * @param {jQuery} element - jQuery object to make into a dropdown menu. + * @param {Object} options - Overrides to the default plugin settings. + */ + function ResponsiveMenu(element, options) { + _classCallCheck(this, ResponsiveMenu); + + this.$element = $(element); + this.rules = this.$element.data('responsive-menu'); + this.currentMq = null; + this.currentPlugin = null; + + this._init(); + this._events(); + + Foundation.registerPlugin(this, 'ResponsiveMenu'); + } + + /** + * Initializes the Menu by parsing the classes from the 'data-ResponsiveMenu' attribute on the element. + * @function + * @private + */ + + + _createClass(ResponsiveMenu, [{ + key: '_init', + value: function _init() { + // The first time an Interchange plugin is initialized, this.rules is converted from a string of "classes" to an object of rules + if (typeof this.rules === 'string') { + var rulesTree = {}; + + // Parse rules from "classes" pulled from data attribute + var rules = this.rules.split(' '); + + // Iterate through every rule found + for (var i = 0; i < rules.length; i++) { + var rule = rules[i].split('-'); + var ruleSize = rule.length > 1 ? rule[0] : 'small'; + var rulePlugin = rule.length > 1 ? rule[1] : rule[0]; + + if (MenuPlugins[rulePlugin] !== null) { + rulesTree[ruleSize] = MenuPlugins[rulePlugin]; + } + } + + this.rules = rulesTree; + } + + if (!$.isEmptyObject(this.rules)) { + this._checkMediaQueries(); + } + // Add data-mutate since children may need it. + this.$element.attr('data-mutate', this.$element.attr('data-mutate') || Foundation.GetYoDigits(6, 'responsive-menu')); + } + + /** + * Initializes events for the Menu. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + + $(window).on('changed.zf.mediaquery', function () { + _this._checkMediaQueries(); + }); + // $(window).on('resize.zf.ResponsiveMenu', function() { + // _this._checkMediaQueries(); + // }); + } + + /** + * Checks the current screen width against available media queries. If the media query has changed, and the plugin needed has changed, the plugins will swap out. + * @function + * @private + */ + + }, { + key: '_checkMediaQueries', + value: function _checkMediaQueries() { + var matchedMq, + _this = this; + // Iterate through each rule and find the last matching rule + $.each(this.rules, function (key) { + if (Foundation.MediaQuery.atLeast(key)) { + matchedMq = key; + } + }); + + // No match? No dice + if (!matchedMq) return; + + // Plugin already initialized? We good + if (this.currentPlugin instanceof this.rules[matchedMq].plugin) return; + + // Remove existing plugin-specific CSS classes + $.each(MenuPlugins, function (key, value) { + _this.$element.removeClass(value.cssClass); + }); + + // Add the CSS class for the new plugin + this.$element.addClass(this.rules[matchedMq].cssClass); + + // Create an instance of the new plugin + if (this.currentPlugin) this.currentPlugin.destroy(); + this.currentPlugin = new this.rules[matchedMq].plugin(this.$element, {}); + } + + /** + * Destroys the instance of the current plugin on this element, as well as the window resize handler that switches the plugins out. + * @function + */ + + }, { + key: 'destroy', + value: function destroy() { + this.currentPlugin.destroy(); + $(window).off('.zf.ResponsiveMenu'); + Foundation.unregisterPlugin(this); + } + }]); + + return ResponsiveMenu; + }(); + + ResponsiveMenu.defaults = {}; + + // The plugin matches the plugin classes with these plugin instances. + var MenuPlugins = { + dropdown: { + cssClass: 'dropdown', + plugin: Foundation._plugins['dropdown-menu'] || null + }, + drilldown: { + cssClass: 'drilldown', + plugin: Foundation._plugins['drilldown'] || null + }, + accordion: { + cssClass: 'accordion-menu', + plugin: Foundation._plugins['accordion-menu'] || null + } + }; + + // Window exports + Foundation.plugin(ResponsiveMenu, 'ResponsiveMenu'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * Accordion module. + * @module foundation.accordion + * @requires foundation.util.keyboard + * @requires foundation.util.motion + */ + + var Accordion = function () { + /** + * Creates a new instance of an accordion. + * @class + * @fires Accordion#init + * @param {jQuery} element - jQuery object to make into an accordion. + * @param {Object} options - a plain object with settings to override the default options. + */ + function Accordion(element, options) { + _classCallCheck(this, Accordion); + + this.$element = element; + this.options = $.extend({}, Accordion.defaults, this.$element.data(), options); + + this._init(); + + Foundation.registerPlugin(this, 'Accordion'); + Foundation.Keyboard.register('Accordion', { + 'ENTER': 'toggle', + 'SPACE': 'toggle', + 'ARROW_DOWN': 'next', + 'ARROW_UP': 'previous' + }); + } + + /** + * Initializes the accordion by animating the preset active pane(s). + * @private + */ + + + _createClass(Accordion, [{ + key: '_init', + value: function _init() { + this.$element.attr('role', 'tablist'); + this.$tabs = this.$element.children('[data-accordion-item]'); + + this.$tabs.each(function (idx, el) { + var $el = $(el), + $content = $el.children('[data-tab-content]'), + id = $content[0].id || Foundation.GetYoDigits(6, 'accordion'), + linkId = el.id || id + '-label'; + + $el.find('a:first').attr({ + 'aria-controls': id, + 'role': 'tab', + 'id': linkId, + 'aria-expanded': false, + 'aria-selected': false + }); + + $content.attr({ 'role': 'tabpanel', 'aria-labelledby': linkId, 'aria-hidden': true, 'id': id }); + }); + var $initActive = this.$element.find('.is-active').children('[data-tab-content]'); + if ($initActive.length) { + this.down($initActive, true); + } + this._events(); + } + + /** + * Adds event handlers for items within the accordion. + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + + this.$tabs.each(function () { + var $elem = $(this); + var $tabContent = $elem.children('[data-tab-content]'); + if ($tabContent.length) { + $elem.children('a').off('click.zf.accordion keydown.zf.accordion').on('click.zf.accordion', function (e) { + e.preventDefault(); + _this.toggle($tabContent); + }).on('keydown.zf.accordion', function (e) { + Foundation.Keyboard.handleKey(e, 'Accordion', { + toggle: function () { + _this.toggle($tabContent); + }, + next: function () { + var $a = $elem.next().find('a').focus(); + if (!_this.options.multiExpand) { + $a.trigger('click.zf.accordion'); + } + }, + previous: function () { + var $a = $elem.prev().find('a').focus(); + if (!_this.options.multiExpand) { + $a.trigger('click.zf.accordion'); + } + }, + handled: function () { + e.preventDefault(); + e.stopPropagation(); + } + }); + }); + } + }); + } + + /** + * Toggles the selected content pane's open/close state. + * @param {jQuery} $target - jQuery object of the pane to toggle (`.accordion-content`). + * @function + */ + + }, { + key: 'toggle', + value: function toggle($target) { + if ($target.parent().hasClass('is-active')) { + this.up($target); + } else { + this.down($target); + } + } + + /** + * Opens the accordion tab defined by `$target`. + * @param {jQuery} $target - Accordion pane to open (`.accordion-content`). + * @param {Boolean} firstTime - flag to determine if reflow should happen. + * @fires Accordion#down + * @function + */ + + }, { + key: 'down', + value: function down($target, firstTime) { + var _this2 = this; + + $target.attr('aria-hidden', false).parent('[data-tab-content]').addBack().parent().addClass('is-active'); + + if (!this.options.multiExpand && !firstTime) { + var $currentActive = this.$element.children('.is-active').children('[data-tab-content]'); + if ($currentActive.length) { + this.up($currentActive.not($target)); + } + } + + $target.slideDown(this.options.slideSpeed, function () { + /** + * Fires when the tab is done opening. + * @event Accordion#down + */ + _this2.$element.trigger('down.zf.accordion', [$target]); + }); + + $('#' + $target.attr('aria-labelledby')).attr({ + 'aria-expanded': true, + 'aria-selected': true + }); + } + + /** + * Closes the tab defined by `$target`. + * @param {jQuery} $target - Accordion tab to close (`.accordion-content`). + * @fires Accordion#up + * @function + */ + + }, { + key: 'up', + value: function up($target) { + var $aunts = $target.parent().siblings(), + _this = this; + + if (!this.options.allowAllClosed && !$aunts.hasClass('is-active') || !$target.parent().hasClass('is-active')) { + return; + } + + // Foundation.Move(this.options.slideSpeed, $target, function(){ + $target.slideUp(_this.options.slideSpeed, function () { + /** + * Fires when the tab is done collapsing up. + * @event Accordion#up + */ + _this.$element.trigger('up.zf.accordion', [$target]); + }); + // }); + + $target.attr('aria-hidden', true).parent().removeClass('is-active'); + + $('#' + $target.attr('aria-labelledby')).attr({ + 'aria-expanded': false, + 'aria-selected': false + }); + } + + /** + * Destroys an instance of an accordion. + * @fires Accordion#destroyed + * @function + */ + + }, { + key: 'destroy', + value: function destroy() { + this.$element.find('[data-tab-content]').stop(true).slideUp(0).css('display', ''); + this.$element.find('a').off('.zf.accordion'); + + Foundation.unregisterPlugin(this); + } + }]); + + return Accordion; + }(); + + Accordion.defaults = { + /** + * Amount of time to animate the opening of an accordion pane. + * @option + * @type {number} + * @default 250 + */ + slideSpeed: 250, + /** + * Allow the accordion to have multiple open panes. + * @option + * @type {boolean} + * @default false + */ + multiExpand: false, + /** + * Allow the accordion to close all panes. + * @option + * @type {boolean} + * @default false + */ + allowAllClosed: false + }; + + // Window exports + Foundation.plugin(Accordion, 'Accordion'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * Dropdown module. + * @module foundation.dropdown + * @requires foundation.util.keyboard + * @requires foundation.util.box + * @requires foundation.util.triggers + */ + + var Dropdown = function () { + /** + * Creates a new instance of a dropdown. + * @class + * @param {jQuery} element - jQuery object to make into a dropdown. + * Object should be of the dropdown panel, rather than its anchor. + * @param {Object} options - Overrides to the default plugin settings. + */ + function Dropdown(element, options) { + _classCallCheck(this, Dropdown); + + this.$element = element; + this.options = $.extend({}, Dropdown.defaults, this.$element.data(), options); + this._init(); + + Foundation.registerPlugin(this, 'Dropdown'); + Foundation.Keyboard.register('Dropdown', { + 'ENTER': 'open', + 'SPACE': 'open', + 'ESCAPE': 'close' + }); + } + + /** + * Initializes the plugin by setting/checking options and attributes, adding helper variables, and saving the anchor. + * @function + * @private + */ + + + _createClass(Dropdown, [{ + key: '_init', + value: function _init() { + var $id = this.$element.attr('id'); + + this.$anchor = $('[data-toggle="' + $id + '"]').length ? $('[data-toggle="' + $id + '"]') : $('[data-open="' + $id + '"]'); + this.$anchor.attr({ + 'aria-controls': $id, + 'data-is-focus': false, + 'data-yeti-box': $id, + 'aria-haspopup': true, + 'aria-expanded': false + + }); + + if (this.options.parentClass) { + this.$parent = this.$element.parents('.' + this.options.parentClass); + } else { + this.$parent = null; + } + this.options.positionClass = this.getPositionClass(); + this.counter = 4; + this.usedPositions = []; + this.$element.attr({ + 'aria-hidden': 'true', + 'data-yeti-box': $id, + 'data-resize': $id, + 'aria-labelledby': this.$anchor[0].id || Foundation.GetYoDigits(6, 'dd-anchor') + }); + this._events(); + } + + /** + * Helper function to determine current orientation of dropdown pane. + * @function + * @returns {String} position - string value of a position class. + */ + + }, { + key: 'getPositionClass', + value: function getPositionClass() { + var verticalPosition = this.$element[0].className.match(/(top|left|right|bottom)/g); + verticalPosition = verticalPosition ? verticalPosition[0] : ''; + var horizontalPosition = /float-(\S+)/.exec(this.$anchor[0].className); + horizontalPosition = horizontalPosition ? horizontalPosition[1] : ''; + var position = horizontalPosition ? horizontalPosition + ' ' + verticalPosition : verticalPosition; + + return position; + } + + /** + * Adjusts the dropdown panes orientation by adding/removing positioning classes. + * @function + * @private + * @param {String} position - position class to remove. + */ + + }, { + key: '_reposition', + value: function _reposition(position) { + this.usedPositions.push(position ? position : 'bottom'); + //default, try switching to opposite side + if (!position && this.usedPositions.indexOf('top') < 0) { + this.$element.addClass('top'); + } else if (position === 'top' && this.usedPositions.indexOf('bottom') < 0) { + this.$element.removeClass(position); + } else if (position === 'left' && this.usedPositions.indexOf('right') < 0) { + this.$element.removeClass(position).addClass('right'); + } else if (position === 'right' && this.usedPositions.indexOf('left') < 0) { + this.$element.removeClass(position).addClass('left'); + } + + //if default change didn't work, try bottom or left first + else if (!position && this.usedPositions.indexOf('top') > -1 && this.usedPositions.indexOf('left') < 0) { + this.$element.addClass('left'); + } else if (position === 'top' && this.usedPositions.indexOf('bottom') > -1 && this.usedPositions.indexOf('left') < 0) { + this.$element.removeClass(position).addClass('left'); + } else if (position === 'left' && this.usedPositions.indexOf('right') > -1 && this.usedPositions.indexOf('bottom') < 0) { + this.$element.removeClass(position); + } else if (position === 'right' && this.usedPositions.indexOf('left') > -1 && this.usedPositions.indexOf('bottom') < 0) { + this.$element.removeClass(position); + } + //if nothing cleared, set to bottom + else { + this.$element.removeClass(position); + } + this.classChanged = true; + this.counter--; + } + + /** + * Sets the position and orientation of the dropdown pane, checks for collisions. + * Recursively calls itself if a collision is detected, with a new position class. + * @function + * @private + */ + + }, { + key: '_setPosition', + value: function _setPosition() { + if (this.$anchor.attr('aria-expanded') === 'false') { + return false; + } + var position = this.getPositionClass(), + $eleDims = Foundation.Box.GetDimensions(this.$element), + $anchorDims = Foundation.Box.GetDimensions(this.$anchor), + _this = this, + direction = position === 'left' ? 'left' : position === 'right' ? 'left' : 'top', + param = direction === 'top' ? 'height' : 'width', + offset = param === 'height' ? this.options.vOffset : this.options.hOffset; + + if ($eleDims.width >= $eleDims.windowDims.width || !this.counter && !Foundation.Box.ImNotTouchingYou(this.$element, this.$parent)) { + var newWidth = $eleDims.windowDims.width, + parentHOffset = 0; + if (this.$parent) { + var $parentDims = Foundation.Box.GetDimensions(this.$parent), + parentHOffset = $parentDims.offset.left; + if ($parentDims.width < newWidth) { + newWidth = $parentDims.width; + } + } + + this.$element.offset(Foundation.Box.GetOffsets(this.$element, this.$anchor, 'center bottom', this.options.vOffset, this.options.hOffset + parentHOffset, true)).css({ + 'width': newWidth - this.options.hOffset * 2, + 'height': 'auto' + }); + this.classChanged = true; + return false; + } + + this.$element.offset(Foundation.Box.GetOffsets(this.$element, this.$anchor, position, this.options.vOffset, this.options.hOffset)); + + while (!Foundation.Box.ImNotTouchingYou(this.$element, this.$parent, true) && this.counter) { + this._reposition(position); + this._setPosition(); + } + } + + /** + * Adds event listeners to the element utilizing the triggers utility library. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + this.$element.on({ + 'open.zf.trigger': this.open.bind(this), + 'close.zf.trigger': this.close.bind(this), + 'toggle.zf.trigger': this.toggle.bind(this), + 'resizeme.zf.trigger': this._setPosition.bind(this) + }); + + if (this.options.hover) { + this.$anchor.off('mouseenter.zf.dropdown mouseleave.zf.dropdown').on('mouseenter.zf.dropdown', function () { + var bodyData = $('body').data(); + if (typeof bodyData.whatinput === 'undefined' || bodyData.whatinput === 'mouse') { + clearTimeout(_this.timeout); + _this.timeout = setTimeout(function () { + _this.open(); + _this.$anchor.data('hover', true); + }, _this.options.hoverDelay); + } + }).on('mouseleave.zf.dropdown', function () { + clearTimeout(_this.timeout); + _this.timeout = setTimeout(function () { + _this.close(); + _this.$anchor.data('hover', false); + }, _this.options.hoverDelay); + }); + if (this.options.hoverPane) { + this.$element.off('mouseenter.zf.dropdown mouseleave.zf.dropdown').on('mouseenter.zf.dropdown', function () { + clearTimeout(_this.timeout); + }).on('mouseleave.zf.dropdown', function () { + clearTimeout(_this.timeout); + _this.timeout = setTimeout(function () { + _this.close(); + _this.$anchor.data('hover', false); + }, _this.options.hoverDelay); + }); + } + } + this.$anchor.add(this.$element).on('keydown.zf.dropdown', function (e) { + + var $target = $(this), + visibleFocusableElements = Foundation.Keyboard.findFocusable(_this.$element); + + Foundation.Keyboard.handleKey(e, 'Dropdown', { + open: function () { + if ($target.is(_this.$anchor)) { + _this.open(); + _this.$element.attr('tabindex', -1).focus(); + e.preventDefault(); + } + }, + close: function () { + _this.close(); + _this.$anchor.focus(); + } + }); + }); + } + + /** + * Adds an event handler to the body to close any dropdowns on a click. + * @function + * @private + */ + + }, { + key: '_addBodyHandler', + value: function _addBodyHandler() { + var $body = $(document.body).not(this.$element), + _this = this; + $body.off('click.zf.dropdown').on('click.zf.dropdown', function (e) { + if (_this.$anchor.is(e.target) || _this.$anchor.find(e.target).length) { + return; + } + if (_this.$element.find(e.target).length) { + return; + } + _this.close(); + $body.off('click.zf.dropdown'); + }); + } + + /** + * Opens the dropdown pane, and fires a bubbling event to close other dropdowns. + * @function + * @fires Dropdown#closeme + * @fires Dropdown#show + */ + + }, { + key: 'open', + value: function open() { + // var _this = this; + /** + * Fires to close other open dropdowns, typically when dropdown is opening + * @event Dropdown#closeme + */ + this.$element.trigger('closeme.zf.dropdown', this.$element.attr('id')); + this.$anchor.addClass('hover').attr({ 'aria-expanded': true }); + // this.$element/*.show()*/; + this._setPosition(); + this.$element.addClass('is-open').attr({ 'aria-hidden': false }); + + if (this.options.autoFocus) { + var $focusable = Foundation.Keyboard.findFocusable(this.$element); + if ($focusable.length) { + $focusable.eq(0).focus(); + } + } + + if (this.options.closeOnClick) { + this._addBodyHandler(); + } + + if (this.options.trapFocus) { + Foundation.Keyboard.trapFocus(this.$element); + } + + /** + * Fires once the dropdown is visible. + * @event Dropdown#show + */ + this.$element.trigger('show.zf.dropdown', [this.$element]); + } + + /** + * Closes the open dropdown pane. + * @function + * @fires Dropdown#hide + */ + + }, { + key: 'close', + value: function close() { + if (!this.$element.hasClass('is-open')) { + return false; + } + this.$element.removeClass('is-open').attr({ 'aria-hidden': true }); + + this.$anchor.removeClass('hover').attr('aria-expanded', false); + + if (this.classChanged) { + var curPositionClass = this.getPositionClass(); + if (curPositionClass) { + this.$element.removeClass(curPositionClass); + } + this.$element.addClass(this.options.positionClass) + /*.hide()*/.css({ height: '', width: '' }); + this.classChanged = false; + this.counter = 4; + this.usedPositions.length = 0; + } + /** + * Fires once the dropdown is no longer visible. + * @event Dropdown#hide + */ + this.$element.trigger('hide.zf.dropdown', [this.$element]); + + if (this.options.trapFocus) { + Foundation.Keyboard.releaseFocus(this.$element); + } + } + + /** + * Toggles the dropdown pane's visibility. + * @function + */ + + }, { + key: 'toggle', + value: function toggle() { + if (this.$element.hasClass('is-open')) { + if (this.$anchor.data('hover')) return; + this.close(); + } else { + this.open(); + } + } + + /** + * Destroys the dropdown. + * @function + */ + + }, { + key: 'destroy', + value: function destroy() { + this.$element.off('.zf.trigger').hide(); + this.$anchor.off('.zf.dropdown'); + + Foundation.unregisterPlugin(this); + } + }]); + + return Dropdown; + }(); + + Dropdown.defaults = { + /** + * Class that designates bounding container of Dropdown (default: window) + * @option + * @type {?string} + * @default null + */ + parentClass: null, + /** + * Amount of time to delay opening a submenu on hover event. + * @option + * @type {number} + * @default 250 + */ + hoverDelay: 250, + /** + * Allow submenus to open on hover events + * @option + * @type {boolean} + * @default false + */ + hover: false, + /** + * Don't close dropdown when hovering over dropdown pane + * @option + * @type {boolean} + * @default false + */ + hoverPane: false, + /** + * Number of pixels between the dropdown pane and the triggering element on open. + * @option + * @type {number} + * @default 1 + */ + vOffset: 1, + /** + * Number of pixels between the dropdown pane and the triggering element on open. + * @option + * @type {number} + * @default 1 + */ + hOffset: 1, + /** + * Class applied to adjust open position. JS will test and fill this in. + * @option + * @type {string} + * @default '' + */ + positionClass: '', + /** + * Allow the plugin to trap focus to the dropdown pane if opened with keyboard commands. + * @option + * @type {boolean} + * @default false + */ + trapFocus: false, + /** + * Allow the plugin to set focus to the first focusable element within the pane, regardless of method of opening. + * @option + * @type {boolean} + * @default false + */ + autoFocus: false, + /** + * Allows a click on the body to close the dropdown. + * @option + * @type {boolean} + * @default false + */ + closeOnClick: false + }; + + // Window exports + Foundation.plugin(Dropdown, 'Dropdown'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * OffCanvas module. + * @module foundation.offcanvas + * @requires foundation.util.keyboard + * @requires foundation.util.mediaQuery + * @requires foundation.util.triggers + * @requires foundation.util.motion + */ + + var OffCanvas = function () { + /** + * Creates a new instance of an off-canvas wrapper. + * @class + * @fires OffCanvas#init + * @param {Object} element - jQuery object to initialize. + * @param {Object} options - Overrides to the default plugin settings. + */ + function OffCanvas(element, options) { + _classCallCheck(this, OffCanvas); + + this.$element = element; + this.options = $.extend({}, OffCanvas.defaults, this.$element.data(), options); + this.$lastTrigger = $(); + this.$triggers = $(); + + this._init(); + this._events(); + + Foundation.registerPlugin(this, 'OffCanvas'); + Foundation.Keyboard.register('OffCanvas', { + 'ESCAPE': 'close' + }); + } + + /** + * Initializes the off-canvas wrapper by adding the exit overlay (if needed). + * @function + * @private + */ + + + _createClass(OffCanvas, [{ + key: '_init', + value: function _init() { + var id = this.$element.attr('id'); + + this.$element.attr('aria-hidden', 'true'); + + this.$element.addClass('is-transition-' + this.options.transition); + + // Find triggers that affect this element and add aria-expanded to them + this.$triggers = $(document).find('[data-open="' + id + '"], [data-close="' + id + '"], [data-toggle="' + id + '"]').attr('aria-expanded', 'false').attr('aria-controls', id); + + // Add an overlay over the content if necessary + if (this.options.contentOverlay === true) { + var overlay = document.createElement('div'); + var overlayPosition = $(this.$element).css("position") === 'fixed' ? 'is-overlay-fixed' : 'is-overlay-absolute'; + overlay.setAttribute('class', 'js-off-canvas-overlay ' + overlayPosition); + this.$overlay = $(overlay); + if (overlayPosition === 'is-overlay-fixed') { + $('body').append(this.$overlay); + } else { + this.$element.siblings('[data-off-canvas-content]').append(this.$overlay); + } + } + + this.options.isRevealed = this.options.isRevealed || new RegExp(this.options.revealClass, 'g').test(this.$element[0].className); + + if (this.options.isRevealed === true) { + this.options.revealOn = this.options.revealOn || this.$element[0].className.match(/(reveal-for-medium|reveal-for-large)/g)[0].split('-')[2]; + this._setMQChecker(); + } + if (!this.options.transitionTime === true) { + this.options.transitionTime = parseFloat(window.getComputedStyle($('[data-off-canvas]')[0]).transitionDuration) * 1000; + } + } + + /** + * Adds event handlers to the off-canvas wrapper and the exit overlay. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + this.$element.off('.zf.trigger .zf.offcanvas').on({ + 'open.zf.trigger': this.open.bind(this), + 'close.zf.trigger': this.close.bind(this), + 'toggle.zf.trigger': this.toggle.bind(this), + 'keydown.zf.offcanvas': this._handleKeyboard.bind(this) + }); + + if (this.options.closeOnClick === true) { + var $target = this.options.contentOverlay ? this.$overlay : $('[data-off-canvas-content]'); + $target.on({ 'click.zf.offcanvas': this.close.bind(this) }); + } + } + + /** + * Applies event listener for elements that will reveal at certain breakpoints. + * @private + */ + + }, { + key: '_setMQChecker', + value: function _setMQChecker() { + var _this = this; + + $(window).on('changed.zf.mediaquery', function () { + if (Foundation.MediaQuery.atLeast(_this.options.revealOn)) { + _this.reveal(true); + } else { + _this.reveal(false); + } + }).one('load.zf.offcanvas', function () { + if (Foundation.MediaQuery.atLeast(_this.options.revealOn)) { + _this.reveal(true); + } + }); + } + + /** + * Handles the revealing/hiding the off-canvas at breakpoints, not the same as open. + * @param {Boolean} isRevealed - true if element should be revealed. + * @function + */ + + }, { + key: 'reveal', + value: function reveal(isRevealed) { + var $closer = this.$element.find('[data-close]'); + if (isRevealed) { + this.close(); + this.isRevealed = true; + this.$element.attr('aria-hidden', 'false'); + this.$element.off('open.zf.trigger toggle.zf.trigger'); + if ($closer.length) { + $closer.hide(); + } + } else { + this.isRevealed = false; + this.$element.attr('aria-hidden', 'true'); + this.$element.on({ + 'open.zf.trigger': this.open.bind(this), + 'toggle.zf.trigger': this.toggle.bind(this) + }); + if ($closer.length) { + $closer.show(); + } + } + } + + /** + * Stops scrolling of the body when offcanvas is open on mobile Safari and other troublesome browsers. + * @private + */ + + }, { + key: '_stopScrolling', + value: function _stopScrolling(event) { + return false; + } + + // Taken and adapted from http://stackoverflow.com/questions/16889447/prevent-full-page-scrolling-ios + // Only really works for y, not sure how to extend to x or if we need to. + + }, { + key: '_recordScrollable', + value: function _recordScrollable(event) { + var elem = this; // called from event handler context with this as elem + + // If the element is scrollable (content overflows), then... + if (elem.scrollHeight !== elem.clientHeight) { + // If we're at the top, scroll down one pixel to allow scrolling up + if (elem.scrollTop === 0) { + elem.scrollTop = 1; + } + // If we're at the bottom, scroll up one pixel to allow scrolling down + if (elem.scrollTop === elem.scrollHeight - elem.clientHeight) { + elem.scrollTop = elem.scrollHeight - elem.clientHeight - 1; + } + } + elem.allowUp = elem.scrollTop > 0; + elem.allowDown = elem.scrollTop < elem.scrollHeight - elem.clientHeight; + elem.lastY = event.originalEvent.pageY; + } + }, { + key: '_stopScrollPropagation', + value: function _stopScrollPropagation(event) { + var elem = this; // called from event handler context with this as elem + var up = event.pageY < elem.lastY; + var down = !up; + elem.lastY = event.pageY; + + if (up && elem.allowUp || down && elem.allowDown) { + event.stopPropagation(); + } else { + event.preventDefault(); + } + } + + /** + * Opens the off-canvas menu. + * @function + * @param {Object} event - Event object passed from listener. + * @param {jQuery} trigger - element that triggered the off-canvas to open. + * @fires OffCanvas#opened + */ + + }, { + key: 'open', + value: function open(event, trigger) { + if (this.$element.hasClass('is-open') || this.isRevealed) { + return; + } + var _this = this; + + if (trigger) { + this.$lastTrigger = trigger; + } + + if (this.options.forceTo === 'top') { + window.scrollTo(0, 0); + } else if (this.options.forceTo === 'bottom') { + window.scrollTo(0, document.body.scrollHeight); + } + + /** + * Fires when the off-canvas menu opens. + * @event OffCanvas#opened + */ + _this.$element.addClass('is-open'); + + this.$triggers.attr('aria-expanded', 'true'); + this.$element.attr('aria-hidden', 'false').trigger('opened.zf.offcanvas'); + + // If `contentScroll` is set to false, add class and disable scrolling on touch devices. + if (this.options.contentScroll === false) { + $('body').addClass('is-off-canvas-open').on('touchmove', this._stopScrolling); + this.$element.on('touchstart', this._recordScrollable); + this.$element.on('touchmove', this._stopScrollPropagation); + } + + if (this.options.contentOverlay === true) { + this.$overlay.addClass('is-visible'); + } + + if (this.options.closeOnClick === true && this.options.contentOverlay === true) { + this.$overlay.addClass('is-closable'); + } + + if (this.options.autoFocus === true) { + this.$element.one(Foundation.transitionend(this.$element), function () { + _this.$element.find('a, button').eq(0).focus(); + }); + } + + if (this.options.trapFocus === true) { + this.$element.siblings('[data-off-canvas-content]').attr('tabindex', '-1'); + Foundation.Keyboard.trapFocus(this.$element); + } + } + + /** + * Closes the off-canvas menu. + * @function + * @param {Function} cb - optional cb to fire after closure. + * @fires OffCanvas#closed + */ + + }, { + key: 'close', + value: function close(cb) { + if (!this.$element.hasClass('is-open') || this.isRevealed) { + return; + } + + var _this = this; + + _this.$element.removeClass('is-open'); + + this.$element.attr('aria-hidden', 'true') + /** + * Fires when the off-canvas menu opens. + * @event OffCanvas#closed + */ + .trigger('closed.zf.offcanvas'); + + // If `contentScroll` is set to false, remove class and re-enable scrolling on touch devices. + if (this.options.contentScroll === false) { + $('body').removeClass('is-off-canvas-open').off('touchmove', this._stopScrolling); + this.$element.off('touchstart', this._recordScrollable); + this.$element.off('touchmove', this._stopScrollPropagation); + } + + if (this.options.contentOverlay === true) { + this.$overlay.removeClass('is-visible'); + } + + if (this.options.closeOnClick === true && this.options.contentOverlay === true) { + this.$overlay.removeClass('is-closable'); + } + + this.$triggers.attr('aria-expanded', 'false'); + + if (this.options.trapFocus === true) { + this.$element.siblings('[data-off-canvas-content]').removeAttr('tabindex'); + Foundation.Keyboard.releaseFocus(this.$element); + } + } + + /** + * Toggles the off-canvas menu open or closed. + * @function + * @param {Object} event - Event object passed from listener. + * @param {jQuery} trigger - element that triggered the off-canvas to open. + */ + + }, { + key: 'toggle', + value: function toggle(event, trigger) { + if (this.$element.hasClass('is-open')) { + this.close(event, trigger); + } else { + this.open(event, trigger); + } + } + + /** + * Handles keyboard input when detected. When the escape key is pressed, the off-canvas menu closes, and focus is restored to the element that opened the menu. + * @function + * @private + */ + + }, { + key: '_handleKeyboard', + value: function _handleKeyboard(e) { + var _this2 = this; + + Foundation.Keyboard.handleKey(e, 'OffCanvas', { + close: function () { + _this2.close(); + _this2.$lastTrigger.focus(); + return true; + }, + handled: function () { + e.stopPropagation(); + e.preventDefault(); + } + }); + } + + /** + * Destroys the offcanvas plugin. + * @function + */ + + }, { + key: 'destroy', + value: function destroy() { + this.close(); + this.$element.off('.zf.trigger .zf.offcanvas'); + this.$overlay.off('.zf.offcanvas'); + + Foundation.unregisterPlugin(this); + } + }]); + + return OffCanvas; + }(); + + OffCanvas.defaults = { + /** + * Allow the user to click outside of the menu to close it. + * @option + * @type {boolean} + * @default true + */ + closeOnClick: true, + + /** + * Adds an overlay on top of `[data-off-canvas-content]`. + * @option + * @type {boolean} + * @default true + */ + contentOverlay: true, + + /** + * Enable/disable scrolling of the main content when an off canvas panel is open. + * @option + * @type {boolean} + * @default true + */ + contentScroll: true, + + /** + * Amount of time in ms the open and close transition requires. If none selected, pulls from body style. + * @option + * @type {number} + * @default 0 + */ + transitionTime: 0, + + /** + * Type of transition for the offcanvas menu. Options are 'push', 'detached' or 'slide'. + * @option + * @type {string} + * @default push + */ + transition: 'push', + + /** + * Force the page to scroll to top or bottom on open. + * @option + * @type {?string} + * @default null + */ + forceTo: null, + + /** + * Allow the offcanvas to remain open for certain breakpoints. + * @option + * @type {boolean} + * @default false + */ + isRevealed: false, + + /** + * Breakpoint at which to reveal. JS will use a RegExp to target standard classes, if changing classnames, pass your class with the `revealClass` option. + * @option + * @type {?string} + * @default null + */ + revealOn: null, + + /** + * Force focus to the offcanvas on open. If true, will focus the opening trigger on close. + * @option + * @type {boolean} + * @default true + */ + autoFocus: true, + + /** + * Class used to force an offcanvas to remain open. Foundation defaults for this are `reveal-for-large` & `reveal-for-medium`. + * @option + * @type {string} + * @default reveal-for- + * @todo improve the regex testing for this. + */ + revealClass: 'reveal-for-', + + /** + * Triggers optional focus trapping when opening an offcanvas. Sets tabindex of [data-off-canvas-content] to -1 for accessibility purposes. + * @option + * @type {boolean} + * @default false + */ + trapFocus: false + }; + + // Window exports + Foundation.plugin(OffCanvas, 'OffCanvas'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * Tabs module. + * @module foundation.tabs + * @requires foundation.util.keyboard + * @requires foundation.util.timerAndImageLoader if tabs contain images + */ + + var Tabs = function () { + /** + * Creates a new instance of tabs. + * @class + * @fires Tabs#init + * @param {jQuery} element - jQuery object to make into tabs. + * @param {Object} options - Overrides to the default plugin settings. + */ + function Tabs(element, options) { + _classCallCheck(this, Tabs); + + this.$element = element; + this.options = $.extend({}, Tabs.defaults, this.$element.data(), options); + + this._init(); + Foundation.registerPlugin(this, 'Tabs'); + Foundation.Keyboard.register('Tabs', { + 'ENTER': 'open', + 'SPACE': 'open', + 'ARROW_RIGHT': 'next', + 'ARROW_UP': 'previous', + 'ARROW_DOWN': 'next', + 'ARROW_LEFT': 'previous' + // 'TAB': 'next', + // 'SHIFT_TAB': 'previous' + }); + } + + /** + * Initializes the tabs by showing and focusing (if autoFocus=true) the preset active tab. + * @private + */ + + + _createClass(Tabs, [{ + key: '_init', + value: function _init() { + var _this2 = this; + + var _this = this; + + this.$element.attr({ 'role': 'tablist' }); + this.$tabTitles = this.$element.find('.' + this.options.linkClass); + this.$tabContent = $('[data-tabs-content="' + this.$element[0].id + '"]'); + + this.$tabTitles.each(function () { + var $elem = $(this), + $link = $elem.find('a'), + isActive = $elem.hasClass('' + _this.options.linkActiveClass), + hash = $link[0].hash.slice(1), + linkId = $link[0].id ? $link[0].id : hash + '-label', + $tabContent = $('#' + hash); + + $elem.attr({ 'role': 'presentation' }); + + $link.attr({ + 'role': 'tab', + 'aria-controls': hash, + 'aria-selected': isActive, + 'id': linkId + }); + + $tabContent.attr({ + 'role': 'tabpanel', + 'aria-hidden': !isActive, + 'aria-labelledby': linkId + }); + + if (isActive && _this.options.autoFocus) { + $(window).load(function () { + $('html, body').animate({ scrollTop: $elem.offset().top }, _this.options.deepLinkSmudgeDelay, function () { + $link.focus(); + }); + }); + } + }); + if (this.options.matchHeight) { + var $images = this.$tabContent.find('img'); + + if ($images.length) { + Foundation.onImagesLoaded($images, this._setHeight.bind(this)); + } else { + this._setHeight(); + } + } + + //current context-bound function to open tabs on page load or history popstate + this._checkDeepLink = function () { + var anchor = window.location.hash; + //need a hash and a relevant anchor in this tabset + if (anchor.length) { + var $link = _this2.$element.find('[href="' + anchor + '"]'); + if ($link.length) { + _this2.selectTab($(anchor), true); + + //roll up a little to show the titles + if (_this2.options.deepLinkSmudge) { + var offset = _this2.$element.offset(); + $('html, body').animate({ scrollTop: offset.top }, _this2.options.deepLinkSmudgeDelay); + } + + /** + * Fires when the zplugin has deeplinked at pageload + * @event Tabs#deeplink + */ + _this2.$element.trigger('deeplink.zf.tabs', [$link, $(anchor)]); + } + } + }; + + //use browser to open a tab, if it exists in this tabset + if (this.options.deepLink) { + this._checkDeepLink(); + } + + this._events(); + } + + /** + * Adds event handlers for items within the tabs. + * @private + */ + + }, { + key: '_events', + value: function _events() { + this._addKeyHandler(); + this._addClickHandler(); + this._setHeightMqHandler = null; + + if (this.options.matchHeight) { + this._setHeightMqHandler = this._setHeight.bind(this); + + $(window).on('changed.zf.mediaquery', this._setHeightMqHandler); + } + + if (this.options.deepLink) { + $(window).on('popstate', this._checkDeepLink); + } + } + + /** + * Adds click handlers for items within the tabs. + * @private + */ + + }, { + key: '_addClickHandler', + value: function _addClickHandler() { + var _this = this; + + this.$element.off('click.zf.tabs').on('click.zf.tabs', '.' + this.options.linkClass, function (e) { + e.preventDefault(); + e.stopPropagation(); + _this._handleTabChange($(this)); + }); + } + + /** + * Adds keyboard event handlers for items within the tabs. + * @private + */ + + }, { + key: '_addKeyHandler', + value: function _addKeyHandler() { + var _this = this; + + this.$tabTitles.off('keydown.zf.tabs').on('keydown.zf.tabs', function (e) { + if (e.which === 9) return; + + var $element = $(this), + $elements = $element.parent('ul').children('li'), + $prevElement, + $nextElement; + + $elements.each(function (i) { + if ($(this).is($element)) { + if (_this.options.wrapOnKeys) { + $prevElement = i === 0 ? $elements.last() : $elements.eq(i - 1); + $nextElement = i === $elements.length - 1 ? $elements.first() : $elements.eq(i + 1); + } else { + $prevElement = $elements.eq(Math.max(0, i - 1)); + $nextElement = $elements.eq(Math.min(i + 1, $elements.length - 1)); + } + return; + } + }); + + // handle keyboard event with keyboard util + Foundation.Keyboard.handleKey(e, 'Tabs', { + open: function () { + $element.find('[role="tab"]').focus(); + _this._handleTabChange($element); + }, + previous: function () { + $prevElement.find('[role="tab"]').focus(); + _this._handleTabChange($prevElement); + }, + next: function () { + $nextElement.find('[role="tab"]').focus(); + _this._handleTabChange($nextElement); + }, + handled: function () { + e.stopPropagation(); + e.preventDefault(); + } + }); + }); + } + + /** + * Opens the tab `$targetContent` defined by `$target`. Collapses active tab. + * @param {jQuery} $target - Tab to open. + * @param {boolean} historyHandled - browser has already handled a history update + * @fires Tabs#change + * @function + */ + + }, { + key: '_handleTabChange', + value: function _handleTabChange($target, historyHandled) { + + /** + * Check for active class on target. Collapse if exists. + */ + if ($target.hasClass('' + this.options.linkActiveClass)) { + if (this.options.activeCollapse) { + this._collapseTab($target); + + /** + * Fires when the zplugin has successfully collapsed tabs. + * @event Tabs#collapse + */ + this.$element.trigger('collapse.zf.tabs', [$target]); + } + return; + } + + var $oldTab = this.$element.find('.' + this.options.linkClass + '.' + this.options.linkActiveClass), + $tabLink = $target.find('[role="tab"]'), + hash = $tabLink[0].hash, + $targetContent = this.$tabContent.find(hash); + + //close old tab + this._collapseTab($oldTab); + + //open new tab + this._openTab($target); + + //either replace or update browser history + if (this.options.deepLink && !historyHandled) { + var anchor = $target.find('a').attr('href'); + + if (this.options.updateHistory) { + history.pushState({}, '', anchor); + } else { + history.replaceState({}, '', anchor); + } + } + + /** + * Fires when the plugin has successfully changed tabs. + * @event Tabs#change + */ + this.$element.trigger('change.zf.tabs', [$target, $targetContent]); + + //fire to children a mutation event + $targetContent.find("[data-mutate]").trigger("mutateme.zf.trigger"); + } + + /** + * Opens the tab `$targetContent` defined by `$target`. + * @param {jQuery} $target - Tab to Open. + * @function + */ + + }, { + key: '_openTab', + value: function _openTab($target) { + var $tabLink = $target.find('[role="tab"]'), + hash = $tabLink[0].hash, + $targetContent = this.$tabContent.find(hash); + + $target.addClass('' + this.options.linkActiveClass); + + $tabLink.attr({ 'aria-selected': 'true' }); + + $targetContent.addClass('' + this.options.panelActiveClass).attr({ 'aria-hidden': 'false' }); + } + + /** + * Collapses `$targetContent` defined by `$target`. + * @param {jQuery} $target - Tab to Open. + * @function + */ + + }, { + key: '_collapseTab', + value: function _collapseTab($target) { + var $target_anchor = $target.removeClass('' + this.options.linkActiveClass).find('[role="tab"]').attr({ 'aria-selected': 'false' }); + + $('#' + $target_anchor.attr('aria-controls')).removeClass('' + this.options.panelActiveClass).attr({ 'aria-hidden': 'true' }); + } + + /** + * Public method for selecting a content pane to display. + * @param {jQuery | String} elem - jQuery object or string of the id of the pane to display. + * @param {boolean} historyHandled - browser has already handled a history update + * @function + */ + + }, { + key: 'selectTab', + value: function selectTab(elem, historyHandled) { + var idStr; + + if (typeof elem === 'object') { + idStr = elem[0].id; + } else { + idStr = elem; + } + + if (idStr.indexOf('#') < 0) { + idStr = '#' + idStr; + } + + var $target = this.$tabTitles.find('[href="' + idStr + '"]').parent('.' + this.options.linkClass); + + this._handleTabChange($target, historyHandled); + } + }, { + key: '_setHeight', + + /** + * Sets the height of each panel to the height of the tallest panel. + * If enabled in options, gets called on media query change. + * If loading content via external source, can be called directly or with _reflow. + * If enabled with `data-match-height="true"`, tabs sets to equal height + * @function + * @private + */ + value: function _setHeight() { + var max = 0, + _this = this; // Lock down the `this` value for the root tabs object + + this.$tabContent.find('.' + this.options.panelClass).css('height', '').each(function () { + + var panel = $(this), + isActive = panel.hasClass('' + _this.options.panelActiveClass); // get the options from the parent instead of trying to get them from the child + + if (!isActive) { + panel.css({ 'visibility': 'hidden', 'display': 'block' }); + } + + var temp = this.getBoundingClientRect().height; + + if (!isActive) { + panel.css({ + 'visibility': '', + 'display': '' + }); + } + + max = temp > max ? temp : max; + }).css('height', max + 'px'); + } + + /** + * Destroys an instance of an tabs. + * @fires Tabs#destroyed + */ + + }, { + key: 'destroy', + value: function destroy() { + this.$element.find('.' + this.options.linkClass).off('.zf.tabs').hide().end().find('.' + this.options.panelClass).hide(); + + if (this.options.matchHeight) { + if (this._setHeightMqHandler != null) { + $(window).off('changed.zf.mediaquery', this._setHeightMqHandler); + } + } + + if (this.options.deepLink) { + $(window).off('popstate', this._checkDeepLink); + } + + Foundation.unregisterPlugin(this); + } + }]); + + return Tabs; + }(); + + Tabs.defaults = { + /** + * Allows the window to scroll to content of pane specified by hash anchor + * @option + * @type {boolean} + * @default false + */ + deepLink: false, + + /** + * Adjust the deep link scroll to make sure the top of the tab panel is visible + * @option + * @type {boolean} + * @default false + */ + deepLinkSmudge: false, + + /** + * Animation time (ms) for the deep link adjustment + * @option + * @type {number} + * @default 300 + */ + deepLinkSmudgeDelay: 300, + + /** + * Update the browser history with the open tab + * @option + * @type {boolean} + * @default false + */ + updateHistory: false, + + /** + * Allows the window to scroll to content of active pane on load if set to true. + * Not recommended if more than one tab panel per page. + * @option + * @type {boolean} + * @default false + */ + autoFocus: false, + + /** + * Allows keyboard input to 'wrap' around the tab links. + * @option + * @type {boolean} + * @default true + */ + wrapOnKeys: true, + + /** + * Allows the tab content panes to match heights if set to true. + * @option + * @type {boolean} + * @default false + */ + matchHeight: false, + + /** + * Allows active tabs to collapse when clicked. + * @option + * @type {boolean} + * @default false + */ + activeCollapse: false, + + /** + * Class applied to `li`'s in tab link list. + * @option + * @type {string} + * @default 'tabs-title' + */ + linkClass: 'tabs-title', + + /** + * Class applied to the active `li` in tab link list. + * @option + * @type {string} + * @default 'is-active' + */ + linkActiveClass: 'is-active', + + /** + * Class applied to the content containers. + * @option + * @type {string} + * @default 'tabs-panel' + */ + panelClass: 'tabs-panel', + + /** + * Class applied to the active content container. + * @option + * @type {string} + * @default 'is-active' + */ + panelActiveClass: 'is-active' + }; + + // Window exports + Foundation.plugin(Tabs, 'Tabs'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * Reveal module. + * @module foundation.reveal + * @requires foundation.util.keyboard + * @requires foundation.util.box + * @requires foundation.util.triggers + * @requires foundation.util.mediaQuery + * @requires foundation.util.motion if using animations + */ + + var Reveal = function () { + /** + * Creates a new instance of Reveal. + * @class + * @param {jQuery} element - jQuery object to use for the modal. + * @param {Object} options - optional parameters. + */ + function Reveal(element, options) { + _classCallCheck(this, Reveal); + + this.$element = element; + this.options = $.extend({}, Reveal.defaults, this.$element.data(), options); + this._init(); + + Foundation.registerPlugin(this, 'Reveal'); + Foundation.Keyboard.register('Reveal', { + 'ENTER': 'open', + 'SPACE': 'open', + 'ESCAPE': 'close' + }); + } + + /** + * Initializes the modal by adding the overlay and close buttons, (if selected). + * @private + */ + + + _createClass(Reveal, [{ + key: '_init', + value: function _init() { + this.id = this.$element.attr('id'); + this.isActive = false; + this.cached = { mq: Foundation.MediaQuery.current }; + this.isMobile = mobileSniff(); + + this.$anchor = $('[data-open="' + this.id + '"]').length ? $('[data-open="' + this.id + '"]') : $('[data-toggle="' + this.id + '"]'); + this.$anchor.attr({ + 'aria-controls': this.id, + 'aria-haspopup': true, + 'tabindex': 0 + }); + + if (this.options.fullScreen || this.$element.hasClass('full')) { + this.options.fullScreen = true; + this.options.overlay = false; + } + if (this.options.overlay && !this.$overlay) { + this.$overlay = this._makeOverlay(this.id); + } + + this.$element.attr({ + 'role': 'dialog', + 'aria-hidden': true, + 'data-yeti-box': this.id, + 'data-resize': this.id + }); + + if (this.$overlay) { + this.$element.detach().appendTo(this.$overlay); + } else { + this.$element.detach().appendTo($(this.options.appendTo)); + this.$element.addClass('without-overlay'); + } + this._events(); + if (this.options.deepLink && window.location.hash === '#' + this.id) { + $(window).one('load.zf.reveal', this.open.bind(this)); + } + } + + /** + * Creates an overlay div to display behind the modal. + * @private + */ + + }, { + key: '_makeOverlay', + value: function _makeOverlay() { + return $('
            ').addClass('reveal-overlay').appendTo(this.options.appendTo); + } + + /** + * Updates position of modal + * TODO: Figure out if we actually need to cache these values or if it doesn't matter + * @private + */ + + }, { + key: '_updatePosition', + value: function _updatePosition() { + var width = this.$element.outerWidth(); + var outerWidth = $(window).width(); + var height = this.$element.outerHeight(); + var outerHeight = $(window).height(); + var left, top; + if (this.options.hOffset === 'auto') { + left = parseInt((outerWidth - width) / 2, 10); + } else { + left = parseInt(this.options.hOffset, 10); + } + if (this.options.vOffset === 'auto') { + if (height > outerHeight) { + top = parseInt(Math.min(100, outerHeight / 10), 10); + } else { + top = parseInt((outerHeight - height) / 4, 10); + } + } else { + top = parseInt(this.options.vOffset, 10); + } + this.$element.css({ top: top + 'px' }); + // only worry about left if we don't have an overlay or we havea horizontal offset, + // otherwise we're perfectly in the middle + if (!this.$overlay || this.options.hOffset !== 'auto') { + this.$element.css({ left: left + 'px' }); + this.$element.css({ margin: '0px' }); + } + } + + /** + * Adds event handlers for the modal. + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this2 = this; + + var _this = this; + + this.$element.on({ + 'open.zf.trigger': this.open.bind(this), + 'close.zf.trigger': function (event, $element) { + if (event.target === _this.$element[0] || $(event.target).parents('[data-closable]')[0] === $element) { + // only close reveal when it's explicitly called + return _this2.close.apply(_this2); + } + }, + 'toggle.zf.trigger': this.toggle.bind(this), + 'resizeme.zf.trigger': function () { + _this._updatePosition(); + } + }); + + if (this.$anchor.length) { + this.$anchor.on('keydown.zf.reveal', function (e) { + if (e.which === 13 || e.which === 32) { + e.stopPropagation(); + e.preventDefault(); + _this.open(); + } + }); + } + + if (this.options.closeOnClick && this.options.overlay) { + this.$overlay.off('.zf.reveal').on('click.zf.reveal', function (e) { + if (e.target === _this.$element[0] || $.contains(_this.$element[0], e.target) || !$.contains(document, e.target)) { + return; + } + _this.close(); + }); + } + if (this.options.deepLink) { + $(window).on('popstate.zf.reveal:' + this.id, this._handleState.bind(this)); + } + } + + /** + * Handles modal methods on back/forward button clicks or any other event that triggers popstate. + * @private + */ + + }, { + key: '_handleState', + value: function _handleState(e) { + if (window.location.hash === '#' + this.id && !this.isActive) { + this.open(); + } else { + this.close(); + } + } + + /** + * Opens the modal controlled by `this.$anchor`, and closes all others by default. + * @function + * @fires Reveal#closeme + * @fires Reveal#open + */ + + }, { + key: 'open', + value: function open() { + var _this3 = this; + + if (this.options.deepLink) { + var hash = '#' + this.id; + + if (window.history.pushState) { + window.history.pushState(null, null, hash); + } else { + window.location.hash = hash; + } + } + + this.isActive = true; + + // Make elements invisible, but remove display: none so we can get size and positioning + this.$element.css({ 'visibility': 'hidden' }).show().scrollTop(0); + if (this.options.overlay) { + this.$overlay.css({ 'visibility': 'hidden' }).show(); + } + + this._updatePosition(); + + this.$element.hide().css({ 'visibility': '' }); + + if (this.$overlay) { + this.$overlay.css({ 'visibility': '' }).hide(); + if (this.$element.hasClass('fast')) { + this.$overlay.addClass('fast'); + } else if (this.$element.hasClass('slow')) { + this.$overlay.addClass('slow'); + } + } + + if (!this.options.multipleOpened) { + /** + * Fires immediately before the modal opens. + * Closes any other modals that are currently open + * @event Reveal#closeme + */ + this.$element.trigger('closeme.zf.reveal', this.id); + } + + var _this = this; + + function addRevealOpenClasses() { + if (_this.isMobile) { + if (!_this.originalScrollPos) { + _this.originalScrollPos = window.pageYOffset; + } + $('html, body').addClass('is-reveal-open'); + } else { + $('body').addClass('is-reveal-open'); + } + } + // Motion UI method of reveal + if (this.options.animationIn) { + (function () { + var afterAnimation = function () { + _this.$element.attr({ + 'aria-hidden': false, + 'tabindex': -1 + }).focus(); + addRevealOpenClasses(); + Foundation.Keyboard.trapFocus(_this.$element); + }; + + if (_this3.options.overlay) { + Foundation.Motion.animateIn(_this3.$overlay, 'fade-in'); + } + Foundation.Motion.animateIn(_this3.$element, _this3.options.animationIn, function () { + if (_this3.$element) { + // protect against object having been removed + _this3.focusableElements = Foundation.Keyboard.findFocusable(_this3.$element); + afterAnimation(); + } + }); + })(); + } + // jQuery method of reveal + else { + if (this.options.overlay) { + this.$overlay.show(0); + } + this.$element.show(this.options.showDelay); + } + + // handle accessibility + this.$element.attr({ + 'aria-hidden': false, + 'tabindex': -1 + }).focus(); + Foundation.Keyboard.trapFocus(this.$element); + + /** + * Fires when the modal has successfully opened. + * @event Reveal#open + */ + this.$element.trigger('open.zf.reveal'); + + addRevealOpenClasses(); + + setTimeout(function () { + _this3._extraHandlers(); + }, 0); + } + + /** + * Adds extra event handlers for the body and window if necessary. + * @private + */ + + }, { + key: '_extraHandlers', + value: function _extraHandlers() { + var _this = this; + if (!this.$element) { + return; + } // If we're in the middle of cleanup, don't freak out + this.focusableElements = Foundation.Keyboard.findFocusable(this.$element); + + if (!this.options.overlay && this.options.closeOnClick && !this.options.fullScreen) { + $('body').on('click.zf.reveal', function (e) { + if (e.target === _this.$element[0] || $.contains(_this.$element[0], e.target) || !$.contains(document, e.target)) { + return; + } + _this.close(); + }); + } + + if (this.options.closeOnEsc) { + $(window).on('keydown.zf.reveal', function (e) { + Foundation.Keyboard.handleKey(e, 'Reveal', { + close: function () { + if (_this.options.closeOnEsc) { + _this.close(); + _this.$anchor.focus(); + } + } + }); + }); + } + + // lock focus within modal while tabbing + this.$element.on('keydown.zf.reveal', function (e) { + var $target = $(this); + // handle keyboard event with keyboard util + Foundation.Keyboard.handleKey(e, 'Reveal', { + open: function () { + if (_this.$element.find(':focus').is(_this.$element.find('[data-close]'))) { + setTimeout(function () { + // set focus back to anchor if close button has been activated + _this.$anchor.focus(); + }, 1); + } else if ($target.is(_this.focusableElements)) { + // dont't trigger if acual element has focus (i.e. inputs, links, ...) + _this.open(); + } + }, + close: function () { + if (_this.options.closeOnEsc) { + _this.close(); + _this.$anchor.focus(); + } + }, + handled: function (preventDefault) { + if (preventDefault) { + e.preventDefault(); + } + } + }); + }); + } + + /** + * Closes the modal. + * @function + * @fires Reveal#closed + */ + + }, { + key: 'close', + value: function close() { + if (!this.isActive || !this.$element.is(':visible')) { + return false; + } + var _this = this; + + // Motion UI method of hiding + if (this.options.animationOut) { + if (this.options.overlay) { + Foundation.Motion.animateOut(this.$overlay, 'fade-out', finishUp); + } else { + finishUp(); + } + + Foundation.Motion.animateOut(this.$element, this.options.animationOut); + } + // jQuery method of hiding + else { + if (this.options.overlay) { + this.$overlay.hide(0, finishUp); + } else { + finishUp(); + } + + this.$element.hide(this.options.hideDelay); + } + + // Conditionals to remove extra event listeners added on open + if (this.options.closeOnEsc) { + $(window).off('keydown.zf.reveal'); + } + + if (!this.options.overlay && this.options.closeOnClick) { + $('body').off('click.zf.reveal'); + } + + this.$element.off('keydown.zf.reveal'); + + function finishUp() { + if (_this.isMobile) { + $('html, body').removeClass('is-reveal-open'); + if (_this.originalScrollPos) { + $('body').scrollTop(_this.originalScrollPos); + _this.originalScrollPos = null; + } + } else { + $('body').removeClass('is-reveal-open'); + } + + Foundation.Keyboard.releaseFocus(_this.$element); + + _this.$element.attr('aria-hidden', true); + + /** + * Fires when the modal is done closing. + * @event Reveal#closed + */ + _this.$element.trigger('closed.zf.reveal'); + } + + /** + * Resets the modal content + * This prevents a running video to keep going in the background + */ + if (this.options.resetOnClose) { + this.$element.html(this.$element.html()); + } + + this.isActive = false; + if (_this.options.deepLink) { + if (window.history.replaceState) { + window.history.replaceState('', document.title, window.location.href.replace('#' + this.id, '')); + } else { + window.location.hash = ''; + } + } + } + + /** + * Toggles the open/closed state of a modal. + * @function + */ + + }, { + key: 'toggle', + value: function toggle() { + if (this.isActive) { + this.close(); + } else { + this.open(); + } + } + }, { + key: 'destroy', + + + /** + * Destroys an instance of a modal. + * @function + */ + value: function destroy() { + if (this.options.overlay) { + this.$element.appendTo($(this.options.appendTo)); // move $element outside of $overlay to prevent error unregisterPlugin() + this.$overlay.hide().off().remove(); + } + this.$element.hide().off(); + this.$anchor.off('.zf'); + $(window).off('.zf.reveal:' + this.id); + + Foundation.unregisterPlugin(this); + } + }]); + + return Reveal; + }(); + + Reveal.defaults = { + /** + * Motion-UI class to use for animated elements. If none used, defaults to simple show/hide. + * @option + * @type {string} + * @default '' + */ + animationIn: '', + /** + * Motion-UI class to use for animated elements. If none used, defaults to simple show/hide. + * @option + * @type {string} + * @default '' + */ + animationOut: '', + /** + * Time, in ms, to delay the opening of a modal after a click if no animation used. + * @option + * @type {number} + * @default 0 + */ + showDelay: 0, + /** + * Time, in ms, to delay the closing of a modal after a click if no animation used. + * @option + * @type {number} + * @default 0 + */ + hideDelay: 0, + /** + * Allows a click on the body/overlay to close the modal. + * @option + * @type {boolean} + * @default true + */ + closeOnClick: true, + /** + * Allows the modal to close if the user presses the `ESCAPE` key. + * @option + * @type {boolean} + * @default true + */ + closeOnEsc: true, + /** + * If true, allows multiple modals to be displayed at once. + * @option + * @type {boolean} + * @default false + */ + multipleOpened: false, + /** + * Distance, in pixels, the modal should push down from the top of the screen. + * @option + * @type {number|string} + * @default auto + */ + vOffset: 'auto', + /** + * Distance, in pixels, the modal should push in from the side of the screen. + * @option + * @type {number|string} + * @default auto + */ + hOffset: 'auto', + /** + * Allows the modal to be fullscreen, completely blocking out the rest of the view. JS checks for this as well. + * @option + * @type {boolean} + * @default false + */ + fullScreen: false, + /** + * Percentage of screen height the modal should push up from the bottom of the view. + * @option + * @type {number} + * @default 10 + */ + btmOffsetPct: 10, + /** + * Allows the modal to generate an overlay div, which will cover the view when modal opens. + * @option + * @type {boolean} + * @default true + */ + overlay: true, + /** + * Allows the modal to remove and reinject markup on close. Should be true if using video elements w/o using provider's api, otherwise, videos will continue to play in the background. + * @option + * @type {boolean} + * @default false + */ + resetOnClose: false, + /** + * Allows the modal to alter the url on open/close, and allows the use of the `back` button to close modals. ALSO, allows a modal to auto-maniacally open on page load IF the hash === the modal's user-set id. + * @option + * @type {boolean} + * @default false + */ + deepLink: false, + /** + * Allows the modal to append to custom div. + * @option + * @type {string} + * @default "body" + */ + appendTo: "body" + + }; + + // Window exports + Foundation.plugin(Reveal, 'Reveal'); + + function iPhoneSniff() { + return (/iP(ad|hone|od).*OS/.test(window.navigator.userAgent) + ); + } + + function androidSniff() { + return (/Android/.test(window.navigator.userAgent) + ); + } + + function mobileSniff() { + return iPhoneSniff() || androidSniff(); + } +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * ResponsiveAccordionTabs module. + * @module foundation.responsiveAccordionTabs + * @requires foundation.util.keyboard + * @requires foundation.util.timerAndImageLoader + * @requires foundation.util.motion + * @requires foundation.accordion + * @requires foundation.tabs + */ + + var ResponsiveAccordionTabs = function () { + /** + * Creates a new instance of a responsive accordion tabs. + * @class + * @fires ResponsiveAccordionTabs#init + * @param {jQuery} element - jQuery object to make into a dropdown menu. + * @param {Object} options - Overrides to the default plugin settings. + */ + function ResponsiveAccordionTabs(element, options) { + _classCallCheck(this, ResponsiveAccordionTabs); + + this.$element = $(element); + this.options = $.extend({}, this.$element.data(), options); + this.rules = this.$element.data('responsive-accordion-tabs'); + this.currentMq = null; + this.currentPlugin = null; + if (!this.$element.attr('id')) { + this.$element.attr('id', Foundation.GetYoDigits(6, 'responsiveaccordiontabs')); + }; + + this._init(); + this._events(); + + Foundation.registerPlugin(this, 'ResponsiveAccordionTabs'); + } + + /** + * Initializes the Menu by parsing the classes from the 'data-responsive-accordion-tabs' attribute on the element. + * @function + * @private + */ + + + _createClass(ResponsiveAccordionTabs, [{ + key: '_init', + value: function _init() { + // The first time an Interchange plugin is initialized, this.rules is converted from a string of "classes" to an object of rules + if (typeof this.rules === 'string') { + var rulesTree = {}; + + // Parse rules from "classes" pulled from data attribute + var rules = this.rules.split(' '); + + // Iterate through every rule found + for (var i = 0; i < rules.length; i++) { + var rule = rules[i].split('-'); + var ruleSize = rule.length > 1 ? rule[0] : 'small'; + var rulePlugin = rule.length > 1 ? rule[1] : rule[0]; + + if (MenuPlugins[rulePlugin] !== null) { + rulesTree[ruleSize] = MenuPlugins[rulePlugin]; + } + } + + this.rules = rulesTree; + } + + this._getAllOptions(); + + if (!$.isEmptyObject(this.rules)) { + this._checkMediaQueries(); + } + } + }, { + key: '_getAllOptions', + value: function _getAllOptions() { + //get all defaults and options + var _this = this; + _this.allOptions = {}; + for (var key in MenuPlugins) { + if (MenuPlugins.hasOwnProperty(key)) { + var obj = MenuPlugins[key]; + try { + var dummyPlugin = $('
              '); + var tmpPlugin = new obj.plugin(dummyPlugin, _this.options); + for (var keyKey in tmpPlugin.options) { + if (tmpPlugin.options.hasOwnProperty(keyKey) && keyKey !== 'zfPlugin') { + var objObj = tmpPlugin.options[keyKey]; + _this.allOptions[keyKey] = objObj; + } + } + tmpPlugin.destroy(); + } catch (e) {} + } + } + } + + /** + * Initializes events for the Menu. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + + $(window).on('changed.zf.mediaquery', function () { + _this._checkMediaQueries(); + }); + } + + /** + * Checks the current screen width against available media queries. If the media query has changed, and the plugin needed has changed, the plugins will swap out. + * @function + * @private + */ + + }, { + key: '_checkMediaQueries', + value: function _checkMediaQueries() { + var matchedMq, + _this = this; + // Iterate through each rule and find the last matching rule + $.each(this.rules, function (key) { + if (Foundation.MediaQuery.atLeast(key)) { + matchedMq = key; + } + }); + + // No match? No dice + if (!matchedMq) return; + + // Plugin already initialized? We good + if (this.currentPlugin instanceof this.rules[matchedMq].plugin) return; + + // Remove existing plugin-specific CSS classes + $.each(MenuPlugins, function (key, value) { + _this.$element.removeClass(value.cssClass); + }); + + // Add the CSS class for the new plugin + this.$element.addClass(this.rules[matchedMq].cssClass); + + // Create an instance of the new plugin + if (this.currentPlugin) { + //don't know why but on nested elements data zfPlugin get's lost + if (!this.currentPlugin.$element.data('zfPlugin') && this.storezfData) this.currentPlugin.$element.data('zfPlugin', this.storezfData); + this.currentPlugin.destroy(); + } + this._handleMarkup(this.rules[matchedMq].cssClass); + this.currentPlugin = new this.rules[matchedMq].plugin(this.$element, {}); + this.storezfData = this.currentPlugin.$element.data('zfPlugin'); + } + }, { + key: '_handleMarkup', + value: function _handleMarkup(toSet) { + var _this = this, + fromString = 'accordion'; + var $panels = $('[data-tabs-content=' + this.$element.attr('id') + ']'); + if ($panels.length) fromString = 'tabs'; + if (fromString === toSet) { + return; + }; + + var tabsTitle = _this.allOptions.linkClass ? _this.allOptions.linkClass : 'tabs-title'; + var tabsPanel = _this.allOptions.panelClass ? _this.allOptions.panelClass : 'tabs-panel'; + + this.$element.removeAttr('role'); + var $liHeads = this.$element.children('.' + tabsTitle + ',[data-accordion-item]').removeClass(tabsTitle).removeClass('accordion-item').removeAttr('data-accordion-item'); + var $liHeadsA = $liHeads.children('a').removeClass('accordion-title'); + + if (fromString === 'tabs') { + $panels = $panels.children('.' + tabsPanel).removeClass(tabsPanel).removeAttr('role').removeAttr('aria-hidden').removeAttr('aria-labelledby'); + $panels.children('a').removeAttr('role').removeAttr('aria-controls').removeAttr('aria-selected'); + } else { + $panels = $liHeads.children('[data-tab-content]').removeClass('accordion-content'); + }; + + $panels.css({ display: '', visibility: '' }); + $liHeads.css({ display: '', visibility: '' }); + if (toSet === 'accordion') { + $panels.each(function (key, value) { + $(value).appendTo($liHeads.get(key)).addClass('accordion-content').attr('data-tab-content', '').removeClass('is-active').css({ height: '' }); + $('[data-tabs-content=' + _this.$element.attr('id') + ']').after('
              ').remove(); + $liHeads.addClass('accordion-item').attr('data-accordion-item', ''); + $liHeadsA.addClass('accordion-title'); + }); + } else if (toSet === 'tabs') { + var $tabsContent = $('[data-tabs-content=' + _this.$element.attr('id') + ']'); + var $placeholder = $('#tabs-placeholder-' + _this.$element.attr('id')); + if ($placeholder.length) { + $tabsContent = $('
              ').insertAfter($placeholder).attr('data-tabs-content', _this.$element.attr('id')); + $placeholder.remove(); + } else { + $tabsContent = $('
              ').insertAfter(_this.$element).attr('data-tabs-content', _this.$element.attr('id')); + }; + $panels.each(function (key, value) { + var tempValue = $(value).appendTo($tabsContent).addClass(tabsPanel); + var hash = $liHeadsA.get(key).hash.slice(1); + var id = $(value).attr('id') || Foundation.GetYoDigits(6, 'accordion'); + if (hash !== id) { + if (hash !== '') { + $(value).attr('id', hash); + } else { + hash = id; + $(value).attr('id', hash); + $($liHeadsA.get(key)).attr('href', $($liHeadsA.get(key)).attr('href').replace('#', '') + '#' + hash); + }; + }; + var isActive = $($liHeads.get(key)).hasClass('is-active'); + if (isActive) { + tempValue.addClass('is-active'); + }; + }); + $liHeads.addClass(tabsTitle); + }; + } + + /** + * Destroys the instance of the current plugin on this element, as well as the window resize handler that switches the plugins out. + * @function + */ + + }, { + key: 'destroy', + value: function destroy() { + if (this.currentPlugin) this.currentPlugin.destroy(); + $(window).off('.zf.ResponsiveAccordionTabs'); + Foundation.unregisterPlugin(this); + } + }]); + + return ResponsiveAccordionTabs; + }(); + + ResponsiveAccordionTabs.defaults = {}; + + // The plugin matches the plugin classes with these plugin instances. + var MenuPlugins = { + tabs: { + cssClass: 'tabs', + plugin: Foundation._plugins.tabs || null + }, + accordion: { + cssClass: 'accordion', + plugin: Foundation._plugins.accordion || null + } + }; + + // Window exports + Foundation.plugin(ResponsiveAccordionTabs, 'ResponsiveAccordionTabs'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * Tooltip module. + * @module foundation.tooltip + * @requires foundation.util.box + * @requires foundation.util.mediaQuery + * @requires foundation.util.triggers + */ + + var Tooltip = function () { + /** + * Creates a new instance of a Tooltip. + * @class + * @fires Tooltip#init + * @param {jQuery} element - jQuery object to attach a tooltip to. + * @param {Object} options - object to extend the default configuration. + */ + function Tooltip(element, options) { + _classCallCheck(this, Tooltip); + + this.$element = element; + this.options = $.extend({}, Tooltip.defaults, this.$element.data(), options); + + this.isActive = false; + this.isClick = false; + this._init(); + + Foundation.registerPlugin(this, 'Tooltip'); + } + + /** + * Initializes the tooltip by setting the creating the tip element, adding it's text, setting private variables and setting attributes on the anchor. + * @private + */ + + + _createClass(Tooltip, [{ + key: '_init', + value: function _init() { + var elemId = this.$element.attr('aria-describedby') || Foundation.GetYoDigits(6, 'tooltip'); + + this.options.positionClass = this.options.positionClass || this._getPositionClass(this.$element); + this.options.tipText = this.options.tipText || this.$element.attr('title'); + this.template = this.options.template ? $(this.options.template) : this._buildTemplate(elemId); + + if (this.options.allowHtml) { + this.template.appendTo(document.body).html(this.options.tipText).hide(); + } else { + this.template.appendTo(document.body).text(this.options.tipText).hide(); + } + + this.$element.attr({ + 'title': '', + 'aria-describedby': elemId, + 'data-yeti-box': elemId, + 'data-toggle': elemId, + 'data-resize': elemId + }).addClass(this.options.triggerClass); + + //helper variables to track movement on collisions + this.usedPositions = []; + this.counter = 4; + this.classChanged = false; + + this._events(); + } + + /** + * Grabs the current positioning class, if present, and returns the value or an empty string. + * @private + */ + + }, { + key: '_getPositionClass', + value: function _getPositionClass(element) { + if (!element) { + return ''; + } + // var position = element.attr('class').match(/top|left|right/g); + var position = element[0].className.match(/\b(top|left|right)\b/g); + position = position ? position[0] : ''; + return position; + } + }, { + key: '_buildTemplate', + + /** + * builds the tooltip element, adds attributes, and returns the template. + * @private + */ + value: function _buildTemplate(id) { + var templateClasses = (this.options.tooltipClass + ' ' + this.options.positionClass + ' ' + this.options.templateClasses).trim(); + var $template = $('
              ').addClass(templateClasses).attr({ + 'role': 'tooltip', + 'aria-hidden': true, + 'data-is-active': false, + 'data-is-focus': false, + 'id': id + }); + return $template; + } + + /** + * Function that gets called if a collision event is detected. + * @param {String} position - positioning class to try + * @private + */ + + }, { + key: '_reposition', + value: function _reposition(position) { + this.usedPositions.push(position ? position : 'bottom'); + + //default, try switching to opposite side + if (!position && this.usedPositions.indexOf('top') < 0) { + this.template.addClass('top'); + } else if (position === 'top' && this.usedPositions.indexOf('bottom') < 0) { + this.template.removeClass(position); + } else if (position === 'left' && this.usedPositions.indexOf('right') < 0) { + this.template.removeClass(position).addClass('right'); + } else if (position === 'right' && this.usedPositions.indexOf('left') < 0) { + this.template.removeClass(position).addClass('left'); + } + + //if default change didn't work, try bottom or left first + else if (!position && this.usedPositions.indexOf('top') > -1 && this.usedPositions.indexOf('left') < 0) { + this.template.addClass('left'); + } else if (position === 'top' && this.usedPositions.indexOf('bottom') > -1 && this.usedPositions.indexOf('left') < 0) { + this.template.removeClass(position).addClass('left'); + } else if (position === 'left' && this.usedPositions.indexOf('right') > -1 && this.usedPositions.indexOf('bottom') < 0) { + this.template.removeClass(position); + } else if (position === 'right' && this.usedPositions.indexOf('left') > -1 && this.usedPositions.indexOf('bottom') < 0) { + this.template.removeClass(position); + } + //if nothing cleared, set to bottom + else { + this.template.removeClass(position); + } + this.classChanged = true; + this.counter--; + } + + /** + * sets the position class of an element and recursively calls itself until there are no more possible positions to attempt, or the tooltip element is no longer colliding. + * if the tooltip is larger than the screen width, default to full width - any user selected margin + * @private + */ + + }, { + key: '_setPosition', + value: function _setPosition() { + var position = this._getPositionClass(this.template), + $tipDims = Foundation.Box.GetDimensions(this.template), + $anchorDims = Foundation.Box.GetDimensions(this.$element), + direction = position === 'left' ? 'left' : position === 'right' ? 'left' : 'top', + param = direction === 'top' ? 'height' : 'width', + offset = param === 'height' ? this.options.vOffset : this.options.hOffset, + _this = this; + + if ($tipDims.width >= $tipDims.windowDims.width || !this.counter && !Foundation.Box.ImNotTouchingYou(this.template)) { + this.template.offset(Foundation.Box.GetOffsets(this.template, this.$element, 'center bottom', this.options.vOffset, this.options.hOffset, true)).css({ + // this.$element.offset(Foundation.GetOffsets(this.template, this.$element, 'center bottom', this.options.vOffset, this.options.hOffset, true)).css({ + 'width': $anchorDims.windowDims.width - this.options.hOffset * 2, + 'height': 'auto' + }); + return false; + } + + this.template.offset(Foundation.Box.GetOffsets(this.template, this.$element, 'center ' + (position || 'bottom'), this.options.vOffset, this.options.hOffset)); + + while (!Foundation.Box.ImNotTouchingYou(this.template) && this.counter) { + this._reposition(position); + this._setPosition(); + } + } + + /** + * reveals the tooltip, and fires an event to close any other open tooltips on the page + * @fires Tooltip#closeme + * @fires Tooltip#show + * @function + */ + + }, { + key: 'show', + value: function show() { + if (this.options.showOn !== 'all' && !Foundation.MediaQuery.is(this.options.showOn)) { + // console.error('The screen is too small to display this tooltip'); + return false; + } + + var _this = this; + this.template.css('visibility', 'hidden').show(); + this._setPosition(); + + /** + * Fires to close all other open tooltips on the page + * @event Closeme#tooltip + */ + this.$element.trigger('closeme.zf.tooltip', this.template.attr('id')); + + this.template.attr({ + 'data-is-active': true, + 'aria-hidden': false + }); + _this.isActive = true; + // console.log(this.template); + this.template.stop().hide().css('visibility', '').fadeIn(this.options.fadeInDuration, function () { + //maybe do stuff? + }); + /** + * Fires when the tooltip is shown + * @event Tooltip#show + */ + this.$element.trigger('show.zf.tooltip'); + } + + /** + * Hides the current tooltip, and resets the positioning class if it was changed due to collision + * @fires Tooltip#hide + * @function + */ + + }, { + key: 'hide', + value: function hide() { + // console.log('hiding', this.$element.data('yeti-box')); + var _this = this; + this.template.stop().attr({ + 'aria-hidden': true, + 'data-is-active': false + }).fadeOut(this.options.fadeOutDuration, function () { + _this.isActive = false; + _this.isClick = false; + if (_this.classChanged) { + _this.template.removeClass(_this._getPositionClass(_this.template)).addClass(_this.options.positionClass); + + _this.usedPositions = []; + _this.counter = 4; + _this.classChanged = false; + } + }); + /** + * fires when the tooltip is hidden + * @event Tooltip#hide + */ + this.$element.trigger('hide.zf.tooltip'); + } + + /** + * adds event listeners for the tooltip and its anchor + * TODO combine some of the listeners like focus and mouseenter, etc. + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + var $template = this.template; + var isFocus = false; + + if (!this.options.disableHover) { + + this.$element.on('mouseenter.zf.tooltip', function (e) { + if (!_this.isActive) { + _this.timeout = setTimeout(function () { + _this.show(); + }, _this.options.hoverDelay); + } + }).on('mouseleave.zf.tooltip', function (e) { + clearTimeout(_this.timeout); + if (!isFocus || _this.isClick && !_this.options.clickOpen) { + _this.hide(); + } + }); + } + + if (this.options.clickOpen) { + this.$element.on('mousedown.zf.tooltip', function (e) { + e.stopImmediatePropagation(); + if (_this.isClick) { + //_this.hide(); + // _this.isClick = false; + } else { + _this.isClick = true; + if ((_this.options.disableHover || !_this.$element.attr('tabindex')) && !_this.isActive) { + _this.show(); + } + } + }); + } else { + this.$element.on('mousedown.zf.tooltip', function (e) { + e.stopImmediatePropagation(); + _this.isClick = true; + }); + } + + if (!this.options.disableForTouch) { + this.$element.on('tap.zf.tooltip touchend.zf.tooltip', function (e) { + _this.isActive ? _this.hide() : _this.show(); + }); + } + + this.$element.on({ + // 'toggle.zf.trigger': this.toggle.bind(this), + // 'close.zf.trigger': this.hide.bind(this) + 'close.zf.trigger': this.hide.bind(this) + }); + + this.$element.on('focus.zf.tooltip', function (e) { + isFocus = true; + if (_this.isClick) { + // If we're not showing open on clicks, we need to pretend a click-launched focus isn't + // a real focus, otherwise on hover and come back we get bad behavior + if (!_this.options.clickOpen) { + isFocus = false; + } + return false; + } else { + _this.show(); + } + }).on('focusout.zf.tooltip', function (e) { + isFocus = false; + _this.isClick = false; + _this.hide(); + }).on('resizeme.zf.trigger', function () { + if (_this.isActive) { + _this._setPosition(); + } + }); + } + + /** + * adds a toggle method, in addition to the static show() & hide() functions + * @function + */ + + }, { + key: 'toggle', + value: function toggle() { + if (this.isActive) { + this.hide(); + } else { + this.show(); + } + } + + /** + * Destroys an instance of tooltip, removes template element from the view. + * @function + */ + + }, { + key: 'destroy', + value: function destroy() { + this.$element.attr('title', this.template.text()).off('.zf.trigger .zf.tooltip').removeClass('has-tip top right left').removeAttr('aria-describedby aria-haspopup data-disable-hover data-resize data-toggle data-tooltip data-yeti-box'); + + this.template.remove(); + + Foundation.unregisterPlugin(this); + } + }]); + + return Tooltip; + }(); + + Tooltip.defaults = { + disableForTouch: false, + /** + * Time, in ms, before a tooltip should open on hover. + * @option + * @type {number} + * @default 200 + */ + hoverDelay: 200, + /** + * Time, in ms, a tooltip should take to fade into view. + * @option + * @type {number} + * @default 150 + */ + fadeInDuration: 150, + /** + * Time, in ms, a tooltip should take to fade out of view. + * @option + * @type {number} + * @default 150 + */ + fadeOutDuration: 150, + /** + * Disables hover events from opening the tooltip if set to true + * @option + * @type {boolean} + * @default false + */ + disableHover: false, + /** + * Optional addtional classes to apply to the tooltip template on init. + * @option + * @type {string} + * @default '' + */ + templateClasses: '', + /** + * Non-optional class added to tooltip templates. Foundation default is 'tooltip'. + * @option + * @type {string} + * @default 'tooltip' + */ + tooltipClass: 'tooltip', + /** + * Class applied to the tooltip anchor element. + * @option + * @type {string} + * @default 'has-tip' + */ + triggerClass: 'has-tip', + /** + * Minimum breakpoint size at which to open the tooltip. + * @option + * @type {string} + * @default 'small' + */ + showOn: 'small', + /** + * Custom template to be used to generate markup for tooltip. + * @option + * @type {string} + * @default '' + */ + template: '', + /** + * Text displayed in the tooltip template on open. + * @option + * @type {string} + * @default '' + */ + tipText: '', + touchCloseText: 'Tap to close.', + /** + * Allows the tooltip to remain open if triggered with a click or touch event. + * @option + * @type {boolean} + * @default true + */ + clickOpen: true, + /** + * Additional positioning classes, set by the JS + * @option + * @type {string} + * @default '' + */ + positionClass: '', + /** + * Distance, in pixels, the template should push away from the anchor on the Y axis. + * @option + * @type {number} + * @default 10 + */ + vOffset: 10, + /** + * Distance, in pixels, the template should push away from the anchor on the X axis, if aligned to a side. + * @option + * @type {number} + * @default 12 + */ + hOffset: 12, + /** + * Allow HTML in tooltip. Warning: If you are loading user-generated content into tooltips, + * allowing HTML may open yourself up to XSS attacks. + * @option + * @type {boolean} + * @default false + */ + allowHtml: false + }; + + /** + * TODO utilize resize event trigger + */ + + // Window exports + Foundation.plugin(Tooltip, 'Tooltip'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * Orbit module. + * @module foundation.orbit + * @requires foundation.util.keyboard + * @requires foundation.util.motion + * @requires foundation.util.timerAndImageLoader + * @requires foundation.util.touch + */ + + var Orbit = function () { + /** + * Creates a new instance of an orbit carousel. + * @class + * @param {jQuery} element - jQuery object to make into an Orbit Carousel. + * @param {Object} options - Overrides to the default plugin settings. + */ + function Orbit(element, options) { + _classCallCheck(this, Orbit); + + this.$element = element; + this.options = $.extend({}, Orbit.defaults, this.$element.data(), options); + + this._init(); + + Foundation.registerPlugin(this, 'Orbit'); + Foundation.Keyboard.register('Orbit', { + 'ltr': { + 'ARROW_RIGHT': 'next', + 'ARROW_LEFT': 'previous' + }, + 'rtl': { + 'ARROW_LEFT': 'next', + 'ARROW_RIGHT': 'previous' + } + }); + } + + /** + * Initializes the plugin by creating jQuery collections, setting attributes, and starting the animation. + * @function + * @private + */ + + + _createClass(Orbit, [{ + key: '_init', + value: function _init() { + // @TODO: consider discussion on PR #9278 about DOM pollution by changeSlide + this._reset(); + + this.$wrapper = this.$element.find('.' + this.options.containerClass); + this.$slides = this.$element.find('.' + this.options.slideClass); + + var $images = this.$element.find('img'), + initActive = this.$slides.filter('.is-active'), + id = this.$element[0].id || Foundation.GetYoDigits(6, 'orbit'); + + this.$element.attr({ + 'data-resize': id, + 'id': id + }); + + if (!initActive.length) { + this.$slides.eq(0).addClass('is-active'); + } + + if (!this.options.useMUI) { + this.$slides.addClass('no-motionui'); + } + + if ($images.length) { + Foundation.onImagesLoaded($images, this._prepareForOrbit.bind(this)); + } else { + this._prepareForOrbit(); //hehe + } + + if (this.options.bullets) { + this._loadBullets(); + } + + this._events(); + + if (this.options.autoPlay && this.$slides.length > 1) { + this.geoSync(); + } + + if (this.options.accessible) { + // allow wrapper to be focusable to enable arrow navigation + this.$wrapper.attr('tabindex', 0); + } + } + + /** + * Creates a jQuery collection of bullets, if they are being used. + * @function + * @private + */ + + }, { + key: '_loadBullets', + value: function _loadBullets() { + this.$bullets = this.$element.find('.' + this.options.boxOfBullets).find('button'); + } + + /** + * Sets a `timer` object on the orbit, and starts the counter for the next slide. + * @function + */ + + }, { + key: 'geoSync', + value: function geoSync() { + var _this = this; + this.timer = new Foundation.Timer(this.$element, { + duration: this.options.timerDelay, + infinite: false + }, function () { + _this.changeSlide(true); + }); + this.timer.start(); + } + + /** + * Sets wrapper and slide heights for the orbit. + * @function + * @private + */ + + }, { + key: '_prepareForOrbit', + value: function _prepareForOrbit() { + var _this = this; + this._setWrapperHeight(); + } + + /** + * Calulates the height of each slide in the collection, and uses the tallest one for the wrapper height. + * @function + * @private + * @param {Function} cb - a callback function to fire when complete. + */ + + }, { + key: '_setWrapperHeight', + value: function _setWrapperHeight(cb) { + //rewrite this to `for` loop + var max = 0, + temp, + counter = 0, + _this = this; + + this.$slides.each(function () { + temp = this.getBoundingClientRect().height; + $(this).attr('data-slide', counter); + + if (_this.$slides.filter('.is-active')[0] !== _this.$slides.eq(counter)[0]) { + //if not the active slide, set css position and display property + $(this).css({ 'position': 'relative', 'display': 'none' }); + } + max = temp > max ? temp : max; + counter++; + }); + + if (counter === this.$slides.length) { + this.$wrapper.css({ 'height': max }); //only change the wrapper height property once. + if (cb) { + cb(max); + } //fire callback with max height dimension. + } + } + + /** + * Sets the max-height of each slide. + * @function + * @private + */ + + }, { + key: '_setSlideHeight', + value: function _setSlideHeight(height) { + this.$slides.each(function () { + $(this).css('max-height', height); + }); + } + + /** + * Adds event listeners to basically everything within the element. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + + //*************************************** + //**Now using custom event - thanks to:** + //** Yohai Ararat of Toronto ** + //*************************************** + // + this.$element.off('.resizeme.zf.trigger').on({ + 'resizeme.zf.trigger': this._prepareForOrbit.bind(this) + }); + if (this.$slides.length > 1) { + + if (this.options.swipe) { + this.$slides.off('swipeleft.zf.orbit swiperight.zf.orbit').on('swipeleft.zf.orbit', function (e) { + e.preventDefault(); + _this.changeSlide(true); + }).on('swiperight.zf.orbit', function (e) { + e.preventDefault(); + _this.changeSlide(false); + }); + } + //*************************************** + + if (this.options.autoPlay) { + this.$slides.on('click.zf.orbit', function () { + _this.$element.data('clickedOn', _this.$element.data('clickedOn') ? false : true); + _this.timer[_this.$element.data('clickedOn') ? 'pause' : 'start'](); + }); + + if (this.options.pauseOnHover) { + this.$element.on('mouseenter.zf.orbit', function () { + _this.timer.pause(); + }).on('mouseleave.zf.orbit', function () { + if (!_this.$element.data('clickedOn')) { + _this.timer.start(); + } + }); + } + } + + if (this.options.navButtons) { + var $controls = this.$element.find('.' + this.options.nextClass + ', .' + this.options.prevClass); + $controls.attr('tabindex', 0) + //also need to handle enter/return and spacebar key presses + .on('click.zf.orbit touchend.zf.orbit', function (e) { + e.preventDefault(); + _this.changeSlide($(this).hasClass(_this.options.nextClass)); + }); + } + + if (this.options.bullets) { + this.$bullets.on('click.zf.orbit touchend.zf.orbit', function () { + if (/is-active/g.test(this.className)) { + return false; + } //if this is active, kick out of function. + var idx = $(this).data('slide'), + ltr = idx > _this.$slides.filter('.is-active').data('slide'), + $slide = _this.$slides.eq(idx); + + _this.changeSlide(ltr, $slide, idx); + }); + } + + if (this.options.accessible) { + this.$wrapper.add(this.$bullets).on('keydown.zf.orbit', function (e) { + // handle keyboard event with keyboard util + Foundation.Keyboard.handleKey(e, 'Orbit', { + next: function () { + _this.changeSlide(true); + }, + previous: function () { + _this.changeSlide(false); + }, + handled: function () { + // if bullet is focused, make sure focus moves + if ($(e.target).is(_this.$bullets)) { + _this.$bullets.filter('.is-active').focus(); + } + } + }); + }); + } + } + } + + /** + * Resets Orbit so it can be reinitialized + */ + + }, { + key: '_reset', + value: function _reset() { + // Don't do anything if there are no slides (first run) + if (typeof this.$slides == 'undefined') { + return; + } + + if (this.$slides.length > 1) { + // Remove old events + this.$element.off('.zf.orbit').find('*').off('.zf.orbit'); + + // Restart timer if autoPlay is enabled + if (this.options.autoPlay) { + this.timer.restart(); + } + + // Reset all sliddes + this.$slides.each(function (el) { + $(el).removeClass('is-active is-active is-in').removeAttr('aria-live').hide(); + }); + + // Show the first slide + this.$slides.first().addClass('is-active').show(); + + // Triggers when the slide has finished animating + this.$element.trigger('slidechange.zf.orbit', [this.$slides.first()]); + + // Select first bullet if bullets are present + if (this.options.bullets) { + this._updateBullets(0); + } + } + } + + /** + * Changes the current slide to a new one. + * @function + * @param {Boolean} isLTR - flag if the slide should move left to right. + * @param {jQuery} chosenSlide - the jQuery element of the slide to show next, if one is selected. + * @param {Number} idx - the index of the new slide in its collection, if one chosen. + * @fires Orbit#slidechange + */ + + }, { + key: 'changeSlide', + value: function changeSlide(isLTR, chosenSlide, idx) { + if (!this.$slides) { + return; + } // Don't freak out if we're in the middle of cleanup + var $curSlide = this.$slides.filter('.is-active').eq(0); + + if (/mui/g.test($curSlide[0].className)) { + return false; + } //if the slide is currently animating, kick out of the function + + var $firstSlide = this.$slides.first(), + $lastSlide = this.$slides.last(), + dirIn = isLTR ? 'Right' : 'Left', + dirOut = isLTR ? 'Left' : 'Right', + _this = this, + $newSlide; + + if (!chosenSlide) { + //most of the time, this will be auto played or clicked from the navButtons. + $newSlide = isLTR ? //if wrapping enabled, check to see if there is a `next` or `prev` sibling, if not, select the first or last slide to fill in. if wrapping not enabled, attempt to select `next` or `prev`, if there's nothing there, the function will kick out on next step. CRAZY NESTED TERNARIES!!!!! + this.options.infiniteWrap ? $curSlide.next('.' + this.options.slideClass).length ? $curSlide.next('.' + this.options.slideClass) : $firstSlide : $curSlide.next('.' + this.options.slideClass) : //pick next slide if moving left to right + this.options.infiniteWrap ? $curSlide.prev('.' + this.options.slideClass).length ? $curSlide.prev('.' + this.options.slideClass) : $lastSlide : $curSlide.prev('.' + this.options.slideClass); //pick prev slide if moving right to left + } else { + $newSlide = chosenSlide; + } + + if ($newSlide.length) { + /** + * Triggers before the next slide starts animating in and only if a next slide has been found. + * @event Orbit#beforeslidechange + */ + this.$element.trigger('beforeslidechange.zf.orbit', [$curSlide, $newSlide]); + + if (this.options.bullets) { + idx = idx || this.$slides.index($newSlide); //grab index to update bullets + this._updateBullets(idx); + } + + if (this.options.useMUI && !this.$element.is(':hidden')) { + Foundation.Motion.animateIn($newSlide.addClass('is-active').css({ 'position': 'absolute', 'top': 0 }), this.options['animInFrom' + dirIn], function () { + $newSlide.css({ 'position': 'relative', 'display': 'block' }).attr('aria-live', 'polite'); + }); + + Foundation.Motion.animateOut($curSlide.removeClass('is-active'), this.options['animOutTo' + dirOut], function () { + $curSlide.removeAttr('aria-live'); + if (_this.options.autoPlay && !_this.timer.isPaused) { + _this.timer.restart(); + } + //do stuff? + }); + } else { + $curSlide.removeClass('is-active is-in').removeAttr('aria-live').hide(); + $newSlide.addClass('is-active is-in').attr('aria-live', 'polite').show(); + if (this.options.autoPlay && !this.timer.isPaused) { + this.timer.restart(); + } + } + /** + * Triggers when the slide has finished animating in. + * @event Orbit#slidechange + */ + this.$element.trigger('slidechange.zf.orbit', [$newSlide]); + } + } + + /** + * Updates the active state of the bullets, if displayed. + * @function + * @private + * @param {Number} idx - the index of the current slide. + */ + + }, { + key: '_updateBullets', + value: function _updateBullets(idx) { + var $oldBullet = this.$element.find('.' + this.options.boxOfBullets).find('.is-active').removeClass('is-active').blur(), + span = $oldBullet.find('span:last').detach(), + $newBullet = this.$bullets.eq(idx).addClass('is-active').append(span); + } + + /** + * Destroys the carousel and hides the element. + * @function + */ + + }, { + key: 'destroy', + value: function destroy() { + this.$element.off('.zf.orbit').find('*').off('.zf.orbit').end().hide(); + Foundation.unregisterPlugin(this); + } + }]); + + return Orbit; + }(); + + Orbit.defaults = { + /** + * Tells the JS to look for and loadBullets. + * @option + * @type {boolean} + * @default true + */ + bullets: true, + /** + * Tells the JS to apply event listeners to nav buttons + * @option + * @type {boolean} + * @default true + */ + navButtons: true, + /** + * motion-ui animation class to apply + * @option + * @type {string} + * @default 'slide-in-right' + */ + animInFromRight: 'slide-in-right', + /** + * motion-ui animation class to apply + * @option + * @type {string} + * @default 'slide-out-right' + */ + animOutToRight: 'slide-out-right', + /** + * motion-ui animation class to apply + * @option + * @type {string} + * @default 'slide-in-left' + * + */ + animInFromLeft: 'slide-in-left', + /** + * motion-ui animation class to apply + * @option + * @type {string} + * @default 'slide-out-left' + */ + animOutToLeft: 'slide-out-left', + /** + * Allows Orbit to automatically animate on page load. + * @option + * @type {boolean} + * @default true + */ + autoPlay: true, + /** + * Amount of time, in ms, between slide transitions + * @option + * @type {number} + * @default 5000 + */ + timerDelay: 5000, + /** + * Allows Orbit to infinitely loop through the slides + * @option + * @type {boolean} + * @default true + */ + infiniteWrap: true, + /** + * Allows the Orbit slides to bind to swipe events for mobile, requires an additional util library + * @option + * @type {boolean} + * @default true + */ + swipe: true, + /** + * Allows the timing function to pause animation on hover. + * @option + * @type {boolean} + * @default true + */ + pauseOnHover: true, + /** + * Allows Orbit to bind keyboard events to the slider, to animate frames with arrow keys + * @option + * @type {boolean} + * @default true + */ + accessible: true, + /** + * Class applied to the container of Orbit + * @option + * @type {string} + * @default 'orbit-container' + */ + containerClass: 'orbit-container', + /** + * Class applied to individual slides. + * @option + * @type {string} + * @default 'orbit-slide' + */ + slideClass: 'orbit-slide', + /** + * Class applied to the bullet container. You're welcome. + * @option + * @type {string} + * @default 'orbit-bullets' + */ + boxOfBullets: 'orbit-bullets', + /** + * Class applied to the `next` navigation button. + * @option + * @type {string} + * @default 'orbit-next' + */ + nextClass: 'orbit-next', + /** + * Class applied to the `previous` navigation button. + * @option + * @type {string} + * @default 'orbit-previous' + */ + prevClass: 'orbit-previous', + /** + * Boolean to flag the js to use motion ui classes or not. Default to true for backwards compatability. + * @option + * @type {boolean} + * @default true + */ + useMUI: true + }; + + // Window exports + Foundation.plugin(Orbit, 'Orbit'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * Sticky module. + * @module foundation.sticky + * @requires foundation.util.triggers + * @requires foundation.util.mediaQuery + */ + + var Sticky = function () { + /** + * Creates a new instance of a sticky thing. + * @class + * @param {jQuery} element - jQuery object to make sticky. + * @param {Object} options - options object passed when creating the element programmatically. + */ + function Sticky(element, options) { + _classCallCheck(this, Sticky); + + this.$element = element; + this.options = $.extend({}, Sticky.defaults, this.$element.data(), options); + + this._init(); + + Foundation.registerPlugin(this, 'Sticky'); + } + + /** + * Initializes the sticky element by adding classes, getting/setting dimensions, breakpoints and attributes + * @function + * @private + */ + + + _createClass(Sticky, [{ + key: '_init', + value: function _init() { + var $parent = this.$element.parent('[data-sticky-container]'), + id = this.$element[0].id || Foundation.GetYoDigits(6, 'sticky'), + _this = this; + + if (!$parent.length) { + this.wasWrapped = true; + } + this.$container = $parent.length ? $parent : $(this.options.container).wrapInner(this.$element); + this.$container.addClass(this.options.containerClass); + + this.$element.addClass(this.options.stickyClass).attr({ 'data-resize': id }); + + this.scrollCount = this.options.checkEvery; + this.isStuck = false; + $(window).one('load.zf.sticky', function () { + //We calculate the container height to have correct values for anchor points offset calculation. + _this.containerHeight = _this.$element.css("display") == "none" ? 0 : _this.$element[0].getBoundingClientRect().height; + _this.$container.css('height', _this.containerHeight); + _this.elemHeight = _this.containerHeight; + if (_this.options.anchor !== '') { + _this.$anchor = $('#' + _this.options.anchor); + } else { + _this._parsePoints(); + } + + _this._setSizes(function () { + var scroll = window.pageYOffset; + _this._calc(false, scroll); + //Unstick the element will ensure that proper classes are set. + if (!_this.isStuck) { + _this._removeSticky(scroll >= _this.topPoint ? false : true); + } + }); + _this._events(id.split('-').reverse().join('-')); + }); + } + + /** + * If using multiple elements as anchors, calculates the top and bottom pixel values the sticky thing should stick and unstick on. + * @function + * @private + */ + + }, { + key: '_parsePoints', + value: function _parsePoints() { + var top = this.options.topAnchor == "" ? 1 : this.options.topAnchor, + btm = this.options.btmAnchor == "" ? document.documentElement.scrollHeight : this.options.btmAnchor, + pts = [top, btm], + breaks = {}; + for (var i = 0, len = pts.length; i < len && pts[i]; i++) { + var pt; + if (typeof pts[i] === 'number') { + pt = pts[i]; + } else { + var place = pts[i].split(':'), + anchor = $('#' + place[0]); + + pt = anchor.offset().top; + if (place[1] && place[1].toLowerCase() === 'bottom') { + pt += anchor[0].getBoundingClientRect().height; + } + } + breaks[i] = pt; + } + + this.points = breaks; + return; + } + + /** + * Adds event handlers for the scrolling element. + * @private + * @param {String} id - psuedo-random id for unique scroll event listener. + */ + + }, { + key: '_events', + value: function _events(id) { + var _this = this, + scrollListener = this.scrollListener = 'scroll.zf.' + id; + if (this.isOn) { + return; + } + if (this.canStick) { + this.isOn = true; + $(window).off(scrollListener).on(scrollListener, function (e) { + if (_this.scrollCount === 0) { + _this.scrollCount = _this.options.checkEvery; + _this._setSizes(function () { + _this._calc(false, window.pageYOffset); + }); + } else { + _this.scrollCount--; + _this._calc(false, window.pageYOffset); + } + }); + } + + this.$element.off('resizeme.zf.trigger').on('resizeme.zf.trigger', function (e, el) { + _this._setSizes(function () { + _this._calc(false); + if (_this.canStick) { + if (!_this.isOn) { + _this._events(id); + } + } else if (_this.isOn) { + _this._pauseListeners(scrollListener); + } + }); + }); + } + + /** + * Removes event handlers for scroll and change events on anchor. + * @fires Sticky#pause + * @param {String} scrollListener - unique, namespaced scroll listener attached to `window` + */ + + }, { + key: '_pauseListeners', + value: function _pauseListeners(scrollListener) { + this.isOn = false; + $(window).off(scrollListener); + + /** + * Fires when the plugin is paused due to resize event shrinking the view. + * @event Sticky#pause + * @private + */ + this.$element.trigger('pause.zf.sticky'); + } + + /** + * Called on every `scroll` event and on `_init` + * fires functions based on booleans and cached values + * @param {Boolean} checkSizes - true if plugin should recalculate sizes and breakpoints. + * @param {Number} scroll - current scroll position passed from scroll event cb function. If not passed, defaults to `window.pageYOffset`. + */ + + }, { + key: '_calc', + value: function _calc(checkSizes, scroll) { + if (checkSizes) { + this._setSizes(); + } + + if (!this.canStick) { + if (this.isStuck) { + this._removeSticky(true); + } + return false; + } + + if (!scroll) { + scroll = window.pageYOffset; + } + + if (scroll >= this.topPoint) { + if (scroll <= this.bottomPoint) { + if (!this.isStuck) { + this._setSticky(); + } + } else { + if (this.isStuck) { + this._removeSticky(false); + } + } + } else { + if (this.isStuck) { + this._removeSticky(true); + } + } + } + + /** + * Causes the $element to become stuck. + * Adds `position: fixed;`, and helper classes. + * @fires Sticky#stuckto + * @function + * @private + */ + + }, { + key: '_setSticky', + value: function _setSticky() { + var _this = this, + stickTo = this.options.stickTo, + mrgn = stickTo === 'top' ? 'marginTop' : 'marginBottom', + notStuckTo = stickTo === 'top' ? 'bottom' : 'top', + css = {}; + + css[mrgn] = this.options[mrgn] + 'em'; + css[stickTo] = 0; + css[notStuckTo] = 'auto'; + this.isStuck = true; + this.$element.removeClass('is-anchored is-at-' + notStuckTo).addClass('is-stuck is-at-' + stickTo).css(css) + /** + * Fires when the $element has become `position: fixed;` + * Namespaced to `top` or `bottom`, e.g. `sticky.zf.stuckto:top` + * @event Sticky#stuckto + */ + .trigger('sticky.zf.stuckto:' + stickTo); + this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd", function () { + _this._setSizes(); + }); + } + + /** + * Causes the $element to become unstuck. + * Removes `position: fixed;`, and helper classes. + * Adds other helper classes. + * @param {Boolean} isTop - tells the function if the $element should anchor to the top or bottom of its $anchor element. + * @fires Sticky#unstuckfrom + * @private + */ + + }, { + key: '_removeSticky', + value: function _removeSticky(isTop) { + var stickTo = this.options.stickTo, + stickToTop = stickTo === 'top', + css = {}, + anchorPt = (this.points ? this.points[1] - this.points[0] : this.anchorHeight) - this.elemHeight, + mrgn = stickToTop ? 'marginTop' : 'marginBottom', + notStuckTo = stickToTop ? 'bottom' : 'top', + topOrBottom = isTop ? 'top' : 'bottom'; + + css[mrgn] = 0; + + css['bottom'] = 'auto'; + if (isTop) { + css['top'] = 0; + } else { + css['top'] = anchorPt; + } + + this.isStuck = false; + this.$element.removeClass('is-stuck is-at-' + stickTo).addClass('is-anchored is-at-' + topOrBottom).css(css) + /** + * Fires when the $element has become anchored. + * Namespaced to `top` or `bottom`, e.g. `sticky.zf.unstuckfrom:bottom` + * @event Sticky#unstuckfrom + */ + .trigger('sticky.zf.unstuckfrom:' + topOrBottom); + } + + /** + * Sets the $element and $container sizes for plugin. + * Calls `_setBreakPoints`. + * @param {Function} cb - optional callback function to fire on completion of `_setBreakPoints`. + * @private + */ + + }, { + key: '_setSizes', + value: function _setSizes(cb) { + this.canStick = Foundation.MediaQuery.is(this.options.stickyOn); + if (!this.canStick) { + if (cb && typeof cb === 'function') { + cb(); + } + } + var _this = this, + newElemWidth = this.$container[0].getBoundingClientRect().width, + comp = window.getComputedStyle(this.$container[0]), + pdngl = parseInt(comp['padding-left'], 10), + pdngr = parseInt(comp['padding-right'], 10); + + if (this.$anchor && this.$anchor.length) { + this.anchorHeight = this.$anchor[0].getBoundingClientRect().height; + } else { + this._parsePoints(); + } + + this.$element.css({ + 'max-width': newElemWidth - pdngl - pdngr + 'px' + }); + + var newContainerHeight = this.$element[0].getBoundingClientRect().height || this.containerHeight; + if (this.$element.css("display") == "none") { + newContainerHeight = 0; + } + this.containerHeight = newContainerHeight; + this.$container.css({ + height: newContainerHeight + }); + this.elemHeight = newContainerHeight; + + if (!this.isStuck) { + if (this.$element.hasClass('is-at-bottom')) { + var anchorPt = (this.points ? this.points[1] - this.$container.offset().top : this.anchorHeight) - this.elemHeight; + this.$element.css('top', anchorPt); + } + } + + this._setBreakPoints(newContainerHeight, function () { + if (cb && typeof cb === 'function') { + cb(); + } + }); + } + + /** + * Sets the upper and lower breakpoints for the element to become sticky/unsticky. + * @param {Number} elemHeight - px value for sticky.$element height, calculated by `_setSizes`. + * @param {Function} cb - optional callback function to be called on completion. + * @private + */ + + }, { + key: '_setBreakPoints', + value: function _setBreakPoints(elemHeight, cb) { + if (!this.canStick) { + if (cb && typeof cb === 'function') { + cb(); + } else { + return false; + } + } + var mTop = emCalc(this.options.marginTop), + mBtm = emCalc(this.options.marginBottom), + topPoint = this.points ? this.points[0] : this.$anchor.offset().top, + bottomPoint = this.points ? this.points[1] : topPoint + this.anchorHeight, + + // topPoint = this.$anchor.offset().top || this.points[0], + // bottomPoint = topPoint + this.anchorHeight || this.points[1], + winHeight = window.innerHeight; + + if (this.options.stickTo === 'top') { + topPoint -= mTop; + bottomPoint -= elemHeight + mTop; + } else if (this.options.stickTo === 'bottom') { + topPoint -= winHeight - (elemHeight + mBtm); + bottomPoint -= winHeight - mBtm; + } else { + //this would be the stickTo: both option... tricky + } + + this.topPoint = topPoint; + this.bottomPoint = bottomPoint; + + if (cb && typeof cb === 'function') { + cb(); + } + } + + /** + * Destroys the current sticky element. + * Resets the element to the top position first. + * Removes event listeners, JS-added css properties and classes, and unwraps the $element if the JS added the $container. + * @function + */ + + }, { + key: 'destroy', + value: function destroy() { + this._removeSticky(true); + + this.$element.removeClass(this.options.stickyClass + ' is-anchored is-at-top').css({ + height: '', + top: '', + bottom: '', + 'max-width': '' + }).off('resizeme.zf.trigger'); + if (this.$anchor && this.$anchor.length) { + this.$anchor.off('change.zf.sticky'); + } + $(window).off(this.scrollListener); + + if (this.wasWrapped) { + this.$element.unwrap(); + } else { + this.$container.removeClass(this.options.containerClass).css({ + height: '' + }); + } + Foundation.unregisterPlugin(this); + } + }]); + + return Sticky; + }(); + + Sticky.defaults = { + /** + * Customizable container template. Add your own classes for styling and sizing. + * @option + * @type {string} + * @default '<div data-sticky-container></div>' + */ + container: '
              ', + /** + * Location in the view the element sticks to. Can be `'top'` or `'bottom'`. + * @option + * @type {string} + * @default 'top' + */ + stickTo: 'top', + /** + * If anchored to a single element, the id of that element. + * @option + * @type {string} + * @default '' + */ + anchor: '', + /** + * If using more than one element as anchor points, the id of the top anchor. + * @option + * @type {string} + * @default '' + */ + topAnchor: '', + /** + * If using more than one element as anchor points, the id of the bottom anchor. + * @option + * @type {string} + * @default '' + */ + btmAnchor: '', + /** + * Margin, in `em`'s to apply to the top of the element when it becomes sticky. + * @option + * @type {number} + * @default 1 + */ + marginTop: 1, + /** + * Margin, in `em`'s to apply to the bottom of the element when it becomes sticky. + * @option + * @type {number} + * @default 1 + */ + marginBottom: 1, + /** + * Breakpoint string that is the minimum screen size an element should become sticky. + * @option + * @type {string} + * @default 'medium' + */ + stickyOn: 'medium', + /** + * Class applied to sticky element, and removed on destruction. Foundation defaults to `sticky`. + * @option + * @type {string} + * @default 'sticky' + */ + stickyClass: 'sticky', + /** + * Class applied to sticky container. Foundation defaults to `sticky-container`. + * @option + * @type {string} + * @default 'sticky-container' + */ + containerClass: 'sticky-container', + /** + * Number of scroll events between the plugin's recalculating sticky points. Setting it to `0` will cause it to recalc every scroll event, setting it to `-1` will prevent recalc on scroll. + * @option + * @type {number} + * @default -1 + */ + checkEvery: -1 + }; + + /** + * Helper function to calculate em values + * @param Number {em} - number of em's to calculate into pixels + */ + function emCalc(em) { + return parseInt(window.getComputedStyle(document.body, null).fontSize, 10) * em; + } + + // Window exports + Foundation.plugin(Sticky, 'Sticky'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * Interchange module. + * @module foundation.interchange + * @requires foundation.util.mediaQuery + * @requires foundation.util.timerAndImageLoader + */ + + var Interchange = function () { + /** + * Creates a new instance of Interchange. + * @class + * @fires Interchange#init + * @param {Object} element - jQuery object to add the trigger to. + * @param {Object} options - Overrides to the default plugin settings. + */ + function Interchange(element, options) { + _classCallCheck(this, Interchange); + + this.$element = element; + this.options = $.extend({}, Interchange.defaults, options); + this.rules = []; + this.currentPath = ''; + + this._init(); + this._events(); + + Foundation.registerPlugin(this, 'Interchange'); + } + + /** + * Initializes the Interchange plugin and calls functions to get interchange functioning on load. + * @function + * @private + */ + + + _createClass(Interchange, [{ + key: '_init', + value: function _init() { + this._addBreakpoints(); + this._generateRules(); + this._reflow(); + } + + /** + * Initializes events for Interchange. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this2 = this; + + $(window).on('resize.zf.interchange', Foundation.util.throttle(function () { + _this2._reflow(); + }, 50)); + } + + /** + * Calls necessary functions to update Interchange upon DOM change + * @function + * @private + */ + + }, { + key: '_reflow', + value: function _reflow() { + var match; + + // Iterate through each rule, but only save the last match + for (var i in this.rules) { + if (this.rules.hasOwnProperty(i)) { + var rule = this.rules[i]; + if (window.matchMedia(rule.query).matches) { + match = rule; + } + } + } + + if (match) { + this.replace(match.path); + } + } + + /** + * Gets the Foundation breakpoints and adds them to the Interchange.SPECIAL_QUERIES object. + * @function + * @private + */ + + }, { + key: '_addBreakpoints', + value: function _addBreakpoints() { + for (var i in Foundation.MediaQuery.queries) { + if (Foundation.MediaQuery.queries.hasOwnProperty(i)) { + var query = Foundation.MediaQuery.queries[i]; + Interchange.SPECIAL_QUERIES[query.name] = query.value; + } + } + } + + /** + * Checks the Interchange element for the provided media query + content pairings + * @function + * @private + * @param {Object} element - jQuery object that is an Interchange instance + * @returns {Array} scenarios - Array of objects that have 'mq' and 'path' keys with corresponding keys + */ + + }, { + key: '_generateRules', + value: function _generateRules(element) { + var rulesList = []; + var rules; + + if (this.options.rules) { + rules = this.options.rules; + } else { + rules = this.$element.data('interchange'); + } + + rules = typeof rules === 'string' ? rules.match(/\[.*?\]/g) : rules; + + for (var i in rules) { + if (rules.hasOwnProperty(i)) { + var rule = rules[i].slice(1, -1).split(', '); + var path = rule.slice(0, -1).join(''); + var query = rule[rule.length - 1]; + + if (Interchange.SPECIAL_QUERIES[query]) { + query = Interchange.SPECIAL_QUERIES[query]; + } + + rulesList.push({ + path: path, + query: query + }); + } + } + + this.rules = rulesList; + } + + /** + * Update the `src` property of an image, or change the HTML of a container, to the specified path. + * @function + * @param {String} path - Path to the image or HTML partial. + * @fires Interchange#replaced + */ + + }, { + key: 'replace', + value: function replace(path) { + if (this.currentPath === path) return; + + var _this = this, + trigger = 'replaced.zf.interchange'; + + // Replacing images + if (this.$element[0].nodeName === 'IMG') { + this.$element.attr('src', path).on('load', function () { + _this.currentPath = path; + }).trigger(trigger); + } + // Replacing background images + else if (path.match(/\.(gif|jpg|jpeg|png|svg|tiff)([?#].*)?/i)) { + this.$element.css({ 'background-image': 'url(' + path + ')' }).trigger(trigger); + } + // Replacing HTML + else { + $.get(path, function (response) { + _this.$element.html(response).trigger(trigger); + $(response).foundation(); + _this.currentPath = path; + }); + } + + /** + * Fires when content in an Interchange element is done being loaded. + * @event Interchange#replaced + */ + // this.$element.trigger('replaced.zf.interchange'); + } + + /** + * Destroys an instance of interchange. + * @function + */ + + }, { + key: 'destroy', + value: function destroy() { + //TODO this. + } + }]); + + return Interchange; + }(); + + /** + * Default settings for plugin + */ + + + Interchange.defaults = { + /** + * Rules to be applied to Interchange elements. Set with the `data-interchange` array notation. + * @option + * @type {?array} + * @default null + */ + rules: null + }; + + Interchange.SPECIAL_QUERIES = { + 'landscape': 'screen and (orientation: landscape)', + 'portrait': 'screen and (orientation: portrait)', + 'retina': 'only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx)' + }; + + // Window exports + Foundation.plugin(Interchange, 'Interchange'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * ResponsiveToggle module. + * @module foundation.responsiveToggle + * @requires foundation.util.mediaQuery + */ + + var ResponsiveToggle = function () { + /** + * Creates a new instance of Tab Bar. + * @class + * @fires ResponsiveToggle#init + * @param {jQuery} element - jQuery object to attach tab bar functionality to. + * @param {Object} options - Overrides to the default plugin settings. + */ + function ResponsiveToggle(element, options) { + _classCallCheck(this, ResponsiveToggle); + + this.$element = $(element); + this.options = $.extend({}, ResponsiveToggle.defaults, this.$element.data(), options); + + this._init(); + this._events(); + + Foundation.registerPlugin(this, 'ResponsiveToggle'); + } + + /** + * Initializes the tab bar by finding the target element, toggling element, and running update(). + * @function + * @private + */ + + + _createClass(ResponsiveToggle, [{ + key: '_init', + value: function _init() { + var targetID = this.$element.data('responsive-toggle'); + if (!targetID) { + console.error('Your tab bar needs an ID of a Menu as the value of data-tab-bar.'); + } + + this.$targetMenu = $('#' + targetID); + this.$toggler = this.$element.find('[data-toggle]').filter(function () { + var target = $(this).data('toggle'); + return target === targetID || target === ""; + }); + this.options = $.extend({}, this.options, this.$targetMenu.data()); + + // If they were set, parse the animation classes + if (this.options.animate) { + var input = this.options.animate.split(' '); + + this.animationIn = input[0]; + this.animationOut = input[1] || null; + } + + this._update(); + } + + /** + * Adds necessary event handlers for the tab bar to work. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this = this; + + this._updateMqHandler = this._update.bind(this); + + $(window).on('changed.zf.mediaquery', this._updateMqHandler); + + this.$toggler.on('click.zf.responsiveToggle', this.toggleMenu.bind(this)); + } + + /** + * Checks the current media query to determine if the tab bar should be visible or hidden. + * @function + * @private + */ + + }, { + key: '_update', + value: function _update() { + // Mobile + if (!Foundation.MediaQuery.atLeast(this.options.hideFor)) { + this.$element.show(); + this.$targetMenu.hide(); + } + + // Desktop + else { + this.$element.hide(); + this.$targetMenu.show(); + } + } + + /** + * Toggles the element attached to the tab bar. The toggle only happens if the screen is small enough to allow it. + * @function + * @fires ResponsiveToggle#toggled + */ + + }, { + key: 'toggleMenu', + value: function toggleMenu() { + var _this2 = this; + + if (!Foundation.MediaQuery.atLeast(this.options.hideFor)) { + /** + * Fires when the element attached to the tab bar toggles. + * @event ResponsiveToggle#toggled + */ + if (this.options.animate) { + if (this.$targetMenu.is(':hidden')) { + Foundation.Motion.animateIn(this.$targetMenu, this.animationIn, function () { + _this2.$element.trigger('toggled.zf.responsiveToggle'); + _this2.$targetMenu.find('[data-mutate]').triggerHandler('mutateme.zf.trigger'); + }); + } else { + Foundation.Motion.animateOut(this.$targetMenu, this.animationOut, function () { + _this2.$element.trigger('toggled.zf.responsiveToggle'); + }); + } + } else { + this.$targetMenu.toggle(0); + this.$targetMenu.find('[data-mutate]').trigger('mutateme.zf.trigger'); + this.$element.trigger('toggled.zf.responsiveToggle'); + } + } + } + }, { + key: 'destroy', + value: function destroy() { + this.$element.off('.zf.responsiveToggle'); + this.$toggler.off('.zf.responsiveToggle'); + + $(window).off('changed.zf.mediaquery', this._updateMqHandler); + + Foundation.unregisterPlugin(this); + } + }]); + + return ResponsiveToggle; + }(); + + ResponsiveToggle.defaults = { + /** + * The breakpoint after which the menu is always shown, and the tab bar is hidden. + * @option + * @type {string} + * @default 'medium' + */ + hideFor: 'medium', + + /** + * To decide if the toggle should be animated or not. + * @option + * @type {boolean} + * @default false + */ + animate: false + }; + + // Window exports + Foundation.plugin(ResponsiveToggle, 'ResponsiveToggle'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * Toggler module. + * @module foundation.toggler + * @requires foundation.util.motion + * @requires foundation.util.triggers + */ + + var Toggler = function () { + /** + * Creates a new instance of Toggler. + * @class + * @fires Toggler#init + * @param {Object} element - jQuery object to add the trigger to. + * @param {Object} options - Overrides to the default plugin settings. + */ + function Toggler(element, options) { + _classCallCheck(this, Toggler); + + this.$element = element; + this.options = $.extend({}, Toggler.defaults, element.data(), options); + this.className = ''; + + this._init(); + this._events(); + + Foundation.registerPlugin(this, 'Toggler'); + } + + /** + * Initializes the Toggler plugin by parsing the toggle class from data-toggler, or animation classes from data-animate. + * @function + * @private + */ + + + _createClass(Toggler, [{ + key: '_init', + value: function _init() { + var input; + // Parse animation classes if they were set + if (this.options.animate) { + input = this.options.animate.split(' '); + + this.animationIn = input[0]; + this.animationOut = input[1] || null; + } + // Otherwise, parse toggle class + else { + input = this.$element.data('toggler'); + // Allow for a . at the beginning of the string + this.className = input[0] === '.' ? input.slice(1) : input; + } + + // Add ARIA attributes to triggers + var id = this.$element[0].id; + $('[data-open="' + id + '"], [data-close="' + id + '"], [data-toggle="' + id + '"]').attr('aria-controls', id); + // If the target is hidden, add aria-hidden + this.$element.attr('aria-expanded', this.$element.is(':hidden') ? false : true); + } + + /** + * Initializes events for the toggle trigger. + * @function + * @private + */ + + }, { + key: '_events', + value: function _events() { + this.$element.off('toggle.zf.trigger').on('toggle.zf.trigger', this.toggle.bind(this)); + } + + /** + * Toggles the target class on the target element. An event is fired from the original trigger depending on if the resultant state was "on" or "off". + * @function + * @fires Toggler#on + * @fires Toggler#off + */ + + }, { + key: 'toggle', + value: function toggle() { + this[this.options.animate ? '_toggleAnimate' : '_toggleClass'](); + } + }, { + key: '_toggleClass', + value: function _toggleClass() { + this.$element.toggleClass(this.className); + + var isOn = this.$element.hasClass(this.className); + if (isOn) { + /** + * Fires if the target element has the class after a toggle. + * @event Toggler#on + */ + this.$element.trigger('on.zf.toggler'); + } else { + /** + * Fires if the target element does not have the class after a toggle. + * @event Toggler#off + */ + this.$element.trigger('off.zf.toggler'); + } + + this._updateARIA(isOn); + this.$element.find('[data-mutate]').trigger('mutateme.zf.trigger'); + } + }, { + key: '_toggleAnimate', + value: function _toggleAnimate() { + var _this = this; + + if (this.$element.is(':hidden')) { + Foundation.Motion.animateIn(this.$element, this.animationIn, function () { + _this._updateARIA(true); + this.trigger('on.zf.toggler'); + this.find('[data-mutate]').trigger('mutateme.zf.trigger'); + }); + } else { + Foundation.Motion.animateOut(this.$element, this.animationOut, function () { + _this._updateARIA(false); + this.trigger('off.zf.toggler'); + this.find('[data-mutate]').trigger('mutateme.zf.trigger'); + }); + } + } + }, { + key: '_updateARIA', + value: function _updateARIA(isOn) { + this.$element.attr('aria-expanded', isOn ? true : false); + } + + /** + * Destroys the instance of Toggler on the element. + * @function + */ + + }, { + key: 'destroy', + value: function destroy() { + this.$element.off('.zf.toggler'); + Foundation.unregisterPlugin(this); + } + }]); + + return Toggler; + }(); + + Toggler.defaults = { + /** + * Tells the plugin if the element should animated when toggled. + * @option + * @type {boolean} + * @default false + */ + animate: false + }; + + // Window exports + Foundation.plugin(Toggler, 'Toggler'); +}(jQuery); +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +!function ($) { + + /** + * Abide module. + * @module foundation.abide + */ + + var Abide = function () { + /** + * Creates a new instance of Abide. + * @class + * @fires Abide#init + * @param {Object} element - jQuery object to add the trigger to. + * @param {Object} options - Overrides to the default plugin settings. + */ + function Abide(element) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, Abide); + + this.$element = element; + this.options = $.extend({}, Abide.defaults, this.$element.data(), options); + + this._init(); + + Foundation.registerPlugin(this, 'Abide'); + } + + /** + * Initializes the Abide plugin and calls functions to get Abide functioning on load. + * @private + */ + + + _createClass(Abide, [{ + key: '_init', + value: function _init() { + this.$inputs = this.$element.find('input, textarea, select'); + + this._events(); + } + + /** + * Initializes events for Abide. + * @private + */ + + }, { + key: '_events', + value: function _events() { + var _this2 = this; + + this.$element.off('.abide').on('reset.zf.abide', function () { + _this2.resetForm(); + }).on('submit.zf.abide', function () { + return _this2.validateForm(); + }); + + if (this.options.validateOn === 'fieldChange') { + this.$inputs.off('change.zf.abide').on('change.zf.abide', function (e) { + _this2.validateInput($(e.target)); + }); + } + + if (this.options.liveValidate) { + this.$inputs.off('input.zf.abide').on('input.zf.abide', function (e) { + _this2.validateInput($(e.target)); + }); + } + + if (this.options.validateOnBlur) { + this.$inputs.off('blur.zf.abide').on('blur.zf.abide', function (e) { + _this2.validateInput($(e.target)); + }); + } + } + + /** + * Calls necessary functions to update Abide upon DOM change + * @private + */ + + }, { + key: '_reflow', + value: function _reflow() { + this._init(); + } + + /** + * Checks whether or not a form element has the required attribute and if it's checked or not + * @param {Object} element - jQuery object to check for required attribute + * @returns {Boolean} Boolean value depends on whether or not attribute is checked or empty + */ + + }, { + key: 'requiredCheck', + value: function requiredCheck($el) { + if (!$el.attr('required')) return true; + + var isGood = true; + + switch ($el[0].type) { + case 'checkbox': + isGood = $el[0].checked; + break; + + case 'select': + case 'select-one': + case 'select-multiple': + var opt = $el.find('option:selected'); + if (!opt.length || !opt.val()) isGood = false; + break; + + default: + if (!$el.val() || !$el.val().length) isGood = false; + } + + return isGood; + } + + /** + * Based on $el, get the first element with selector in this order: + * 1. The element's direct sibling('s). + * 3. The element's parent's children. + * + * This allows for multiple form errors per input, though if none are found, no form errors will be shown. + * + * @param {Object} $el - jQuery object to use as reference to find the form error selector. + * @returns {Object} jQuery object with the selector. + */ + + }, { + key: 'findFormError', + value: function findFormError($el) { + var $error = $el.siblings(this.options.formErrorSelector); + + if (!$error.length) { + $error = $el.parent().find(this.options.formErrorSelector); + } + + return $error; + } + + /** + * Get the first element in this order: + * 2. The
            ").addClass("reveal-overlay").appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var e,i,n=this.$element.outerWidth(),s=t(window).width(),o=this.$element.outerHeight(),a=t(window).height();e="auto"===this.options.hOffset?parseInt((s-n)/2,10):parseInt(this.options.hOffset,10),i="auto"===this.options.vOffset?o>a?parseInt(Math.min(100,a/10),10):parseInt((a-o)/4,10):parseInt(this.options.vOffset,10),this.$element.css({top:i+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:e+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var e=this,i=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,s){if(n.target===i.$element[0]||t(n.target).parents("[data-closable]")[0]===s)return e.close.apply(e)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){i._updatePosition()}}),this.$anchor.length&&this.$anchor.on("keydown.zf.reveal",function(t){13!==t.which&&32!==t.which||(t.stopPropagation(),t.preventDefault(),i.open())}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.reveal",function(e){e.target!==i.$element[0]&&!t.contains(i.$element[0],e.target)&&t.contains(document,e.target)&&i.close()}),this.options.deepLink&&t(window).on("popstate.zf.reveal:"+this.id,this._handleState.bind(this))}},{key:"_handleState",value:function(t){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"open",value:function(){function e(){s.isMobile?(s.originalScrollPos||(s.originalScrollPos=window.pageYOffset),t("html, body").addClass("is-reveal-open")):t("body").addClass("is-reveal-open")}var i=this;if(this.options.deepLink){var n="#"+this.id;window.history.pushState?window.history.pushState(null,null,n):window.location.hash=n}this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id);var s=this;this.options.animationIn?!function(){var t=function(){s.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),e(),Foundation.Keyboard.trapFocus(s.$element)};i.options.overlay&&Foundation.Motion.animateIn(i.$overlay,"fade-in"),Foundation.Motion.animateIn(i.$element,i.options.animationIn,function(){i.$element&&(i.focusableElements=Foundation.Keyboard.findFocusable(i.$element),t())})}():(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),Foundation.Keyboard.trapFocus(this.$element),this.$element.trigger("open.zf.reveal"),e(),setTimeout(function(){i._extraHandlers()},0)}},{key:"_extraHandlers",value:function(){var e=this;this.$element&&(this.focusableElements=Foundation.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||t("body").on("click.zf.reveal",function(i){i.target!==e.$element[0]&&!t.contains(e.$element[0],i.target)&&t.contains(document,i.target)&&e.close()}),this.options.closeOnEsc&&t(window).on("keydown.zf.reveal",function(t){Foundation.Keyboard.handleKey(t,"Reveal",{close:function(){e.options.closeOnEsc&&(e.close(),e.$anchor.focus())}})}),this.$element.on("keydown.zf.reveal",function(i){var n=t(this);Foundation.Keyboard.handleKey(i,"Reveal",{open:function(){e.$element.find(":focus").is(e.$element.find("[data-close]"))?setTimeout(function(){e.$anchor.focus()},1):n.is(e.focusableElements)&&e.open()},close:function(){e.options.closeOnEsc&&(e.close(),e.$anchor.focus())},handled:function(t){t&&i.preventDefault()}})}))}},{key:"close",value:function(){function e(){i.isMobile?(t("html, body").removeClass("is-reveal-open"),i.originalScrollPos&&(t("body").scrollTop(i.originalScrollPos),i.originalScrollPos=null)):t("body").removeClass("is-reveal-open"),Foundation.Keyboard.releaseFocus(i.$element),i.$element.attr("aria-hidden",!0),i.$element.trigger("closed.zf.reveal")}if(!this.isActive||!this.$element.is(":visible"))return!1;var i=this;this.options.animationOut?(this.options.overlay?Foundation.Motion.animateOut(this.$overlay,"fade-out",e):e(),Foundation.Motion.animateOut(this.$element,this.options.animationOut)):(this.options.overlay?this.$overlay.hide(0,e):e(),this.$element.hide(this.options.hideDelay)),this.options.closeOnEsc&&t(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&t("body").off("click.zf.reveal"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,i.options.deepLink&&(window.history.replaceState?window.history.replaceState("",document.title,window.location.href.replace("#"+this.id,"")):window.location.hash="")}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"destroy",value:function(){this.options.overlay&&(this.$element.appendTo(t(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),t(window).off(".zf.reveal:"+this.id),Foundation.unregisterPlugin(this)}}]),e}();s.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,btmOffsetPct:10,overlay:!0,resetOnClose:!1,deepLink:!1,appendTo:"body"},Foundation.plugin(s,"Reveal")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i1?o[0]:"small",r=o.length>1?o[1]:o[0];null!==i[r]&&(e[a]=i[r])}this.rules=e}this._getAllOptions(),t.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var e=this;e.allOptions={};for(var n in i)if(i.hasOwnProperty(n)){var s=i[n];try{var o=t("
              "),a=new s.plugin(o,e.options);for(var r in a.options)if(a.options.hasOwnProperty(r)&&"zfPlugin"!==r){var l=a.options[r];e.allOptions[r]=l}a.destroy()}catch(t){}}}},{key:"_events",value:function(){var e=this;t(window).on("changed.zf.mediaquery",function(){e._checkMediaQueries()})}},{key:"_checkMediaQueries",value:function(){var e,n=this;t.each(this.rules,function(t){Foundation.MediaQuery.atLeast(t)&&(e=t)}),e&&(this.currentPlugin instanceof this.rules[e].plugin||(t.each(i,function(t,e){n.$element.removeClass(e.cssClass)}),this.$element.addClass(this.rules[e].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[e].cssClass),this.currentPlugin=new this.rules[e].plugin(this.$element,{}),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(e){var i=this,n="accordion",s=t("[data-tabs-content="+this.$element.attr("id")+"]");if(s.length&&(n="tabs"),n!==e){var o=i.allOptions.linkClass?i.allOptions.linkClass:"tabs-title",a=i.allOptions.panelClass?i.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var r=this.$element.children("."+o+",[data-accordion-item]").removeClass(o).removeClass("accordion-item").removeAttr("data-accordion-item"),l=r.children("a").removeClass("accordion-title");if("tabs"===n?(s=s.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby"),s.children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected")):s=r.children("[data-tab-content]").removeClass("accordion-content"),s.css({display:"",visibility:""}),r.css({display:"",visibility:""}),"accordion"===e)s.each(function(e,n){t(n).appendTo(r.get(e)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),t("[data-tabs-content="+i.$element.attr("id")+"]").after('
              ').remove(),r.addClass("accordion-item").attr("data-accordion-item",""),l.addClass("accordion-title")});else if("tabs"===e){var h=t("[data-tabs-content="+i.$element.attr("id")+"]"),u=t("#tabs-placeholder-"+i.$element.attr("id"));u.length?(h=t('
              ').insertAfter(u).attr("data-tabs-content",i.$element.attr("id")),u.remove()):h=t('
              ').insertAfter(i.$element).attr("data-tabs-content",i.$element.attr("id")),s.each(function(e,i){var n=t(i).appendTo(h).addClass(a),s=l.get(e).hash.slice(1),o=t(i).attr("id")||Foundation.GetYoDigits(6,"accordion");s!==o&&(""!==s?t(i).attr("id",s):(s=o,t(i).attr("id",s),t(l.get(e)).attr("href",t(l.get(e)).attr("href").replace("#","")+"#"+s)));var u=t(r.get(e)).hasClass("is-active");u&&n.addClass("is-active")}),r.addClass(o)}}}},{key:"destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),t(window).off(".zf.ResponsiveAccordionTabs"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={};var i={tabs:{cssClass:"tabs",plugin:Foundation._plugins.tabs||null},accordion:{cssClass:"accordion",plugin:Foundation._plugins.accordion||null}};Foundation.plugin(e,"ResponsiveAccordionTabs")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i
              ").addClass(i).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:e});return n}},{key:"_reposition",value:function(t){this.usedPositions.push(t?t:"bottom"),!t&&this.usedPositions.indexOf("top")<0?this.template.addClass("top"):"top"===t&&this.usedPositions.indexOf("bottom")<0?this.template.removeClass(t):"left"===t&&this.usedPositions.indexOf("right")<0?this.template.removeClass(t).addClass("right"):"right"===t&&this.usedPositions.indexOf("left")<0?this.template.removeClass(t).addClass("left"):!t&&this.usedPositions.indexOf("top")>-1&&this.usedPositions.indexOf("left")<0?this.template.addClass("left"):"top"===t&&this.usedPositions.indexOf("bottom")>-1&&this.usedPositions.indexOf("left")<0?this.template.removeClass(t).addClass("left"):"left"===t&&this.usedPositions.indexOf("right")>-1&&this.usedPositions.indexOf("bottom")<0?this.template.removeClass(t):"right"===t&&this.usedPositions.indexOf("left")>-1&&this.usedPositions.indexOf("bottom")<0?this.template.removeClass(t):this.template.removeClass(t),this.classChanged=!0,this.counter--}},{key:"_setPosition",value:function(){var t=this._getPositionClass(this.template),e=Foundation.Box.GetDimensions(this.template),i=Foundation.Box.GetDimensions(this.$element),n="left"===t?"left":"right"===t?"left":"top",s="top"===n?"height":"width";"height"===s?this.options.vOffset:this.options.hOffset;if(e.width>=e.windowDims.width||!this.counter&&!Foundation.Box.ImNotTouchingYou(this.template))return this.template.offset(Foundation.Box.GetOffsets(this.template,this.$element,"center bottom",this.options.vOffset,this.options.hOffset,!0)).css({width:i.windowDims.width-2*this.options.hOffset,height:"auto"}),!1;for(this.template.offset(Foundation.Box.GetOffsets(this.template,this.$element,"center "+(t||"bottom"),this.options.vOffset,this.options.hOffset));!Foundation.Box.ImNotTouchingYou(this.template)&&this.counter;)this._reposition(t),this._setPosition()}},{key:"show",value:function(){if("all"!==this.options.showOn&&!Foundation.MediaQuery.is(this.options.showOn))return!1;var t=this;this.template.css("visibility","hidden").show(),this._setPosition(),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),t.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,function(){}),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,function(){t.isActive=!1,t.isClick=!1,t.classChanged&&(t.template.removeClass(t._getPositionClass(t.template)).addClass(t.options.positionClass),t.usedPositions=[],t.counter=4,t.classChanged=!1)}),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e=(this.template,!1);this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",function(e){t.isActive||(t.timeout=setTimeout(function(){t.show()},t.options.hoverDelay))}).on("mouseleave.zf.tooltip",function(i){clearTimeout(t.timeout),(!e||t.isClick&&!t.options.clickOpen)&&t.hide()}),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",function(e){e.stopImmediatePropagation(),t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())}):this.$element.on("mousedown.zf.tooltip",function(e){e.stopImmediatePropagation(),t.isClick=!0}),this.options.disableForTouch||this.$element.on("tap.zf.tooltip touchend.zf.tooltip",function(e){t.isActive?t.hide():t.show()}),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",function(i){return e=!0,t.isClick?(t.options.clickOpen||(e=!1),!1):void t.show()}).on("focusout.zf.tooltip",function(i){e=!1,t.isClick=!1,t.hide()}).on("resizeme.zf.trigger",function(){t.isActive&&t._setPosition()})}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass("has-tip top right left").removeAttr("aria-describedby aria-haspopup data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove(),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={disableForTouch:!1,hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,positionClass:"",vOffset:10,hOffset:12,allowHtml:!1},Foundation.plugin(e,"Tooltip")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find("."+this.options.boxOfBullets).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new Foundation.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},function(){t.changeSlide(!0)}),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(e){var i,n=0,s=0,o=this;this.$slides.each(function(){i=this.getBoundingClientRect().height,t(this).attr("data-slide",s),o.$slides.filter(".is-active")[0]!==o.$slides.eq(s)[0]&&t(this).css({position:"relative",display:"none"}),n=i>n?i:n,s++}),s===this.$slides.length&&(this.$wrapper.css({height:n}),e&&e(n))}},{key:"_setSlideHeight",value:function(e){this.$slides.each(function(){t(this).css("max-height",e)})}},{key:"_events",value:function(){var e=this;if(this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1){if(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",function(t){t.preventDefault(),e.changeSlide(!0)}).on("swiperight.zf.orbit",function(t){t.preventDefault(),e.changeSlide(!1)}),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",function(){e.$element.data("clickedOn",!e.$element.data("clickedOn")),e.timer[e.$element.data("clickedOn")?"pause":"start"]()}),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",function(){e.timer.pause()}).on("mouseleave.zf.orbit",function(){e.$element.data("clickedOn")||e.timer.start()})),this.options.navButtons){var i=this.$element.find("."+this.options.nextClass+", ."+this.options.prevClass);i.attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",function(i){i.preventDefault(),e.changeSlide(t(this).hasClass(e.options.nextClass))})}this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",function(){if(/is-active/g.test(this.className))return!1;var i=t(this).data("slide"),n=i>e.$slides.filter(".is-active").data("slide"),s=e.$slides.eq(i);e.changeSlide(n,s,i)}),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",function(i){Foundation.Keyboard.handleKey(i,"Orbit",{next:function(){e.changeSlide(!0)},previous:function(){e.changeSlide(!1)},handled:function(){t(i.target).is(e.$bullets)&&e.$bullets.filter(".is-active").focus()}})})}}},{key:"_reset",value:function(){"undefined"!=typeof this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each(function(e){t(e).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()}),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]), +this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,i){if(this.$slides){var n=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(n[0].className))return!1;var s,o=this.$slides.first(),a=this.$slides.last(),r=t?"Right":"Left",l=t?"Left":"Right",h=this;s=e?e:t?this.options.infiniteWrap?n.next("."+this.options.slideClass).length?n.next("."+this.options.slideClass):o:n.next("."+this.options.slideClass):this.options.infiniteWrap?n.prev("."+this.options.slideClass).length?n.prev("."+this.options.slideClass):a:n.prev("."+this.options.slideClass),s.length&&(this.$element.trigger("beforeslidechange.zf.orbit",[n,s]),this.options.bullets&&(i=i||this.$slides.index(s),this._updateBullets(i)),this.options.useMUI&&!this.$element.is(":hidden")?(Foundation.Motion.animateIn(s.addClass("is-active").css({position:"absolute",top:0}),this.options["animInFrom"+r],function(){s.css({position:"relative",display:"block"}).attr("aria-live","polite")}),Foundation.Motion.animateOut(n.removeClass("is-active"),this.options["animOutTo"+l],function(){n.removeAttr("aria-live"),h.options.autoPlay&&!h.timer.isPaused&&h.timer.restart()})):(n.removeClass("is-active is-in").removeAttr("aria-live").hide(),s.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[s]))}}},{key:"_updateBullets",value:function(t){var e=this.$element.find("."+this.options.boxOfBullets).find(".is-active").removeClass("is-active").blur(),i=e.find("span:last").detach();this.$bullets.eq(t).addClass("is-active").append(i)}},{key:"destroy",value:function(){this.$element.off(".zf.orbit").find("*").off(".zf.orbit").end().hide(),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={bullets:!0,navButtons:!0,animInFromRight:"slide-in-right",animOutToRight:"slide-out-right",animInFromLeft:"slide-in-left",animOutToLeft:"slide-out-left",autoPlay:!0,timerDelay:5e3,infiniteWrap:!0,swipe:!0,pauseOnHover:!0,accessible:!0,containerClass:"orbit-container",slideClass:"orbit-slide",boxOfBullets:"orbit-bullets",nextClass:"orbit-next",prevClass:"orbit-previous",useMUI:!0},Foundation.plugin(e,"Orbit")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i=n.topPoint))}),n._events(i.split("-").reverse().join("-"))})}},{key:"_parsePoints",value:function(){for(var e=""==this.options.topAnchor?1:this.options.topAnchor,i=""==this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor,n=[e,i],s={},o=0,a=n.length;o=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0))):(this.isStuck&&this._removeSticky(!0),!1)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,i="top"===e?"marginTop":"marginBottom",n="top"===e?"bottom":"top",s={};s[i]=this.options[i]+"em",s[e]=0,s[n]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-"+n).addClass("is-stuck is-at-"+e).css(s).trigger("sticky.zf.stuckto:"+e),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",function(){t._setSizes()})}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,i="top"===e,n={},s=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,o=i?"marginTop":"marginBottom",a=t?"top":"bottom";n[o]=0,n.bottom="auto",t?n.top=0:n.top=s,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-"+e).addClass("is-anchored is-at-"+a).css(n).trigger("sticky.zf.unstuckfrom:"+a)}},{key:"_setSizes",value:function(t){this.canStick=Foundation.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,i=window.getComputedStyle(this.$container[0]),n=parseInt(i["padding-left"],10),s=parseInt(i["padding-right"],10);this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":e-n-s+"px"});var o=this.$element[0].getBoundingClientRect().height||this.containerHeight;if("none"==this.$element.css("display")&&(o=0),this.containerHeight=o,this.$container.css({height:o}),this.elemHeight=o,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var a=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",a)}this._setBreakPoints(o,function(){t&&"function"==typeof t&&t()})}},{key:"_setBreakPoints",value:function(t,i){if(!this.canStick){if(!i||"function"!=typeof i)return!1;i()}var n=e(this.options.marginTop),s=e(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,a=this.points?this.points[1]:o+this.anchorHeight,r=window.innerHeight;"top"===this.options.stickTo?(o-=n,a-=t+n):"bottom"===this.options.stickTo&&(o-=r-(t+s),a-=r-s),this.topPoint=o,this.bottomPoint=a,i&&"function"==typeof i&&i()}},{key:"destroy",value:function(){this._removeSticky(!0),this.$element.removeClass(this.options.stickyClass+" is-anchored is-at-top").css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),t(window).off(this.scrollListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""}),Foundation.unregisterPlugin(this)}}]),i}();i.defaults={container:"
              ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",checkEvery:-1},Foundation.plugin(i,"Sticky")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:{};_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Abide")}return _createClass(e,[{key:"_init",value:function(){this.$inputs=this.$element.find("input, textarea, select"),this._events()}},{key:"_events",value:function(){var e=this;this.$element.off(".abide").on("reset.zf.abide",function(){e.resetForm()}).on("submit.zf.abide",function(){return e.validateForm()}),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",function(i){e.validateInput(t(i.target))}),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",function(i){e.validateInput(t(i.target))}),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",function(i){e.validateInput(t(i.target))})}},{key:"_reflow",value:function(){this._init()}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var i=t.find("option:selected");i.length&&i.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t){var e=t.siblings(this.options.formErrorSelector);return e.length||(e=t.parent().find(this.options.formErrorSelector)),e}},{key:"findLabel",value:function(t){var e=t[0].id,i=this.$element.find('label[for="'+e+'"]');return i.length?i:t.closest("label")}},{key:"findRadioLabels",value:function(e){var i=this,n=e.map(function(e,n){var s=n.id,o=i.$element.find('label[for="'+s+'"]');return o.length||(o=t(n).closest("label")),o[0]});return t(n)}},{key:"addErrorClasses",value:function(t){var e=this.findLabel(t),i=this.findFormError(t);e.length&&e.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr("data-invalid","")}},{key:"removeRadioErrorClasses",value:function(t){var e=this.$element.find(':radio[name="'+t+'"]'),i=this.findRadioLabels(e),n=this.findFormError(e);i.length&&i.removeClass(this.options.labelErrorClass),n.length&&n.removeClass(this.options.formErrorClass),e.removeClass(this.options.inputErrorClass).removeAttr("data-invalid")}},{key:"removeErrorClasses",value:function(t){if("radio"==t[0].type)return this.removeRadioErrorClasses(t.attr("name"));var e=this.findLabel(t),i=this.findFormError(t);e.length&&e.removeClass(this.options.labelErrorClass),i.length&&i.removeClass(this.options.formErrorClass),t.removeClass(this.options.inputErrorClass).removeAttr("data-invalid")}},{key:"validateInput",value:function(e){var i=this,n=this.requiredCheck(e),s=!1,o=!0,a=e.attr("data-validator"),r=!0;if(e.is("[data-abide-ignore]")||e.is('[type="hidden"]')||e.is("[disabled]"))return!0;switch(e[0].type){case"radio":s=this.validateRadio(e.attr("name"));break;case"checkbox":s=n;break;case"select":case"select-one":case"select-multiple":s=n;break;default:s=this.validateText(e)}a&&(o=this.matchValidation(e,a,e.attr("required"))),e.attr("data-equalto")&&(r=this.options.validators.equalTo(e));var l=[n,s,o,r].indexOf(!1)===-1,h=(l?"valid":"invalid")+".zf.abide";if(l){var u=this.$element.find('[data-equalto="'+e.attr("id")+'"]');u.length&&!function(){var e=i;u.each(function(){t(this).val()&&e.validateInput(t(this))})}()}return this[l?"removeErrorClasses":"addErrorClasses"](e),e.trigger(h,[e]),l}},{key:"validateForm",value:function(){var e=[],i=this;this.$inputs.each(function(){e.push(i.validateInput(t(this)))});var n=e.indexOf(!1)===-1;return this.$element.find("[data-abide-error]").css("display",n?"none":"block"),this.$element.trigger((n?"formvalid":"forminvalid")+".zf.abide",[this.$element]),n}},{key:"validateText",value:function(t,e){e=e||t.attr("pattern")||t.attr("type");var i=t.val(),n=!1;return i.length?n=this.options.patterns.hasOwnProperty(e)?this.options.patterns[e].test(i):e===t.attr("type")||new RegExp(e).test(i):t.prop("required")||(n=!0),n}},{key:"validateRadio",value:function(e){var i=this.$element.find(':radio[name="'+e+'"]'),n=!1,s=!1;return i.each(function(e,i){t(i).attr("required")&&(s=!0)}),s||(n=!0),n||i.each(function(e,i){t(i).prop("checked")&&(n=!0)}),n}},{key:"matchValidation",value:function(t,e,i){var n=this;i=!!i;var s=e.split(" ").map(function(e){return n.options.validators[e](t,i,t.parent())});return s.indexOf(!1)===-1}},{key:"resetForm",value:function(){var e=this.$element,i=this.options;t("."+i.labelErrorClass,e).not("small").removeClass(i.labelErrorClass),t("."+i.inputErrorClass,e).not("small").removeClass(i.inputErrorClass),t(i.formErrorSelector+"."+i.formErrorClass).removeClass(i.formErrorClass),e.find("[data-abide-error]").css("display","none"),t(":input",e).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").removeAttr("data-invalid"),t(":input:radio",e).not("[data-abide-ignore]").prop("checked",!1).removeAttr("data-invalid"),t(":input:checkbox",e).not("[data-abide-ignore]").prop("checked",!1).removeAttr("data-invalid"),e.trigger("formreset.zf.abide",[e])}},{key:"destroy",value:function(){var e=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each(function(){e.removeErrorClasses(t(this))}),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^(https?|ftp|file|ssh):\/\/(((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/},validators:{equalTo:function(e,i,n){return t("#"+e.attr("data-equalto")).val()===e.val()}}},Foundation.plugin(e,"Abide")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,s=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),t(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&n===!1||void 0===n)&&(s.length?Foundation.onImagesLoaded(s,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(t){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!Foundation.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){return!this.options.equalizeOnStack&&this._isStacked()?(this.$watched.css("height","auto"),!1):void(this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this)))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],i=0,n=this.$watched.length;i0&&b-1 in a}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(hb.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=ob[a]={};return _.each(a.match(nb)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=_.expando+Math.random()}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ub,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:tb.test(c)?_.parseJSON(c):c}catch(e){}sb.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Kb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;d>c;c++)rb.set(a[c],"globalEval",!b||rb.get(b[c],"globalEval"))}function q(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(rb.hasData(a)&&(f=rb.access(a),g=rb.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)_.event.add(b,e,j[e][c])}sb.hasData(a)&&(h=sb.access(a),i=_.extend({},h),sb.set(b,i))}}function r(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&_.nodeName(a,b)?_.merge([a],c):c}function s(a,b){var c=b.nodeName.toLowerCase();"input"===c&&yb.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function t(b,c){var d,e=_(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:_.css(e[0],"display");return e.detach(),f}function u(a){var b=Z,c=Ob[a];return c||(c=t(a,b),"none"!==c&&c||(Nb=(Nb||_("